There is a key bit of information that is not spelled out in the TRI documentation of the "StepMove ch, count, r" and the "StepMoveAbs ch, count, r" statements.
The issue has to do with the handling of the "r" argument to these statements. The "r" argument specifies which RELAY is to be cleared by the execution of the statement and then set, later, when the motion of the stepper motor has completed. If the value of the "count" argument will result in the stepper not moving, then the RELAY WILL NOT be SET.
The problem with the StepMove and StepMoveAbs statements is that certain values for the "count" argument will result in the RELAY "r" not being set and this will result in PLC programs hanging up waiting for this RELAY "r" to be set.
The value that breaks StepMove is when "count" = 0. The documentation states, "count is a 32-bit integer number which allows you to program the stepper motor to move from -231 to +/-231 .(i.e. about ± 2 x 109) steps". Notice that the documentation includes the value of "0" in the range of legal values. Trust me, 0 is not handled the same as the other 2 x 109 possibilities.
The value that breaks StepMoveAbs is when "count" equals the current absolute position. The documentation for this statement does not mention this fact.
This is the sort of work-around that I use to ensure that all legal values for "count" work the same:
' The StepMove statement will not set the BrnCmdCmp RELAY if the
' the statement will result in no physical motion of the stepper motor
'
' The fix is to execute the StepMove statement and then
' set the BrnCmdCmp RELAY
'
StepMove BrineStpprChnl,BrnArg1,BrnCmdCmp
if (BrnArg1 = 0)
SetIO BrnCmdCmp ' set the command completion RELAY
endif
' The StepMoveAbs statement will not set the BrnCmdCmp RELAY if the
' statement will result in no stepper motion
'
' The fix is to test if the current absolute position is the same
' and the position specified in the argument to StepMoveAbs and after
' the StepMoveAbs statement is executed, set the BrnCmdCmp RELAY to indicate
' that the statement completed
'
if StepCountAbs(BrineStpprChnl) <> BrnArg1
' Move stepper to new position
'
StepMoveAbs BrineStpprChnl,BrnArg1,BrnCmdCmp
else
' Stepper will not move, so execute the StepMoveAbs statement
' to update the stepper motion counters and then set the
' command completion RELAY to indicate that the statement has
' completed
'
StepMoveAbs BrineStpprChnl,BrnArg1,BrnCmdCmp
SetIO BrnCmdCmp
endif
[/color]
I know that the StepMove family of statements have been around for a long time. I'm just new to using them.
Best regards,
Gary D*ckinson