在使用esp32实现modbus tcp通信的时,无法连接从机进行通信。
程序实现了esp32作为modbus RTU从设备和modbus TCP从设备的桥接,把从RTU从设备读取到的保持寄存器值转发到TCP从设备。
main.cpp
#include <Arduino.h>
#include <WiFi.h>
#include <ModbusIP_ESP8266.h>
#include <ModbusMaster.h>
// Modbus RTU
#define TX_PIN 17
#define RX_PIN 16
ModbusMaster node;
// Modbus TCP
ModbusIP mb;
IPAddress remote(192, 168, 44, 1);
// WiFi credentials
const char* ssid = "向阳5G1";
const char* password = "xyzxs1234";
void setup() {
Serial.begin(9600);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to Wi-Fi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Modbus RTU setup
node.begin(4, Serial2);
Serial2.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
// Modbus TCP setup
mb.client();
}
void loop() {
// Read data from Modbus RTU device
uint8_t result = node.readHoldingRegisters(0x0000, 4);
if(mb.isConnected(remote)){
if (result == node.ku8MBSuccess ) {
// Copy data to Modbus TCP registers
Serial.println("RTU Data receive and TCP slave connect");
for (int i = 0; i < 4; i++) {
uint16_t value = node.getResponseBuffer(i);
mb.writeHreg(1,i,value);
}
}
}else {
Serial.print("remote error");
mb.connect(remote,502); // Try to connect if no connection
}
// Handle Modbus TCP requests
mb.task();
delay(5000);
}
modbus salve模拟器配置
创建从机后无法进行连接
开发环境:PlatformIO
开发板:esp32
相关库文件:1.modbus-esp8266
2.ModbusMaster