【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据上一篇《【坑】如何心平气和地填坑之拿RSViewSE的报表说事》中,我们在RSViewSE软件的画面内嵌入了一个Spreadsheet控件表格,通过VBA脚本对它进行一系列控制实现了将PLC内直接读回来标签数显示在表格内,定时存储到指定的位置,从而达到每天或每小时或每分钟记录一次报表数据的目的。

但是显而易见地,这种方式的缺点是不可以灵活的查询历史数据报表,你只能人工按文件名的日期时间去查找生成的Excel表格,这种方式稍显麻烦。


众所周知,在RSViewSE的世界里,要记录和获取历史数据需要专门的历史数据库Historian的参与,但是由于某些原因,很多人不会选择使用它。退而求其次,RSViewSE提供了另外一种历史数据存储的方式:数据记录(Datalog),按官方说法,RSViewSE软件内最多可以创建20个Datalog文件,每个Datalog文件最多可以存储10000的标签的数据,这足够我们使用了。但是,这种方式记录的数据也只能被历史趋势曲线所调用,其他地方读取不到这些历史数据。所以,提取Datalog里面的数据做灵活的报表就不可取了。当然,Datalog文件也提供了将数据通过ODBC数据源存储到数据库的接口,这部分后面我们会说到。


作为一个老湿级别的组态画面设计者,追求的当然是一个完美,要能够随心所欲的查历史报表,还要能随心所欲的导出某一天的数据,更丧心病狂的,还想自动打印出来。


【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_02

其实这些都不叫事儿。关键你得学会数据库的骚操作,学会了数据库的操作,标志着你已经迈上了组态界填大坑的道路。


如果有人回顾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

王老湿不愿意使用这种方式,因为后面查询的时候会很麻烦,很麻烦

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_03

通过ODBC方式记录数据到Access、SQL Server、MySQL等数据库的过程都是类似的,区别只是创建连接程序的时候选择数据连接驱动不一样,此处分别以Access和SQL Server为例描述。


1)、在指定位置新建一个Access数据库文件 

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_04


2)、在RSViewSE内新建Datalog,选择ODBC数据库存储

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_05


选择系统数据源,然后点New新建,选中系统数据源

关于文件数据源、用户数据源、系统数据源的区别可自行百度了解,此处我们选择系统数据源即可。

接下来选择数据源驱动,列表内列出了很多驱动,后面括号内为该驱动支持的连接文件格式,对于2007及以前的Access数据库,使用包含.mdb的驱动,2007以后的,使用.accdb驱动。此处我们选择一个兼容性较大的 

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_06

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_07


接下来选择已经创建好的数据库文件

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_08

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_09


按照默认的表名称RSViewSE软件会自动在Access数据库内创建对应的表。如果要为你的Access数据库配置密码权限,需要勾选后面的登录选项,配置用户名和密码。


创建完可在Access里面看到这些表

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_10


在Datalog的第二个选项内为路劲(Path),是选择ODBC备用路劲的,感兴趣的可以自己设置试试。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_11



Datalog第三个选项为文件管理,即选择是否周期性删除存储的数据库文件,可选最大多长时间后删除文件。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_12


Datalog的第四个选项是数据记录方式,可选的为周期性记录(Periodic)、值变记录(OnChange)、触发记录(OnDemand)

周期性:按一定的时间周期,记录所有变量的值,可选的时间间隔有秒、分钟、小时等

值变记录:顾名思义,只有在标签值发生改变时会记录。当然根据需要可以选择数据变化的百分比、死区时间、数据刷新时间等

触发记录:该记录需要使用DatalogOn和Datalogsnapshot命令触发该数据记录,可理解为一种事件触发记录的类型。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_13


Datalog里面第五个选项为添加标签,在此处添加需要记录的标签名即可。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_14

此时Datalog数据记录配置完成。


3)、对于SQLServer,配置过程类似,只是在创建数据源的时候系统数据源并且使用SQL Server驱动。

首先在SQL Server里面新建一个数据库。单独作为报表数据存储

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_15


选择新建数据库,并且将数据库文件保存在自定义的文件存储位置。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_16


创建完之后可在数据库目录看到。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_17


题外话:上图里面有很多数据库,事实上,RSViewSE软件在你每创建一个项目时,都会在SQLServer里面自动创建一个数据库,里面存储的是RSView软件项目的变量表。


接下来创建Datalog里面使用SQL Server驱动的ODBC文件数据源 

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_18


【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_19


紧接着需要选择连接到那个SQLServer服务器,服务器一定要选择带斜杠FTVIEW,如果选不到,就手动输入

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_20


下一步选择连接SQL Server时的账户验证方式,可用安装RSViewSE软件时配置的账户sa和密码来连接。注意,原则上,我们不推荐使用sa用户登录数据库,因为这是数据库的超级管理员账户,拥有最高权限,用户可以登录到SQL Server管理器新建账户作为其连接账户。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_21


更改默认连接数据库为我们创建的数据库

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_22


下一步默认即可

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_23


点击完成后弹出数据源创建成功提示。可点击测试连接状态

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_24


点击确定后即可完成数据源的创建。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_25


接下来的设置与Access一样了,默认创建三个数据记录的表

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_26

Datalog内其他的设置与Access连接时设置的一样,此处不再赘述。


4)、使用RSViewSE软件的事件功能触发Datalog记录历史数据

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_27


启动事件:事件配置完成后,需要在RSViewSE项目的(HMI 服务器属性)对话框中,点击 Components(组件)选项卡,点选 Events(事件)复选框,然后选择一个事件组件。事件组件会在 HMI 服务器下次运行时或者当 HMI 服务器组件手动启动时才启动。当然,此处也可以选择项目启动时启动DatalogON命令。如果有很多命令要执行,可以创建一个Macro,在Macro里面写命令,在此处调用。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_28


配置完成后即可将RSView软件运行起来按照规定的时间记录需要的标签数据。

运行一段时间后可在Access和SQL Server内查看到记录的数据。


如果你发现你的数据库内没有记录数据,有可能是事件没有启动,可通过RSViewSE的命令来停止后再启动。


示例中,我将事件的触发时间改成了每分钟触发一下,记录数据到数据库,这种记录还是很准确的。

列举Access内记录的数据

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_29


列举SQLServer内记录的数据

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_30

如此,我们已经实现了第一步,将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的东西,根据你自己计算机的情况,勾选最大的版本即可

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_31

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_32

勾选即可。


们使用该接口通过ODBC方式访问到已经创建的数据库。通过ADODB接口读取回来的数据库数据会存放在一个记录集Recordset内,我们需要对Recordset进行操作获取内容。


实际操作


1、 书接第一章节,将第一章节使用的画面复制一份出来,增加一个DTPicker控件和一个ComboBox控件,第一个是日期时间控件,第二个是下拉框控件。在放个按钮用于触发查询的过程

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_33


2、编写脚本,从Access数据库读取数据

因为从Access和从SQL Server里读取数据时SQL 语句会稍有差异,我们需要单独分开说。

思路:将数据库里读回来的数据按数组的形式返回给子函数,这样以后调用的时候就很方便了。先建一个带输入参数和返回值的子函数,其输入参数是一条SQL查询语句,输出参数是一个二维数组

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_34


3、调用数据库读取函数,填充到下拉框里面去

思路:下拉框内应该显示数据库内现有的泵站编号,并且可以选择单独查询一个和查询全部。下拉框的内容应当在画面加载时就调用。

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_35


4、写读回来的泵站数据到表格里面去

思路:因为使用RSViewSE软件自动存储数据到数据库的功能,我们查询的结果跟我们设计的报表格式很不一样,所以只能每次查询一部分,多次查询再填进去。我们设计定义一个带输入参数的过程,输入的参数为计划写数据的表格的列和每个列要查询的关键字。

注意SQL语句的书写,原则上,SQL语句在这里是一段字符串,可以拼凑,中间还可以嵌入变量。使用SQL语句查询是需要注意日期格式,在查询Access中的日期时间时在两边加上#符号,如#2020/03/22 12:00:00#。另外,在Access中通配符需要注意。

填坑:在Access里面执行SQL语句时,任意字符串的通配符为“*”符号,但是如果把SQL语句放在ODBC里面执行,就要用“%”了。 

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_36


5、按钮调用写入数据

思路:给表格写入数据之前应该先将表格的内容清空,再写入

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_37


6、运行效果

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_38

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_39

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据库_40

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_数据_41

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_42


期待下集精彩继续!


好了,由于篇幅有限,第三节我们继续讲从SQL Server里面读取数据

【续坑】如何心平气和地填坑之拿RSViewSE的报表说事(2)_sql_43

王老湿最近测试了一款神奇的国产组态软件,以上功能基本不需要脚本就能轻松实现,而且还有很多风骚的功能,等测试完成后会安利给大家,敬请期待。