2017年2月12日 星期日

LinkIt 7688: 0 Day IoT Gateway DIY III

0 Day IoT Gateway DIY II 裡筆者介紹了 LinkIt Smart 7688 與 com0com 的組合應用。其實這是工控市場行之有年的商品了,只不過一般人很少接觸到。在工控市場上他有幾種稱呼:
不過這些工業用產品,價格可是高的嚇人,如 MOXA 2 Serail Port Device Server 在露天拍賣的二手價是 2xxx-3xxx NTD,但 LinkIt 7688 兩千元可以買四片有找,還帶 Wi-Fi,CP 值簡直高到沒朋友!

當然這些產品的軟硬體完整度是 7688 沒法比的,不過正所謂「自己動手,豐衣足食」,讓筆者帶領大家繼續土砲 Serial to Ethernet/Wifi/Device Server,說不定這些業餘嗜好哪天會變成一門生意喔!?

1. socat

聰明的看倌們應該會發現,上次筆者介紹了 TCP Server to Serial(ser2net),但好像少了 Serial to TCP client?

這有什麼用途?例如永宏 PLC(可程式控制器) 可以經由 Serial Port 控制 Modbus RTU/ASCII device,同樣的工業人機(HMI)界面也可以透過 Serial Port 讀取各種 PLC, Meter, Remote IO...,以及各種形形色色的 Serial Device(所以才有人稱為 Serial to TCP/UDP 為 Device Server)。


那如果有了 Serial to TCP client 加上上次提到的 TCP Server to Serial,就可以實現無線自動化監控了!


從上圖得知我們還少了上圖左半邊,socat - Multipurpose relay 這隻小工具可以滿足我們的需求,也就是 Serial to TCP client,來看看怎麼做吧!

1.1 安裝 socat

7688 預設沒有安裝 socat,與 ser2net 一樣直接從 7688 下指令安裝:


1.2 socat 測試

以下命令將會開啟一個 Serial(UART1) to TCP client 通道,UART1 設定為:
  • Baudrate: 115200bps
  • Parity: even
  • Data size: 7bits
  • Stop bit: 1bit
socat /dev/ttyS1,raw,ignbrk=1,echo=0,echonl=0,opost=0,clocal=1,cread=1,crtscts=0,parenb=1,parodd=0,cstopb=0,csize=2,b115200 TCP:192.168.2.101:5566
參數長到嚇死人,但有些參數是固定的,真正會需要修改的有:
  • Parity
    • none: parenb=0,parodd=0
    • odd: parenb=1,parodd=1
    • even: parenb=1,parodd=0
  • Stop bit(s):
    • 1 bit: cstopb=0
    • 2 bits: cstopb=1
  • Data size:
    • 7 bits: csize=2
    • 8 bits: csize=3
  • Baudrate:
    • b9600
    • b19200
    • b38400
    • ...
    • b115200
  • TCP:IP_ADDRESS:LISTEN_PORT
這時候我們還需要一個 TCP server 協助我們測試,暫且先不用 ser2net,因為還不知道 socat 這邊有沒有正確設定,測試方式如下:

TCP server 有幾種選擇,Linux 上可以用 nc,Windows 上這裡用 MOXA PComm Lite 作為示範:


執行上面的測試命令 socat /dev/ttyS1,raw,ignbrk=1...,然後開啟 putty:



在 putty 上隨意敲擊一些字元後,應該會看到下面的畫面:


2. 綜合演練

這次我們試試看台達 HMI 能不能連上永宏 PLC,因為手上沒有實體 HMI,就只好用線上模擬過過乾癮了(台達 HMI 編輯器可以從官網下載,無須註冊)。

連線架構:



設定步驟如下:

2.1 設定通訊參數



2.2 放置畫面元件


PLC Ladder 內容,很簡單的自保持線路,M0 = ON -> Y0 = ON,M1 = ON -> Y0 = OFF:


2.3 編譯->執行




3. 心得

socat 如果建立 TCP connection 失敗,就會直接結束程式,如果希望他 retry,請在命令最後加上 forever (socat /dev/ttyS1,raw,ignbrk=1,echo...,forever),另外如果由 TCP server 主動關閉 connection,forever 這個參數幫不上忙,不過寫點簡單的 shell script 即可解決:
#!/bin/sh
#ser2tcpc.sh
#!/bin/sh
#ser2tcpc.sh
while true; do
  socat /dev/ttyS1,raw,ignbrk=1,echo=0,echonl=0,opost=0,clocal=1,cread=1,crtscts=0,parenb=1,parodd=0,cstopb=0,csize=2,b115200 TCP:127.0.0.1:5566,forever
done
祝大家玩的愉快!

沒有留言:

張貼留言