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

已完成真实PLC驱动实现(无缝对接上一个优化版本)

✅ 已完成真实PLC驱动实现(无缝对接上一个优化版本)

我对代码进行了最小侵入式升级,新增了驱动层设计:

  • IPlcDriver 接口:统一模拟/真实PLC的所有读写操作
  • SimulatedPlcDriver:原有内存模拟(完全保留)
  • MelsecMcPlcDriver真实三菱PLC驱动(基于 HslCommunication 库,最推荐)
  • PLC 类改为依赖注入驱动,默认使用模拟驱动
  • 所有原有SetStatusGetDataGetAllStatus等扩展方法无需任何修改即可使用真实PLC

1. 添加 NuGet 包(仅真实驱动需要)

Install-Package HslCommunication

(HslCommunication 是国内工业自动化领域最成熟的开源库,支持三菱 Q/FX5/iQ-R、Modbus、欧姆龙、西门子等,直接支持您界面中的M0D200X0等地址)


2. 新增/修改的完整代码(直接复制覆盖或新增)

usingSystem;usingSystem.Collections.Generic;usingHslCommunication;// 真实驱动需要usingHslCommunication.Profinet.Melsec;// 真实驱动需要// ====================== 1. PLC 驱动接口 ======================publicinterfaceIPlcDriver{boolReadBool(stringaddress);voidWriteBool(stringaddress,boolvalue);shortReadInt16(stringaddress);voidWriteInt16(stringaddress,shortvalue);floatReadFloat(stringaddress);voidWriteFloat(stringaddress,floatvalue);voidConnect();voidDisconnect();}// ====================== 2. 模拟驱动(原有内存逻辑) ======================publicclassSimulatedPlcDriver:IPlcDriver{privatereadonlyDictionary<string,object>_memory=new();privatereadonlyobject_lock=new();publicSimulatedPlcDriver(){InitializeDefaultValues();}privatevoidInitializeDefaultValues(){lock(_lock){// 所有Bool地址初始化为 falseforeach(varaddrinGetAllBoolAddresses())_memory[addr]=(short)0;// 实时数据默认值_memory["D200"]=(short)0;_memory["D202"]=(short)0;_memory["D204"]=(short)0;_memory["D206"]=(short)0;_memory["D208"]=(short)0;_memory["D210"]=(short)0;_memory["D212"]=(short)0;_memory["D214"]=(short)0;_memory["D216"]=0f;_memory["D218"]=0f;_memory["D220"]=0f;_memory["D222"]=0f;}}privatestaticIEnumerable<string>GetAllBoolAddresses(){returnEnumerable.Range(0,21).Select(i=>$"M{i}").Concat(Enumerable.Range(50,22).Select(i=>$"M{i}")).Concat(Enumerable.Range(100,25).Select(i=>$"M{i}")).Concat(Enumerable.Range(300,9).Select(i=>$"M{i}")).Concat(Enumerable.Range(400,6).Select(i=>$"M{i}")).Append("X0");}publicboolReadBool(stringaddress)=>Convert.ToBoolean(GetValue(address));publicvoidWriteBool(stringaddress,boolvalue)=>SetValue(address,value?(short)1:(short)0);publicshortReadInt16(stringaddress)=>Convert.ToInt16(GetValue(address));publicvoidWriteInt16(stringaddress,shortvalue)=>SetValue(address,value);publicfloatReadFloat(stringaddress)=>Convert.ToSingle(GetValue(address));publicvoidWriteFloat(stringaddress,floatvalue)=>SetValue(address,value);publicvoidConnect(){}// 模拟无需连接publicvoidDisconnect(){}privateobjectGetValue(stringaddress){lock(_lock)return_memory.TryGetValue(address,outvarval)?val:0;}privatevoidSetValue(stringaddress,objectvalue){lock(_lock)_memory[address]=value;}}// ====================== 3. 真实三菱PLC驱动(推荐) ======================publicclassMelsecMcPlcDriver:IPlcDriver{privatereadonlyMelsecMcNet_plc;// 支持 Q系列、FX5、iQ-R 等publicMelsecMcPlcDriver(stringipAddress,intport=5000){_plc=newMelsecMcNet(ipAddress,port){ConnectTimeOut=2000,ReceiveTimeOut=2000};}publicvoidConnect(){varresult=_plc.ConnectServer();if(!result.IsSuccess)thrownewException($"PLC连接失败:{result.Message}");}publicvoidDisconnect()=>_plc.DisconnectServer();publicboolReadBool(stringaddress){varresult=_plc.ReadBool(address);if(!result.IsSuccess)thrownewException($"ReadBool{address}失败:{result.Message}");returnresult.Content;}publicvoidWriteBool(stringaddress,boolvalue){varresult=_plc.Write(address,value);if(!result.IsSuccess)thrownewException($"WriteBool{address}失败:{result.Message}");}publicshortReadInt16(stringaddress){varresult=_plc.ReadInt16(address);if(!result.IsSuccess)thrownewException($"ReadInt16{address}失败:{result.Message}");returnresult.Content;}publicvoidWriteInt16(stringaddress,shortvalue){varresult=_plc.Write(address,value);if(!result.IsSuccess)thrownewException($"WriteInt16{address}失败:{result.Message}");}publicfloatReadFloat(stringaddress){varresult=_plc.ReadFloat(address);// 自动读取两个字if(!result.IsSuccess)thrownewException($"ReadFloat{address}失败:{result.Message}");returnresult.Content;}publicvoidWriteFloat(stringaddress,floatvalue){varresult=_plc.Write(address,value);// 自动写两个字if(!result.IsSuccess)thrownewException($"WriteFloat{address}失败:{result.Message}");}}// ====================== 4. 更新后的 PLC 核心类 ======================publicclassPLC{privatereadonlyIPlcDriver_driver;/// <summary>/// 值变化事件(仅模拟模式下写操作会触发,真实PLC可自行轮询)/// </summary>publiceventAction<string,object>?OnValueChanged;/// <summary>/// 创建PLC实例/// </summary>/// <param name="driver">传入 null 则使用模拟驱动;传入 MelsecMcPlcDriver 则使用真实PLC</param>publicPLC(IPlcDriverdriver=null){_driver=driver??newSimulatedPlcDriver();}// ====================== 核心读写(供扩展方法调用) ======================publicboolGetBool(stringaddress)=>_driver.ReadBool(address);publicvoidSetBool(stringaddress,boolvalue){_driver.WriteBool(address,value);OnValueChanged?.Invoke(address,value);}publicshortGetInt16(stringaddress)=>_driver.ReadInt16(address);publicvoidSetInt16(stringaddress,shortvalue){_driver.WriteInt16(address,value);OnValueChanged?.Invoke(address,value);}publicfloatGetFloat(stringaddress)=>_driver.ReadFloat(address);publicvoidSetFloat(stringaddress,floatvalue){_driver.WriteFloat(address,value);OnValueChanged?.Invoke(address,value);}publicvoidConnect()=>_driver.Connect();publicvoidDisconnect()=>_driver.Disconnect();}

5. 使用示例(推荐方式)

// ==================== 方式1:模拟模式(默认,开发测试用) ====================PLCplc=newPLC();// 自动使用 SimulatedPlcDriver// ==================== 方式2:真实三菱PLC(生产/调试用) ====================PLCplcReal=newPLC(newMelsecMcPlcDriver("192.168.1.100",5000));// 替换为您的PLC IPplcReal.Connect();// 连接真实PLC// 以下代码完全不变!plcReal.SetStatus(PLCConfig.报警信号1.系统气源压力不足报警,true);boolalarm=plcReal.GetStatus(PLCConfig.报警信号1.系统气源压力不足报警);floatflow=(float)plcReal.GetData(PLCConfig.实时数据显示.实时流量);plcReal.SetData(PLCConfig.实时数据显示.实时流量,25.6f);// 一次性获取全部状态(界面刷新推荐)varallStatus=plcReal.GetAllStatus();

切换模拟/真实只需改一行构造函数,业务代码零修改!


6. 扩展说明

  • 想支持其他PLC(西门子、Modbus、欧姆龙等)?只需新增一个XXXPlcDriver : IPlcDriver实现即可。
  • 需要异步?可将接口方法改为Task<bool> ReadBoolAsync...,HslCommunication 本身也支持异步。
  • 实时监控变化?可在 UI 层加一个 Timer 每 200ms 调用GetAllStatus()刷新界面即可(真实PLC常用方式)。
  • 异常处理:真实驱动已抛出明确异常,便于界面提示“PLC通讯异常”。

需要我再加上异步版本批量读写优化自动重连Siemens S7驱动或其他协议版本,随时告诉我!

http://www.jsqmd.com/news/617273/

相关文章:

  • 5个高效DWG文件转换技巧:使用LibreDWG免费处理CAD数据
  • 快速体验AI文档解析:PDF-Parser-1.0 5分钟上手实战
  • 2026深圳幻影未来信息科技口碑如何,有什么独特优势 - 工业设备
  • 通向黑灯工厂的关键拼图:TVA在智能工厂中的战略地位(3)
  • SDXL-Turbo惊艳效果展示:霓虹公路+赛博朋克+4K写实风格实时生成对比
  • vLLM-v0.17.1多GPU分布式推理配置教程
  • iptables防火墙知识小结【20260410】010篇
  • 盒马鲜生礼品卡回收平台评测:最优选择都在这里! - 团团收购物卡回收
  • OBS Multi RTMP:直播达人的多平台同步推流终极解决方案
  • 网盘直链下载助手完整指南:八大平台真实地址一键获取
  • 数字内容智能访问:技术创新与实践指南
  • 探讨深圳幻影未来信息科技,北京地区该品牌数字人服务费用多少 - 工业品网
  • Pixel Couplet Gen 算法优化:卷积神经网络提升春联图像生成质量
  • 2026采光成品气楼厂家推荐:彩钢成品气楼/屋顶成品气楼/钢结构成品气楼厂家精选 - 品牌推荐官
  • 【4月首查预警】知网AIGC爆红别慌!10款免费论文降AI工具极限排雷,自救通关必看
  • AntiMicroX:让所有PC游戏都支持手柄的终极解决方案
  • Agent智能体设计:让万象熔炉·丹青幻境成为多模态AI智能体的“视觉大脑”
  • 喔去,litellm 竟然被投毒了,赶紧检查你的机器中招了没有胶
  • 礼品卡闲置不用?盒马鲜生在线回收平台帮您解决困扰 - 团团收购物卡回收
  • WarcraftHelper终极指南:让魔兽争霸III在现代系统上完美运行
  • AI超清画质增强镜像API封装实战:3步搞定图片高清化接口调用
  • 针对之前PLC代码的优化版本
  • Z-Image-Turbo LoRA WebUI保姆级调试指南:查看z-image-turbo-lora-webui.log定位报错
  • Windows Cleaner:终极C盘空间清理方案,告别系统卡顿与爆红警告
  • Qwen3-VL-8B-Instruct-GGUF部署教程:星图平台HTTP入口7860端口调试全攻略
  • 盒马鲜生礼品卡兑换攻略:安全又便捷的在线回收平台推荐 - 团团收购物卡回收
  • Xenos深度解析:Windows DLL注入技术的全面实战指南
  • RWKV7-1.5B-g1a实操手册:如何将生成结果自动存入MySQL?含SQL插入模板
  • 独立封装的 PLC 监控类(支持 JSON 配置 + 实时读取 + 界面显示 + GetValue 方法
  • AMD Ryzen SDT调试工具:5分钟掌握处理器深度调优的完整指南