能否通过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
相关产品推荐
相关产品推荐

