程序需要的逻辑是.
INR1 - INR7 8个信号输入.
从 1 => 0 => 1 变化至少一次后
且同时全为1 输出 OUTR = true
INL1 => INL7 8个信号输入.
从 1 => 0 => 1 变化至少一次后
且同时全为1 且S1 S2为1 且INR 为1 后输出 OUTL为true
程序有个总开关key.
当key=1 时 开始执行逻辑.
当key=0时, 复位所有.
硬件接线如下图.
1,2,3,4 是一个常闭的传感器信号,正常一直有24v电压.
Pilz检测到有断开即报警.
已经测试过.继电器切换的瞬间掉电Pilz检测不出来.

现在的问题是.
调用块直接输出到Q点驱动继电器时.
1,强制Q点....功能正常.
2,monitorQ点... 功能正常.
3,如果本来在强制状态,再次点强制,就会有一个提示.这种情况...功能不正常.
4,手动按中间继电器[我这个是有手动按的那种继电器]...手速不够.失败.
5,按照上面做的逻辑.从IN1-IN7一个个的动一遍输入...程序输出Q点.功能正常.
重点来了.
6,程序自动运行的时候.....大约10次有2次左右正常....其余全挂.....
在经过了一番折腾之后.
把输出自锁一下居然解决了这个问题.
所以.我怀疑是scl程序是不是哪里出了问题.
但是看了N遍也没看出来啥花儿来.....
各位大大帮忙看看.
成功的调用方法.
OB1-Network30 31.pdf
失败的调用方法.
6366977123601601046566368.pdf
下面是程序.
SCL Source(FB1200) -- ABB.pdf
我再直接贴个代码.
FUNCTION_BLOCK FB1200
TITLE = '提升门屏蔽光栅子程序'
// INR0-INR7 右侧P1-P5提升门
// INL0-INL7 左侧卷帘门
// S1,S2 是静态门 不检测是否打开.只要是关闭状态即可.
// 其余门必须完成东走 [关闭-打开-关闭] 之后才有输出.
// OUTR 右侧状态输出.
// OUTL 左侧状态输出.
// OUTR 在 INR 完成动作后 即输出 OUTR=TRUE.
// OUTL 必须要S1,S2,OUTR都为真且INL完成动作后才输出 OUTL=TRUE.
// KEY为假时: 复位所有信号.
VERSION: '1.0'
AUTHOR: xy_z
NAME: SZHONG6
FAMILY: VOLVO
VAR
INR : STRUCT //右侧
IN00 : BOOL;
IN01 : BOOL;
IN02 : BOOL;
IN03 : BOOL;
IN04 : BOOL;
IN05 : BOOL;
IN06 : BOOL;
IN07 : BOOL;
END_STRUCT;
INL : STRUCT //左侧
IN00 : BOOL;
IN01 : BOOL;
IN02 : BOOL;
IN03 : BOOL;
IN04 : BOOL;
IN05 : BOOL;
IN06 : BOOL;
IN07 : BOOL;
END_STRUCT;
R AT INR : BYTE;
L AT INL : BYTE;
RC : BYTE;
LC : BYTE;
StepR : INT;
StepL : INT;
END_VAR
VAR_INPUT
INR00 : BOOL;
INR01 : BOOL;
INR02 : BOOL;
INR03 : BOOL;
INR04 : BOOL;
INR05 : BOOL;
INR06 : BOOL;
INR07 : BOOL;
INL00 : BOOL;
INL01 : BOOL;
INL02 : BOOL;
INL03 : BOOL;
INL04 : BOOL;
INL05 : BOOL;
INL06 : BOOL;
INL07 : BOOL;
S1 : BOOL;
S2 : BOOL;
Key : BOOL;
END_VAR
VAR_OUTPUT
OUTR : BOOL;
OUTL : BOOL;
END_VAR
BEGIN
INR.IN00 := INR00;
INR.IN01 := INR01;
INR.IN02 := INR02;
INR.IN03 := INR03;
INR.IN04 := INR04;
INR.IN05 := INR05;
INR.IN06 := INR06;
INR.IN07 := INR07;
INL.IN00 := INL00;
INL.IN01 := INL01;
INL.IN02 := INL02;
INL.IN03 := INL03;
INL.IN04 := INL04;
INL.IN05 := INL05;
INL.IN06 := INL06;
INL.IN07 := INL07;
IF KEY THEN
// 右侧安全门,全部 关闭-打开-关闭返回true
CASE StepR OF
0 : //判断全部信号true
IF R = 16#FF THEN
StepR :=1;
END_IF;
1 : //判断全部信号false一次
R := R XOR 16#FF; //取反
RC := R OR RC; //存储到LR
IF RC = 16#FF THEN //全为0时下一步
StepR := 2;
END_IF;
2 : //再次判断全部信号true
IF R = 16#FF THEN
StepR :=3;
END_IF;
3 :
OUTR := TRUE;
;
END_CASE;
// 左侧安全门,全部 关闭-打开-关闭 且 右侧完成动作 且 S1,S2全部关闭
CASE StepL OF
0 : //判断全部信号true
IF L = 16#FF THEN
StepL :=1;
END_IF;
1 : //判断全部信号false一次
L := L XOR 16#FF; //取反
LC := L OR LC; //存储到LC
IF LC = 16#FF THEN //全为0时下一步
StepL := 2;
END_IF;
2 : //再次判断全部信号true
IF L = 16#FF AND OUTR AND S1 AND S2 THEN
StepL :=3;
END_IF;
3 :
OUTL := TRUE;
;
END_CASE;
ELSE
// RESET
STEPR := 0;
STEPL := 0;
OUTR := 0;
OUTL := 0;
RC := 16#0;
LC := 16#0;
END_IF;
END_FUNCTION_BLOCK