基于西门子PLC300的流量累计程序实例
- 格式:docx
- 大小:18.02 KB
- 文档页数:5
PLC计算流量累计不准?本文解释得很清楚!实例讲解程序!以前我们讲过西门子S7-200在流量累计中的应用,今天我们来学习一下S7-300系列的应用。
打开今日头条,查看更多图片理论来说,博途系列PLC的编程思路与S7-300一致,只是软件有一些区别而已。
那么PLC计算累计流量有多种方法。
常用的有使用中断计算和脉冲数计算。
今天我们来学习一下利用中断计算。
项目实例,A厂有一燃气流量机,需要使用该表计算其燃气用量。
思路大概如下;因PLC可以接收到其时时流量,因此可以使用100ms的中断去累加该流量,当然1s的中断也可以,不过扫描周期越短,数值越精确。
例如;一块流量计的瞬时流量是10m3/h,那么将该流量值除以36000,那就是100ms的流量,每100ms将该值累加,得到的数值就是累计量,理论来说,中断时间越短,数值越精确。
但考虑PLC负担也增加,因此建议使用100ms-1s的中断。
然后我们进行实例解说。
一流量计信号接线,流量计一般使用模拟量输入的方式连接,如果是电流信号则分为两线制和四线制,二线制信号是指;信号的两根线既是电源线又同时是信号线。
二线制的优点是接线简单,只适用一般功率小的一次传感器,如:压变、差压变、温变、电容式液位计、射频导纳、电磁流量计、涡街流量计等。
传感器本身用电由二线制中得到,是必影响其带载能力。
四线制信号是指;电源两根线,信号两根线。
电源和信号是分开工作的。
四线制的优点是由于是将电源和功率分开,所以本机的功率与信号是没有功率上的关联的,适用于大功率的的传感器,如超声波(由于其为了加大抗干扰能力,所以发射的功率会很大,所以此款产品选型时要尽量四线的,二线的一般抗干扰能力较弱),就不能作成2线的,只能是4线,分别是工作电源2个,输出2个。
按照流量计要求将模拟量信号接入到PLC系统。
二编程;打开程序该程序包含OB1,OB35,FB1,FC105,DB1。
其中OB1是PLC程序必备,对于本实例不需要,空程序即可。
使用PLC做流量累积方法使用P L C做流量累积首先必须明确,用PLC做流量累计的精度远不如电磁等本身自带累计功能的流量计。
对有累积功能的流量计转换器,一般流量转换器的流量累积输出是脉冲输出,这样,可通过PLC的高速脉冲输入端进行高速计数,从而得出累积流量。
如果不使用高速脉冲通道采集,而使用普通的DI通道进行脉冲采集,要注意脉冲的宽度,宽度太窄的脉冲,PLC的采集是有困难的。
对只有瞬时流量输出的流量计,才考虑在PLC中用定时脉冲进行流量累积加法运算,但要注意数据存储区中数值的溢出问题。
以AB公司的PLC为例,对于CONTROLLOGIX系统,应使用周期性Task进行累积计算,对于SLC500系列的PLC则使用中断的方法。
在PLC内做累积的时候,不应使用定时器来做,那样加出来数据的误差是大的不能承受的。
流量计的数值单位应用的较多的是m3/h。
在PLC内可以每秒钟采一次样,进行累加,再将累加值除以3600,即得到每小时的累积值。
在PLC上做累积的时候还应注意停电后累积流量要能保存,累积数值的自动和手动清零问题也必须考虑,免得溢出。
对于某些需要温压补偿的流量计,流量数据应在处理好后再进行累积,而不能直接使用流量计本身的瞬时值。
SLC500的累积程序示例:除了以上程序,再在主程序中使用MOV 或其它指令实现对累积值的清零。
附:STI 参数的设置STI: 可选定时中断允许用户以特定的周期自动中断主程序文件,扫描一个指定的子程序文件1. 创建一个子程序2. 在S:31内输入可选定时中断STI子程序文件的文件号,如文件号为0,则禁止中断功能。
3.在S:30内输入设定值(两次连续中断的时间间隔).对于5/04,范围是1-32767ms,以ms为单位。
中断STI精度位S:2/10,为1时,单位为ms。
为0时,单位10ms 4.设定值必须长于STI子程序文件执行的时间长,否则次要故障位被置位。
为了表示可选定时中断子程序,在子程序文件的第一梯级的第一条指令应是INT指令。
流量累计例程使用说明例程功能:完成对实时流量的累计功能程序结构:在循环中断组织块OB35中调用功能块FB1,FB1的背景数据块为DB1例程说明:1.在例程中配置了一个S7-300站,并添加了一块SM331模板,假定流量计的4-20mA输出信号接至该模板0通道,地址为PIW256。
2.在硬件配置中CPU的属性界面下设置循环中断组织块OB35的周期为1000ms,即1秒钟。
3.FB1为封装的流量累计子程序,在OB35中调用FB1,其背景数据块为DB1。
FB1的输入/输出管脚需逐个定义,具体说明如下:FB1输入变量:Flow_in:INT;//流量信号的模拟量输入地址,在例程中为PIW256Hi_limit:REAL;//流量信号的工程量上限,在例程中为3600.0m3/hLow_limit:REAL;//流量信号的工程量下限,在例程中为0.0m3/h Division:DINT;//实时流量时间单位的除数,如欲每秒计算一次累计流量,则该值为3600,因为实时流量时间单位为h,即小时,一小时为3600秒。
注意:OB35的周期必须与计算累计流量的周期相同。
Clear:BOOL;//累计流量清零FB1输出变量:Flow_rt:REAL;//转换为工程单位的实时流量Flow_Accu:REAL;//当前累计流量值4.将硬件配置及程序下载至CPU后,CPU将每秒计算一次累计流量,并将当前实时流量和累计流量值分别输出至MD2和MD6供读取。
如想将当前累计流量清零,只需将Clear管脚置“1”,该管脚为高电平有效。
使用方法:将例程中FB1,DB1拷贝至您的项目中某S7-300/-400站下的Blocks中,在OB35中调用,按照上述说明定义FB1的输入/输出管脚即可。
以前我用plc做过流量计算。
首先的看你用什么计流量,如果是脉冲信号,因为PLC本身有运行周期,如果控制要求较高的场合,通过脉冲来计算出瞬时流量,计算出来实际上是不准的,而且控制上滞后比较严重。
基于西门子PLC300流量累计的程序【在工业中往往会遇到业主要求做流量累积程序,比如要求检测到每月天然气用量,石油采集量,生产材料的多少,针对这些情况,PLC300往往做得多不是很精准,下面我介绍一个精度相对比较高的程序】由于有些地方采用T型图很难实现STL方便复制,本例采用STL 来编写更加方便本例采用OB35中断程序来实现,OB35中断时间为100ms,这个CALL "FLOWCOUNT"Reset :=M11.0instantF :=MD120Cycle :=1.000000e+002LimitF :=0.000000e+000INTF :=MD124DECF :=MD128Error :=MD132BEFORE :=MD136FC200 【FLOWCOUNT】功能块针对流量累积计算的算法原理是:积分量:就是当前中断程序执行的周期时间内的流量总和当前积分量= 积分量+ 以前的计算误差当前累积量= 当前积分量+ 原累积量>=DO #ResetJCN A7d0L L#0T #INTFL 0.000000e+000T #DECFT #Error // 如果累积量大于清零值或者清零键复位,则所以的清零重新累积A7d0: L #instantFL #BEFORE+RL 2.000000e+000/RT #Average //当前周期与上周期采样的值平均L #AverageL #LimitF>=RJCN A7d1L #LimitFT #FlowmeterValueSmallAltL #AverageL #Cycle*RL 3.600000e+006/RL #Error+RT #IntegralL #IntegralL #FlowmeterValueSmallAlt+RT #DECFL #FlowmeterValueSmallAltL #DECF-RL #Integral+RT #ErrorA7d1: L #DECFL 1.000000e+000>=RJCN A7d2L #DECFRNDL #INTF+DT #INTFL #DECFRNDDTR //将ACCU 1与ACCU 2互换L #DECFTAK-RT #DECFA7d2: L #instantFT #BEFORECLR //计算的误差A L 12.1SA VEBE一些指令说明:1.TAK 将ACCU 1与ACCU 2互换目录ACCU 1ACCU 2执行TAK指令之前<MW12><MW10>执行TAK指令之后<MW10><MW12>2.DTR 将长整型(32位)转换为浮点数(32位IEEE 754)例子:STL解释L MD10//将32位整数载入ACCU 1。
基于西门子PLC300流量累计的程序【在工业中往往会遇到业主要求做流量累积程序,比如要求检测到每月天然气用量,石油采集量,生产材料的多少,针对这些情况,PLC300往往做得多不是很精准,下面我介绍一个精度相对比较高的程序】由于有些地方采用T型图很难实现STL方便复制,本例采用STL 来编写更加方便本例采用OB35中断程序来实现,OB35中断时间为100ms,这个CALL "FLOWCOUNT"Reset :=M11.0instantF :=MD120Cycle :=1.000000e+002LimitF :=0.000000e+000INTF :=MD124DECF :=MD128Error :=MD132BEFORE :=MD136FC200 【FLOWCOUNT】功能块针对流量累积计算的算法原理是:积分量:就是当前中断程序执行的周期时间内的流量总和当前积分量= 积分量+ 以前的计算误差当前累积量= 当前积分量+ 原累积量>=DO #ResetJCN A7d0L L#0T #INTFL 0.000000e+000T #DECFT #Error // 如果累积量大于清零值或者清零键复位,则所以的清零重新累积A7d0: L #instantFL #BEFORE+RL 2.000000e+000/RT #Average //当前周期与上周期采样的值平均L #AverageL #LimitF>=RJCN A7d1L #LimitFT #FlowmeterValueSmallAltL #AverageL #Cycle*RL 3.600000e+006/RL #Error+RT #IntegralL #IntegralL #FlowmeterValueSmallAlt+RT #DECFL #FlowmeterValueSmallAltL #DECF-RL #Integral+RT #ErrorA7d1: L #DECFL 1.000000e+000>=RJCN A7d2L #DECFRNDL #INTF+DT #INTFL #DECFRNDDTR //将ACCU 1与ACCU 2互换L #DECFTAK-RT #DECFA7d2: L #instantFT #BEFORECLR //计算的误差A L 12.1SA VEBE一些指令说明:1.TAK 将ACCU 1与ACCU 2互换目录ACCU 1ACCU 2执行TAK指令之前<MW12><MW10>执行TAK指令之后<MW10><MW12>2.DTR 将长整型(32位)转换为浮点数(32位IEEE 754)例子:STL解释L MD10//将32位整数载入ACCU 1。
流量累积例程[转帖]作者:-用FB做的带数据块的流量累积功能块。
采样累积在毫秒单位内ms_v,满一秒转入是s_v,同时将ms、ms_v清零,满一分钟累积量转入m_v,t同时将s、s_v清零,满一一小时累积量转入h_v,同时将min、m_v清零,可以累积入天…….。
每一时刻的累积量是ms_v+s_v+m_v+h_v。
Rest为零累积量清零。
在OB35中调用即可,如OB35中断周期为100ms,流量输入单位方/H,Unilt_c 就是36000,Hz就为10,unilt_v对应流量记满量程值。
In pv word瞬时流量In Unit_c Real瞬时流量单位转换为采样时间流量单位In Rest int为零时,累加器清零In Hz int每秒采样次数In unilt_v Real流量计最大流量单位Out ov Real流量累积输出In_out ms int毫秒记数In_out s int秒记数In_out min int分钟记数In_out h int小时记数In_out ms_v dint毫秒流量累积In_out s_v dint秒流量累积In_out m_v dint分钟流量累积In_out h_v dint小时流量累积In_out in_v dint将输入瞬时流量变为长整型流量累积功能块毫秒流量累积L #PVT #iv_cL #iv_cL #ms_v+DT #ms_vL #msL 1+IT #msL #Hz<IJC ol秒流量累积L #ms_vL #s_v+DT #s_vL #sL 1+IT #sL 0T #msT #ms_vL #sL 60<IJC ol分钟流量累积L #m_vL #s_v+DT #m_vL #minL 1+IT #minL 0T #sT #s_vL #minL 60<IJC ol小时流量L #h_vL #m_v+DT #h_vL #hL 1+IT #hL 0T #minT #m_v 清零ol: L #RestL 0<>IJC endL 0L 0T #msT #sT #minT #hT #ms_vT #s_vT #m_vT #h_v 累积量end: L #ms_v。
流量累计例程使用说明Author: SLC A&D CSVersion: V1.0例程功能:完成对实时流量的累计功能程序结构:在循环中断组织块OB35中调用功能块FB1,FB1的背景数据块为DB1例程说明:1. 在例程中配置了一个S7-300站,并添加了一块SM331模板,假定流量计的4-20mA输出信号接至该模板0通道,地址为PIW256。
2. 在硬件配置中CPU的属性界面下设置循环中断组织块OB35的周期为1000ms,即1秒钟。
3. FB1为封装的流量累计子程序,在OB35中调用FB1,其背景数据块为DB1。
FB1的输入/输出管脚需逐个定义,具体说明如下:FB1输入变量:Flow_in : INT ; //流量信号的模拟量输入地址,在例程中为PIW256Hi_limit : REAL ; //流量信号的工程量上限,在例程中为3600.0m3/hLow_limit : REAL ; //流量信号的工程量下限,在例程中为0.0m3/hDivision : DINT ; //实时流量时间单位的除数,如欲每秒计算一次累计流量,则该值为3600,因为实时流量时间单位为h,即小时,一小时为3600秒。
注意:OB35的周期必须与计算累计流量的周期相同。
Clear : BOOL ; //累计流量清零FB1输出变量:Flow_rt : REAL ; //转换为工程单位的实时流量Flow_Accu : REAL ; //当前累计流量值4. 将硬件配置及程序下载至CPU后,CPU将每秒计算一次累计流量,并将当前实时流量和累计流量值分别输出至MD2和MD6供读取。
如想将当前累计流量清零,只需将Clear管脚置“1”,该管脚为高电平有效。
使用方法:将例程中FB1, DB1拷贝至您的项目中某S7-300/-400站下的Blocks中,在OB35中调用,按照上述说明定义FB1的输入/输出管脚即可。
累计流量(西门⼦程序)FUNCTION "FLUXbase" : VOIDVAR_INPUTPV : REAL ; //瞬时流量CYC : REAL ; //采样时间(MS)PLL : REAL ; //最⼩瞬时流量END_VARVAR_IN_OUTOV_ER1 : REAL ; //累计偏差OV_ER2 : REAL ; //累计偏差PV_ALT : REAL ; //上周期瞬时流量OV : REAL ; //流量累积输出END_VARVAR_TEMPtmpReal1 : REAL ;tmpReal2 :REAL ;OValt : REAL ;END_VARBEGINOValt := OV ;IF PV >= PLL THENtmpReal1 := PV * (CYC / 3.6E+6 ) + OV_ER1 ;tmpReal2 := tmpReal1 + OV_ER2 ;OV := tmpReal2 + OValt ;OV_ER1 := OV_ER2 - tmpReal2 + tmpReal1 ;OV_ER2 := OValt - OV + tmpReal2 ;ELSEOV := OValt ;END_IF ;IF OV >= 1.000000e+009 THENOV := 0.000000e+000;END_IF ;END_FUNCTION这是我的累积计算,程序简单,精度也⽐较⾼OValt = 1.0e+006tmpReal2 = 0.1OV = OValt + tmpReal2 = 1.0e+006 + 0.1 = 1.0e+006OV_ER2 := OValt - OV + tmp Real2 = 1.0e+006 - 1.0e+006 + 0.1 = 0.1qlhcco2008-5-13 18:36:36我把我的家底都抖给你了,这是浮点数在执⾏加减法时产⽣的误差,我把每次运算的误差再加的本次的积分⾥,不管再⼩的数,累加定量以后,他就可以加到OV⾥了,所以我的这个算法不会因为OV值⼤了⽽不能累积。
基于西门子PLC300流量累计的程序
【在工业中往往会遇到业主要求做流量累积程序,比如要求检测到每月天然气用量,石油采集量,生产材料的多少,针对这些情况,PLC300往往做得多不是很精准,下面我介绍一个精度相对比较高的程序】
由于有些地方采用T型图很难实现STL方便复制,本例采用STL 来编写更加方便
本例采用OB35中断程序来实现,OB35中断时间为100ms,这个100ms很关键,为了确认精度,采样周期必须和这个中断时间相同。
定义流量统计极端程序为FC200,名称为FLOWCOUNT
针对运用的变量说明:
在OB35中编写DEMO程序如下:
CALL "FLOWCOUNT"
Reset :=M11.0
instantF :=MD120
Cycle :=1.000000e+002
LimitF :=0.000000e+000
INTF :=MD124
DECF :=MD128
Error :=MD132
BEFORE :=MD136
FC200 【FLOWCOUNT】功能块针对流量累积计算的算法原理是:积分量:就是当前中断程序执行的周期时间内的流量总和
当前积分量= 积分量+ 以前的计算误差
当前累积量= 当前积分量+ 原累积量
当前计算误差= 原累积量-当前累积量+ 当前积分量
程序编写如下:
在FC200的变量表内设置接口变量:
SET
SA VE
= L 12.1
L #INTF
L L#1000000000 //这个值根据自己需求上线设定
>=D
O #Reset
JCN A7d0
L L#0
T #INTF
L 0.000000e+000
T #DECF
T #Error // 如果累积量大于清零值或者清零键复位,则所以的清零重新累积A7d0: L #instantF
L #BEFORE
+R
L 2.000000e+000
/R
T #Average //当前周期与上周期采样的值平均
L #Average
L #LimitF
>=R
JCN A7d1
L #LimitF
T #FlowmeterValueSmallAlt
L #Average
L #Cycle
*R
L 3.600000e+006
/R
L #Error
+R
T #Integral
L #Integral
L #FlowmeterValueSmallAlt
+R
T #DECF
L #FlowmeterValueSmallAlt
L #DECF
-R
L #Integral
+R
T #Error
A7d1: L #DECF
L 1.000000e+000
>=R
JCN A7d2
L #DECF
RND
L #INTF
+D
T #INTF
L #DECF
RND
DTR //将ACCU 1与ACCU 2互换
L #DECF
TAK
-R
T #DECF
A7d2: L #instantF
T #BEFORE
CLR //计算的误差
A L 12.1
SA VE
BE
一些指令说明:
1.TAK 将ACCU 1与ACCU 2互换
目录ACCU 1ACCU 2
执行TAK指令之前<MW12><MW10>
执行TAK指令之后<MW10><MW12>
2.DTR 将长整型(32位)转换为浮点数(32位IEEE 754)
例子:
STL解释
L MD10//将32位整数载入ACCU 1。
DTR//从长整型转换为浮点型(32位IEEE FP);结果存储在ACCU 1中。
T MD20//将结果(BCD数字)传送到MD20。
3.RND 取整
实例
STL解释
L MD10//将浮点数载入ACCU 1-L。
RND//将浮点数(32位,IEEE 754)转换为整型(32位)并对结果进行舍入。
T MD20//将结果(长整数)传送到MD20。
转换前的值转换后的值
MD10 = "100.5"=> RND =>MD20 = "+100"
MD10 = "-100.5"=> RND =>MD20 = "-100"
4.JCN 当RLO = 0时跳转
实例
STL注解
A I 1.0
A I 1.2
JCN JOVR//当RLO = 0时跳转到跳转标签JOVR。
L IW8//当不执行跳转时,在此继续执行程序扫描。
T MW22
JOVR:A I 2.1//跳转到跳转标签JOVR后,在此继续执行程序扫描。