SIEMENS西门子福建省福州市(授权)电机一级代理商——西门子华南总代理
| 更新时间 2024-11-26 07:00:00 价格 请来电询价 西门子总代理 PLC 西门子一级代 驱动 西门子代理商 伺服电机 联系电话 15903418770 联系手机 15915421161 联系人 张经理 立即询价 |
对于上位机而言,快速的高质量交付依然极为重要。在上位机项目中,通信毫无疑问是极为重要的一个模块。不同的项目需要的变量不一样,连接的设备类型和数量也不一样。那么对于上位机的通信这块,我们如何才能快速的高质量完成和设备的数据交互?
图1 C#上位机项目实例网络图
有的项目只需要对接一台plc,有的项目可能需要对接多台。有的PLC可能只需要访问几个变量,而有的PLC可能需要访问几百、数千甚至上万变量。那种用Modbus RTU或者一个串口自定义协议连接一个小I/O模块的Demo在现实中几乎没有,毫无实际意义。既然要学上位机,那么肯定奔着高水准去。有能力挑战大项目才算真正掌握了C#上位机。
说了这么多,那么如何合理地规划数据交互模块?我觉得Zui重要的一点就是实现变量与驱动的解耦。多设备、多变量的项目,如果不能做到变量和驱动的解耦,那么编程与调试工作量将非常大。
关于变量与驱动的解耦我们有两种方案,方案一用于我们重构的C#上位机项目实例中。方案二技术难度更大一点,用于我们的C#上位机框架HwLib.AdvSCADA中。今天我们要介绍的是方案一。在方案一中,每种驱动拥有一个独立的线程。它根据我们传递进来的报文要求发送数据读取指令到设备。然后再将读取到的报文返回。在返回报文时通过事件通知的方式调用解析方法,将报文解析到对应的变量。在UI层中或者其它模块中,我们只需要关联这些变量名即可。这样我们可以将工作重心放在业务逻辑上,不再需要关注驱动。
在我们的C#上位机项目实例中的早期版本其实变量和驱动也并没有实现解耦。在这次版本大升级过程中。我们重构了驱动模块。下面以这次重构来简单介绍了我们的方案一。这次重构,我们的C#上位机实例集成了两种通信协议,分别是S7和Modbus。以Modbus为例,我们首先基于EasyModbus做了二次封装。对外提供了读取与写入两个公开方法,另外增加了两个事件,分别是连接状态改变事件和数据更新事件。
驱动类封装后放在DAL层。无论我们后续其它项目中有多少设备或者仪表,我们都不再需要修改这个类。而只需要在BLL层中实例化这个类并传递变量信息即可。Meter是我们在BLL中创建的一个类,用于根据仪表数量实例化驱动并管理变量。在其它UI或者模块中,我们只需要关联这里的变量就行了。
其中订阅状态改变事件是为了在标题栏显示连接状态。
图2 设备状态显示
在方法ByteList中,我们会传递请求的报文信息到驱动。驱动类根据我们传递的报文到PLC中请求数据。
mdb.ReadMsgList.Add(msg); }
报文解析方法会在驱动类ModbusTCP的数据更新时触发。它会对驱动类ModbusTCP返回的byte[]类型报文解析并关联到变量。这样我们在UI层或者其它模块就可以直接使用变量名称来获取数据了。至于UI层,我们可以用定时器,也可以用订阅事件的方法来刷新数据。
由于刷新数据并不占用多少资源,所以我们在UI界面采用了定时器更新。
该方案实现了变量和驱动的解耦。对于不同项目的设备和变量的不同,我们只需要在BLL层根据工艺要求调整变量即可,而不用再修改驱动层。这种方式极大地提高了工程效率。