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 applicatiefuncties 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) |
Deze constructie is zeer gebruikelijk.
Elk van de vier applicatiefuncties heeft een eigen betekenis en bedoeling:
- De functie
init_application(…)
wordt slechts eenmaal doorlopen, en wel tijdens het starten van het regelen na de toestand “ALLES ROOD”. Dus ook na “INSCHAKELEN”.
- De functie
application(…)
wordt elke machineslag doorlopen (dus meerdere keren per seconde, zie onderwerp “10 rondjes per seconde”), maar uitsluitend tijdens het regelen van het CCOL-programma. Dus NIET tijdens elke andere toestand van de verkeersregelautomaat, zoals “UITSCHAKELEN” of “GEEL KNIPPEREN”. Ook als er een star noodprogramma vanuit de procesbesturing actief is (en dus géén CCOL-programma) wordt de functieapplication(…)
niet doorlopen.
- De functie
dump_application(…)
wordt uitsluitend doorlopen indien er een fasebewaking (“FB”) optreedt. Alle code die in deze functie wordt geprogrammeerd zal in de dump verschijnen.
- De functie
system_application(…)
zal altijd en bij elke machineslag worden doorlopen, ongeacht de bedrijfsstatus van het regeltoestel. Dus óók tijdens NIET regelen van het C-regelprogramma.
De functie system_application(…)
wordt gebruikt voor alle functionaliteiten die ook tijdens het niet-regelen van het C-programma moeten afhandelen. Denk bijvoorbeeld aan voertuigtellingen (maar niet een roodrijderstellingen!). Ook kan het worden gebruikt om standaard overige uitgangssignalen af te zetten, die tijdens het niet-regelen beslist niet mogen worden aangestuurd, zoals rateltikkers, verschijnlichten als “rechtsaf door rood”.
Hieronder volgt een manier om standaard alle overige uitgangssignalen uit te schakelen zodra een CCOL-regeling de toestand REGELEN verlaat (het gaat om de vetgedrukte blauwe
programmacode):
void system_application(void) |
Maar pas op: het kán zijn dat sommige overige uitgangssignalen NIET moeten worden reset, zoals verschijnlichten (bijvoorbeeld “BRANDWEER”) of verklikkingen op het bedienpaneel (bijvoorbeeld “BUS AANWEZIG”). Die signalen moeten dus níet worden reset!
Dit betekent dat het niet is toegestaan om de bovenstaande algemene reset voor alle overige uitgangssignalen 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 uitgangssignaal aan te duiden of het een signaal is dat tijdens NIET REGELEN moet worden reset of niet. Doe dit tenminste voor alle overige uitgangssignalen 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 programmacode:
void control_parameters(void) |
En wijzig de reset-functie vervolgens:
void system_application(void) |
N.B. Let op de enkele "&" in het tweede if-statement!
Bovenstaand zal de reset van een overig uitgangssignaal uitsluitend plaatsgrijpen indien het de eigenschap USD_type
heeft meegekregen. Dit betekent dat de overige uitgangssignalen die geen enkele eigenschap in het element US_type
hebben meegekregen dus ook niet worden reset!
In dit voorbeeld zal dus de moduleverklikking worden uitgeschakeld, ongeacht welke module oplichtte toen de status REGELEN werd verlaten. De bedienpaneelverklikking van de brandweer 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 voorgedefinieerde macro's het onderwerp “Macro's voor tabellen”. U kunt het download-bestand gemakkelijk gebruiken door het statement #include "defines.h"
toe te voegen in uw regelapplicatie. Vervolgens kunt u bijvoorbeeld de defines
uit het bovenstaande voorbeeld weglaten.
Dit onderwerp behandel ik ook in de cursussen ‘Toolkit-CCOL’.
Voor meer informatie kunt u mij telefonisch of via het reactieformulier bereiken.