modbus库功能码和函数对应关系

本文详细介绍了Modbus协议的功能码及其应用场景,包括读取线圈状态、写入寄存器值等,并提供了各功能码对应的函数调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* Function codes */
#define _FC_READ_COILS                0x01            
#define _FC_READ_DISCRETE_INPUTS      0x02
#define _FC_READ_HOLDING_REGISTERS    0x03
#define _FC_READ_INPUT_REGISTERS      0x04
#define _FC_WRITE_SINGLE_COIL         0x05
#define _FC_WRITE_SINGLE_REGISTER     0x06
#define _FC_READ_EXCEPTION_STATUS     0x07
#define _FC_WRITE_MULTIPLE_COILS      0x0F
#define _FC_WRITE_MULTIPLE_REGISTERS  0x10
#define _FC_REPORT_SLAVE_ID           0x11
#define _FC_WRITE_AND_READ_REGISTERS  0x17

0x01:读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)  
/* Reads the boolean status of bits and sets the array elements
   in the destination to TRUE or FALSE (single bits). */
int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest)

0x02:
读取输入状态 取得一组开关输入的当前状态(ON/OFF)  
/* Same as modbus_read_bits but reads the remote device input table */
int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest)

0x03:读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值 
/* Reads the holding registers of remote device and put the data into an
   array */
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)

0x04:读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值 
/* Reads the input registers of remote device and put the data into an array */
int modbus_read_input_registers(modbus_t *ctx, int addr, int nb,
                                uint16_t *dest)

0x05:强置单线圈 强置一个逻辑线圈的通断状态
/* Turns ON or OFF a single bit of the remote device */
int modbus_write_bit(modbus_t *ctx, int addr, int status)

0x06:预置单寄存器 把具体二进值装入一个保持寄存器
/* Writes a value in one register of the remote device */
int modbus_write_register(modbus_t *ctx, int addr, int value)
 0x07:读取异常状态 取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态  

0x0F:强置多线圈 强置一串连续逻辑线圈的通断
/* Write the bits of the array in the remote device */
int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src)

0x10:控询(只用于484) 可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
/* Write the values from the array to the registers of the remote device */
int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src)

0x17:报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态
/* Write multiple registers from src array to remote device and read multiple
   registers from remote device to dest array. */
int modbus_write_and_read_registers(modbus_t *ctx,
                                    int write_addr, int write_nb, const uint16_t *src,
                                    int read_addr, int read_nb, uint16_t *dest)

Modbus协议中定义了一系列的功能码(Function Codes),用于指定主设备与从设备之间通信时希望执行的操作。这些功能码通常在请求报文中被指定,而每个功能码对应的响应格式也有所不同。 以下是一些常见的Modbus功能码及其对应的返回值信息: ### 读取线圈状态 (Function Code 0x01) 此功能码用于读取从设备中的离散量输入(线圈)的状态。响应中包含一个字节流,其中每一位代表一个线圈的状态,1 表示 ON,0 表示 OFF [^1]。 ### 读取输入寄存器 (Function Code 0x04) 使用此功能码可以读取从设备的输入寄存器的内容。响应中的数据是以两个字节为单位的寄存器值 [^1]。 ### 读取保持寄存器 (Function Code 0x03) 该功能码允许主设备读取从设备的一个或多个保持寄存器的当前值。响应同样以两个字节表示一个寄存器的数值 [^1]。 ### 写入单个线圈 (Function Code 0x05) 当需要设置一个特定线圈的状态时,使用这个功能码。成功的写操作会在响应中返回相同的值,确认写入成功 [^1]。 ### 写入单个寄存器 (Function Code 0x06) 此功能码用来改变从设备中的单个寄存器的值。如果写入成功,响应将回传相同的寄存器地址数值 [^1]。 ### 写入多个线圈 (Function Code 0x0F) 此功能码支持一次写入多个线圈的状态。响应会包含写入操作的结果 [^1]。 ### 写入多个寄存器 (Function Code 0x10) 通过此功能码,可以一次性地向从设备写入多个寄存器的数据。响应将确认写入的起始地址及寄存器数量 [^1]。 对于具体的实现细节以及错误处理机制,如非法数据地址、非法数据值等异常情况下的响应代码,请参考相关的技术文档或者标准规范。 ```python # 示例:构建一个简单的Modbus RTU请求包来读取保持寄存器 import struct def create_modbus_request(slave_id, function_code, starting_address, quantity): # 根据功能码创建请求报文 if function_code == 0x03 or function_code == 0x04: # 功能码0x030x04需要起始地址寄存器数量 request = struct.pack('>BBHH', slave_id, function_code, starting_address, quantity) elif function_code == 0x01 or function_code == 0x02: # 功能码0x010x02也需要起始地址位的数量 request = struct.pack('>BBHH', slave_id, function_code, starting_address, quantity) else: raise ValueError("Unsupported function code") # 计算CRC校验码并附加到请求报文末尾 crc = calculate_crc(request) # 假设有一个计算CRC的函数 return request + crc # 注意: 上面的函数没有提供实际的CRC计算逻辑。 # 在真实的场景中,你需要根据Modbus标准实现CRC16算法。 ``` 以上代码片段展示了如何构造一个Modbus RTU模式下的读取保持寄存器请求包。请注意,这只是一个简化版的例子,并且假设存在一个能够正确计算CRC校验码的`calculate_crc`函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值