Ameba Arduino: [RTL8195] [RTL8710] 使用 modbus TCP 工業通訊協定

材料準備

  • Ameba x 1

範例說明

Modbus是一種通信協定,可以實作在各種不同的介面上,像是Serial、Ethernet、Wifi。這個範例裡我們會使用Ameba透過wifi TCP實作Modbus TCP。
Modbus的角色有Master與Slave。Master發起命令,而Slave回應訊息。這裡Ameba扮演Slave的角色,而Master會嘗試讀取Ameba上面的資料。

  • 下載Modbus tool
    Modbus相關的程式很多,這裡我們使用modpoll這個command line工具,它目前是免費的,相關的文件可以在這個網站上找到: http://www.modbusdriver.com/modpoll.html

    下載之後解壓縮,會看到裡面有不同OS的版本,舉例來說,Windows的版本會在 win32\modpoll.exe

  • 下載Ameba Modbus library
    請到這個地方下載Ameba Modbus library: https://github.com/Ameba8195/Arduino/raw/master/libraries/ModbusTCP-1.0.0.zip

    安裝library的方式請參考Arduino官方網站的教學文章將zip檔的library加入Ameba: https://www.arduino.cc/en/Guide/Libraries#toc4

    這個library預設內存32個16-bit大小的空間。在Modbus的架構裡,Master會認為這個空間是Ameba的register。實作上我們只要將這個空間擺置我們想要的資料即可。

  • 測試範例
    請打開範例 “File” -> “Examples” -> “AmebaModbus” -> “simepletest”
    這個範例需要連上Wifi AP,請修改要連上的wifi ssid/password,上傳至Ameba之後按下Reset按鈕。
    接著我們要使用modpoll這個工具,如果你的OS是windows,請執行底下的命令: modpoll -m tcp -t 4:int -r 40003 192.168.1.196

    最後一個參數是Ameba的IP,請填上對應的值。各個參數的說明如下:
    1

    執行結果如下,它會每秒讀取Ameba在位址40003的register的值。而範例裡我們會將40003填入Ameba的系統時間,所以modpoll會每秒讀到Ameba的系統時間。
    2

程式碼說明

程式碼裡宣告了ModbusTCP的物件:

ModbusTCP m;

在Setup()裡面設定了各個模擬的register的值:

m.setFloat(S1_FloatConstant, PI);
m.setU32(S1_CurrentMillis, millis());
m.setU16(S1_FeetPerMile, 5280);

然後將Ameba連上AP,連線所需的參數與Wifi begin()一樣:

m.begin(ssid, pass);

在loop()裡面,檢查是否有Master連線進來並處理Master的命令:

m.run();

處理命令完之後更新register的值:

m.setU32(S1_CurrentMillis, millis());