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 );
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
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 );
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