You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")
    

四、分步测试建议

  1. 先解决ping不通问题,确保WT32与树莓派在同一子网、物理链路正常;
  2. 用nc命令确认WT32的502端口开放;
  3. 简化WT32代码,仅保留以太网初始化和Modbus服务启动,用qModMaster等工具在树莓派上测试寄存器读取;
  4. 逐步恢复数据更新逻辑,确认Modbus通信稳定后再接入数据库存储。

内容的提问来源于stack exchange,提问作者Shaun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:05:54