
前一篇讲了Intouch怎么装、怎么建第一个工程、怎么把WindowMaker和WindowViewer这对“编辑/运行”兄弟分清楚。这篇咱们把真正干活时绕不开的几个核心功能拆开揉碎讲清楚标记名怎么建才不会以后想哭、图形动画怎么做才不掉链子、通信怎么走通PLC数据、报警和历史数据单机版怎么玩得转。这些都是我实际做项目时一个个踩过来的写成白话给你照着做基本能避开大部分坑。1. 单机版Intouch的环境与工程规划1.1 版本选型背后的逻辑先说版本。Intouch这些年版本号一堆从老的7.0、9.5、10.x、11.x到后来的2012、2014、2017、2020更名之后是Wonderware Intouch现在归Aveva旗下了。很多新手一上来就问“到底装哪个版本好”我的建议很直接能用2017 R2或2020就别碰老古董。原因有三个——第一新版对Windows 10/11的兼容性好很多老版本在Win7上跑得欢换到新系统动不动就报表控件失效、历史数据服务起不来。第二新版的图形渲染和符号库比老版强一大截做出来的画面不会像上个世纪的风格。第三授权管理方式更统一老版本的授权服务有时候折腾半天认不到狗。不过这里有个反直觉的经验在工业生产现场千万别只图新。2020之后的某些版本在部分工控机上反而偶发画面刷新问题。我见过一个项目现场Windows 10 LTSC 2019 Intouch 2017 R2跑了三年稳如老狗。所以我的选型公式是新项目且系统盘性能好用2020老系统利旧改造继续用2012/2014虚拟机或老工控机2017 R2是万金油。单机版这个词也需要解释一下。Intouch的“单机版”指的就是不依赖System Platform、不搞分布式部署、不上一堆AppServer服务的独立版本。你在一台机器上装完WindowMaker做画面WindowViewer跑运行组态和运行在同一台机器上完成。很多小项目——三五台PLC、几十个点位、一台操作员站——根本用不上大型SCADA架构单机版就是性价比最优解。但注意单机版不等于“随便搞搞”工程规划如果不做后期加设备能把你烦死。1.2 工程结构规划与备份我第一次做单机版工程的时候直接在默认目录下乱建画面画面名用“画面1”“画面2”这种命名。结果一个多月后回头维护自己都分不清哪个是哪个。后来我做了一个简单的规范现在每次开新工程都按这个来画面命名按区域缩写加功能比如HT_OVERVIEW换热站总览、HT_PUMP11号泵、TREND_MAIN主趋势、ALARM_MAIN报警总览目录结构画面统一放在一个目录脚本统一管理标记名前缀设备代号加点位类型后面细说Intouch的工程文件结构本质上是WindowMaker在某个应用程序目录下生成的一组文件。里面最核心的是这几个*.APP工程启动文件双击会启动Application Manager*.WIN窗口文件每个画面窗口一个TAGNAME.DAT标记名辞典文件这玩意最重要所有点位定义都在里面一旦损坏容易出大事LOGIC.DAT全局脚本文件所以日常备份你只需要把整个应用程序目录打包即可。我在现场的习惯是每天下班前关掉WindowViewer把整个工程目录压缩一份扔到U盘或拷贝到上位机。别嫌麻烦我有一次现场改脚本改到一半电脑蓝屏重启后LOGIC.DAT直接损坏幸好前一天有备份不然一周的改动全废了。2. 标记名Tagname是组态的根2.1 访问名、标记类型与数据类型的三角关系很多初学者最懵的就是Intouch这套标记名体系。你打开WindowMaker点“标记名词典”Tagname Dictionary会看到需要填一堆东西访问名、标记类型、数据类型、初始值、报警上下限……满屏英文直接劝退。这里我用人话把关系理清楚。访问名Access Name是Intouch和外部通信的“通道配置”。它告诉Intouch你要跟谁通信、走什么协议、连哪个节点。比如你定义了访问名PLC1_MODBUS它指向Modbus TCP的特定IP和端口。后面所有标记名只要“挂在”这个访问名下就等于所有点都从PLC1_MODBUS这个门出去读数据。简单说访问名是“通信路由”标记名是“具体地址的房间号”。标记名Tagname就是你在HMI画面里用来引用的变量。它分为两大类——I/O型和Memory型。I/O型标记名是从外部设备PLC、仪表读写的数据它有对应的访问名、设备地址或寄存器地址Memory型标记名是Intouch自己的内存变量不跟外部通信常用于中间逻辑计算、画面切换控制、按钮状态保存。数据类型按照工控习惯Intouch常用的是离散型Discrete布尔、整数型Integer、实数型Real、字符串型String和消息型Message。选错数据类型这事我见过太多次把PLC传来的32位浮点数定义成Integer读出来的数据就像天书。这里送你一条实战准则凡是模拟量、温度、压力、流量一律用Real凡是阀门开关、电机启停状态一律用Discrete凡是计数器、批次号用Integer报警信息和故障描述考虑String或Message。2.2 实操五步建好一个可用的I/O标记名假设现在现场有一套Modbus TCP的PLC需要读取一个寄存器的压力值地址是40001数据是浮点数。咱们用这个例子走一遍完整流程创建访问名菜单“标记名 - 访问名”新建访问名。名字填PLC1节点名填PLC的IP以实际为准应用程序名选“MODBUS”话题名可以留空或用通道名协议选“Modicon Modbus”或“Modbus TCP”。保存。打开标记名词典菜单“标记名 - 标记名词典”点“新建”。填写标记名名称填PRESSURE_MAIN主压力。选择类型类型选I/O RealI/O型实数。配置地址访问名选PLC1地址填40001。Intouch的地址格式不同驱动略有差异Modbus协议下很多驱动用寄存器地址或偏移地址如果你不确定具体格式先查一下对应驱动手册别靠猜。保存之后这个标记名就可以在画面和脚本里直接用。你先不需要理解里面每个字段的深意先把它跑通后面踩过几次通信坑自然就明白了。2.3 命名规范与死区设置的惨痛教训我做过一个饮料车间的项目当时年轻气盛标记名随手起。后来设备增加到两百多个点位画面开始复杂了我就发现不对——看名字完全不知道哪个是哪个。后来我重新整理了规范自己总结了一套推荐给大家参考设备代号P泵、V阀、T罐、F流量计、M电机功能后缀_RUN运行、_FAULT故障、_AUTO自动模式、_PV过程值、_SP设定值、_OUT输出值举例P101_RUN代表101号泵的运行状态V202_OPEN代表202号阀的开到位反馈T301_PV代表301号罐的温度过程值。这套命名可能不是最优的但在中小项目里足够直观你在组态画面里写脚本时看一眼标记名就知道是哪个点的什么属性极大降低维护成本。另外报警死区这个参数新手经常忽略。所谓死区就是当数值从超过报警上限回落到多少时才算“报警恢复”。如果不设置死区或死区太小现场压力在报警值附近轻微波动时系统会不断产生报警/恢复/报警/恢复的抖动报警记录和蜂鸣器能把操作员逼疯。我给一个经验值温度死区0.5~1℃压力死区按量程的0.5%~1%设置液位死区可稍大。你要是看到现场报警频繁抖动先别急着怀疑PLC八成是死区设小了。3. 图形对象与动画连接3.1 画面设计基础对象、图库与智能符号Intouch的画面本质上是在WindowMaker里摆各种图形对象矩形、圆、管道、文本、位图然后给这些对象绑定“动画连接”。当你掌握了这个“先画图、再绑数据”的思路界面的复杂度就只是个时间问题了。绘图工具栏上的基础组件跟画图软件类似。工具箱里还有“符号工厂”和“智能符号”SmartSymbol功能前者可以自己做可复用的图元后者是带逻辑的图形对象。我建议你前期老老实实把基础对象练熟矩形、椭圆、文本、水平滑动条、垂直滑动条、按钮、指示灯、管道线……这些就够用了。图库是个好东西。Intouch自带的图库里有很多泵、阀、电机、罐体的符号直接拖进来改一改就能用。不过要注意图库里的符号有些是“纯图片”不带动画连接你得自己绑定数据有些则自带了连接的属性放进画面时要检查一下它绑的是哪个标记名避免出现“我明明改了标记名怎么画面不动”的情况。做画面我有个习惯网格对齐一定要开。Panel的网格间距设成2~4像素画管道和布局的时候不会歪七扭八。现场操作员天天盯这个画面要是线条对不齐很容易给人留下不专业的印象。3.2 用填充动画做一个液位显示这一节我们动手做最经典的例子——一个液位罐用矩形填充高度显示罐内液位百分比。具体步骤新建一个窗口命名DEMO_TANK宽度800高度600。从工具箱选择“矩形”在画面上拉一个细长的矩形当作罐体。宽度建议60像素高度400像素。右键矩形选择“动画连接”Animation Links在弹出的窗口里找到“填充”Fill类型。表达式填液位的标记名比如LI_101_PV。设置百分比对应关系Intouch的填充动画需要配置“值对应百分比”。比如液位变送器输出是0~100kPa而你希望画面上显示0到100%的填充那么最小值填0对应百分比0%最大值填100对应百分比100%。如果你的液位量程是0到5000mm那就填0对应0%5000对应100%。填充方向选“从下到上”这样液位上涨时矩形是从底部向上升起来的。保存运行后你看到的画面就是液位随着PLC实际值一起升降。这里最关键的思维是动画连接的“表达式”不一定要填标记名它也可以填一段表达式比如(LI_101_PV - 0)/(5000 - 0) * 100这样你就可以把工程量换算成百分比。很多老工程师喜欢直接填百分比因为PLC侧已经做了量程转换但你要清楚在哪里转换更合适。填充动画只是冰山一角Intouch的动画连接还有颜色变化通过表达式真假变化改变对象颜色。比如P101_RUN 1时变绿P101_FAULT 1时变红。配方写法是选择“颜色”标签填入表达式和对应的前景/背景色。文本显示可以实时显示字符串消息比如设备状态、报警描述。对象大小用数值控制对象的长宽可以做趋势条或模拟仪表棒图。位移用数值控制对象的水平和垂直位置这个做动画小车、皮带传输效果很好用。滑动条与输入做设定值调整非常好用可以在运行画面里直接写PLC的给定参数。3.3 表达式与QuickScript的第一次亲密接触有了动画连接的基础你会发现表达式就是Intouch的灵魂。除了在动画连接里填表达式Intouch还可以写脚本QuickScript。脚本分好几种最常用的是“窗口脚本”“按键脚本”“条件脚本”。举一个最简单的例子。你在画面上放一个“自动/手动”切换按钮点击后需要把PLC里的某个M区置位。选择按钮右键“动画连接”在“动作”Actions里选“左键动作”输入IF SWITCH_MODE 0 THEN SWITCH_MODE 1; ELSE SWITCH_MODE 0; ENDIF;这段脚本的意思是如果当前模式标记名SWITCH_MODE的值是0就把它改成1否则就改成0。注意Intouch的QuickScript基本语法里的细节每条语句要以英文分号结尾IF...THEN...ELSE...ENDIF;不能少逻辑比较用等号而不是单等号。这些细节不搞清楚脚本写完不生效你都不知道错哪了。Intouch脚本中数组的下标从1开始不是0。这一点跟大部分编程语言不一样。我第一次写数组循环按C语言的习惯从0遍历结果把画面搞崩了。还有注释符号是单引号开头。比如 这是一个注释 PT100_ARRAY[1] PT100_PV;如果你有多余的脚本逻辑标准做法是放在“全局脚本”Global Script里用条件触发或周期触发。举例每5秒把实时压力值写入历史表中的某个局部变量就可以建全局脚本触发条件填1 1然后设置一个定时执行周期为5秒脚本里写一段数据搬运逻辑。脚本操作有一个大忌不要在按键脚本里直接写死循环。我见过有人图省事在按钮脚本里写了一个WHILE循环等待某个条件结果画面直接卡死WindowViewer整个无响应只能强制结束进程。Intouch的脚本是串行执行在界面线程里的一旦死循环界面就完蛋。4. 通信配置与OPC连接4.1 通信方式选型DDE、SuiteLink与OPCIntouch的通信家族按年代可以分为三代。最老的是DDE动态数据交换Windows 95时代的老古董后来Wonderware搞了SuiteLink比DDE稳定快速现在主流的是OPC DA/UA。单机版项目我强烈推荐直接用OPC。原因很简单现在市面上的PLC、仪表、第三方网关几乎都能通过OPC服务器暴露数据。你用一套Kepware之类的OPC服务器把PLC的数据Model成OPC标签Intouch作为OPC客户端去读就不需要去折腾老掉牙的DDE语法。但这里需要提醒一个关键点Intouch自带的OPC客户端是OPC DA 2.0/3.0它不支持OPC UA除非你用第三方桥接软件。所以如果你要接的PLC只支持OPC UA那通路就变成“PLC UA - OPC UA服务器 - UA-DA桥 - Intouch DA客户端”链路会变复杂。大多数情况你用Kepware做统一网关Kepware本身可以把UA采集下来的数据重新以DA方式暴露给Intouch。4.2 实操走通OPC通道咱们以Modbus TCP PLC为例配一个标准OPC链路完整走一遍PLC侧准备在你的PLC里准备好要读写的寄存器数据。如果是测试可以用电脑装一个Modbus从站模拟器。安装OPC服务器这里我用Kepware现在叫KEPServerEX做示范。安装完成后在Kepware里新建一个通道选择驱动“Modbus TCP/IP”指定PLC的IP地址、端口502、单元ID通常为1或与PLC配置一致。在Kepware里新建设备设备名称填S7_1500或M221按你的PLC型号填名称只是逻辑名。关键设置包括字节序Byte Order这个非常容易错——不同PLC的浮点字节顺序不一样顺序不对读出的浮点数是乱码。遇到浮点读出来驴唇不对马嘴先检查字节序。建标签在设备下创建标签比如Pressure地址映射到40001。Intouch侧建访问名打开WindowMaker创建访问名协议选“OPCLink”节点名留空或填本机名应用程序名填Kepware.OPCClient话题名或OPC server ProgID填Kepware提供的ProgID比如Kepware.KEPServerEX.V6。注意不同版本ProgID略有差异在系统中可以查到。建标记名在标记名词典里新建一个I/O Real标记名访问名选刚才建的OPC访问名项目名Item Name填Channel1.Device1.Pressure——这个路径要和Kepware里的层级完全对应。验证运行WindowViewer拉一个文本显示绑定这个标记名如果值真实刷新说明链路通了。链路通之后操作员最常用的功能是写入。OPC写入的参数配置同样在标记名词典里完成一般不用额外配置但你需要保证PLC侧对应寄存器是可写的。如果写入失败十有八九是PLC侧程序把这块地址保护了或者你写的地址本身就是只读的。4.3 通信状态监控与故障排查通信入门容易排查难。单机版环境里最常用的排查工具是Intouch自带的SMCSystem Management Console。你可以在开始菜单里找到它打开后选择当前运行的Intouch应用查看“通信状态”。我调试通信时有个固定套路按顺序看三步看WindowViewer窗口右下角——如果标记名显示是红色感叹号或通信用红色叉号说明这个标记名的通信处于失败状态。这是第一信号。看SMC里的实时统计——SMC会显示每个访问名发送和接收的记录数、失败次数、平均响应时间。如果发送数一直在增加但接收数是0说明数据发不出去考虑IP通不通、PLC程序是否运行。用OPC服务器自带的Quick Client诊断——Kepware这类OPC服务器都会带一个测试客户端你可以不看Intouch直接用Quick Client连OPC服务器读那个标签。如果Quick Client能读到而Intouch读不到问题就在Intouch的访问名或程序集配置上如果Quick Client也读不到问题就在OPC服务器或PLC侧。这个思路能帮你快速定位是“Intouch配置错”还是“底层通信错”不用像个无头苍蝇一样到处改配置。5. 报警、历史数据与运行调试5.1 报警系统的正确玩法Intouch单机版的报警功能其实很完整。很多初学者不知道怎么配报警觉得复杂就干脆不做只用画面颜色变红来提示——这在正规项目上是行不通的。操作员不可能每分钟都盯着屏幕看颜色报警记录也是事后追责和改进的依据。配置报警的关键路径定义报警组在标记名词典里每个标记名都可以指定一个报警组比如SYSTEM_MAIN、TANK_GROUP、PUMP_GROUP。设置报警上下限和死区在标记名词典或细化到报警标签页里设置高的报警值、低低的报警值、高的高高报警值等。这里的死区就是前面讲的去抖设置。放置报警显示控件在运行画面里插入一个“报警/事件”显示控件选择关联的报警数据源。操作员在运行界面就能看到实时的报警列表并按时间、优先级、报警组筛选。报警声音在Intouch运行环境里可以启用报警声响报警产生时主机蜂鸣器发出声音提醒操作员。单机版做报警有一个容易忽略的点——告警确认Acknowledge。工业现场默认逻辑是报警产生后操作员需要点击确认才能让报警状态从“未确认”变成“已确认”。在设计时你要决定哪些报警需要确认、哪些不需要。比如液位高位报警可能只是提示允许不确认但燃气压力低低联锁报警必须确认并记录确认时间。Intouch的确认状态也是可以写到PLC里的配合安灯系统或MES使用。5.2 历史数据与趋势显示单机版要积累历史数据最简单的就是开启Intouch自带的历史记录功能。配置在运行环境WindowViewer的“历史数据”里勾选需要记录的标记名设置存储路径和采样周期一般1秒到5秒。数据会存储为本地文件或SQL数据库单机场景下建议用本地文件效率高且不依赖外部数据库。然后在画面上放置“历史趋势”控件绑定对应标记名操作员就可以查看过去24小时、一周、一个月的趋势曲线。我的项目经验是历史数据的存储周期最好跟工艺变化速度匹配。液位这种变化慢的5秒一个点完全够用压力波动快的关键点1秒一个点才算安全。但存得越密文件增长速度越快磁盘空间要提前规划好。另外如果你在运行WindowViewer的时候改了历史记录配置必须要重启运行环境才能生效这点很多人不知道导致改了感觉没改。5.3 运行调试与交付部署单机版开发完成后的调试阶段我推荐一套流程先模拟、后真实可以用模拟数据先测画面动画、报警、脚本逻辑确认无误后再接真实PLC。一个一个点排查接上真实PLC后把所有I/O标记名导出一份清单逐个核对实时值是否和PLC侧一致。测试报警联动人为触发报警确认报警声音、颜色变化、报警记录三样东西都正常。压力测试连续运行24小时或48小时观察WindowViewer内存占用是否持续增长通信是否掉线重连。如果内存一直涨多半有脚本泄漏或历史数据句柄泄漏要尽早查出。正式交付给现场时单机版部署其实很简单把开发机的整个应用程序目录拷贝到操作员站安装好Intouch运行时授权配置好WindowViewer开机自启动。这里提醒一句很多工厂的操作员站是没有键盘鼠标的你得把操作界面设计成纯触摸或鼠标友好按钮大一点、位置固定、逻辑清晰。6. 常见问题与排查技巧实录6.1 高频故障速查表我把自己和同行经常遇到、跟我私信求助最多的几类问题整理成一个表留着备用现象优先排查方向常见解法标记名显示红色或停止更新通信访问名或底层OPC链路用SMC看通信状态用OPC Quick Client测试底层浮点数乱码、数值异常大/小字节序、字序、数据类型检查OPC服务器里标签的字节序设置尝试不同顺序打开画面时脚本报错脚本语法、标记名拼错在WindowMaker里用“编译脚本”功能定位错误行报警抖动频繁报警死区设置调大死区观察是否稳定WindowViewer启动后没画面主启动窗口配置错了在运行环境的“起始窗口”设置里修改主窗口修改了标记名但画面不更新标记名词典没保存保存标记名后再运行程序运行一段时间通信断开网络掉线、OPC服务器崩溃、PLC程序停止检查网线/交换机日志重启OPC服务和PLC程序历史趋势无数据历史记录功能没启动或存储路径失效检查WindowViewer历史记录配置确认存储路径存在遇到问题先冷静定位是“配置问题”“数据问题”还是“环境问题”绝大多数Intouch故障都能通过定位层级解决。别一上来就卸载重装这是最后的手段。6.2 我踩过的几个真坑上面那些是常规问题下面这几个坑属于“教科书里不写但现场一定会遇到”的。第一个坑是断电导致组态丢失。我在一个污水处理项目上工程改了三天画面结构、脚本全都弄好了结果现场突然跳闸电脑重启后打开工程提示标记名词典文件损坏。后来我学乖了每天固定时间压缩备份工程目录。修改大工程结构之前也备份一次。组态软件的工程文件不像Word那样有自动恢复丢了就真丢了。第二个坑是脚本死循环卡死运行画面。当时给操作员做一个“一键启动”按钮里面写了循环等待多个设备全部启动完成的脚本想着简化操作没想到有一个阀门故障导致条件永远不满足脚本卡在循环里整个操作员站直接无响应。这个教训让我明白任何按键脚本都不要写阻塞式循环正确做法是使用“条件脚本”——设定一个周期触发的脚本检查启动条件不满足时自动发送报警而不是在按钮里等。第三个坑是字节序导致的历史数据全错。那是我接一个进口品牌PLCKepware默认按大端解析PLC变量实际是小端存储结果所有浮点数据全部错乱。排查了半天最后发现就是字节序选项的问题。所以任何通信问题先怀疑字节序和数据类型再怀疑通信链路。6.3 新手最容易忽略的几个小技巧最后给几个实用小技巧都是经验换来的善用窗口脚本和全局脚本不要把所有逻辑都堆在按钮脚本里分散容易乱。会用F3键在WindowMaker里按F3可以快速打开标记名词典查找标记名开发效率提升巨大。CtrlW在WindowMaker画画面时选中多个对象后按CtrlW可以对齐和分布对象排布画面非常实用。模板画面思路多个相同设备比如10台一样的泵别做10个画面。做好一台泵的控制画面用“间接标记名”或替换引用功能复制画面并改绑定即可。符号工厂做自定义图元把常用设备做成自己的智能符号里面带上动画连接模板后续新工程直接拖出来用效率暴增。我个人的体会是Intouch这样的工业组态软件上手门槛并不高真正难的是“习惯用工程化思维去做图”。所谓工程化思维就是命名规范、结构清晰、脚本简洁、备份及时。这套方法论养成了哪怕以后你换别的组态软件依然能快速迁移。这个系列说到这儿作为一个单机版入门你只要把标记名、画面绑定、通信连接、报警历史这四个核心吃透就已经能顶起一个小项目的实施了。后面如果项目规模变大、点位上千或者需要多站部署再考虑System Platform或者数据库历史库也不迟——但单机版项目积累的底层思路换到任何大架构上都不过时。