InduSoft 實戰:多台 PLC 通訊斷線導致畫面卡頓?一招「哨兵機制」完美閃避!

  • 問題: InduSoft 連線多台 PLC 時,若單台斷線會因為等候 Timeout,導致整個通訊執行緒卡死、畫面嚴重延遲。
  • 解法: 建立「哨兵機制」,透過單一 TAG 狀態控制整批讀取。
  • 步驟:
    1. 監控單一代表性 TAG(例如 D0)的連線品質(Quality)。
    2. 透過 Background Script 判斷:若 D0->Quality <> 0(正常),將旗標 PLC_Link_Enable 設為 true;否則設為 false
    3. 在 Driver 工作表設定 Read Enable = PLC_Link_Enable。一旦斷線即果斷停止讀取,閃避 Timeout 拖慢全域通訊。

在工控現場,一個 SCADA(例如 InduSoft)往往需要同時連線兩台以上的 PLC。但如果你把所有需要讀取的 TAG 都塞在同一個 Driver 裡,或是讓它們毫無節制地同時讀取,這時候就會遇到一個經典慘劇: 「只要其中一台 PLC 實體斷線或異常,整個系統的通訊就會被嚴重拖慢。」

為什麼會這樣?因為底層通訊 Driver 遇到斷線時,會在那邊「痴痴地…痴痴地等」直到 Timeout(超時)才放棄。如果畫面上有幾百個該台 PLC 的 TAG,它就會一個一個等 Timeout,這會把整個通訊執行緒(Thread)卡死,導致其他明明活得好好的 PLC 數據也跟著 Lag,畫面操作變得極度卡頓。

核心解法:建立「哨兵機制」(心跳偵測)

與其讓 Driver 傻傻地去撞牆(等 Timeout),不如我們先派一個「哨兵」去探路! 我們可以在每一台 PLC 挑選一個代表性的 TAG(或專門寫一個心跳 TAG)來做測試通訊。只要偵測到這個 TAG 的連線品質(Quality)是正常的,我們才放行大批 TAG 的讀取;如果不正常,就果斷切斷該 PLC 的讀取任務,保全大局。

實作步驟詳解

Step 1: 判定通訊品質的指標

在 InduSoft 裡,每個 TAG 都有其屬性。我們可以用 TAG->Quality 來判斷通訊好壞。這邊我用 PLC的 D0 來判斷通訊是否正常,也就是 D0->Quality

💡 小知識: 一般來說,當連線正常時品質會是一個非 0 的值(通常 Good 是 192),所以最簡單的判斷標準就是:只要 TAG->Quality <> 0 就表示正常。

Step 2: 建立中介的「開關 TAG」

我們很難直接在 Driver 的設定介面裡輸入 TAG->Quality <> 0 這種運算式,所以我們需要另外建立一個布林值(Boolean)的 TAG,例如我們叫它 PLC_Link_Enable,來當作最終的開關。

Step 3: 在 Background Script 中實作邏輯

接著,我們把判斷邏輯寫進背景腳本(Background Script),讓系統在背景持續監控這個「哨兵」的狀態:

' 檢查該 PLC 的哨兵 TAG 品質
if D0->Quality <> 0 then
	PLC_Link_Enable = true   ' 品質正常,開啟大門
else
	PLC_Link_Enable = false  ' 品質異常,關門放狗(停止讀取)
end if
'在我下面的截圖裡面 Tag_Q 就是上面的 PLC_Link_Enable

Step 4: 綁定 Driver 的「讀取致能 (Read Enable)」

最後一步,也是最關鍵的:打開你的 Communication Driver 工作表(Worksheet)。 在工作表上方的 “Read Enable”(讀取致能) 欄位中,填入剛剛做好的 PLC_Link_Enable

indusoft-communication-fault-workaround-01.png

搞定!這樣一來,只要該 PLC 斷線,哨兵 TAG 的 Quality 一歸零,PLC_Link_Enable 就會變成 false。Driver 就會立刻停止讀取該工作表下的所有 TAG,不再傻傻等待 Timeout,整個系統的通訊就順暢啦!

留言區

載入中...

發表留言