
简介这份PDF文档详细介绍工业自动化软件Intouch访问SQL Access数据库的完整实现方案面向已有一定Intouch基础、需要将过程数据写入或读取Access数据库的工控工程师与组态开发人员。资源为单个PDF文件压缩包大小仅919KB文档结构清晰涵盖从Microsoft Access配置、ODBC驱动安装、SQL Access Manager部署到绑定表建立与脚本编程的完整操作链路。文档系统梳理了数据库、表、绑定表、表模板、数据源、ODBC等关键专业术语并按照启动MS Access、安装ODBC驱动、定义标志名、创建绑定表设定、脚本编程、最终测试的步骤逐项讲解便于读者按步骤完成Intouch与Access数据库的对接。目前已有202人学习下载适合自动化工程师、组态软件学习者及需要实现数据采集与存储的工业现场技术人员参考。1. InTouch 访问 SQL Access先跑通文档里的最小可复现链路做上位机的人都知道InTouch 跟 PLC 把数据采上来只是前半场数据能不能落库、能不能再读回来显示才是交差的关键。这份《InTouch 访问 SQL Access 数据库的实现.pdf》出自 2010 年工控部张为凤之手核心链路不复杂MS Access 建表ODBC 配一个 DSNInTouch 里建绑定列表再用 SQLConnect、SQLInsert、SQLSelect 三个函数把数据写进去、读出来。它解决的是最现实的场景——没有历史库、没有报表服务只有一台装 InTouch 的工控机和一个 Access 文件。适合两类人一是老项目要补数据库功能但不想动上位机架构的二是刚接触 InTouch 想把 SQL 访问原理一次弄清楚的新手。照着走一遍半小时内能跑通。2. Access 与 ODBC 配置先解决 DSN、表结构与驱动三个前置条件2.1 ODBC 在 InTouch 数据库访问里的角色InTouch 不直接操作 Access 文件它走的是微软的 ODBC 接口。ODBC 全称 Open DataBase Connectivity相当于中间翻译层InTouch 说标准 SQLODBC 驱动翻译成 Access 能懂的话。文档里明确写了这个标准“允许在不同的数据库格式之间进行内部联接”这也是为什么同样的脚本后续换 SQL Server、MySQL 也能复用——只要 DSN 换掉InTouch 侧基本不动。这里有个选型层面的真相Access 适合小数据量、单机、低并发的场景。一个工程几百个测点、每分钟几条历史记录Access 完全扛得住。文档用 MS Access 2000 ODBC 驱动那是当年的标配现在跑在 Windows 10/11 上系统自带的 Microsoft Access Driver (*.mdb, *.accdb) 也能用关键是 32 位和 64 位必须跟 InTouch 的位数对齐这个坑后面专门讲。先记住结论ODBC 是桥桥没搭好InTouch 这边再怎么调脚本都是白费。2.2 建库建表前先把字段档案记全文档里特意强调要“记下数据库文件名、表名和字段字段的数据类型、字段大小”这个台账习惯比配置本身更重要。因为后面 InTouch 绑定列表、脚本函数里每一项都要用到这些名字少记一个就得多翻好几次数据库。先新建一个 Access 数据库命名要短、不要带空格比如 TestDate.mdb。然后在这个库里建表 TestTable字段设计我的习惯是额外加一列自增主键方便以后做 SQLUpdate 和 SQLDelete。按文档的测试场景字段可以做这样的规划列名类型大小用途ID自动编号长整型主键可选Test1数值长整型写入测试列Test2数值长整型读取测试列Test3数值长整型InTouch 界面数据源在 Access 里可以直接用查询设计器跑 SQL 建表语句比手工点界面更快也方便留档CREATE TABLE TestTable ( ID AUTOINCREMENT PRIMARY KEY, Test1 INTEGER, Test2 INTEGER, Test3 INTEGER );这段 SQL 的关键是 AUTOINCREMENTAccess 里自增列必须用它SQL Server 里对应 IDENTITY(1,1)MySQL 对应 AUTO_INCREMENT。字段类型也要注意Access 的 INTEGER 是长整型对应 InTouch 里的整数型标记名如果你用文本字段InTouch 这边就得用内存字符串类型类型对不上插入时经常返回成功实际上没写进去或者直接报错。建完表后把这个文件路径、表名、每个列名和类型抄在一张纸上或者记在项目文档里后面每一步都要对照它。2.3 ODBC 数据源配置DSN 名称这块最容易被手滑配置 ODBC 数据源的入口文档写的是“开始-程序-管理工具-数据源(ODBC)”。新版 Windows 里换个找法控制面板 → 管理工具 → ODBC 数据源。打开后切换到“系统 DSN”选项卡再点“添加”这里我建议用系统 DSN 而不用用户 DSN因为 InTouch 如果跑在别的登录账户下用户 DSN 会看不见系统 DSN 对所有账户可见。添加时选择 Microsoft Access Driver然后填写数据源名称。这个名称就是后面 SQLConnect 脚本里要用的那个“MS Access Database”你可以自己起名但一旦写进脚本就别再改改了脚本就要跟着改。数据源名称的规则不要带空格不要用中文不要包含特殊符号。文档里示例用的名字是“MS Access Database”这个名字内部带空格是当年文档作者顺手起的实际项目里建议直接用 TestDSN 这种干干净净的名字少一个变量就少一个出错点。然后点“选择”按钮定位到刚才建的 TestDate.mdb 文件。配置完成后DSN 的最终状态就是配置项填写内容备注数据源名称TestDSN 或 MS Access DatabaseInTouch 脚本中唯一标识数据库文件C:\Intouch Applications\TestDate.mdb路径不能含中文字符驱动类型Microsoft Access Driver (*.mdb)32 位环境需单独处理配完别急着走直接在 ODBC 管理器里点“测试”确保弹出来的是连接成功。这一步过了后面 InTouch 连不上数据库时就能明确甩锅给脚本而不是数据库配置。2.4 一个小检查用 ODBC 直测连接很多人在 ODBC 管理器里填完就关等 InTouch 连不上时才开始排查。我一般会多做一步配置完立刻测试连接如果测试失败问题基本在文件路径选错或者 32/64 位驱动不匹配。如果测试通过但 InTouch 还连不上再回头查脚本里 DSN 名称是否拼写一致。这个习惯能帮你把故障范围砍掉一半省下来的时间够你多跑两轮测试。3. InTouch 侧配置标记名、SQL Access Manager 与绑定列表3.1 标记名定义先别急着建绑定列表打开 WindowMaker第一步是定义标记名。文档里叫“标志名”其实就是 InTouch 里的 Tag英文界面叫 Tag Name。这一步的顺序很重要先定义标记名再建绑定列表因为绑定列表要引用标记名顺序反了会绑不上。需要定义的标记名分两类。一类是系统工作变量ConnectionID 用来保存连接句柄ResultCode 用来接收每个 SQL 函数的返回值。这两个都定义成整数型Int。另一类是业务数据标记名Test1、Test2、Test3类型要和 Access 表里的列对应。文档的场景很典型Test3 是界面输入或者脚本生成的随机数Test1 是写入动作中绑定的 TagTest2 是读出后显示的 Tag。注意 I/O 型和内存型的区别如果数据来自 PLC 通讯标记名要定义成 I/O 整数型如果只是界面手动输入或者脚本内部计算内存型就够。这个类型选错不会让你立刻翻车但会在绑定列表映射时报数据类型不匹配。标记名的大小写、拼写都要固定下来后面脚本里写错一个字母报错信息又很含糊排查起来非常难受。3.2 SQL Access Manager确认装没装老版本 InTouch 的 SQL 访问能力不是默认全装的文档专门用一节提醒“如果你还没有在 Intouch 中安装 SQL就安装 SQL Access Manager”。这个组件在 WindowMaker 的菜单里表现为“SQL Access Manager”通常在特殊菜单下。打开后能看到绑定列表和表模板两个管理入口。如果打开 WindowMaker 找不到这个菜单说明组件缺失需要拿 InTouch 安装包补装而不是在项目里硬写脚本。曾经见过有人不知道这个前提写好了全套脚本结果运行时提示函数未定义查了半天才发现是组件没装。这个组件属于开发期组件现场运行时不依赖它但开发它的存在是写脚本的前提。3.3 绑定列表Tag 与表列一对一的映射绑定列表Bind List是 InTouch 和数据库表之间的桥梁。它的作用是把 InTouch 标记名和数据库表的列名做一一对应SQL 访问管理器里创建好以后脚本里只需要引用绑定列表名字不用每次都写 Tag 和列的对应关系。在 SQL Access Manager 里选“绑定列表”点新建给列表起个名字。文档里用的名字是“TestB”你也可以叫 Bind_Test 这种容易认的。然后往列表里添加条目每个条目指定数据库列名和对应的 InTouch 标记名。比如列 Test1 对应标记名 Test1列 Test2 对应标记名 Test2列 Test3 对应标记名 Test3。这里要强调文档里那句话“InTouch 定义标记名和数据库中的列名一一对应注意是一一对应这样才能执行相应的读取写入操作。”什么算不一一对应比如绑定列表里只绑了 Test1 和 Test2漏了 Test3那么 SQLSelect 读上来的 Test3 列就没有 Tag 接收显示就是空的。反过来绑定列表里多绑了一个不存在的列名SQLInsert 执行时 Access 会报字段不存在。所以建完绑定列表建议做一个“列名清单 vs 绑定列表”的对照检查两列名字逐个比一遍。另外要分清绑定列表和表模板表模板是定义表结构用的创建新表时才会用到这里只是往已有表里读写数据只需要绑定列表。文档里明确说没有涉及表模板配置新手别把这两个概念混在一起否则会在 SQL Access Manager 里绕半天。4. 写入与读取闭环SQLConnect 到 SQLEnd 的一次完整脚本4.1 连接按钮SQLConnect 只认 DSN 名所有数据库操作的前提是先建立连接。InTouch 的 SQLConnect 函数负责打开连接脚本写在按钮的动作脚本里。文档里的连接按钮脚本是// 连接按钮动作脚本 ResultCode SQLConnect(ConnectionID, DSNMS Access Database);这里两个参数要理解清楚。第一个参数 ConnectionID 是一个整数型标记名用来接收连接句柄后面所有 SQL 函数都要带上这个句柄才能找到之前的连接。第二个参数是连接字符串这里只有一个 DSN 指定含义是“使用名为 MS Access Database 的这个 ODBC 数据源”。如果第 2 章配置时改了自己的 DSN 名比如 TestDSN这里就要改成ResultCode SQLConnect(ConnectionID, DSNTestDSN);执行之后立刻检查 ResultCode返回 0 代表连接成功文档里说“如果连接状态显示 no error 表示连接成功”。非 0 就是失败常见原因就是 DSN 名称拼写不一致、ODBC 数据源没配置成功、32/64 位驱动错位。连接好以后ConnectionID 的值在本次运行期间要保存住不能让它被脚本其他地方覆盖。参数上还有一个细节连接字符串里可以追加用户和密码比如 SQL Server 的数据源需要ResultCode SQLConnect(ConnectionID, DSNMySqlDSN;UIDsa;PWD123456);Access 默认不需要用户名密码所以文档里只写了 DSN 一项。有这么个印象不会吃亏后面切库时就知道连接串往哪加参数。4.2 插入按钮SQLInsert 为什么要有 Test1Test3 这一步文档的插入按钮脚本是两行// 插入按钮动作脚本 Test1 Test3; ResultCode SQLInsert(ConnectionID, TestTable, TestB);没有任何其他脚本直接用 SQLInsert 就能把数据写进表。它之所以能写到正确的列里靠的是第三个参数“TestB”这个绑定列表。执行时 InTouch 会按照 TestB 里定义的映射把每个 Tag 的当前值写入到对应的表列中。所以写入前 Tag 里必须已经放好了要落库的数据。这就解释了为什么有 Test1 Test3 这一行。在绑定列表里Test1 这一个 Tag 对应表里的 Test1 列SQLInsert 执行时机是读取 Test1 的当前值。Test3 是界面上那个作为数据源的标记名用户输入或者随机生成的数据放在 Test3 里。必须先把它赋值给 Test1SQLInsert 才有机会把正确数据写进表。这个中间跳转是新手最容易看不懂的地方很多人以为直接传 Test3 进去就行实际上绑定列表不看“你传了谁”只看“列表里绑了谁”。如果想少写这一行就得在绑定列表里直接把列对应到 Test3 上但这会改变文档的结构不建议。插入结果的判断依然是 ResultCode。返回 0 表示 SQL 执行成功但不代表数据一定进了预期的表——它可能进了绑定列表指向的那一列但列名错位这种事它不会拦你。所以测试阶段最稳妥的做法是插入后打开 Access 实际看一眼。需要输出错误详情时用 SQLErrorMsg 函数SQLErrorMsg(ErrorString);ErrorString 先定义一个消息字符串标记名执行完 SQL 函数以后调用它会把数据库返回的具体错误信息填进来。实战调试时比单看 ResultCode 好用得多。4.3 查询与逐行读取SQLSelect、SQLFirst、SQLNext、SQLEnd 配合用读取比写入多一个“结果集”概念。SQLSelect 负责把符合条件的行查询出来InTouch 内部会保留一个临时结果集然后用 SQLFirst 和 SQLNext 一行一行往外取。文档里的查询按钮脚本是// 查询按钮动作脚本 ResultCode SQLSelect(ConnectionID, TestTable, TestB, , );四个参数分别是连接句柄、表名、绑定列表、Where 表达式、OrderBy 表达式。后两个传空字符串代表查询全部行、不排序。如果只想要满足条件的记录可以这样写ResultCode SQLSelect(ConnectionID, TestTable, TestB, Test1 100, Test2 ASC);Where 表达式的语法是 Access 风格的字段名直接用列名。执行完 SQLSelect查询结果里第一行还不会自动取出来需要再执行 SQLFirst// 显示第一行按钮动作脚本 SQLFirst(ConnectionID);SQLFirst 会把结果集里的第一行读到绑定列表对应的各个 Tag 里。假设绑定列表绑了 Test2那么执行完这行以后Test2 这个 Tag 的值就是数据库表里当前行的 Test2 列值。界面上把 Test2 关联到显示控件就能看到数据。接着点“显示下一个”按钮脚本是// 显示下一行按钮动作脚本 ResultCode SQLNext(ConnectionID);每次执行结果集游标下移一行当前行的列值再次刷新到绑定的 Tag 中。这里要注意 SQLNext 的返回值到达结果集末尾时返回非 0界面上的表现就是点了没反应或者数据不再变化。正常的工程做法是判断返回码到末尾时提示或者自动回到第一行。整个查询过程结束时必须关闭结果集// 关闭查询按钮动作脚本 SQLEnd(ConnectionID);SQLEnd 的作用是释放 SQLSelect 创建的临时结果集。文档里特别提到“当不想再读取数据时再执行关闭查询释放内存”。这句话放在 2010 年是对的放在今天同样重要。不执行 SQLEnd结果集一直占着连接资源下次再执行 SQLSelect 时可能返回错误长时间运行内存占用也会缓慢增长。四个函数的配合顺序可以总结为操作函数说明打开结果集SQLSelect查询数据生成临时结果集读取第一条SQLFirst游标定位到第一行逐行后移SQLNext每次取下一行到绑定 Tag释放结果集SQLEnd查询完成后必须调用4.4 窗口显示脚本窗口一开就能看到数据库里的数据文档里提到“窗口运行脚本”但没有给出完整内容。常见的做法是让窗口在刚打开时自动执行一次连接和首行读取这样画面一出现就有数据不需要手动点按钮。可以放在窗口显示脚本Window Display Script里// 窗口显示脚本窗口打开时自动连接并读取第一行 ResultCode SQLConnect(ConnectionID, DSNMS Access Database); if (ResultCode 0) { ResultCode SQLSelect(ConnectionID, TestTable, TestB, , ); SQLFirst(ConnectionID); }这么写的好处是开窗口即连接、即查询省一次按钮操作适合做监视画面。但要注意一点窗口关闭时最好补一个 SQLEnd否则连接和结果集都挂在进程上。窗口关闭可以再写一个窗口关闭脚本执行// 窗口关闭脚本释放结果集 SQLEnd(ConnectionID);如果多个窗口共用同一个连接就不要每个窗口都执行 SQLConnect改成在 Application 脚本里统一连接一次窗口脚本只做查询和显示。这种组织方式在大型画面里更稳也更容易排查问题。5. 避坑照着文档操作最容易翻车的五个点5.1 SQLConnect 返回非 090% 出在 DSN 名称现象脚本执行后 ResultCode 返回非 0ConnectionID 没有拿到有效句柄后续所有 SQL 操作都失败。提示信息包含数据源名称拼写或者驱动加载失败。原因ODBC 管理器里配置的 DSN 名称和脚本里“DSN”后面写的名称不一致哪怕差一个空格或者多打一个下划线都连不上。还有一部分情况是配置的 DSN 在“用户 DSN”里而 InTouch 进程是在另一个账户下运行的它根本看不到这个用户 DSN。解决回到 ODBC 管理器把 DSN 名称复制出来直接粘贴到脚本里。同时检查添加 DSN 时选的是“系统 DSN”而不是“用户 DSN”。统一用系统 DSN 能绕开账户权限问题。我一般还会在脚本里临时弹出一个消息框显示 ResultCode确认返回值确实是 0 再继续往下做。5.2 SQLInsert 执行成功但表里没有数据现象ResultCode 返回 0界面也没有报错但打开 Access 表里面根本没有新增的行。原因最快的检查点是绑定列表。SQLInsert 是按绑定列表里定义的 Tag 取值写入的如果绑定列表里这一项绑的是 Test1而 Test1 没有被赋值或者被赋成了上一次的旧值那么写进去的就是旧数据或者默认值 0。还有一种情况是字段类型不匹配文本字段绑了整数型 TagAccess 在接收时直接丢弃。解决写入前先确认绑定 Tag 的当前值正确。文档脚本里那一行 Test1 Test3 不能省那不是在兜圈子是在把数据源值搬到绑定 Tag 上。测试阶段可以在脚本里用 MessageBox 把 Test1 的当前值打出来看一眼值和预期一致再执行 SQLInsert。如果查出来是类型问题回到标记名词典把 Tag 类型改成和列类型匹配。5.3 查询读取时窗口里永远只有第一行现象SQLFirst 执行后能显示第一行数据但点“显示下一个”按钮画面上的数值不再变化。原因最常见的是 SQLNext 返回了非 0 但脚本没有处理界面看不出报错误以为没有数据。另一种可能是结果集被提前关闭了比如在循环里不小心执行了 SQLEnd游标状态丢失。还有一种是绑定列表只绑了一个列读出来的其他列没有 Tag 接收看起来就像数据没变化。解决在 SQLNext 后面判断返回码非 0 时提示“已到末尾”或者自动 SQLFirst 回到第一行。检查绑定列表是否把所有需要显示的列都绑齐了。再确认全流程顺序SQLSelect → SQLFirst → SQLNext中间不能插入 SQLEnd。5.4 ODBC 管理器里找不到 Access 驱动现象打开 ODBC 数据源管理器点“添加”弹出的驱动列表里没有 Microsoft Access Driver只有 SQL Server 之类。原因系统装的是 64 位 Access 驱动但打开的是 32 位 ODBC 管理器或者反过来。Windows 自带的 ODBC 管理器有两个版本控制面板里默认打开的是跟系统位数一致的那个InTouch 如果是 32 位就必须要用 32 位的 ODBC 管理器来配置 DSN否则互相看不见。解决32 位 ODBC 管理器的路径是 C:\Windows\SysWOW64\odbcad32.exe直接运行这个添加驱动时 Access 驱动就会出现。这个细节文档里没写因为 2010 年还是 32 位系统的天下现在跑新系统时这是最高频的翻车点。5.5 窗口打不开日志提示“无法打开 InTouch 应用程序请参阅记录器获取详细信息”现象往窗口里加了脚本以后窗口直接打不开或者运行时报错日志查看器里的错误信息非常笼统指向不明。原因大多数情况下是脚本里引用了不存在的标记名或者绑定列表名称写错。InTouch 对这类脚本错误的提示就是这一句“请参阅记录器”不会精确告诉你哪个 Tag 拼错了。比如绑定列表叫 TestB脚本里写成 TestBind运行时就崩在这一行。解决先打开标记名词典确认脚本里每一个 Tag 都存在尤其是 ConnectionID、ResultCode、Test1、Test2、Test3。再去 SQL Access Manager 里核对绑定列表名称和脚本引用是否一字不差。我经常犯的错误是把绑定列表名和表名搞混表名叫 TestTable绑定列表叫 TestB脚本里两个参数位置写反了。检查一遍比在日志里猜快得多。6. 换数据库的边界Access 切 SQL Server / MySQL 时只改 DSN 不动绑定文档最后提到一句话SQL Server、MySQL、Oracle 的访问差别在于建好表、记好属性、绑定列表绑好、SQLConnect 写对就 OK。这句话是整份文档里含金量最高的一段因为它的意思是绑定列表这一层把 InTouch 和数据库的结构解耦了换数据库时大部分脚本不用动。Access 在并发写入和长时间运行上有限制。单文件机制决定了多个 InTouch 节点同时写同一张表时会锁库数据量上了几十万行后查询速度也会变慢。项目中期切到 SQL Server 是很常见的路径操作步骤其实就五步。第一步在 SQL Server 里建一张同构的表列名、类型尽量跟 Access 里保持一致。第二步在 ODBC 管理器里添加 SQL Server 驱动配置新的 DSN。第三步改连接脚本把 DSN 换成新名字有用户密码就加上ResultCode SQLConnect(ConnectionID, DSNSqlServerDSN;UIDsa;PWD123456);第四步绑定列表完全不用动因为绑定的是列名和 Tag 名跟底层数据库类型无关。第五步重新测试一遍写入和读取。切 MySQL 同理DSN 选 MySQL ODBC 驱动连接字符串加上 UID 和 PWD唯一要注意的是 MySQL 8 以上的认证插件默认是 caching_sha2_password老版 ODBC 驱动可能连不上用新版驱动即可。换库以后建议第一时间做一次读写校验先 SQLInsert 一条带着时间戳的记录再 SQLSelect 读回来比对写入值和读取值。这个校验逻辑简单但能一次性覆盖连接、绑定、写入、读取全链路。我第一次照着这份文档走通 Access 链路是在 DSN 名称多打一个空格上栽了一个钟头从那以后凡是接数据库我都要先把 ResultCode 弹出来看一眼再继续这条习惯救了我好多次。希望帮到你。本文还有配套的精品资源点击获取