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 Next

Dim 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 = 1

End If

Set TagObj = Nothing

Set TgGObj = Nothing

标签组是一组标签的集合体。在SE的VBA中,我们要想引用标签,需要先创建标签组,然后将本地标签或远程标签加入标签组,之后通过集合访问的方式引用标签组中的标签。值得注意的是,SE中的标签类型并不是变量而是对象,也就是说我们需要用标签对象而不是普通变量去引用标签组中的单个标签。

测试画面,可以看到每次点击按钮,圆形的填充颜色都会发生变化,同时在RSLogix 5000中也能观察到标签状态的变化。如图:

在SE中:

在RSLogix 5000中:

第二节 运用VBA来简单处理运行历史数据

       本例的操作过程是在SE中新建本地内存标签(标签名:TestTag),使其值随时间(秒)自增,之后每按下一次存储按钮,实时的标签值和对应时间戳都会被写入数据库,然后我们可以在数据库中查看结果。

1.准备工作

        在SE中新建内存(memory)标签TestTag,类型为analog。

        在第上一节中的test应用程序中新建一个画面,并取名为TestSimpleData,并画出两个字符串显示控件和三个按钮。如图:

属性对应关系:

属性对应关系:

表2.1

类型

控件名

是否暴露在VBA中

所连标签

标题

按钮

CreateTag

Create Tag Object

按钮

DropTag

Drop Tag Object

按钮

SaveData

Save

字符串显示

StringDisplay1

System\DateAndTimeString

字符串显示

StringDisplay2

TestTag

在MS SQL Server中新建test数据库,之后在test下新建simple表。其中各列属性如下:

表2.2

列名

数据类型

描述

Time

Char(20)

时间字符串

Value

Smallint

标签值

2.对数据库连接与操作

    ADO是微软公司提供的一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层,允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。本例将使用ADO来实现数据库相关操作。

    在VBA编辑器中选择工具之后选择引用

弹出如下对话框

在左侧的列表中找到Microsoft ActiveX Data Objects *.*(其中*.*号代表版本号,选择最新版本即可)。这样我们就可以在之后的编程中引用ADO对象了。

3.编写代码并测试

在VBA编辑器中输入以下代码:

Private OTag As Tag

Private OtagG As TagGroup

Private 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 = adUseServer

Rs.CursorType = adOpenStatic

Rs.LockType = adLockOptimistic

Rs.Open "select * from simple", Conn                                   '从数据库返回数据集

End Sub

Private Sub SaveData_Released()

Rs.AddNew                                                                            '在集中插入一条记录

Rs.Fields.Item(0).Value = Date$ & " " & Time$

Rs.Fields.Item(1).Value = OTag.Value

Rs.Update                                                                               '将数据写入数据库

End Sub

Private Sub StringDisplay1_Change()

On Error Resume Next

If Not OtagG Is Nothing Then _

OTag.Value = OTag.Value + 1                                '当StringDisplay1发生改变时TestTag自增1

End Sub

Private Sub DropTag_Released()

Rs.Close

Conn.Close

OTag.Value = 0

Set OtagG = Nothing

End 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

数据写入触发

注:DataUpdate标签的作用:为了减轻上位以太网的网络负载压力,本程序设计为实时采集数据,但每隔较长周期,向数据库中批量写入数据而不是实时写入。

   在MS SQL Server中的test数据库中新建数据表tutorial,其中各列属性如下:

表3.2

列名

数据类型

描述

ID

SmallInt

自增列

Time

DateTime

时间戳

GreenLight1

Char

GreenLight2

Char

YellowLight1

Char

YellowLight2

Char

RedLight1

Char

RedLight2

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 Tag

Private Sub Button1_Released()

Set OTagG = CreateTagGroup(Me.AreaName)

OTagG.Add ("system\DateAndTimeString")

Set OTag = OTagG.Item("system\DateAndTimeString")

OTagG.Active = True                                                     '开启对标签组对象的事件监视

End Sub

Private Sub OTagG_Change(ByVal TagNames As IGOMStringList)

Text1.Caption = OTag.Value                          '标签组中标签的值发生改变时将调用该过程

End Sub

Private Sub Button2_Released()

OTagG.Active = False

Set OTagG = Nothing

End Sub

        测试运行,可以看到当点击On Scan按钮后,Text控件将显示当前的日期时间,并且它是动态变化的。这是因为时间日期的变化会触发标签组对象的Change事件并调用相应过程来更新Text控件的显示值,从而我们观察到Text控件实时地显示日期时间。

3.编写代码并测试

在RSLogix 5000中编写下位程序,之后将程序下载到仿真PLC中。

在SE中的打开VBA编辑器,引用Microsoft ActiveX Data Objects,之后添加如下代码:

Private WithEvents TgG As TagGroup

Private WithEvents TgG2 As TagGroup

Private Conn As New ADODB.Connection

Private Rs As New ADODB.Recordset

Private TempStr(6) As String

Private Sub StartScBtn_Released()

Conn.ConnectionString = "provider=sqloledb;" & _

"Data Source=127.0.0.1;Initial Catalog=test;" & _

"User Id=sa;Password=0;"

Conn.Open

Rs.CursorLocation = adUseServer

Rs.CursorType = adOpenStatic

Rs.LockType = adLockBatchOptimistic

Rs.Open Source:="tutorial", ActiveConnection:=Conn, options:=adCmdTable

Set TgG = CreateTagGroup(Me.AreaName)

Set TgG2 = CreateTagGroup(Me.AreaName)

TgG.Add ("[TL]GreenLight1Range")

TgG.Add ("[TL]GreenLight2Range")

TgG.Add ("[TL]GreenLight1FlashRange")

TgG.Add ("[TL]GreenLight2FlashRange")

TgG.Add ("[TL]YellowLight")

TgG.Add ("[TL]YellowLight2")

TgG.Add ("[TL]RedLight")

TgG.Add ("[TL]RedLight2")

TgG2.Add ("[TL]DataUpdate")

TgG.Active = True

TgG2.Active = True

End Sub

Private Sub StopScBtn_Released()

Set TgG = Nothing

Set TgG2 = Nothing

Rs.Close

Conn.Close

End Sub

Private Sub TgG_Change(ByVal TagNames As IGOMStringList)

On Error Resume Next

TempStr(0) = Date$ & " " & Time$

If TgG.Item(1).Value = 1 Then

 TempStr(1) = "On"

ElseIf TgG.Item(3).Value = 1 Then

 TempStr(1) = "Flash"

ElseIf TgG.Item(1).Value = 0 And TgG.Item(3).Value = 0 Then

 TempStr(1) = "Off"

End If

If TgG.Item(2).Value = 1 Then

 TempStr(2) = "On"

ElseIf TgG.Item(4).Value = 1 Then

 TempStr(2) = "Flash"

ElseIf TgG.Item(2).Value = 0 And TgG.Item(4).Value = 0 Then

 TempStr(2) = "Off"

End If

Dim i As Integer

For i = 5 To TgG.Count

 If TgG.Item(i).Value = 1 Then

  TempStr(i - 2) = "On"

 Else

  TempStr(i - 2) = "Off"

 End If

Next

Rs.AddNew

For i = 0 To 6

 Rs.Fields(i + 1).Value = TempStr(i)

Next

End Sub

Private Sub TgG2_Change(ByVal TagNames As IGOMStringList)

Rs.UpdateBatch

End Sub

说明:TgG2集合中只引用了一个标签[TL]DataUpdate,此标签组发生变化(也就是[TL]DataUpdate发生变化)会导致运行数据批量写入数据库的动作发生。在下位中该标签被设计为每隔30秒发生一次翻转。也就是说以30秒为周期,在这30秒中发生的灯的变化情况都会被临时地记录在本地,当一个周期结束时,这些临时的记录会被统一发送回数据库,更新数据表,完成真正的写入动作。

        运行中点击Start Scan按钮,实时数据就会被采集下来并写入数据库。当点击Stop Scan按钮则停止数据采集。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/343373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端进阶-分库分表

文章目录 为什么需要分库为什么需要分表 什么时候需要分库分表只需要分库只需要分表 分库分表解决方案垂直分库水平分库垂直分表水平分表 分库分表常用算法范围算法hash分片查表分片 分库分表模式客户端模式代理模式 今天跟着训练营学习了分库分表,整理了学习笔记。…

【Linux】进程(8):Linux真正是如何调度的

大家好,我是苏貝,本篇博客带大家了解Linux进程(8):Linux真正是如何调度的,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 之前我们讲过,在大…

[ubuntu18.04]搭建mptcp测试环境说明

MPTCP介绍 Multipath TCP — Multipath TCP -- documentation 2022 documentation 安装ubuntu18.04,可以使用虚拟机安装 点击安装VMware Tool 桌面会出现如下图标 双击打开VMware Tools,复制如下图所示的文件到Home目录 打开终端,切换到管…

C++结合ffmpeg获取声音的分贝值

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、分贝是什么?1.功率量2.场量 二、实际操作1.分析wav文件2.读取麦克风 总结 前言 最近面对一个需求,就是需要传递声音文件到模型里推…

CTFHUB-技能树-web-信息泄露

目录 1.目录遍历 2.PHPINFO 3.备份文件下载 3.1 网站源码 3.2 bak文件 3.3 vim缓存 3.4 .DS_Store 4.Git泄露 4.1 Log 4.2 Stash 4.3 Index 5.SVN泄露 6.HG泄露 1.目录遍历 这个没什么好讲的,进去直接点击找flag,然后在下面目录翻,就找到了 …

【Vue】路由介绍

一、引入 思考 单页面应用程序,之所以开发效率高,性能好,用户体验好 最大的原因就是:页面按需更新 比如当点击【发现音乐】和【关注】时,只是更新下面部分内容,对于头部是不更新的 要按需更新&#xff…

mysql 8 linux7,8安装教程

选择自己对应的linux版本 cat /etc/os-release //查看自己linux系统版本 1.mysql下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 拉到下面找到 选择自己linux指定的版本,否则会很麻烦 cat /etc/os-release //查看系统版本 2.查…

抱抱脸上第一的开原模型Qwen2-72B;腾讯开源人像照片生成视频的模型;Facebook开源翻译模型;智谱 AI 推出的最新一代预训练模型

✨ 1: Qwen2 Qwen2 是一种多语言预训练和指令调优的语言模型,支持128K上下文长度并在多项基准测试中表现优异。 Qwen2(全称“Qwen Qwen”,简称Qwen)是一个先进的大语言模型家族,在其前身Qwen1.5的基础上进行了重大提…

读取文件

自学python如何成为大佬(目录):自学python如何成为大佬(目录)_利用python语言智能手机的默认语言实战一-CSDN博客 在Python中打开文件后,除了可以向其写入或追加内容,还可以读取文件中的内容。读取文件内容主要分为以下几种情况: 1 读取指…

【人工智能】流行且重要的智能算法整理

✍🏻记录学习过程中的输出,坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞👍🏻收藏⭐评论✍🏻指点🙏 小记: 今天在看之前写的文档时,发现有人工智能十大算法的内容&#xf…

wireshark 二次开发

一、 Windows 准备 1、源代码下载 Git:https://github.com/wireshark/wireshark 2、 准备Visual C 要编译wireshark,开发电脑上应该安装了Visual Studio并包括了Visual C,请至少安装Visual Studio 2010以减少不必要的麻烦。 visual studio …

【ffmpeg】本地格式转换 mp4转wav||裁剪mp4

个人感受:太爽了!!!(可能用惯了转换网站和无良的转换软件) ———— 使用FFmpeg把mp4文件转换为WAV文件 - 简书 (jianshu.com) FFMPEG 视频分割和合并 - 简书 (jianshu.com) ———— 示例 ffmpeg -i …

具有 MOSFET 的电压到电流 (V-I) 转换器电路

设计说明 该单电源、低侧、V-I 转换器向可以连接到比运算放大器电源电压更高的电压的负载提供经过良好调节的电流。该 电路接受介于 0V 和 2V 之间的输入电压,将其转换为介于 0mA 和 100mA 之间的电流。通过将低侧电流检测电 阻 R3 上的压降反馈到运算放大器的反相…

C语言 指针——函数指针的典型应用:通用排序

目录 编程实现升序和降序排序 如果不使用函数指针编程… 使用函数指针编写一个通用的排序函数 小结 编程实现升序和降序排序 如果不使用函数指针编程… 使用函数指针编写一个通用的排序函数 小结 正确理解指针的概念  指针是一种特殊的数据类型  指针类型的变量&am…

【多模态】37、TextSquare | 借助 Gemini-Pro 通过四个步骤来生成高质量的文本问答数据

文章目录 一、背景二、方法2.1 Square-10M2.2 模型结构2.3 使用 Square-10M 进行有监督微调 三、效果3.1 实验设置3.2 Benchmark 测评 论文:TextSquare: Scaling up Text-Centric Visual Instruction Tuning 代码:暂无 出处:字节 | 华中科技…

自动驾驶仿真(高速道路)LaneKeeping

前言 A high-level decision agent trained by deep reinforcement learning (DRL) performs quantitative interpretation of behavioral planning performed in an autonomous driving (AD) highway simulation. The framework relies on the calculation of SHAP values an…

WPF国际化的最佳实践

WPF国际化的最佳实践 1.创建项目资源文件 如果你的项目没有Properties文件夹和Resources.resx文件,可以通过右键项目-资源-常规-添加创建或打开程序集资源 2.添加国际化字符串 打开Resources.resx文件,添加需要翻译的文本字符,并将访问修…

java版B/S架构UWB人员定位系统源码spring boot+vue技术架构uwb定位装置-工业级UWB室内定位系统源码

java版B/S架构UWB人员定位系统源码spring bootvue技术架构uwb定位装置-工业级UWB室内定位系统源码 本套系统运用UWB定位技术,开发的高精度人员定位系统,通过独特的射频处理,配合先进的位置算法,可以有效计算复杂环境下的人员与物…

怎么避免电脑磁盘数据泄露?磁盘数据保护方法介绍

电脑磁盘是电脑存储数据的基础,而为了避免磁盘数据泄露,我们需要保护电脑磁盘。下面我们就来了解一下磁盘数据保护的方法。 磁盘加密 磁盘加密可以通过专业的加密算法来加密保护磁盘数据,避免电脑磁盘数据泄露。在这里小编推荐使用文件夹只读…

Springboot注意点

1.Usermapper里加param注解 2.RequestParam 和 RequestBody的区别: RequestParam 和 RequestBody的区别: RequestParam 和 RequestBody 是Spring框架中用于处理HTTP请求的两个不同的注 get请求一般用url传参数,所以参数名和参数的值就在ur…