QT5 libmodbus使用

modbus_get_byte_timeout(3) 

modbus_set_byte_timeout(3) 

modbus_set_debug(3)  //设置调试模式,可在控制台显示通讯报文

modbus_set_error_recovery(3) 

modbus_get_header_length(3) 

modbus_get_response_timeout(3) 

modbus_set_response_timeout(3) 

modbus_set_slave(3)  //设置从站ID

modbus_set_socket(3) 

modbus_get_socket(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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt是一个跨平台的C++开发框架,提供了丰富的功能和工具,可以实现各种类型的应用程序开发。要在Qt中实现Modbus从机功能,可以使用Qt的串口通信库和Modbus协议库进行开发。 首先,我们需要使用Qt的串口通信库来建立连接并配置串口。可以通过使用QSerialPort类来访问和控制串口。使用类似下面的代码来创建一个QSerialPort对象,并设置串口的参数: ``` QSerialPort serialPort; serialPort.setPortName("COM1"); // 设置串口名字 serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率 serialPort.setDataBits(QSerialPort::Data8); // 设置数据位 serialPort.setParity(QSerialPort::NoParity); // 设置校验位 serialPort.setStopBits(QSerialPort::OneStop); // 设置停止位 ``` 之后,我们需要使用Qt的Modbus协议库来实现Modbus从机功能。可以使用QModbusServer类来创建一个Modbus从机对象,并配置从机的地址和功能码: ``` QModbusServer modbusServer; modbusServer.setConnectionParameter(QModbusServer::SerialPortNameParameter, "COM1"); // 设置Modbus从机连接的串口 modbusServer.setServerAddress(1); // 设置Modbus从机地址 // 设置Modbus从机支持的功能码 modbusServer.setData(MODBUS_SERVER_READ_HOLDING_REGISTERS, new ModbusServerData()); modbusServer.setData(MODBUS_SERVER_WRITE_SINGLE_REGISTER, new ModbusServerData()); ``` 接下来,我们可以使用Qt的信号槽机制来处理串口数据的接收和发送,并实现Modbus从机的功能。可以通过使用QSerialPort的readyRead()信号来接收串口数据,并解析Modbus请求。根据不同的功能码,执行相应的操作,并根据需要发送Modbus响应。 总结起来,通过使用Qt的串口通信库和Modbus协议库,我们可以很方便地在Qt中实现Modbus从机功能。需要建立串口连接并配置参数,创建Modbus从机对象并设置地址和功能码,使用信号槽机制处理串口数据的接收和发送,实现Modbus从机的功能。上述代码仅作为示例,具体实现根据需要进行调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值