之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。
经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。
一、配置modbus库
libmodbus库下载链接:https://sourceforge.net/projects/libmodbus/
将下载的库文件夹放入源文件根目录下(pro文件中要记得添加LIBS += -Ldll -lws2_32)
[libmodbus文件夹和ws2_32.dll(依赖该动态库)放入根目录下 ]
二、使用modbus-c库
1.modbusRTU
1 //1.初始化连接数据 2 char *pcom = "COM1"; //COM口 3 int Address = 1; //站号 4 modbus_t *mb; 5 mb = modbus_new_rtu(pcom,9600,'N',8,1); 6 modbus_set_slave(mb, Address); //从机地址 7 modbus_connect(mb); // 8 9 //2.设置通讯超时时间 10 struct timeval t; 11 t.tv_sec=0; 12 t.tv_usec=1000000; //设置modbus超时时间为1000毫秒,注意:经测试,如果没有成功建立tcp连接,则该设置无效。 13 modbus_set_response_timeout(mb,t.tv_sec,t.tv_usec); 14 15 16 //3.读数据 17 uint16_t tab_reg[128]={0}; 18 int regs=modbus_read_input_registers(mb, 0, 2, tab_reg); //从0开始读2个数 19 if(regs == -1){ 20 //读取失败返回-1 21 } 22 else { //读取成功返回0 23 tab_reg[0]; //input_registers的第1个数 24 tab_reg[1]; //input_registers的第2个数 25 } 26 27 uint8_t bits[128]={0}; 28 int rbits = modbus_read_bits(mb, 0, 2, bits); 29 if(rbits == -1){ 30 //读取失败返回-1 31 } 32 else { //读取成功返回0 33 bits[0]; //bits的第1个数 34 bits[1]; //bits的第2个数 35 } 36 //...剩下的两个读取同理 37 38 39 //4.写数据 40 uint8_t bitsw[128]={0}; 41 bitsw[0]=1;bitsw[1]=1; 42 int wbits = modbus_write_bits(mb, 0, 2, bitsw); //写两个数进去 43 if(wbits == -1){ 44 //写入失败返回-1 45 } 46 else { //写入成功返回0 47 // 48 } 49 50 uint16_t registers[128]; 51 registers[0] = 200;registers[1] = 203; 52 int wreg = modbus_write_registers(mb,0,2,registers); 53 if(wreg == -1){ 54 //写入失败返回-1 55 } 56 else { //写入成功返回0 57 // 58 } 59 60 61 //5.调用完成后释放资源 62 modbus_close(mb); 63 modbus_free(mb);
2.modbusTCP
1 //与RTU不同的是将串口转为网口初始化 2 //mb = modbus_new_rtu(pcom,9600,'N',8,1); //串口用 3 mb = modbus_new_tcp("127.0.0.1",502);
标签:modbus,libmodbus,Qt,mb,Modbus,registers,bits From: https://www.cnblogs.com/ybqjymy/p/18062787