Modbus-POE-ETH-Relay教程

资料

程序

软件


硬件说明

硬件连接

  • 将Modbus POE ETH Relay通过网线连接到局域网,通过电源端口供电或者通过POE供电。


注意:上图是使用PoE网口供电。如果是使用的普通网线,须外接电源适配器供电,可外接7~36V范围的电源供电。

指示灯说明

指示灯状态说明
RUN灯网口运行指示灯,网口工作正常后,会输出周期为2秒的方波。
STA灯MCU指示灯,MCU正常工作时闪烁。
TXD灯发送指示灯,发送数据时灯亮。
RXD灯接收指示灯,接收数据时灯亮。
网口绿色灯TCP 连接建立后绿灯亮,可用于模块是否和上位机软件建立通讯链路。
网口黄色等数据活动灯,当网口有数据传输时,黄色灯转态会改变,可以用于判断是否有数据传输。

软件安装

Vircom 可用于设备 IP 等参数的配置,以及创建虚拟串口。 如果无需虚拟串口功能,则可以只下载免安装版本配置软件 。

驱动安装需要解压,双击软件安装,若Vircom里的虚拟串口不显示,则重启再次查看。

实例演示

TCP通讯测试

软件准备

上位机设置说明

Modbus POE ETH Relay连接好硬件,并接入网络。运行Vircom软件(安装Vircom的计算机须与模块在同个局域网内)。
操作如下:

  • ① 点击 设备管理
  • ② 点击 自动搜索
  • ③ 软件搜索识别到接入到局域网的Modbus POE ETH Relay设备
  • ④ 选择设备,然后点击 编辑设备 或者 直接双击搜索到的设备
  • ⑤ 设置设备工作参数:
    • 点击“本地IP”按钮识别电脑IP地址,将“IP地址”修改为静态分配地址,注意输入的静态IP地址没有被其他设备使用,而且需要和电脑在同一局域网。
    • 工作模式为TCP服务器。串口设置默认为115200,不能修改。
    • 高级选项中的“转换协议”,默认为无,即使用modbus rtu协议;如果选择Modbus_TCP 协议,则选择,modbus tcp协议。
  • ⑥ 设置完成后,点击 Modify Setting修改设置
  • ⑦ 点击 重启设备 ,等待模块重启,新的设置生效。

具体见下图:

  • 最后点击“修改设置”保存设置并生效。

TCP通讯测试

  • 打开串口调试助手窗口,端口号选择TCPClient,根据上面Vircom设置修改远程IP和端口号,点击“连接”按钮连接TCP服务端,连接成功后网口绿色灯将亮起


  • 点击多字符串打开多条字符串发送窗口,点击对应的功能即可发送对应的命令。
  • 详细的控制指令请查看请查看开发协议。

虚拟串口测试

图中的 SSCOM2 是通过 TCP 和串口服务器直接通信的,为了能够让用户已有开发好的串口软件也能和串口服务器通讯,需要在用户程序和串口服务器之间增加一个虚拟串口。如图 所示,Vircom 和用户程序在一台计算机上运行,Vircom 虚拟一个 COM 口,让这个 COM 口对应这个串口服务器。当用户程序打开 COM 通讯时可以通过 Vircom 串口服务器发到用户串口设备。下面演示这个操作步骤:

  • 点击 Vircom 主界面的“串口管理”,然后点击“添加”,选择添加 COM2,其中 COM5 是计算机原来不存在的 COM 口。


  • 然后进入设备管理,并双击需要和 COM2 绑定的设备。如图 所示,在左上角的“虚拟串口”列表中选择 COM2。然后点击“修改设置”,再点击“重启设备”。


  • 返回 Vircom 的主界面。可以看到 COM2 已经和 IP 为 192.168.1.200 的设备联通了。此时可以使用 COM2 代替 SSCOM2 进行通信。


  • 在电脑上打开,打开对应的端口号,设置波特率为115200,点击多字符串打开多条字符串发送窗口,点击对应的功能即可发送对应的命令。


MODBUS TCP 测试

默认情况下数据是透明传输的,使用Modbus RTU协议。如果需要实现 Modbus TCP 转 RTU,则需要在设备设置对话框中,将转化协议选择为“Modbus TCP 协议”,如下图所示。此时设备端口自动变为 502,此时用户的 Modbus TCP 工具连接上串口服务器的 IP 的 502 端口,发送的Modbus TCP 指令将会转化为 RTU 指令从串口输出。
比如服务器网口收到 00 00 00 00 00 06 01 05 00 00 FF 00 的 Modbus TCP 指令(打开第一个继电器),则主控收到 01 05 00 00 FF 00 8C 3A 的Modbus RTU指令。

  • 点击“更多高级选项...”选择Modbus网关类型为非存储型Modbus网关。

注意:默认的modbus网关类型为存储型方式,会自动多次发送查询指令,可能会导致主控芯片响应不过来,导致查询指令不影响。故需要设置为非存储型Modbus网关 

  • 打开Sscom软件,在多条字符串发送栏中点击导入ini按钮,选择modbus tcp.ini文件导入。

如果提示“A component named HEX0 already exists”错误。则关闭软件重新打开,再重新导入文件即可。 

  • 成功导入后显示如下,点击对应的功能即可发送对应的命令。

  • 关于Modbus TCP转换详细请参考后面Modbus TCP协议部分。

WEB方式配置

使用 Vircom 可以在不同的网段内搜索和配置设备参数,Web 方式配置需要首先保证计算机和串口服务器处于同一个 IP 段,且需要预先知道串口服务器的 IP 地址。但是 Web 配置可以在任何一台没有 Vircom 的计算机上进行。(不同产品网页界面不同,可切换中英文显示)
1.在浏览器中输入串口服务器的 IP 地址,例如 http://192.168.1.200 打开如下网页

2.在 Password 中输入密码:出厂默认无设置登录密码,可随便输入一个密码,点击 Login 按钮登录。设置密码可登录后,在”修改网页登录密码”处设置生效:

3.在出现的网页中可以修改串口服务器参数,相关参数可以参考表 4 参数含义。
4.修改参数后点击“提交修改”按钮。
5.如果配置和下载MQTT和Jetson Modbus固件,覆盖了配置界面网页文件,导致配置网页无法打开,请按照以下步骤重新下载网页文件:

关于内置的以太网模块更多详细的使用说明,可参考:RS485 TO ETH (B)用户手册

示例程序

树莓派

将树莓派和ModBus POE ETH Relay模块接入到同一个局域网。
打开树莓派终端,输入以下命令运行程序

sudo apt-get install unzip
wget https://www.waveshare.net/w/upload/e/e0/Modbus_POE_ETH_Relay_Code.zip
unzip Modbus_POE_ETH_Relay_Code.zip
cd Modbus_POE_ETH_Relay_Code

#modbus rtu 协议
vi modbus_rtu.py  #根据实际情况修改IP地址和端口号
sudo python3 modbus_rtu.py

#modbus tcp协议
vi modbus_tcp.py  #根据实际情况修改IP地址和端口号
sudo python3 modbus_tcp.py

注意:运行实例程序需要先修改程序文件,将IP地址和端口号修改为ModBus POE ETH Relay实际IP地址和端口号

Modbus RTU 开发协议

功能码介绍

功能码备注
01读继电器状态
03读取地址、版本
05写单个继电器
06设置波特率,地址
0F写全部继电器

控制单个继电器

发送码:01 05 00 00 FF 00 8C 3A

字段含义备注
01设备地址固定0x01
0505指令控制继电器指令
00 00地址要控制继电器的寄存器地址,0x00 - 0x0008
FF 00指令0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;
8C 3ACRC16前6字节数据的CRC16校验和

返回码: 01 05 00 00 FF 00 8C 3A

字段含义备注
01设备地址固定0x01
0505指令控制继电器指令
00 00地址要控制继电器寄存器地址,0x0000-0x0008
FF 00指令0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;
8C 3ACRC16前6字节数据的CRC16校验和

示例: [1号地址设备]: 0号继电器开启 : 01 05 00 00 FF 00 8C 3A
0号继电器关闭 : 01 05 00 00 00 00 CD CA
1号继电器开启 : 01 05 00 01 FF 00 DD FA
1号继电器关闭 : 01 05 00 01 00 00 9C 0A
2号继电器开启 : 01 05 00 02 FF 00 2D FA
2号继电器关闭 : 01 05 00 02 00 00 6C 0A
3号继电器开启 : 01 05 00 03 FF 00 7C 3A
3号继电器关闭 : 01 05 00 03 00 00 3D CA
0号继电器翻转:01 05 00 00 55 00 F2 9A
1号继电器翻转:01 05 00 01 55 00 A3 5A
2号继电器翻转:01 05 00 02 55 00 53 5A
3号继电器翻转:01 05 00 03 55 00 02 9A

控制全部继电器

发送码:01 05 00 FF FF 00 BC 0A

BC 0A||CRC16||前6字节数据的CRC16校验和

字段含义备注
01设备地址固定0x01
0505指令控制继电器指令
00 FF地址固定0x00FF
FF 00指令0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;

返回码: 01 05 00 FF FF 00 BC 0A

字段含义备注
01设备地址固定0x01
0505指令控制继电器指令
00 FF地址固定0x00FF
FF 00指令0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;
BC 0ACRC16前6字节数据的CRC16校验和

示例:

[1号地址设备]:

全部继电器开启 : 01 05 00 FF FF 00 BC 0A
全部继电器关闭 : 01 05 00 FF 00 00 FD FA
全部继电器翻转 : 01 05 00 FF 55 00 C2 AA

读取继电器状态

发送码:01 01 00 00 00 08 3D CC

字段含义备注
01设备地址固定0x01
0101指令查询继电器状态指令
00 00继电器起始地址固定0x0000
00 08继电器数量固定0x0008
3D CCCRC16前 6 字节数据的 CRC16 校验和

返回码:01 01 01 00 51 88

字段含义备注
01设备地址固定0x01
0101指令查询继电器状态指令
01字节数返回状态信息的所有字节数。
00查询的状态返回的继电器状态
Bit0:第一个继电器状态;
Bit1:第二个继电器状态;
Bit2:第三个继电器状态;
……
Bit7:第八个继电器状态;
8C 35CRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

发送 : 01 01 00 00 00 08 3D CC
返回 : 01 01 01 00 51 88 //全部继电器关闭
发送 : 01 01 00 00 00 08 3D CC
返回 : 01 01 01 01 90 48 //0号继电器开启,其余继电器关闭
发送 : 01 01 00 00 00 08 3D CC
返回 : 01 01 01 41 91 B8 //0、6号继电器开启,其余继电器关闭

写继电器状态

发送码:01 0F 00 00 00 08 01 FF BE D5

字段含义备注
01设备地址固定0x01
0F0F指令写继电器状态指令
00 00继电器起始地址固定 0x0000
00 08继电器数量固定 0x0008
01字节数量固定 0x01
FF继电器状态Bit0:控制第一个继电器;
Bit1:控制第二个继电器;
Bit2:控制第三个继电器;
……
Bit7:控制第八个继电器;
BE D5CRC16前 6 字节数据的 CRC16 校验和

返回码:01 0F 00 00 00 01 94 0B

字段含义备注
01设备地址固定0x01
0F0F指令全部寄存器控制指令
00 00地址固定0x0000
00 08继电器数量固定 0x0008
54 0DCRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

继电器全部开启 : 01 0F 00 00 00 08 01 FF BE D5
继电器全部关闭 : 01 0F 00 00 00 08 01 00 FE 95
0-1开;3-7关 : 01 0F 00 00 00 08 01 03 BE 94

继电器闪开闪闭指令

发送码:01 05 02 00 00 07 8D B0

字段含义备注
01设备地址固定0x01
0505指令单个控制指令
02指令02 为是闪开指令,04为闪闭指令
00继电器地址要控制的继电器地址,0x00~0x08
00 07间隔时间延时时间为数据*100ms
数值:0x0007,延时:7*100MS = 700MS
8D B0CRC16前 6 字节数据的 CRC16 校验和

返回码:01 05 02 00 00 07 8D B0

字段含义备注
01设备地址固定0x01
0505指令单个控制指令
02指令02 为是闪开指令,04为闪闭指令
00继电器地址要控制继电器地址,0x00~0x08
00 07间隔时间延时时间为数据*100ms
数值:0x0007,延时:7*100MS = 700MS
8D B0CRC16前 6 字节数据的 CRC16 校验和

备注:

闪开闪闭的时间最大设置为0x7FFF

示例:

[1号地址设备]

0号继电器闪开 : 01 05 02 00 00 07 8D B0 //700MS = 7*100MS = 700MS
1号继电器闪开 : 01 05 02 01 00 08 9C 74 //800MS
0号继电器闪闭 : 01 05 04 00 00 05 0C F9 //500MS
1号继电器闪闭 : 01 05 04 01 00 06 1D 38 //600MS

读取设备地址指令

发送码:00 03 40 00 00 01 90 1B

字段含义备注
00设备地址固定0x01
0303指令读取设备地址指令
40 00指令寄存器0x0200为读取软件版本,0x0040为读取设备地址
00 01字节数固定0x0001
90 1BCRC16前 6 字节数据的 CRC16 校验和

返回码:01 03 02 00 01 79 84

字段含义备注
00设备地址固定0x01
0303指令读取软件版本,读取设备地址指令
02字节数返回字节数
00 01设备地址设置的设备地址,固定0x01
79 84CRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

发送 : 00 03 40 00 00 01 90 1B
返回 : 01 03 02 00 01 79 84 //地址0x01

读取软件版本指令

发送码:00 03 80 00 00 01 AC 1B

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0303指令读取软件版本,读取设备地址指令
80 00指令寄存器0x4000为读取设备地址,0x8000为读取软件版本
00 01字节数固定0x0001
8F CACRC16前 6 字节数据的 CRC16 校验和

返回码:01 03 02 00 64 B9 AF

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0303指令读取软件版本,读取设备地址指令
02字节数返回字节数
00 64软件版本转为十进制然后小数点左移两位即表示软件版本


0x0064 = 100 = V1.00

B9 AFCRC16前 6 字节数据的 CRC16 校验和

示例:

发送:00 03 80 00 00 01 AC 1B
返回:01 03 02 00 64 B9 AF //0x0064 = 100 =V1.00

Modbus TCP 开发协议

在这里以上面打开第一个继电器的指令为例简单介绍一下modbus tcp与modbus rtu协议转换。

  • Modbus RTU 指令:01 05 00 00 FF 00 8C 3A
字段含义备注
01设备地址固定0x01
0505指令控制继电器指令
00 00地址要控制继电器的寄存器地址,0x00,即第一个继电器
FF 00指令0xFF00:继电器开启
8C 3ACRC16前6字节数据的CRC16校验和
  • Modbus TCP 指令:00 00 00 00 00 06 01 05 00 00 FF 00
字段含义备注
00 00消息标号都是0x00即可
00 00modbus标志号必须都为0,代表这是modbus 通信
00 06字节长度表示后面的所有字节数,后面还有6个字节
01设备地址固定0x01
0505指令控制继电器指令
00 00地址要控制继电器的寄存器地址,0x00,即第一个继电器
FF 00指令0xFF00:继电器开启

通过上面指令的对比可以发现,modbus rtu 指令去掉CRC校验,前面加上五个0x00和一个字节长度即可转为modbus tcp协议。

高级应用 - MQTT连云平台

通过阿里云MQTT控制