Questions de programmation / Bonnes pratiques

Partie du forum pour tout ce qui concerne la partie soft, ou logiciel, dans l'industrie. Forum, conseil, astuce et entraide sur les logiciels d'automatisme ou d'informatique industrielle .
Avatar de l’utilisateur
djé
Dieu du process
Dieu du process
Messages : 776
Inscription : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes

Questions de programmation / Bonnes pratiques

Message par djé »

Bonjour a toutes et à tous,

Petite question / sondage :

Lors de la programmation d'un bloc fonction type FB/DFB est-ce que vous utilisez les variables internes dans le reste de votre code ?

Je programme sur TIA, mais le principe est le même qqsoit l'automate:

Je m'explique: en général ces blocs ont en interface les in, out et in/out puis les variables privées (temp) et "publiques" (Static).

Si on cherche à respecter le principe suivant "on echange avec l'extérieur du code que les infos en in, out et in/out" dans certains cas le bloc devient vite un gros pavé avec plein de branches à connecter partout.

J'ai déja par le passé plutôt travailler directement avec les données publiques car je trouvais cela plus digeste.
L'instance du bloc au final est dépourvu de branche et les information sont envoyées/récupérée à l'extérieur du bloc.

L'inconvénient avec ce type de programmation c'est que l'on perd les références croisées car les informations n'existe que dans le bloc :

Admettons j'ai un bloc générique "monBloc" avec un data "monBool" à l'intérieur, l'affectation depuis l'extérieur sera :
monBlocInstance1.monBool = 1
monBlocInstance2.monBool = 0 ...etc

EN terme de référence croisées, on a l'information l'écriture de la data mais pas de lecture puisque faite dans le bloc de base. (la je parle pour du SIEMENS je ne sais pas si les autres éditeurs savent retrouver la référence en lecture)
Idem dans l'autre sens si lecture et non écriture à l'extérieur du bloc (si monBlocInstance1.monBool = 1 alors ...) on voit la lecture de la data pas l'écriture.

Ça peut paraitre déroutant et si on est pas familier avec ce type de programmation on peut vite être perdu.

Qu'en pensez-vous ?
Quelles sont vos pratiques ?
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar de l’utilisateur
Béryl
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1660
Inscription : 20 oct. 2015, 12:00
Localisation : localhost

Re: Questions de programmation / Bonnes pratiques

Message par Béryl »

Pour ma part les variables internes restent locales.
Si j'en ai besoin à l'extérieur du bloc, ce n'est plus une variable locale, elle est donc poussée sur une sortie du bloc pour être affectée à une variable globale ou en IN/OUT.
Je ne lis directement une variable locale que dans une table d'animation.
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7037
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Questions de programmation / Bonnes pratiques

Message par itasoft »

slts,
Je m'explique: en général ces blocs ont en interface les in, out et in/out puis les variables privées (temp) et "publiques" (Static).

-----
Je ne met jamais de variables "publiques" sinon ça sert à rien de faire un DFB
Automaticien privé (de tout)
itasoft@free.fr
Avatar de l’utilisateur
skip74
Créateur de langage
Créateur de langage
Messages : 640
Inscription : 13 oct. 2015, 06:34

Re: Questions de programmation / Bonnes pratiques

Message par skip74 »

Salut

Je programme sur unity,, il y a rien de parfait...

L'intérêt des entrées sortie est très important pour la diagnostic dépannage, infos visuelle. L'inconvénient c'est que si beaucoup de paramètres ça devient difficile a lire, on pert l'intérêt...

Tout passer dans du public au delà du pb de recherche croisée (assez bien géré a ce niveau là sous unity) c'est que l'on pert l'intérêt de diagnostic, obligé de rentrer dans les méandres du code dedans pour voir ce qui va pas....

Après avoir essayé un peu tout, je fais comme cela:
Je met tout ce qui est important sous forme d'information simple (tor, int...) Et tout ce qui est plus côté 'parametrage' du block ou option, tout ça est balancé dans une grosse structure qui est posée en paramètre d'entrée sortie....
Le soucis que j'ai dans cette méthode: si on doit modifier la taille de la structure en run..... souvent c'est impossible... Je garde des paramètres de réserve mais c dur de tout prévoir a l'avance.....
Quand j suis bloqué et impossible de passer en stop, je passe par des public

Dans le temps j'utilisais les public comme des parametres directement, mais suis a des rechargements de programmes il m'est arrivé que ces paramètres soient mal restauré....
Depuis je les réécris systématiquement (c'est fait à côté de l'appel du dfb)

A+
agea28
Code son premier grafcet
Code son premier grafcet
Messages : 35
Inscription : 04 mai 2019, 23:07
Localisation : Eure et Loir
Contact :

Re: Questions de programmation / Bonnes pratiques

Message par agea28 »

Comme les collègues, je ne me sert pas des public (sauf si contraint et forcé). Je préfère avoir un gros bloc avec pleins d'E/S qui à mon sens sera toujours plus digeste pour le commun des mortels.
Avatar de l’utilisateur
Brebiou
Dieu du process
Dieu du process
Messages : 929
Inscription : 21 oct. 2015, 08:38

Re: Questions de programmation / Bonnes pratiques

Message par Brebiou »

Les variables internes ne sont pas utilisé dans le reste de mon code non plus.
Si tu en as besoin à l’extérieur, c'est qu'elle ne doivent plus être interne, ça perd son sens.

Tout ce qui est paramètres d'entrée, généralement c'est une ou plusieurs structures qui sont attendues en IN et quelques variables.
En sortie, cela arrive de temps en temps que je passe aussi par des structures mais la plupart du temps, j'ai moins d'une vingtaine de variables a récupérer.
Par contre en interne c'est bagdad, structures et variables atteignent souvent la cinquantaine :D

Le tout c'est que la maintenance puisse debugger facilement sans rentrer dans le bloc une fois que celui ci est déployé. Sinon c'est à toi de remettre les mains dedans et dans ce cas tu as toutes les cartes en mains.

Enfin ça n'engage que moi ;)
Avatar de l’utilisateur
djé
Dieu du process
Dieu du process
Messages : 776
Inscription : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes

Re: Questions de programmation / Bonnes pratiques

Message par djé »

Bonjour,

Merci pour vos réponses.

En fait mon, interrogation se porte surtout sur du SIEMENS, bien que cela puisse être transposable sur d'autre plateforme.

J'ai pris l'habitude de ne plus utiliser les zones %M dans les programmes et donc d'utiliser un FB avec sa DB d'instance associée comme zone mémoire.
Suivant les applications je structure les divers FB (spécifiques) par zone on dira.
Dans chaque FB principal, je fais appel à d'autre FB géneriques (tempo, moteur ,vannes, whatever...) qui sont directement déclarés en STAT (l'équivalent je dirai des variables publiques).
Cela me génère un DB d'instance Unique par zone avec l'ensemble des données relatives contenue dedans. Jusque là tout va bien.
Ce que je trouve chiant c'est de devoir repasser par des données intermédiaires in-out ou DB globale on dira pour gérer les infos inter FB de zone alors que l'on pourrait utiliser directement le DB d'instance proprement dit puisque c'est de la mémoire (en étant aware des données manipulées)
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7037
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Questions de programmation / Bonnes pratiques

Message par itasoft »

slts,
Ce que je trouve chiant c'est de devoir repasser par des données intermédiaires in-out ou DB globale on dira pour gérer les infos inter FB de zone alors que l'on pourrait utiliser directement le DB d'instance proprement dit puisque c'est de la mémoire (en étant aware des données manipulées)

Si on fait la même chose en d’autres langages (ex : C++) ça s’appelle une fonction ou une Procédure
Ya pas de variables globales, tout doit être transmis à la fonction via des paramètres (ou des pointeurs en C++)
C’est pareil avec des DFB tout doit passer via les paramètres
Automaticien privé (de tout)
itasoft@free.fr
Avatar de l’utilisateur
djé
Dieu du process
Dieu du process
Messages : 776
Inscription : 20 oct. 2015, 09:55
Localisation : Bretagne, Pays de la Loire, Nantes

Re: Questions de programmation / Bonnes pratiques

Message par djé »

Si on fait la même chose en d’autres langages (ex : C++) ça s’appelle une fonction ou une Procédure
Ya pas de variables globales, tout doit être transmis à la fonction via les paramètres.
C’est pareil avec des DFB tout doit passer via les paramètres
C'est pas faux, mais si on fait l'analogie avec une programmation orienté objet, on pourrait dire que les DFB sont des instances avec des propriétés en lecture et/ou écriture. Pas besoin de passage de paramètres. non?
Le monde se divise en 10 catégories:les personnes qui comprennent le binaire,et les autres.

Dans tout ce que vous apprenez, seuls 10% vont vous servir,mais vous ne savez pas lesquels ...
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7037
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Questions de programmation / Bonnes pratiques

Message par itasoft »

djé a écrit : 09 avr. 2020, 17:05
Si on fait la même chose en d’autres langages (ex : C++) ça s’appelle une fonction ou une Procédure
Ya pas de variables globales, tout doit être transmis à la fonction via les paramètres.
C’est pareil avec des DFB tout doit passer via les paramètres
C'est pas faux, mais si on fait l'analogie avec une programmation orienté objet, on pourrait dire que les DFB sont des instances avec des propriétés en lecture et/ou écriture. Pas besoin de passage de paramètres. non?
---------
c'est pas complètement faux, dans ce cas je crée une instance de l'objet (SET en VBA) et modifie les propriétés de l'instance , reste à savoir ce que je veux faire avec cette instance,

ok, compris, en fait les propriétés dans les DFB ce sont les variable globales, finalement ça revient au même, il faut juste si habituer, LOL
Automaticien privé (de tout)
itasoft@free.fr
Répondre