动动更健康,呵呵,这样看能否满足要求:
先把相应电机的状态写到电机状态字中,然后把译码出来的相应的启动信号(常开)并联在原来的启动上,把相应的停止信号(常闭)串联在原来的停止上。
输出的都是上升沿信号。

FUNCTION_BLOCK "SC32"
TITLE =
VERSION : 0.1
AUTHOR : 'L.Q.H'
VAR_INPUT
dwMotorSt : DWORD ; //电机启动状态
dwMotorPCD : DWORD ; //电机控制字
bStart : BOOL ; //群起信号
bStop : BOOL ; //群停信号
bRest : BOOL ; //复位信号,未用设为1
END_VAR
VAR_OUTPUT
dwMotrtStar : DWORD ; //相应电机启动信号
dwMotrtStop : DWORD ; //相应电机停止信号
END_VAR
VAR
bStartMark : BOOL ;
bSopMark : BOOL ;
bFP1 : BOOL ;
bFP2 : BOOL ;
bFP3 : BOOL ;
bEnab : BOOL ;
bTime : BOOL ;
iActNo : INT ;
dwActST : DWORD ;
T0N1 : "TON";
END_VAR
VAR_TEMP
bTemp1 : BOOL ;
dwtemp1 : DWORD ;
dwtemp2 : DWORD ;
iNum : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
//初始化
SET ;
SAVE ;
L L#0;
T #dwMotrtStar;
T #dwMotrtStop;
T #dwtemp1;
T #dwtemp2;
LAR1 P##dwtemp1;
L 4; //群起停设备数,最大32个
T #iNum;
//停止标志
A #bStop;
FP #bFP2;
X #bSopMark;
AN #bStart;
A #bRest;
= #bSopMark;
//启动标志
A #bStart;
FP #bFP3;
X #bStartMark;
AN #bStop;
A #bRest;
= #bStartMark;
A #bStartMark;
O #bSopMark;
FP #bFP1;
JCN s001;
//群启及群停时的初始化
CLR ;
= #bEnab;
SET ;
= #bTime;
L 0;
T #iActNo;
//检查的设备
L #dwMotorSt;
L #dwMotorPCD;
OD ;
T #dwActST;
A #bSopMark;
AN #bStartMark;
JCN s001; //当群停时把信号取反
L #dwMotorSt;
INVD ;
T #dwActST;
s001: A #bStartMark;
O #bSopMark;
A #bTime;
JCN s002;
s003: L #dwActST;
SRD 1;
JZ s004;
T #dwActST;
L #iActNo;
+ 1;
T #iActNo; //设备计数
L #iNum;
>I ;
R #bStartMark;
R #bSopMark;
JC s002;
JU s003;
s004: T #dwActST;
SET ;
= #bEnab;
L #iActNo;
+ 1;
T #iActNo; //设备计数
L #iNum;
>I ;
R #bStartMark;
R #bSopMark;
s002: A #bStartMark;
O #bSopMark;
A #bEnab;
AN #bTime;
= #bTemp1;
CALL #T0N1 (
IN := #bTemp1,
PT := T#2S,
Q := #bTime);
L #iActNo;
+ -1;
+AR1 ;
A #bTime;
A #bStartMark;
AN #bSopMark;
JCN s010;
= [AR1,P#0.0];
s010: A #bTime;
AN #bStartMark;
A #bSopMark;
JCN s011;
= [AR1,P#4.0];
s011: A #bTime;
= #bTime;
L #dwtemp1;
CAD ;
T #dwMotrtStar;
L #dwtemp2;
CAD ;
T #dwMotrtStop;
JCN end;
R #bEnab;
end: BEU ;
END_FUNCTION_BLOCK
已启动的设备或屏蔽的设备不会被重复启动或停止。