流量累加程序的编写方法取决于所使用的PLC型号和编程语言。以下是一个基于西门子S7-200SMART PLC的流量累加程序的示例,使用梯形图(LAD)编写:
创建FB块
在程序块目录下单击添加新块,弹出添加新块对话框,选中FB函数块,在名称栏填上需要命名的名字,如"Totalizer",选择编程需要用的编程语言(如SCL),然后单击确认。
定义变量
在新建功能块中,建立临时变量,如`flow_VAL`(原始流量值)、`initial`(初始化标志)、`relay`(继电器标志)等。
程序编写
数字滤波部分:
```LAD
IF relay = 1 THEN
flow_VAL_1 := flow_VAL / 36000; // 将M3/H转换为M3/S
END_IF
```
初始流量采集:
```LAD
IF initial = 1 AND relay = 1 THEN
FOR i := 1 TO Filter_Length BY 1 DO
FLOW_DATA[i] := flow_VAL_1;
END_FOR
END_IF
```
累加运算:
```LAD
IF initial = 0 AND relay = 1 THEN
accum := accum + flow_VAL_1; // 累加流量值
initial := 1; // 标记已初始化
END_IF
```
调用FB块
在FC2(FLOWACCUM)中调用该FB块,并在OB30中断块中调用该FB块,设置中断时间为100ms。
输出结果
可以通过定义一个输出变量来显示累计流量值。
```LAD
// 定义FB块
FB Totalizer
VAR
flow_VAL: REAL; // 原始流量值
initial: BOOL; // 初始化标志
relay: BOOL; // 继电器标志
accum: REAL; // 累计流量值
Filter_Length: INT; // 滤波长度
FLOW_DATA: ARRAY[1..100]; // 流量数据数组
END_VAR
// 数字滤波部分
IF relay = 1 THEN
flow_VAL_1 := flow_VAL / 36000; // 将M3/H转换为M3/S
END_IF
// 初始流量采集
IF initial = 1 AND relay = 1 THEN
FOR i := 1 TO Filter_Length BY 1 DO
FLOW_DATA[i] := flow_VAL_1;
END_FOR
END_IF
// 累加运算
IF initial = 0 AND relay = 1 THEN
accum := accum + flow_VAL_1; // 累加流量值
initial := 1; // 标记已初始化
END_IF
// 输出累计流量值
OUTPUT accum
END_FB
// 在FC2中调用FB块
FC2 FLOWACCUM
VAR
total_flow: REAL; // 累计流量值
END_VAR
total_flow := Totalizer.accum;
OUTPUT total_flow
END_FC
// 在OB30中断块中调用FC2
OB30
CALL FC2
END_OB
```
请注意,这只是一个示例代码,实际应用中可能需要根据具体的流量计的信号输出和需求进行调整。此外,如果使用其他PLC型号或编程语言,编写方法可能会有所不同。