[西门子] 流量累计计算--西门子FB块的封装-SCL语言

[复制链接]
查看136 | 回复0 | 2024-8-24 09:56:45 | 显示全部楼层 |阅读模式
>目前,具有众多不同品牌流量积算仪用来测量工业现场液体或者固体的瞬时流量,然后通过4-20mA信号传递给PLC,作为控制或监控的数据标准。PLC根据瞬时流量积算一定时间内的累积流量,对于流程工业控制领域液体或固体流量的数据分析和产量计算应用具有重要的意义。在西门子PLC中实现流量累计计算是一个常见的需求,尤其是在处理流体物料的应用中。下面我将提供一个基本的指导流程和一些关键步骤,以帮助您在西门子S7-1200 PLC上实现流量累计计算。一、基础原理

流量累计通常涉及瞬时流量的测量,并将其转换为累计流量。瞬时流量可以是通过模拟量输入(如4-20mA电流信号)或数字量输入(如脉冲信号)获得的。
二、实现步骤


  • 确定输入类型:

    • 如果是模拟量输入,需要配置相应的模拟量输入模块(如SM1231),并确保正确设置了量程和单位。
    • 如果是脉冲输入,则需要配置高速计数器(HSC)来读取脉冲频率,并计算瞬时流量。

  • 瞬时流量计算:

    • 对于模拟量输入,PLC会自动将输入信号转换为工程单位(如L/min或m³/h)。
    • 对于脉冲输入,需要根据脉冲频率和脉冲系数来计算瞬时流量。

  • 流量累计:

    • 使用定时中断(如OB30)来定期更新累计流量或者也可以用定时器来触发本次主要是以定时器为例来介绍。


    • 将得到的体积流量累加到累计流量寄存器中。

三、FB块的封装引脚介绍、源码展示
(一)FB块的封装

       run:BOOL;     //运行时间
        flow_VAL:REAL;    //瞬时流量输入m3/H
        Reset:BOOL;    //流量清零
        Cycle_ms:TIME;  //采样时间
        flow_out_put:REAL;  //累计流量输出
        Array_length:INT;  //数组长度
        Filter_strength:INT;  //滤波强度

(二)源码展示
IF #run = TRUE  THEN    #relay := 1;END_IF;
IF #run = FALSE THEN    #relay := 0;    #initial := 0;END_IF;
    #flow_VAL_1 := #flow_VAL / 36000;    //采集的是M3/H 转换成 M3/S        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    //初始流量采集                FOR #i := 1 TO #Array_length BY 1 DO                        #FLOW_DATA[#i] := #flow_VAL_1;                    END_FOR;        #initial := 1;    END_IF;        #FLOW_DATA_MAX := 0;     //最大值滤波    FOR #i := 1 TO #Array_length BY 1 DO                IF #FLOW_DATA_MAX < #FLOW_DATA[#i] THEN                        #FLOW_DATA_MAX := #FLOW_DATA[#i];                    END_IF;            END_FOR;        #FLOW_DATA_MIN := #FLOW_DATA_MAX;     //最小值滤波        FOR #i := 1 TO #Array_length BY 1 DO                IF #FLOW_DATA_MIN > #FLOW_DATA[#i] THEN                        #FLOW_DATA_MIN := #FLOW_DATA[#i];                    END_IF;            END_FOR;        #FLOW_DATA_SUM := 0;      //数据求和求平均部分        FOR #i := 1 TO #Array_length BY 1 DO                #FLOW_DATA_SUM := #FLOW_DATA[#i] + #FLOW_DATA_SUM;            END_FOR;        #FLOW_DATA_Average := (#FLOW_DATA_SUM - #FLOW_DATA_MIN - #FLOW_DATA_MAX) / (#Array_length - 2);      FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO                #FLOW_DATA_1[#i] := #FLOW_DATA[#i];            END_FOR;        FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO                #FLOW_DATA[#i + #Filter_Length] := #FLOW_DATA_1[#i];            END_FOR;        //数字滤波强度计算        IF #Array_length >= 10 THEN                IF #Filter_strength > 3 THEN                        #Filter_strength := 3;                    END_IF;                #Filter_Length := (#Array_length / 10) * 2 * #Filter_strength;            END_IF;        IF #Array_length < 10 THEN                IF #Filter_strength > 2 THEN                        #Filter_strength := 2;                    END_IF;                        #Filter_Length := 2 * #Filter_strength;            END_IF;        #IEC_Timer_0_Instance(IN := NOT #IEC_Timer_0_Instance.Q,                          PT := #Cycle_ms);        IF #IEC_Timer_0_Instance.Q THEN                #time_data := TIME_TO_DINT(#Cycle_ms);        #Cycle_Real := DINT_TO_REAL(#time_data);                #Accum := (#Last_Value + #flow_VAL_1) * #Cycle_Real / 2 + #Accum;                #flow_out_put := #Accum;        #Last_Value := #flow_VAL_1;     END_IF;     IF #Reset THEN                     #Last_Value := 0.000000E000;         #Accum := 0.000000E000;         #flow_out_put := 0.000000E000;              END_IF;四、结论对只有瞬时流量输出的流量计,才考虑在PLC中进行流量累积加法运算。在PLC内做流量累积的时候,不应使用定时器来做,因为定时器受到PLC扫描周期的影响,没法做到十分精确,累加出来数据的误差很大。在实际应用中吧此程序放到循环中断里即可。每天分享PLC工控知识、人人学会PLC

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则