资讯动态

Intouch 2014R2+SQL Server 2012报表配置避坑

发布时间:2026/10/27 2:43:07 来源:尧图企业网站定制
简介一份面向SCADA/HMI工程师与Intouch初学者的Word操作文档聚焦WonderWare Intouch 2014 R2与SQL Server 2012的集成及Excel报表系统搭建帮助读者理清从数据库配置、权限设置到数据写入与报表呈现的完整实现路径。压缩包仅含1个doc文件约2.48MB以图文步骤与脚本示例组织内容适合作为现场实施或学习复盘时的查阅材料。文档按章节覆盖Intouch侧数据库写入准备、标记名字典与SQL访问管理器绑定、SQLConnect/SQLDisconnect连接管理、SQLInsert定时写入以及Excel VBA报表模板和SQL数据库文件附加恢复等模块对连接字符串、变量类型匹配、写入标记等关键细节有较具体的说明。读者可据此对照检查身份验证模式、内存标记命名、绑定列表字段对应关系及报表模板引用项减少联调时的类型不匹配与连接失败问题。已有531人学习可作为Intouch数据归档与报表开发的参考。1. 环境先列清Intouch 2014R2 加 SQL Server 2012 再挂 Excel 报表装错一步全白干凌晨两点被叫起来看报表Excel 里一片空白回头看 Intouch 2014R2 的画面数据还在正常跳动。这种场面我碰到过不止一次。Intouch 2014R2 采集的数据落到 SQL Server 2012再由 Excel 做报表取数是很多 SCADA 项目里最常见的组合安装过程看着全是“下一步”真跑起来问题全藏在身份验证模式、绑定列表列名和 VBA 引用这三处。第一次装的人容易把它当成“装个数据库、连上就完事”结果脚本里 SQLConnect 返回的连接号一直是 0报表取不到一行数据只能干瞪眼。这套环境适合做产线数据存档、班次日报、参数追溯的开发和运维也适合接手别人做了一半的现场。下面按实际装一遍的顺序从 SQL Server 2012 装起一直走到 Excel 报表能刷出新数据。2. SQL Server 2012 安装与身份验证模式实例名、登录名、建表列类型一次对齐数据库这一层是整条链路的底座。装歪了后面 Intouch 侧脚本写得再漂亮也白搭。这一章把安装介质选择、身份验证模式、登录名权限、建库建表和数据库文件附加这几件事按顺序说清楚每一步都给出可直接抄的命令或操作路径。2.1 版本选择与实例名先想清楚这台机器要存多久的数据版本上项目里常用的是 SQL Server 2012 标准版授权允许的情况下也可以上企业版。Express 版能跑通整条链路但单个数据库有 10GB 上限做按秒或按分钟存档的产线数据几个月就会顶到天花板后面迁移库文件的麻烦远大于当初省下的授权。我的建议是做演示或小规模试验用 Express正式存档一律标准版起步。实例名这块有个容易被忽略的点。默认实例的机器名直接写OP_01就行命名实例必须写成OP_01\SCADA这种形式连接字符串里的 Data Source 要跟着改。Intouch 侧那串连接字符串是硬编码在脚本里的装完再改实例名意味着要重新下发脚本所以装之前就把实例名定死。管理工具方面SQL Server 2012 的 SSMS 在安装介质里可以勾选Express 版要单独装带 Tools 的包。装完之后从开始菜单进 “SQL Server Management Studio”能连上本机实例这一步过了再往下走。提示SSMS 的版本不必和数据库引擎完全一致但 2012 的库不要用太新的 SSMS 去附加兼容性提示会多出一堆噪音。2.2 混合身份验证模式只开 Windows 验证Intouch 永远连不上装完默认是“Windows 身份验证模式”而 Intouch 的 SQLConnect 走的是 SQL 账号密码这一步不改后面所有脚本都会失败。改法在 SSMS 里对象资源管理器根节点右键 → 属性 → 左侧选“安全性” → 右侧“服务器身份验证”选“SQL Server 和 Windows 身份验证模式”→ 确定 → 重启 SQL Server 服务。重启完展开“安全性”→“登录名”新建一个供 Intouch 和 Excel 共用的登录名。这里有个取舍直接用 sa 最省事但 sa 是服务器级最高权限报表端一旦被人拿到连接串整个实例都暴露了。我一般单独建一个scada_writer登录名只给它目标库的db_datareader和db_datawriter够用且不越权。-- 在 master 库执行创建 SQL 登录名并只授予目标库的读写权限 USE master; GO CREATE LOGIN scada_writer WITH PASSWORD Scada2012, -- 按现场密码规范替换别照抄 CHECK_POLICY OFF, -- 老现场常有密码策略冲突按需关闭 DEFAULT_DATABASE YADC_BB; GO USE YADC_BB; GO CREATE USER scada_writer FOR LOGIN scada_writer; GO ALTER ROLE db_datareader ADD MEMBER scada_writer; ALTER ROLE db_datawriter ADD MEMBER scada_writer; GO这段脚本做了三件事建登录名、在当前库建对应的数据库用户、把这个用户加进读写角色。CHECK_POLICY OFF是为老现场准备的如果服务器开了密码复杂度策略而你又必须用简单密码加上它才不会报“密码不符合要求”。DEFAULT_DATABASE指向目标库避免登录后默认落在 master 里找不到表。如果现场已经有一个现成的登录名只是密码对不上那就走属性页改密码别重复建。2.3 建库建表列名和数据类型必须和 Intouch 变量严丝合缝建库本身没难度难在表结构。Intouch 的绑定列表是按“变量名对列名、变量类型对列类型”一一映射的类型错一个SQLInsert 就静默失败日志里什么都看不到。这是我见过最多的一类翻车。-- 建库文件路径按现场磁盘规划调整本例统一放 E:\DataBase CREATE DATABASE YADC_BB ON PRIMARY ( NAME NYADC_BB, FILENAME NE:\DataBase\YADC_BB.mdf, SIZE 512MB, FILEGROWTH 256MB ) LOG ON ( NAME NYADC_BB_log, FILENAME NE:\DataBase\YADC_BB_log.ldf, SIZE 128MB, FILEGROWTH 128MB ); GO USE YADC_BB; GO CREATE TABLE TDays ( RecTime DATETIME NOT NULL, -- 对应 Intouch 内存消息格式必须是 yyyy-MM-dd HH:mm:ss TagValue FLOAT NULL, -- 对应内存实型别用 decimalOLEDB 映射会出偏差 TagStatus BIT NULL, -- 对应内存离散 NodeName NVARCHAR(64) NULL -- 对应内存消息长度留够 ); GO建表时把数据文件单独放到E:\DataBase是有意为之后面做数据库附加恢复整个目录拷走就能搬机器不用去翻 SQL Server 默认的深层安装路径。日志文件和数据文件必须成对出现只拷 mdf 是起不来的。2.4 数据库文件附加mdf 和 ldf 两个文件一个都不能少现场换服务器、做历史数据迁移走的就是附加这条路。做法是把DataBase整个目录拷到目标机的E:\下然后在 SSMS 里“数据库”节点右键 → 附加 → 添加 → 定位到YADC_BB.mdf→ 确定。命令行方式更适合批处理-- 附加历史库注意 FOR ATTACH 后路径要指向实际拷贝位置 USE master; GO CREATE DATABASE YADC_BB_History ON (FILENAME NE:\DataBase\YADC_BB.mdf), (FILENAME NE:\DataBase\YADC_BB_log.ldf) FOR ATTACH; GO附加失败最常见的原因是权限SQL Server 服务账户对E:\DataBase没有读权限报“操作系统拒绝访问”。解决办法是给NT SERVICE\MSSQLSERVER或对应的服务账户加目录读权限不是去改文件属性里的只读勾。另一个原因是目标实例版本低于源实例这种只能升级目标实例没有后悔药。3. Intouch 2014R2 侧的准备时间格式、标记名字典与条件脚本的位置数据库通了不代表 Intouch 能写进去。这一层要做三件事把系统时间格式固定下来、在标记名字典里建好承载连接状态和数据的变量、把脚本挂到正确的触发点上。顺序不能乱先建标记再写脚本否则脚本编辑器里根本选不到变量。3.1 系统日期时间格式这一步不改SQL 里全是 1900-01-01控制面板 → 区域和语言 → 其他设置 → 日期选项卡短日期改成yyyy-MM-dd时间选项卡长时间改成HH:mm:ss。改完重启 Intouch让运行时重新读取区域设置。为什么这么较真Intouch 的内存消息变量往 SQL 的 datetime 列写的时候是字符串转日期。区域设置是M/d/yyyy的机器写2024/3/5过去SQL 可能按d/M/yyyy解析直接错位成 5 月 3 日或者越界后落成 1900-01-01。这种错不会报错只会在报表里体现为“数据全堆在月初”排查起来很费劲。时间格式统一之后所有操作站都按同一个模板配别指望每台机器默认设置一致。3.2 标记名字典四个必须提前建好的内存变量标记名字典是 Intouch 的核心数据结构这一层建的变量要能被脚本和绑定列表同时引用。按下面的表建名字不要改后面脚本里是直接引用的。标记名类型用途备注Connid1内存整型保存 SQLConnect 返回的连接号为 0 表示未连接WSQLS内存离散标记本轮是否已写入防重复写入的闸门GetDateTimeS内存消息保存取数时间字符串长度给 32 够用NodeName内存消息保存本机计算机名多操作站时用来区分数据来源建的时候注意“内存消息”的初始值留空不要填默认字符串否则脚本里的相等判断会误判。Connid1的初值设 0方便后面用IF Connid1 0判断连接是否建立。3.3 条件脚本$Second3 与 $Second5 各管一段Intouch 的脚本视图下有两个入口条件脚本和应用程序脚本。条件脚本按表达式触发适合做周期性动作应用程序脚本挂在运行时和关闭时适合做一次性的连接建立和释放。先建连接建立的条件脚本条件写$Second3条件类型选“为真时” 条件$Second 3为真时执行 作用整点秒数为 3 时建立一次数据库连接避免重复连接 IF Connid1 0 THEN SQLConnect( Connid1, providersqloledb;Data SourceOP_01;Initial CatalogYADC_BB;UserIDscada_writer;PasswordScada2012 ); ENDIF; 取本机名131 是缓冲区长度参数按计算机名实际长度给 GetNodeName( NodeName, 131 );这段里Connid1 0的判断是关键。条件脚本每秒都可能被命中没有这个判断就会反复调用 SQLConnect连接池被耗尽现象是运行几小时后所有写入突然停摆重启 Intouch 才恢复。写入脚本挂在$Second5负责判断时间和写入动作 条件$Second 5为真时执行 作用在每小时最后两分钟把当前值写入 TDays 表一次 IF NodeName OP_01 THEN 只有指定操作站负责写入 IF $Minute 58 THEN 只在 58、59 分触发 IF WSQLS 0 THEN 本轮尚未写入才继续 SQLInsert( Connid1, TDays, TDays ); 第一个 TDays 是表名第二个是绑定列表名 WSQLS 1; 置位防止同一分钟内重复写 ENDIF; ENDIF; ENDIF;SQLInsert的两个参数容易搞混第一个是数据库里的物理表名第二个是 Intouch 里绑定列表的名字两者可以不同名但列对应关系必须是按绑定列表来的。WSQLS在这里充当闸门置位后下一分钟不会重复写。复位动作放到另一个条件里比如$Minute 0时执行WSQLS 0;把闸门放开。置位和复位写在同一个扫描周期里等于没判断这条后面还会展开。3.4 应用程序脚本启动时连接、关闭时断开除了条件脚本应用程序脚本里要加一段关闭逻辑。位置在脚本视图 → 应用程序 → 关闭时 应用程序关闭时执行释放数据库连接避免连接句柄泄漏 IF Connid1 0 THEN SQLDisconnect( Connid1 ); Connid1 0; ENDIF;不写这一段Intouch 每次重启都会在 SQL Server 侧留下一个孤立的会话运行久了sys.dm_exec_sessions里能堆出几十个睡眠连接最后连接数打满新连接建不上来。这是典型的慢性病装的时候不显跑一个月才发作。4. 绑定列表与三条 SQL 脚本连接、写入、断开怎么排前面建好了库表和变量这一章把两边接起来。核心就三件事绑定列表做字段映射、SQLConnect 拼连接串、SQLInsert 落数据。Excel 报表的 VBA 取数也放在这一章因为它的连接串和 Intouch 侧是同一套逻辑一起看更容易理解参数含义。4.1 绑定列表变量名对列名类型对类型在 Intouch 左侧工具视图最下面找“SQL 访问管理器”展开后选“绑定列表”新建一个名为TDays的绑定列表。列表里逐行加要写入的变量每一行填三样东西Intouch 变量名、对应的数据库列名、数据类型。映射规则很死内存消息对NVARCHAR/VARCHAR内存实型对FLOAT内存离散对BIT内存整型对INT。类型不匹配时 SQLInsert 不报错只是返回一个非零错误码脚本里如果不接这个返回值表现就是“脚本执行了但表里没数据”。绑定列表建完后建议先在 SQL 访问管理器里用“测试”功能跑一次能返回成功再往下写脚本。这一步花两分钟省掉后面半小时的猜谜。4.2 SQLConnect 的五个参数连接串里每一段都不能写错连接串是整条链路里最容易抄错的地方五个参数用分号隔开每段前面带等号。逐个说明参数含义现场常见写法易错点Provider数据访问接口sqloledb不要随手改成 SQLNCLI11位数不一致会报找不到提供程序Data Source数据库所在机器OP_01或OP_01\SCADA命名实例必须带反斜杠和实例名Initial Catalog数据库名YADC_BB不是表名别填成 TDaysUser ID登录名scada_writer大小写一般不敏感但别带空格Password密码按现场实际含分号会截断连接串需要换密码 完整连接串示例字符串里的分号是分隔符密码里不能出现分号 SQLConnect( Connid1, providersqloledb;Data SourceOP_01;Initial CatalogYADC_BB;UserIDscada_writer;PasswordScada2012 );providersqloledb是 Windows 自带的旧版 OLEDB 提供程序Intouch 2014R2 是 32 位进程调用的是 32 位版本在 64 位系统上也能正常找到。如果现场因为其他系统要求改装了 SQL Server Native Client那就得确认 32 位组件装上了否则连接串里换成SQLNCLI11之后会直接报“未找到提供程序”而且这个错误在 Intouch 的脚本里不会弹窗只在日志里留一行很容易被当成“脚本没执行”。4.3 SQLInsert 的时序WSQLS 置位和复位不能挤在一个周期把前面两段脚本拼成完整的写入流程看清楚闸门的位置 条件$Second 5为真时执行 完整写入逻辑判断站点 → 判断时段 → 判断闸门 → 写入 → 置位 IF NodeName OP_01 THEN IF $Minute 58 AND $Minute 59 THEN IF WSQLS 0 THEN SQLInsert( Connid1, TDays, TDays ); WSQLS 1; 置位本轮结束 ENDIF; ENDIF; ENDIF; 另一个条件脚本$Minute 0 且 $Second 5 时执行 作用跨过整点后复位闸门为下一个小时做准备 WSQLS 0;置位和复位分在两个条件里靠分钟数区分这样同一分钟内不会重复写跨小时又能自动放开。把WSQLS 0紧跟在WSQLS 1后面写等于闸门从来没关上58 分和 59 分各写一次还只是小问题如果条件改成$Second级别一分钟能写进去几十条重复记录。另外SQLInsert的返回值存在Connid1之外的错误码里真要严谨可以读SQLGetLastError之类的接口但现场更实用的做法是在测试阶段盯表行数稳定后再简化。4.4 Excel 报表模板与 VBA 引用从 SQL Server 2012 取数的落地配置Excel 这边要做两件事模板分页和 VBA 引用。模板一般两页——“控制面板”放查询起止时间和刷新按钮“参数日报”放数据区两页之间靠 VBA 传参。Excel 的宏安全先放开文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置选“启用所有宏”并把文件所在目录加进受信任位置。这一步不做模板发到操作站上按钮点了没反应用户只会以为文件坏了。VBA 引用在编辑器里点“工具”→“引用”至少勾三项Microsoft ActiveX Data Objects 2.8 Library数据库连接、Microsoft Excel 16.0 Object Library表格操作、Microsoft Office 16.0 Object Library通用对象。版本号跟着现场装的 Office 走勾的时候看路径对不对勾错了会在编译时报“用户定义类型未定义”。 从 SQL Server 2012 取数写入“参数日报”页连接串与 Intouch 侧保持同一套参数 Sub LoadDailyReport() Dim conn As Object Dim rs As Object Dim sql As String Set conn CreateObject(ADODB.Connection) Provider 与 Intouch 保持一致Data Source 换成数据库机器名 conn.ConnectionString ProviderSQLOLEDB;Data SourceOP_01; _ Initial CatalogYADC_BB;User IDscada_writer;PasswordScada2012; conn.Open 按控制面板页上的起止日期过滤B1、B2 分别放开始和结束时间 sql SELECT RecTime, TagValue, NodeName FROM TDays _ WHERE RecTime BETWEEN Format(Sheets(控制面板).Range(B1).Value, yyyy-mm-dd hh:mm:ss) _ AND Format(Sheets(控制面板).Range(B2).Value, yyyy-mm-dd hh:mm:ss) ORDER BY RecTime Set rs conn.Execute(sql) Sheets(参数日报).Range(A2).CopyFromRecordset rs rs.Close conn.Close Set rs Nothing Set conn Nothing End Sub代码里的日期用Format显式转成yyyy-mm-dd hh:mm:ss不要依赖单元格默认格式否则控制面板上显示的是本地日期拼进 SQL 就变成另一种解析结果。CopyFromRecordset一次性把结果集刷进单元格几千行以内性能可以接受数据量大就得分页查询。连接串里的密码明文写在 VBA 里安全性一般现场的常见做法是把密码放到隐藏工作表或者单独配置文件VBA 只读配置。这一步做不做看项目要求但至少别把这段代码连同密码一起发到公共目录。5. 避坑与排查五条踩过的记录条条都能对上号这一章把现场最常撞上的五个问题按“现象→原因→解决”写一遍。看着琐碎但每一条我都至少遇到过一次提前知道能省掉大半夜的排查。5.1 连接测试通过SQLInsert 却写不进数据现象在 SQL 访问管理器里测试绑定列表返回成功运行时的脚本也没报错但TDays表里一行数据都没有。原因绑定列表里某个变量的类型和表列类型对不上比如TagValue在 Intouch 里是内存整型表里定义成FLOATOLEDB 映射时会静默失败或者列名拼写差一个字母绑定列表认的是列名不是位置。解决把绑定列表逐行对照表结构检查一遍类型严格按“消息对 NVARCHAR、实型对 FLOAT、离散对 BIT”的规则来。检查完先在测试库里手工插一条确认表本身可写再排除脚本侧问题。5.2 Excel 在服务器上能跑到操作站报“未找到提供程序”现象同一份报表模板在数据库服务器上打开能正常刷新拷到操作站上点按钮弹出“未找到提供程序。该程序可能未正确安装”。原因模板里用的是SQLNCLI11这类需要单独安装的提供程序而操作站上只装了 Office没装对应的 32 位驱动或者模板是在 64 位 Office 下做的操作站装的是 32 位 Office位数对不上。解决统一改成ProviderSQLOLEDB这是 Windows 自带组件32 位和 64 位都有兼容性最好。如果必须用新版驱动那就把 32 位组件补装到每台操作站并且记住 Office 位数决定用哪一套。5.3 整点那条数据重复或丢失现象报表里 58 分和 59 分各出现两条相同记录或者某一小时直接整条缺失。原因重复是WSQLS置位后没复位或者复位条件和置位条件落在同一个扫描周期缺失多半是$Minute 58的判断配合脚本执行周期错位比如脚本挂在$Second 5上而运行时那一刻正好在执行画面切换条件被跳过。解决置位和复位分两个条件脚本用分钟数区分写入时段放宽到 58 到 59 两个整分钟给执行留余量。改完在测试库上连续跑两个小时对比系统时间和表里的RecTime能对上再上线。5.4 附加数据库报“操作系统拒绝访问”现象把DataBase目录拷到新机器SSMS 里附加 mdf 时提示拒绝访问文件明明存在。原因SQL Server 服务账户对新目录没有读权限或者拷贝过来的文件继承了只读属性。解决给NT SERVICE\MSSQLSERVER命名实例换成对应账户加目录读取权限去掉文件只读勾。别用管理员身份去改改的是服务账户的权限不是当前登录用户的。5.5 时间格式改了报表里的日期还是错位现象按文档把短日期改成yyyy-MM-dd重启 Intouch 后新写入的数据仍然错位。原因Intouch 运行时对区域设置的读取发生在启动阶段改系统设置前已经启动的运行时不会自动刷新或者脚本里拼日期字符串时用了自定义格式绕过了系统设置。解决改完区域设置必须完整重启 Intouch 运行时包括 IDE 和运行态。脚本里凡是拼日期的位置统一用显式格式化函数不依赖系统默认格式。6. 装完怎么验证跑通从一条记录到一张日报的完整链路检查装完不算完得有一条能走通的验证路径。我的习惯是按“库→变量→脚本→表→报表”的顺序倒着查一遍每一步都留个可观测的证据出问题能立刻定位到哪一层。第一步验库。在 SSMS 里执行查询确认表结构、列类型、登录名权限都对得上-- 验证 1表结构、列类型 SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME TDays; -- 验证 2手工插一条确认 scada_writer 有写权限 INSERT INTO TDays (RecTime, TagValue, TagStatus, NodeName) VALUES (GETDATE(), 12.5, 1, OP_01); -- 验证 3按时间倒序看最近 10 条 SELECT TOP 10 * FROM TDays ORDER BY RecTime DESC;手工插入成功说明库、权限、表结构都没问题剩下的问题一定在 Intouch 侧。第二步验变量和连接。在 Intouch 的标记名字典里打开Connid1的实时监视运行时启动后它应该是一个非零整数如果是 0说明 SQLConnect 没成功回到连接串检查 Data Source 和登录名。NodeName应该显示本机计算机名显示为空说明GetNodeName调用失败或缓冲区长度参数给小了。第三步验写入。把系统时间临时调到 58 分附近做测试是常见做法但要清楚这会污染历史趋势数据只能在测试库和测试站上做。更稳妥的办法是临时把条件改成$Second 5直接触发验证完再改回来。表里出现新记录且RecTime与系统时间一致写入链路就算通了。第四步验报表。打开 Excel 模板控制面板页填上起止时间点刷新参数日报页应该刷出与表里一致的记录数。对不上时先看 VBA 里拼出来的 SQL 语句把sql变量打印到立即窗口粘到 SSMS 里跑一遍能执行说明是 Excel 侧的问题不能执行就是字符串拼接的格式问题。验证项观察位置通过标准不通过先查数据库可写SSMS 手工插入插入成功且能查回登录名权限、库状态连接号有效Connid1 实时值非 0 整数连接串、实例名、身份验证模式本机名可取NodeName 实时值与计算机名一致GetNodeName 长度参数写入不重复TDays 表按小时分组每小时 1 条WSQLS 置位复位时序报表取数一致参数日报页行数与查询结果一致VBA 连接串、日期格式这套检查我一般会在交付前完整走一遍并且把每一步的截图和脚本原文留在项目目录里。有次现场换服务器就是因为当初没留WSQLS复位那段条件的截图三个人对着新环境重写了半天脚本最后还是翻出旧机器的备份才想起来。从那以后我每次装完这套环境都会把连接串、绑定列表、两段条件脚本和 VBA 引用清单一起归档验证表也照着填一遍再签字。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑