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

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



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

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

    程序编写:



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

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

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

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

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

一、FB块的封装



IF run THEN    relay:=1;END_IF
IF run = 0 THEN    relay:=0;initial:=0;END_IF
// 数字滤波部分IF relay = 1   THENflow_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  FLOW_DATA_MAX<FLOW_DATA THEN

FLOW_DATA_MAX:=FLOW_DATA;

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 THEN

FLOW_DATA_MIN:=FLOW_DATA;

END_IF

END_FOR
FLOW_DATA_SUM:=0;      //数据求和求平均部分
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

     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
// 流量采集TON_0(IN:= NOT TON_0.Q AND relay , PT:=Cycle_ms);        
IF TON_0.Q THEN

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

// 流量清零

IF Reset THEN    //清零

Last_Value:=0.000000E000;

Accum:=0.000000E000;

flow_out_put:=0.000000E000;

END_IF
二、实际效果展示





本帖子中包含更多资源

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

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

本版积分规则