Aller au contenu

Programmation D.L.S: Anatomie

Cette page vous propose un modèle d'organisation permettant de bénéficier de la souplesse apportée par la solution.

Prenons l'exemple du besoin: piloter un luminaire. Le découpage proposé est le suivant:

  • Un module maitre assurant le pilotage direct d'un actionneur, en gérant les visuels, les défauts et les notifications associés.
  • Un module controle permettant de visualiser les éléments de mesures de associés à l'objet. Ce module sera suffixé par _CTRL.
  • Un module commande dont le rôle sera de gérer les évènements reçu par le système et de faire appel au maitre pour lui envoyer des ordres. Ce module sera suffixé par _CMDE.
  • Un module maintenance dont le rôle sera de gérer les évènements reçu par le système et de faire appel au maitre pour lui envoyer des ordres. Ce module sera suffixé par _MTCE.

Ainsi, pour un tétérupteur pilotant l'éclairage d'une cour par exemple, dont le tech_id serait ECLCOUR, les modules seront les suivants:


Anatomie du module maitre ECLCOUR

Cartouche

/*****************************************************************************/
/*  Module ECLCOUR                                                09/05/2023 */
/*  Ce module pilote l'éclairage de la cour                                  */
/*****************************************************************************/

Définition des entrées/sorties physiques ou interne

/* ENTREES PHYSIQUES */
 #define POS_TL              <-> _DI; /* Position Télérupteur Eclairage Cour */

/* ORDRES INTERNES ~~~~~~~~~~~~~*/
 #define O_ALLUMER           <-> _DI;               /* Demande d'allumage TL */
 #define O_ETEINDRE          <-> _DI;             /* Demande d'extinction TL */

/* SORTIES PHYSIQUES */
 #define ACT_TL              <-> _DO;   /* Sortie de pilotage du télérupteur */

Définition des visuels et des messages:

/* VISUELS */
 #define VISU_POS_TL         <-> _I(forme="ampoule"); /* Position Télérupteur */

/* MESSAGES */
 #define MSG_TELE_OFF          <-> _MSG(type=etat,libelle="Eclairage Cour éteint"); /* TL désactivé */
 #define MSG_TELE_ON           <-> _MSG(type=etat,libelle="Eclairage Cour actif");  /* TL activé */
 #define MSG_DEF_REPOS         <-> _MSG(type=defaut,libelle="Défaut repos");        /* Defaut repos */
 #define MSG_DEF_TRAVAIL       <-> _MSG(type=defaut,libelle="Défaut travail");      /* Defaut travail */

Définition des compteurs

/* Compteurs */
 #define CHPROCEDE       <->_CH(libelle="Duré de vie du procédé");
 #define CHSERVICE       <->_CH(libelle="Cadran Horloge Durée Service de l'Eclairage Cour");
 #define CIACTIONS       <->_CI(libelle="Compteur Itérations Actions Télérupteur de l'Eclairage Cour");

Définition des temporisations

 #define TR_DEF                <-> _T(daa=10,dma=0,dMa=0,dad=0,libelle="Temporisation de détection de défaut après manoeuvre");
 #define TR_IMP                <-> _T(daa= 0,dma=0,dMa=3,dad=0,libelle="Temporisation d'impulsion pour manoeuvrer le télérupteur");

Définition des bits internes au module

/* Bistables et monostables internes */
 #define MDEF_REPOS            <-> _B(libelle="Mémorisation du défaut repos non acquitté du TL");
 #define MDEF_REPOS_F          <-> _B(libelle="Mémorisation du défaut repos acquitté (Fixe) du TL");
 #define MDEF_TRAVAIL          <-> _B(libelle="Mémorisation du défaut travail non acquitté du TL");
 #define MDEF_TRAVAIL_F        <-> _B(libelle="Mémorisation du défaut travail acquitté (Fixe) du TL");
 #define MEWANTTL              <-> _B(libelle="Etat attendu du TL (0=ouvert, 1=fermé)");
 #define MEACTELE              <-> _B(libelle="Demande de manoeuvre du TL (changement d'état)");
 #define ME_MTCE               <-> _B(libelle="Mémo Etat <maintenance> de l'Eclairage Cour");

Mesures de précaution à l'allumage

/* Start */
- _START -> /ACT_TL;    /* Au start, on fait tomber la sortie */

Vient ensuite la réaction aux evenements:

/* Evenements */
-_TRUE   -> CHPROCEDE;                          /* Durée total Procédé */
- POS_TL -> CHSERVICE;              /* Durée de Service du Télérupteur */

- POS_TL(edge_up) + POS_TL(edge_down)

Le calcul de l'état attendu

/* CALCUL ETAT ATTENDU TELERUPTEUR */
- MEMSA_OK. O_ALLUMER. /POS_TL -> MEWANTTL, MEACTELE;
- MEMSA_OK. O_ETEINDRE. POS_TL ->/MEWANTTL, MEACTELE;

Le pilotage physique

/* PILOTAGE TELE SUR COMMANDE DE MANOEUVRE */
- MEMSA_OK. MEACTELE -> TR_IMP, TR_DEF;
/* Envoie de la sortie +1 Cpt Actions Télérupteur */
- TR_IMP             -> ACT_TL, CIACTIONS;
/* Fin de la tempo, fin de l'impulsion */
-/TR_IMP + /MEMSA_OK ->/ACT_TL;

/* FIN DE MANOEUVRE */
- TR_DEF -> /MEACTELE;

La gestion des défauts

Le template de détection des défauts est le suivant:

/* Detections du défaut */
- TR_DEF . **Condition_du_defaut** . /MDEF_FIXE -> MDEF;
/* Acquit intéractif du defaut */
- OSYN_ACQUIT . MDEF ->/MDEF, MDEF_FIXE;
/* RAZ du défaut */
- **Condition_de_RAZ** -> MDEF_FIXE;
/* Notification du défaut */
- MDEF + MDEF_FIXE -> MSG_DEFAUT;

Sur l'exemple de l'éclairage cour, cela donnerai pour le défaut Repos (le télérupteur reste bloqué sur ON et ne peut redescendre à OFF):

/* Détection Discordance Repos du Télérupteur */
- TR_DEF ./ME_MTCE . POS_TL . /MEWANTTL ./MDEF_REPOS_F
                            -> MDEF_REPOS;
- OSYN_ACQUIT . MDEF_REPOS  ->/MDEF_REPOS, MDEF_REPOS_F;
-/POS_TL . MDEF_REPOS_F     ->/MDEF_REPOS_F;
- MDEF_REPOS + MDEF_REPOS_F -> MEMSA_DEFAUT;

Le reporting

Ces remontées servent à gérer les indices de défaut sur la page synoptique associé à ce module D.L.S.

/* ACTIVITE - Report Défaut et Anomalie */

- MDEF_REPOS + MDEF_TRAVAIL     -> MEMSA_DEFAUT;
- MDEF_REPOS_F + MDEF_TRAVAIL_F -> MEMSA_DEFAUT_FIXE;

/* SECURITES DES BIENS - Report Veille et Alerte */
- _TRUE  -> MEMSSB_VEILLE;
- _FALSE -> MEMSSB_ALERTE;
- _FALSE -> MEMSSB_ALERTE_FIXE;

/* SECURITES DES PERSONNES - Report Danger et dérangement */
- _FALSE -> MEMSSP_DERANGEMENT;
- _FALSE -> MEMSSP_DERANGEMENT_FIXE;
- _FALSE -> MEMSSP_DANGER;
- _FALSE -> MEMSSP_DANGER_FIXE;

Affichage des visuels

switch
 | - MDEF_TRAVAIL  -> VISU_POS_TL(mode="off", cligno, libelle="Défaut travail");
 | - MDEF_REPOS    -> VISU_POS_TL(mode="on",  cligno, libelle="Défaut repos");
 | - POS_TL        -> VISU_POS_TL(mode="on",  libelle="Eclairage Cour allumé");
 | -               -> VISU_POS_TL(mode="off", libelle="Eclairage Cour en attente");

Notification par messages

/* Edition des messages */
-/POS_TL                        -> MSG_TELE_OFF;
- POS_TL                        -> MSG_TELE_ON;