一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

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

 

posted on 2024-03-09 15:38  一杯清酒邀明月  阅读(2313)  评论(0编辑  收藏  举报