2017年2月5日 星期日

LinkIt 7688: 0 Day IoT Gateway DIY II

上一集筆者介紹了 Modbus,不過世界上總有人喜歡發明新輪子。例如下圖這三台 PLC(可程式控制器) 的串列通訊協議都不一樣:


那如果要把這些裝置連上 Wi-Fi/Ethernet,按照上一集的作法,豈不是一百種通訊協議寫一百次程式?這種作法顯然會搞死人,有沒有什麼方法可以不用弄的自己雞毛鴨血?今天就來公開不用寫程式,利用 7688 直接把裝置連上 Wi-Fi/Ethernet 的秘奧義。


1. ser2net

1.1 什麼是 ser2net?

ser2net 是一個 TCP server,他會把從 TCP client 送來的資料重導到 Serial Port(如 /dev/ttyS1),從名稱也可以猜到他的用途 ser2net - serial to network:


1.2 安裝 ser2net

這次不需要再用到 7688 SDK,請照下方直接從 7688 安裝 ser2net:
root@mt7688:/# opkg update
root@mt7688:/# opkg install ser2net
編輯 /etc/ser2net.conf,今天我們要來測試的裝置是 Fatek B1z PLC,他的通訊參數是 115200bps,parity:even,stop bit:1,data bits:7。注意下方是兩列:
5566:raw:30:/dev/ttyS1:115200 EVEN 1STOPBIT 7DATABITS LOCAL -RTSCTS
(空白列)
測試一下,-d 代表以 debug mode 執行:


以 Windows telnet client 測試是否連線成功:


成功畫面:


失敗畫面:


如果測試失敗,請檢查 ser2net 顯示的錯誤訊息,或是在底下留言。

這道料理還差一味 TCP client,也就是我們下面要介紹的 com0com + com2tcp。

2. com0com

2.1 什麼是 com0com

com0com 是個神奇的開源軟體, 他能在 Windows 上模擬出兩個不存在的 COM Port,這兩個 COM Port 就如同 Null Modem 一樣對接(下圖是簡化過的 null modem):


這樣有什麼用途?等等我們就會看到

2.2 安裝 com0com

這可能是本文最麻煩的部份,因為 com0com 是 kernel mode driver,而 Windows 預設(Windows 7 之前的版本沒試過)不允許安裝沒有簽章的 driver,有三個解決方法:
  1. 以管理者權限(Run as Administrator)打開 console,執行以下兩道指令後重開機
    • bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS
    • bcdedit -set TESTSIGNING ON
  2. 自行編譯 com0com
  3. 安裝有簽章過的 2.2.2
1. 會降低電腦防護,2. 太麻煩了還要去弄套開發環境,所以筆者選 3.,以筆者的環境 Windows 7 64bit 家用版來說沒什麼問題。


2.2.1 安裝步驟

Step 1.

用瀏覽器打開 https://sourceforge.net/projects/com0com/files/com0com/2.2.2.0/ ,選擇 com0com-2.2.2.0-x64-fre-signed.zip。

下載解開後執行 setup.exe


Step 2.

安裝完畢後執行 Setup:


將名稱修改成 COM15, COM16,如果這兩個 COM Port 在你的電腦上已經被用掉了,可以改成其他的如 COM151, COM152,只要不重複就好,但個人不建議用 COM1-COM10,因為有可能會與真的 COM Port 衝突:


打開裝置管理員檢查:



2.3 com0com 測試

打開兩個 putty,分別開啟 COM15 與 COM16,然後隨便敲擊一些字元:



3. com2tcp

hub4com 裡有兩個 batch file:
  • com2tcp.bat
  • com2tcp-rfc2217.bat
這兩個批次檔會進行以下動作:
  1. 開啟 com0com 建立的虛擬 COM Port
  2. 建立 TCP client 然後連線到  TCP server(ser2net)
  3. 把虛擬 COM Port 取得的資料與 TCP server 交換
但這次我們不會用到 com2tcp-rfc2217.bat,前面提到的 ser2net 也支援 RFC2217,不過筆者沒有實驗成功,時好時壞,筆者研判可能是 RFC2217 內某些控制協議干擾通訊。

再說,我們希望 ser2net 從 TCP client 收到什麼資料就傳什麼給 7688 ttyS1,把傳輸效能極大化。

連線架構:


上圖中的「?」就是我們要用來測試的軟體。下面是筆者的 com2tcp.bat 測試參數:
com2tcp --ignore-dsr --baud 115200 --data 7 --parity e --stop 1 \\.\COM16 192.168.2.105 5566
見證奇蹟的時刻來臨了!

4. 測試 1: WinProLadder

WinProLadder 是 Fatek 提供給 user 編輯 Ladder 的軟件,不知道 Ladder 是什麼沒關係,結果比較重要:

Step 1.


Step 2.


Step 3.

喔喔喔!成功了,進入監控畫面!(請點圖放大)


改變狀態看看 (M0 off -> on)

成功改變 PLC 輸出!



甚至直接以 TCP 連線也行(請先關閉 com2tcp):


5. 測試 2: OPC Server

這裡使用 Kepware OPC Server 進行測試,去 Kepware 官網註冊後即可下載試用版:

(因為 Kepware 不支援 Fatek B1z,這裡改用 Mitsubishi FX1S)



各位知道這代表什麼嗎?如果 OPC server 也能這樣玩,那代表我們可以用 SCADA(例如 LabView) 搭建複雜的控制網路了!


6. 心得

看起來用這招就好了,那上一集是在騙點閱數嗎?其實這種方法有幾個缺點:
  • 傳輸沒有最佳化:因為 ser2net 與 com2tcp 並不知道你在傳什麼,他們只是左手拿到資料就往右手丟,這會造成傳輸的碎片化,也有可能讓一些敏感的裝置認為兩個 byte 間的間隔太長,於是認定為 timeout。以 Modbus Ascii 為例,com2tcp 不會知道應該等看到 CR LF 再整包送出去。
  • 相容性較差:筆者另外實驗了台達 HMI北爾 PWS力誠 HMI 的線上模擬。台達是完全不行(本來還對這個國際大廠寄予厚望),北爾時好時壞,反倒是小廠力誠居然可行,真的蠻意外的。
  • 無法支援多個 TCP client:不像 Modbus Gateway 可以同時被多個 Modbus Master(TCP Client) 存取。

沒有留言:

張貼留言