04.FEB.2012/HvM; 15.APR.2012/HvM

 8. Slim gebruik functie system_application(…)

Dit onderwerp behandel ik ook in de cursussen ‘Toolkit-CCOL’.
Voor meer informatie kunt u mij telefonisch of via het reactieformulier bereiken.

Een CCOL-programma kent vier applicatie­functies die altijd aanwezig moeten zijn:

  • init_application(…)
  • application(…)
  • dump_application(…)
  • system_application(…)

Al deze functies MOETEN aanwezig zijn in een CCOL-programma. Ze mógen leeg zijn, maar ze móeten aanwezig zijn.
Een lege functie is bijvoorbeeld:

void dump_application(void)
{
}   /* einde functie dump_application() */

Deze constructie is zeer gebruikelijk.

Elk van de vier applicatie­functies heeft een eigen betekenis en bedoeling:

  • De functie init_application(…) wordt slechts een­maal door­lopen, en wel tijdens het starten van het regelen na de toestand “ALLES ROOD”. Dus ook na “INSCHAKELEN”.
  • De functie application(…) wordt elke machine­slag doorlopen (dus meerdere keren per seconde, zie onder­werp “10 rondjes per seconde”), maar uit­sluitend tijdens het regelen van het CCOL-programma. Dus NIET tijdens elke andere toestand van de verkeers­regel­automaat, zoals “UITSCHAKELEN” of “GEEL KNIPPEREN”. Ook als er een star nood­programma vanuit de proces­besturing actief is (en dus géén CCOL-programma) wordt de functie application(…) niet doorlopen.
  • De functie dump_application(…) wordt uitsluitend doorlopen indien er een fase­bewaking (“FB”) optreedt. Alle code die in deze functie wordt geprogrammeerd zal in de dump verschijnen.
  • De functie system_application(…) zal altijd en bij elke machine­slag worden doorlopen, ongeacht de bedrijfs­status van het regel­toestel. Dus óók tijdens NIET regelen van het C-regel­programma.

De functie system_application(…) wordt gebruikt voor alle functio­nali­teiten die ook tijdens het niet-regelen van het C-programma moeten afhandelen. Denk bijvoorbeeld aan voertuig­tellingen (maar niet een rood­rijders­tellingen!). Ook kan het worden gebruikt om standaard overige uitgangs­signalen af te zetten, die tijdens het niet-regelen beslist niet mogen worden aan­gestuurd, zoals ratel­tikkers, verschijn­lichten als “rechtsaf door rood”.

Hier­onder volgt een manier om standaard alle overige uitgangs­signalen uit te schakelen zodra een CCOL-regeling de toestand REGELEN verlaat (het gaat om de vetgedrukte blauwe programmacode):

void system_application(void)
{

   register count i;
   
   /* … eventueel andere programmacode … */
   
   if(CIF_WPS[CIF_PROG_STATUS] != CIF_STAT_REG)   /* als werkelijke programmastatus NIET REGELEN is */
   {
      for (i=FC_MAX; i<US_MAX; i++)               /* voor alle OVERIGE UITGANGSSIGNALEN */
      {
         CIF_GUS[i] = CIF_ROOD;                   /* reset het uitgangssignaal */
      }
   }

   
   /* … eventueel andere programmacode … */
   
}   /* einde functie system_application() */

Maar pas op: het kán zijn dat sommige overige uitgangs­signalen NIET moeten worden reset, zoals verschijn­lichten (bijvoor­beeld “BRANDWEER”) of verklikkingen op het bedien­paneel (bijvoor­beeld “BUS AANWEZIG”). Die signalen moeten dus níet worden reset!
Dit betekent dat het niet is toe­gestaan om de boven­staande algemene reset voor alle overige uitgangs­signalen zomaar toe te passen.

Een oplossing hiervoor kan zijn om alle signalen die geen reset mogen krijgen te groeperen en vervolgens te voorkomen dat de for-loop in de functie deze groep behandelt. Dat doet u door middel van een wijziging van de loop-voorwaarde for (i=FCMAX; i<USMAX; i++).

Een andere oplossing zou zijn om per uitgangs­signaal aan te duiden of het een signaal is dat tijdens NIET REGELEN moet worden reset of niet. Doe dit tenminste voor alle overige uitgangs­signalen die tijdens NIET REGELEN moeten worden reset. Om dit te bereiken kan het element US_type worden gebruikt:

Schrijf in de functie void control_parameters(void) de volgende programma­code:

void control_parameters(void)
{

#define USD_type    0x4000                        /* overig uitgangssignaal (Dovend tijdens niet-regelen) */
#define USP_type    0x8000                        /* overig uitgangssignaal
                                                     (Permanent aangestuurd, ook tijdens niet-regelen) */
 
   US_type[us_module1     ] = "USD_type";
   US_type[us_module2     ] = "USD_type";
   US_type[us_brandweer   ] = "USP_type";
   US_type[us_bus_aanwezig] = "USP_type";

}   /* einde functie control_parameters() */

En wijzig de reset-functie vervolgens:

void system_application(void)
{

   register count i;
   
   /* ... eventueel andere programmacode ... */
   
   /* Reset overige uitgangssignalen tijdens niet-regelen */
   /* --------------------------------------------------- */
   if(CIF_WPS[CIF_PROG_STATUS] != CIF_STAT_REG)   /* als werkelijke programmastatus NIET REGELEN is */
   {
      for (i=FC_MAX; i<US_MAX; i++)               /* voor alle OVERIGE UITGANGSSIGNALEN */
      {
         if(US_type[i] & USD_type);               /* alleen als uitgangssignaaltype dovend signaal is */
            CIF_GUS[i] = CIF_ROOD;                /* reset het uitgangssignaal */
      }
   }

   
   /* ... eventueel andere programmacode ... */
   
}   /* einde functie system_application() */

N.B. Let op de enkele "&" in het tweede if-statement!

Boven­staand zal de reset van een overig uitgangs­signaal uitsluitend plaats­grijpen indien het de eigen­schap USD_type heeft mee­gekregen. Dit betekent dat de overige uitgangs­signalen die geen enkele eigen­schap in het element US_type hebben mee­gekregen dus ook niet worden reset!

In dit voorbeeld zal dus de module­verklikking worden uitgeschakeld, ongeacht welke module oplichtte toen de status REGELEN werd verlaten. De bedienpaneel­verklikking van de brand­weer en de bus blijft ongemoeid. Uitgangspunt daarbij is dat de verklikking ervan elders in de functie system_application(…) wordt geprogrammeerd, anders werkt het nóg niet.

Zie voor het gemakkelijk definiëren van het US_type en voor een groot aantal andere voor­gedefinieerde macro's het onder­werp “Macro's voor tabellen”. U kunt het download-bestand gemakkelijk gebruiken door het statement #include "defines.h" toe te voegen in uw regel­applicatie. Vervolgens kunt u bijvoor­beeld de defines uit het boven­staande voor­beeld weg­laten.

Dit onderwerp behandel ik ook in de cursussen ‘Toolkit-CCOL’.
Voor meer informatie kunt u mij telefonisch of via het reactieformulier bereiken.


Index van CCOL-onderwerpen


Reageer op dit bericht