1、品频道 | 行业 2010-8-19-工控擂台-气体流量计实现流量累积功能? 假设现场气体流量计仪表位号为 FIT-2101 ,铭牌标注量程 35 - 1000 m3/h,信号输出类型为4-20mA,不管选用何种类型PLC和PLC编程软件,把该现场仪表流量累积通过PLC编程软件实现出来(有DA输入及周期循环累积就可以了)。 应擂者需说明采用何种类型PLC,需要粘贴实现流量累计的PLC程序,同时最好有相应的程序说明。 本周末结贴,三个最优回帖分别获得25MP、15MP、10MP! MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网
2、络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。 MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。 回复 修改 举报 收藏 评分 永不止步 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 08:55:09 1楼 打酱油的路过。。。。。。。。。 修改 设为最佳回复 引用 回复 举报 评分 小楼 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 09:08:53 2楼 气体流量计采用模拟量进
3、行累加,进行气体累计的方式不是很可取。 当然这个可以作为一个算法。 修改 设为最佳回复 引用 回复 举报 评分 饶歌 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 09:15:43 3楼 天然气的计算比较复杂,由于气温、湿度、压力、天然气的纯度都影响积算,今天的擂台题设定在理想标准状态下。 修改 设为最佳回复 引用 回复 举报 评分 工控十年 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 11:25:50 4楼 采用丰炜VH-20AR PLC,主机自带4AD/2DA,通过读写特殊寄存器操作。程序中写的是每秒读一
4、次,60秒求一次平均流量(最简单的总和平均,没做细处理),最后做累加。M0为流量清空按钮。写的比较简单,只为抛砖引玉,也没调试,有错误是肯定的,欢迎指点。 修改 设为最佳回复 引用 回复 举报 评分 云锋 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 11:56:18 5楼 采用施耐德Premium系列PLC,配置4AI模块。程序采集每秒管网实时流量,进行小时累积,处理后得到每小时流量。 程序图1 接上图 修改 设为最佳回复 引用 回复 举报 评分 abysmal 个人主页 给TA发消息 加TA为好友 发表于:2010-0
5、8-19 12:39:00 6楼 云峰用施耐德PLC解题,支持一下。 修改 设为最佳回复 引用 回复 举报 评分 jiaoanpeng 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 15:48:56 7楼 这样的程序,只要功能能够实现,路径并不重要,不过对于气体流量计,比较繁琐,要看工艺要求是标准流量还是工况流量。 至于PLC类型大多数都能实现,只要有AI输入模块,再者需要编程计数模块程序和清零程序,及FIT-2101 的预处理程序包括AD转换及判断程序。还要有工况与标准的转换程序。具体的编程保密呵呵。。这应该属于知识产权,不对外泄露。 修改
6、设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:04:23 8楼 我本来只是打下酱油,准备路过的。但看到楼上几位比较积极,也看到有人喜欢保密这个程序,所以我对这个程序来具体说明并公开一下。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:06:52 9楼 我下面的程序属于笔者原创,所有文字及程序均由笔者自己书写,并非摘抄! 该程序是以西门子S7-200系列PLC为例来编写的。 该程序经过在S7-224上面测
7、试成功,基本上无误差!(误差在小数点后几位)。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:08:17 10楼 下面先对程序的方案、思维方式、编程方法、注意事项等方面进行说明,然后再贴上PLC程序。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:09:10 11楼 对于流量累计而言,看起来好像是个很简单的程序,但实质上还是有很多需要注意的地方。写累加程序不难,但要做到误差最小,就不是那么容易的事情了
8、简述如下。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:15:19 12楼 1. 首先是采样时间采用的计时方式的问题。可能有些人会采用定时器(包括1ms/10ms/100ms/1s定时器及秒脉冲等)来作为采样周期--------这样会增大误差。 可以用计时器指令来来作为采样间隔时间,每次计时器到了设定值就采样一次。计时器的精度不可能高于它的时基,因此每次计时器超时和再次开始计时的时候,都要产生一个时基的正或负的误差。例如,10ms为一个时基的计时器预定计10次,其时间计算将是100ms正或
9、负10ms。假设你采用100ms定时器来作为采样周期,那么在程序运行过程中,实际上的有效采样周期不是100ms,在这个基础上还包括了PLC的扫描周期的一部分(扫描周期过程包含如下内容。读取输入--------S7-200将实际输入的状态复制到过程映像输入寄存器;执行程序中的控制逻辑--------S7-200执行程序指令,并在不同的存储区存储数值;处理通讯请求--------S7-200执行通讯所需的所有任务;执行CPU自检诊断--------S7-200可确保固件、程序存储器和所有扩展模块正确工作;写入输出--------将存储在过程映像输出寄存器中的数值写入到实际输出。)。该方式的采样间隔
10、时间是固定的,但实际采样时间不是定时器的时间,而是比定时器的时间大一些,因此累计值比实际值就会小一些。越累计越多,误差就越大。 诸如贝加莱、Sigmatek这样的使用C语言进行编程的PLC,它们的PLC中并无定时器T这个寄存器区,而是通过读取系统时钟来完成定时的。不过结果相同,一样的要产生误差。 当然,也可以采用一种技巧来减少因计时器精度带来的误差。我们采用长的时间计时来作。例如,10ms为一个时基的计时器预定计30000次,其时间计算将是300s正或负10ms。在这其中,我们可以预定一个采样间隔时间为10个时基(100ms)以上。每次程序扫描,处理器判断如果自从上次累积运算起,时间间隔
11、超过预定时间(例如:100ms),就将这段时间乘以当前的瞬时流量值作为累加量。该方法的计算精度虽然高一些,但采样间隔时间却不是固定的了,而累计值比实际值仍然会小一些。越累计越多,误差就越大。 因此,该程序笔者采用了定时中断的计时方式来进行流量的累计。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:17:42 13楼 2. 其次,是采样间隔时间的数值问题。采样间隔时间越短,计算误差就越小,越逼近于实际值--------但永远都达不到实际值,只能说是越接近而已。可是,采样间隔时间越短就会增加PLC
12、的运算次数。当这个采样时间太小(例如1ms),就会出现问题。 对于采用定时器来累计的情况,从上面第1条的叙述中可以看出,由于扫描周期的影响,累计值那就不是一点点的误差了,而是错误了! 对于采用定时中断来累计的情况,PLC占用了过多的资源去运行中断程序,可能导致主程序或其它子程序控制出现滞缓或者非预期问题的情况,还可能造成看门狗定时器溢出而造成问题。这个问题比较复杂些,这里就不讨论了。 对于这个问题,没有更好的解决方案,只求达到一个合理值就可以了,不用去追求非常非常高的精度!在实际工程应用中,典型的采样周期为100ms。该程序采用的采样周期就是100ms。 修改 设为最佳回复 引用
13、 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:20:49 14楼 3. 第三,是累计计算时的误差问题。 这里,先要说一下浮点数运算的问题。S7-200系列PLC仅支持单精度浮点数而不支持双精度浮点数,因此仅支持10进制的7位有效数字(如果要问为什么,说起来就比较麻烦一些,我在这里就不赘述了。如果需要,我可以单独发帖来说明这个问题)。 在累计流量比较大的情况下,小数点后面的尾数就少了--------两个要相加的数差别太大,就会造成误差!(这个问题解释起来也稍微有点麻烦。如果需要,我可以单独发帖来说明这个问题)累计的
14、精度就越来越低了,误差也就越来越大了。为了避免出现这个问题,我们可以想办法使整个运算过程中小数和整数分开计算,且保证小数的有效数字最大可以达到7位。该程序就采用了这种计算方法。 在2个数相加的时候,如果两者相差特别大,那么会出现误差。例如10的8次方加1仍然等于10的8次方。实际上,当有效数字达到7位以上时,多余的就会被丢弃--------例如3,632,523,000加4987,那么结果应当是3,632,527,987,但由于只能保留7位有效数字,因此结果就是3,632,527,000,数值978被丢失。为了避免出现这个问题,在整数部分计算时,如果数值超过9999999就把该值减去999
15、9999,然后把另外一个计算9999999的计数单位加1。在本程序中,如果累计值超过1000000,就把累计值减去1000000,然后把百万计数器加1。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:24:42 15楼 下面我就贴程序了。首先贴主程序。 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:25:53 16楼 下面是主程序。。。。。。 修改 设为最佳回复 引用 回复 举报 评分
16、 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:27:19 17楼 下面继续贴中断程序INT_0。。。。。。 注意:这里的9.234569是在采样时间(SMB35的毫秒值)内的瞬时流量,这里的单位就是立方米/百毫秒(相应的,累计流量的单位就是立方米)。因为每种工程量的转换函数不一样,这里就没有按照帖子主题那样的要求来计算工程量了,还请见谅!!! 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:29:32 18楼 程序中VD500就
17、是得到的累计结果! 实测2个小时,在超过100万之后,数据仍然不存在误差!!!测试成功! 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:31:37 19楼 编写并调试了程序,也打了那么多的字,花了几个小时,目的是为了和大家分享一下。程序中如有欠妥之处,欢迎指正! 修改 设为最佳回复 引用 回复 举报 评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:33:22 20楼 下面是测试程序监控的画面: 修改 设为最佳回复 引用 回复 举报
18、评分 老菜鸟 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 19:46:09 21楼 因为我看到网上很多人都对这个流量累计有很多疑问。包括定时器精度、浮点数精度、数据过大的问题,产生了误差。所以,就写了这个程序。 修改 设为最佳回复 引用 回复 举报 评分 怪话二王 个人主页 给TA发消息 加TA为好友 发表于:2010-08-19 20:12:51 22楼 。 呵呵 老菜考虑问题很细,俺得赞一个 PLC,俺从来也木有摸过,呵呵,,, 俺那天去乡下喝汤,摸咧摸母猪脸蛋,公猪瞪着眼就跑过来拱俺咧,,英雄救美,让俺老流氓,深刻地感动
19、咧一场~~ 100ms的取样周期,足够咧,一是由于流量,不是个瞬变参数,二是由于流量计的输出信号,刷新速度大约4次/秒 气体流量累积,是要将实况体积流量,累积到标况体积流量 俄看在这个上面,尤其在低流量测量时,温压补偿采用的测量手段和补偿算法失当,才是误差的主要来源 有时候,遇到一些,学术地位还挺了得的人,听他宣贯听他海摆,由不得你暗暗想骂:瓜P~~~~~~~· 生灵万岁,,,每当想起那头,脸蛋光光浅红的母猪,俺就会油然升起,对英雄的敬仰之情.......................... 修改 设为最佳回复 引用 回复 举报 评分 winter1977 个人
20、主页 给TA发消息 加TA为好友 发表于:2010-08-20 01:00:49 23楼 感谢老菜鸟,我做过水的累积,用的的是积分命令,将瞬时的流量进行累积,得到每8小时的累积量。 当时用的300,STEP7 5.3 。通过PLC的系统时间(当时是小时时间的变化)进行累积。误差不大。 唯一说明的是:如果累积值过大,就会造成瞬时值不再累积。所以选择一个合适的累积时间可以有效消除误差。 修改 设为最佳回复 引用 回复 举报 评分 winter1977 个人主页 给TA发消息 加TA为好友 发表于:2010-08-20 01:01:52 24楼 不是累积时间,手误是积分时间
21、 修改 设为最佳回复 引用 回复 举报 评分 chenjian6911 个人主页 给TA发消息 加TA为好友 发表于:2010-08-20 11:38:33 25楼 学习了,但是我觉得气体流量累积最重要的问题不是如何累积,密度补偿的才是关键。就是说最后输出的数据是质量流量,累积才有意义。我曾经使用S7300的PLC做了一个程序,使用子程序进行压力补偿。测量饱和蒸汽的质量流量。(蒸汽体积流量使用涡街流量计。)使用中断程序进行累积。准确度也达到很高的水平。这样的例子太多了。改天有机会去工地抓图。再贴上来。 修改 设为最佳回复 引用 回复 举报 评分 q545840352
22、 个人主页 给TA发消息 加TA为好友 发表于:2010-08-20 19:39:25 26楼 感谢老菜鸟,学习了满多 修改 设为最佳回复 引用 回复 举报 评分 饶歌 个人主页 给TA发消息 加TA为好友 发表于:2010-08-22 20:25:48 27楼 25MP获得者:老菜鸟 deshengwu 15MP获得者:云锋 tclwzy 10MP获得者:工控十年 工控十年 修改 设为最佳回复 引用 回复 举报 评分 小白001 个人主页 给TA发消息 加TA为好友 发表于:2011-06-13 13:23:07 28楼 一直都那
23、么经典啊。。。 修改 设为最佳回复 引用 回复 举报 评分 勇者 个人主页 给TA发消息 加TA为好友 发表于:2011-06-13 16:43:50 29楼 谢谢老菜鸟,学习了。 修改 设为最佳回复 引用 回复 举报 评分 西部风暴 个人主页 给TA发消息 加TA为好友 发表于:2011-11-28 15:26:25 30楼 谢谢老菜鸟!如超过百万计量后,怎么实施呢 修改 设为最佳回复 引用 回复 举报 评分 西部风暴 个人主页 给TA发消息 加TA为好友 发表于:2011-11-29 15:28:24 31楼 回复内容:
24、对:老菜鸟关于下面是主程序。。。。。。内容的回复: 老菜鸟老师有几个问题向你请教一下,主程序网络2里累计流量的整数部分大于1000000时,把百万计数器VD300加1; 当时累积流量确实超过1000000时,累积流量可以将VD300的值传给上位再与VD250计算,这样可以吗?网络4里的VD800是采样次数,也就是定时中断时间吗,如定时中断时间为100MS,采样频率是10HZ,可以这样理解?在实际中测试的VD800可以不用吧;子程序里的VD260地址共用次数很多,计算时会出错不。非常感谢老菜鸟给予指导,我QQ:38164390 修改 设为最佳回复 引用 回复 举报 评分 西部风暴
25、 个人主页 给TA发消息 加TA为好友 发表于:2011-11-29 15:30:35 32楼 回复内容: 对:老菜鸟关于下面是主程序。。。。。。内容的回复: 老菜鸟老师有几个问题向你请教一下,主程序网络2里累计流量的整数部分大于1000000时,把百万计数器VD300加1; 当时累积流量确实超过1000000时,累积流量可以将VD300的值传给上位再与VD250计算,这样可以吗?网络4里的VD800是采样次数,也就是定时中断时间吗,如定时中断时间为100MS,采样频率是10HZ,可以这样理解?在实际中测试的VD800可以不用吧;子程序里的VD260地址共用次数很多,计算时会出错不。非常感谢老菜鸟给予指导,我QQ:38164390 修改 设为最佳回复 引用 回复 举报 评分 diaonima 个人主页 给TA发消息 加TA为好友 发表于:2012-01-28 21:13:28 33楼 我顶!又学习到了好东东! 修改 设为最佳回复 引用 回复 举报 评分 张十 个人主页 给TA发消息 加TA为好友 发表于:2012-01-28 21:27:54 34楼 引用小楼 的回复内容: 气体流量计采用模拟量进行累加,进行气体累计的方式不是很可取。 当然这个可以作为一个算法。而且PLC里定时器的误差很大






