上一篇《【坑】如何心平气和地填坑之拿RSViewSE的报表说事》中,我们在RSViewSE软件的画面内嵌入了一个Spreadsheet控件表格,通过VBA脚本对它进行一系列控制实现了将PLC内直接读回来标签数显示在表格内,定时存储到指定的位置,从而达到每天或每小时或每分钟记录一次报表数据的目的。
但是显而易见地,这种方式的缺点是不可以灵活的查询历史数据报表,你只能人工按文件名的日期时间去查找生成的Excel表格,这种方式稍显麻烦。
众所周知,在RSViewSE的世界里,要记录和获取历史数据需要专门的历史数据库Historian的参与,但是由于某些原因,很多人不会选择使用它。退而求其次,RSViewSE提供了另外一种历史数据存储的方式:数据记录(Datalog),按官方说法,RSViewSE软件内最多可以创建20个Datalog文件,每个Datalog文件最多可以存储10000的标签的数据,这足够我们使用了。但是,这种方式记录的数据也只能被历史趋势曲线所调用,其他地方读取不到这些历史数据。所以,提取Datalog里面的数据做灵活的报表就不可取了。当然,Datalog文件也提供了将数据通过ODBC数据源存储到数据库的接口,这部分后面我们会说到。
作为一个老湿级别的组态画面设计者,追求的当然是一个完美,要能够随心所欲的查历史报表,还要能随心所欲的导出某一天的数据,更丧心病狂的,还想自动打印出来。
其实这些都不叫事儿。关键你得学会数据库的骚操作,学会了数据库的操作,标志着你已经迈上了组态界填大坑的道路。
如果有人回顾RSViewSE软件的安装过程,会注意到RSViewSE软件会自动的为用户安装部署一个SQL Server数据库,安装过程中会出现一个输入SQL Server超级管理用户sa的密码的页面,如果你记住了这个密码,恭喜你,后面会很轻松。如果忘了,请百度。这个数据库你可以直接用而不需要额外安装。
- 提起数据库,就不得不提到很多人入门的轻量级数据库Access,这是附带在Microsoft Office套装里面的一款产品,如果你是初学者,建议以Access数据库入门最合适。当然,Access数据库也支持ODBC数据源方式的访问。
- 同样还有一种常用的数据库,也是当前使用最为广泛的数据库之一,MySQL,目前属于Oracle公司,开源,该公司还有一款收费的大型数据库Oracle。MySQL自面世以来就以其访问快速的特点受到广大用户的青睐,它可以跨平台地部署在Windows和Linux平台上。同样支持ODBC数据源方式访问。不同的是,其ODBC数据源驱动需要在官网下载安装。
好了,言归正传,在RSViewSE里面做报表,常用的就是使用Datalog的ODBC数据源方式将数据存储在数据库内,然后在画面内编写VBA脚本按时间或其他方式查询这些数据。
那么,除此之外,其实还有一种方法,就是在RSViewSE软件之外编写程序,实现数据的记录和数据的显示,RSViewSE软件只需要调用编译好的exe文件就可以了,甚至,全程都不需要RSViewSE的参与。数据记录到数据库我们通过RSLinx 软件的DDE方式实现。读取数据库内数据,实现查询,存储,打印,显示等功能我们可以使用一些高级语言编程实现,如VB、C#、C++等。这部分我们最后再做扩展介绍。
先澄清几个概念:
什么是ODBC数据源
前面我们说很多数据库都支持ODBC数据源方式访问,RSViewSE软件本身也支持通过该方式与数据库交互,那么,ODBC数据源是什么呢?
ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC 技术为访问不同种类的sql数据库提供了通用接口。ODBC是基于结构查询语言(sql)的,以此作为访问数据的标准。
简单点说,ODBC就是一种统一的对SQL数据库的连接接口,用户可以通过ODBC接口编写SQL语句实现对数据库的增删查改操作。这是Windows系统才有的。(其实这个的坑也有很多)
不止是RSViewSE软件,其他任何软件做报表时,都分为两个步骤:
第一, 记录数据
第二, 展示数据。
我们先看记录数据。对于多种数据库,我们尽量同时讲述,方便我们相互比较他们之间的区别和相同之处。
第一步、记录数据
场景设计:以上阶段某水厂生产报表为例,将表格内所需数据按一定的时间周期存储到数据库内,然后提取出来显示在表格控件上,报表需实现能够按照时间和泵站编号方式查询历史数据。
1、 通过ODBC方式记录数据到Access和SQL Server
王老湿不愿意使用这种方式,因为后面查询的时候会很麻烦,很麻烦
通过ODBC方式记录数据到Access、SQL Server、MySQL等数据库的过程都是类似的,区别只是创建连接程序的时候选择数据连接驱动不一样,此处分别以Access和SQL Server为例描述。
1)、在指定位置新建一个Access数据库文件
2)、在RSViewSE内新建Datalog,选择ODBC数据库存储
选择系统数据源,然后点New新建,选中系统数据源
关于文件数据源、用户数据源、系统数据源的区别可自行百度了解,此处我们选择系统数据源即可。
接下来选择数据源驱动,列表内列出了很多驱动,后面括号内为该驱动支持的连接文件格式,对于2007及以前的Access数据库,使用包含.mdb的驱动,2007以后的,使用.accdb驱动。此处我们选择一个兼容性较大的
接下来选择已经创建好的数据库文件
按照默认的表名称RSViewSE软件会自动在Access数据库内创建对应的表。如果要为你的Access数据库配置密码权限,需要勾选后面的登录选项,配置用户名和密码。
创建完可在Access里面看到这些表
在Datalog的第二个选项内为路劲(Path),是选择ODBC备用路劲的,感兴趣的可以自己设置试试。
Datalog第三个选项为文件管理,即选择是否周期性删除存储的数据库文件,可选最大多长时间后删除文件。
Datalog的第四个选项是数据记录方式,可选的为周期性记录(Periodic)、值变记录(OnChange)、触发记录(OnDemand)
周期性:按一定的时间周期,记录所有变量的值,可选的时间间隔有秒、分钟、小时等
值变记录:顾名思义,只有在标签值发生改变时会记录。当然根据需要可以选择数据变化的百分比、死区时间、数据刷新时间等
触发记录:该记录需要使用DatalogOn和Datalogsnapshot命令触发该数据记录,可理解为是一种事件触发记录的类型。
Datalog里面第五个选项为添加标签,在此处添加需要记录的标签名即可。
此时Datalog数据记录配置完成。
3)、对于SQLServer,配置过程类似,只是在创建数据源的时候系统数据源并且使用SQL Server驱动。
首先在SQL Server里面新建一个数据库。单独作为报表数据存储
选择新建数据库,并且将数据库文件保存在自定义的文件存储位置。
创建完之后可在数据库目录看到。
题外话:上图里面有很多数据库,事实上,RSViewSE软件在你每创建一个项目时,都会在SQLServer里面自动创建一个数据库,里面存储的是RSView软件项目的变量表。
接下来创建Datalog里面使用SQL Server驱动的ODBC文件数据源
紧接着需要选择连接到那个SQLServer服务器,服务器一定要选择带斜杠FTVIEW,如果选不到,就手动输入
下一步选择连接SQL Server时的账户验证方式,可用安装RSViewSE软件时配置的账户sa和密码来连接。注意,原则上,我们不推荐使用sa用户登录数据库,因为这是数据库的超级管理员账户,拥有最高权限,用户可以登录到SQL Server管理器新建账户作为其连接账户。
更改默认连接数据库为我们创建的数据库
下一步默认即可
点击完成后弹出数据源创建成功提示。可点击测试连接状态
点击确定后即可完成数据源的创建。
接下来的设置与Access一样了,默认创建三个数据记录的表
Datalog内其他的设置与Access连接时设置的一样,此处不再赘述。
4)、使用RSViewSE软件的事件功能触发Datalog记录历史数据
启动事件:事件配置完成后,需要在RSViewSE项目的(HMI 服务器属性)对话框中,点击 Components(组件)选项卡,点选 Events(事件)复选框,然后选择一个事件组件。事件组件会在 HMI 服务器下次运行时或者当 HMI 服务器组件手动启动时才启动。当然,此处也可以选择项目启动时启动DatalogON命令。如果有很多命令要执行,可以创建一个Macro,在Macro里面写命令,在此处调用。
配置完成后即可将RSView软件运行起来按照规定的时间记录需要的标签数据。
运行一段时间后可在Access和SQL Server内查看到记录的数据。
如果你发现你的数据库内没有记录数据,有可能是事件没有启动,可通过RSViewSE的命令来停止后再启动。
示例中,我将事件的触发时间改成了每分钟触发一下,记录数据到数据库,这种记录还是很准确的。
列举Access内记录的数据
列举SQLServer内记录的数据
如此,我们已经实现了第一步,将RSViewSE里面报表相关的数据记录到数据库内。
第二步、读取数据库的数据并显示
事实上,对于数据库的操作,查询功能应该用的更多一些。在RSViewSE里面,虽然以图形化的方式完成了数据记录功能,但却并没有集成直接读取数据的接口,所以,我们还是需要编写VBA脚本来实现对数据库的读取。
至于将数据读取回来后显示在哪里,这就可以选择了,为了方便,你可以直接显示在SE的画面内,就像之前我们在第一阶段设计的在画面内嵌入Spreadsheet表格控件一样,将读取回来的数据填充在这个表格内。还有个办法,就是在RSViewSE软件之外,使用高级语言编写一个exe程序,在该程序内实现对数据的读取和展示,RSViewSE软件只需要调用其即可。两种方式各有利弊,根据自己的能力选择使用。
示例中,我们使用在SE内嵌入spreadsheet表格控件显示方式实现。后面的高级扩展我们会说到编写外部程序调用。
示例设计:我们设计报表功能应该具有按时间查询功能、按泵站编号查询功能、查询完的数据导出到指定位置、查询完的数据可直接打印。
1)、编写脚本读取Access数据库内表的内容
VBA脚本代码中会涉及一个数据库的连接接口ADODB,它是一种兼容的各类数据库应用程序接口(API),各种数据库都可以。MySQL,PostgreSQL,Interbase,Firebird,Informix,Oracle,MS SQL 7,Foxpro,Access,ADO,Sybase,FrontBase,DB2等。关于此API的使用可自行百度查看。这是一种非常方便的连接数据库的接口。
注意,要在VBA环境中使用ADODB接口程序,需要在VBA的IDE里面引用一个叫Microsoft ActiveX Data Objects x.x Library的东西,根据你自己计算机的情况,勾选最大的版本即可
勾选即可。
我们使用该接口通过ODBC方式访问到已经创建的数据库。通过ADODB接口读取回来的数据库数据会存放在一个记录集Recordset内,我们需要对Recordset进行操作获取内容。
实际操作
1、 书接第一章节,将第一章节使用的画面复制一份出来,增加一个DTPicker控件和一个ComboBox控件,第一个是日期时间控件,第二个是下拉框控件。在放个按钮用于触发查询的过程
2、编写脚本,从Access数据库读取数据
因为从Access和从SQL Server里读取数据时SQL 语句会稍有差异,我们需要单独分开说。
思路:将数据库里读回来的数据按数组的形式返回给子函数,这样以后调用的时候就很方便了。先建一个带输入参数和返回值的子函数,其输入参数是一条SQL查询语句,输出参数是一个二维数组
3、调用数据库读取函数,填充到下拉框里面去
思路:下拉框内应该显示数据库内现有的泵站编号,并且可以选择单独查询一个和查询全部。下拉框的内容应当在画面加载时就调用。
4、写读回来的泵站数据到表格里面去
思路:因为使用RSViewSE软件自动存储数据到数据库的功能,我们查询的结果跟我们设计的报表格式很不一样,所以只能每次查询一部分,多次查询再填进去。我们设计定义一个带输入参数的过程,输入的参数为计划写数据的表格的列和每个列要查询的关键字。
注意SQL语句的书写,原则上,SQL语句在这里是一段字符串,可以拼凑,中间还可以嵌入变量。使用SQL语句查询是需要注意日期格式,在查询Access中的日期时间时在两边加上#符号,如#2020/03/22 12:00:00#。另外,在Access中通配符需要注意。
填坑:在Access里面执行SQL语句时,任意字符串的通配符为“*”符号,但是如果把SQL语句放在ODBC里面执行,就要用“%”了。
5、按钮调用写入数据
思路:给表格写入数据之前应该先将表格的内容清空,再写入
6、运行效果
期待下集精彩继续!
好了,由于篇幅有限,第三节我们继续讲从SQL Server里面读取数据
王老湿最近测试了一款神奇的国产组态软件,以上功能基本不需要脚本就能轻松实现,而且还有很多风骚的功能,等测试完成后会安利给大家,敬请期待。