在很多大型或多页面的WinCC项目中,会制作专门的欢迎界面或登录界面。用户登陆后跳转至功能页面。而WinCC内置的登录窗口只能实现登录而非跳转,所以需要设置两个按钮,一个用于登录,一个用于跳转。如果单独绘制账号和密码框,自制一套登陆系统,又比较麻烦。因此需要借助C脚本实现功能。原理就是判断登录者的信息,若登录的用户名与设定的相符,就跳转至某界面。
已有方法
在网络上查找类似功能,可以找到多篇同名的《Wincc点击按钮弹出输入账号密码窗口,密码正确直接跳转到某个画面的实现方案》,不过这些转载的文章都没有留原始地址。经过搜索,来源应该是@来自金沙江的小鱼 发布自2017年的文章《Wincc V7.3 c脚本,点击按钮登录,密码正确直接跳转到某个画面》。
我也把这篇文章提到的方法贴在这里作为参考。
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
#pragma option(mbcs)
#pragma code("Kernel32.dll")
void Sleep(int Milliseconds);
#pragma code("UseAdmin")
#include "pwrt_api.h"
#define PIC_0 "NewPdl1.pdl"
char *username=GetTagChar("@CurrentUser");
DWORD hProcId;
HWND gWnd;
PWRTLogin(1);
Sleep(500);
gWnd =FindWindowA(NULL, "系统登录" );
while(gWnd)
gWnd =FindWindowA(NULL, "系统登录" );
if (strcmp(username,"user1")==0)
OpenPicture(PIC_0);
}
C该方法是建立一个登录按钮,点击后唤起WinCC的系统登录框,延时等待登录结果,若已登录的用户名与设定的一致,就跳转到主页面。
但实际测试时发现,该脚本若反复在登录并注销登录操作中循环时,每隔一次会出现不跳转的情况。该方法后续有一次优化,解决了已登录时无需再次登录直接跳转的问题,但上述问题仍未解决,仍有很大概率无法跳转。
(本文测试环境:Windows 11 专业版 23H2 + WinCC V8.0.0.0。原文采用WinCC V7.3,测试出现问题也可能是版本原因)
在此脚本基础上进行了多次尝试依然无法解决后,打算换个思路解决问题。
新方案
可以利用全局脚本进行循环检测,虽然会浪费一些资源,但效果显著。
全局设置
首先需要新建一个变量用于存储是否已跳转过的状态。打开变量管理,新建内部变量,名为”Login”,类型为二进制变量。打开全局C脚本编辑器,新建一个脚本。点击上方小闹钟新建一个250毫秒周期的触发器。
粘贴以下脚本。
#include "apdefap.h"
int gscAction( void )
{
#define PIC_0 "Main.pdl" //此处为跳转的页面
char *username=GetTagChar("@CurrentUser");
if (GetTagBit("Login")==0)
{
if (strcmp(username,"Admin")==0) //此处为登陆的用户名
{
SetTagBit("Login",1);
OpenPicture(PIC_0);
}
}
return 0;
}
C脚本逻辑是项目启动后每250毫秒检测一次,若未成功跳转过(Login==0),继续检测已登录用户名,若已登录的用户名与设定的相同,将Login设为1,防止脚本重复执行,然后跳转至指定页面。编译后保存,取名为Login.pas,存储至项目文件夹即可。
登录按钮
在欢迎界面新建一个按钮,按钮文本输入登录,作为登录按钮。为其添加鼠标点击事件。
输入以下脚本。
#include "apdefap.h"
void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)
{
#pragma code("UseAdmin.DLL")
#include "pwrt_api.h"
#pragma code ()
PWRTLogin(1);
}
C判断和跳转的功能全部交给全局脚本,此脚本的功能为打开登录框。登陆成功后静待250毫秒内全局脚本执行,即可完成跳转。
注销登录
在主页面,或绘制的工具栏画面中设置一个注销按钮,可用于上位机控制系统的临时锁定。新建一个按钮,按钮文本输入注销登录,作为注销按钮。为其添加鼠标点击事件。
输入以下脚本。
#include "apdefap.h"
void OnLButtonUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)
{
#pragma code("UseAdmin.DLL")
#include "pwrt_api.h"
#pragma code ()
PWRTLogout();
SetTagBit("Login",0);
OpenPicture("Login.Pdl");
}
C脚本功能为,注销用户登录。将Login变量重新设为0,让全局脚本开始判断登陆情况。最后将页面切回欢迎界面(登录界面)。
尝试反复登录并注销,脚本功能正常。