通常一个上位机项目中可能不止一台PLC,也可能除了PLC外,还连接有其它设备,比如带通信的仪表等。那么我们的代码就需要支持不同的通信协议,并且还需要支持这些具有相同或者不同协议的设备同时进行数据访问。
根据此设计规则,在重构的C#上位机实例中,为了使我们的项目可以方便的引入其它协议,我们抽象了一个通信类CommDrive。然后我们的S7和Modbus TCP都是派生自这个抽象类。
S7驱动
Modbus TCP驱动
只需要我们按照约定对协议进行封装,我们在项目中就可以无缝地访问不同协议的不同设备。在UI或者业务逻辑的编码中我们只需要绑定变量名称即可。不需要关心它采用的是哪种协议。设备数据由单独的异步任务负责,大家各司其职。
在下面的代码中,它根据变量“Pos_2“的上升沿归档产量信息。同时被归档的信息中,除了订单信息、公司信息等,还有来自变量资源池的重量数据。
if (pn[0].P(Convert.ToBoolean(PLC.TagsPLC1["Pos_2"].Value1.ToString()))){ ProductModel pm = new ProductModel(); pm.DT = DateTime.Now; pm.Order = ConfigurationManager.AppSettings["N1_Order"]; pm.Company = ConfigurationManager.AppSettings["N1_Company"]; pm.CarName = ConfigurationManager.AppSettings["N1_CarNumber"]; pm.Production = ConfigurationManager.AppSettings["N1_Production"]; pm.Silo = ConfigurationManager.AppSettings["N1_Silo"]; pm.Station = ConfigurationManager.AppSettings["N1_Station"]; pm.Weight = Math.Round(Convert.ToDouble(PLC.TagsPLC1["LastWeight"].Value1.ToString()),1); DAL.DBOperation.AddOperation(pm);}
综上,这种实现UI/业务逻辑与驱动解耦的架构主要有下面几点优势。具备这几点优势,我们的上位机代码才是真正的工程级代码。
代码的高复用率;
支持快速连接多种设备;
方便接入各种其它驱动;
便于维护与扩展;
快速排查问题;