使用Visual Studio开发WINCC或FactroryTalk View 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创建控件属性

在上图中点击”查看代码”,打开代码编辑界面。在代码在最上方添加如下代码:

Imports System.ComponentModel

在Public Class Car和End Class之间加入以下代码:

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之间加入以下代码:

Public Event CarPlate_Change()

在_CarPlate = value和Refresh()之间添加

RaiseEvent CarPlate_Change()

即当该属性发生变化之后,引发CarPlate_Change事件。

3.5查看事件效果

在Form1的代码内,可以编写程序以响应(Handles)Car1的CarPlate_Change事件。

3.6创建控件方法

可以根据实际需要创建所需的方法,如我们需要在控件上输出填写的CarPlate属性值:

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文件

生成的控件文件存储在项目目录下的BinDebug内,整体路径形如:C:UsersxxxxsourcereposFirstControlFirstControlBinDebug

一般我们需要.dll和.tlb文件,将这些文件复制到相应的电脑内(我放置于虚拟机内)进行测试

4.2WINCC调用

选择.NET对象

“添加…”按钮选择生成的DLL文件,并勾选Car控件。

将控件拖放到工作区域,在控件属性内也会有我们添加的属性”CarPlate”,可以随意修改该参数,画面上文本也会随之改变。

对象事件内也创建了一个CarPlate_Change事件。

4.3SE调用

选择.NET对象

“浏览…”按钮选择生成的DLL文件,并勾选Car控件。

点击Car设置,可以进行手动赋值,也可以参考下面的VBA代码进行赋值。

也可以在连接中关联标签或者表达式。

不过事件暂时无法调用,待后期进行测试,查看第6部分后续

5.整体代码

Car.vb内的代码

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),最终代码如下

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

版权声明:本文内容来源于网络搜集无法获知原创作者,仅供个人学习用途,若侵犯到您的权益请联系我们及时删除。邮箱:1370723259@qq.com

发表评论