恭喜,你发布的帖子
发布于 2021-01-07 23:48:42
5楼
1、170行的程序 插到155和154行的中间即#stateResetPosOld:=#resetPos会在#FB_STATE_POSITION的case中执行,从目前程序的状态分析,按照您的思路,程序也可以正常执行,但如果程序处于其他case时请求#resetPos,会造成#stateResetPosOld:=#resetPos无法成功执行,还是建议放在case语句外执行,较为稳妥。
2、你说的#instMcMoveAbsolute.Done没有输出,而绝对值定位的程序(131-141)正常按逻辑执行是不可能的;为什么#instMcMoveAbsolute.Done没有输出,说明定位指令报错了,既然报错了,轴报错了,不进行复位,轴会动作吗?即使下面的绝对值定位的程序(131-141)再次触发#instMcMoveAbsolute.Execute也是无法完成轴的动作的,定位指令报错,就会执行#stateErrorAutoCleared,所以不会出现您说的情况。
3、#startPos不能是上升沿,多次重复定位是通过执行#instMcMoveAbsolute.Execute=TRUE实现的,如果#startPos是上升沿,则在完成第一次定位后,无法启动第二次、第三次定位。
老师#instMcMoveAbsolute.Done这个位,不是要等指令执行完后才会有输出的吗?我不给Execute使能或者即使给了使能如果没有达到Position的位置的话那么Done不是也不会有输出吗?上图中Done就没有输出呀。
那就比如第一次按下#enable,
那么,#statFBState := #FB_STATE_START_ACTION;( #statFBState的值就是10)
然后就执行CASE的指令 那依次就会进行 给轴使能,回Home位,然后再进行绝对值定位。,这个时候因为还没有进行过绝对值定位,所以绝对值定位的Execute这个位还没有执行,那么#instMcMoveAbsolute.Done不就是不会有输出吗?
老师,再假设首次按下enable,如果设置#posTimes 为1,就是要执行一次绝对值定位。
如果#instMcMoveAbsolute.Done是有输出的,那么#statPosTimes里面的值就是0+1=1。
那么130的程序就肯定不满足条件的呀?那么它怎么执行第一次的绝对值定位呀、??
还有一个问题还是关于#startPos 的的。就是说我假设要完成4次的绝对值定位,每次定位旋转90°。也就是#posTimes值设置的是4,#posOffset设置的是90。
130和131都是开始绝对值定位的条件,然后#startPos一直为1,那131的条件就是一直满足的,#posOffset设为90,那132的条件也是一直满足的。老师您虽然说多次重复定位是通过执行#instMcMoveAbsolute.Execute=TRUE实现的,但是#instMcMoveAbsolute.Execute=TRUE不是也写在 IF #startPos THEN 这个条件里面的吗,因为 #startPos 是一直为1的, IF #posOffset > 0.0 这条件也是一直满足的,那么 #instMcMoveAbsolute.Execute := TRUE;这个条件肯定也是一直满足的呀。又因为PLC的扫描周期很快,那么定位4次,每次走90度 ,不就是同时完成并且中间并没有停顿的吗,那设置4次,每次定位90度的效果不就跟定位1次走360,或者定位2次每次走180度的现象一模一样吗。(也就是我想表达,这样并不能实现每定位一次有一个停顿,告诉你已经实现第一次,第二次,第三次,第四次,第.....次定位了,它就是一下子转完了。可能是我对程序的理解又误,希望老师解答一下)
请填写推广理由:
分享
只看
楼主