Modbus RTU Relay 32CH

来自Waveshare Wiki
跳转至: 导航搜索

说明

Modbus RTU Relay
{{{name2}}}
{{{name3}}}
功能简介
特性 RS485 继电器模块
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
接口 RS485

用电安全注意事项

  • 本产品须由专业的电工或技术人员作业使用,使用过程中请做好用电安全,防漏电和绝缘等保护措施。
  • 在安装、维护或更换继电器设备之前,请务必关闭电源并拔下插头。
  • 请勿试图拆卸继电器设备,以免损坏设备或导致电击危险。
  • 请妥善安装放置继电器设备产品,请勿在潮湿、过热、易燃坏境中使用,避免因安装或使用不慎,引发安全事故。

硬件测试

RS485测试

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

Modbus-RTU-Relay-32CH-details-7.jpg

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

Modbus-RTU-Relay-2.png

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

Modbus-RTU-Relay-3.png

  • 详细的控制指令请查看请查看开发协议。

程序测试

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

树莓派

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

sudo raspi-config
选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口
L76X GPS Module rpi serial.png

然后重启树莓派:

sudo reboot

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

enable_uart=1

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

#dtoverlay=pi3-miniuart-bt

然后重启树莓派:

sudo reboot

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

sudo apt-get install unzip
wget https://www.waveshare.net/w/upload/7/74/Modbus_RTU_Relay_32CH_Code.zip
unzip Modbus_RTU_Relay_32CH_Code.zip
cd Modbus_RTU_Relay_32CH_Code/Python3
sudo python3 main.py

STM32

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

Arduino

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

开发协议

功能码介绍

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

寄存器地址介绍

地址(HEX) 地址存储内容 寄存器取值 权限 Modbus 功能码
0x0000
……
0x001F
道通1~通道32继电器地址 0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;
读/写 0x01,0x05,0x0F
0x00FF 操作全部继电器 0xFF00:继电器全部开启;
0x0000:继电器全部关闭;
0x5500:继电器全部翻转;
0x05
0x0100
……
0x011F
道通1~通道32继电器翻转地址 0xFF00:继电器翻转;
0x0000:继电器不变;
0x05,0x0F
0x01FF 操作全部继电器翻转 0xFF00:继电器全部翻转;
0x0000:继电器全部不变;
0x05
0x0200
……
0x021F
道通1~通道32继电器闪开 延时时间为数据*100ms
数值:0x0007,延时:7*100MS = 700MS
0x05
0x0400
……
0x041F
道通1~通道32继电器闪闭 延时时间为数据*100ms
数值:0x0007,延时:7*100MS = 700MS
0x05
4x2000 串口参数 高八位为校验方式:0x00~0x02
低八位为波特率方式:0x00~0x07
0x06
4x4000 设备地址 直接存储 Modbus 地址
设备地址:0x0001
0x03,0x06
4x8000 软件版本 转为十进制然后小数点左移两位即表示软件版本
0x0064 = 100 = V1.00
0x03

控制单个继电器

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

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

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

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
05 05指令 控制继电器指令
00 00 地址 要控制继电器寄存器地址,0x0000-0x001F
FF 00 指令 0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;
8C 3A CRC16 前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 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
05 05指令 控制继电器指令
00 FF 地址 固定0x00FF
FF 00 指令 0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;

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

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
05 05指令 控制继电器指令
00 FF 地址 固定0x00FF
FF 00 指令 0xFF00:继电器开启;
0x0000:继电器关闭;
0x5500:继电器翻转;
BC 0A CRC16 前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 20 3D D2

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
01 01指令 查询继电器状态指令
00 00 继电器起始地址 固定0x0000
00 10 继电器数量 固定0x0020
3D D2 CRC16 前 6 字节数据的 CRC16 校验和

返回码:01 01 04 00 00 00 00 FB D1

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

示例:

[1号地址设备]

发送 : 01 01 00 00 00 20 3D D2
返回 : 01 01 04 00 00 00 00 FB D1 //全部继电器关闭
发送 : 01 01 00 00 00 20 3D D2
返回 : 01 01 04 00 00 00 01 3A 11 //0号继电器开启,其余继电器关闭
发送 : 01 01 00 00 00 20 3D D2
返回 : 01 01 04 00 00 00 41 3B E1 //0、6号继电器开启,其余继电器关闭

写继电器状态

发送码:01 0F 00 00 00 20 04 FF FF FF FF C5 1C

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
0F 0F指令 写继电器状态指令
00 00 继电器起始地址 固定 0x0000
00 20 继电器数量 固定 0x0020
04 字节数量 固定 0x04
FF FF FF FF 继电器状态 Bit0:控制第一个继电器;
Bit1:控制第二个继电器;
Bit2:控制第三个继电器;
……
Bit31:控制第三十一个继电器;
C5 1C CRC16 前 6 字节数据的 CRC16 校验和

返回码:01 0F 00 00 00 20 54 13

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
0F 0F指令 全部寄存器控制指令
00 00 地址 固定0x0000
00 20 继电器数量 固定 0x0010
54 13 CRC16 前 6 字节数据的 CRC16 校验和

示例:

[1号地址设备]

继电器全部开启 : 01 0F 00 00 00 20 04 FF FF FF FF C5 1C
继电器全部关闭 : 01 0F 00 00 00 20 04 00 00 00 00 C4 88
0-1开;3-15关 : 01 0F 00 00 00 20 04 00 00 00 03 84 89

继电器闪开闪闭指令

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

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

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

字段 含义 备注
01 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
05 05指令 单个控制指令
02 指令 02 为是闪开指令,04为闪闭指令
00 继电器地址 要控制继电器地址,0x00~0x1F
00 07 间隔时间 延时时间为数据*100ms
数值:0x0007,延时:7*100MS = 700MS
8D B0 CRC16 前 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 06 20 00 00 05 43 D8

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
20 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 校验方式 0x00为无校验,0x01为偶检验,0x02为奇校验
05 波特率数值 波特率数值对应
0x00 : 4800
0x01 : 9600
0x02 : 19200
0x03 : 38400
0x04 : 57600
0x05 : 115200
0x06 : 128000
0x07 : 256000
43 D8 CRC16 前 6 字节数据的 CRC16 校验和

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

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
20 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 校验方式 0x00为无校验,0x01为奇检验,0x02为偶校验
05 波特率 波特率数值对应
0x00 : 4800
0x01 : 9600
0x02 : 19200
0x03 : 38400
0x04 : 57600
0x05 : 115200
0x06 : 128000
0x07 : 256000
43 D8 CRC16 前 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表示设备地址
06 06指令 设置波特率,设备地址
40 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 01 设备地址 设置的设备地址,0x0001-0x00FF
5C 1B CRC16 前 6 字节数据的 CRC16 校验和

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

字段 含义 备注
00 设备地址 0x00表示广播地址;0x01-0xFF表示设备地址
06 06指令 设置波特率,设备地址
40 00 指令寄存器 0x2000为设置波特率,0x4000为设置设备地址
00 01 设备地址 设置的设备地址,0x0001-0x00FF
5C 1B CRC16 前 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表示设备地址
03 03指令 读取设备地址指令
40 00 指令寄存器 0x4000为读取设备地址,0x8000为读取软件版本
00 01 字节数 固定0x0001
90 1B CRC16 前 6 字节数据的 CRC16 校验和

返回码:01 03 02 00 01 79 84

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

示例:

[1号地址设备]

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

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

发送 : 00 03 40 00 00 01 90 1B
返回 : 03 03 02 00 03 81 85 //地址0x03

读取软件版本指令

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

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

返回码:01 03 02 00 64 B9 AF

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


0x0064 = 100 = V1.00

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

示例:

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

FAQ



FAQ


  • 多系统兼容,支持Win7/8/8.1/10/11、Mac、Linux、Android、WinCE等系统。



  • 支持USB转RS232、RS485或TTL ;
  • 不支持 RS232、RS485、TTL 同时转 USB
  • RS232,RS485和TTL不能互转


  • 不支持,RS232,RS485和TTL不能互转,支持USB转RS232,RS485或者TTL。


  • TTL和 RS232 为全双工通信,可以将RXD和TXD短接起来测试,RS485 是半双工通信,可以外接一个USB 转 RS485 设备测试,下图是回环测试TTL:

USB-TO-RS232-485-TTL-TTL.png SSCOM TTL.png


VCC是供电引脚, 可以通过开关切换5V或3.3V(50mA)对接入的设备供电,如果设备已经有别的外部电源供电,可以不接VCC。



  • 该模块本身不支持Modbus,支持接板载RS485接口的Modbus设备使用,如下图:

Usb-485-modbus.png

  • Modbus 是一种通信协议,主要用于工业自动化领域的设备之间的通信。RS485 是 Modbus 常用的物理层传输方式之一。因此,支持 RS485 接口的转换器/组件(当然包括USB TO RS485)通常也可以支持 Modbus 协议。
  • 不过,模块只是提供了物理层的转换,也就是将USB接口转换为RS485接口,而Modbus通信需要在协议层进行实现。
  • 在理解 Modbus 协议时,需要了解 Modbus 的功能码和数据格式。Modbus 有多种功能码,每个功能码对应一种操作,例如读取线圈状态、读取输入状态、读取保持寄存器等,
  • 更多细节:请参考接到Modbus温度传感器例程


可以不接GND使用,接GND信号可能会更稳定,连接GND以获得更好的性能、可靠性和抗干扰能力,长距离通信的话,建议还是接上GND。

技术支持


联系人:林工
EMAIL:services@waveshare.net
电话:0755-83040712
QQ:3004506335
微信:扫下方二维码添加
Lxw.jpg

说明:进行售后服务前,请准备好客户信息(定货单位、定货人等),以供验证