2019年5月19日 星期日

如何將 PLC 數據存到資料庫? - PART II


 接前篇,繼續揭露 PLC 如何與 PC 通訊

方法 4: PLC 直接與 PC 通訊

如果你需要更即時的取得 PLC 數據就要考慮這種作法

PLC 一般有兩個通訊界面,一個是 CPU Port,一個是通訊模組,以 Mitsubishi FX3U 為例:


兩者都可以用來讀寫 PLC 數據,CPU Port 除了監控外還可以讀寫 PLC 程式(如 Ladder)。通常 CPU Port 已經被 HMI 佔用。在不影響原系統下最方便的選擇就是外加一個通訊模組,這些通訊模組的 protocol 都是公開的,除非你不會 Google,不然這不可能是問題。

通訊模組有 RS232/422/485 也有 Ethernet 的版本,但後者的價格有時是前者的好幾倍,碰到這種情形時你可以用前篇提到的 device server 搭配 RS232/422/485 模組 cost down。

那如果 CPU Port 沒有被 HMI  佔用可以拿來跟 PC 通訊嗎?當然可以,不過各家 PLC 公開的程度不太一樣,台廠是全部公開,像台達 DVP 系列就只是 Modbus ASCII 而已。日系的話除了 Mitsubishi 我碰過的廠牌也幾乎都公開了。Mitsubishi 小型 PLC FX 系列已經是公開的祕密,中型以上你就很難找到資料了。

美系我只碰過 Rockwell,這方面的資料也是公開的(如 DF1)。歐系最有名的大概是西門子,如果是 Ethernet 也是公開的資料,你甚至可以找到 open source lib,最難找的反而是 RS485 的通訊資料,而且西門子 PLC 現在把 CPU Port(MPI)調高到 1Mbps,你在 PC 上要找一個支援 1Mbps 的 RS485 界面很難,而且 PC 無法滿足 MPI 的實時需求。淘寶上到是可以找到一堆 RS232 轉 MPI 的模組,有興趣的讀者就請自行搜尋。

如果我是運維人員,最簡單的作法就是通通用 Modbus 通訊模組,省得自找麻煩。

方法 5: 監聽法

前面幾種作法有一個前提:就是設備上的 PLC 與 HMI 是可以變動的。但有時候設備是外包或外購的,這時候 PLC 跟 HMI 可能都被上了密碼保護,那前面幾種作法就不能用(其實也有人在賣破解 PLC 這種服務)。

碰到這種情形,除了花錢請原廠改之外有別的辦法嗎?這邊就來傳授一招禁斷密技給大家。

一般來說,PLC protocol 大都屬於一問一答的形式(據說 60% 都是如此),而且很少加密,假設 HMI 持續讀取 的 PLC 數據中正好有我們要的,而且又是透過 RS232/422/485 通訊,那就有機會從中監聽到我們想要的數據。


 如果是 RS232,我們可以利用兩個 COM Port 進行監聽:


以 Mitsubishi FX 系列為例,通訊協議大致如下:


監聽步驟如下:
  1. COM1 判斷 request 是否正在讀取我們需要的位址(見下圖)
  2. 如果是,COM1 讀完 request 後用 COM2 讀取 replay(見下圖),然後回到 1.。不是則進入 3.
  3. 讀完整個 request/replay 然後丟棄
不過這樣接有時會讀不到資料,個人猜想有點電氣特性上的問題。所以比較安全的作法是轉成 RS485:


但 RS232 畢竟是 full-duplex,有時候就只好改轉成 RS422 了:


因為我們只需要讀資料,所以 COM1, COM2 可以用 RS485,RS422 與 RS485 電氣上相容。

方法 6: 究極奧義 - 共享頻寬法

各位讀者有沒有想過一件事?就是老式螺旋槳戰鬥機的機槍常常設置於螺旋槳前方,那為何螺旋槳沒被機槍打斷造成墜機呢?

在第一次世界大戰期間,荷蘭工程師發明了射擊斷續器(Synchronization gear),當螺旋槳轉到機槍前方時會用凸輪頂住機槍讓機槍無法射擊:

 
  
那如果有辦法頂住 HMI 一陣子,讓 PLC 暫時借我們通訊一下, 這種方法是不是可行呢?

簡單來說,就是假想 Tx/Rx 上有兩個開關可以控制是否斷開 HMI 與 PLC 的通訊

開關用 relay 是肯定不行的,速度太慢,而且這麼頻繁的切換很快就壞了。筆者想到一種方法是用 tri-state logic,例如我們可以先把標準 RS232 轉回 TTL,中間用 tri-state logic 作為開關控制訊號流向:


這樣我們就可以透過 tri-state EN 這隻腳控制 PLC 與 HMI 的通訊。不用怕我們的通訊命令跟 HMI 打架了。當然具體的作法可能如下:
  1. PC 偵測 PLC response 尾端
  2. PC 透過 tri-state 暫停 HMI/PLC 通訊
  3. PC 與 PLC 通訊
  4. PC 透過 tri-state 恢復 HMI/PLC 通訊
難點應該是 2,如果透過 RS232 RTS 接腳控制 tri-state EN 可能不夠快。你可能需要額外的線路偵測 Tx falling/rising edge 自動 disable tri-state logic EN,直到 PC 通訊完後再手動打開。


這種方法純屬筆者搞笑,不過若是真的有人實驗成功麻煩在下方留言讓筆者膜拜一下XD

這個方法有一定程度的風險,雖然 HMI 被斷開 Tx/Rx 通訊失敗會 retry, 但你已經影響了原本設備運作的 timing,請小心可能造成設備運作異常或損壞!

方法 7: 其他

如果你真的懶得寫程式而且預算又很多,可以買個 OPC server 搭配 SCADA,或是購買 HMI 廠商販賣的 SCADA 把資料撈出來,這往往是現成的功能,至少 10 年前就有了:

尾聲

詢問這個問題的網友認為這是電機、機械的領域,但 PLC 內部很多是資訊系學過的東西,不過換個面貌出現而已(除了 PID, 馬達控制)。套句 ChamberPlus 老大的名言:「做一行要入一行」,除非你打算做沒多久就落跑,不然有些東西還是躲不掉的。

如果以上方法都沒法幫上您的忙,歡迎留言討論

7 則留言:

  1. 我是機構的,雖然不會編程但這些觀念真的真基本很入門,真的得要懂。
    方法五、方法六也常用在原廠不開放通訊或io(或io用完沒得加),而又要自已加改裝設備功能時,攔截訊息、中斷機器用。原理是一樣的

    回覆刪除
    回覆
    1. 這行我做了10年,方法5,6沒有看過客戶用過,方法5只有內部用,目的只是為了觀察PLC通訊,不過我接觸的客人最多只到設備商,設備商的客人會怎麼改造那我就不知道了。

      方法6有一定的風險,如果造成設備誤動作,那就得不償失了。

      刪除
  2. 想請問方法4
    我的機型是三菱FX3G有個mini USB可連接PC
    想問mini USB也能講數據存到資料庫嗎?
    如果完全沒有PLC程式基礎的有辦法寫嗎
    被廠商黑了變成要自己寫

    回覆刪除
    回覆
    1. 全華有出書,我忘記書名了,印象中是用VB當範例,請自行搜尋

      刪除
  3. 方法6,是不是稱為外部中斷 ?

    回覆刪除
  4. 大大您好,不好意思,看到您的文章對我很幫助,這邊想另外請教您,因為小弟我目前嘗試用 python 的 modbus 庫去連接三菱Fx PLC, 可以如何知道 plc 的線圈或暫存器的 address?

    回覆刪除