[Unity v12] DFB : variable 'public' en lecture seule : possible ?

Forum traitant des automates industriels de marque Schneider - Telemecanique
Répondre
Laurent
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 105
Enregistré le : 20 oct. 2015, 11:16
Localisation : Oise et Ile-de-France / France

[Unity v12] DFB : variable 'public' en lecture seule : possible ?

Message par Laurent »

Bonjour,

je développe un DFB sous Unity v12.
Ce bloc-fonction doit gérer une info (apparition, acquittement, effacement défaut, ...), celle-ci peut être de nature différente selon l'instance de DFB.
En paramètres d'entrée, on doit fournir :
- l'info (booléenne),
- la nature de cette information (INFO simple, ALARME, DEFAUT, ALARME SILENCIEUSE, c'est tout pour le moment)

En vue de l'évolution du code de ce DFB, je cherche à cadrer les valeurs codant la nature de l'info.
Aujourd'hui, 4 valeurs possibles, codées sur un INT :
1 : INFO
2 : ALARME
3 : DEFAUT
21 : ALARME SILENCIEUSE

L'éxécution de toutes les instances de ce DFB ne pose pas de souci, par exemple en langage ST :

Code : Tout sélectionner

(* une instance de test du DFB *)
mon_test(
  info := mon_info_test,
  nature_info := 2,
  voyant_info => mon_voyant_test );
Dans le code ci-dessus, la valeur 2 passée sur le paramètre d'entrée "nature_info" indique que l'information doit être traitée en tant qu'ALARME.

Deux petits problèmes, de mon point de vue :
- la valeur immédiate "2" n'a de sens que si on connait le contenu du DFB, notamment la gestion du paramètre "nature_info", ce qui rend l'appel du DFB peu compréhensible,
- si, dans le furur, l'ensemble des valeurs doit changer (pour être compatible avec d'autres paramètres utilisés ailleurs, par exemple), le changement devra se faire dans le code du DFB (logique !), et dans les appels de _TOUTES_ les instances de ce DFB, avec correction de la valeur imédiate sur l'entrée "nature_info", ce qui ne me paraît pas très maintenable.

La solution que j'envisage : embarquer la définition des valeurs codant les différentes natures d'info _dans_ le DFB.
Pour cela, dans les variables 'public' du DFB, je définis les variables suivantes :

Code : Tout sélectionner

nom                     valeur
CFG_INFO                1
CFG_ALARME              2
CFG_DEFAUT              3
CFG_ALARME_SILENCIEUSE  21
Jusque là, tout baigne. Un appel à une instance du DFB se fait maintenant comme suit :

Code : Tout sélectionner

(* une instance de test du DFB, nature_info définie par une 'constante nommée' *)
mon_test(
  info := mon_info_test,
  nature_info := mon_test.CFG_ALARME,
  voyant_info => mon_voyant_test );
A partir de la, si le code définissant une ALARME doit changer, il n'y aura que la valeur de CFG_ALARME à corriger dans la définition du DFB,toutes les instances de celui-ci verront la nouvelle valeur à travers mon_instance.CFG_ALARME, tout va bien.
Sauf que, en tant que variable 'public', les valeurs des éléments CFG_INFO, CFG_ALARME, etc. sont modifiables, pour chaque instance.
Je cherche donc à les mettre en "lecture seule" : dans les attributs des variables public, je décoche "R/W Programme", pour empêcher leur accès en écriture... et ça foire. Un essai dans le simulateur Unity ne montre aucun souci pour modifier la valeur codant le paramètre CFG_ALARME, tel qu'illustré dans la capture écran jointe.

La solution de facilité : écrire la valeur de chaque variable 'public' dans une section de code dédiée du DFB, évidemment... mais le fait de ne pouvoir empêcher l'écriture d'une telle variable en dehors du DFB me turlupine.
Si quelqu'un a l'explication ou une autre idée, j'en serai ravi :)
Fichiers joints
Capture.PNG
Laurent
Répondre