之前发表的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);