目录
modbus RTU通讯协议:
pmbus通讯协议:
modbus RTU通讯协议:
主要应用功能:
规范了软件变量,访问功能码,给不同工程师开发的不同产品有统一的通讯标准
帧结构简单,占用带宽少,编程简单,通讯响应速度快,可以适配别家公司通讯上位机。
一主机多从机(可达247),有crc校验功能,对工业控制领域有着极好的适应性。
传输异常从设备会告知主设备
参考资料:
变量类型:
线圈(Coils) | 用于表示设备的开/关状态,通常控制输出(如电机启停、灯开关等) | 1 位 | 读/写(可读和可写) | 读取:0x01 写入: 0x05 , 0x0F |
离散输入(Discrete Inputs) | 用于表示设备的输入状态(如传感器、按钮等),只读 | 1 位 | 只读 | 读取:0x02 |
保持寄存器(Holding Registers) | 用于存储设备的控制参数、配置数据或实时数据(如温度、湿度、速度等) | 16 位(2 字节) | 读/写(可读和可写) | 读取:0x03 写入: 0x06 , 0x10 |
输入寄存器(Input Registers) | 用于存储设备的输入数据(如传感器测量值),只读 | 16 位(2 字节) | 只读 | 读取:0x04 |
功能码:
0x01 | 读取线圈(Read Coils) | 读取指定范围内的线圈状态(0 或 1) | 只读 | 二进制数据(线圈) |
0x02 | 读取离散输入(Read Discrete Inputs) | 读取指定范围内的离散输入状态(0 或 1) | 只读 | 二进制数据(离散输入) |
0x03 | 读取保持寄存器(Read Holding Registers) | 读取指定范围内的保持寄存器数据(16位寄存器的值) | 只读 | 16位数据(保持寄存器) |
0x04 | 读取输入寄存器(Read Input Registers) | 读取指定范围内的输入寄存器数据(16位寄存器的值) | 只读 | 16位数据(输入寄存器) |
0x05 | 写单个线圈(Write Single Coil) | 写入单个线圈的状态(0 或 1) | 读/写 | 二进制数据(线圈) |
0x06 | 写单个保持寄存器(Write Single Register) | 写入单个保持寄存器的值(16位数据) | 读/写 | 16位数据(保持寄存器) |
0x0F | 写多个线圈(Write Multiple Coils) | 写入多个线圈的状态(多个 0 或 1) | 读/写 | 二进制数据(线圈) |
0x10 | 写多个保持寄存器(Write Multiple Registers) | 写入多个保持寄存器的值(多个 16位数据) | 读/写 | 16位数据(保持寄存器) |
物理接口规范
-
Modbus RTU通信通常基于RS-232或RS-485串行通信标准,这些标准决定了数据传输的电气特性。为保证设备间正确的物理连接和数据传输,必须清楚接口规范。
-
RS-232:适用于短距离通信,通常用于单一设备通信。
-
RS-485:适用于长距离、高噪声环境,并且支持多从机的通信。Modbus RTU协议常用RS-485进行设备间通信。
注意点:
地址空间设计
-
合理规划地址:Modbus协议有不同的地址空间(线圈、离散输入、保持寄存器、输入寄存器),每个设备的每种类型数据都有其特定的地址范围。需要根据项目需求合理规划每个变量的地址,避免地址冲突。
- 线圈(Coils):地址范围 0x0000 - 0x07FF
- 离散输入(Discrete Inputs):地址范围 0x1000 - 0x17FF
- 保持寄存器(Holding Registers):地址范围 0x4000 - 0x47FF
- 输入寄存器(Input Registers):地址范围 0x3000 - 0x37FF
-
设备地址唯一性:每个从设备都应该有唯一的地址(通常为1-247),主设备通过该地址来区分不同的从设备。
通信速率和超时设置
- 波特率设置:确保通信中主机和从机的波特率(例如9600、19200等)一致,以保证数据的稳定传输。
- 超时设置:Modbus是一个实时协议,主机和从机之间的通信应该考虑适当的超时时间。过短的超时时间可能导致通信失败,而过长的超时时间会影响系统的响应性。
- 重试机制:在网络不稳定时,可能会出现通讯中断,设计时要有重试机制,以防止丢失重要数据。
错误检测与处理
- CRC校验:Modbus RTU 使用 CRC(循环冗余校验) 来检查数据传输过程中是否发生错误。确保在开发中正确实现CRC算法。
- 错误码:Modbus协议会返回错误码,主机需要根据返回的错误码进行相应的处理。常见错误码包括:
- 0x01:非法功能码
- 0x02:非法数据地址
- 0x03:非法数据值
- 0x04:设备故障
数据类型和格式
- 数据类型的转换:Modbus协议传输的数据是以16位寄存器为单位的,对于不同的应用场景,可能需要对数据进行字节顺序转换(如大端/小端)和数据类型转换(如浮点数、整型数等)。
- 大端/小端问题:注意Modbus采用大端格式(高字节在前),但在某些平台或语言环境下,可能需要转换为小端格式(低字节在前)。例如,如果从机传输浮点数,需要将两个寄存器的数据合并为一个32位浮点数。
并发与多从机支持
- 一主机多从机:Modbus协议支持一主机与多从机的通信,最大支持247个从机。如果项目需要同时控制多个从设备,需要特别注意:
- 每个从设备的地址应唯一。
- 主机需要按照一定的顺序与从设备通信,以防止总线冲突。
- 考虑到从设备响应时间可能不同,要在程序中设置合理的延时,以确保稳定的通信。
干扰和噪声
- 噪声干扰:Modbus RTU通常在串口上工作,可能会受到电磁干扰(EMI)。确保使用的串口线缆和连接器能够有效屏蔽干扰,同时合理布置通信线路,避免长距离传输。
- 信号衰减:如果通信距离较长(特别是RS-485),需要考虑信号衰减的问题,可能需要使用信号增强设备(如RS-485信号放大器)。
系统可靠性
- 冗余设计:对于重要的控制系统,考虑冗余设计。例如,在主机或从机故障时,系统能够自动切换到备用系统,保证项目的高可用性。
- 通信丢失处理:设计通信丢失或数据丢失后的恢复机制,例如超时重试或自动重启功能,以确保设备在通讯中断后能尽快恢复正常。
pmbus通讯协议:
主要应用功能:
专门用于电源管理系统中的电源设备之间的数字化通信,如电源模块、监控芯片和电池管理系统等
基于iic硬件外设通讯,一主多从,100k~3.4mbps,可多主机(需引入仲裁机制,无优先级)
参考资料:
帧格式:
读:
START(起始条件) | 1 | 起始信号,表示通信开始(SDA拉低,SCL保持高电平)。 |
从设备地址 | 1 | 7位设备地址 + 1位读标志(1表示读操作)。 |
命令字节 | 1 | 主设备指定的命令字节,表示需要执行的读取操作(例如读取电压)。 |
ACK | 1 | 发送命令字节后,接收方发送ACK应答,表示命令字节已正确接收。 |
数据字节 | N | 从设备返回的数据字节,通常是多个字节(例如电压、温度等)。 |
NACK | 1 | 数据接收完毕后,主设备发送NACK,告诉从设备停止数据传输。 |
STOP(停止条件) | 1 | 停止信号,表示通信结束,SDA从低电平跳到高电平,SCL保持高电平。 |
写:
START(起始条件) | 1 | 起始信号,表示通信开始(SDA拉低,SCL保持高电平)。 |
从设备地址 | 1 | 7位设备地址 + 1位写标志(0表示写操作)。 |
命令字节 | 1 | 主设备指定的命令字节,表示需要执行的操作(例如设置电压)。 |
数据字节 | N | 根据命令,传输1到多个字节的数据(例如设置输出电压)。 |
ACK | N | 每个字节传输后,接收方发送ACK应答,表示该字节已正确接收。 |
STOP(停止条件) | 1 | 停止信号,表示数据传输完毕,SDA从低电平跳到高电平,SCL保持高电平。 |
常见变量定义表格
变量名称 | 作用 | 命令字节 | 内存大小 | 单位 | 说明 |
---|---|---|---|---|---|
VOUT (输出电压) | 电源模块的输出电压 | 0x21 | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置或读取电源的输出电压。 |
IOUT (输出电流) | 电源模块的输出电流 | 0x22 | 2 | 毫安(mA) | 包含低字节和高字节,用于设置或读取电源的输出电流。 |
VIN (输入电压) | 电源模块的输入电压 | 0x23 | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置或读取电源的输入电压。 |
POUT (输出功率) | 电源模块的输出功率 | 0x24 | 2 | 毫瓦(mW) | 包含低字节和高字节,用于读取电源的输出功率。 |
TEMP (温度) | 电源模块的温度 | 0x86 | 2 | 摄氏度(℃) | 包含低字节和高字节,表示电源的当前温度值。 |
FAULT_STATUS (故障状态) | 电源模块的故障状态 | 0x78 | 1 | 无单位 | 一个字节的状态字,表示电源模块的当前故障状态。 |
STATUS_WORD (状态字) | 电源模块的综合状态,包括过流、过压、欠压等故障信息 | 0x03 | 2 | 无单位 | 包含低字节和高字节,表示电源的状态(包括故障标志)。 |
CONTROL (控制) | 电源的控制命令,开启、关闭或重启电源等操作 | 0x01 | 1 | 无单位 | 一个字节,表示电源的控制命令,如启动、关闭电源等操作。 |
TON_DELAY (开机延迟) | 电源的开机延迟时间 | 0x31 | 2 | 毫秒(ms) | 包含低字节和高字节,表示开机延迟的时间,单位为毫秒。 |
TOFF_DELAY (关机延迟) | 电源的关机延迟时间 | 0x32 | 2 | 毫秒(ms) | 包含低字节和高字节,表示关机延迟的时间,单位为毫秒。 |
VOUT_OV_FAULT_LIMIT (输出电压过压保护限制) | 设置输出电压的过压保护阈值 | 0x45 | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置输出电压的过压保护阈值。 |
VOUT_UV_FAULT_LIMIT (输出电压欠压保护限制) | 设置输出电压的欠压保护阈值 | 0x46 | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置输出电压的欠压保护阈值。 |
IOUT_OC_FAULT_LIMIT (输出电流过流保护限制) | 设置输出电流的过流保护阈值 | 0x47 | 2 | 毫安(mA) | 包含低字节和高字节,用于设置输出电流的过流保护阈值。 |
IOUT_UC_FAULT_LIMIT (输出电流欠流保护限制) | 设置输出电流的欠流保护阈值 | 0x48 | 2 | 毫安(mA) | 包含低字节和高字节,用于设置输出电流的欠流保护阈值。 |
VIN_OV_FAULT_LIMIT (输入电压过压保护限制) | 设置输入电压的过压保护阈值 | 0x49 | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置输入电压的过压保护阈值。 |
VIN_UV_FAULT_LIMIT (输入电压欠压保护限制) | 设置输入电压的欠压保护阈值 | 0x4A | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置输入电压的欠压保护阈值。 |
VOUT_OV_WARN_LIMIT (输出电压过压警告阈值) | 设置输出电压的过压警告阈值 | 0x59 | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置输出电压的过压警告阈值。 |
VOUT_UV_WARN_LIMIT (输出电压欠压警告阈值) | 设置输出电压的欠压警告阈值 | 0x5A | 2 | 毫伏(mV) | 包含低字节和高字节,用于设置输出电压的欠压警告阈值。 |
IOUT_OC_WARN_LIMIT (输出电流过流警告阈值) | 设置输出电流的过流警告阈值 | 0x5B | 2 | 毫安(mA) | 包含低字节和高字节,用于设置输出电流的过流警告阈值。 |
IOUT_UC_WARN_LIMIT (输出电流欠流警告阈值) | 设置输出电流的欠流警告阈值 | 0x5C | 2 | 毫安(mA) | 包含低字节和高字节,用于设置输出电流的欠流警告阈值。 |
MFR_TEMP (制造商温度) | 读取设备的温度,通常与故障或状态有关 | 0x86 | 2 | 摄氏度(℃) | 包含低字节和高字节,用于查询设备的温度。 |
MFR_VIN (制造商输入电压) | 读取设备的输入电压值 | 0x87 | 2 | 毫伏(mV) | 包含低字节和高字节,用于查询设备的输入电压。 |
MFR_VOUT (制造商输出电压) | 读取设备的输出电压值 | 0x88 | 2 | 毫伏(mV) | 包含低字节和高字节,用于查询设备的输出电压。 |
MFR_IOUT (制造商输出电流) | 读取设备的输出电流值 | 0x89 | 2 | 毫安(mA) | 包含低字节和高字节,用于查询设备的输出电流。 |
MFR_POWER (制造商功率) | 读取设备的输出功率值 | 0x8B | 2 | 毫瓦(mW) | 包含低字节和高字节,用于查询设备的输出功率。 |
仲裁机制:
在iic多主机通信时,因为总线同一时间内只能有一个设备在发数据,这个时候就需要引入仲裁机制,在多设备同时通讯时,最后只留下1个设备,其余设备下次再竞争。简单来说,假设有AB两个设备同时往数据线SDA上发送数据,它们都会实时监控线路上的电平,来确保数据是否发送正确,当A设备发送1,B设备发送0,这时SDA上就会是0(因为低电平有更强的驱动能力),此时A设备就会知道数据线有其他设备在用,将不再发送数据,等待下一次数据线空闲,即使有n多个设备在竞争,都是从头一个一个位开始竞争,谁出0时,其他出1的都自动退出竞争(等待下一次),直到只剩一个设备在发数据。
仲裁的详细步骤如下:
-
数据传输的启动:
- 在I²C总线上的多个主设备同时尝试发送数据时,它们都会生成时钟信号(SCL)并开始通过SDA线发送数据位(bit)。
-
总线监控:
- 每个主设备都会在每一位数据发送时实时监控SDA线的电平,确保它发送的数据与总线上实际的电平一致。
- SDA线的电平是由主设备驱动的。当主设备向总线发送数据时,它会拉低(0)或拉高(1)SDA线。
-
发生冲突时的检测:
- 如果一个主设备试图向总线发送
1
(拉高SDA),而另一个主设备却试图发送0
(拉低SDA),就发生了冲突。 - 监测到冲突:在这个过程中,每个主设备都会监听到SDA线上的实际状态。如果它发送的数据与SDA线的状态不一致,说明有其他主设备正在控制总线,因此发生了冲突。
- 如果一个主设备试图向总线发送
-
决定仲裁优先级:
- SDA线上的状态决定优先级:在I²C协议中,低电平(
0
)具有更高的优先级,原因是SDA线由主设备拉低时,电流驱动较强。 - 如果一个主设备发现SDA线上的电平与自己预期的不同,它就会停止数据传输,放弃对总线的控制,并让其他主设备继续控制总线。
- SDA线上的状态决定优先级:在I²C协议中,低电平(
-
放弃与重试:
- 当发生冲突时,失败的主设备会立刻停止传输,退出当前的总线控制,并等待一段随机时间后重新尝试访问总线。
- 胜出的主设备将继续占用总线,完成其数据传输。
iic通讯原理:
I²C通信基于主从(Master-Slave)模型,通信过程中包含两个主要角色:
- 主设备(Master):发起通信、控制时钟和数据流的设备。
- 从设备(Slave):响应主设备请求的设备。
I²C的时序
I²C的数据传输是基于时钟(SCL)控制的同步通信。数据(SDA)在时钟的控制下同步传输,时钟由主设备提供。具体的数据传输过程如下:
-
起始条件(START):
- 主设备拉低 SDA 线,在 SCL 高电平时发出起始信号。
- 起始条件标志着通信的开始。
-
从设备地址和读/写操作:
- 主设备会发送一个包含从设备地址和读/写标志位的数据。设备地址通常是7位或10位(通常是7位)。
- 读/写标志位(R/W):0 表示写操作,1 表示读操作。
-
数据传输:
- 数据按字节(8位)进行传输,SDA 在 SCL 的上升沿采样,每传输一个字节时都要保证 SDA 在时钟的上升沿之前保持稳定。
-
应答信号(ACK/NACK):
- 每次发送一个字节后,接收方(无论是主设备还是从设备)必须发送一个应答信号 ACK 或 NACK,表示数据是否成功接收。
-
停止条件(STOP):
- 主设备通过拉高 SDA 线,在 SCL 高电平时发出停止信号,表示通信结束。
什么是ACK和NACK
ACK(Acknowledge)和 NACK(No Acknowledge)是I²C通信中至关重要的信号,它们在每个字节传输后,接收方(无论是主设备还是从设备)都会对接收到的字节进行确认。
ACK(应答信号)
ACK 是接收方对发送的字节的确认,表示数据字节已成功接收。具体来说:
- ACK信号 是通过 SDA 线在 SCL 时钟上升沿时传递的。
- 在接收到数据字节后,接收方会将 SDA 拉低(0),表示已正确接收数据。
过程:
- 主设备或从设备发送完一个字节的数据后,接收方(无论是主设备还是从设备)必须发送 ACK 信号。
- 如果接收方已经接收到数据并准备好接收下一个字节,SDA 被拉低。
例子:
- 主设备发送设备地址后,从设备返回 ACK,表示设备地址已接收并准备好与主设备通信。
- 主设备发送数据字节后,从设备返回 ACK,表示数据字节已成功接收。
NACK(不应答信号)
NACK 是接收方对数据传输的否定响应,表示接收到的字节没有被正确接收,或者接收方已经不再准备接收更多数据。通常,NACK 用来标识通信结束或数据传输失败。
过程:
- 接收方在接收到字节后,拉高 SDA(1)表示 NACK,表明不再接收数据。
- 在读取数据时,主设备通过发送 NACK 信号来结束数据接收,指示接收过程已经完成。
例子:
- 主设备在读取数据时,读取完所有期望的字节后,会发送 NACK,表示不再继续读取。
- 如果从设备出现错误或无法接收数据,可能会发送 NACK。
详细时序示例:如何理解ACK/NACK
我们通过具体的时序图来理解 ACK 和 NACK 的工作原理。以下是数据传输的时序图:
ACK的时序
假设主设备向从设备发送数据字节,接收方(从设备)通过 ACK 确认接收到数据字节。
SCL: ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
SDA: → → → → → ← ← → 数据字节 ACK
- SCL:时钟线(每个上升沿同步采样数据)。
- SDA:数据线。
- 数据字节:主设备或从设备发送的8位数据。
- ACK:接收方通过将 SDA 拉低来发送 ACK(表示字节已正确接收)。
NACK的时序
如果主设备或从设备不再需要接收更多数据,它会通过 NACK 来终止数据传输。
SCL: ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
SDA: → → → → → → → ↑ 数据字节 NACK
- NACK:接收方通过将 SDA 拉高来发送 NACK(表示不再接收数据)。
典型读写操作
在主设备读取数据的情况下,主设备会在最后一个数据字节后发送 NACK,然后发送 STOP 信号,结束通信。
主设备读取数据的过程:
- 发送命令字节(例如设备地址),接收方发送 ACK。
- 读取数据字节,接收方发送 ACK,表示继续传输数据。
- 读取完最后一个字节,接收方发送 NACK,表示结束读取。
- 主设备发送 STOP 信号,表示通信结束。
注意点:
1. 协议的兼容性和设备选择
- 设备兼容性:首先确保所选的PMBus设备支持所需的命令和功能。不同的电源管理设备可能实现了不同的PMBus命令集或具有不同的功能扩展。
- 地址设置:PMBus设备通常通过硬件配置(如跳线或拨码开关)或软件配置来设置设备地址。确保主设备能够正确识别从设备的地址。
- 支持的PMBus版本:PMBus协议有多个版本(如1.1、1.2、2.0等),不同版本的设备支持的命令集和功能可能有所不同。确保你的主设备和从设备兼容同一版本。
2. 通信速率和时序
- 时钟频率(SCL):PMBus通常基于I²C通信协议,因此时钟频率需要考虑通信速率的要求。I²C的标准频率为100 kHz(标准模式),快速模式为400 kHz。如果设备支持高速通信,可能需要选择合适的速率。
- 时序和响应时间:PMBus的通信帧可能需要一定的时间来处理和响应。在进行通信时,需要考虑每个命令的处理时间以及从设备的响应时间,尤其是在高速传输时,确保每个数据字节都能被正确读取。
3. 电源噪声和信号完整性
- 电源噪声:PMBus设备通常涉及电源管理功能,电源噪声可能会干扰信号传输,尤其是在传输较长距离或存在较强电磁干扰的环境中。确保系统设计考虑到电源去耦和滤波,以避免噪声影响通信。
- 信号完整性:在高频率下,I²C信号可能受到串扰或衰减的影响,特别是长线缆传输时。可以采用合理的布线和信号调节(例如使用终端电阻)来保证信号质量,避免通信错误。
4. 数据完整性和错误处理
- 数据校验:PMBus协议支持使用校验和来确保数据的完整性。在发送命令或数据时,检查从设备是否返回ACK应答,以确保数据传输没有丢失或损坏。
- 错误处理:在实际应用中,可能会遇到通信失败、设备无响应等情况。需要在代码中实现错误检测和重试机制,确保设备在发生通信异常时能够恢复正常工作。
- 超时和重试机制:在通信中,如果没有及时收到ACK,或者设备无响应,可以设计超时和重试机制,避免系统因设备故障或信号丢失导致功能丧失。
5. PMBus命令和数据格式
- 命令集:确保使用的PMBus命令集符合所选设备的需求。不同的设备可能会支持不同的命令集,常见的如读取电压、设置电流、读取温度等。检查设备文档,了解每个命令的格式和数据长度。
- 数据字节的解释:PMBus中的每个命令可能会返回多个字节的数据(如电压、电流、功率等),每个数据字节通常采用二进制编码形式。需要理解如何解析这些数据,并将其转换为物理量(例如电压、功率等)。
6. 通信协议细节
- I²C与PMBus的关系:PMBus是基于I²C协议实现的,因此你需要理解I²C的基本通信原理,尤其是ACK/NACK的处理机制、起始/停止信号等。在处理PMBus命令时,I²C的时序和数据传输规则同样适用。
- 设备地址和读/写操作:PMBus使用7位设备地址(加上读/写标志位)。确保在发送命令时正确指定目标设备的地址,并且在读取数据时使用正确的读/写操作标志。
- 多设备支持:如果系统中有多个PMBus设备,需要确保每个设备的地址唯一且正确设置。并且在使用多个设备时要注意避免数据冲突。
7. 电源管理和效率
- 功率管理:PMBus设备通常涉及功率转换和管理,在设计时需要确保每个设备的电源输入稳定。设计中还需要考虑如何通过PMBus命令优化功率效率,例如调整电压、电流等参数。
- 状态监控和报警:许多PMBus设备具备状态监控和报警功能,如温度、过流、过压等。可以通过PMBus命令读取设备的状态信息,获取设备的健康状况,并进行相应的调节或报警处理。
8. 主设备与从设备的同步
- 主设备同步:作为主设备,你需要控制整个PMBus通信的时序和数据流。在通信过程中要确保每个命令的发送顺序和数据的读取都按照协议规范进行。
- 从设备响应:从设备需要在接收到命令后及时返回正确的响应。如果从设备响应错误或没有返回,可能需要进行重试或错误处理。
9. 调试和测试
- 使用调试工具:在PMBus通信过程中,调试工具如逻辑分析仪、示波器等非常重要。通过这些工具可以监控I²C总线的通信时序,检查数据传输的正确性和信号质量。
- 模拟和测试:在开发过程中,使用模拟器来模拟PMBus设备和主设备之间的通信,可以更容易地进行开发和调试。通过模拟可以确保不同命令的执行和响应符合预期。
10. 文档和规格说明书
- 设备手册:确保阅读设备的规格说明书,理解设备支持的命令集、数据格式、寄存器地址等。每个PMBus设备的操作可能有所不同,文档提供了命令执行和数据解析的详细信息。
- 协议版本:检查所用设备支持的PMBus协议版本(如1.2、2.0等),不同版本之间可能有不同的功能和兼容性要求。