plc做流量累積計算的程序
二、plc計算流量累積
流量計是4-20ma信號輸出,瞬時流量可以用S7200來做,但是累積流量的話,怎麽(me) 編程才能使誤差最小,累積流量超範圍溢出問題,怎麽(me) 解決(jue) ?
對這個(ge) 流量進行固定頻率的采集,假如采集頻率為(wei) 10hz,也就是每秒鍾采集10次,將每次采集的數據進行累加,再將累計的數除以10就是每秒流量,假如流量計工作在最大流量上,我們(men) 假定20ma對應的數值時65535(一般plc模擬量都沒這麽(me) 高的精度,至於(yu) 是多少要根據模塊來),那麽(me) 用雙字運算就能滿足要求了,先將模擬量輸入數值轉換成雙字,再累加,到10次以後將累加值除以10再傳(chuan) 送給另一個(ge) 寄存器(這個(ge) 寄存器中才是真正的累計量)。
累計範圍超出也好辦,隻要將累計量單位換算一下就永遠也不可能超範圍了,比如開始累計的是升,每次達到1000升時,將一個(ge) 立方為(wei) 單位的累計值上加1,以升為(wei) 單位的寄存器清零,單立方值到了1000後,將仟立方寄存器加1,再將立方累計值清零。這樣處理,再多的流量也可以累計。
要減小累計誤差就是要減短采集時間,對於(yu) 流量計采樣時間0.1秒應該是夠了。還有就是采集程序要用定時中斷,比較準確一點。
三、plc在流量顯示和累積計量上的應用
流量計輸出的信號一般是脈衝(chong) 信號或4-20mA電流信號,這兩(liang) 種信號輸出的都是瞬時流量(也有用繼電器輸出累積量信號,原理一樣,不再贅述),我們(men) 的目的是在PLC中計算和顯示瞬時流量值和計算累積量值,當輸入信號是脈衝(chong) 信號是,在計算瞬時流量的時候,必須按照一個(ge) 嚴(yan) 格的時間間隔計算才能保證瞬時流量的準確性。
因此,計算瞬時流量的時候必須用定時中斷來進行,而且,在PLC係統中隻能運行這一個(ge) 中斷程序,不允許再產(chan) 生其它中斷(即使是低優(you) 先級的中斷也不允許運行),以防止幹擾定時中斷的時間間隔的準確性,計算瞬時流量就是將這個(ge) 時間段的累計脈衝(chong) 個(ge) 數換算成累計流量,再除以時間就是瞬時流量,對於(yu) 4-20mA輸入隻需按照其對應的量程進行換算就可以直接得到瞬時流量,而累積流量就是將每個(ge) 時間段內(nei) 的累積流量累加起來就是累積流量,在實際使用PLC編程的過程中必須注意以下幾個(ge) 問題:
1. 輸入脈衝(chong) 頻率範圍是否超出PLC接收的範圍;
2. PLC高速計數器在達到最大計數值時如何保證計算正確;
3. 如何保證定時中斷不受幹擾;
4. 如何避免計算累積量的誤差;
5. 累積量的最大累積位數;
6. 如何複位累積量;
對於(yu) 高速計數器是否達到最大計數值時需要判斷,S7-200CPU的高速計數器是可以周而複始的進行累計的,最高位為(wei) 符號位,最小值為(wei) 7FFFFFFF,由於(yu) 計數器是一直累加的,不可能出現本次讀取的的計數值小於(yu) 上次的計數值。
因此判斷計數器當前值是否小於(yu) 前一次的計數值,就可以判斷計數是否達到最大值的拐點(7FFFFFFF),如果達到,則執行特殊的計算以便消除計算錯誤,如下列程序所示,當當前計數值大於(yu) 等於(yu) 上次計數值時,兩(liang) 個(ge) 計數值做差,就得到程序兩(liang) 次掃描時間間隔內(nei) 的計數差值,同時將當前計數值賦值到上次計數值上;當當前計數值小於(yu) 上次計數值時,計算上次計數值與(yu) 7FFFFFFF之間的差值(用減法),以及當前計數值和7FFFFFFF之間的差值(用加法),然後將兩(liang) 個(ge) 結果相加就是程序兩(liang) 次掃描時間間隔內(nei) 的計數差值,從(cong) 而實現對對累計計數值達到拐點時的正確計算。
注:此程序應放在定時中斷子程序中執行。
實際上,在現場應用中定時中斷子程序是采用250ms中斷一次執行的,使用SMB34進行控製的,需要注意的是,係統中必須隻保證這個(ge) 中斷是唯一存在的,不會(hui) 受到其他中斷的影響,否則可能會(hui) 由於(yu) 其他中斷的影響使周期性中斷不準時,從(cong) 而影響精度。
通過以上計算就得到了250ms內(nei) 流量計發過來的脈衝(chong) 個(ge) 數,這個(ge) 數值乘以脈衝(chong) 當量就是250ms內(nei) 的流量值,再除以時間就是瞬時流量,另外,在250ms內(nei) 再執行累加程序就可以計算累積流量了,在計算累積流量過程中需要避免累積過程的的計算誤差,流量累積量是一直累積的一個(ge) 數值,一般會(hui) 累積到8位數,而PLC內(nei) 部的浮點數的有效位數是6位,當累積量數值很大的時候就會(hui) 造成一個(ge) 大數和一個(ge) 小數相加,勢必導致小數的有效位數丟(diu) 失,造成很大的累積誤差。
因此,要避免大數和小數相加的情況出現,解決(jue) 方法是采用多個(ge) 流量累積器,隻允許同數量級的數值相加,從(cong) 而避免數值有效位數損失,實際編程中采用了5個(ge) 累積器,根據常用流量情況下,在周期中斷時間間隔(250ms)內(nei) 流過的流量乘以15作為(wei) 第一個(ge) 累積器的上限,當達到這個(ge) 累積器的上限值後,將這個(ge) 累積器的值累加到第2個(ge) 累積器中,並把第一個(ge) 累積器清零,對於(yu) 第三個(ge) 累積器也同樣處理,第4個(ge) 累積器用於(yu) 保存累積量小數部分數值,第5個(ge) 累積器用於(yu) 保存累積量整數部分數值,這樣在顯示總累積量時隻需顯示整數部分和小樹部分就可以了,整個(ge) 過程充分避免了累積過程中大數與(yu) 小數相加的情況出現。
在實際工程中,需根據流量的大小、周期中斷的時間間隔來確定所用累積器的個(ge) 數,而累積器的整數部分用雙整數來表示,雙整數的範圍是-2,147,483,648到+2,147,483,647,因此,可以使累積器的整數位數達到9位,這樣,在顯示累積量時就可以最多顯示9位整數的累積量和6位的小數累積量。總計15位,從(cong) 而省略累積器倍乘係數,使讀數更簡便。
對累積器需要在一定條件下複位,累積到最大數值或手動複位,在中斷程序中判斷累積量是否達到超過最大位數,當超過最大數值時,將各個(ge) 累積器清零,另外清零的觸發信號也可以是手動觸發。
如果是流量計本身也有累計量的話,二次輸出的瞬時量,在PLC中再做中斷,也會(hui) 有一定的誤差的。最好用通訊或脈衝(chong) 。
PLC做累加總歸會(hui) 有誤差,最好的方法是用通信,可以確保累積流量的準確。通用的HART-Profibus通信網關(guan) 比較複雜,還需要定義(yi) 解析HART消息。
在對準確度有較高要求的場合建議用累積流量專(zhuan) 用網關(guan) ,專(zhuan) 用帶來簡潔,經濟、簡單、可靠,不需要定義(yi) HART消息,不需要PLC是Profibus主站,即插即用免配置。
四、西門子plc中如何解決(jue) 流量累積問題
現在上位機係統中很多要求具備流量計的流量累計功能,由此引出的幾個(ge) 問題,期望與(yu) 大家分享。
問題1:自行編寫(xie) 流量累計程序
自行編寫(xie) 流量累計程序的原理,其實就是積分的最原始算法概念,把單位小間隔時間內(nei) 的瞬時流量乘以單位間隔時間,得到單位小間隔時間內(nei) 的流量,再把這些小流量累加起來,就的到了累計流量。
在流量累計編程中經常會(hui) 遇到實數加法問題,實數加法運算的注意事項也應當引起編程人員的重視,請看下例程序(假設其在OB35中被調用,目的為(wei) 每隔一定時間間隔就累計一次流量)
L MD0 //累計流量存儲(chu) 值
L MD4 //流量瞬時值
+R
T MD 0
以上的程序是否存在問題?
很多人會(hui) 認為(wei) 沒有問題,但實際情況是此程序在運行一段時間後就將出現錯誤。此程序在運行之初是正常的,因為(wei) 累計流量初始值及流量瞬時值都為(wei) 一個(ge) 很小的浮點數,兩(liang) 數相加後,結果正確。但是當一段時間後,累計流量的數值逐漸增大,當它與(yu) 瞬時流量的數值相差很遠的時候,兩(liang) 者執行加法操作後,瞬時流量的數值將被忽略掉(如9999990.0與(yu) 0.2做加法操作)。其實具備計算機常識的人都應當清楚這一點,這是由於(yu) 浮點數的存儲(chu) 機製造成的,是所有計算機方麵編程都需要考慮的問題。這個(ge) 問題可以通過使用二次累加或多次累加的方法來解決(jue) 。所以在編程時應避免數量級相差太多的浮點數之間進行運算。很多人反映“加法指令不好用了”,很有可能就是數量級相差很多的實數進行了加法運算。
問題2:累計流量誤差問題
對於(yu) 積分算法,取小的矩形對流量進行累計,肯定是矩形劃分越細,誤差越小,不存在誤差是不可能的。
問題3:流量計與(yu) PLC構成的係統的誤差
流量計有多種多樣,下麵舉(ju) 些例子:
1、流量計本身沒有累計流量功能,但可以把瞬時流量以模擬量的方式(例如4-20mA)輸出。
此時累計流量的最大誤差可以估算為(wei) :
流量計本身誤差 * 流量計D/A誤差 * 模擬量模塊A/D誤差 * PLC流量累計算法誤差
假設上麵所有誤差都是1%,則最後的誤差約為(wei) :4.06%
1.01*1.01*1.01*1.01=1.0406
對於(yu) 某些流量計,本身的瞬時流量誤差可能就是3%,所以這樣的係統累計流量的誤差可能還要大些。
2、流量計本身沒有累計流量功能,但可以把瞬時流量以數字量的方式輸出。
有些流量計提供數字量接口,可以連接PLC的數字量輸入模板,流量計每流過一定流量後(例如0.1噸),此輸入點就導通一次,PLC就把累計流量累加0.1噸即可。
此類係統避免了A/D,D/A轉化的誤差,以及PLC累計算法誤差。但是會(hui) 出現一定時間內(nei) 累計流量不變化的情況,實時性不好(每0.1噸累積的時間)。
3、流量計本身有累計流量功能,同時可以把瞬時流量以模擬量的方式(例如4-20mA)輸出,但無法將累計流量數值送出。
流量計本身累積流量的數值,最後很有可能與(yu) PLC的累計流量數值相差很大,原因可能是多方麵造成的,除去係統累計流量誤差的因素,如果PLC係統檢修時,流量計還計量,則PLC無法累積這部分流量。
4、流量計本身有累計流量功能,同時可以通過通信的方式,把瞬時流量及累計流量數值送給PLC。這種情況最理想,但係統的成本也最高。
五、關(guan) 於(yu) 流量累積的程序
需要關(guan) 於(yu) 流累累積的程序,隻要流量計測到瞬時計量,需要求出某一時段的累積流量,需要成功的例子程序,LAD/STL都可以。
在ob35中做,做一個(ge) 小信號切除,太小的就不要了。
fp flg1
=flg2
a flg2
jcn m2
l 0.0
t sum
m2:nop 0
a start
jcn m1
l pv//測量信號
l pv_low_sp//小信號值
>=r
jcn m1
l pv//以小時計
l 7200.0//ob35的周期是500ms
/r
l sum//累計信號
+r
t sum
m1:nop 0
上麵的程序啟動瞬間累計數據清零,然後開始累計,start=0停止累計。如果要求的精度高的話,需要減小ob35的周期,同時7200.0也需要相應的變化。如果周期是100ms了,那麽(me) 7200.0需要變成36000.0。
分析:
以前用plc做過流量計算。首先的看你用什麽(me) 計流量,如果是脈衝(chong) 信號,因為(wei) PLC本身有運行周期,如果控製要求較高的場合,通過脈衝(chong) 來計算出瞬時流量,計算出來實際上是不準的,而且控製上滯後比較嚴(yan) 重。TI430單片機之類具有硬件脈衝(chong) 捕捉功能的單片機,在通過脈衝(chong) 計算流量上,有得天獨厚的優(you) 勢。這個(ge) 可以參考一些基本的測速概念。脈衝(chong) 用來計算累積量很準。
如果流量計本身反饋的是4~20ma的速度模擬信號,這個(ge) 就直接采集,然後在OB35裏邊用積分模塊進行流量累計。這個(ge) 速度信號比較及時準確,但中斷模塊調用積分,也會(hui) 有誤差,不如脈衝(chong) 計量準。
現在做皮帶秤時,一般都混合采用,直接采模擬速度,然後用脈衝(chong) 累計流量。