试着写了一段程序,用PLCSIM测试过,个人认为完全满足楼主要求,欢迎各位网友批评指正。
为便于编程,假设符号表如下:

FC1
程序内容如下:
//Keep the Last Value
L MD 100
T MD 104
//Get the Next Output Pointer
_MOV: L MD 100
L P#0.1
+D
T MD 100
L MD 100
L P#2.3
>D
JNB _001
L P#2.0
T MD 100
_001: L MD 100
L P#2.0
JNB _002
L P#2.0
T MD 100
_002: NOP 0
A M [MD 100] //如果当前设备故障则获取下一设备地址
JC _MOV
OB1程序如下:
//如果全部故障则清空输出,并退出运行
O(
A "设备1故障"
A "设备2故障"
A "设备3故障"
A "设备4故障"
)
ON "设备启动"
JNB _OK
CLR
= "设备1"
= "设备2"
= "设备3"
= "设备4"
BEU
_OK: A "设备启动"
FP M 10.0
JNB _RUN
L P#2.0
T MD 100 //首次启动设备从头开始
_RUN: SET
= Q [MD 100] //输出
A I [MD 100]
R Q [MD 104] //停止上一台设备
A I [MD 100] //对应设备运行延时检测
L S5T#5S
SD T 1
O M [MD 100] //如果当前设备故障
O T 1 //如果运行延时到
FP M 10.1
JNB _001
CALL "GetNextAdr" //获取下一设备地址
_001: NOP 0