大家好!我是付工。

对于工控行业的人来说,组态软件应该都不陌生。

比如西门子WinCC,亚控的组态王,国产力控等。

经常有人会说,C#上位机是不是就是为了取代组态软件?

组态软件是不是就没用了呢?

今天我们来聊聊上位机与组态软件的那些事儿。

一、个人观点

所谓组态软件,就是厂家已经将各种模块都封装好,我们只需要拖拖拽拽结合可视化的配置就可以开发好一个软件,某些复杂的功能需要配合脚本来实现,一般过程控制会使用较多,如果是运动控制、机器视觉或者MES等就无法实现了。

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接口解压并访问这些数据,也可以通过Ado.Net的方式。

三、WinCC应用上位机

我们再看看上位机如何弥补WinCC的一些功能不足,比如自定义控件协议或自定义协议,WinCC从7.0版本开始支持.NET自定义控件,也就是说C#编写的各种自定义控件都可以很容易集成到WinCC中。

首先,我们使用WinCC创建一个空的项目,项目名称为WinCCPro,便于后续测试。

我们在WinCC项目中,创建一个单独的文件夹,命名为NETControl,这里,我们首先要明白,我们用C#开发出来的控件库的本质是一个dll文件,所以,我们将前面章节编译生成的控件库dll文件复制到NETControl文件夹中,如图所示:

图片

在WinCCPro项目中,右击【新建画面】创建一个新的WinCC画面Main.Pdl并将该画面设置为启动画面,打开该画面,在右侧的工具箱中,选择【控件】选项卡,我们可以看到.NET控件,如图所示:

图片

选中.NET控件,右击【添加/删除】,在弹出的【选择.NET对象】界面中,点击【添加】按钮,我们通过项目的路径,找到NETControl文件夹,找到ControlLib.dll文件,点击【打开】按钮,我们在可用控件列表中就可以找到ControlLib中的所有控件,这里勾选ButtonEx、HeadPanel及TextShow三个控件,最后点击【确定】按钮,如图所示:

图片

完成上述操作后,我们在控件工具箱中,就可以看到前面添加的控件了,这样就实现了将.NET控件库中的控件添加到WinCC中,如图所示:

图片

此外,我们还可以将一些业务和通信封装在自定义控件中,然后嵌入到WinCC中来实现一些WinCC实现不了的功能。

这里以ModbusRTU协议为例,其他自定义协议类似,我们都知道,WinCC是不能直接支持ModbusRTU通信的。

这里我做了一个测试,开发了一个自定义控件,里面集成了串口连接及ModbusRTU通信协议读取温湿度,仅为测试使用,因此功能做的很简单:

图片

我将这个控件集成到WinCC中,和一个温湿度模块连接,成功读取到了温湿度数据。

图片

更多推荐