发布于 2005-11-16 12:08:21
0楼
发
A #BSEND_TriggerSEND
AN #BSEND_REQ
AN #BSEND_DONE
AN #BSEND_ERROR
R #BSEND_TriggerSEND
S #BSEND_REQ //Set SEND_REQ
// ------------------------
// Generate edge SEND_REQ
// ------------------------
A(
O #BSEND_DONE
O #BSEND_ERROR
)
A #BSEND_REQ
R #BSEND_REQ
// ------------------------
// SEND with Instance-DB
// ------------------------
CALL "P_SND_RK" , #InstanceForFB8 //"DB50"
SF :='S'
REQ :=#BSEND_REQ //DB40.DBX0.0
R :=#BSEND_R //DB40.DBX0.1
LADDR :=#LADDR //DB40.DBW16
DB_NO :=#BSEND_DB_NO //42
DBB_NO :=#BSEND_DBB_NO //0
LEN :=#BSEND_Len //DB40.DBW10
R_CPU_NO:=
R_TYP :='X'
R_NO :=
R_OFFSET:=
R_CF_BYT:=
R_CF_BIT:=
DONE :=#BSEND_DONE //DB40.DBX0.4
ERROR :=#BSEND_ERROR //DB40.DBX0.5
STATUS :=#BSEND_STATUS //DB40.DBW12
// -------------------------------
// Check "Complete without error"
// -------------------------------
A #BSEND_DONE
JCN SND1
L #BSEND_CompleteWithoutErr
+ 1
T #BSEND_CompleteWithoutErr
L #Cyc_order //将当前发送完的顺序附给接收的顺序
T #RVC_Cyc_order
L #Cyc_order //判断当前的顺序是不是循环中最后的发送请求,判断Last属性是否为1
L 200
*I
SLD 3
LAR1
A DIX [AR1,P#0.2] //判断当前循环中当前顺序下Last属性是否为1
JCN SD1 //if no then jump to SD1
L #Cyc_order
L 200
*I
SLD 3
LAR1
L DIW [AR1,P#8.0] //将当前发送的顺序的等待返回报文的时间附值给计时程序,等待时间的定义与接收长度有关。
T #TimerInterval
L 0 //如果last是1则重新开始新的循环
T #Cyc_order
NXT1: L #Cyc_order //判断下一顺序是否Enable,如果为否则跳过,如果全部为否则只发送last为1的顺序,也就是说last为一的顺序一定会发送一,同时必须有一个顺序的last属性定为1次。
L 200
*I
SLD 3
LAR1
A DIX [AR1,P#0.0] //判断当前循环中当前顺序下Enable属性是否为1
JC OUT1
A DIX [AR1,P#0.2] //判断当前循环中当前顺序下Last属性是否为1
JC OUT1
L #Cyc_order
L 1
+I
T #Cyc_order
JC NXT1
OUT1: NOP 0
S #Enabled //重新开始等待接收数据的计时
JU SND3
SD1: L #Cyc_order
L 200
*I
SLD 3
LAR1
L DIW [AR1,P#8.0]
T #TimerInterval
L 1 //如果last是0则顺序加1
L #Cyc_order
+I
T #Cyc_order
NXT2: L #Cyc_order
L 200
*I
SLD 3
LAR1
A DIX [AR1,P#0.0] //判断当前循环中当前顺序下Enable属性是否为1
JC OUT2
A DIX [AR1,P#0.2] //判断当前循环中当前顺序下Last属性是否为1
JC OUT2
L #Cyc_order
L 1
+I
T #Cyc_order
JC NXT2
OUT2: NOP 0
S #Enabled //重新开始等待接收数据的计时
JU SND3
// -------------------------------
// Check "Complete with error"
// -------------------------------
SND1: A #BSEND_ERROR // DB40.DBX 0.5 //ERROR ?
JCN SND2 //if NO
L #Cyc_order //将当前发送完的顺序附给接收的顺序
T #RVC_Cyc_order
L #BSEND_CompleteWithErr // DB40.DBW 8 //"Complete with error"
+ 1 //increment counter
T #BSEND_CompleteWithErr // DB40.DBW 8
L S5T#500MS
T #TimerInterval
L #Cyc_order //判断当前的顺序是不是循环中最后的发送请求,判断Last属性是否为1
L 200
*I
SLD 3
LAR1
A DIX [AR1,P#0.2] //判断当前循环中当前顺序下Last属性是否为1
JCN SD2
L 0 //如果last是1则重新开始新的循环
T #Cyc_order
NXT3: L #Cyc_order
L 200
*I
SLD 3
LAR1
A DIX [AR1,P#0.0] //判断当前循环中当前顺序下Enable属性是否为1
JC OUT3
A DIX [AR1,P#0.2] //判断当前循环中当前顺序下Last属性是否为1
JC OUT3
L #Cyc_order
L 1
+I
T #Cyc_order
JC NXT3
OUT3: NOP 0
S #Enabled //重新开始等待接收数据的计时
JU SND3
SD2: L 1 //如果last是0则顺序加1
L #Cyc_order
+I
T #Cyc_order
NXT4: L #Cyc_order
L 200
*I
SLD 3
LAR1
A DIX [AR1,P#0.0] //判断当前循环中当前顺序下Enable属性是否为1
JC OUT4
A DIX [AR1,P#0.2] //判断当前循环中当前顺序下Last属性是否为1
JC OUT4
L #Cyc_order
L 1
+I
T #Cyc_order
JC NXT4
OUT4: NOP 0
S #Enabled //重新开始等待接收数据的计时
JU SND3
NOP 0
NOP 0 //Error-Handling
NOP 0
L 0
L #BSEND_STATUS // DB40.DBW 12 //if STATUS <> 0
==I
JC SND3
T #BSEND_STATUS_SAVE // DB40.DBW 14 //save STATUS
JU SND3
// ----------------------------
// Check "Error in STATUS"
// ----------------------------
SND2: L 0
L #BSEND_STATUS // DB40.DBW 12 //if STATUS <> 0
==I
JC SND3
T #BSEND_STATUS_SAVE //DB40.DBW 14 //save STATUS
NOP 0 //
NOP 0 //Error-Handling
NOP 0
SND3: CLR