JZGKCHINA
工控技术分享平台
有时候,你好端端的做着组态画面,一板一眼地拖着阀门,标着管道颜色,客户突然跟你说要加其他内容,比如在组态画面内嵌入报表、嵌入Excel、嵌入对局域网其他电脑的远程桌面控制、嵌入视频监控。。。
我的天呢!!简直丧心病狂。
当然腹诽完了,该干的活还是要干滴。王老湿的小脾气过后,还是要好好滴研究研究怎么实现这些功能,所以,本着学习、深入、提高的原则,王老湿来说说如何在RSViewSE里面使用VBA脚本对ActiveX控件操作,实现个别客户的极端要求。(WINCC、IFIX、Intouch、组态王、WiSCADA。。。。等都有该功能)
王老湿专业填坑好多年,不要问我谁在挖坑,咱不能说,咱填就是了
何为ActiveX控件?
度娘是这么描述的:ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。
当然,具体到RSViewSE软件,对ActiveX控件是这样解释的:ActiveX 对象是由第三方供应商创建的现成的软件组件,FactoryTalk View 通过对象的属性、事件和方法可访问组件具备的功能。通过嵌入 ActiveX 对象,然后指定属性或指定对象事件的处理程序,对象可与 FactoryTalk View 互动。信息在 ActiveX 对象 和 FactoryTalk View 之间通过标记进行传输。
OK,简单理解,我们所使用的ActiveX控件即为对象模型,简称对象(Object),我们只需要调用它并操作它、使用它、控制它。
在某一个软件内,你所能够调用的ActiveX控件的种类和数量取决于该软件所在计算机上安装的第三方软件的种类和数量,举个例子,你只有安装了Excel软件,你的组态软件内才能调用到Excel相关的控件。也就是说,ActiveX控件不是你的组态软件自带的,而是你的软件与当前计算机的Windows系统之间友好沟通后共享而来的,如果你需要的控件在当前计算机内没有,那就需要自行注册,然后再调用。
在点击插入对象时,总会看到OLE(对象的链接与插入)和ActiveX同时存在,那么到底该用那个呢?
其实,OLE是基于COM接口的一套应用程序直接实现数据交换和协作的规范,主要用于Office系列(Excel、Word、PPT等),可在组态软件里面对这些控件内容进行编辑。
ActiveX是基于COM接口的UI组件规范,主要实验语言无关的可视控件,多用于可视化编程及其他面向对象的快速开发领域。需要通过脚本对其内容进行编辑。
也就是说,这两种本质是一样的,只是使用目标有所侧重。
好了,废话少说,直接开干
,
先新建一个RSViewSE的项目,我的虚拟机是win7操作系统,安装的是RSViewSE 8.0英文版,安装了office2007。高版本系统及软件操作原理与之类似,参考即可
新建SE的单机版项目
1、嵌入Excel表格
创建画面ExcelTest,使用Office系列工具插件,我们使用插入OLE对象
在画面上拉个插入的OLE对象的显示范围框,该框大小可后期调整
该表格即为嵌入的Excel表格画面,双击可进入编辑页面,对表格属性进行调整
该你可以在这个表格里自由编辑内容
当然,更简单点呢,你可以把表格编辑好以后再嵌入进来
插入的时候选择由文件创建,浏览到相应的文件目录选中文件
点击创建OLE对象时,选择“由文件创建”,然后点浏览,找到你已经编辑好的表格,打开即可。当然也可以双击表格进行再次编辑
OK
嵌入的Excel基本也就这些应用了,展示一些数据呀,显示一些排班表呀,他不能完全脚本化控制,如果要做报表之类的高级功能,就需要在脚本内创建对象或者插入其他的表格控件了
2、嵌入ActiveX之 SE做报表——Spreadsheet
不管是新建的Excel还是嵌入已经编辑好的,如果仅仅是查看的话,到这里就可以了,如果要跟当前的RSViewSE交互数据的话,就需要跟着王老湿的节奏继续往后看
如果你的操作系统安装了offic软件和RSViewSE软件,那么你所能调用并完全脚本控制的表格控件有如下几种:
1、Microsoft DataGrid Control
2、 Microsoft FlexGrid Control
3、 Microsoft Hierarchical FlexGrid Control
4、 Microsoft Office Spreadsheet 主要用于web端
常用的就这几种了,可在ActiveX列表里面看到,他们之间的区别可在下表内看到
ADO和DAO
ADO是DAO/RDO的后继产品,它扩展了DAO和RDO所使用的对象模型,这意味着着它包含较少的对象,更多的属性,方法(和参数),以及事件。ADO当前并不支持DAO的所有功能,它主要包括RDO风格的功能性,以便和OLE DB数据源交互,另外还包括远程和DHTML技术.
ADO和DAO的最大区别是ADO使用OLEDB接口而非ODBC作为底层数据供应者的。依靠OLEDB,ADO也能够支持对非SQL数据存储的记录集访问,如Email和网络目录服务。OLEDB提供了比ODBC更多的灵活性和易用性。OLEDB服务的内部设计使得它能存取标准SQL类型的数据那样容易的访问非SQL数据存储。OLEDB的一个关键特性是它可以提供对描述性数据存储的处理。通过提供某种方法来描述数据存储方式,OLEDB可以对以任何格式存储的数据和以任何方法执行的查询提供访问途径。由于OLEDB并不要求所有数据存储都以表格、行和列的形式出现。所以与ODBC相比,它适用于更多的数据存储类型
DATA和ADODC
DATA只能用jet或ODBC的方式来访问数据,而ADODC则可以用ADO的方式来访问数据,相对于DATA控件来说ADODC访问数据又快又方便。用法类似。
DATA是个比较旧的东西。只能访问一些远古时候的数据库。可扩展性差。数据量太大的时候会出问题
相较而言,Spreadsheet直接支持表格内容导出成Excel文件,还可以在线对表格内容做修改,这点更方便我们使用。
综上所述,我们选择用Spreadsheet控件来做SE的报表里面的数据显示
实际动手实验,做个报表
先不用数据库
所以这个初步阶段的功能不能再页面查询历史数据
报表内用到的所有数据都直接来自PLC变量。
优点:简单方便,不需要数据库操作,可直接定时导出成CVS/Excel文件
缺点:查询不方便,只能一页页人工查找Excel文件
计划功能描述:
1、点击按钮,读取数据显示在表格内
2、自动实时读取数据显示在表格内
3、手动导出表格到指定位置
4、自动导出表格到指定位置
模拟情景:某水处理企业,需要将采集到的数据以表格形式展示出来。需要采集的数据有
1、日耗电量 2、日供水量 3、日运行时间
4、日供水单耗 5、月供水量 6、月耗电量
7、月供水单耗 8、月运行时间 9、泵站编号
暂时就这么多
同时这写变量信息在RSViewSE的标记库里面都创建为内存变量,实际使用时可直接替换变量即可
PS:对于日耗电量、供水量、运行时间等变量数据,可直接在PLC里面做好数据计算,现在多功能电表和流量计都支持累计数据读取,PLC只需实时读取即可,我们从软件里面直接读取到PLC经过处理的数据。
创建的内存变量
我们需要将表格设计成这种样式
如何向表格内自动填入RSViewSE从PLC内读上来的变量呢?
此时就需要使用到VBA脚本了
记住该表格名称,并且将属性面板里面的ExposeToVBA后面的选项选择为VBA控制(选中表格>右键>点属性面板(Property Panel))
Spreadsheet的基本属性和方法节选。更多的属性大家可自行百度搜索到
简单介绍对象、属性,方法,事件
对象:某个具体的控件,比如一个按钮,一个表格,一个图片等,称为对象
属性:对象的属性,比如按钮的大小规格,按钮显示的文字内容,字体大小,可见性等
方法:对 对象的操作,比如,表格导出,表格打印等。
事件:对象发生动作时需要执行的步骤,比如,按钮按下时,抬起时,发生的事情。
对象的属性、方法、事件都是在对象创建的时候已经做好的,我们只能调用它。
在RSViewSE软件里面,支持VBA脚本,其编辑器可通过选择任意对象右键>VBA代码进入
在画面内放个SE软件的按钮,进入其脚本编辑页面
RSViewSE软件的VBA脚本编辑页面
按钮的事件
选择按钮的按下事件 注意,在VBA/VB/VBS语言里面,英文输入法的单引号’ 是注释符
编程原则:结构化、模块化、思路清晰、注释清楚、能够用子程序的就不要全都挤一块
选择按钮的按下事件 先设置表格的样式,合并单元格,输入标题栏内容
在VB里面,子程序分为两种,
一种是过程,一种是函数 Sub 和Function
区别,
如果需要返回子程序的值,就用函数(Function)
如果不需要返回子程序的值,就用过程(Sub)
Private 和Public 局部程序和全局程序的意思
先写个报表格式定义的子程序
报表格式效果
定义个子程序,用于向表格内写内容
获取RSViewSE软件内标记库变量的值,此处可参考软件帮助文档,有示例代码可直接使用
第一步,定义和TagGroup
第二步,获取Tag值
此处代码我自己修改过,与帮助文档源代码稍有差异
向表格内填入从RSViewSE处获取的数值
先用按钮调用一下该子过程
此时,该报表数据只是在每次按下按钮时执行一次。
思考:如果让这个报表的数据实时刷新?
我们拿RSVeiwSE里面的系统时间秒做实验
把秒写入表格内
设计:需要有一个周期性的时间事件触发表格数据的写入动作,才可以按一定的周期刷新表格的数据
最简单方法,在画面内放一个文本框,关联系统时间秒,在这个文本框的值变事件内调用写表格数据的函数即可。
将这个数字显示控件的属性面板设置为VBA控制
在刚才拉的NumericDisplay1控件对象的Change事件里面调用表格写数事件
效果:如下图,表格里面的时间数字会按照系统时间变量的秒每秒变化一次,及数据会根据该秒的变化往表格内写一次
手动导出表格内容到指定位置
点击该按钮可按照提示保存当前表格内容成Excel文件
手动在后台默默导出
导出表存放在什么位置,文件名如何规定?
调用下面这个子过程即可,以当前导出时的日期时间为名称
例子中将表格导出成Excel文档保存在E:Test路径下
自动在后台默默导出
构想:需要找个时间节点触发导出表的子过程
设计:使用系统时间的变化事件,举个栗子,当时间恰好等于23:59:59这个时刻时,导出表,为当天的报表内容。因为系统的秒有时候不会刚刚好就是59这个时刻,所以我们在一定范围内就要触发它,但是又要考虑多次触发的情况,所以需要定义一个全局变量ExportTimes作为标志,判断满足时间范围内是否已经执行过导出表格的程序
期待下集精彩继续!
OK,至此,在RSViewSE里面做简单报表过程就结束了。
注意:
此阶段所做的报表只能定时导出到指定位置作为文件保存。用户并不能在SE的画面内查询报表的历史数据。
如果需要查询历史数据功能,需要数据库的参与,下一阶段将重点介绍。