S7 PLC的控制器:自定義擴展
SIMATIC S7的模塊化控制器
可隨時通過可插拔I/O模塊、功能和通訊模塊靈活地進行擴展,為用戶的需求提供量身定做的解決方案。根據用戶的應用范圍可以從性能,范圍和接口選擇等方向進行選擇。我公司的模塊化PLC也表現為高可用性或故障安全的安全系統。
上海翰粵是西門子工控及自動化產品*分銷商咨詢!
:鄭轅鴻(銷售工程師)
:
(): 傳真():
:zx2013888 :www.hanyue.cc
:
功能塊使用問題
編寫控制程序作為自控工程師來說是家常便飯,在調試過程中遇到問題在所難免,這回聊聊在中常遇到的這樣一類問題:
在OB1中多次調用同一個FC,為什么只有*個執行輸出正常?
在以前項目中使用正常的FC,拿到另一個項目使用,實現的功能*相同,但是執行結果就是不正確?
這類問題的共同點就是在特定的條件下執行正常,例如使用M地址做實參正常,用DB地址做實參就錯誤。
通過下面這段程序我們模擬重現這類問題。
FC5程序實現的功能是:當Bool_Input為false時用Int_Input整數值更新輸出int_Output,當Bool_Input為true時,停止更新輸出值,保持zui后的輸出值。
FUNCTION FC 5 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
Bool_input : BOOL ;
int_Input : INT ;
END_VAR
VAR_OUTPUT
int_Output : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
L P##int_Output;
LAR1 ; //int_Output地址
A #Bool_input;
JC _000;
L #int_Input;
T #int_Output;
_000: BEU ;
END_FUNCTION
在OB1中調用很正常,而且使用不同M地址多次調用也沒有問題,看上去似乎很*呵呵,如果將實參地址都更換為不同的DB地址試試呢,將*個FC5 修改為int_Output:=DB1.DBW0,第二個FC5修改為int_Output:=DB1.DBW2,當M10.0=true,M10.1=false時,你會發現DB1.DBW0和DB1.DBW2里的值一樣,會跟著MW4變化!
CALL FC 5
Bool_input:=M10.0
int_Input :=MW0
int_Output:=MW2 //DB1.DBW0
CALL FC 5
Bool_input:=M10.1
int_Input :=MW4
int_Output:=MW6 //DB1.DBW2
問題出在哪呢?從程序來看,當Bool_Input=false時,int_Input賦值給int_Output,而Bool_input=true時,程序直接就從FC5返回了,沒有對int_Output做任何操作。通過查看in_Output地址可以發現,在使用M區地址時,int_Output使用的地址就是實參地址M區地址,而使用DB區地址時,int_Output使用的地址是V區地址,也就是OB1的L區地址,由于系統對于L區地址是動態分配的,即調用FC時臨時分配L區,從FC返回時釋放L區,這就導致同一個L區可能被多個FC讀寫,也就是說L區中變量的內容是不確定的。而由于系統不會自動對M區地址進行操作,所以使用M區地址時*正常。
解決問題的方法就是在使用臨時變量時,先賦值再使用。在這段程序中只要將int_Output修改為輸入輸出參數就行了。
VAR_IN_OUT
int_Output :INT ;
END_VAR
調用FC時系統將DB1.DBW0中的值先保存在V區(給臨時變量賦值),從FC中返回時將V區的值再保存到DB1.DBW0中,這樣即使多次調用FC也不會出錯。
FAQ常問問題: 為什么函數會偶爾在OUT參數中產生錯誤的返回值?當輸入輸出參數時需要注意些什么 ?
http://support.automation.siemens.com/CN/view/zh/189227
?
流量累計問題
zui近連續遇到客戶咨詢流量累計的問題,其實這個問題幾年前西門子就提供相關的解決方法了。詳細信息可以參考如下連接:
http://support.automation.siemens.com/CN/view/zh/23061633
只是由此引出的幾個問題,期望與用戶分享。
問題1:自行編寫流量累計程序。
自行編寫流量累計程序的原理,其實就是積分的zui原始算法概念,把單位小間隔時間內的瞬時流量乘以單位間隔時間,得到單位小間隔時間內的流量,再把這些小流量累加起來,就的到了累計流量。
在流量累計編程中經常會遇到實數加法問題,實數加法運算的注意事項也應當引起編程人員的重視,請看下例程序(假設其在OB35中被調用,目的為每隔一定時間間隔就累計一次流量)
L MD0 //累計流量存儲值
L MD4 //流量瞬時值
+R
T MD 0
以上的程序是否存在問題?很多用戶會認為沒有問題,但實際情況是此程序在運行一段時間后就將出現錯誤。此程序在運行之初是正常的,因為累計流量初始值及流量瞬時值都為一個很小的浮點數,兩數相加后,結果正確。但是當一段時間后,累計流量的數值逐漸增大,當它與瞬時流量的數值相差很遠的時候,兩者執行加法操作后,瞬時流量的數值將被忽略掉(如9999990.0與0.2做加法操作)。其實具備計算機常識的人都應當清楚這一點,這是由于浮點數的存儲機制造成的,是所有計算機方面編程都需要考慮的問題。這個問題可以通過使用二次累加或多次累加的方法來解決。
特別提示:避免數量級相差太多的浮點數之間進行運算。
很多用戶反映“加法指令不好用了”,很有可能就是數量級相差很多的實數進行了加法運算。
問題2:累計流量誤差問題
對于積分算法,取小的矩形對流量進行累計,肯定是矩形劃分越細,誤差越小,*是不可能的。
問題3:流量計與PLC構成的系統的誤差
流量計有多種多樣,下面舉些例子:
3.1流量計本身沒有累計流量功能,但可以把瞬時流量以模擬量的方式(例如4-20mA)輸出。
此時累計流量的zui大誤差可以估算為:
流量計本身誤差 * 流量計D/A誤差 * 模擬量模塊A/D誤差 * PLC流量累計算法誤差
假設上面所有誤差都是1%,則zui后的誤差約為:4.06%
1.01*1.01*1.01*1.01=1.0406
提示:對于廉價流量計,本身的瞬時流量誤差可能就是3%,所以這樣的系統累計流量的誤差可能還要大些。
3.2流量計本身沒有累計流量功能,但可以把瞬時流量以數字量的方式輸出。
有些流量計提供數字量接口,可以連接PLC的數字量輸入模板,流量計每流過一定流量后(例如0.1噸),此輸入點就導通一次,PLC就把累計流量累加0.1噸即可。
提示:此類系統避免了A/D,D/A轉化的誤差,以及PLC累計算法誤差。但是會出現一定時間內累計流量不變化的情況,實時性不好(每0.1噸累積的時間)。
3.3流量計本身有累計流量功能,同時可以把瞬時流量以模擬量的方式(例如4-20mA)輸出,但無法將累計流量數值送出。
提示:流量計本身累積流量的數值,zui后很有可能與PLC的累計流量數值相差很大,原因可能是多方面造成的,除去系統累計流量誤差(參見3.1)的因素,如果PLC系統檢修時,流量計還計量,則PLC無法累積這部分流量。
3.4流量計本身有累計流量功能,同時可以通過通信的方式,把瞬時流量及累計流量數值送給PLC。
提示:這種情況,當然系統的成本要提高。
?
西門子代理商:/(鄭轅鴻)