FactoryTalk View Site Edition的VBA基本应用
- 格式:doc
- 大小:1.27 MB
- 文档页数:19
FactoryTalk View Site Edition的VBA基本应用技术部徐晟昕第一节在VBA中标签的读取和写入本例要达到的目标是通过FactoryTalk View Site Edition(以下简称SE)的VBA来访问PLC中的下位标签,并实现标签的读写。
1.准备工作打开SE,选择应用程序类型(本例是Site Edition Network),新建应用程序(本例取名:test),之后在test下新建area(本例取名:area1),在area下新建HMI Server (本例取名:HMI1),以下为完成之后截图:启动RSLogix Emulate 5000,并添加仿真CPU。
启动RSLogix 5000编程软件,新建工程,与仿真PLC建立通讯(Topic名称为:TestTopic),并编写简单测试程序并下载到仿真PLC。
在SE中新建OPC Data Server新建一个画面(名为:TestDispaly),并画上一个圆形和一个普通按钮将圆形与下位Tag2标签关联,并设置颜色改变;右键点击按钮,点击Property Panel,出现属性框,将Name项改为TestBtn、ExposeToVBA项改为VBA Control如图:2.编写代码并测试右键点击按钮,单击VBA Code(或按Alt+F11)弹出Visual Basic编辑器,如图添加如下代码:On Error Resume NextDim TgGObj As TagGroup ‘标签组对象Dim TagObj As Tag ‘标签对象Set TgGObj = CreateTagGroup(Me.AreaName) ‘创建标签组实例TgGObj.Add ("[TestTopic]Tag1") ‘向标签组中添加标签Set TagObj = TgGObj.Item("[TestTopic]Tag1") ‘创建标签实例If TagObj.Value = 1 Then ‘读取标签的值如果标签的值为1 TagObj.Value = 0 ’则将0写入标签,Else ‘反之则将1写入标签TagObj.Value = 1End IfSet TagObj = NothingSet TgGObj = Nothing标签组是一组标签的集合体。
在SE的VBA中,我们要想引用标签,需要先创建标签组,然后将本地标签或远程标签加入标签组,之后通过集合访问的方式引用标签组中的标签。
值得注意的是,SE中的标签类型并不是变量而是对象,也就是说我们需要用标签对象而不是普通变量去引用标签组中的单个标签。
测试画面,可以看到每次点击按钮,圆形的填充颜色都会发生变化,同时在RSLogix 5000中也能观察到标签状态的变化。
如图:在SE中:在RSLogix 5000中:点击按钮后变为绿色,再次点击按钮变为红色第二节运用VBA来简单处理运行历史数据本例的操作过程是在SE中新建本地内存标签(标签名:TestTag),使其值随时间(秒)自增,之后每按下一次存储按钮,实时的标签值和对应时间戳都会被写入数据库,然后我们可以在数据库中查看结果。
1.准备工作在SE中新建内存(memory)标签TestTag,类型为analog。
在第上一节中的test应用程序中新建一个画面,并取名为TestSimpleData,并画出两个字符串显示控件和三个按钮。
如图:属性对应关系:类型控件名是否暴露在VBA中所连标签标题按钮CreateTag 是Create Tag Object按钮DropTag 是Drop Tag Object按钮SaveData 是Save字符串显示StringDisplay1 是System\DateAndTimeString字符串显示StringDisplay2 否TestTag表2.2列名数据类型描述Time Char(20) 时间字符串Value Smallint 标签值ADO是微软公司提供的一个用于存取数据源的COM组件。
它提供了编程语言和统一数据访问方式OLE DB的一个中间层,允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。
本例将使用ADO来实现数据库相关操作。
在VBA编辑器中选择工具之后选择引用弹出如下对话框在左侧的列表中找到Microsoft ActiveX Data Objects *.*(其中*.*号代表版本号,选择最新版本即可)。
这样我们就可以在之后的编程中引用ADO对象了。
3.编写代码并测试在VBA编辑器中输入以下代码:Private OTag As TagPrivate OtagG As TagGroupPrivate Conn As New ADODB.Connection '创建ADO的Connection实例Private Rs As New ADODB.Recordset '创建ADO的Recordset实例Private Sub CreateTag_Released()Set OtagG = CreateTagGroup(Me.AreaName)OtagG.Add ("TestTag")Set OTag = OtagG.Item(1)Conn.ConnectionString = "provider=sqloledb;" & _"Data Source=127.0.0.1;Initial Catalog=test;" & _ '指定数据库主机地址、数据库名"User Id=sa;Password=0;" '指定用户名、密码Conn.Open '连接数据库Rs.CursorLocation = adUseServerRs.CursorType = adOpenStaticRs.LockType = adLockOptimisticRs.Open "select * from simple", Conn '从数据库返回数据集End SubPrivate Sub SaveData_Released()Rs.AddNew '在集中插入一条记录Rs.Fields.Item(0).Value = Date$ & " " & Time$Rs.Fields.Item(1).Value = OTag.ValueRs.Update '将数据写入数据库End SubPrivate Sub StringDisplay1_Change()On Error Resume NextIf Not OtagG Is Nothing Then _OTag.V alue = OTag.Value + 1 '当StringDisplay1发生改变时TestTag自增1 End SubPrivate Sub DropTag_Released()Rs.CloseConn.CloseOTag.V alue = 0Set OtagG = NothingEnd Sub测试运行。
先按下Create Tag Object按钮创建对象为接下来的操作做准备,然后随机几次按下Save按钮将不同时刻的TestTag值连同时间写入数据库,之后按Drop Tag Object按钮关闭各对象释放连接和内存空间。
下图为程序运行截图:下图为在数据库中simple表中的结果。
可以看到运行数据已经成功写入数据表。
第三节具有普遍性的历史数据处理方式本例在RSLogix 5000中编写了一个简单交通灯演示程序。
我们要达到的目的是将交通灯在工作过程中各个灯的亮灭情况记录下来,存入MS SQL Server中,并通过Excel提取存储在MS SQL Server中的数据。
1.准备工作在RSLinx中建立Topic,名称为“TL”,使其指向仿真PLC。
本下位程序中提供的标签及相关描述:表3.1标签名(布尔型)描述GreenLight1Range 南北向交通灯绿灯长亮范围GreenLight2Range 东西向交通灯绿灯长亮范围GreenLight1FlashRange 南北向交通灯绿灯闪烁范围GreenLight2FlashRange 东西向交通灯绿灯闪烁范围GreenLight 南北向交通灯绿灯长亮状态,与上位图形关联GreenLight2 东西向交通灯绿灯长亮状态,与上位图形关联YellowLight 南北向交通灯黄灯长亮状态,与上位图形关联YellowLight2 东西向交通灯黄灯长亮状态,与上位图形关联RedLight 南北向交通灯红灯长亮状态,与上位图形关联RedLight2 东西向交通灯红灯长亮状态,与上位图形关联DataUpdate 数据写入触发集数据,但每隔较长周期,向数据库中批量写入数据而不是实时写入。
在MS SQL Server中的test数据库中新建数据表tutorial,其中各列属性如下:列名数据类型描述ID SmallInt 自增列Time DateTime 时间戳GreenLight1 CharGreenLight2 CharYellowLight1 CharYellowLight2 CharRedLight1 CharRedLight2 Char在第一节中的test应用程序中新建一个画面,并取名为TestDatabase。
依照下图画出各图形:参照表一,将各代表交通灯的圆形与相应下位标签对应。
在Property Panel中将Start Scan按钮的Name改为StartScBtn,ExposeToVBA改为VBA Control;将Stop Scan按钮的Name改为StopScBtn,ExposeToVBA改为VBA Control。
由于运行时下位标签每秒钟变化一次,为了使上位画面的显示正常,我们需要将上位画面的刷新率(默认为1秒)加快。
右键点击画面空白处,在弹出的下拉菜单上选择Display Settings,然后将Maximum Tag Update Rate改为小于1的值,例如0.25。
2.事件驱动我们知道Visual Basic是事件驱动的编程机制,其中的控件都是通过事件触发而运行事件代码的。
在SE的VBA中,提供了对标签对象和标签组对象的事件支持。
我们先来做一个简单的实验。
新建一个画面,取名为VBA_Event。
画出两个按钮和一个文本控件(text)并将他们的ExposeToVBA属性设为VBA Control。
如图:之后打开VBA编辑器,将下面的代码加入Private WithEvents OTagG As TagGroup '声明标签组对象,并使能对象的事件Private OTag As TagPrivate Sub Button1_Released()Set OTagG = CreateTagGroup(Me.AreaName)OTagG.Add ("system\DateAndTimeString")Set OTag = OTagG.Item("system\DateAndTimeString")OTagG.Active = True '开启对标签组对象的事件监视End SubPrivate Sub OTagG_Change(ByVal TagNames As IGOMStringList)Text1.Caption = OTag.V alue '标签组中标签的值发生改变时将调用该过程End SubPrivate Sub Button2_Released()OTagG.Active = FalseSet OTagG = NothingEnd Sub测试运行,可以看到当点击On Scan按钮后,Text控件将显示当前的日期时间,并且它是动态变化的。