Comment pouvons-nous aider ?
Utilisateurs, groupes d’utilisateurs et journal des logs des utilisateurs
Ce que vous allez réaliser

Le projet terminé comprend deux groupes, quatre utilisateurs, des contrôles protégés par groupe, une zone de connexion et un journal des opérations qui indique qui a modifié quoi.
| Groupe | Utilisateurs | Autorisés à (exemple) |
|---|---|---|
| Operators | Operator1, Operator2 | Piloter la machine : marche et arrêt, consignes, sélection de recette |
| Maintenance | Tech1, Tech2 | Tout ce que les Operators peuvent faire, plus les écrans de réglages, l’export du journal et l’effacement du journal |
Les noms et les droits sont des exemples ; remplacez-les par les vôtres. Attribuez à chaque utilisateur un mot de passe unique et ne conservez aucun mot de passe par défaut.
Avant de commencer
Utilisez User Permission pour tout ce tutoriel ; c’est la gestion des utilisateurs actuelle de CommandHMI
|
![]() |
Créer les deux groupes
Créez d’abord les groupes, afin qu’ils existent lorsque vous ajouterez les utilisateurs.
- Dans le Project Manager, ouvrez Setting et double-cliquez sur User Permission.
- Utilisez Add user group et saisissez le nom
Operators - Répétez l’opération pour
Maintenance - Laissez en place les utilisateurs et groupes par défaut. Le logiciel ne permet pas de les supprimer.
Choisissez des noms de groupe courts : l’IHM affiche le groupe courant via LW63200, qui contient 32 caractères.
Créer les 4 utilisateurs
Ajoutez chaque utilisateur dans la même boîte de dialogue et affectez-le à un seul et unique groupe.
|
![]() |
Restreindre les contrôles par groupe
L’accès se définit pour chaque contrôle (Bit switch, Word switch,..). L’onglet Advanced détermine qui peut l’actionner, l’onglet Visibility détermine qui peut le voir.
|
![]() |
Seuls les contrôles de saisie disposent de cette option : bit button, word button, screen button, function button, multi-function button, multi-state button, numeric input, ASCII input, combo box, radio button, stepping button, slider et recipe selector. Les contrôles d’affichage ne peuvent être masqués que via l’onglet Visibility.
Connexion, déconnexion et affichage de l’utilisateur courant
- Bouton de connexion : voir « Function Button » Log on
- Bouton de déconnexion : voir « Function Button » Cancel user login
- Affichage de l’utilisateur connecté
- Nom de l’utilisateur courant, ASCII Display, Monitor address LW60838, Total 32
- Nom du groupe courant, ASCII Display, Monitor address LW63200, Total 32
Placez ces quatre contrôles dans un en-tête visible sur chaque écran ; un écran public convient bien pour cela.
Pour déconnecter l’utilisateur depuis un script ou depuis l’automate, mettez LB60133 à 1. Le bit se remet automatiquement à zéro une fois la déconnexion effectuée.
Configurer le journal des opérations avec le journal d’historique
Nous allons utiliser :
- LW1000~1015 : nom d’utilisateur à écrire dans le journal (32 caractères ASCII, champ libre, à adapter)
- LW39900~39915 : copie du nom d’utilisateur précédent (champ libre, à adapter)
- LW60838~60853 : nom de l’utilisateur connecté (32 caractères ASCII, lecture seule)
- LB1000 : déclencheur d’enregistrement des événements
|
![]() |
Le script qui surveille les changements d’utilisateur et les déconnexions
#include "MacroInit.h"
//#include "subFun1.c" //Example
#define USER_NAME_ADDR 60838 // LW60838~60853 : user name of the logged-in user (32 ASCII characters, read-only)
#define PREV_NAME_ADDR 39900 // copy of the previous user name (free-form field, to be adapted)
#define LOG_TEXT_ADDR 1000 // LW1000~1015 : user name to bewrite in log (32 ASCII characters, free-form field, to be adapted)
#define USER_NAME_WORDS 16 // 32 char = 16 words
void Macro_main(IN *p)
{
MarcoInit
int i;
int changed = 0;
char logoutText[] = "User logout";
// Check if logged user changed
for (i = 0; i < USER_NAME_WORDS; i++) { if (LocalWord[USER_NAME_ADDR + i] != LocalWord[PREV_NAME_ADDR + i]) { changed = 1; LocalWord[PREV_NAME_ADDR + i] = LocalWord[USER_NAME_ADDR + i]; } } if (changed) { if (LocalWord[USER_NAME_ADDR] == 0) { // Logout : empty name -> fixed text
for (i = 0; i < USER_NAME_WORDS; i++)
{
LocalWord[LOG_TEXT_ADDR + i] = 0;
}
for (i = 0; logoutText[i] != 0; i++)
{
LocalWord[LOG_TEXT_ADDR + i / 2] |= (unsigned short)logoutText[i] << (8 * (i % 2));
}
}
else
{
// Login : copy of the user’s name
for (i = 0; i < USER_NAME_WORDS; i++)
{
LocalWord[LOG_TEXT_ADDR + i] = LocalWord[USER_NAME_ADDR + i];
}
}
// Trigger for recording events
LocalBit[1000] = 1;
}
}
Collez-le dans un nouveau script (New script) du Script Editor, compilez-le, puis appelez-le toutes les 500 ms.

et ajoutez le contrôle Historical data display

Pour obtenir ceci :

Pour tester, vous pouvez ajouter des boutons de changement d’utilisateur et de déconnexion avec des bit buttons

Vous pouvez télécharger le projet ici



