尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

WinCC 7.5 SP1按钮操作记录方案:VBS实现二次确认、CSV日志与SAPI语音播报

发布时间:2026/9/28 1:40:45

资讯中心
01
ARTICLE

WinCC 7.5 SP1按钮操作记录方案:VBS实现二次确认、CSV日志与SAPI语音播报

WinCC 7.5 SP1按钮操作记录方案:VBS实现二次确认、CSV日志与SAPI语音播报
1. 按钮操作记录为什么值得单独做一套方案在工业上位机项目里按钮操作记录这件事说大不大说小也绝对不小。我做过好几个WinCC7.5SP1的改造项目甲方在验收阶段最常提的两类需求一个是操作能不能留痕另一个是关键动作能不能再确认一下。前者对应操作记录后者对应二次确认如果再叠加一个语音播报整套交互体验就完全不一样了。很多同行觉得WinCC自带的报警记录和操作员输入消息已经够用了但实际用下来会发现两个问题。第一系统自带的记录粒度太粗它记录的是变量被写了什么值而不是谁在哪个画面点了哪个按钮。第二二次确认和语音提示在标准控件里没有现成方案要么用弹窗硬凑要么干脆不做。而VBS在WinCC7.5SP1里是原生支持的脚本语言不需要额外装运行库配合Windows自带的语音接口就能把这三件事串起来。这套方案适合谁如果你正在做WinCC7.5SP1的画面组态手上有几个关键按钮需要加确认逻辑同时希望操作动作能落到数据库或者文本文件里方便追溯那这篇内容基本可以照着抄。哪怕你之前没怎么写过VBS只要会拖控件、会改属性跟着走一遍也能落地。下面我会把设计思路、代码细节、踩过的坑全部摊开讲代码都是实测能跑的参数也会说明为什么这么设。2. 整体设计思路与方案选型拆解2.1 为什么选VBS而不是C脚本WinCC里做脚本有两个选择C脚本和VBS。C脚本性能好、能调API但写起来啰嗦字符串处理尤其难受。VBS的优势在于语法简单、和Windows系统接口亲和度高尤其是调用语音播报这种系统级功能时VBS几行就能搞定C脚本反而要绕一圈。具体到这个需求按钮点击后要做三件事弹确认框、写记录、播语音。确认框用MsgBox一行搞定写记录用FileSystemObject或者数据库连接语音播报用SAPI.SpVoice对象。这三个都是COM组件VBS调用起来最顺。C脚本虽然也能调COM但WinCC的C脚本对COM支持有限调试起来很痛苦。所以选VBS不是因为它更强而是因为它在这个场景下够用且省事。还有一个现实原因VBS脚本可以直接在按钮的鼠标点击事件里写不需要编译改完立即生效。调试阶段这个特性太重要了你改一行代码点一下按钮就能看到效果不用等编译。2.2 二次确认的交互设计考量二次确认看起来简单但设计上有几个点要想清楚。首先是确认框的按钮类型用是/否还是确定/取消我建议用是/否因为操作员在工业现场往往戴手套操作按钮越大越好点而是/否的按钮比确定/取消更短视觉上更聚焦。其次是确认框的标题和内容措辞。标题要写清楚是哪个设备的操作内容要说明后果。比如确认启动1号泵启动后管道将加压这样操作员点是之前能明确知道自己在干什么。我见过有的项目确认框只写是否确认操作员根本不知道确认什么这种二次确认等于没做。第三是确认框的返回值判断。VBS的MsgBox返回值是数字vbYes是6vbNo是7。判断的时候要用常量而不是硬编码数字否则后面维护的人看不懂。如果操作员点了否脚本要直接退出不能继续往下执行写记录和播语音的逻辑。2.3 语音播报的实现路径选择语音播报这块WinCC本身没有内置功能必须借助系统接口。Windows提供了两套方案一套是SAPISpeech API通过SAPI.SpVoice对象调用另一套是直接播放音频文件用Windows Media Player的COM组件或者SoundPlayer。SAPI的好处是能把任意文字转成语音不需要提前录音适合播报动态内容比如1号泵已启动这种带设备名的句子。缺点是语音音色比较机械而且不同Windows版本的语音库不一样Win7和Win10听起来差别挺大。播放音频文件的好处是音质可控你可以提前录好设备启动成功的提示音缺点是只能播固定内容动态信息没法播。我的建议是两者结合固定提示音用音频文件动态信息用SAPI。但为了简化这篇先讲SAPI方案因为它不需要额外的音频文件部署起来最省事。如果你对音质有要求后面我可以再写一篇讲音频文件方案的。2.4 操作记录存储方式的选择操作记录存哪里三个选项文本文件、CSV文件、数据库。文本文件最简单但查询不方便数据库最规范但需要配置连接CSV介于两者之间能用Excel打开也能用脚本解析。考虑到WinCC项目通常部署在工控机上不一定有数据库环境我建议用CSV文件。格式就是时间戳,操作员,按钮名称,操作结果一行一条记录。这样既方便人工查看也方便后续用脚本做统计分析。如果项目确实需要数据库把写文件的部分换成ADO连接就行逻辑是一样的。文件路径要注意不能写在WinCC安装目录下因为那个目录可能需要管理员权限。建议写在D:\OperationLog\这种独立目录脚本里用CreateFolder确保目录存在。文件名按日期分比如20250115.csv这样单文件不会太大查起来也快。3. 核心代码细节与实操要点3.1 按钮点击事件的脚本挂载位置在WinCC7.5SP1的画面编辑器里选中按钮控件右键属性找到事件选项卡。这里要注意按钮的点击事件有两个一个是鼠标点击一个是按左键。区别在于鼠标点击是按下并松开后触发按左键是按下就触发。对于需要二次确认的操作必须用鼠标点击否则操作员按下按钮的瞬间就弹确认框松手的时候可能误触。挂载脚本的时候选择鼠标点击事件然后选VBS动作。WinCC会打开一个脚本编辑器里面默认有一个Sub OnClick(ByVal Item)的函数框架。所有的代码都写在这个Sub里面。注意不要改函数名和参数否则WinCC找不到入口。还有一个细节如果按钮上绑定了变量比如按下时置位那这个变量动作和VBS脚本会同时执行。如果你希望确认通过后才改变量就要把变量动作去掉全部在VBS里用HMIRuntime.Tags(变量名).Write来写。这样控制权完全在脚本手里逻辑更清晰。3.2 二次确认框的代码实现与参数说明确认框的核心代码就一行Dim ret ret MsgBox(确认启动1号泵启动后管道将加压。, vbYesNo vbQuestion, 操作确认 - 1号泵启动) If ret vbYes Then Exit Sub End If这里vbYesNo vbQuestion是按钮和图标组合vbQuestion会显示一个问号图标视觉上提示操作员需要做决定。标题里带上设备名方便操作员确认自己点的是哪个按钮。有个坑要注意MsgBox是模态对话框它会阻塞WinCC的画面刷新。如果确认框弹出来之后操作员一直不点画面上的其他数据就不会更新。对于实时性要求高的画面这个阻塞可能是问题。解决办法是用非模态的自定义弹窗但那需要额外做画面复杂度高很多。我的经验是确认框一般几秒内就会被点掉阻塞影响可以接受。如果确实不能阻塞那就得用画面窗口做确认层这个后面可以单独展开。还有一个细节MsgBox的返回值在VBS里是vbYes(6)和vbNo(7)但如果你用了vbOKCancel返回值就是vbOK(1)和vbCancel(2)。判断的时候一定要对应上否则逻辑会反。3.3 操作记录的写入逻辑与文件格式写记录用FileSystemObject核心代码如下Dim fso, logFile, logPath, logLine Dim operatorName, buttonName, result logPath D:\OperationLog\ operatorName HMIRuntime.Tags(CurrentUser).Read buttonName 1号泵启动按钮 result 确认通过 Set fso CreateObject(Scripting.FileSystemObject) If Not fso.FolderExists(logPath) Then fso.CreateFolder(logPath) End If logFile logPath Year(Now) Right(0 Month(Now), 2) Right(0 Day(Now), 2) .csv logLine Now , operatorName , buttonName , result If fso.FileExists(logFile) Then Dim ts Set ts fso.OpenTextFile(logFile, 8, True) ts.WriteLine logLine ts.Close Else Dim ts2 Set ts2 fso.CreateTextFile(logFile, True) ts2.WriteLine 时间,操作员,按钮,结果 ts2.WriteLine logLine ts2.Close End If这里有几个关键点。第一CurrentUser是WinCC的系统变量存的是当前登录的用户名如果没启用用户管理这个值可能是空的那就要用HMIRuntime.Tags(UserName).Read或者干脆写未登录。第二OpenTextFile的第二个参数8是ForAppending表示追加模式第三个参数True表示文件不存在时创建。第三CSV文件第一次创建时要写表头后面追加就不写了。文件名的日期格式用了Right(0 Month(Now), 2)这种写法是为了保证月份和日期都是两位数比如1月写成01这样文件名排序才正确。如果直接写Month(Now)1月和10月的文件名排序会乱。3.4 语音播报的SAPI调用与语速控制语音播报的代码也不复杂Dim voice Set voice CreateObject(SAPI.SpVoice) voice.Rate 0 voice.Volume 100 voice.Speak 1号泵已启动Rate是语速范围-10到100是正常速度。工业现场环境嘈杂建议设成-2到0之间慢一点更清楚。Volume是音量0到100一般设80到100。Speak方法是同步的会等语音播完才返回。如果你不希望阻塞脚本可以用Speak的第二个参数SVSFlagsAsync但那样语音会和后续操作重叠一般不建议。有个坑要特别注意SAPI.SpVoice对象在WinCC的VBS环境里创建时如果系统没有安装语音库会报错。Windows10默认有中文语音库但Windows7可能只有英文的。如果播报中文时听到的是英文发音或者没声音就要去系统设置里添加中文语音包。另外SAPI的语音是异步加载的第一次调用可能会有几百毫秒的延迟如果对实时性要求高可以在画面启动时先创建一个全局的voice对象后面复用。还有一点Speak方法播报的内容如果是动态拼接的要注意特殊字符。比如设备名里如果有引号会破坏字符串。建议在拼接前用Replace把引号替换掉。3.5 完整脚本的整合与执行顺序把上面几段拼起来完整的按钮脚本是这样的Sub OnClick(ByVal Item) Dim ret, fso, logFile, logPath, logLine Dim operatorName, buttonName, result, voice buttonName 1号泵启动按钮 ret MsgBox(确认启动1号泵启动后管道将加压。, vbYesNo vbQuestion, 操作确认) If ret vbYes Then result 取消操作 Call WriteLog(buttonName, result) Exit Sub End If result 确认通过 Call WriteLog(buttonName, result) Set voice CreateObject(SAPI.SpVoice) voice.Rate -1 voice.Volume 90 voice.Speak 1号泵已启动 HMIRuntime.Tags(Pump1_Start).Write 1 End Sub Sub WriteLog(btnName, res) Dim fso, logFile, logPath, logLine, operatorName logPath D:\OperationLog\ operatorName HMIRuntime.Tags(CurrentUser).Read If operatorName Then operatorName 未知用户 Set fso CreateObject(Scripting.FileSystemObject) If Not fso.FolderExists(logPath) Then fso.CreateFolder(logPath) logFile logPath Year(Now) Right(0 Month(Now), 2) Right(0 Day(Now), 2) .csv logLine Now , operatorName , btnName , res If fso.FileExists(logFile) Then Dim ts Set ts fso.OpenTextFile(logFile, 8, True) ts.WriteLine logLine ts.Close Else Dim ts2 Set ts2 fso.CreateTextFile(logFile, True) ts2.WriteLine 时间,操作员,按钮,结果 ts2.WriteLine logLine ts2.Close End If End Sub执行顺序是先弹确认框根据返回值决定是否继续然后写记录不管确认还是取消都写最后如果确认通过播语音并写变量。注意写变量放在最后因为写变量可能触发其他脚本或报警放在最后能保证记录已经落盘。4. 实操过程与关键环节实现4.1 环境准备与前置检查在开始写脚本之前有几项环境检查必须做。第一确认WinCC7.5SP1的VBS功能已启用。在WinCC项目管理器的计算机属性里找到启动选项卡确保全局脚本和画面脚本都勾选了。如果没勾脚本不会执行。第二确认系统有SAPI语音库。打开控制面板的语音识别或者直接在运行里输入powershell -Command Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).GetInstalledVoices() | Select VoiceInfo能看到中文语音库就行。如果没有去系统设置的时间和语言里添加中文语音包。第三确认日志目录有写权限。在工控机上D:\盘一般是数据盘权限比较宽松。如果只有C盘建议在C:\ProgramData\下建目录这个目录默认对所有用户可写。不要用C:\Program Files\那个目录需要管理员权限WinCC运行时可能没有。第四确认当前登录用户。如果WinCC启用了用户管理操作员登录后CurrentUser才有值。如果没启用这个变量是空的脚本里要处理空值情况否则记录里操作员字段就是空白。4.2 按钮控件的属性配置在画面里拖一个按钮控件右键属性几个关键属性要改。在常规选项卡里把按钮文本改成1号泵启动对象名称改成btnPump1Start方便后面识别。在事件选项卡里找到鼠标点击点右边的闪电图标选VBS动作把上面的代码粘进去。如果按钮需要显示状态比如启动后变绿可以在属性选项卡里绑定背景颜色到变量。但注意如果按钮的变量动作和VBS脚本同时存在可能会有冲突。我的做法是按钮只负责触发脚本状态显示用单独的指示灯控件这样职责清晰。还有一个细节按钮的安全性属性里可以设置权限等级只有特定用户才能点击。这个和VBS里的二次确认是互补的权限控制能不能点二次确认控制点了之后要不要再确认。两个一起用安全性更高。4.3 脚本调试与断点技巧WinCC的VBS调试不太方便没有断点功能。我的做法是在关键位置加MsgBox输出中间变量比如在写记录之前弹一个框显示logLine的内容确认格式正确后再把调试的MsgBox删掉。另一个技巧是用HMIRuntime.Trace输出到WinCC的诊断窗口。在脚本里写HMIRuntime.Trace logLine logLine vbCrLf然后在WinCC的工具菜单里打开诊断窗口就能看到输出。这个不会阻塞画面比MsgBox好用。如果脚本报错WinCC会在诊断窗口显示错误信息但信息比较简略。常见错误有对象不支持此属性通常是COM组件没注册和权限拒绝文件路径没写权限。遇到报错先看诊断窗口再去查对应的COM组件或路径。4.4 语音播报的实测效果与参数调优我在一台Win10工控机上实测SAPI的中文语音播报1号泵已启动大概需要1.5秒语速设为-1时约1.8秒。这个延迟在操作确认场景下可以接受因为操作员点完确认后本来就需要一点反应时间。音量方面工控机通常接的是小功率喇叭设90和100差别不大但设50就明显偏小。建议设80以上。如果现场噪音大可以考虑外接功放但那是硬件层面的事脚本里把音量拉满就行。语速方面-2到0之间比较合适。设成-5会慢得让人着急设成5会快得听不清。如果播报内容比较长比如1号泵已启动当前压力0.5兆帕建议语速设0否则信息量太大听不过来。还有一个实测发现SAPI对象第一次创建时会有约300毫秒的延迟后面复用就快了。如果按钮点击频繁可以在画面启动脚本里创建一个全局voice对象按钮脚本里直接用。但WinCC的VBS全局变量支持有限简单做法是在按钮脚本里创建接受那300毫秒延迟。4.5 操作记录的验证与查询方法脚本跑起来之后怎么验证记录写对了最简单的办法是点几次按钮然后去D:\OperationLog\目录看当天的CSV文件。用Excel打开检查四列是否都有值时间格式是否正确操作员是不是当前登录用户。如果发现记录没写进去先检查目录是否存在。脚本里虽然有CreateFolder但如果父目录D:\不存在比如只有C盘就会报错。这时候要改成C:\ProgramData\OperationLog\。如果记录写了但操作员是空的说明CurrentUser没读到值。可以在脚本里加一个判断如果为空就写未登录用户。更好的做法是检查WinCC的用户管理是否启用如果没启用考虑用Windows登录名代替通过CreateObject(WScript.Network).UserName获取。查询方面CSV文件可以用Excel的筛选功能按操作员或按钮名过滤。如果记录量大可以写一个VBS脚本定期把CSV导入数据库但那是另一个话题了。5. 常见问题与排查技巧实录5.1 确认框不弹出或弹出后画面卡死确认框不弹出最常见的原因是脚本没挂载到正确的事件上。检查按钮的鼠标点击事件里是否有VBS动作以及动作是否被禁用。另外如果按钮的安全性权限设了但当前用户没权限点击也不会触发脚本。弹出后画面卡死是因为MsgBox是模态的会阻塞WinCC的UI线程。如果操作员不点画面就一直不刷新。解决办法前面提过用非模态画面窗口代替MsgBox。如果暂时不想改可以在确认框上加一个超时自动关闭的逻辑但VBS的MsgBox不支持超时只能用WScript.Shell的Popup方法那个支持超时参数。Dim shell, ret Set shell CreateObject(WScript.Shell) ret shell.Popup(确认启动1号泵, 10, 操作确认, vbYesNo vbQuestion)这里的10是超时秒数超时后返回-1。判断的时候要处理-1的情况当作取消处理。5.2 语音播报没声音或报错没声音先检查系统音量是否静音再检查SAPI语音库是否安装。如果报错ActiveX部件不能创建对象说明SAPI没注册。在运行里执行regsvr32 sapi.dll可以重新注册但注意要用管理员权限。如果播报英文正常但中文没声音说明缺中文语音库。Win10在设置的时间和语言里可以添加中文语音包Win7需要单独安装。安装后在SAPI里用voice.GetVoices枚举选择中文的voice对象。还有一个坑如果WinCC项目是以服务方式运行的SAPI可能无法访问音频设备。这种情况要把WinCC改成以应用程序方式运行或者用音频文件播放代替SAPI。5.3 操作记录文件写入失败写入失败最常见的原因是权限不足。如果日志目录在C:\Program Files\下普通用户没有写权限。解决办法是换到C:\ProgramData\或D:\盘。另一个原因是文件被Excel占用如果操作员正用Excel打开当天的CSV文件脚本写入会失败。解决办法是写入前先检查文件是否被占用或者改用按小时分文件减少冲突概率。如果文件写入了但内容是乱码说明编码不对。CreateTextFile的第三个参数是True表示UnicodeFalse表示ASCII。中文内容要用Unicode否则会乱码。但Unicode的CSV用Excel打开可能显示不正常解决办法是用ADODB.Stream写UTF-8编码的文件那个Excel能正确识别。5.4 脚本执行速度慢或画面卡顿脚本执行慢通常是COM对象创建开销大。FileSystemObject和SAPI.SpVoice每次创建都要几百毫秒。如果按钮点击频繁可以考虑把日志写入改成异步的比如先写到一个内存队列后台脚本定期落盘。但那样复杂度高一般项目没必要。画面卡顿如果是因为MsgBox阻塞前面说了用Popup代替。如果是因为语音播报同步阻塞可以用异步播报voice.Speak 1号泵已启动, 1第二个参数1是SVSFlagsAsync表示异步播报脚本不等待语音结束就继续执行。但这样语音可能和后续操作重叠要权衡。5.5 常见问题速查表问题现象可能原因排查方法解决方案确认框不弹出脚本未挂载或权限不足检查事件挂载和用户权限重新挂载脚本调整权限画面卡死MsgBox模态阻塞观察是否只有确认框弹出时卡改用WScript.Shell.Popup带超时语音没声音语音库缺失或静音检查系统音量和语音库安装中文语音包取消静音记录写入失败目录无权限或文件被占用检查目录权限和文件占用换目录按小时分文件记录乱码编码不匹配用记事本打开看编码改用UTF-8编码写入脚本执行慢COM对象创建开销计时观察哪段慢复用对象或异步处理5.6 几个我踩过的坑和独家技巧第一个坑WinCC的VBS里不能用On Error Resume Next来忽略错误因为WinCC的脚本引擎对错误处理支持不完整。如果某行代码出错整个脚本会中断后面的代码不执行。解决办法是在关键操作前加判断比如写文件前先判断目录是否存在而不是靠错误处理。第二个坑HMIRuntime.Tags(CurrentUser).Read在用户未登录时返回的是空字符串不是Null。判断的时候要用If operatorName Then不能用IsNull。第三个技巧如果项目里有多个按钮需要同样的逻辑可以把公共代码写成一个Sub放在全局脚本里按钮脚本里调用。WinCC的全局脚本在全局脚本编辑器里VBS的全局函数可以被画面脚本调用。这样改一处就能影响所有按钮维护效率高很多。第四个技巧日志文件建议加一个操作结果字段除了确认通过和取消操作还可以加执行失败。如果写变量失败记录里要体现出来否则事后追溯时不知道操作到底成没成功。第五个技巧如果甲方要求操作记录不可篡改可以把CSV文件设成只读或者写入后立即计算一个校验值存到另一个文件。但工控机上的操作员通常也是管理员真要篡改拦不住所以这个需求一般用数据库的审计功能实现CSV方案只能做到有记录做不到防篡改。6. 方案扩展与后续优化方向这套方案跑通之后有几个方向可以继续优化。第一个是把日志从CSV换成SQLite数据库SQLite不需要安装服务单文件就能用查询比CSV方便得多。VBS可以通过ADODB.Connection连接SQLite但需要装SQLite的ODBC驱动。第二个是把语音播报从SAPI换成预录制的音频文件。用WScript.Shell的Run方法调用系统播放器或者用WMPlayer.OCX控件播放MP3。音质更好但只能播固定内容。如果播报内容需要动态拼接可以预录几个片段比如1号泵、2号泵、已启动、已停止然后按顺序播放这样既有音质又有灵活性。第三个是把二次确认从MsgBox换成自定义画面窗口。在WinCC里做一个确认画面包含操作描述、确认按钮、取消按钮用OpenPicture函数弹出。这样不阻塞主画面而且界面可以做得更美观还能加倒计时自动取消。第四个是把操作记录和WinCC的报警记录关联起来。操作记录写CSV的同时也触发一条WinCC的操作员消息这样在报警控件里也能看到操作历史。WinCC提供了MSRTGenerateMessage函数可以在VBS里调用。这些扩展方向每一个都可以单独写一篇但核心逻辑和这篇是一样的确认、记录、播报。把基础版本跑通后面加功能就是搭积木。我个人在实际项目中的体会是按钮操作记录这件事技术难度不高但细节特别多。权限、编码、路径、阻塞、语音库每一个都可能让方案翻车。最稳妥的做法是先在一个按钮上跑通全流程确认记录能写、语音能播、确认框能弹然后再复制到其他按钮。不要一上来就批量改否则出了问题很难定位是哪个环节的错。另外日志目录一定要提前和甲方确认有些工控机只有C盘有些有D盘但没格式化这些都要在部署前检查清楚。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。