FUNCTION_BLOCK FB 5
TITLE =
VERSION : 0.1
VAR_INPUT
pCmdAddress : POINTER ;
CmdByte : BYTE ;
XData : BYTE ;
YData : BYTE ;
XNeg : BOOL ;
YNeg : BOOL ;
END_VAR
VAR_OUTPUT
Ackd : BOOL ;
END_VAR
VAR_IN_OUT
FaultBit : BOOL ;
END_VAR
VAR
Faulted : SFB 4;
END_VAR
VAR_TEMP
NotAckd : BOOL ;
wDBNo : WORD ;
AckByt0 : BOOL ;
AckByt1 : BOOL ;
AckByt2 : BOOL ;
AckBits : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
L P##pCmdAddress //pointer to pointer
AD DW#16#FFFFF //mask off area
TAR2 //current instance address
+D //add offset to give absolute address
LAR1 //use AR1 to read pointer to Q
L DINO //get instance DB number
T #wDBNo //store to internal
OPN DB [#wDBNo] //open instance DB as global DB
L D [AR1,P#2.0] //finally get pointer to Q area
LAR1
L #CmdByte //load command byte
T QB [AR1,P#0.0] // set outputs
L #XData //load Data X Register
T QB [AR1,P#1.0] // set outputs
L #YData //load Data Y Register
T QB [AR1,P#2.0] // set outputs
A #XNeg //Check if Data X Register is Negative
= Q [AR1,P#3.1] // set output if negative
A #YNeg //Check if Data Y Register is Negative
= Q [AR1,P#3.2] // set output if negative
L IB [AR1,P#0.0] //load ack input byte 0
L QB [AR1,P#0.0]
==I //if equal
= #AckByt0 // set ack bit 0
L IB [AR1,P#1.0] //load ack input byte 1
L QB [AR1,P#1.0]
==I //if equal
= #AckByt1 // set ack bit 1
L IB [AR1,P#2.0] //load ack input byte 2
L QB [AR1,P#2.0]
==I //if equal
= #AckByt2 // set ack bit 2
A(
A #XNeg // if XNeg and
A I [AR1,P#3.1] // if AckXNeg
O //or
AN #XNeg //if NOT XNeg and
AN I [AR1,P#3.1] // if NOT AckXNeg
)
A( //AND
A #YNeg
A I [AR1,P#3.2] // if YNeg and
O // if AckYNeg
AN #YNeg //or
AN I [AR1,P#3.2] //if NOT YNeg and
) // if NOT AckYNeg
= #AckBits //set AckBits
A #AckByt0 //if byte 0 ackd
A #AckByt1 // and byte 1 ackd
A #AckByt2 // and byte 2 ackd
A #AckBits // and bits ackd
= #Ackd //set OUT acknowledge bit
AN #Ackd //if not ack'd
= #NotAckd //set temp for tmr IN
CALL #Faulted //run SFB4
IN:=#NotAckd
PT:=T#2S // after 2 seconds
Q :=#FaultBit // turn on OUT fault bit
ET:=
+AR1 P#1.0
O #Ackd //whether on
ON #Ackd //or off
SAVE // save - set br
END_FUNCTION_BLOCK