恭喜,你发布的帖子
发布于 2022-12-13 15:59:56
8楼
需要多重调用程序,用FC块,还是FB块比较好。就是阀门控制。请大神提供一个思路。这个在DCS很经常用到,都是系统只带的一个块,直接调用的。阀门正常有三个颜色,红(关)绿(开)黄(故障)。
/////////////////////
取决于你的系统是否要存储针对该对象的状态,模式等等控制和显示的情况,如果有用FB,如果没有,用FC,你这个应该用FB比较合适。
如果同一个逻辑处理多次使用,可以用数组的方式进行控制,这样比较方面,也好维护。
例如
FUNCTION_BLOCK FB20
TITLE = 'Block Title'
//
// 4选1 控制 泵的控制与状态显示。
//
VERSION: '1.0'
AUTHOR: baikai
NAME: pump
FAMILY: pump
know_how_protect
CONST
pump_max :=20; //泵的总数量
pump_stop :=0; //泵停止状态
pump_run_s :=1; //泵运行状态
pump_fault:=2; //泵故障状态
time_check :=5; // 泵打开/关闭 检测时间 5 秒
END_CONST
VAR_INPUT
button_start:ARRAY[1..pump_max] OF BOOL:=false; // 泵的启动按钮
button_stop :ARRAY[1..pump_max] OF BOOL:=false; // 泵的停止按钮
open_check: ARRAY[1..pump_max] OF BOOL:=false; // 泵的打开检测
close_check: ARRAY[1..pump_max] OF BOOL:=false; // 泵的关闭检测
FP_1Sec:BOOL; // 计数时基 1秒
reset:ARRAY[1..pump_max] OF BOOL:=false; // 故障复位
END_VAR
VAR_OUTPUT
pump_run: ARRAY[1..pump_max] OF BOOL; // 泵的运行控制
pump_status:ARRAY[1..pump_max] OF INT; // 泵的运行状态
Impls_1Sec:BOOL;
END_VAR
VAR_IN_OUT
Impls_1Sec_Aux:BOOL;
END_VAR
VAR
time_enable:ARRAY[1..pump_max] OF BOOL; // 定时器使能
time_arrival:ARRAY[1..pump_max] OF BOOL; // 时间到达
Timer_Actual:ARRAY[1..pump_max] OF INT; // 实际时间
num:INT;
END_VAR
// 1秒脉冲 作为计数时基
Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux);
Impls_1Sec_Aux:= FP_1Sec;
FOR num:= 1 TO pump_max BY 1 DO
// 按钮启动控制
pump_run[num]:= ( pump_run[num] OR button_start[num] ) AND NOT button_stop[num];
// 泵打开/关闭检测故障 定时器使能
time_enable[num]:= ( pump_run[num] AND NOT open_check[num]) OR ( NOT pump_run[num] AND NOT close_check[num]);
IF NOT reset[num] THEN
IF (NOT time_enable[num]) THEN
Timer_Actual[num]:= 0;
time_arrival[num]:= 0;
ELSE
IF (Impls_1Sec AND NOT time_arrival[num]) THEN
Timer_Actual[num]:= Timer_Actual[num] + 1;
END_IF;
time_arrival[num]:= Timer_Actual[num] >= time_check;
END_IF;
ELSE
Impls_1Sec:=false;
Timer_Actual[num]:= 0;
time_arrival[num]:= false;
END_IF;
// 状态显示选择
IF time_arrival[num] THEN
pump_status[num]:= pump_fault;
ELSE
IF pump_run[num] THEN
pump_status[num]:= pump_run_s;
ELSE
pump_status[num]:= pump_stop;
END_IF;
END_IF;
END_FOR;
END_FUNCTION_BLOCK
DATA_BLOCK DB111 FB20
//
// Block Comment...
//
BEGIN
END_DATA_BLOCK
一个很简单的逻辑控制,其中 采用一维数组可以对同样逻辑的处理可以进行扩展,这里为20个, 其次采用自己制作ODT 定时器。 这里唯一不足,是没有区分故障是开关站还是关故障。因为采用了一个定时器,状态不是开就是关。
这样做的目的 1. 减少复制,以及赋值过程书写错误。
2. 如果采用上位机 例如WINCC 方便的导入变量。
以上仅供参考
请填写推广理由:
分享
只看
楼主