在使用s7-1200PLC編寫程序的時候,如果項目上需要用到流量累積功能,但是本款PLC並沒有自帶流量累積功能塊。這時,就需要我們組態工程師自己編寫一個具有流量累積功能程序,或者將該程序封裝為FB塊或者FC塊。本文以封裝FB塊為例。

第一步:在程序塊目錄下單擊添加新塊,彈出添加新塊對話框,選中FB函數塊,在名稱欄填上需要命名的名字,如:Totalizer,選擇編程需要用的編程語言,本文以SCL語言講解,FB塊的編號可以通過手動或自動生成,然後單擊確認,如下圖所示

第二步:打開新建功能塊,並建立臨時變數,如下圖所示

第三步:程序編寫,如下圖所示:

程序編寫完成後,進行編譯,編譯沒有錯誤時,在FC(FC2,FLOWACCUM)中調用該FB塊,最後在OB30中斷塊中調用該FB塊。

第四步:在FC中調用名字為「Totalizer」的FB塊,並對輸入輸出參數賦值,如下圖所示

再在OB30中調用功能塊,OB30中斷塊是循環中斷塊,循環時間為100ms,如下圖所示

雙擊循環中斷OB30中斷塊,在中斷塊中調用FC2(FLOWACCUM)功能塊,如下圖所示

程序解讀:

變數定義:

變數名:Reset,數據類型:Bool,作用:累積清零

變數名:Accum,數據類型:Real,作用:存儲累積值

變數名:Total,數據類型:Real,作用:存放累計值

變數名:Intervall,數據類型:TIME,作用:流量單位中的時間,如m3/h,則:變數為1h=3600s,變數單位:秒

變數名:Intervall_DInt,數據類型:Dint,作用:存儲Intervall轉換為Dint數據類型後的值

變數名:Intervall_Real,數據類型:Real,作用:存儲Intervall_DInt轉換為Real數據類型後的值

變數名:Cycle,數據類型:TIME,作用:存儲程序循環時間,單位:秒

變數名:Cycle_DInt,數據類型:Dint,作用:存儲Cycle轉換為Dint數據類型後的值

變數名:Cycle_Real,數據類型:Real,作用:存儲Cycle_DInt轉換為Real數據類型後的值

程序代碼:

IF #Reset = true THEN //條件為真時

#Accum := 0.000000e000; //累積清零

#Total := 0.000000e000; //累積清零

ELSE

#Intervall_DInt := TIME_TO_DINT(#Intervall);//將時間型變數Intervall轉換為雙整型數據,並存在變數中

#Intervall_Real := DINT_TO_REAL(#Intervall_DInt);//將雙整型數據轉換為實型數據,並存在變數中

#Cycle_DInt := TIME_TO_DINT(#Cycle);//將時間型變數Cycle轉換為雙整型數據,並存在變數中,本例為0.1s

#Cycle_Real := DINT_TO_REAL(#Cycle_DInt);//將雙整型數據轉換為實型數據,並存在變數中

#Accum := ((#Value * #Cycle_Real) / #Intervall_Real) + #Accum;//累積計算

#Total := #Accum; //Kopiere Ergebnis nach #Total / Copy result to #Total.//累計值傳遞

END_IF;


推薦閱讀:
相關文章