Modbus RTU Relay教程

硬件测试

RS485测试

  • 将USB TO 485和目标板通过杜邦线,将A-->A和B-->B相连,如下图所示:


  • 下载SSCOM串口调试助手并在电脑上打开,打开对应的端口号,设置波特率为9600,点击多字符串打开多条字符串发送窗口,点击对应的功能即可发送对应的命令,


  • 如果需要发送其他命令则选择HEX发送,加检验选择ModbusCRC16校验,输入命令的前六个字节点击发送则会自动添加CRC校验码。


程序测试

注意:RS485不可以直接接到树莓派的串口否则可能烧毁设备,需要加485电平转换,树莓派建议搭配RS485 CAN HAT模块使用,NUCLEO-F103RB和Arduino建议搭配RS485 CAN Shield模块使用

树莓派

打开树莓派终端,输入以下指令进入配置界面

  1. sudo raspi-config
  2. 选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口


然后重启树莓派:

  1. sudo reboot

打开/boot/config.txt文件,找到如下配置语句使能串口,如果没有,可添加在文件最后面。

  1. enable_uart=1

对于树莓派3B用户,串口用于蓝牙,需要注释掉:

  1. #dtoverlay=pi3-miniuart-bt

然后重启树莓派:

  1. sudo reboot

将RS485 CAN HAT模块插到树莓派,把ModBus RTU Relay模块和RS485 CAN HAT模块的A与B对应连接
如果使用的是其他的485设备,确定连线A-A,B-B即可
运行如下命令运行程序

  1. sudo apt-get install p7zip
  2. wget http://www.waveshare.net/w/upload/6/6c/Servo_Driver_HAT.7z
  3. 7zr x Modbus_RTU_Relay.7z -r -o./Modbus_RTU_Relay
  4. cd Modbus_RTU_Relay/Python3
  5. sudo python3 main.py

STM32

STM32的例程是基于NUCLEO-F103RB和RS485 CAN Shield模块。
找到STM32程序文件目录并打开STM32工程。注意使用前先确保电脑已经安装好keil5软件,下载将程序下载到开发板即可。
正常正常运行继电器模块导通会依次打开然后依次关闭。串口会输出发送的命令。

Arduino

Arduino例程是基于NUO PLUS和RS485 CAN Shield模块。
使用Arduino IDE 打开程序,选择对应的开发板然后下载程序。
正常正常运行继电器模块导通会依次打开然后依次关闭。串口会输出发送的命令。

发送指令格式

发送指令总共包括8个字节, 分别是

字节1:地址
字节2:功能码
字节3 4:寄存器地址(大端格式)
字节5 6:寄存器数据(大端格式)
字节7 8:CRC校验(小端格式)

功能码介绍

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

控制单个继电器

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

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

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

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
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 FF FC 4A

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0505指令控制继电器指令
00 FF地址固定0x00FF
FF FF指令0xFFFF:继电器开启;
FC 4ACRC16前6字节数据的CRC16校验和

返回码: 01 05 00 FF FF FF FC 4A

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0505指令控制继电器指令
00 FF地址固定0x00FF
FF FF指令0xFFFF:继电器开启;
0x0000:继电器关闭;
0x5A00:继电器翻转;
FC 4ACRC16前6字节数据的CRC16校验和

示例:

[1号地址设备]:

全部继电器开启 : 01 05 00 FF FF FF FC 4A
全部继电器关闭 : 01 05 00 FF 00 00 FD FA
全部继电器翻转 : 01 05 00 FF 5A 00 C7 5A

读取继电器状态

发送码:01 01 00 FF 00 01 CD FA

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0101指令查询继电器状态指令
00 FF地址固定0x00FF
00 01指令固定0x0001
CD FACRC16前 6 字节数据的 CRC16 校验和

返回码:01 01 01 00 51 88

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

示例:

[1号地址设备]

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

写继电器状态

发送码:01 0F 00 00 00 01 94 0B

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0F0F指令写继电器状态指令
00 00地址固定0x0000
00 01指令Bit0:控制第一个继电器;
Bit1:控制第二个继电器;
Bit2:控制第三个继电器;
……
Bit7:控制第八个继电器;
94 0BCRC16前 6 字节数据的 CRC16 校验和

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

字段含义备注
01设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0F0F指令全部寄存器控制指令
00 00地址固定0x0000。
00 01指令0x0001,写继电器数据
Bit0:控制第一个继电器;
Bit1:控制第二个继电器状态;
Bit2:控制第三个继电器状态;
……
Bit7控制:第八个继电器状态;
94 0BCRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

继电器全部开启 : 01 0F 00 00 00 FF 15 8B
继电器全部关闭 : 01 0F 00 00 00 00 55 CB
0-1开;3-7关  : 01 0F 00 00 00 03 15 CA

继电器闪开闪闭指令

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

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

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

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

示例:

[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 06 20 00 00 05 43 D8

字段含义备注
00设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0606指令设置波特率,设备地址
20 00指令寄存器0x2000为设置波特率,0x4000为设置设备地址
00 05波特率数值波特率数值对应
0x0000  : 4800
0x0001  : 9600
0x0002  : 19200
0x0003  : 38400
0x0004  : 57600
0x0005  : 115200
0x0006  : 128000
0x0007  : 256000
43 D8CRC16前 6 字节数据的 CRC16 校验和

返回码:00 06 20 00 00 05 43 D8

字段含义备注
00设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0606指令设置波特率,设备地址
20 00指令寄存器0x2000为设置波特率,0x4000为设置设备地址
00 05波特率波特率数值对应
0x0000  : 4800
0x0001  : 9600
0x0002  : 19200
0x0003  : 38400
0x0004  : 57600
0x0005  : 115200
0x0006  : 128000
0x0007  : 256000
43 D8CRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

设置波特率 4800 :00 06 20 00 00 00 83 DB
设置波特率 9600 :00 06 20 00 00 01 42 1B
设置波特率115200 :00 06 20 00 00 05 43 D8

设置设备地址指令

发送码:00 06 40 00 00 01 5C 1B

字段含义备注
00设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0606指令设置波特率,设备地址
40 00指令寄存器0x2000为设置波特率,0x4000为设置设备地址
00 01设备地址设置的设备地址,0x0001-0x00FF
5C 1BCRC16前 6 字节数据的 CRC16 校验和

返回码:00 06 40 00 00 01 5C 1B

字段含义备注
00设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0606指令设置波特率,设备地址
40 00指令寄存器0x2000为设置波特率,0x4000为设置设备地址
00 01设备地址设置的设备地址,0x0001-0x00FF
5C 1BCRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

设置设备地址为0x01 :00 06 40 00 00 01 5C 1b
设置设备地址为0x02 :00 06 40 00 00 02 1C 1A
设置设备地址为0x03 :00 06 40 00 00 03 DD DA

读取设备地址指令

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

字段含义备注
00设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0303指令读取设备地址指令
40 00指令寄存器0x0200为读取软件版本,0x0040为读取设备地址
00 01设备地址设备地址
90 1BCRC16前 6 字节数据的 CRC16 校验和

返回码:01 03 01 01 31 88

字段含义备注
00设备地址0x00表示广播地址;0x01-0xFF表示设备地址
0303指令读取软件版本,读取设备地址指令
01字节数返回字节数
01设备地址设备地址
31 88CRC16前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

发送 : 00 03 40 00 00 01 90 1B
返回 : 01 03 01 01 31 88 //地址0x01
[2号地址设备]

发送 : 00 03 40 00 00 01 90 1B
返回 : 02 03 01 02 71 CD //地址0x02
[3号地址设备]

发送 : 00 03 40 00 00 01 90 1B
返回 : 03 03 01 03 B1 F1 //地址0x03

读取软件版本指令

发送码:01 03 20 00 00 01 8F CA

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

返回码:01 03 01 64 F1 A3

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


0x64 = 100 = V1.00

F1 A3CRC16前 6 字节数据的 CRC16 校验和

示例:

发送:01 03 20 00 00 01 8F CA
返回:01 03 01 64 F1 A3 // 64 = 100 =V1.00

TAG: 地平线旭日D-Robotics RDK X5开发板 Sunrise 5 Cortex A55 10TOPs算力 树莓派5 POE + PCIE M.2 NVME SSD固态硬盘 Pi5 2242/2230 Pi5以太网供电教程 数据手册 树莓派红外热像仪 树莓派RP2040 HM01B0 树莓派5 树莓派5云台 MPS2.5G树莓派5 PCIE转M.2 NVME SSD固态硬盘和2.5G以太网RJ45扩展板 树莓派红外热像仪 TVOC气体总挥发性有机化合物传感器兼容Arduino树莓派ESP32/Pico 0.99寸 Sipeed NanoCluster迷你集群板 数据中心 集群电脑 树莓派CM45 LM3H M4N 树莓派1.3寸IPS LCD扩展板 显示屏 教程 XIAO SAMD21超小SuperMini开发板Tiny兼容Arduino XIAO ESP32 S3超小SuperMini开发板Tiny兼容Arduino IDE 数据手册 7.5寸 NFC电子墨水屏V2标签相册名牌无须供电无线刷图 树莓派PICO键盘 Jetson Orin专用铝合金外壳 带摄像头支架迷你机箱 适用于Jetson Orin Nano和Jetson Orin NX套件 树莓派8.8寸LCD DSI显示屏MIPI触摸屏480x1920