使用 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/ambiot/amb1_arduino/raw/master/Arduino_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());
请先确认已安装QQ通讯软体