八、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。
在这里插入图片描述

相关推荐

  1. 设备驱动实现--模拟一个设备

    2024-01-31 13:14:01       19 阅读
  2. 数字化工厂核心应用场景

    2024-01-31 13:14:01       24 阅读
  3. 设计原则、设计模式设计模式项目实战

    2024-01-31 13:14:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 13:14:01       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 13:14:01       97 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 13:14:01       78 阅读
  4. Python语言-面向对象

    2024-01-31 13:14:01       88 阅读

热门阅读

  1. C++ 蓝桥杯历届试题 —— 小苹果题目情景及代码

    2024-01-31 13:14:01       59 阅读
  2. Delphi 析构函数(Destructor)

    2024-01-31 13:14:01       52 阅读
  3. k8s学习-通过Service访问Pod

    2024-01-31 13:14:01       49 阅读
  4. PyCharm常用快捷键和设置

    2024-01-31 13:14:01       52 阅读
  5. Centos 查看版本

    2024-01-31 13:14:01       56 阅读
  6. LeetCode每日一题 | 2670. 找出不同元素数目差数组

    2024-01-31 13:14:01       62 阅读
  7. 《Docker极简教程》--前言--本书的目的和目标

    2024-01-31 13:14:01       61 阅读
  8. 一次Rust重写基础软件的实践(三)

    2024-01-31 13:14:01       45 阅读
  9. SpringBoot实现动态数据源配置

    2024-01-31 13:14:01       52 阅读
  10. 1.29C语言 sscanf函数的用法 abs整数绝对值函数

    2024-01-31 13:14:01       54 阅读
  11. 数据结构-并查集

    2024-01-31 13:14:01       53 阅读
  12. vant滚动条下滑与下拉刷新冲突

    2024-01-31 13:14:01       53 阅读
  13. React 基础学习02

    2024-01-31 13:14:01       51 阅读