31.JUL.2013/HvM;

 11. Slim gebruik maken van Uitgaande Berichtenbuffer (“UBER”)

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

De CVN-interface­definitie is voorzien van een ingaande en een uitgaande berichten­buffer. Deze buffers zijn primair bedoeld voor de communicatie tussen de gebruiker/bediener (u dus) en de CCOL-verkeers­regel­applicatie (de “kruispuntregeling”).

In CCOL is de commando­parser verantwoordelijk voor de communicatie en voor het opvragen en eventueel wijzigen van allerlei instellingen van de regel­applicatie (“AP”; tijden, software­schakelaars, parameters, …), overigens níet van de procesbesturing (“PB”; SWICO, …).

Daarnaast is de UBER heel goed bruikbaar om andere informatie uit te voeren, zoals de resultaten van voertuig­tellingen of tussen­berekeningen van ingewikkelde reken­technische processen (bijvoorbeeld van doseer­algoritmes).
Denk er echter aan dat er wel ‘ontvangende apparatuur’ op de RS232-poort of anderszins aanwezig moet zijn, anders gaat de output van de UBER verloren.

De informatie die op deze manier naar buiten wordt gebracht kan een enorme omvang aannemen. Toch is de output naar de UBER niet de belangrijkste taak van een verkeers­regel­automaat. Het regelen van het verkeer blijft natuurlijk prioriteit nummer één. De output naar de UBER kan dusdanig omvang­rijk worden dat de verkeers­regel­automaat het niet meer allemaal binnen de ± 0‚1 seconde kan afhandelen (zie ook het CCOL-onderwerp 10 rondjes per seconde). We spreken dan van een “rekentijd­probleem”. Wanneer een rekentijd­probleem optreedt liggen er heel vervelende conse­quenties op de loer, zoals GUS-WUS-fouten. En vergist u zich er niet in hoe snel dit al kan voorkomen zodra u de UBER voor extra informatie gaat gebruiken!

In CCOL zijn diverse voorzieningen aanwezig om dit proces, hoe omvangrijk ook, in goede banen te leiden. Onderstaand ziet u een voorbeeld hoe u een geel­licht­rijders­telling zou kunnen maken, waarvan de output op commando naar de UBER wordt gestuurd (door met de commando­parser schakelaar sch_output_geeltelling op 1 te zetten). Daarbij wordt per systeem­ronde de informatie van slechts één fase­cyclus naar de UBER gestuurd. Zo zal de applicatie nooit in rekentijd­problemen komen en kunt u deze telling zelfs uitlezen tijdens de toestand REGELEN.
U dient deze code op te nemen in de systeemfunctie system_application() (zie het CCOL-onderwerp Slim gebruik functie system_application(…) ).

Om de essentiële programma­code duidelijk herkenbaar te houden gaat het onderstaande voorbeeld er gemaks­halve van uit dat er alleen voertuig­signaalgroepen zijn, dat elke signaalgroep alleen een koplus heeft en dat er voor elke fase­cyclus een geheugen­element is aangemaakt, die alle dezelfde volgorde hebben als de fase­cycli (te regelen in het CCOL-sourcebestand *****SYS.H).



#include <string.h>   /* voor tekstuele bewerkingen (strlen) */
#include <stdio.h>    /* voor tekstuele meldingen (sprintf) */


void system_application(void)
{
 static count ctrl = 0;   /* controlevariabele, LET OP: static (!) */


/* 1. Telling aantal voertuigen dat door UITWENDIG GEEL rijdt: */
 if( REGELEN )   /* zie CCOL-onderwerp Macro's: defines.h */
 {
  count i, j;
  for( i=0; i<FC_MAX; i++ )   /* voor elke fasecyclus index i: */
  {
   j = i;   /* of anderszins: j is index voor koplus */
   if( CIF_WUS[i] == CIF_GEEL && ED[j] )
   {   /* er rijdt een voertuig door uitwendig (!) geel */
    MM[i]++;   /* ophogen bijbehorende tellertje */
   }
  }
 }


/* 2. Start (push) van de output van de telling naar de UBER: */
 if( SCH[sch_output_geeltelling] )
 {
  ctrl = 1;   /* herkenning status van output; loopt van 1 tot en met FCMAX */
  SCH[sch_output_geeltelling] = 0;
 }


/* 3. Output van de telling naar de UBER: */
 if( ctrl > 0 )
 {
  if( FC_MAX >= ctrl )
  {
   string tekst[120];
   sprintf(tekst, “Telling geelrijders %s bedraagt %d voertuigen.\n”, FC_code[ctrl-1], MM[ctrl-1]);

   if (!waitterm((mulv) (strlen(tekst)+2)))   /* testen op voldoende ruimte in CIF_UBER */
   {
    uber_puts(tekst);   /* schrijven van de tekst naar UBER */
    ctrl++;   /* t.b.v. volgende aanroep van deze functie */
   }
   /* indien er onvoldoende ruimte in de UBER is, dan stuurt deze functie niets uit,
       wordt ctrl níet opgehoogd, en zal deze functie de volgende systeemronde
       de info van dezelfde fasecyclus opnieuw proberen te versturen! */

  }
  else
  {
   ctrl = 0;   /* einde van de output */
  }
 }


}   /* einde 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.


Index van CCOL-onderwerpen


Reageer op dit bericht