实现WinCC登录成功自动跳转页面


在很多大型或多页面的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,让全局脚本开始判断登陆情况。最后将页面切回欢迎界面(登录界面)。

尝试反复登录并注销,脚本功能正常。

Powered by WordPress. Theme by Alx.