使用Visual Studio开发WINCC或FTView SE的.Net控件
自FactoryTalk View SE 13版起Rockwell的这款SCADA软件开始支持.Net控件。大家可以使用更为丰富的控件的同时,也可以自行编写.Net控件以进行支持。
由于本人一直基于VB/VB.NET进行开发,因此以该语言给大家进行讲解。
1.环境
我使用Visual Studio 2022社区版进行开发。
面向个人-任何个人开发人员都能使用 Visual Studio Community 创建自己的免费或付费应用。
面向组织-组织中的用户(数量不限)可以将 Visual Studio Community 用于以下方案: 教室学习环境、学术研究或参与开放源代码项目。
2.创建项目
2.1创建控件项目
打开Visual Studio 2022后选择Visual Basic-Windows-桌面,下拉找到”Windows窗体控件库(.Net Framework)”,并点击下一步,如下图所示:
在接下来的界面中输入项目名称,并选择所需要使用的框架版本,该版本也可在创建之后进行修改。并点击”创建”按钮。
如下图所示会打开VS的编辑界面。
一个项目内(即生成的Dll文件)可以包含有多个控件,我们可以在项目树形栏上点右键,”添加”-“新建项…”以添加新的控件、模块、窗体等文件。
如下图所示
2.2创建引用项目
我们要先在VS内进行控件的测试,因此我们在解决方案内创建一个Demo项目。
选择Windows窗体应用(.NET Framework):
修改项目名称为FirstControl.Demo。
2.3引用FirstControl控件
在FirstControl.Demo工程内,右键”引用”-“添加引用”
勾选”解决方案”内的FirestControl,并点击确定
2.4修改启动项目
设置FirestControl.Demo项目为启动项目,在项目上点击右键,”设为启动项目”
2.5修改FirestControl属性
在FirestControl项目上右键,”属性”,打开应用程序属性界面。
“应用程序”-“程序集信息…”-勾选”使程序集COM可见”
“编译”-勾选”为COM互操作注册”
3.修改控件
3.1修改名称
在UserControl1上右键,”重命名”,修改为所需要的控件名称,我将其修改为”Car”。
3.2创建控件属性
在上图中点击”查看代码”,打开代码编辑界面。在代码在最上方添加如下代码:
1 |
Imports System.ComponentModel |
在Public Class Car和End Class之间加入以下代码:
1 2 3 4 5 6 7 8 9 10 11 |
Private _CarPlate As String = "" <Description("车牌号"), Category("RickKingUI")> Public Property CarPlate As String Get Return _CarPlate End Get Set(ByVal value As String) _CarPlate = value Refresh() End Set End Property |
_CarPlate为内部变量,CarPlate为属性。Description和Category分别代指本控件的CarPlate属性在调用时的属性栏内的显示描述和所属类目
3.3查看属性效果
在FirestControl项目上右键,”重新生成”。在FirestControl.Demo项目中,双击打开”Form1″,在左侧的工具栏内发现有刚才创建的Car控件。
将该控件拖动到”Form1″窗体的空白处。在右下角的属性栏内,即可发现我们刚刚创建的CarPlate属性。
3.4创建控件事件
回到Car.vb的代码编辑界面,在Public Class Car和End Class之间加入以下代码:
1 |
Public Event CarPlate_Change() |
在_CarPlate = value和Refresh()之间添加
1 |
RaiseEvent CarPlate_Change() |
即当该属性发生变化之后,引发CarPlate_Change事件。
3.5查看事件效果
在Form1的代码内,可以编写程序以响应(Handles)Car1的CarPlate_Change事件。
3.6创建控件方法
可以根据实际需要创建所需的方法,如我们需要在控件上输出填写的CarPlate属性值:
1 2 3 4 5 6 |
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) If String.IsNullOrEmpty(_CarPlate) Then Return Dim g As Graphics = e.Graphics Dim f As Font = New Font("宋体", 10) g.DrawString(_CarPlate, f, Brushes.Black, 20, 20) End Sub |
3.7查看方法效果
在Form1的绘制界面可以看到显示效果,如果没有显示出来,则需要重新生成一下FirestControl控件
4.效果
4.1生成DLL文件
生成的控件文件存储在项目目录下的\Bin\Debug内,整体路径形如:C:\Users\xxxx\source\repos\FirstControl\FirstControl\Bin\Debug
一般我们需要.dll和.tlb文件,将这些文件复制到相应的电脑内(我放置于虚拟机内)进行测试
4.2WINCC调用
选择.NET对象
“添加…”按钮选择生成的DLL文件,并勾选Car控件。
将控件拖放到工作区域,在控件属性内也会有我们添加的属性”CarPlate”,可以随意修改该参数,画面上文本也会随之改变。
对象事件内也创建了一个CarPlate_Change事件。
4.3SE调用
选择.NET对象
“浏览…”按钮选择生成的DLL文件,并勾选Car控件。
点击Car设置,可以进行手动赋值,也可以参考下面的VBA代码进行赋值。
也可以在连接中关联标签或者表达式。
不过事件暂时无法调用,待后期进行测试,查看第6部分后续
5.整体代码
Car.vb内的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Imports System.ComponentModel Public Class Car Public Event CarPlate_Change() Private _CarPlate As String = "" <Description("车牌号"), Category("RickKingUI")> Public Property CarPlate As String Get Return _CarPlate End Get Set(ByVal value As String) _CarPlate = value RaiseEvent CarPlate_Change() Refresh() End Set End Property Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) If String.IsNullOrEmpty(_CarPlate) Then Return Dim g As Graphics = e.Graphics Dim f As Font = New Font("宋体", 10) g.DrawString(_CarPlate, f, Brushes.Black, 20, 20) End Sub End Class |
6.后续
查了一下SE所支持的标准程序,需要将CarPlate_Change事件定义为EventHandler,且触发时应采用RaiseEvent CarPlate_Change(Me, New EventArgs),最终代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Imports System.ComponentModel Public Class Car Public Event CarPlate_Change As EventHandler Private _CarPlate As String = "" <Description("车牌号"), Category("RickKingUI")> Public Property CarPlate As String Get Return _CarPlate End Get Set(ByVal value As String) _CarPlate = value RaiseEvent CarPlate_Change(Me, New EventArgs) Refresh() End Set End Property Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) If String.IsNullOrEmpty(_CarPlate) Then Return Dim g As Graphics = e.Graphics Dim f As Font = New Font("宋体", 10) g.DrawString(_CarPlate, f, Brushes.Black, 20, 20) End Sub End Class |
坐等大佬D盘更新,祝大佬全家福寿安康
有公众号之类的吗,之前这个网站打不开了
[…] 关于使用Change…
[…] 关于使用Functi…
谢谢提醒,已删 :)