尧图精选

西门子WinCC自定义登录框:下拉列表选人+VBS脚本实现

🕒 发布时间:2026/9/6 16:27:03 📁 来源:尧图网络
简介针对TIA博途WINCC环境下的自定义登录对话框设计需求这份教程以下拉列表选择用户名作为登录方式面向需要摆脱固定默认登录界面、实现个性化用户管理的自动化工程师。文档按步骤展开从新建“自定义登录”对话框、添加组合框与文本框控件到配置用户名条目、关联全局字符串变量、编写登录校验脚本再覆盖设置默认启动画面、编译与模拟测试等完整流程。尤其对运行时通过用户视图新增、删除或修改用户后下拉列表条目无法自动更新的易错点给出了通过监听事件同步列表内容的处理思路。资源为单个docx文档共1.19MB便于离线查阅。目前已有1500余人学习适合正在调试WinCC项目登录权限、希望提升登录交互体验的技术人员参考。整份内容可作为操作指南在TIA博途项目开发中直接对照使用尤其适合自动化现场调试与控制系统集成场景。 做了这么多年西门子HMI项目我算是被“默认登录框”折腾过不少回。前年做一条电池产线的上位机甲方电气主管在出厂验收前突然提了个需求把WinCC的登录界面改掉不要那个用户名输入框加密码框的默认样式改成点开下拉列表、从里面选人的方式。理由很实在——车间里操作工戴着手套在触摸屏上敲用户名特别费劲要么拼错字母要么半天打不出一个字符还容易把键盘弹出来挡掉画面。说白了就是要把“输用户名”这个动作变成“选用户名”。这个需求其实在TIA博途的WinCC环境里完全能做而且不用引入第三方控件纯靠WinCC Professional自带的画面对象和VBS脚本就能实现。这篇文章我就把整套做法、背后的机制以及我踩过的坑完整写一遍。1. 默认登录框的痛点与下拉列表方案的适用场景1.1 现场为什么普遍嫌弃系统自带的登录对话框WinCC运行系统自带的登录对话框逻辑本身没问题功能也完整但它有几个在现场很难受的地方。第一个是交互效率低。默认对话框是一个用户名文本框加一个密码框操作工必须调出虚拟键盘一个字符一个字符地敲。很多屏的虚拟键盘很小按键间距不够戴手套误触率特别高。第二个是容易输错。用户名是区分大小写的哪怕大小写错一个字母登录就失败操作工根本分不清自己到底错在哪只能一遍遍重输。第三个问题更隐蔽默认对话框的弹出时机和位置不好控制。有些项目希望在画面打开时就自动弹出登录框有些希望点击某个功能模块时才弹还有些希望登录框嵌入到主页面的固定区域里。默认对话框在这些场景下都显得很“笨”它就是一个独立的模态窗口想改样式、想加上“今日班次”“设备编号”这些附加信息基本没戏。第四个问题是反馈信息不友好。密码错了弹出的提示是系统英文或德文错误信息现场工人看不懂每次都要叫工程师过去处理。换成自定义登录框之后这些提示文案都可以自己定义中文、口语化都行。所以“自定义登录对话框”这个需求本质上不是炫技而是把系统身份认证这层交互改造成贴合现场操作习惯的形态。1.2 下拉列表方案适合哪些类型的项目下拉列表选人这种方式不是所有项目都适合。我做了几个项目之后总结下来它的适用边界大概是这样的。最适合的是用户数量少且相对固定的系统一般十个以内。比如一条产线就四类角色操作员、线长、技术员、工程师每类一到两个账号下拉列表一目了然根本不需要滚动查找。其次是触摸屏为主的操作站减少键盘调用的优势非常明显。第个适用场景是画面风格需要统一的系统自定义登录框可以做到跟整个HMI画面风格完全一致而不是突兀地弹出一个系统默认窗口。不太适合的场景也有用户数量特别多、超过几十个的情况下拉列表滚动起来反而麻烦账号变化频繁、经常有临时账号进出的系统需要额外考虑列表刷新机制以及高安全等级的场景光靠密码验证不够需要刷卡或扫码的话下拉列表只是辅助还得叠加外部设备逻辑。另外要注意下拉列表方式只是把“选人”这一步优化了密码这一步还是得输入的。所以密码天然不能空否则登录机制等于摆设。2. 动手前先理清机制用户管理、系统变量与可用脚本路径2.1 用户管理和权限等级是整个方案的底座很多人一上来就找控件怎么摆、脚本怎么写结果做着做着发现下拉列表里的用户名到底从哪来、登录之后系统怎么判断这个人有没有权限完全没有概念。实际上自定义登录框只是换了个“外观”背后的身份认证和权限判断依然是WinCC自带的用户管理体系在起作用。在TIA博途的WinCC Professional项目中用户管理在项目树里可以找到往里添加用户、设置密码、分配角色。角色的本质是权限等级等级往下兼容。比如工程师角色的权限等级是8操作员等级是2那么在按钮上如果设置了需要等级5才能操作操作员登录后这个按钮就是灰色不可用的工程师登录后就可以用。这个权限机制是系统级的自定义登录框千万不要绕过它否则按钮的安全控制就失效了。登录之后当前登录的用户名会写进系统内部变量CurrentUser未登录的时候它是一个空字符串。整个自定义登录框的“登录状态判断”核心就是围绕这个变量展开。2.2 必须理解的几个系统变量与对象模型做这个方案之前先记几个关键的运行系统对象。脚本里要访问画面上的控件统一用ScreenItems(控件名)。要在脚本里读取或写入系统变量一般用HMIRuntime.Tags(变量名).Read或.Write。需要拿到当前登录用户就是HMIRuntime.Tags(CurrentUser).Read。要调用登录、注销操作就是HMIRuntime.Logon和HMIRuntime.Logoff。用户列表则通过HMIRuntime.Users这个对象集合获取。它包含运行系统中所有已经组态好的用户遍历这个集合就能拿到每个用户的用户名然后塞进下拉列表里。这就是整套机制的全部核心了。别看功能需求听起来花哨底层真正打交道的就这么几个东西。2.3 方案选型对比VBS动态填充 vs 静态列表 vs 控件直连实现了下拉列表选人目前我知道的主流做法有三种我直接对比一下。实现方式具体做法优点缺点VBS动态填充画面加载时用脚本遍历HMIRuntime.Users把用户名逐条加入下拉列表用户增删后自动同步不用改画面脚本写法与版本有一定关系需要实测集合索引静态列表在画面组态时手动把用户名一条条输入下拉列表简单直接零脚本用户变动必须改画面重新下载密码验证逻辑还得自己写基本不推荐第三方用户控件直连个别版本有用户管理控件直接绑定用户集合集成度高不是所有WinCC版本都提供界面定制灵活度受限实测下来最稳的就是VBS动态填充。用西门子自带的VBS脚本引擎不依赖额外组件工期可控。3. 核心实现一将系统用户动态装载到下拉列表3.1 画面组态的最小准备清单先把画面元素摆好。新建一个画面命名为LoginScreen之类的然后往上面拖几个对象一个“下拉列表”控件我习惯命名为cmbUser这个就是用户选择框。一个“单行文本框”控件命名为txtPwd在属性里把Password属性设为True这样输入的密码会显示为星号。两个“按钮”控件分别命名为btnLogin和btnLogout文本分别写“登录”和“注销”。两个“文本”控件一个命名lblState用来显示提示信息另一个命名lblCurrentUser用来显示当前登录用户。这些命名不是必须的但建议别用默认的Control1、Control2这种名字后面脚本多了名字有意义能省很多事。3.2 遍历用户集合的VBS脚本与执行位置下拉列表的数据填充我通常放在画面的“加载”事件里也就是画面打开的时候自动执行。脚本这么写Dim objUsers Dim iCount, i 清空下拉列表防止重复加载 ScreenItems(cmbUser).Clear() 获取用户集合 Set objUsers HMIRuntime.Users iCount objUsers.Count If iCount 0 Then For i 1 To iCount ScreenItems(cmbUser).AddItem objUsers(i).Name Next 默认选中第一个用户 ScreenItems(cmbUser).Text objUsers(1).Name End If这里有一个特别容易坑人的细节不同WinCC版本中Users集合的索引起点不一样有时候从1开始有时候从0开始。如果你的脚本运行时报“下标越界”不用想别的把For i 1 To iCount改成For i 0 To iCount - 1再试一次。这个坑我在V15和V16上各踩过一次完全相同的逻辑索引起点就是不一样。3.3 列表刷新时机与多用户变更场景画面打开时执行填充脚本大部分情况是OK的但有一种情况会翻车如果项目刚启动、用户管理还没有完全加载完毕这时候脚本执行Count可能是0下拉列表就是空的。这个问题在项目大的时候尤其容易出现因为画面加载速度和后台服务初始化存在先后顺序。解决办法有三个我按推荐程度排序。第一在“加载”事件里先判断用户数量如果为0就设置一个单次定时器过1秒再执行填充。第二做一个“刷新用户”按钮手动重新执行一次填充脚本。运行期间管理员在系统用户管理里新建了账号下拉列表是感知不到的按一下刷新就能同步。第三用周期触发比如每30秒更新一次列表这种纯粹是为了省事实际项目中如果用户列表相对固定没这个必要。我自己的习惯是画面上放一个很小的“刷新用户”按钮放在登录框角落必要时点一下。这个设计在现场还挺实用尤其是那些经常要加临时账号的项目。4. 核心实现二登录、状态反馈与注销的完整闭环4.1 登录按钮的脚本设计与失败判断下拉列表选好人密码框输入密码接下来就是点“登录”按钮。按钮的“鼠标按下”事件里脚本这么写Dim sUserName, sPassword sUserName ScreenItems(cmbUser).Text sPassword ScreenItems(txtPwd).Text If Len(Trim(sUserName)) 0 Then ScreenItems(lblState).Text 请先选择用户 Exit Sub End If If Len(sPassword) 0 Then ScreenItems(lblState).Text 请输入密码 Exit Sub End If 调用系统登录接口密码以参数形式传入不做任何日志记录 HMIRuntime.Logon sUserName, sPassword这里重点说一下失败判断。我早期做的时候想着调用完HMIRuntime.Logon之后马上读CurrentUser看是不是变成了选中的用户名。实测发现这并不可靠原因有两个一是登录验证是异步完成的立刻读很可能还是旧值二是如果当前已经有一个用户登录着再以相同用户登录CurrentUser的返回值表达上会让你产生误判。我的工程做法是登录按钮里不做结果判断而是把这次尝试登录的用户名存到一个脚本全局变量里同时启动一个周期定时器。定时器里读取CurrentUser与目标用户名做比对一致就判定成功连续几次比对不一致就判定失败并提示“用户名或密码错误”。大概逻辑是这样的 全局变量在画面脚本顶部声明 Dim g_loginAttemptUser Dim g_loginAttemptCount 定时器周期脚本周期1秒执行一次 Dim sCurrentUser sCurrentUser HMIRuntime.Tags(CurrentUser).Read If g_loginAttemptUser Then If sCurrentUser g_loginAttemptUser Then ScreenItems(lblState).Text 登录成功 sCurrentUser ScreenItems(lblCurrentUser).Text sCurrentUser g_loginAttemptUser g_loginAttemptCount 0 Else g_loginAttemptCount g_loginAttemptCount 1 If g_loginAttemptCount 3 Then ScreenItems(lblState).Text 登录失败请检查密码 g_loginAttemptUser g_loginAttemptCount 0 End If End If End If用定时器方案虽然比单次脚本多绕一步但它在各种边界情况下都稳。现场不会因为你一句“这功能我本地测过没问题”就放过你高压环境下的可靠性最重要。4.2 当前用户显示与操作权限接管登录成功之后画面上至少要有一个区域能显示“当前登录用户是谁”。直接让lblCurrentUser文本显示用户名就行。页面加载的时候也要从CurrentUser读一次值把上次关机前的用户状态还原出来这样操作工一开屏就知道现在是谁的账号挂在上面。权限接管这块务必注意自定义登录框只负责登录动作登录之后系统判断按钮权限还是得靠WinCC原本的权限体系。具体操作是选中画面里需要限制操作的按钮在属性里找到权限设置项选择对应的权限等级。比如“工程师参数修改”按钮权限设为工程师等级操作员就算登录成功这个按钮也是灰的。这套机制我已经在多个项目里验证过非常可靠。4.3 注销按钮与登录超时处理注销脚本很简单按钮事件里写HMIRuntime.Logoff ScreenItems(lblState).Text 已注销 ScreenItems(lblCurrentUser).Text 未登录注销之后别忘了清空密码框避免下一个人直接点到“登录”就用了上一个账号的密码。这个细节我一开始也漏了直到有一次现场操作工点了一下登录键结果用别人的权限进去改了参数虽然没造成事故但被批了一顿。超时自动注销的需求很多项目都有。WinCC Professional自带自动注销功能在运行系统设置里可以配置无操作多少分钟自动注销这个功能直接启用就行不用自己在脚本里写计时器省心。5. 实测中容易踩的坑和定位思路5.1 脚本不执行、列表空白等高频问题把做过的几个项目里遇到的典型问题整理成了表格对照排查基本都能解决。现象可能原因解决办法下拉列表空白脚本执行时用户集合还没加载完成在加载事件里增加用户数量判断用定时器延迟重新填充或提供刷新按钮脚本没反应但也没有报错事件放错位置或者项目脚本使能未打开确认脚本放在“鼠标按下”而不是别的鼠标事件打开运行系统脚本调试密码框显示明文Password属性没有设为True选中文本框在属性面板里找到Password改为True集合索引报错当前版本用户集合索引从0开始循环起点换成0或按版本实测后固定写法登录后按钮还是不可操作按钮权限等级高于当前用户权限检查按钮权限设置和用户分配的角色是否匹配5.2 用诊断输出与临时控件锁定现场问题在项目现场排查脚本问题我习惯分两步走。第一步用HMIRuntime.Trace输出调试信息。在脚本关键节点加一行HMIRuntime.Trace 当前选择用户 ScreenItems(cmbUser).Text然后在WinCC诊断视图里看输出日志。这种方法能很快确认脚本到底有没有执行、执行到了哪一步。第二步放一个临时文本控件专门用来显示关键变量的实时值。比如临时把CurrentUser的值显示在画面上登录前看一眼点击登录后再看一眼立刻就能看出Logon调用后系统状态有没有变化。排查完再把这个临时控件删掉。我自己的经验是只要是画面脚本类问题90%都能靠这两招定位。别一上来就怀疑软件坏了、授权有问题大部分情况都是脚本逻辑问题。6. 延伸WinCC Unified环境下的差异与选型建议如果你用的是新一代WinCC Unified平台那上面这套VBS方案就不能直接搬了。Unified基于HTML5和JavaScript脚本语言变成了JavaScript用户管理也是一套全新的API画面组态的交互方式也Web化了。在Unified里登录功能可以调用现成的登录控件也可以自己写JavaScript逻辑搭配HTML原生下拉列表实现思路和Professional是一模一样的下拉列表加载用户、密码框校验、调用登录API、用当前用户变量刷新UI。但Unified的JavaScript API和Professional的VBS对象模型差异很大不要想着把本文的脚本做一次“翻译”就能跑。如果是老项目迁移建议继续用Professional维护如果是全新项目又有Web访问需求Unified值得考虑。最后分享一个我在几次项目里沉淀下来的习惯自定义登录框这种功能看着不起眼但它是整个HMI安全体系的入口。动手写脚本之前一定先把用户角色、权限等级、账号规划这几件事定了再谈界面怎么摆、脚本怎么写。顺序反了后面全都要返工。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →