当前位置: 首页 > news >正文

Hyperf 对接 PLC

以下是 Hyperf 对接 PLC 的完整方案,按协议分类: --- 协议选择 PLC 通信协议主要有三种,选哪个取决于你的 PLC 品牌: ┌────────────┬─────────────────────────────────┬─────────────────────────┐ │ 协议 │ 适用 PLC │ 推荐库 │ ├────────────┼─────────────────────────────────┼─────────────────────────┤ │ Modbus TCP │ 通用(三菱、台达、施耐德等) │ aldas/modbus-tcp-client │ ├────────────┼─────────────────────────────────┼─────────────────────────┤ │ S7 协议 │ 西门子 S7-200/300/400/1200/1500 │ snap7(PHP 扩展)│ ├────────────┼─────────────────────────────────┼─────────────────────────┤ │ OPC UA │ 现代 PLC 通用标准 │ 中间件方案 │ └────────────┴─────────────────────────────────┴─────────────────────────┘ --- 推荐方案:aldas/modbus-tcp-client 这是 PHP 生态里最活跃、维护最好的 Modbus 库(199 stars,持续更新),且底层用原生 socket,可以配合 Swoole 协程 hook 实现非阻塞。 安装composerrequire aldas/modbus-tcp-client Hyperf 集成示例 在 Hyperf 中,Swoole 的 HOOK_ALL 会自动 hook socket,所以直接用即可:<?php namespace App\Service;use ModbusTcpClient\Network\BinaryStreamConnection;use ModbusTcpClient\Packet\ModbusFunction\ReadHoldingRegistersRequest;use ModbusTcpClient\Packet\ModbusFunction\ReadHoldingRegistersResponse;use ModbusTcpClient\Packet\ResponseFactory;use ModbusTcpClient\Utils\Types;class PlcService{private string$host;private int$port;publicfunction__construct(string$host='192.168.1.100', int$port=502){$this->host=$host;$this->port=$port;}// 读取保持寄存器(Holding Registers,功能码 0x03) publicfunctionreadHoldingRegisters(int$startAddress, int$quantity): array{$connection=BinaryStreamConnection::getBuilder()->setPort($this->port)->setHost($this->host)->setConnectTimeoutSec(1.5)->setReadTimeoutSec(1.5)->build();$request=new ReadHoldingRegistersRequest($startAddress,$quantity, unitId:1);try{$connection->connect();$binaryData=$connection->sendAndReceive($request);/** @var ReadHoldingRegistersResponse$response*/$response=ResponseFactory::parseResponseOrThrow($binaryData);$result=[];foreach($responseas$address=>$word){$result[$address]=$word->getInt16();}return$result;}finally{$connection->close();}}// 写单个寄存器(功能码 0x06) publicfunctionwriteSingleRegister(int$address, int$value): void{$connection=BinaryStreamConnection::getBuilder()->setPort($this->port)->setHost($this->host)->build();$request=new\ModbusTcpClient\Packet\ModbusFunction\WriteSingleRegisterRequest($address,$value, unitId:1);try{$connection->connect();$connection->sendAndReceive($request);}finally{$connection->close();}}}在 Controller 中使用<?php namespace App\Controller;use App\Service\PlcService;use Hyperf\Di\Annotation\Inject;class PlcController extends AbstractController{#[Inject]private PlcService$plcService;publicfunctionreadData(): array{// 读取地址40001开始的10个寄存器return$this->plcService->readHoldingRegisters(0,10);}}高频轮询(定时任务)<?php namespace App\Crontab;use App\Service\PlcService;use Hyperf\Crontab\Annotation\Crontab;#[Crontab(rule: '* * * * *', name: 'PlcPoll', memo: 'PLC数据采集')]class PlcPollCrontab{publicfunctionexecute(): void{$service=make(PlcService::class);$data=$service->readHoldingRegisters(0,20);// 存入 Redis 或数据库}}--- 西门子 S7 方案 如果是西门子 PLC,用 snap7 C 库 + PHP FFI:# 安装 snap7apt-getinstalllibsnap7-dev# 或者用 Docker 镜像直接带 snap7也可以走 S7 → OPC UA → PHP 的中间件架构,用 Node.js/Python 做 OPC UA 桥接,Hyperf 通过 HTTP/Redis 消费数据,这样更稳定。 --- 关键注意事项1. 连接池 — PLC 通常只支持少量并发连接(1-8个),务必用连接池控制并发2. 超时设置 — 网络抖动时要有重试机制,避免协程泄漏3. Unit ID — 不同 PLC 的 Unit ID 不同,西门子通常是255,其他默认14. 字节序 — 不同 PLC 大小端不同,aldas 库提供了 getInt16()/ getUInt32()等方法处理
http://www.jsqmd.com/news/685720/

相关文章:

  • 2026年热门的塑料降解袋/淀粉基降解袋多家厂家对比分析 - 行业平台推荐
  • 【图像质量评估实战】从PSNR到FID:五大指标原理、代码与选型指南
  • 告别OOM错误!FLUX.1-dev旗舰版24G显存优化配置详解
  • 葡萄园小型开沟机的设计(说明书+14张CAD图纸+开题报告+任务书……)
  • 2026年航空航天用铜合金材供应商推荐指南:黄铜管/黄铜线/黄铜钥匙板/h62黄铜板/h65黄铜板/大口径铝管/选择指南 - 优质品牌商家
  • 2026年评价高的圆网印花机/无锡放式圆网印花机/无锡磁棒圆网印花机优质厂家汇总推荐 - 行业平台推荐
  • 2026年3月售后完善的工字钢供应厂家推荐,镀锌角钢/方管/圆钢/冷拔圆钢/镀锌槽钢,工字钢总代理联系电话 - 品牌推荐师
  • Go语言怎么实现生产者消费者_Go语言生产者消费者模式教程【精通】
  • 5分钟快速部署OBS-RTSPServer:免费RTSP直播流终极指南
  • FLUX.1-Krea-Extracted-LoRA入门必看:BFloat16与FP16精度损失对比测试
  • 2026年评价高的环保降解袋/全生物降解袋/东莞生物降解袋/塑料降解袋源头工厂推荐 - 品牌宣传支持者
  • 文件IO总结+不关闭文件导致资源泄露问题
  • 3步解锁Beyond Compare 5:从RSA密钥到自定义许可证的实战指南
  • Pi0 Robot Control Center开发者案例:基于Gradio定制化UI的机器人策略可视化平台
  • 从Wi-Fi到二维码:聊聊线性分组码(汉明码)在我们身边的那些‘隐形守护’
  • VCU整车Simulink应用层模型:涵盖高压上下电、车辆蠕动等核心功能,新能源汽车开发必备工...
  • 2026年质量好的宁夏皮红毛亮氧化锌/混合均匀度高的氧化锌用户口碑推荐厂家 - 行业平台推荐
  • 万物识别镜像效果实测:小麦锈病识别案例,对比易混淆病害
  • Qwen3-4B-Instruct实战案例:用webui.py扩展API接口支持企业系统集成
  • 终极网盘直链解析指南:八大平台高速下载解决方案
  • 061篇:流程优化技巧:如何让机器人跑得更快
  • Xamarin.Android开发避坑:搞定东大集成PDA扫码广播的完整配置流程(附Demo)
  • STM32 UDS Bootloader 诊断系统功能详解
  • 八大网盘直链解析终极指南:告别限速困扰的免费高效解决方案
  • Qwen3-4B-Thinking-Gemini-Distill入门指南:不同GPU型号(A10/A100/4090)性能对比
  • 别再手动算工时了!手把手教你用JIRA Tempo插件搞定研发成本统计(附权限配置避坑点)
  • WAN2.2文生视频镜像部署教程:Ubuntu/CUDA12.1+RTX4090高效运行实录
  • 革命性3D数据转换:stltostp如何打破STL到STEP的行业壁垒
  • 海康车牌识别一体机控制道闸起落杆的Java实战:从官方文档的“坑”到稳定调优
  • 乙巳马年春联生成终端开源可部署:国产昇腾910B芯片适配方案