RS485 Modbus Relay PRO
| ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
产品概述
- 继电器是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
产品特点
1. Modbus RTU 常用功能码简介
功能码 | 功能 | 可操作地址 | 位/字操作 | 可操作数量 |
---|---|---|---|---|
01 | 读取线圈状态 | 0000H–0040H | 位操作 | 单个或多个 |
03 | 读取保持寄存器 | 0000H–008FH | 字操作 | 单个或多个 |
05 | 操作单个线圈 | 0000H–0040H | 位操作 | 单个 |
06 | 写单个保持寄存器 | 0000H–008FH | 字操作 | 单个 |
0F | 操作多个线圈 | 0000H–0040H | 位操作 | 多个 |
10 | 写多个保持寄存器 | 0000H–008FH | 字操作 | 多个 |
2. Modbus RTU 在线计算校验码网站
3. CRC 计算代码(C 语言)
uint16_t factory_crc16(uint8_t* bufData, uint16_t buflen)
{
uint16_t TCPCRC = 0xffff;
uint16_t POLYNOMIAL = 0xa001;
uint8_t i, j;
for (i = 0; i < buflen; i++)
{
TCPCRC ^= bufData[i];
for (j = 0; j < 8; j++)
{
if ((TCPCRC & 0x0001) != 0)
{
TCPCRC >>= 1;
TCPCRC ^= POLYNOMIAL;
}
else
{
TCPCRC >>= 1;
}
}
}
return TCPCRC;
}
目录
4. 通讯参数(默认)
- 波特率:9600(可选:1200/2400/4800/19200/38400/115200) - 数据位:8 - 校验:N(无校验,可选 E/O) - 停止位:1(若使用奇/偶校验通常为 1,若无校验也可为 2) - 从站地址(Slave ID):1(范围 1–247) - 接口:RS-485,半双工,A/B 差分 - 协议:Modbus RTU
注:以上为常见默认值,实际以设备面板/拨码/寄存器设定为准。
5. 接线说明
- A 接线端子接到上位机/网关的 A(DI+) - B 接线端子接到上位机/网关的 B(DI-) - 建议在总线末端加 120Ω 终端电阻 - 多机并联时注意拓扑尽量总线型,避免星型 - 屏蔽层单端接地,通信线使用双绞线
6. 地址约定与示例
以下为常见“继电器输出线圈”和“参数寄存器”的示例地址分配,实际请以设备固件文档为准。
6.1 线圈(Coils,位操作,功能码 01/05/0F)
- 线圈地址基址:0000H - 典型 8 路继电器示例:
通道 | 线圈地址(十六进制) | 说明 |
---|---|---|
Relay1 | 0000H | 输出通道 1 开/关 |
Relay2 | 0001H | 输出通道 2 开/关 |
Relay3 | 0002H | 输出通道 3 开/关 |
Relay4 | 0003H | 输出通道 4 开/关 |
Relay5 | 0004H | 输出通道 5 开/关 |
Relay6 | 0005H | 输出通道 6 开/关 |
Relay7 | 0006H | 输出通道 7 开/关 |
Relay8 | 0007H | 输出通道 8 开/关 |
6.2 保持寄存器(Holding Registers,字操作,功能码 03/06/10)
- 寄存器地址示例范围:0000H–008FH - 常见参数示例(按需调整为设备实际):
地址(十六进制) | 名称 | 数据类型 | 单位/范围 | 说明 |
---|---|---|---|---|
0000H | 设备波特率 | uint16 | 枚举 | 1=1200,2=2400,3=4800,4=9600,5=19200,6=38400,7=115200 |
0001H | 校验模式 | uint16 | 枚举 | 0=None,1=Odd,2=Even |
0002H | 从站地址 | uint16 | 1–247 | 修改后重启或生效条件见设备说明 |
0010H | 通道1 脉冲宽度 | uint16 | ms | 置 05/0F 打开后可自动延时断开(如支持) |
0011H | 通道2 脉冲宽度 | uint16 | ms | — |
0018H | 通道1 上电默认 | uint16 | 0/1 | 上电初始状态(0=OFF,1=ON)如支持 |
0019H | 通道2 上电默认 | uint16 | 0/1 | — |
7. 帧格式(Modbus RTU)
- 请求/响应均为:地址(1B)+ 功能码(1B)+ 数据域(N B)+ CRC16(低字节在前,高字节在后) - 帧间静默:≥3.5 字节时间 - CRC 多项式:0xA001,初值 0xFFFF,低字节在先
8. 功能码与示例
8.1 读取线圈状态(功能码 01)
用途:读取继电器通道 ON/OFF。 - 请求:地址 1,读起始 0000H,数量 8
01 01 00 00 00 08 CRC_L CRC_H
- 响应示例(8 路,低位对应起始地址):
01 01 01 3F CRC_L CRC_H
说明:3Fh=00111111b 表示通道1~6=1,7~8=0(示例)。
8.2 读取保持寄存器(功能码 03)
读取参数寄存器。 - 请求:读地址 0002H(从站地址),数量 1
01 03 00 02 00 01 CRC_L CRC_H
- 响应示例:
01 03 02 00 01 CRC_L CRC_H
表示当前从站地址=1。
8.3 单线圈写入(功能码 05)
控制单个继电器开/关。 - 打开通道1(地址 0000H):
01 05 00 00 FF 00 CRC_L CRC_H
- 关闭通道1:
01 05 00 00 00 00 CRC_L CRC_H
响应一般回显请求。
8.4 多线圈写入(功能码 0F)
同时设置多个通道。 - 将通道1~8 设置为 1100 0011b(低位为通道1):
01 0F 00 00 00 08 01 C3 CRC_L CRC_H
说明:01=后续字节数,C3h=1100 0011b。
8.5 单保持寄存器写入(功能码 06)
- 将从站地址改为 2(写地址 0002H):
01 06 00 02 00 02 CRC_L CRC_H
8.6 多保持寄存器写入(功能码 10)
- 一次写 2 个寄存器(地址 0000H 起):
01 10 00 00 00 02 04 00 04 00 01 CRC_L CRC_H
说明:将波特率=9600(枚举4),校验=None(0)。
9. 异常响应
当请求非法或超出范围,设备以异常码响应: - 帧格式:地址 + (功能码 | 0x80) + 异常码 + CRC - 常见异常码:
异常码 | 名称 | 含义 |
---|---|---|
01 | ILLEGAL FUNCTION | 不支持的功能码 |
02 | ILLEGAL DATA ADDRESS | 地址不合法 |
03 | ILLEGAL DATA VALUE | 数据值不合法 |
04 | SLAVE DEVICE FAILURE | 从站故障 |
10. 通信时序与可靠性建议
- 帧间隔:主站发送帧与下一帧间,应等待从站响应或超时(典型 100–500 ms,按应用优化) - 帧内静默:RTU 要求帧内静默间隔 < 1.5 字节时间;帧与帧之间 ≥ 3.5 字节时间 - 半双工切换:发送完成到接收前需考虑收发切换延时 - 终端电阻:总线末端建议 120Ω,并可视线长与速率增加匹配电阻/偏置电阻 - 线缆:推荐双绞屏蔽线;远距离/高干扰环境降低波特率
11. CRC 说明与示例
- 多项式:0xA001(即 x^16 + x^15 + x^2 + 1) - 初值:0xFFFF - 输入每字节先与低字节异或,再移位/异或多项式,低位在先 - 附示例数据计算(不含 CRC 字节):
示例帧:01 05 00 00 FF 00
计算结果:CRC_L CRC_H = 0x8C 0x3A(示例)
注:不同示例会有不同 CRC,请以在线工具或代码计算为准。
12. 快速测试
- 读 8 路线圈状态:
01 01 00 00 00 08 CRC_L CRC_H
- 打开通道1:
01 05 00 00 FF 00 CRC_L CRC_H
- 多路写入(1~8 = 1100 0011):
01 0F 00 00 00 08 01 C3 CRC_L CRC_H
13. 常见问题排查
- 无响应:
- 检查从站地址、波特率、校验位是否与主站一致 - 检查 A/B 线是否接反;总线是否有终端电阻 - 增大主站超时与重试次数
- CRC 错误:
- 确认 CRC 低字节在前;确认帧内无额外空格/分隔符 - 降低波特率尝试,检查屏蔽接地
- 偶发丢帧:
- 延长帧间隔,优化收发切换时序 - 排查供电与共地问题
注意事项
- 控制继电器时若出现发送指令无法控制的情况,可以尝试以下操作
- 在控制指令之间加入一条清除指令:0d 0a 0d 0a 0d 0a 0d 0a
- 指令之间的延时需要大于20ms
- 继电器的输出端相当于一个电子开关,本身是不输出电流电压的
- 当继电器输出端接入的负载功率较大或负载类型为感性负载等情况时,建议在负载端加入一个RC吸收回路,在降低通断过程对继电器触点产生的干扰
上位机测试
- 连接串口
- 将继电器模块与USB转485模块相连,连接方式:A - A,B - B。GND可不接
- 打开上位机软件
- 设置通信ID
- 操作继电器
- 调试功能
Modbus RTU指令简介
Modbus设备通过接收来自外部控制端(如:上位机/MCU)的Modbus RTU指令来执行相关操作,一帧指令一般由设备地址、功能码、寄存器地址、寄存器数据、校验码组成,帧长度和功能码有关。一般每帧数据的首字节为设备地址,可设置范围为1-255,默认255(即0xFF),最后2字节为CRC校验码。
假设设备地址为255,则常用的Modbus RTU指令如下:详情请查看模块使用说明
- 打开1号继电器
发送: FF 05 00 00 FF 00 99 E4 原样返回:FF 05 00 00 FF 00 99 E4
备注1:发送帧的第3--4个字节代表继电器地址,继电器1--继电器8的地址分别为0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007
备注2:发送帧的第5--6个字节代表数据,0xFF00代表打开继电器,0x0000代表关闭继电器
- 关闭1号继电器
发送: FF 05 00 00 00 00 D8 14 原样返回:FF 05 00 00 00 00 D8 14
- 打开所有继电器
发送:FF 0F 00 00 00 08 01 FF 30 1D 返回:FF 0F 00 00 00 08 41 D3
- 关闭所有继电器
发送:FF 0F 00 00 00 08 01 00 70 5D 返回:FF 0F 00 00 00 08 41 D3
- 设置设备地址为255
发送:00 10 00 00 00 01 02 00 FF EB 80 原样返回:00 10 00 00 00 01 02 00 FF EB 80
备注:发送帧的第8和第9个字节0x00FF为写入的设备地址
- 读取设备地址 255
发送:00 03 00 00 00 01 85 DB 返回:00 03 02 00 FF C5 C4
备注:返回帧的第4个和第5个字节0x00FF为读取到的设备地址
- 设置波特率为9600
发送: FF 10 03 E9 00 01 02 00 03 8B CC 返回: FF 10 03 E9 00 01 C5 A7
- 读取继电器状态
发送: FF 01 00 00 00 08 28 12 返回: FF 01 01 01 A1 A0
生成校验码
模块指令通过现成的上位机软件来发送时,CRC校验码是自动生成的,如果想使用串口调试软件(如SSCOM)来测试Modbus继电器模块时就需要手动生成CRC校验码放在发送帧的末尾,比如打开第1路继电器(手动模式):
- 打开/关闭继电器(手动模式)的发送帧组成为:设备地址(1Byte)+功能码(1Byte)+寄存器地址(2Byte)+寄存器数据(2Byte)+CRC校验码(2Byte)
- 假设设备地址为0xFF, 则发送帧的前6个字节为:FF 05 00 00 FF 00
- 使用CRC校验工具对这6个字节求校验码:http://www.ip33.com/crc.html
- 交换校验计算结果E499的高低字节位置后得到CRC校验码99E4,以及完整的发送帧:FF 05 00 00 FF 00 99 E4
- 将该发送帧通过串口调试软件SSCOM V5.13.1发送到Modbus继电器模块即可打开第一路继电器(手动模式),如下:
参考资料
注意事项
- 电源与负载请在参数范围内使用,请勿超范围使用。
- 额定负载和寿命是一个参考值,会根据不同的环境因素负载性质与种类而有较大不同,因此最好在实际或模拟实际的使用中进行确认。
- 模块的负载能力受环境温度和自身温升的影响较大,需依据实际工作环境条件利用空气对流散热即可,要求安装在有良好对流环境。
- 高温下的电耐久性:模块在高温下使用时,电耐久性会比常温下使用要低,所以请在实际使用中进行确认。
FAQ
|