☰
Intouch数据写入SQL Server并生成Excel报表的完整配置指南
2026/10/17 21:53:07 网站建设 项目流程

简介:面向WonderWare Intouch 2014 R2与SQL Server 2012数据库集成以及Excel报表系统构建的实际需求,这份doc文档以图文步骤形式,完整提供了从数据库准备、连接配置到报表生成的全流程操作指引,涵盖从环境配置到脚本联调的关键细节。文档共1个文件,压缩包大小2.48MB,属于实用型技术手册,内含大量操作截图。内容涵盖:在SQL Server Management Studio中修改身份验证模式、新建登录名并配置服务器角色,创建数据库与表单;在Intouch中建立内存标记、绑定列表,编写条件为$Second==5的周期脚本,并通过SQLConnect()和SQLInsert()函数完成数据写入;Excel部分则介绍通过VBA引用数据库、建立控制面板与参数日报页面,实现定期刷新数据并生成报表。目前已有531人学习下载,适合从事SCADA系统集成、工业数据管理的工程师参考使用,可帮助快速搭建实时数据入库与报表展示方案。

1. 把 Intouch 数据写进 SQL Server 再用 Excel 出报表:这套配置我拆给你看

做 SCADA 项目的人迟早会撞上这样一件事:Intouch 里攒了一大堆实时数据,但业主说“我要日报表、我要按月查询历史趋势”。数据躺在 Intouch 里没有任何意义,得让它流进 SQL Server 2012,再让 Excel 去库里取数。这篇文章就是拆一套已经在多个模拟项目X里跑过的配置流程:从 SQL Server 新建库、改验证模式,到 Intouch 里写 SQLConnect 和 SQLInsert 脚本,再到 Excel VBA 把库里的数据拉成日报表,最后连数据库文件备份恢复都一并说清。适合正在做某跨平台系统的工程师,也适合被“数据写不进去”“报表出不来”卡住的新手。这套配置不玄学,按着做就能通。

2. 先打通 SQL Server:登录方式、建库和连接字符串的参数陷阱

2.1 进入 Management Studio 后第一件事:改身份验证模式

打开“SQL Server Management Studio”,默认用 Windows 身份验证进去,第一次做 Intouch 连接十有八九会卡在这。Intouch 的 SQLConnect 是用 SQL 账号去连库的,不是走 Windows 桌面登录,所以必须把数据库的验证模式改成混合模式。

具体操作:在数据库实例上点右键选“属性”,左侧栏切到“安全性”,右侧把“服务器身份验证”改成“SQL Server 和 Windows 身份验证模式”。改完一定要重启 SQL Server 服务,最好顺手验证一下用 sa 账号能不能登录。我跳过这个步骤翻车过一次,脚本就算没错,数据也进不去——不是代码问题,是密码根本不被接受。

提示:改完身份验证模式后,记得在服务里把 SQL Server(MSSQLSERVER)重启一次,不然设置不生效。

还要在“安全性 → 登录名”里新建一个专门给 Intouch 用的账号,别用 sa。sa 权限太大,一旦脚本被人改了或者连接串泄露,整个库都裸奔。新建登录名时,“常规”里设置密码,“服务器角色”勾选sysadmin或public加dbcreator,看你要给它多大权限。权限给太大不好,给太小连不上,一般我用public+dbcreator配合单独的数据库用户权限。

2.2 新建数据库和表单:列名、数据类型要提前规划

新建数据库这一步不复杂,但有个容易踩的坑:表单的列结构必须和 Intouch 绑定列表一一对应,特别是数据类型。官方文档经常把“标记名字典”和 SQL 表单的关系写得很含糊,等你自己动手才会发现,Intouch 的“内存整型”对应 SQL 的int,“内存实数”对应float,“内存消息”对应nvarchar,类型不匹配直接导致 SQLInsert 报错。

我一般做法是建一个清晰的数据记录表,列名直接叫tagName、tagValue、recordTime这类,Intouch 绑定列表里也这样取。正文里给的示例是TDays表单和TDays绑定列表,实际项目里我得提醒一句:别复制这个命名,这只起“模板”作用。每个标记(Tag)对应一行记录,列名就是标记名,值就是标记值,再加一列验收时间。

2.3 SQLConnect 连接字符串:五个参数一个都不能错

数据库配好后,Intouch 侧的连接靠的是SQLConnect()函数,这是整套流程里最容易出幺蛾子的地方。连接字符串长这样:

provider=sqloledb;Data Source=ZHWSC02;Initial Catalog=BZ_BB;UserID=sa;Password=single
  • provider:固定写法,连 SQL Server 就是sqloledb
  • Data Source:数据库所在机器名,不是 IP,除非你真的想赌一把网络解析
  • Initial Catalog:数据库名,别填成实例名
  • UserID/Password:登录账号和密码

注意这几个参数名大小写不敏感,但值不能错。Data Source如果填成 IP 而数据库服务器禁了 TCP/IP 协议,连接照样失败。我习惯在配置前先在另一台机器上用 ODBC 测试一下这个连接串,确认通了再接进 Intouch,这样能减少大约一半的莫名问题。

2.4 Intouch 侧的准备:Connid、NodeName 和时间格式

Intouch 里需要提前在“标记名字典”里建立三个标记:Connid1(内存整型,存连接号)、NodeName(内存消息,存本机名)、GetDateTimeS(内存消息,存时间)。这三个标记有分工:Connid1是 SQLConnect 的返回值,NodeName是给判断条件用的,GetDateTimeS是留作时间记录。

还要注意正文第 0 步提到的“日期和时间格式”问题。这个坑特别隐蔽:如果 Windows 系统的日期格式不是YYYY-MM-DD,SQL 写入的时候会报字符串转换错误。看起来是 Intouch 的错,其实是系统的区域设置捣乱。先把系统日期格式改成yyyy-MM-dd,时间格式HH:mm:ss,再谈连接的事。

3. 写入逻辑怎么搭:$Second==3 和 $Minute>=58 的背后

3.1 条件脚本:为什么用 $Second 和 $Minute 做触发

正文里给了两个条件:$Second==3和$Second==5。前者是获取时间,后者是获取计算机名和执行写入前的判断。这两个条件看着简单,里面的逻辑值得琢磨。

Intouch 的系统变量$Second范围是 0 ~ 59,$Minute范围是 0 ~ 59。$Second==3表示“从整点开始的第 3 秒”,这比用$Minute==某值要好用,因为$Second每秒都会变化,用==条件能精确到一个秒级窗口。我见过有人用$Minute==1做每分钟一次的数据采集,结果因为扫描周期是 500ms,有时会漏掉那一瞬间,导致数据缺一块。后来改成$Second==3就稳了。

$Minute>=58这个条件更有意思。它不是说“每分钟都写”,而是说“每到小时的最后两分钟才把数据归档”。这是一种懒人做法,避免频繁写库,按小时汇总。实际写库时会发现,一小时只写一次的报表,Excel 那边读取也轻松。不过要注意:如果现场需要更细粒度(比如每 15 分钟一个数据点),就必须再建一个条件$Minute%15==0这样的取模脚本,这需要额外写判断,别想偷懒。

3.2 SQLInsert 与绑定列表:一次能插多少数据

这个写库动作靠的是SQLInsert(Connid1, "TDays", "TDays"),函数三个参数缺一不可:

  • 第一个参数是连接号
  • 第二个是数据库中的表单名
  • 第三个是 Intouch 中的绑定列表名

绑定列表在左侧“SQL 访问管理器”里配置。可能有人会问,绑定列表到底“绑定”了什么?它绑定的是一组 Intouch 变量到 SQL 表列名的映射。比如数据库表有tagName和tagValue两列,绑定列表就把 Intouch 的$TagName1映射到tagName,把$TagValue1映射到tagValue。

这里有个常被忽略的细节:绑定列表可以包含很多个变量,SQLInsert 一次调用就把绑定列表里所有变量打包插入到表的一行记录里。不是每条数据一句 SQLInsert,而是一行记录一个批量插入。如果需要多行记录,那就要循环调用 SQLInsert。实际项目中,工厂里每小时有几百个测点要记录,那就得在脚本里循环执行 SQLInsert,并且要在绑定列表里把对应变量全配好。

3.3 完整写入脚本:防止重复写入的 WSQLS 标记

正文里那段脚本示例,逻辑上可以拆成四部分来读:

GetNodeName(NodeName,131); IF NodeName == "OP_OP1" THEN IF $Minute >=58 THEN IF WSQLS==0 THEN SQLInsert(Connid1, "TDays", "TDays"); WSQLS=1; ENDIF; ENDIF; ENDIF;

这个脚本的执行路径是一条链:先取计算机名,再看是否到了该归档的时间窗口,最后检查 WSQLS 这个离散量是不是为 0。WSQLS 是一个内存离散型变量,0 表示“还没写过”,1 表示“已经写过了”。脚本执行完一轮后,即使同一个时刻又触发了几次脚本条件,WSQLS==1 会让后面的 SQLInsert 直接跳过。

我自己的习惯是把 WSQLS 置位和复位写在脚本的两端:写完后置 1,等到下一个数据周期来临前(比如$Minute==0且$Second==2)再复位为 0。不这样做的后果是:如果用户在数据写入期间重启了 Intouch,WSQLS 复位为 0,但库里的数据已经插了一次,此时再次触发就会产生重复记录。报表上用DISTINCT倒是能滤掉,但根本的解决办法是逻辑设计到不产生重复。设计逻辑时宁可谨慎,不要侥幸。

4. 避坑与排查:连接失败、重复写入、Excel 读不到数据的常见问题

4.1 SQLConnect 返回 0,但数据就是写不进去

现象:Intouch 里 SQLConnect 执行了,返回值是 0,也就是成功状态,但库里看不到落盘的数据。

原因:一查发现绑定列表里的变量名和表列名对不上,或者整数和nvarchar类型不一致。Intouch 对类型不匹配经常不抛出明显错误,只在日志里记一条,不仔细看根本发现不了。

解决:先把绑定列表里每个变量与表列做一次逐一比对,确认名字和类型完全一致。再用 SQL Server Profiler 打开一个追踪,看 Intouch 发过来的 SQL 语句到底长什么样,数据是不是真的通过 INSERT 命令发过来了。这个办法能看到错误全貌,排查效率很高。我从那以后每次配置数据写入,都强制走一遍 Profiler 验证,不裸猜。

4.2 报表里时间不对:数据显示成了 1900-01-01 或少了 8 小时

现象:Excel 报表拉出来的记录时间是“1900-01-01”,或者明明写入是早上 8 点,报表显示的却是凌晨 0 点。

原因:多半是 Intouch 写入时间字符串与 SQL 的datetime格式不兼容,或者没有存时间直接写了局部变量。少 8 小时的情况是时区问题,常见于 SQL 服务器时区与 Intouch 服务器时区不一致。

解决:存放时间字段统一用nvarchar(50),值写入形式为yyyy-MM-dd HH:mm:ss,避免让 SQL 做隐式转换。时区问题则直接修改 Windows 系统设置,让两台机器在同一时区。这两步做完,时间显示立刻正常。

4.3 Excel 报表系统打不开 VBA 或引用丢失

现象:Excel 打开后看不到“查看代码”或者代码执行到一半报“未找到工程或库”。

原因:VBA 引用的三个库(Visual Basic For Applications、Microsoft Excel 对象库、Microsoft ActiveX Data Objects)没有全部勾选,或版本不对。

解决:打开 VBA 编辑器,在“工具 → 引用”里重新勾选这三个库。重点注意 Excel 版本是 32 位还是 64 位,这决定了 ADO 库的版本号,勾错了代码里Connection对象就直接失效。检查完引用,还要在模块开头加上Option Explicit,这样可以强制要求所有变量都先声明,避免某些情况下变量类型自动变化导致数据写入异常。

4.4 SQL 附加数据库时报“找不到文件”或“无法附加”

现象:把.mdf和.ldf拷到新服务器上,右键“附加”选 .mdf 文件,结果提示找不到文件。

原因:有两种情况。一是只有 .mdf 没有 .ldf 文件,或者两个文件版本不一致。二是 SQL Server 服务账号对那个数据目录没有读权限,看起来很像是文件不存在,其实是权限拒绝了。

解决:把 .mdf 和 .ldf 放在同一个目录下,并给 SQL Server 服务账号添加“完全控制”权限。附加时如果还报“.ldf 缺失”,可以暂时删掉 .ldf 重新附加,SQL Server 会重新生成一个日志文件,但这个方法只适合崩溃恢复场景,日常使用我还是建议两份文件完整保存。

4.5 Intouch 脚本执行了但报表数据总是缺漏

现象:报表隔三差五少几分钟的数据,而且缺的时间点规律性很强。

原因:写入条件设为了$Second==3,但脚本执行慢,系统扫描周期在 500ms 以下时,有时$Second==3的窗口就被跳过了。扫描周期越短,漏执行的次数反而越多,因为条件判断和脚本执行可能不在同一扫描周期内。

解决:把单一时刻的==条件改成范围判断,比如$Second>=3 AND $Second<=8,锁住一个 5 秒的窗口,再配合 WSQLS 防止重复。这样既不漏数据,也不产生垃圾记录。

5. 一个后顾无忧的配置习惯:写库前先备份库,写库后验一遍报表再交付

正文里已经说了 SQL 备份文件的存放和恢复方法,但我要补一个让工程师少挨骂的环节:每次交付报表系统前,强制做一次数据库恢复演练。具体做法是:先复制一个干净的 SQL Server 实例,把现场服务器上的DataBase目录整个拷贝过来,附加到一个临时的实例上,然后打开你要交付的 Excel 报表,把数据源改到这个临时实例,刷新一遍。这样就能在交付前发现“库里缺了哪张表”“Excel 引用的列名不对”“报表模板日期格式不对”这些只有换了环境才会暴露的问题。

这套流程不复杂,但每次都能筛出问题。有一次我发现报表模板引用了.ldf里的旧数据,数据库恢复后路径变了,Excel 里的连接串还指向老路径。如果不是先做了演练,到现场才发现这个问题,业主那边就很被动了。从那以后我每次做 Intouch + SQL Server + Excel 报表这套组合,都强制走一遍“备份、恢复、改连接串、刷新报表”这四步,绝不嫌多余。希望这篇笔记能帮你在项目里少踩几个坑。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询