J'ai un IHM HMIGTO6310 en communication Ethernet avec un automate de télégestion (sous linux embarqué propriétaire).
J'ai configuré l'IHM pour scruter les IO de l'automate à cadence moyenne.
J'ai créé des fenêtres popup standards, afin de limiter le développement de pages de paramétrage.
Néanmoins je rencontre un problème lorsque je souhaite modifier une valeur.
Régulièrement, je suis obligé de valider plusieurs fois ma saisie, avant que mon automate ne l'enregistre.
Tout ce passe comme si l'IO scanner écrasait l'information que je viens de modifier avant même de l'avoir envoyé.
Mon Popup fonctionne de la façon suivant :
- je positionne un index avant d'appeler mon popup.
- le premier est en scrutation périodique (300ms), afin de maintenir à jour les données du popup en fonction de la position de l'index.
- le second est déclenché par l'appuis sur les boutons du popup pour écrire les infos et les envoyer vers l'automate
- le troisième est déclenché par la modification des consignes numériques à envoyer vers l'automate.
Ci dessous un extrait des scriptes :
Scripte de maJ du Popup :
Code : Tout sélectionner
// Si une écriture vient d'avoir lieu, on zap ce tour
// après avoir reseté l'info
if ((ECRIRE_VANNE.getIntValue() == 1)||(ECRIRE_CONS_VANNE.getIntValue() == 1))
{
ECRIRE_VANNE.write(0);
ECRIRE_CONS_VANNE.write(0);
return;
}
// On Empèche la lecture si il y a une écriture en cours
// Interdit l'exécution des autres scripts
SCRIPT_EN_COURS.write(0);
// ON copie que les variables concernées par l'index
switch (INDEX_VANNES.getIntValue())
{
// VEAS F1
case 1 :
ETAT_VANNE.write(AT_VEAS_F1_DISPO.getIntValue()+E_VEAS_F1_O.getIntValue()*2+E_VEAS_F1_F.getIntValue()*4);
DEFAUT_VANNE.write(D_VEAS_F1_ETA.getIntValue());
CMUT_VANNE.write(B_VEAS_F1.getIntValue());
CONS_VANNE.write(0);
break;
...
// VED
case 9 :
ETAT_VANNE.write(AT_VED_DISPO.getIntValue()+E_VED_O.getIntValue()*2+E_VED_F.getIntValue()*4);
DEFAUT_VANNE.write(D_VED_ETA.getIntValue());
CMUT_VANNE.write(B_VED.getIntValue());
CONS_VANNE.write(R_VED_MANU.getFloatValue());
break;
...
}
// Réautorise l'exécution des autres scripts
SCRIPT_EN_COURS.write(1);Code : Tout sélectionner
//On ne gère que le front montant
if (ECRIRE_VANNE.getIntValue() == 0)
return;
// Interdit l'exécution des autres scripts
SCRIPT_EN_COURS.write(0);
switch (INDEX_VANNES.getIntValue())
{
// VEAS F1
case 1 :
B_VEAS_F1.write(CMUT_VANNE.getIntValue());
B_VEAS_F1.sendData();
break;
...
// VED
case 9 :
B_VED.write(CMUT_VANNE.getIntValue());
B_VED.sendData();
break;
...
}
// Ré autorise l'exécution des autres scripts
SCRIPT_EN_COURS.write(1);
Code : Tout sélectionner
// On ne gère que le front descendant
if (ECRIRE_CONS_VANNE.getIntValue() == 1)
return;
SCRIPT_EN_COURS.write(0);
switch (INDEX_VANNES.getIntValue())
{
...
// VED
case 9 :
R_VED_MANU.write(CONS_VANNE.getFloatValue());
R_VED_MANU.sendData();
break;
}
// Ré autorise l'exécution des autres scripts
SCRIPT_EN_COURS.write(1);- Je ne suis pas sur que l’inter-verrouillage (SCRIPT_EN_COURS) soit utile. (je n'ai qu'un IHM donc à moins que les scriptes puissent être interrompus et fonctionner en parallèle, je ni voie une utilité que si 2 IHM partagent les mêmes variables).
- de ce que j'ai pu lire dans l'aide, la méthode "sendData" n'a de sens que pour les variables de bloc. Etant donné que je n'ai pas de variables de bloc, les lignes "xxx.sendData();", ne font strictement rien (en tout cas, probablement pas ce que j'en attendais).
- j'ai repéré la méthode "isDataQualityGood", mais on ne peu pas dire que l'explication de l'aide soit limpide à son sujet. L'explication semble indiquer que cet information soit surtout liée à l'établissement de la connexion avec l'automate, et ne m'intéresse pas dans ce cadre; mais si elle pouvais m'indiquer qu'une modification est en cour et qu'elle n'a pas été encore prise en compte; ça changerait tout !

