基于西门子PLC300的流量累计程序实例
西门子300PLC的PID例子STL

4.0
OB35_RESERVED_2 Byte
5.0
OB35_PHASE_OFFSET Word
6.0
OB35_RESERVED_3 Int
8.0
OB35_EXC_FREQ
Int
10.0
OB35_DATE_TIME Date_And_Time 12.0
注释
Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) 16#36 (OB 35 has started) Priority of OB Execution 35 (Organization block 35, OB35) Reserved for system Reserved for system Phase offset (msec) Reserved for system Frequency of execution (msec) Date and time OB35 started
块: OB35 "Cyclic Interrupt"
程序段: 1
实验选择
AN DB1.DBX 0.0 JNB sy1 AN DB1.DBX 0.1 JNB sy2 AN DB1.DBX 0.2 JNB sy3 AN DB1.DBX 0.3 JNB sy4 AN DB1.DBX 0.4 JNB sy5 AN DB1.DBX 0.5 JNB sy6 AN DB1.DBX 0.6 JNB sy7 AN DB1.DBX 0.7 JNB sy8 AN DB1.DBX 1.0 JNB sy9 AN DB1.DBX 1.1 JNB sy10 AN DB1.DBX 1.2 JNB sy11
QLMN_HLM:=
PLC计算流量累计不准?本文解释得很清楚!实例讲解程序!

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做流量累积方法

使用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指令。
S7 300 400流量累积 柴明军

流量累计例程使用说明例程功能:完成对实时流量的累计功能程序结构:在循环中断组织块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流量累计的程序【在工业中往往会遇到业主要求做流量累积程序,比如要求检测到每月天然气用量,石油采集量,生产材料的多少,针对这些情况,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。
西门子PLC流量累积

循环时间反映了处理功能块“Totalizer”的扫描时间。在循环中断 OB35 中调用该 FB 时, 同时以 100 ms 的时间间隔处理程序,该间隔与循环程序的处理时间无关。 举例: 对于一个流量计,测量到它的终值为 60.0 米/分钟,其假定值保存在标记双字 MD10 中。
图 02 由于物理量级是“meters per minute”,所以输入参数“INTERVAL”被设置为“T#1M”。在 OB35 中调用“Totalizer”功能块,OB35 的缺省时基是 100 毫秒。输入变量“CYCLE”被设 置为“T#100MS”。
测试环境 PC 平台 PC 操作系统 STEP 7 S7 PLCSIM 选件包
版本 Pentium(R) CPU 2.40 GHz Windows XP SP2 V5.3 SP3 V5.3 SP1
表 03 创建本操作指导使用了软件 STEP 7 V5.3。
条目号:23061633 日期:2007-02-14
米/秒
T#s
立方米/分钟
T#1M
公里/小时
T#1h
表 02 程序描述: 如果变量“COM_RST”的信号状态是 True,则变量“ACCUM”和“TOTAL”被复位为零,不进 行任何计算。如果信号状态为 False,则首先将两个输入变量“INTERVAL”和“CYCLE”的数 据类型转换为 REAL,然后这两个变量的值被传送到临时变量“tINTERVAL”和“tCYCLE” 中。在一个周期中,将变量“VALUE”的输入值乘以临时变量“tCYCLE”的值,然后再除以 临时变量“tINTERVAL”的值。将结果保存在缓冲区“ACCUM”中。这样,在一个特定的周 期内,将缓冲区“ACCUM”中的中间结果累加上该数值,同时在同一周期内将累加结果传 送到变量“TOTAL”中。
基于西门子PLC300的流量累计程序实例

基于西门子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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于西门子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后,在此继续执行程序扫描。