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

能否通过Modbus TCP PHP获取Citrino FX PLC信息?及代码无返回问题求助

Citrino PLC Modbus TCP读取问题排查与解决

问题背景

我们公司配备一台Citrino PLC,需要获取其内部信息。目前使用InduSoft Web Studio通过Modbus TCP可成功读取并展示该信息,但使用PHP ModbusMaster库编写的代码始终无法返回任何数据,页面无输出。

所用PHP代码

require_once dirname(__FILE__) . '/../Phpmodbus/ModbusMaster.php';

// 创建Modbus对象
$modbus = new ModbusMaster("192.168.0.229", "TCP");

try {
    // 功能码3:读取多个寄存器
    $recData = $modbus->readMultipleRegisters(0, 12288, 6);
}
catch (Exception $e) {
    // 输出错误信息
    echo $modbus;
    echo $e;
    exit;
}

// 输出状态信息
echo "</br>状态:</br>" . $modbus;

// 输出读取到的数据
echo "</br>数据:</br>";
print_r($recData); 
echo "</br>";

排查与解决建议

  • 核对Modbus参数一致性
    确保PHP代码的参数和InduSoft中成功运行的配置完全匹配:

    • 从站地址:代码中第一个参数为0,多数PLC默认从站地址为1,需确认InduSoft中的配置值并修正
    • 寄存器地址:确认12288是否与InduSoft中使用的起始寄存器地址一致(注意部分工具采用1-based地址,而代码可能使用0-based)
    • 寄存器数量:6需与实际需要读取的寄存器数量匹配
  • 添加调试与超时设置
    给Modbus对象增加超时配置并开启调试,便于定位通信问题:

    $modbus->setTimeout(5); // 设置5秒超时时间
    $modbus->debug = true; // 开启调试模式,输出通信细节
    
  • 检查网络连通性

    • 确认运行PHP代码的主机能正常ping通PLC的IP(192.168.0.229)
    • 检查PLC的Modbus TCP默认端口(502)是否被防火墙拦截,确保PHP主机的出站规则允许访问该端口
  • 优化异常捕获逻辑
    原异常输出信息不够直观,修改后可更清晰展示错误:

    catch (Exception $e) {
        echo "错误详情:" . $e->getMessage() . "<br>";
        echo "Modbus通信状态:" . $modbus . "<br>";
        exit;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:35:22