八、SCL核心应用课项目实战_模拟量转换通用块设计


前言

本文是基于B站上的《SCL核心应用课项目实战》课程,所做的笔记,主要包括程序代码和自己的理解注释。课程链接:SCL核心应用课项目实战(21课全)
陆杰锋老师讲得非常好,有理论讲解也有实战演练,需要具备一定的梯形图编程基础。
有空我会持续更新。

八、模拟量转换通用块设计

PLC系统中使用的模拟量有两种,一种是模拟电压,一种是模拟电流。
模拟电压:一般是0~10V,并联相等,长距离传输时容易受干扰,一般用在OEM设备中。
模拟电流:一般是4~20mA,串联相等,抗干扰能力强,dcs系统中一般都使用模拟电流。
PLC在处理模拟量转换的时候,首先应该确定的是转换对象的物理量程。

1.需求分析

功能要求:
A.模拟量输入转换,并设置超量程(0-27648)报警:当输入值<0或>27648时,输出值为0或27648,同时报警;
B.可以设置采样频率;
C.滤波功能:设置滤波次数。

分析:
1.通用块输入引脚应具有模拟量输入值In、量程最小值Min、量程最大值Max、采样周期CY_CYCLE、滤波次数Filt_Times设定;
2.输出引脚有模拟量输出值Out、经过滤波后的模拟量输出值Filt_OUT、低低报警LL_Alarm、高高报警HH_Alarm;
3.注意:西门子PLC模拟量转换模块的量程是0-27648,其它品牌PLC不一定;
4.AI_IN作为输入变量,无法赋值,故应在Static变量区建立一个中间变量AI,将输入AI_IN暂存到AI里,之后用AI参与运算;
5.采样周期CY_CYCLE是浮点数,需要转换成时间数据类型,单位是S。在IEC定时器中,整数1000=时间1S。即Time := DInt_TO_Times (MD10 * 1000),若MD10=1,则Time=1S。这里先将浮点数CY_CYCLE转换为双整型,再转换成时间Time ;
6.采样频率是指,在每个设定时间内计算一次,比如间隔1s计算一次,即需要每个1s周期内,产生一个高电平和一个低电平,此程序将高电平所占时间设置为10ms,则低电平时间为990ms;
7.取高电平的上升沿信号P0作为计算模拟量转换的触发条件;
8.滤波是指,假设有滤波数组Filts,里面可以存放Filt_Times个数据,动态数组编写起来难度较大,这里限定0<Filt_Times<=20,将每次采样计算得到的模拟量数值存放到数组Filts中,计算数组内Filt_Times个值的平均值,即滤波后的值;
9.需要将采样得到的模拟量输出值依次存储到数组Filts中,从左到右分别为Filts[0]~Filts[19],假设某一时刻,数组Filts中的值分别为Filts[0] := 0,Filts[1] := 1,…,Filts[18] := 18,Filts[19] := 19,则下一时刻,Filts[0]存入一个最新值,Filts[1]存入上一时刻Filts[0]的值0,以此类推,Filts[19]存入上一时刻Filts[18]的值18,Filts[19]自身的值溢出。即Filts[1]:=Out,Filts[2] := Filts[1],…,Filts[18] := Filts[17],Filts[19] := Filts[18]。总之,从最后一个值开始,依次将数组中的后一个值倒序赋给前一个值。

模拟量转换计算公式:
在这里插入图片描述

2.程序编写

编程步骤:
1.建立FB块AD_Demo;
2.在AD_Demo块中建立如下变量:
在这里插入图片描述
代码如下:

//首先把浮点数CY_CYCLE转换为时间
#Time:=DINT_TO_TIME(REAL_TO_DINT(#CY_CYCLE*1000.0)-10); //DINT 1000转成TIME表示1S,若CY_CYCLE=1,则实际时间为1s
                                                        //“-10”是为了将1S分割成990ms低电平和10ms高电平
#T0(IN:=NOT #T1.Q, //T0延时990ms后接通,然后TI开始延时10ms,10ms后T1接通,T0断掉,T1断掉,T0重新开始延时990ms,循环往复
    PT:=#Time);
#T1(IN:=#T0.Q,
    PT:=T#10ms);
#P0(CLK:=#T0.Q); //检测T0上升沿信号,触发模拟量转换计算,以此来实现每1s计算一次,即采样周期为1s
                                                                                                                                       
#AI := #AI_IN; //AI_IN是输入变量,无法赋值,故先将输入AI_IN暂存到AI里,之后用AI参与运算
IF #AI < 0 THEN
    #AI := 0;
    #LL_Alarm := 1;//小于0,触发低低报警
ELSE
    #LL_Alarm := 0;
END_IF;

IF #AI >27648 THEN
    #AI := 27648;
    #HH_Alarm := 1;//大于27648,触发高高报警
ELSE
    #HH_Alarm := 0;
END_IF;

IF #P0.Q THEN
    #OUT := (INT_TO_REAL(#AI) / 27648.0) * (#OUT_MAX - #OUT_MIN) + #OUT_MIN;//计算没有经过滤波的模拟量输出值
    
    FOR #N := #Filt_Times TO 1 BY -1 DO //从最后一个值开始,依次将数组中的后一个值倒序赋给前一个值
        #Filts[#N] := #Filts[#N - 1];
    END_FOR;
    #Filts[0] := #OUT; //将输出值赋给数组中的第一个值
    
    #SUM := 0;
    FOR #N := 0 TO #Filt_Times-1 DO //计算滤波数组的和
        #SUM := #SUM + #Filts[#N];
    END_FOR;
    #Filt_OUT := #SUM / #Filt_Times; //计算平均值
END_IF;

为了便于理解采样频率的计算,这里给出梯形图程序,实现的功能同SCL程序的4-8行。
在这里插入图片描述
3.再建立一个FB块AD_FB;
4.在AD_FB块中调用AD_Demo。可选择“多重实例”;
在这里插入图片描述
在这里插入图片描述
5.最后在主程序块Main中,调用AD_FB。
在这里插入图片描述

  • 32
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值