之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。
#一、配置modbus库
modbus-c库 下载链接:https://sourceforge.net/projects/libmodbus/将下载的库文件夹放入源文件根目录下(pro文件中要记得添加LIBS += -Ldll -lws2_32)![libmodbus文件夹和ws2_32.dll(依赖该动态库)放入根目录下 ](https://img-blog.csdnimg.cn/023edcf5caa441e1b6dbccf0f7f2271a.png#pic_center)
#二、使用modbus-c库
##1.modbusRTU
//1.初始化连接数据char*pcom= "COM1";//COM口intAddress =1;//站号modbus_t *mb;mb = modbus_new_rtu(pcom,9600,'N',8,1);modbus_set_slave(mb, Address);//从机地址modbus_connect(mb); ////2.设置通讯超时时间struct timeval t;t.tv_sec=0;t.tv_usec=1000000; //设置modbus超时时间为1000毫秒,注意:经测试,如果没有成功建立tcp连接,则该设置无效。modbus_set_response_timeout(mb,t.tv_sec,t.tv_usec);//3.读数据uint16_t tab_reg[128]={0};int regs=modbus_read_input_registers(mb, 0, 2, tab_reg); //从0开始读2个数if(regs == -1){//读取失败返回-1}else {//读取成功返回0 tab_reg[0];//input_registers的第1个数 tab_reg[1];//input_registers的第2个数}uint8_t bits[128]={0};int rbits= modbus_read_bits(mb, 0, 2, bits);if(rbits== -1){//读取失败返回-1}else {//读取成功返回0 bits[0];//bits的第1个数 bits[1];//bits的第2个数}//...剩下的两个读取同理//4.写数据uint8_t bitsw[128]={0};bitsw[0]=1;bitsw[1]=1;int wbits = modbus_write_bits(mb, 0, 2, bitsw); //写两个数进去if(wbits== -1){//写入失败返回-1}else {//写入成功返回0//}uint16_t registers[128];registers[0] = 200;registers[1] = 203;int wreg = modbus_write_registers(mb,0,2,registers);if(wreg== -1){//写入失败返回-1}else {//写入成功返回0//}//5.调用完成后释放资源modbus_close(mb);modbus_free(mb);
##2.modbusTCP
//与RTU不同的是将串口转为网口初始化//mb = modbus_new_rtu(pcom,9600,'N',8,1); //串口用mb = modbus_new_tcp("127.0.0.1",502);