使用 modbus TCP 工业通讯协定
材料准备
- Ameba x 1
范例说明
Modbus是一种通信协定,可以实作在各种不同的介面上,像是Serial、Ethernet、Wifi。这个范例里我们会使用Ameba透过wifi TCP实作Modbus TCP。
Modbus的角色有Master与Slave。 Master发起命令,而Slave回应讯息。这里Ameba扮演Slave的角色,而Master会尝试读取Ameba上面的资料。
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,请填上对应的值。各个参数的说明如下:
执行结果如下,它会每秒读取Ameba在位址40003的register的值。而范例里我们会将40003填入Ameba的系统时间,所以modpoll会每秒读到Ameba的系统时间。
程式码说明
程式码里宣告了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());
Realtek IoT/Wi-Fi MCU Solutions . All Rights Reserved. 使用条款