完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
组态王通过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%02Xn”, 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%02Xn”, 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%02Xn”, 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提供服务。 |
|
|
|
只有小组成员才能发言,加入小组>>
947浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-6 17:43 , Processed in 0.388411 second(s), Total 47, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号