Modbus主站(树莓派)无法连接WT32-ETH01从站求助
故障排查:树莓派Modbus主站无法连接WT32-ETH01从站
问题背景
使用两个WT32-ETH01作为Modbus TCP从站,树莓派作为主站,通过以太网交换机组网。单模块测试时,WT32日志显示以太网和Modbus服务正常,但树莓派ping WT32显示host unreachable,Modbus连接超时。
一、网络层基础排查(优先解决ping不通问题)
- 子网与网关一致性检查:确认树莓派和WT32的子网掩码、网关完全匹配。WT32代码中配置的
mySN、myGW必须和树莓派网卡配置一致,跨子网会直接导致通信失败。 - 物理链路验证:
- 更换WT32与交换机之间的网线,排除线材故障;
- 将WT32直接连接到树莓派以太网口(绕开交换机),测试ping连通性,排除交换机端口问题;
- IP冲突检测:在树莓派上执行
arp-scan -l扫描局域网,确认WT32的IP未被其他设备占用; - WT32配置生效验证:在WT32的
setup()中添加以下代码,打印实际生效的子网和网关,避免ETH.config()调用失败但日志未体现的情况:Serial.print("实际子网掩码: "); Serial.println(ETH.subnetMask()); Serial.print("实际网关: "); Serial.println(ETH.gatewayIP());
二、Modbus TCP配置排查
- Slave ID匹配:树莓派代码中第一个模块的Slave ID为1,WT32使用
ModbusIP_ESP8266库默认Slave ID也是1,暂时匹配,但后续修改需保持两端一致; - 端口开放验证:在树莓派上执行
nc -zv <WT32_IP> 502,测试WT32的502端口是否开放。若显示Connection refused,说明Modbus服务未正常启动;
三、代码细节修正
WT32代码问题
- 库兼容性替换:
ModbusIP_ESP8266为ESP8266设计,WT32-ETH01是ESP32核心,存在兼容性风险,建议替换为ESP32专用库ModbusIP-ESP32; mb.isConnected()参数错误:原代码中mb.isConnected(IPAddress("same as above"))写法错误,该函数无需传入IP,正确用法为mb.isConnected()(检查是否有主站连接),或传入树莓派的IP地址;- 阻塞延时影响响应:
loop()中的delay(1000)会阻塞程序,导致Modbus请求无法及时处理,改用millis()实现非阻塞延时:unsigned long previousMillis = 0; const long interval = 1000; void loop() { if (ETH.linkUp()) { mb.task(); // 优先处理Modbus请求 unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // 电池数据更新、寄存器写入代码移至此处 int battery_percentage = 85; // ... 时间获取与寄存器更新逻辑 ... } } else { Serial.println("Ethernet not connected"); delay(1000); } }
树莓派代码问题
- 延长连接超时时间:默认连接超时较短,手动设置超时参数:
client = ModbusClient.ModbusTcpClient(ip, port=port, timeout=5) - 添加连接重试机制:避免单次连接失败就放弃:
import time max_retries = 3 retry_count = 0 while retry_count < max_retries: if client.connect(): clients.append((client, slave_id, data_type)) logging.info(f"Connected to {ip}:{port}") break retry_count += 1 logging.warning(f"Retry {retry_count}/{max_retries} to connect {ip}:{port}") time.sleep(1) else: logging.error(f"Failed to connect to {ip}:{port} after {max_retries} retries")
四、分步测试建议
- 先解决ping不通问题,确保WT32与树莓派在同一子网、物理链路正常;
- 用
nc命令确认WT32的502端口开放; - 简化WT32代码,仅保留以太网初始化和Modbus服务启动,用qModMaster等工具在树莓派上测试寄存器读取;
- 逐步恢复数据更新逻辑,确认Modbus通信稳定后再接入数据库存储。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

