modbus之libmodbus库详解

libModbus概述libmodbus是一个使用遵循Modbus协议的设备发送/接收数据的库 。 该库包含各种后端 , 可通过不同的网络进行通信(例如 , RTU模式下的串行或TCP/IPv6中的以太网) 。 libmodbus提供了较低层通信层的抽象 , 并在所有受支持的平台(Linux , MacOSX , FreeBSD , QNX和Win32)上提供了相同的API 。
Modbus协议包含许多变体(例如 , 串行RTU或以太网TCP) , 为简化变体的实现 , 该库旨在针对每个变体使用后端 。 后端也是满足其他要求(例如实时操作)的便捷方式 。 每个后端都提供特定的功能来创建新的modbus_t上下文 。 所述modbus_t上下文是包含所有必要的信息以建立与根据所选择的变体的其他Modbus设备的连接的不透明结构 。
RTU上下文RTU后端(远程终端单元)用于串行通信 , 并使用紧凑的二进制数据表示形式进行协议通信 。 RTU格式遵循命令/数据 , 并带有循环冗余校验校验和作为错误校验机制 , 以确保数据的可靠性 。 ModbusRTU是可用于Modbus的最常见实现 。 ModbusRTU消息必须连续发送 。
ModbusRTU帧调用一个从设备(一个处理Modbus请求的设备/服务)和一个主设备(一个发送请求的客户端) 。 通讯始终由主机启动 。 许多Modbus设备可以在同一物理链路上连接在一起 , 因此在发送消息之前 , 必须使用modbus_set_slave设置从站(接收器) 。 如果您正在运行从站 , 则其从站号将用于过滤收到的消息 。
RTU的libmodbus实现不是按原始Modbus规范中所述的基于时间的 , 而是尽可能快地发送所有字节 , 并且在接收到所有预期字符后 , 将认为响应或指示已完成 。 此实现提供了非常快速的通信 , 但是您必须注意将从属服务器的响应超时设置为小于主服务器的响应超时(否则 , 当其中一个从属服务器没有响应时 , 其他从属服务器可能会忽略主服务器的请求) 。
TCPPI(IPv4和IPv6)上下文TCPPI(独立与协议)后端实现了Modbus变体 , 用于通过TCPIPv4和IPv6网络进行通信 。 它不需要校验和计算 , 因为较低层负责相同的工作 。 与仅TCPIPv4后端相反 , TCPPI后端提供了主机名解析 , 但消耗了大约1Kb的额外内存 。
modbus之libmodbus库详解 功能描述
写多个线圈 , 该SRC数组必须包含字节设置为TRUE或FALSE 。 该功能使用Modbus功能代码0x0F(写多个线圈) 。
modbus_write_register-写单个保持寄存器(Modbus功能代码0x06)
函数原型
intmodbus_write_register(modbus_t*ctx , intaddr , constuint16_t值);
功能描述
写单个保持寄存器到的远程设备 。 该功能使用Modbus功能代码0x06(写单个保持寄存器) 。
modbus_write_registers-写多个保持寄存器(Modbus功能代码0x10)
函数原型
intmodbus_write_registers(modbus_t*ctx , intaddr , intnb , constuint16_t* src);
功能描述
写保持寄存器 。 该功能使用Modbus功能代码0x10(写多个保持寄存器) 。
modbus_write_and_read_registers-在单个事务中写入和读取多个保持寄存器(Modbus功能代码0x17)
函数原型
intmodbus_write_and_read_registers(modbus_t*ctx , intwrite_addr , intwrite_nb , constuint16_t* src , intread_addr , intread_nb , constuint16_t*dest);
功能描述
在单个事务中写入和读取多个保持寄存器 。 读取结果作为字值(16位)存储在dest数组中 。 您必须注意分配足够的内存以将结果存储在dest中(至少nb*sizeof(uint16_t)) 。 该功能使用Modbus功能代码0x17(写/读多个保持寄存器) 。
服务端接口(从站设备)服务器正在等待来自客户端的请求 , 并且在请求涉及到服务器时必须进行响应 。
modbus_tcp_listen-创建和侦听TCPModbus套接字(IPv4)
函数原型
intmodbus_tcp_listen(modbus_t*ctx , intnb_connection);
功能描述
modbus_tcp_listen()函数将创建一个套接字 , 并监听最大nb_connection对指定的IP地址传入连接 。 必须先使用modbus_new_tcp分配并初始化上下文 , 然后才能将IP地址设置为侦听 , 如果IP地址设置为NULL或0.0.0.0 , 则将侦听任何地址 。
示例代码
函数原型
intmodbus_tcp_accept(modbus_t*ctx , int*s);
功能描述
接受TCPModbus套接字(IPv4)上的新连接 。
modbus_receive-接收数据请求
函数原型
intmodbus_receive(modbus_t*ctx , uint8_t*req);
功能描述
Modbus从站/服务器使用此功能来接收和分析主站/客户端发送的指示请求 。
modbus_reply-发送对收到的请求的响应
函数原型
intmodbus_reply(modbus_t*ctx , constuint8_t*req , intreq_length , modbus_mapping_t*mb_mapping);
功能描述
发送给接收的请求的响应 。 对参数中给出的请求req进行分析 , 然后使用modbus上下文ctx的信息构建并发送响应 。 如果请求指示要读取或写入值 , 则将根据操作数据的类型在modbus映射mb_mapping中完成操作 。 如果发生错误 , 将发送异常响应 。 此功能是为Modbus服务器设计的 。
modbus_close-关闭Modbus连接
函数原型
voidmodbus_close(modbus_t*ctx);
功能描述
该modbus_close()函数必须关闭与上下文中的后端设置建立的连接 。
modbus_mapping_new-分配位和寄存器的四个数组
函数原型
modbus_mapping_tmodbus_mapping_new(intnb_bits , intnb_input_bits , intnb_registers , intnb_input_registers);
功能描述
modbus_mapping_new()函数将分配四个数组来存储比特 , 输入比特 , 寄存器和输入寄存器 。 指针存储在modbus_mapping_t结构中 。 数组的所有值都初始化为零 。 该函数等效于调用modbus_mapping_new_start_address函数 , 且所有起始地址均为0 。 如果不必为特定类型的数据分配数组 , 则可以在参数中传递零值 , 关联的指针将为NULL 。 此功能在处理Modbus服务器/从站中的请求时非常方便 。
modbus_mapping_free-释放一个modbus_mapping_t结构
函数原型
voidmodbus_mapping_free(modbus_mapping_t*mb_mapping)
功能描述
【modbus之libmodbus库详解】该函数将释放mb_mapping_t结构的四个数组 , 最后释放mb_mapping引用的mb_mapping_t 。


    推荐阅读