[西门子] 流量累计计算(FB块封装内置简易滤波算法)——CODESYS

[复制链接]
查看77 | 回复0 | 2025-4-13 17:38:13 | 显示全部楼层 |阅读模式
在工业自动化领域,PLC(可编程逻辑控制器)有时也会被用来进行流量的累计计算。这通常涉及到液体或气体等介质通过管道时的体积或质量测量。流量累计计算对于过程控制非常重要,因为它可以帮助企业追踪物料使用情况、成本核算以及生产效率分析。要实现基于PLC的流量累计计算,一般需要以下几个步骤:

  1. 传感器选择与安装:首先需要确定合适的流量计类型(如涡轮流量计、电磁流量计、超声波流量计等),并正确地将其安装到工艺流程中适当的位置上。流量计的作用是将流经管道内的物质转换为电信号输出。

  2. 信号处理:流量计产生的信号可能需要经过适当的放大、滤波等预处理后才能输入给PLC。这部分工作可以通过专用的信号转换模块来完成。

  3. 程序编写

    • 数据采集:在PLC程序中配置相应的输入点以读取来自流量计的信号。

    • 单位换算:根据实际应用需求,将原始信号值转换成有意义的物理量(如升/分钟、立方米/小时等)。

    • 累加运算:通过编程实现流量值随时间累积的过程。这一步骤可能涉及到定时器的设置,确保按照特定的时间间隔更新累计值。

    • 结果展示:最终的累计结果可以通过连接至PLC的HMI(人机界面)显示出来,或者通过网络发送到其他系统进行进一步分析。

  4. 测试与调试:完成上述设置之后,还需要对整个系统进行全面的测试,确保所有组件正常工作,并且能够准确可靠地执行流量累计功能。

一、FB块的封装

IF run THEN
    relay:=1;
END_IF

IF run = 0 THEN
    relay:=0;
initial:=0;
END_IF

// 数字滤波部分
IF relay = 1   THEN
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:=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:=flow_VAL_1;

END_FOR
    initial:=1;
END_IF;

FLOW_DATA_MAX:=0;     //最大值滤波
FOR i:=1 TO Array_length BY 1 DO

IF&nbsp; FLOW_DATA_MAX<FLOW_DATA THEN

FLOW_DATA_MAX:=FLOW_DATA;

END_IF

END_FOR

FLOW_DATA_MIN:=FLOW_DATA_MAX;&nbsp; &nbsp; &nbsp;//最小值滤波

FOR i:=1 TO Array_length BY 1 DO

IF&nbsp; FLOW_DATA_MIN>FLOW_DATA THEN

FLOW_DATA_MIN:=FLOW_DATA;

END_IF

END_FOR&nbsp;

FLOW_DATA_SUM:=0;&nbsp; &nbsp; &nbsp; //数据求和求平均部分

FOR i:=1 TO Array_length BY 1 DO

FLOW_DATA_SUM:=FLOW_DATA+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:=FLOW_DATA;

END_FOR

FOR i:=1 TO (Array_length-Filter_Length) BY 1 DO

FLOW_DATA[i+Filter_Length]:=FLOW_DATA_1;

END_FOR


//数字滤波强度计算

IF Array_length>=10 THEN

&nbsp; &nbsp; &nbsp;IF Filter_strength>3 THEN 

&nbsp; Filter_strength:=3;
&nbsp;&nbsp;
&nbsp; &nbsp; &nbsp;END_IF;

Filter_Length:=( Array_length/10)*2*Filter_strength;

END_IF

IF Array_length<10 THEN
&nbsp; &nbsp;&nbsp;
IF Filter_strength>2 THEN 

&nbsp; Filter_strength:=2;
&nbsp;&nbsp;
&nbsp; &nbsp; &nbsp;END_IF;
&nbsp;&nbsp;
Filter_Length:=2*Filter_strength;

END_IF

// 流量采集
TON_0(IN:= NOT TON_0.Q AND relay , PT:=Cycle_ms);

IF TON_0.Q THEN&nbsp;&nbsp;

Cycle_Real:=TIME_TO_REAL(Cycle_ms);

Accum:=(Last_Value+flow_VAL_1)*Cycle_Real/2+Accum;

flow_out_put:=Accum;

Last_Value:=flow_VAL_1;

END_IF

END_IF

// 流量清零&nbsp;

IF Reset THEN&nbsp; &nbsp; //清零

Last_Value:=0.000000E000;

Accum:=0.000000E000;

flow_out_put:=0.000000E000;

END_IF

二、实际效果展示
已关注
关注
重播 分享 <!-- 随便看看 -->
王同学玩工控

0/0

00:00/00:17
进度条,百分之0
00:00
/
00:17
00:17
全屏

倍速播放中

继续观看

流量累计计算(FB块封装内置简易滤波算法)——CODESYS

原创
,
流量累计计算(FB块封装内置简易滤波算法)——CODESYS
王同学玩工控
已同步到看一看写下你的评论

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

本帖子中包含更多资源

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

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

本版积分规则