Como implementar logon e logoff de usuários em WinCC V7 via C-Script

Para autenticar um usuário no SIMATIC WinCC V7 através de C-Script, utilize a API da biblioteca useadmin.dll (PWRT_api.h). A chamada para abrir a caixa de diálogo padrão de autenticação do sistema é realizada através da função PWRTLogin('c'), enquanto o logon direto sem exibição de caixa de diálogo utiliza a função PWRTSilentLogin(pLogin, pPassword). Para encerrar a sessão ativa do usuário no Runtime, chama-se a função PWRTLogout().

Sumário

Pré-requisitos

  • Software: SIMATIC WinCC V7.3 ou superior instalado no ambiente de desenvolvimento/execução.
  • Configuração de Usuários: Grupos de usuários, usuários e níveis de autorização pré-configurados no WinCC User Administrator.
  • Configuração do Projeto: Projeto WinCC criado com tela ativa e botões para associação dos scripts de ação de clique do mouse.

Método 1: Autenticação via caixa de diálogo padrão do sistema (PWRTLogin)

Se utiliza melhor quando: Deseja-se exibir a janela padrão do WinCC onde o operador insere manualmente o nome de usuário e a senha, sem manipular strings de credenciais no código.

Procedimento

  1. Abra a tela no WinCC Graphics Designer.
  2. Insira um botão na tela.
  3. Acesse as Propriedades do Objeto do botão, vá na aba Eventos -> Mouse -> Clique do mouse.
  4. Selecione a opção para criar um C-Script e insira o código abaixo:

C

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    #pragma code ("useadmin.dll")
    #include "PWRT_api.h"
    #pragma code()

    /* Abre a caixa de diálogo padrão do WinCC para logon de usuário */
    PWRTLogin('c');
}

Resultado esperado: Ao clicar no botão em modo Runtime, a janela pop-up padrão de logon do WinCC será exibida.

Verificação: Insira as credenciais de um usuário válido registrado no User Administrator e confirme o logon.

Limitação: Requer a interação manual do operador com a janela pop-up do sistema.

Método 2: Autenticação dinâmica por variáveis de tags (PWRTSilentLogin)

Se utiliza melhor quando: O nome de usuário e a senha são inseridos pelo operador em campos de E/S (IO Fields) na tela HMI e processados via script sem abrir pop-ups do sistema.

Procedimento

  1. No WinCC Tag Management, crie duas variáveis internas do tipo texto (8-bit character set): HMI_User_Name e HMI_User_Password.
  2. No Graphics Designer, insira dois campos de E/S (IO Fields) e conecte-os às variáveis HMI_User_Name e HMI_User_Password, respectivamente.
  3. Insira um botão de logon na tela.
  4. No evento de Clique do mouse do botão, insira o seguinte C-Script:

C

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    LPTSTR pLogin = NULL;
    LPTSTR pPassword = NULL;

    #pragma code ("useadmin.dll")
    #include "PWRT_api.h"
    #pragma code()

    /* Lê os valores atuais armazenados nas tags do WinCC */
    pLogin = GetTagChar("HMI_User_Name");
    pPassword = GetTagChar("HMI_User_Password");

    if (pLogin != NULL && pPassword != NULL) {
        /* Executa a autenticação sem exibir caixas de diálogo */
        PWRTSilentLogin(pLogin, pPassword);
    }
}

Resultado esperado: O WinCC processa as credenciais informadas nos campos de entrada sem abrir a interface de logon padrão.

Verificação: Verifique se o usuário ativo no sistema mudou para o nome informado na variável HMI_User_Name.

Limitação: A função PWRTSilentLogin realiza a validação de forma silenciosa e não retorna códigos de erro nativos em pop-up caso a senha ou usuário estejam incorretos.

Método 3: Autenticação com credenciais pré-definidas

Se utiliza melhor quando: É necessário autenticar um usuário específico com perfil pré-determinado através de um único clique (ex.: perfil de manutenção ou operador padrão).

Procedimento

  1. Insira um botão na tela do Graphics Designer.
  2. No evento de Clique do mouse do botão, associe o seguinte C-Script definindo o usuário e a senha diretamente no código:

C

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    LPTSTR pLogin = "John";
    LPTSTR pPassword = "111111";

    #pragma code ("useadmin.dll")
    #include "PWRT_api.h"
    #pragma code()

    /* Autentica diretamente o usuário com credenciais estáticas */
    PWRTSilentLogin(pLogin, pPassword);
}

Resultado esperado: O usuário "John" é logado no sistema imediatamente ao pressionar o botão.

Verificação: Confirme a alteração do usuário atual na barra de status da aplicação.

Limitação: Credenciais estáticas em código fonte exigem alteração no script caso a senha do usuário seja modificada no User Administrator.

Método 4: Encerrar sessão de usuário (PWRTLogout)

Se utiliza melhor quando: É necessário permitir que o operador encerre a sessão atual (logoff) de forma explícita.

Procedimento

  1. Insira um botão na tela e renomeie-o para "Logoff".
  2. No evento de Clique do mouse do botão, insira o seguinte C-Script:

C

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
    #pragma code ("useadmin.dll")
    #include "PWRT_api.h"
    #pragma code()

    /* Encerra a sessão do usuário ativo */
    PWRTLogout();
}

Resultado esperado: O usuário atual é desconectado e as permissões do sistema retornam ao nível padrão/deslogado.

Verificação: Verifique se a variável interna @CurrentUser foi limpa ou retornou ao estado vazio.

Comparação dos métodos de logon

MétodoSe utiliza melhor quandoO que revelaLimitação principalPWRTLoginAutenticação padrão de interfaceInterface de logon padrão do WinCC com mensagens de erro nativasRequer interação em janela pop-up suplementarPWRTSilentLogin (Dinâmico)Formulários de logon customizados na telaLeitura de credenciais digitadas em IO FieldsNão exibe caixa de diálogo nativa de erro caso a senha seja inválidaPWRTSilentLogin (Pré-definido)Acesso rápido para perfis específicosLogon direto com credenciais hardcodedNecessita atualização de código se a senha do usuário mudar

Verificação

O procedimento de autenticação e logoff é realizado com sucesso quando:

  • A tag interna do sistema @CurrentUser assume o nome exato do usuário autenticado após a chamada de PWRTLogin ou PWRTSilentLogin.
  • As ações de controle associadas aos níveis de autorização do usuário logado passam a ser liberadas no Runtime.
  • A tag @CurrentUser fica vazia (string de comprimento zero) imediatamente após a execução da função PWRTLogout().

Limitações e precauções operacionais

  • Segurança de Tags de Senha: Ao utilizar o método de autenticação por variáveis de tags, certifique-se de que a tag HMI_User_Password esteja configurada nos campos de E/S para ocultar os caracteres (propriedade de exibição de senha com asteriscos).
  • Limpeza de Memória/Tags: Ao efetuar o logon com PWRTSilentLogin, limpe o conteúdo armazenado nas tags HMI_User_Name e HMI_User_Password usando SetTagChar após a execução da função para evitar que credenciais fiquem expostas em memória.
  • Incompatibilidade de Parâmetro no PWRTLogin: O caractere 'c' passado na função PWRTLogin('c') instrui a API a centralizar a caixa de diálogo na tela. Alterar o argumento sem consultar a especificação da API PWRT_api.h pode causar falha de chamada.

Perguntas frequentes

Por que a função PWRTSilentLogin não exibe aviso quando a senha está errada?

A função PWRTSilentLogin foi projetada para executar a autenticação de forma transparente no backend. Caso as credenciais passadas estejam incorretas, a função simplesmente rejeita o logon e não altera a sessão atual, sem disparar janelas de aviso nativas do WinCC.

Como posso verificar via script se um usuário está logado atualmente?

Você pode consultar a tag interna do sistema @CurrentUser através da função GetTagChar("@CurrentUser"). Se o retorno for uma string válida e diferente de vazia, existe uma sessão ativa para aquele usuário.

Posso usar scripts VBS em vez de C-Script para realizar o logon de usuário?

Para chamadas diretas de APIs do sistema de administração de usuários como PWRTLogin e PWRTSilentLogin, a utilização de C-Script e a inclusão do arquivo de cabeçalho PWRT_api.h vinculado à DLL useadmin.dll constituem a abordagem nativa do WinCC V7.

O logon efetuado via C-Script expira automaticamente após um tempo de inatividade?

O tempo limite de logout por inatividade (Logout Time) é configurado individualmente para cada usuário ou grupo dentro do editor WinCC User Administrator, aplicando-se independentemente do método utilizado para autenticar o usuário.

Referências técnicas

  • Siemens Industry Online Support: SIMATIC WinCC V7.3 Manual - Working with WinCC (Doc ID: 102754925)
  • Siemens Industry Online Support: WinCC V7.3 Scripting: VBS, ANSI-C, VBA (Doc ID: 102777678)
  • Siemens Industry Online Support: Demo projects for SIMATIC WinCC V7.3 (Doc ID: 93148272)

Artigos relacionados

Tags relacionadas

Code: C163

6 respuestas