徐春鵬,王 海(通訊作者),邸寒旭
(沈陽理工大學 遼寧 沈陽 110159)
S7-1200在以太網及PROFINET方面和編程的靈活性等方面的優點,正在取代S7-200。學校的教材及實驗內容及時調整,引進了S7-1200。在用S7-1200的程序替代原S7-200中的程序,看似簡單的移植工作,出現問題,程序出現了異常,這無法解釋。程序涉及的指令并不多,主要是定時器,問題應該出現在對定時器特性的認識。為使問題簡化,將程序提煉如圖1所示,自復位定時器產生脈沖程序[1]。

圖1 S7-200中的原程序
M10.0為啟動信號,閉合后定時器開始計時,當計時到設定值5s后執行記數器加1,在下一個掃描周期T37線圈斷電,重新計時。即5s發1個脈沖給計數器。移植后的程序如圖2所示,定時器時間到后,觀察較長時間并不計數。
S7 PLC的定時器在什么時刻更新是問題所在。首先,明確S7-200的更新過程,S7-200中10 ms分辨率的定時器按以下規律刷新:定時器位和當前值在每個程序掃描周期的開始刷新。定時器位和當前值在整個掃描周期過程中為常數。在每個掃描周期的開始會將一個掃描累計的時間間隔加到定時器的當前值上[2]。
根據實際情況分析,對定時器的更新沒有發生在由程序1到程序2的中間階段。不妨將兩句程序互換位置,如圖2所示,長時間反復觀察,計數器計數正常無誤。為說明清楚問題,如圖3所示,將PLC的掃描過程分為如下四個階段:A是在程序段1之前和程序段2之后的時間片,這里包括了可能的I/O刷新和通訊處理等;B階段為處理程序段1的時間;C為程序段1和程序段2之間的時間片,由于之間沒有內容,這里暫時無;D處理程序段2的時間。一個掃描周期由A、B、C、D四段組成。
此例說明定時器的狀態是在AUB階段,而不是CUD階段(當前程序行處理時)更新的。否則先復位定時器,不能計數。
為觀測清楚更新是否相對于掃描階段是隨機的,加大兩句程序的執行間隔,即在C階段插入盡量大的運算時間[3],定義為FC,如果定時器是隨機更新,一定會有正在執行兩句程序之間(C階段)觸發定時器的時候,即計數值會缺少。

圖2 S7-1200中的實驗程序

圖3 程序執行的階段
將上述的FC塊,插入在兩句程序之間,目的是增加圖中C階段的時間片比例。經過長時間觀察,發現計數器的值有明顯的丟失,說明有在C階段更新的可能。
問題很清楚,定時器是獨立于用戶程序,獨自更新的。T.Q被隨時改寫。重復出現T.Q則引起程序的不確定性。為了安全必須使用統一規范,提出處理方法T.Q接到輸出上,如圖4所示。獨立于用戶程序的異步功能,以線圈的輸出為標志,將其關聯到掃描周期,再使用其觸點觸發計數器。

圖4 改進的處理
S7-1200定時器的使用存在陷阱,當兩次訪問觸點時,會出現不確定性,必須接輸出,才可達到與S7-200相同的效果和可靠執行。在此例中,PLCSIM與連接實際PLC的結果不符合,由其忽略了自診斷通信等時間(階段A)造成的,提醒讀者注意。相信該工作為工程技術人員在實際工作中遇到的奇怪異常情況提供解釋,避免錯誤的發生。