Siemens Unified - Zone de liste

Partie du forum pour tout ce qui concerne les interfaces homme machine ou IHM. Forum, conseil, astuce et entraide sur les interface homme machine ou IHM tels que les magelis, KEP, proface, XBT, .
Répondre
Avatar du membre
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2283
Enregistré le : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Siemens Unified - Zone de liste

Message par JC87 »

Hello,

Comme je le disais récemment je suis sur une conversion S5 vers TIA mais j'ai aussi un pupitre Unified à faire pour remplacer une vieille appli sur pc tactile.

Comme je le pressentais ça ne sa passe pas tout seul et y'a plein de trucs que j'arrive pas à faire :roll:

Entre autres j'aimerai utiliser l’élément "zone de liste". Je voudrai simplement récupérer le numéro du texte sélectionné dans la liste sous forme d'entier dans une variable automate. C'est juste pour sélectionner un numéro de référence de travail.

Sauf que ça sort le résultat en binaire dans la dite variable. En fait il faut déterminer le rang du bit à 1 dans mot. Est ce qu'il y a moyen de faire ça dans l'IHM par script ? Merci pour vos lumières.

JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7826
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Siemens Unified - Zone de liste

Message par itasoft »

slts,
Disons que la formule qui donne le rang du bit dans un mot est:
Rang=Log(mot) / Log(2)
reste à savoir si on peut l'écrire dans le script ?

ou avec une boucle dans l'automate
Exemple :
%MW0=n° du bit à 1 dans %MW1
%MW0=-1 si aucun bit à 1 dans %MW1


%MW0:=-1;
WHILE %MW1<>0 DO
%MW0:=%MW0+1;
%MW1:=%MW1 / 2;
END_WHILE;
Automaticien privé (de tout)
itasoft@free.fr
Avatar du membre
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2283
Enregistré le : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Re: Siemens Unified - Zone de liste

Message par JC87 »

Salut Itasoft,

C'est ce que j'ai fait dans l'automate. Dans l'IHM c'est du java et pour moi c'est plus une danse qu'autre chose :mrgreen:
En plus on peut foutre des scripts absolument partout dans ces nouveaux écrans, c'est tellement puissant qu'on (disons que je) comprend vraiment pas tout. Bientôt faudra un bac+15 en informatique pour coder un pauvre IHM...

JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7826
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Siemens Unified - Zone de liste

Message par itasoft »

Moi aussi je fais dans le bestial dans l'automte
Automaticien privé (de tout)
itasoft@free.fr
yome
Asservi son premier moteur
Asservi son premier moteur
Messages : 25
Enregistré le : 29 mai 2017, 17:02

Re: Siemens Unified - Zone de liste

Message par yome »

En demandant à l'IA:


Oui, ce que tu observes est normal avec les zones de liste (List box) dans WinCC Unified : elles renvoient une valeur codée en bit unique (one-hot) dans un mot (WORD/DWORD), pas directement un index entier.
👉 Concrètement :
• Élément 0 → bit 0 à 1 → 0000 0001 = 1
• Élément 1 → bit 1 à 1 → 0000 0010 = 2
• Élément 2 → bit 2 à 1 → 0000 0100 = 4
• etc.
Donc oui, il faut retrouver la position du bit à 1 pour obtenir ton index.
________________________________________
✅ Solutions possibles
🔵 1. Le plus simple : ne PAS utiliser une zone de liste
Si ton besoin est juste un numéro de référence, préfère :
• un Drop-down list
• ou un Champ d'E/S avec liste de texte
👉 Ceux-là peuvent directement écrire un entier dans une variable (pas un masque binaire).
➡️ C’est clairement la solution la plus propre si tu peux changer de contrôle.
________________________________________
🟡 2. Traitement côté IHM avec script (JavaScript Unified)
Oui, tu peux faire ça dans l’IHM 👍
WinCC Unified supporte JavaScript.
Exemple de script
// Lecture du mot venant de la zone de liste
let word = Tags("MaVariableListe").Read();

// Fonction pour trouver l’index du bit à 1
function getBitIndex(value) {
for (let i = 0; i < 32; i++) {
if (value & (1 << i)) {
return i;
}
}
return -1; // aucun bit trouvé
}

// Calcul
let index = getBitIndex(word);

// Écriture dans la variable automate (INT)
Tags("IndexSelection").Write(index);
Où mettre ce script ?
• événement "Value changed" de la variable liée à la liste
ou
• événement "Selection changed" du contrôle (selon version)
________________________________________
🟠 3. Traitement côté automate (souvent recommandé)
Vu que tu fais une conversion S5 → TIA, il est souvent plus robuste de gérer ça dans le PLC.
Exemple en SCL (TIA)
VAR_INPUT
ListWord : WORD;
END_VAR

VAR_OUTPUT
Index : INT;
END_VAR

VAR
i : INT;
END_VAR

Index := -1;

FOR i := 0 TO 15 DO
IF (ListWord AND SHL(1, i)) <> 0 THEN
Index := i;
END_IF;
END_FOR;
👉 Avantages :
• Pas de logique métier dans l’IHM
• Plus maintenable
• Testable côté automate
________________________________________
🔴 4. Attention aux limites
• Si plusieurs bits peuvent être à 1 → ton index devient ambigu
• Normalement une zone de liste doit être en sélection simple, donc un seul bit actif
________________________________________
✅ Recommandation
👉 Dans ton cas (sélection de référence de travail) :
✔ Meilleur choix :
utiliser un Drop-down list avec une valeur numérique associée
✔ Sinon :
faire la conversion dans le PLC (plus propre industriellement)
✔ Dernier recours :
script JS comme ci dessus
________________________________________
💡 Petit tip Unified
Dans les listes, tu peux associer :
• un texte affiché
• une valeur numérique distincte
👉 Ça évite complètement ce problème 😉
________________________________________
Si tu veux, je peux te montrer comment configurer une liste déroulante avec index direct dans Unified 👌
Avatar du membre
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2283
Enregistré le : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Re: Siemens Unified - Zone de liste

Message par JC87 »

Merci pour cette réponse très complète. Bon hier soir j'en ai eu marre de chercher et dans l'automate j'ai écrit en SCL :

"DB_IHM_Unified".No_Ref_Int:= REAL_TO_INT(LN(DINT_TO_REAL("DB_IHM_Unified".No_Ref_bin)) / LN(2.0));

et j'ai mon numéro.

Cela dit je ne suis effectivement pas parti sur la bonne option. J'ai vu cet objet que je ne connaissais et j'ai foncé bille en tête :D

Vu que tu a l'air de maitriser la bête, saurai tu me dire comment récupérer le numéro de la vue active ? J'ai vu un exemple sur le site de Siemens avec un script mais je ne comprend pas du tout ou mettre le dit script ?

JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Avatar du membre
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 2283
Enregistré le : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Re: Siemens Unified - Zone de liste

Message par JC87 »

Je me répond à moi même car j'ai gratté un peu et j'ai fini par comprendre qu'il fallait appeler le script dans l’événement "chargée" de la vue en cliquant dans la vue et non pas en faisant un clic droit sur le nom de la vue car la on n'a pas accès aux événements de la page.

Y'a peut être moyen (surement même) de faire autrement mais bon ça marche...

Allez on plie, ça suffira pour aujourd'hui :mrgreen: bon ouiken à tous.
JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Répondre