InduSoft 實戰:多台 PLC 通訊斷線導致畫面卡頓?一招「哨兵機制」完美閃避!
- 問題: InduSoft 連線多台 PLC 時,若單台斷線會因為等候 Timeout,導致整個通訊執行緒卡死、畫面嚴重延遲。
- 解法: 建立「哨兵機制」,透過單一 TAG 狀態控制整批讀取。
- 步驟:
- 監控單一代表性 TAG(例如
D0)的連線品質(Quality)。- 透過 Background Script 判斷:若
D0->Quality <> 0(正常),將旗標PLC_Link_Enable設為true;否則設為false。- 在 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。

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