modbus_set_debug(3) //设置调试模式,可在控制台显示通讯报文
modbus_get_response_timeout(3)
modbus_set_response_timeout(3)
modbus_set_debug(modbus_t * ctx , int boolean );
设置上下文的调试标志,boolean 设置为1,控制台显示通讯收发报文
int modbus_flush(modbus_t * ctx );
modbus_flush - 刷新未传输的数据
int modbus_read_bits(modbus_t * ctx , int addr , int nb , uint8_t * dest );
功能代码 0x01(读取线圈状态) 返回读取的位数
int modbus_read_input_bits(modbus_t * ctx , int addr , int nb , uint8_t * dest );
功能代码 0x02(读取输入状态)返回读取输入状态的数量
int modbus_read_registers(modbus_t * ctx , int addr , int nb , uint16_t * dest );
功能代码 0x03(读取保持寄存器)返回读取寄存器的数量
int modbus_read_input_registers(modbus_t * ctx , int addr , int nb , uint16_t * dest );
功能代码 0x04 (读取输入寄存器) 返回读取输入寄存器的数量
int modbus_write_bit(modbus_t * ctx , int addr , int status );
功能代码 0x05(强制单线圈)成功返回 1 失败返回 -1
int modbus_write_register(modbus_t * ctx , int addr , int value );
功能代码 0x06(预设单个寄存器) 成功返回 1 失败返回 -1
int modbus_write_bits(modbus_t * ctx , int addr , int nb , const uint8_t * src );
功能代码 0x0F(强制多个线圈) 返回写入的位数
int modbus_write_registers(modbus_t * ctx , int addr , int nb , const uint16_t * src );
功能码 0x10(预设多个寄存器)
int modbus_send_raw_request(modbus_t * ctx , uint8_t * raw_req, int 'raw_req_length );
此函数可用于发送未由库处理的请求 函数应返回完整的消息长度,如果成功,则计算与后端相关的额外数据
例子
modbus_t * ctx ;
/* 从地址 1 读取 5 个保持寄存器 */
uint8_t raw_req [] = { 0xFF , 0x03 , 0x00 , 0x01 , 0x0 , 0x05 } ;
int req_length ;
uint8_t rsp [ MODBUS_TCP_MAX_ADU_LENGTH ];
ctx = modbus_new_tcp(“127.0.0.1” , 1502 );
if ( modbus_connect ( ctx ) == - 1 ) {
fprintf ( stderr , "连接失败: %s \n " , modbus_strerror ( errno ));
modbus_free ( ctx );
返回 - 1 ;
}
req_length = modbus_send_raw_request ( ctx , raw_req , 6 * sizeof ( uint8_t ));
modbus_receive_confirmation ( ctx , rsp );
modbus_close ( ctx );
modbus_free ( ctx );
int modbus_receive_confirmation(modbus_t * ctx , uint8_t * rsp );
此函数可用于接收库未处理的请求 函数应将确认请求存储在rsp中,如果成功则返回响应长度。否则它将返回 -1
串口初始化
bool LbDriver::initPort(QString portName)
{
if (mb!= nullptr){
modbus_close(mb);
modbus_free(mb);
}
mb = modbus_new_rtu(portName.toUtf8().data(), 9600 , 'N', 8, 1); //相同的端口只能同时打开一个
if ( modbus_connect(mb)!=-1){
qDebug()<<portName<<" has init";
isInit = true;
modbus_set_debug(mb,false); //设置为TRUE时,显示modbus消息的字节
emit readCmd(); //
return true;
}
else
{
Tools::msgWarning(QString(tr("串口%1打开失败,请检查。")).arg(portName),nullptr);
return false;
}
}