经常有人会问我,C#上位机是不是就是为了取代组态软件?组态软件是不是就没用了?
今天跟大家聊聊,上位机与组态软件之间的那些事儿。
应用
首先我认为,C#上位机并不是为了取代组态软件,而是对组态软件的补充,C#上位机与组态软件有各自应用的场合。
如果你懂组态,不会C#编程,愿意购买组态授权,项目没有特殊的需求,比如自定义协议、复杂业务、对接第三方系统等,组态软件从功能和界面上能够满足需求,那么,组态软件无疑是适合的。
如果你可以独立开发上位机,不愿意购买组态软件,那么你肯定会选择自主开发上位机。
技术本质上没有好坏之分,技术是为了服务于项目,结合自身情况,结合不同场合选择合理的技术方案,才是技术人的意义所在。
那么,有没有一种场合,可以将C#上位机与组态软件联合起来使用呢?下面就以西门子的WinCC为例,谈谈上位机如何联合组态软件实现通信。
我打算从两个方面来说明,一种是上位机通过WinCC来获取数据,另一种是上位机如何弥补WinCC的一些功能不足。
上位机读取WinCC
我们首先看下上位机如何通过WinCC来获取到数据,有这么几种方案,可以参考一下:
前提是WinCC项目已经开发好,并且处于运行状态,运行WinCC画面,这里连接了一个S7-1500的PLC,如下图所示:
第一种方案:通过WinCC的运行时库
WinCC安装目录中有两个dll,分别是CCHMIRuntime.dll和CCHMITags.dll,位置默认处于C:\Program Files (x86)\Common Files\Siemens\Bin,将这两个dll复制到debug根目录下并手动添加引用,然后创建通信对象。
CCHMIRUNTIME.HMIRuntime hmi = new CCHMIRUNTIME.HMIRuntime();
通过调用读取方法即可实现读取。
hmi.Tags["data1"].Read()
第二种方案:通过WinCC的OPC服务器
WinCC从V7.2版本开始支持OPC服务器,可以支持OPCDA和OPCUA,我们直接通过一个OPC客户端来连接测试一下:
第三种方案:通过WinCC的数据库
WinCC的数据库使用的是SQLServer,WinCC变量归档数据是以压缩的形式存储在数据库中的,第三方开发的应用程序可以通过WinCC提供的OLE-DB接口解压并访问这些数据。
上位机嵌入WinCC
我们再看看上位机如何弥补WinCC的一些功能不足,比如自定义协议或WinCC不支持的一些协议,WinCC从7.0版本开始支持.NET自定义控件,所以我们可以将一些业务和通信封装在自定义控件中,然后嵌入到WinCC中来实现一些WinCC实现不了的功能。
这里以ModbusRTU协议为例,其他自定义协议类似,我们都知道,WinCC是不能直接支持ModbusRTU通信的。
这里我做了一个测试,开发了一个自定义控件,里面集成了串口连接及ModbusRTU通信协议读取温湿度,仅为测试使用,因此功能做的很简单:
我将这个控件集成到WinCC中,和一个单片机连接,成功读取到了温湿度数据。