Modbus协议详解:功能码与通信格式

需积分: 9 1 下载量 99 浏览量 更新于2024-09-13 收藏 138KB PDF 举报
"该文档详细介绍了在嵌入式开发中常用的Modbus协议功能码,包括读线圈(01)和读保持寄存器(03)的操作,以及相关的通信资料格式、数据校验和错误响应。" 在工业自动化领域,Modbus协议是一种广泛使用的串行通信协议,它允许设备之间进行数据交换。本文档主要关注Modbus协议中的ASCII(美国标准代码交换信息格式)通信模式,这是一种将二进制数据转换为可打印的ASCII字符以便于传输的格式。 1. **ASCII格式的通信资料格式**: - STX(Start of Text): 启始单元,用“:"(3AH)表示。 - ADDRESS: 设备地址,8位,范围从00(广播)到250(对应变频器地址)。 - FUNC: 命令码,8位,用于指示执行的操作,如01代表读线圈,03代表读保持寄存器。 - DataH, DataL: 数据高字节和低字节。 - LRC(Least Significant Bit Checksum): 最低位校验码,用于检查数据的完整性。 - END: 结束符,包括CR(Carriage Return, 0DH)和LF(Line Feed, 0AH)。 2. **功能码01 - 读线圈**: - 上位机发送的数据格式包含地址、功能码、寄存器起始地址(ADDRH, ADDRL)、数量(NUMH, Numl)以及LRC校验。 - 变频器返回的数据包括地址、功能码、字节数(BYTECOUNT)、数据(DATA1...DATAN)和LRC校验。 - 错误响应时,功能码前会加上0x81,表示错误类型,如0x8101、0x8102等。 3. **功能码03 - 读保持寄存器**: - 与读线圈类似,但数量表示要读的保持寄存器数量,且返回数据的BYTECOUNT为2 * NUM。 - 读取保持寄存器通常用于获取设备的配置参数或当前状态。 4. **示例应用**: - 检测变频器运行方向,通过读取特定寄存器(如CD160和CD161)的值来判断。 - 发送读取线圈请求:“:“010100050001F90D0A”,接收返回数据:“:“01010101FC0D0A”,其中“01”表示变频器状态,1表示反转运行。 5. **数据校验**: - LRC校验用于确保数据在传输过程中未被篡改。计算方法是对所有数据字节(不包括STX、END和地址)求和,然后取反(模256)。 6. **错误处理**: - 当出现通信错误或无效命令时,变频器会返回一个错误响应,功能码前加0x81,后跟具体的错误代码。 了解并熟练运用这些Modbus功能码是进行嵌入式系统与变频器等设备通信的基础,对于实现设备间的有效数据交互至关重要。开发者需要根据实际需求选择合适的功能码,并确保正确处理数据校验和错误响应,以确保通信的稳定性和可靠性。