動態(tài)網(wǎng)站沒有數(shù)據(jù)庫怎么做百度推廣代運(yùn)營公司
雖然在以前的文章中多次描述過,那么本文使用開源庫libModbus,可得到更好的性能,也可移植到各種平臺。
性能:讀1次和寫1次約各用時(shí)2ms。
分別創(chuàng)建了讀和寫各1個(gè)連接指針,用于讀100個(gè)寄存器和寫100個(gè)寄存器,讀寫分離。
客戶端: win10?
? ? ? ? ? ? ? ? Intel(R) Pentium(R) Gold 8505 ? 1.20 GHz
? ? ? ? ? ? ? ?Intel(R) Ethernet Controller I226
? ? ? ? ? ? ? ? QT6.2.4
服務(wù)端:信捷XDH PLC
測試讀100次共200ms左右,寫100次也共200ms左右。
?很容易移植到linux電腦、以及嵌入式系統(tǒng)?。? ? ? ?
1.前置條件:
? ?(1)需要頭文件8個(gè):
(2)還需要擴(kuò)展名為.c的4個(gè)文件:
(3)把以上代碼拷貝如你的項(xiàng)目文件中,并添加進(jìn)去
(4)還有一個(gè)注意事項(xiàng):在pro文件中需要添加這個(gè):LIBS += -lWs2_32
這行是添加Windows socket庫文件
2.代碼:
? ?#include "modbus-tcp.h"
? ?#include <QElapsedTimer>
? ?//以下可放入你的按鈕代碼里
? ? uint16_t tab_reg[100]; ?// 用于保存讀取到的寄存器的數(shù)據(jù)
? ? ?uint16_t write_buffer_16[100];// 用于寫寄存器的數(shù)據(jù)到服務(wù)端
? ? ?modbus_t *ctx;//用于讀
? ? ?modbus_t *ctx2;//用于寫
? ? // 創(chuàng)建 Modbus 上下文
? ? ?QElapsedTimer time_m;
? ? ?time_m.start();
? ? ? ctx = modbus_new_tcp("192.168.6.6", 502); ?// 服務(wù)器的 IP 地址和端口號
? ? ?//ctx2 = modbus_new_tcp("127.0.0.1", 502); ?// 如果你沒有這個(gè)PLC,用這行代替上行?
? ? ?if (ctx == NULL)
? ? {
? ? ? ? ?fprintf(stderr, "Unable to create the libmodbus context\n");
? ? ? ? ?return ?;
? ? ?}
? ? ?// 連接到 Modbus 服務(wù)器
? ? ?if (modbus_connect(ctx) == -1)
? ? {
? ? ? ? ?fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
? ? ? ? ?modbus_free(ctx);
? ? ? ? ?return ?;
? ? ?}
? ? ?int rc;
? ? ?// 讀取保持寄存器的數(shù)據(jù)(示例:從地址0開始讀取100個(gè)寄存器)
? ? ?for (int i = 0; i < 100; i++)//讀100次
? ? ?{
? ? ? ? ?rc = modbus_read_registers(ctx, 0, 100, tab_reg);//讀,地址0,100個(gè)寄存器
? ? ?}
? ? ?if (rc == -1) {
? ? ? ? ?fprintf(stderr, "Read registers failed: %s\n", modbus_strerror(errno));
? ? ? ? ?modbus_close(ctx);
? ? ? ? ?modbus_free(ctx);
? ? ? ? ?return ?;
? ? ?}
? ? ?qDebug()<<rc;
? ? ?modbus_close(ctx);
? ? ?modbus_free(ctx);
? ? ?qDebug()<<"read use:"<<time_m.elapsed()<<"ms";
? //--------------分割線-----------------------------------------
? ? ?time_m.start();
? ? ? ctx2 = modbus_new_tcp("192.168.6.6", 502); ?// 服務(wù)器的 IP 地址和端口號
? ? ? //ctx2 = modbus_new_tcp("127.0.0.1", 502); ?// 如果你沒有這個(gè)PLC,用這行代替上行?
? ? if (ctx2 == NULL) {
? ? ? ? fprintf(stderr, "Unable to create the libmodbus context\n");
? ? ? ? return ?;
? ? }
? ? if (modbus_connect(ctx2) == -1) {
? ? ? ? fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
? ? ? ? modbus_free(ctx2);
? ? ? ? return ?;
? ? }
? ? for (int i = 0; i < 100; i++)
? ? {
? ? ? ? write_buffer_16[i]=i;
? ? }
? ? int rw=0;
? ?// 寫入保持寄存器的數(shù)據(jù)(示例:從地址0開始寫入100個(gè)寄存器)
? ? for(int i=0;i<100;i++)//寫100次
? ? {
? ? ? ? ?rw=modbus_write_registers(ctx2,0, 100, write_buffer_16);//地址0,100個(gè)寄存器
? ? }
? ? if (rw == -1)
? ? ?{
? ? ? ? fprintf(stderr, "write registers failed: %s\n", modbus_strerror(errno));
? ? ? ? modbus_close(ctx2);
? ? ? ? modbus_free(ctx2);
? ? ? ? return ?;
? ? }
? ? qDebug()<<rw;
? ? // // 打印讀取到的寄存器數(shù)據(jù)
? ? // for (int i = 0; i < 100; i++)
? ? // {
? ? // ? ? printf("Register %d: %d\n", i, tab_reg[i]);
? ? // }
? ? // 關(guān)閉連接并釋放資源
? ? modbus_close(ctx2);
? ? modbus_free(ctx2);
? ? qDebug()<<"write use:"<<time_m.elapsed()<<"ms";
3.庫文件下載鏈接
https://download.csdn.net/download/weixin_39926429/88900380
4.如果你沒有PLC,可用以下軟件模擬服務(wù)端
https://download.csdn.net/download/weixin_39926429/88900693