

(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/Modbus_stepper\/modbusUtility' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK MB_paramSetter
VAR_INPUT
   i_register: WORD;
   i_reset: BOOL;
	i_ipAddress: STRING;
   i_dataToWrite: INT;
END_VAR
VAR_IN_OUT
   iq_globalTalkToken: BOOL;
END_VAR
VAR_OUTPUT
   writeOK: BOOL;
	error: BOOL;
   busy: BOOL;
END_VAR
VAR
   done: BOOL;
   MB_writer: MB_write;
   writingRequired: BOOL;
   firstWriteOK: BOOL := FALSE;
   writtenData: INT := 0;
   personnalToken: BOOL := FALSE;
   timerMax: TON;
   maxTime: TIME := T#500MS;
END_VAR

(* @END_DECLARATION := '0' *)

IF (i_reset) THEN
   iq_globalTalkToken := FALSE;
   personnalToken := FALSE;
   firstWriteOK := FALSE;
   writtenData := 0;
END_IF

(* Si besoins d'écrire et token de priorité libre, alors prend le token de priorité *)
writingRequired := (writtenData <> i_dataToWrite) OR (NOT firstWriteOK);
writeOK := NOT writingRequired;
IF (iq_globalTalkToken = FALSE AND writingRequired AND NOT i_reset) THEN
   iq_globalTalkToken := TRUE;
   personnalToken := TRUE;
END_IF

(* Si le token de priorité est à nous, on écrit dans le registre Modbus *)
MB_writer(
   enable:= personnalToken, 
   i_ipAddress:= i_ipAddress, 
   i_regAddress:= i_register, 
   i_data:= i_dataToWrite, 
   q_mbDone=> done,
   q_mbError=> error);

(* Si l'opération est trop longue, on le considère comme une erreur *)
timerMax(IN:=busy, PT:=maxTime);
IF (timerMax.Q) THEN
   error := TRUE;
END_IF

(* Quand la transaction modbus est fini, relâche le token (que ça ait marché ou pas) *)
IF (personnalToken AND (done OR error)) THEN
      personnalToken := FALSE;
      iq_globalTalkToken := FALSE;
END_IF;

IF (done) THEN
   firstWriteOK := TRUE;
   writtenData := i_dataToWrite;
END_IF
END_FUNCTION_BLOCK


(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/Modbus_stepper\/modbusUtility' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK MB_read
VAR_INPUT
	enable: BOOL;
   i_ipAddress: STRING;
   i_regAddress: WORD;
   i_nbWords: WORD;
END_VAR
VAR_IN_OUT
   iq_data: INT;
END_VAR
VAR_OUTPUT
   q_mbDone: BOOL;
   q_mbError: BOOL;
END_VAR
VAR
   modbusMaster: ETH_MOD_MAST;
   dwIPAddress: DWORD;

END_VAR

(* @END_DECLARATION := '0' *)

   (* command and status are DINT arrays *)
   dwIPAddress := IP_ADR_STRING_TO_DWORD(IP_ADR:=i_ipAddress);

   modbusMaster(
	EN:= enable,
	DONE=> q_mbDone,
	ERR=> q_mbError,
	SLOT := 1,
	IP_ADR := dwIPAddress,
	UNIT_ID := 1,
	FCT := 3, (* Read code *)
	ADDR:= i_regAddress,
	NB:= 1,
	DATA:= ADR(iq_data) );
END_FUNCTION_BLOCK


(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/Modbus_stepper\/modbusUtility' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK MB_statusReader
VAR_INPUT
   i_register: WORD;
   i_length: WORD;
   i_reset: BOOL;
   i_ipAddress: STRING;
   i_readInterval: TIME;
END_VAR
VAR_IN_OUT
   iq_globalTalkToken: BOOL;
END_VAR
VAR_OUTPUT
   done: BOOL;
   error: BOOL;
   busy: BOOL;
   q_lastReadData: INT := 0;
END_VAR
VAR
   MB_reader: MB_read;
   readTimer: TON;
   readingRequired: BOOL;
   personnalToken: BOOL := FALSE;
   timerMax: TON;
   maxTime: TIME := T#500MS;
END_VAR

(* @END_DECLARATION := '0' *)

IF (i_reset) THEN
   iq_globalTalkToken := FALSE;
   personnalToken := FALSE;
END_IF

(* Si besoins de lire et token de priorité libre, alors prend le token de priorité *)
readTimer(IN := (NOT done AND NOT i_reset), PT := i_readInterval);
readingRequired := readTimer.Q;
IF (iq_globalTalkToken = FALSE AND readingRequired AND NOT i_reset) THEN
   iq_globalTalkToken := TRUE;
   personnalToken := TRUE;
END_IF

(* Si le token de priorité est à nous, on lit dans le registre Modbus *)
MB_reader(
   enable:= personnalToken, 
   i_ipAddress:= i_ipAddress, 
   i_regAddress:= i_register,
   i_nbWords:= i_length,
   iq_data := q_lastReadData,
   q_mbDone=> done,
   q_mbError=> error);

(* Si l'opération est trop longue, on le considère comme une erreur *)
timerMax(IN:=busy, PT:=maxTime);
IF (timerMax.Q) THEN
   error := TRUE;
END_IF

(* Relache le token quand on a fini une lecture ou si une erreur survient *)
IF (personnalToken AND (done OR error)) THEN
   personnalToken := FALSE;
   iq_globalTalkToken := FALSE;
END_IF
END_FUNCTION_BLOCK


(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/Modbus_stepper\/modbusUtility' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK MB_write
VAR_INPUT
   enable: BOOL;
   i_regAddress: WORD;
   i_ipAddress: STRING;   
   i_data: INT;

END_VAR
VAR_IN_OUT

END_VAR
VAR_OUTPUT
   q_mbDone: BOOL;
   q_mbError: BOOL;
END_VAR
VAR
   modbusMaster: ETH_MOD_MAST;
   dwIPAddress: DWORD;

END_VAR

(* @END_DECLARATION := '0' *)


   (* command and status are DINT arrays *)
   dwIPAddress := IP_ADR_STRING_TO_DWORD(IP_ADR:=i_ipAddress);
   modbusMaster(
	EN:= enable,
	DONE=> q_mbDone,
	ERR=> q_mbError,
	SLOT := 1,
	IP_ADR := dwIPAddress,
	UNIT_ID := 1,
	FCT := 6, (* Write code *)
	ADDR:= i_regAddress,
	NB:= 1,
	DATA:= ADR(i_data) );
END_FUNCTION_BLOCK


(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/Modbus_stepper' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK MB_stepper

VAR_INPUT

END_VAR

VAR_INPUT PERSISTENT
   mac: MB_stepper_mac;
   conf: MB_stepper_conf;
END_VAR

VAR CONSTANT
   (* codes des commandes du stepper *)
   CMD_FL: INT := 102;
   CMD_SH: INT := 110;
   CMD_EP: INT := 152;
END_VAR

VAR
   sts: MB_stepper_sts;
   cmd: MB_stepper_cmd;
   hm: MB_stepper_hm;

   (* Commandes du mode auto *)
   Run: BOOL;
   GoToPos: BOOL;
   DesiredPos: INT;
   Reset: BOOL;
   GoHome: BOOL;
END_VAR

(* @END_DECLARATION := '0' *)
cmdHMI();
setParam();
readStatus();
errorCheck();
paramCheck();

IF(hm.allParamOk AND sts.Ready AND Run) THEN
   hm.sendCommand := TRUE;
ELSE
   hm.sendCommand := FALSE;
END_IF

commandHandler();

IF (Reset OR sts.Error) THEN
   sendStopCommand();
   sts.Running := FALSE;
ELSE
   sts.Running := TRUE;
END_IF

END_FUNCTION_BLOCK
ACTION	cmdHMI:
_LD_BODY
_NETWORKS : 5
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
cmd.Reset
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
Reset
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
cmd.GoHome
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_POSITIV
_SET
GoHome
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
cmd.GoToPos
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_POSITIV
_SET
GoToPos
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
cmd.GoToPos
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
cmd.DesiredPos
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
DesiredPos
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
'Auto-reset$R$N'
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 2
_OUTPUT
_NEGATIV
_SET
cmd.GoHome
_OUTPUT
_NEGATIV
_SET
cmd.GoToPos

END_ACTION

ACTION	commandHandler:
_LD_BODY
_NETWORKS : 10
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_AND
_LD_OPERATOR : 3
_LD_CONTACT
hm.sendCommand
_EXPRESSION
_POSITIV
_LD_CONTACT
hm.posReset
_EXPRESSION
_NEGATIV
_LD_CONTACT
GoToPos
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
CMD_FL
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.commandCode
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_AND
_LD_OPERATOR : 4
_LD_CONTACT
hm.sendCommand
_EXPRESSION
_POSITIV
_LD_CONTACT
hm.posReset
_EXPRESSION
_NEGATIV
_LD_CONTACT
GoHome
_EXPRESSION
_POSITIV
_LD_CONTACT
sts.Ready
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
CMD_SH
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.commandCode
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_AND
_LD_OPERATOR : 3
_LD_CONTACT
hm.posReset
_EXPRESSION
_POSITIV
_LD_CONTACT
sts.Ready
_EXPRESSION
_POSITIV
_FUNCTIONBLOCK
hm.timerPosReset
_BOX_EXPR : 2
_EMPTY
_OPERAND
_EXPRESSION
_POSITIV
T#1000ms
_EXPRESSION
_POSITIV
TON
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
CMD_EP
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.commandCode
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_FUNCTIONBLOCK
hm.setCommand
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
124
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
hm.commandCode
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.commandSent
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.commandSent
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
hm.commandCode
_OPERAND
_EXPRESSION
_POSITIV
CMD_FL
_EXPRESSION
_POSITIV
EQ
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.cmdWasFL
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.commandSent
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
hm.commandCode
_OPERAND
_EXPRESSION
_POSITIV
CMD_EP
_EXPRESSION
_POSITIV
EQ
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.cmdWasEP
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.commandSent
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
hm.commandCode
_OPERAND
_EXPRESSION
_POSITIV
CMD_SH
_EXPRESSION
_POSITIV
EQ
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.cmdWasSH
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.cmdWasFL
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
0
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.commandCode
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_NEGATIV
_SET
GoToPos
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.cmdWasEP
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_NEGATIV
_SET
hm.posReset
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.cmdWasSH
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 2
_OUTPUT
_NEGATIV
_SET
GoHome
_OUTPUT
_POSITIV
_SET
hm.posReset

END_ACTION

ACTION	errorCheck:
sts.error :=
   hm.setAcc.error OR
   hm.setDec.error OR
   hm.setSpeed.error OR
   hm.setDistance.error OR
   hm.setDistNeg.error OR
   hm.setParam1.error OR
   hm.setParam2.error;

END_ACTION

ACTION	paramCheck:
hm.allParamOK :=
   hm.setAcc.writeOK AND
   hm.setDec.writeOK AND
   hm.setSpeed.writeOK AND
   hm.setDistance.writeOK AND
   hm.setDistNeg.writeOK AND
   hm.setParam1.writeOK AND
   hm.setParam2.writeOK;
END_ACTION

ACTION	readStatus:
_LD_BODY
_NETWORKS : 5
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.getStatus
_BOX_EXPR : 6
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
1
_OPERAND
_EXPRESSION
_POSITIV
1
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
conf.ReadInterval
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_statusReader
_OUTPUTS : 3
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
sts.statusCode
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.getPos
_BOX_EXPR : 6
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
7
_OPERAND
_EXPRESSION
_POSITIV
1
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
conf.ReadInterval
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_statusReader
_OUTPUTS : 3
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
hm.lastStepPos
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.getPos.done
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
hm.lastStepPos
_OPERAND
_EXPRESSION
_POSITIV
conf.stepsPerMM
_EXPRESSION
_POSITIV
DIV
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
sts.position
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
sts.statusCode.0
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
sts.Ready
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
sts.statusCode.4
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 0
ENABLELIST_END
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
sts.Running

END_ACTION

ACTION	sendStopCommand:

hm.stopCmdSender(
	enable := TRUE,
	i_regAddress:= 124,
	i_ipAddress:= conf.IP, 
	i_data:= 225, 
	q_mbDone=> ,
	q_mbError=> );
END_ACTION

ACTION	setParam:
_LD_BODY
_NETWORKS : 16
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setAcc
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
27
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
mac.Acc
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setDec
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
28
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
mac.Dec
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setSpeed
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
29
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
mac.Speed
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
cmd.DesiredPos
_OPERAND
_EXPRESSION
_POSITIV
sts.position
_EXPRESSION
_POSITIV
SUB
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.dist
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
hm.dist
_OPERAND
_EXPRESSION
_POSITIV
conf.StepsPerMM
_EXPRESSION
_POSITIV
MUL
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.dist
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_AND
_LD_OPERATOR : 2
_LD_CONTACT
GoHome
_EXPRESSION
_POSITIV
_LD_CONTACT
GoToPos
_EXPRESSION
_NEGATIV
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
conf.HomeDirection
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.dist
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setDistance
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
31
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
hm.dist
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 2
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
hm.dist
_OPERAND
_EXPRESSION
_POSITIV
0
_EXPRESSION
_POSITIV
LT
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.distNeg
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.distNeg
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
-1
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.distSign
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.distNeg
_EXPRESSION
_NEGATIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
0
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.distSign
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setDistNeg
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
30
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
hm.distSign
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setDistNeg
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
30
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
hm.distSign
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.posReset
_EXPRESSION
_POSITIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
0
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.param1
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
hm.posReset
_EXPRESSION
_NEGATIV
_EXPRESSION
_POSITIV


ENABLELIST : 1
_ASSIGN
_OPERATOR
_BOX_EXPR : 1
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
conf.HomeInputCode
_EXPRESSION
_POSITIV
MOVE
_EXPRESSION
_POSITIV
_OUTPUTS : 1
_OUTPUT
_POSITIV
_NO_SET
hm.param1
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setParam1
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
125
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
hm.param1
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0
_NETWORK

_COMMENT
''
_END_COMMENT
_LD_ASSIGN
_EMPTY
_EXPRESSION
_POSITIV


ENABLELIST : 1
_FUNCTIONBLOCK
hm.setParam2
_BOX_EXPR : 5
_ENABLED
_OPERAND
_EXPRESSION
_POSITIV
125
_OPERAND
_EXPRESSION
_POSITIV
Reset
_OPERAND
_EXPRESSION
_POSITIV
conf.IP
_OPERAND
_EXPRESSION
_POSITIV
conf.HomeConditionCode
_OPERAND
_EXPRESSION
_POSITIV
hm.globalToken
_EXPRESSION
_POSITIV
MB_paramSetter
_OUTPUTS : 2
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
_OUTPUT
_POSITIV
_NO_SET
_EMPTY
ENABLELIST_END
_OUTPUTS : 0

END_ACTION









(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
TYPE MB_stepper_cmd:
STRUCT
   GoToPos: BOOL;
   DesiredPos: INT;
   Reset: BOOL;
   GoHome: BOOL;
END_STRUCT
END_TYPE

(* @END_DECLARATION := '0' *)

(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
TYPE MB_stepper_conf :
STRUCT
   IP: STRING := '10.30.89.34';
   
   (* drive IO code:
   //    0xB1 (decimal: 177) -> input X1
   //    0xB2 (decimal: 178) -> input X2
   //    0xB3 (decimal: 179) -> input X3
   //    etc... *)
   HomeInputCode: INT := 178;

   (* drive condition code:
   //    0x4C (decimal: 76) -> closed
   //    0x48 (decimal: 72) -> open *)
   HomeConditionCode: INT := 76;

   (* Direction vers laquelle le homing commence. 1 ou -1 *)
   HomeDirection: INT := 1;
   
   (* Ratio steps de moteur par mm de distance *)
   StepsPerMM: INT := 1000;

   ReadInterval: TIME := T#100MS;
END_STRUCT
END_TYPE

(* @END_DECLARATION := '0' *)

(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
TYPE MB_stepper_hm :
STRUCT
   dist: INT := 0;
   distSign: INT := 0;
   commandCode: INT;
   commandSent: BOOL;
   globalToken: BOOL;
   getStatus: MB_statusReader;
   getPos: MB_statusReader;
   setAcc: MB_paramSetter;
   setDec: MB_paramSetter;
   setSpeed: MB_paramSetter;
   setDistance: MB_paramSetter;
   setDistNeg: MB_paramSetter;
   setParam1: MB_paramSetter;
   setParam2: MB_paramSetter;
   setCommand: MB_paramSetter;
   stopCmdSender: MB_write;
	posReset: BOOL;
	param1: INT;
	timerAutoReset: TON;
	timerFinReset: TON;
	timerPosReset: TON;
	sendCommand: BOOL;
	lastStepPos: INT;
	cmdWasSH: BOOL;
	cmdWasEP: BOOL;
	cmdWasFL: BOOL;
	allParamOk: BOOL;
	distNeg: BOOL;
END_STRUCT
END_TYPE
(* @END_DECLARATION := '0' *)

(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
TYPE MB_Stepper_mac :
STRUCT
   Acc: INT := 200;
   Dec: INT := 200;
   Speed: INT := 150;

END_STRUCT
END_TYPE
(* @END_DECLARATION := '0' *)

(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
TYPE MB_Stepper_sts :
STRUCT
   Ready: BOOL;
   Running: BOOL;
   Position: INT;
   StatusCode: DINT;
   Error: BOOL;
   Moving: BOOL;
END_STRUCT
END_TYPE
(* @END_DECLARATION := '0' *)
