18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 18luck平台 >> 組態王KingView >> 正文

KingView組態王通過Modbus TCP與ESP32通訊_esp32 modbus tcp

作者:佚名    文章來源:網絡    點擊數:    更新時間:2024/8/16

組態王通過Modbus TCP與ESP32通訊

組態王

組態王在工控領域被廣泛應用。作為(wei) 人機界麵可以開發多種應用。與(yu) ESP8266通過無線網通訊沒有太多的文章介紹,這裏介紹通過使用modbus TCP協議實現數據上傳(chuan) 和命令下發。

組態王的通訊設置

組態王可以通過板卡或串口來建立一個(ge) 通訊路徑。
 
這個(ge) 畫麵中,選擇設備-新建出現新建設備畫麵。
 
選擇莫迪康(Modicon)作為(wei) 生產(chan) 廠家,就是我們(men) 要通訊設備的生產(chan) 廠家(大名鼎鼎的Modicon,以前也叫過歌德,中國的煉鋼廠當時用得都是這個(ge) 廠家得PLC)。通訊協議選擇是ModbusTCP。這個(ge) 協議是在Modbus串口通訊協議發展而來得。
 
給這個(ge) 設備起一個(ge) 名稱。這個(ge) 是可以隨意取。
 
這裏要選擇一個(ge) 串口,因為(wei) 在程序中要創建Socket,不知道為(wei) 啥非要選串口。選一個(ge) 不能用到得串口,我選擇了COM21。

 
在這裏需要注意,上麵設置是按如下得格式設置得:

192.168.4.81 是要通訊的主機(Server)的IP地址。
:6600 是通訊服務器的端口號
5 是ModbusTCP的地址
/50 是超時時間
後麵就是一路確定到:

組態王變量設置

Modbus的通訊可以是離散量輸入,離散量輸出,模擬量輸入和模擬量輸出。離散量是一個(ge) 位,用modbus就是10001或者00001,10001表示輸入,即數字輸入點,00001表示輸出,即數字量輸出點。模擬量輸入采用30001,十六位的輸入,模擬量輸出是40001,16位數字表示一個(ge) 輸出值。在這裏我們(men) 設置一個(ge) 16位寄存器值,40101.
 


這裏選擇的連接設備時WTGSimuPLC。寄存器是40101. 數據類型是無符號整數。通訊頻率為(wei) 1000ms。有了這個(ge) 變量可以在圖形中做可視化就可以讀取這個(ge) 變量值了。

變量顯示

在畫麵中展示做一個(ge) 數字,然後和變量進行連接就可以實現這個(ge) 變量的顯示了。
動畫連接,選擇模擬量輸出:
 
在畫麵上可以展示這個(ge) 輸出了。

ESP8266編程

需要在ESP8266中編程,我還是選擇了Arduino IDE進行編程。方法是當接受到信息時,接受這些信息,檢查信息是否是發送給自己的,如果是的話,接受信息,然後按規約的要求發送信息到發送方。在編製程序時不需要添加一些頭文件。

#include <ESP8266WiFi.h> #include <WiFiClient.h> WiFiClient client; ipadsdress loIP(192, 168, 4, 61); ipadsdress snIP(255, 255, 255, 0); ipadsdress gwIP(192, 168, 4, 1); ipadsdress mbTCP(192, 168, 4, 51); WiFiServer server(6600); // 服務器,server void wifiSetup() { if (!WiFi.config(loIP, gwIP, snIP)) { Serial.println("Satation配置不成功"); delay(3000); } WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); } void sMBTCP(uint8_t* buff, int16_t iLength) { int iTemp; int rAdd; if ( bDebug ) { Serial.println("The length = " + String(iLength)); for(int i = 0; i < iLength; i++) Serial.printf("The buff[%d] = 0x%02X\n", i, (uint8_t)buff[i]); } if (buff[6] != 0x05) // modbus TCP address return; switch ( buff[7] ) { case 3: // read hold register rAdd = (buff[8] << 8) + buff[9]; // register address if ( bDebug4 ) { Serial.println("The rAdd = " + String(rAdd)); } buff[5] = ((buff[10] << 8) + buff[11]) * 2 + 3; // reply bytes buff[8] = ((buff[10] << 8) + buff[11]) * 2; iTemp = 9 + buff[8]; // total bytes send if ( rAdd == 0) { for (int i = 0; i < buff[8]/2; i++) { buff[9 + (i * 2)] = hreg40001[i] >> 8; buff[10 + (i * 2)] = hreg40001[i]; } } if ( bDebug ) { for ( int i = 0; i < iTemp; i++) { Serial.printf("buff[%d] = 0x%02X\n", i, (uint8_t)buff[i]); } } client.write(buff, iTemp); break; case 6: break; case 16: break; default: break; } if ( bDebug ) { for (int i = 0; i < iTemp; i++) Serial.printf("The buff[%d] = 0x%02X\n", i, (uint8_t)buff[i]); } } void setup() { Serial.begin(115200); // 調試助手 delay(1000); // pasue 1 second wifiSetup(); // setup wifi hot AP server.begin(); // 服務器運行 } void loop() { if (server.hasClient()) // 這個(ge) 是當有新的client與(yu) Server連接時 { client = server.available(); Serial.println("client connected"); } if ( client && client.connected()) { int i = 0; while (client.available()) { char c = client.read(); if (client.available() == 0) mbLength = i + 1; mdTCPbuff[i] = c; i++; } if ( i > 0 ) { sMBTCP(mdTCPbuff, i); } } }

上麵的程序可以完成modbusTCP通訊了。場景是固定的IP地址,發送讀取命令,然後應答讀取。

總結

用組態王做一個(ge) 人機界麵在工控領域比較流行。ESP8266可以通過Wifi作為(wei) 一個(ge) 服務器為(wei) HMI提供服務。

Tags:組態王,Modbus協議,KingView  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁麵
下到頁底
晶體管查詢