組態王通過Modbus TCP與ESP32通訊
組態王
組態王在工控領域被廣泛應用。作為人機界面可以開發多種應用。與ESP8266通過無線網通訊沒有太多的文章介紹,這里介紹通過使用modbus TCP協議實現數據上傳和命令下發。
組態王的通訊設置
組態王可以通過板卡或串口來建立一個通訊路徑。
這個畫面中,選擇設備-新建出現新建設備畫面。
選擇莫迪康(Modicon)作為生產廠家,就是我們要通訊設備的生產廠家(大名鼎鼎的Modicon,以前也叫過歌德,中國的煉鋼廠當時用得都是這個廠家得PLC)。通訊協議選擇是ModbusTCP。這個協議是在Modbus串口通訊協議發展而來得。
給這個設備起一個名稱。這個是可以隨意取。
這里要選擇一個串口,因為在程序中要創建Socket,不知道為啥非要選串口。選一個不能用到得串口,我選擇了COM21。
192.168.4.81 是要通訊的主機(Server)的IP地址。
:6600 是通訊服務器的端口號
5 是ModbusTCP的地址
/50 是超時時間
后面就是一路確定到:
組態王變量設置
Modbus的通訊可以是離散量輸入,離散量輸出,模擬量輸入和模擬量輸出。離散量是一個位,用modbus就是10001或者00001,10001表示輸入,即數字輸入點,00001表示輸出,即數字量輸出點。模擬量輸入采用30001,十六位的輸入,模擬量輸出是40001,16位數字表示一個輸出值。在這里我們設置一個16位寄存器值,40101.

這里選擇的連接設備時WTGSimuPLC。寄存器是40101. 數據類型是無符號整數。通訊頻率為1000ms。有了這個變量可以在圖形中做可視化就可以讀取這個變量值了。
變量顯示
在畫面中展示做一個數字,然后和變量進行連接就可以實現這個變量的顯示了。
動畫連接,選擇模擬量輸出:

在畫面上可以展示這個輸出了。
ESP8266編程
需要在ESP8266中編程,我還是選擇了Arduino IDE進行編程。方法是當接受到信息時,接受這些信息,檢查信息是否是發送給自己的,如果是的話,接受信息,然后按規約的要求發送信息到發送方。在編制程序時不需要添加一些頭文件。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
WiFiClient client;
IPAddress loIP(192, 168, 4, 61);
IPAddress snIP(255, 255, 255, 0);
IPAddress gwIP(192, 168, 4, 1);
IPAddress 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()) // 這個是當有新的client與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地址,發送讀取命令,然后應答讀取。
總結
用組態王做一個人機界面在工控領域比較流行。ESP8266可以通過Wifi作為一個服務器為HMI提供服務。



返回頂部
刷新頁面
下到頁底