CS3 Guide - Hvis-makro (IF-macro)

Her kan du debattere og stille spørgsmål til alt om elektronik og digitaldrift på modeljernbanen. Skal du have hjælp til en dekoder eller driller signalet? Stil dit spørsmål her.
Besvar
Søren
Lokomotivfører
Indlæg: 5229
Tilmeldt: 30 jul 2011, 08:36
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Flex
Geografisk sted: Malling
Kontakt:

CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Søren »

På opfordring.

✋Kræver CS3 version 1.4.1. Husk at opdatere din CS3, hvis du ikke allerede har gjort det. 👍

Hvis / If
Betingelser er meget almindelige når du programmerer en computer.

En betingelse kan være enten sand eller falsk: Enten er betingelsen opfyldt eller også er den ikke opfyldt.

Betingelser forekommer oftest på formen:
Hvis (en betingelse er opfyldt) (gør en bestemt ting) ellers (gør noget andet).

CS3 har hid til understøttet betingelser i form af "Hvis en betingelse er opfyldt, så fortsæt hændelsesforløbet".

Med Hvis-makroen understøttes mere avancerede betingelser, der kan ændre hændelsesforløbet, hvis det modsatte er gældende.

Hvorfor
Betingelser er meget brugbare og simplificerer automatikken. Tidligere skulle du oprette flere hændelsesforløb der håndterede både den positive betingelse og den negative betingelse. De skulle begge aktiveres (f.eks. af en S88 kontakt) for herefter at kunne bestemme udfaldet. Den hændelse, hvis betingelse ikke er opfyldt, vil stå som fejlet ind til den skal vurderes igen. Dette er som sådan ikke et problem for CS3, men det er ikke særlig brugervenligt.

Med Hvis-makroen behøver du ikke længere tænke på det.

Hvordan
Når du opretter en hændelse kan du trykke på knappen "Tilføj" og vælge "Hvis-makro".
cs3_hvis-makro-1.jpg
Hvis du vælger "Hvis-makro" oprettes der en makro, som håndterer selve betingelsen. En makro ligner en hændelse, men kan kun aktiveres af andre hændelser. Du kan ikke manuelt aktivere den.

Ved at holde fingeren nede på makroen kan du åbne den og se indholdet. Du kan også åbne makroen fra listen af hændelser.
cs3_hvis-makro-2.jpg
Som du kan se er der tre kasser: Hvis (repræsenteret ved "?") og "Så (THEN)" og "Ellers" (Else). Hvis betingelsen under "?" er opfyldt, udføres den opgave du lægger i "THEN" og hvis ikke, så udføres opgaven i "ELSE".

Nu er det egentligt blot at udfylde makroen.

I nedenstående eksempel tager mit indkørselssignal højde for om et sporskifte er afvigende eller ret. Det betyder at jeg trækker sporskiftet ind i "?"-kassen. Sporskiftet og den valgte stilling er nu betingelsen.

Herefter trækker jeg signalet ind i "THEN" og "ELSE". Her sætter jeg de rette stillinger, så det viser korrekt signalbillede afhængig af sporskiftets stilling.

Det betyder at hvis sporskiftet er ret, så sættes der én grøn. Hvis sporskiftet er afvigende, så sættes der en grøn og en gul (kør langsomt).
cs3_hvis-makro-3.jpg
Reflektioner
Du kan bruge Hvis-makroen til rigtig mange ting og det begrænser sig ikke til ovenstående. Du kan også lægge andre hændelser ind på pladserne THEN og ELSE og dermed opnå meget avanceret automatik.

Værd at vide
Husk at CS3 ikke er begrænset til Märklin, men en fuld DCC central og fungerer selvfølgelig også med 2-skinne og alle skalaer (H0, N, TT osv.). Hvis du er interesseret i CS3 til dit 2-skinne anlæg, og har spørgsmål i den forbindelse, så skriv endelig og spørg.

Med venlig hilsen
Søren

2-skinne med CS3 Plus, tysk forbillede IV, V og VI | https://railway.zone/

Cman01
Stationsforstander
Indlæg: 50
Tilmeldt: 28 nov 2018, 22:33
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Märklin C

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Cman01 »

Hej Søren, Jeg er flittig bruger af IF-funktionen med min CS-3. Generelt fungerer princippet fint, men jeg har noteret, at hvis man eksempelvis har AND elementer med flere tilhørende underelementer i alle 3 IF-containere, virker IF ikke altid. Processen ignoreres simpelthen. Hvis jeg derimod splitter IF-funktionen op i mindre enheder (flere sidestillede IF) med et begrænsede antal AND, kan jeg godt få systemet til at virke. Spørgsmålet er, om der findes begrænsninger i anvendelsen af AND og OR i relation til IF-makroen? Og hvor kan jeg studere dette nærmere? Tak for dine anstrengelser.
Cman01
Stationsforstander
Indlæg: 50
Tilmeldt: 28 nov 2018, 22:33
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Märklin C

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Cman01 »

Hej Søren, Fik du mit indlæg? Mvh. Niels
Søren
Lokomotivfører
Indlæg: 5229
Tilmeldt: 30 jul 2011, 08:36
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Flex
Geografisk sted: Malling
Kontakt:

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Søren »

Yes, men jeg har bare ikke haft tid endnu. 🙂

Med venlig hilsen
Søren

2-skinne med CS3 Plus, tysk forbillede IV, V og VI | https://railway.zone/

Cman01
Stationsforstander
Indlæg: 50
Tilmeldt: 28 nov 2018, 22:33
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Märklin C

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Cman01 »

Helt i orden, naturligvis. Lad mig gå lidt videre med et eksempel i fortsættelse af problemet:

I forbindelse med ankomst af et tog til en banegård, hvortil der ankommer flere forskellige tog med forskellige kørselsmønstre på dette spor, skal toget efter udkørsel dirigeres til et andet spor via 2 sporskifte (kaldet W13 og W12). På banegården har jeg på sporet et kontaktspor (24995) og et udkørselsignal (76494) med tilhørende vippekontakt (24994) og endvidere 2 indkørselsignaler (76493) med samling ved sporskifte. De to udgående sporskifte styres herunder af signalet Indkørsel N4 (76493), som dog ikke er relateret til banegården men et signal på hovedstrækningen til banegården..

Ved passage af udkørselsignal er hændelsen forårsaget af vippekontakten (24994) automatisk:
Udkørsel (rød) / IF13: Indkørsel N4(gul/grøn); Then: AND13: W13 (grøn) - W12 (grøn); Else: AND8: W13 (rød) - W12 (rød) / Indkørsel N4 (grøn)

Det accepteres bare ikke. Men hvis jeg programmerer følgende, er det fint (i automatisk mode):
Udkørsel (rød) / IF24: Indkørsel N4 (grøn/gul); Then: W13 (grøn); Else: W13 (rød) / IF25: Indkørsel N4 (grøn/gul); Then: W12 (grøn); Else: W12 (rød) / Indkørsel N4 (grøn).

Hvad er forklaringen på ovennævnte, hvor W13 og W12 ikke initieres gennem AND men kun ved to IF-funktioner?
Søren
Lokomotivfører
Indlæg: 5229
Tilmeldt: 30 jul 2011, 08:36
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Flex
Geografisk sted: Malling
Kontakt:

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Søren »

Jeg skal lige prøve at genopbygge dit setup i min CS3, så ser jeg om jeg kan spotte det.

Med venlig hilsen
Søren

2-skinne med CS3 Plus, tysk forbillede IV, V og VI | https://railway.zone/

Søren
Lokomotivfører
Indlæg: 5229
Tilmeldt: 30 jul 2011, 08:36
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Flex
Geografisk sted: Malling
Kontakt:

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Søren »

Cman01 skrev: 01 apr 2020, 14:21Hvad er forklaringen på ovennævnte, hvor W13 og W12 ikke initieres gennem AND men kun ved to IF-funktioner?
Jeg skal lige forstå hvad du forstår ved AND. Jeg får fornemmelsen at du forventer at AND makroen sætter W13 og W12. Du får lige en forklaring på hvordan det skal forstås, og så kan du se om det er der problemet ligger.

Opsummering på nedenstående: Hvis du smider AND-makroerne væk, putter indholdet i to almindelige hændelser og kalder dem fra THEN og ELSE i stedet, så tror jeg det virker.

Forklaring

AND (og OR) makroerne er en mulighed for at have såkaldte AND gates (eller OR gates) i hændelser. Det betyder at AND-makroerne vurderer status på alle elementer i deres indhold og returnerer enten sand eller falsk til den kaldende makro. Du kan tænke en gate som en bro du skal passere for at få lov til at komme videre. Hvis du ikke opfylder de rette betingelser får du ikke lov.

Her er et eksempel på en AND makro, du kan se at der er et lille spørgsmålstegn over hvert element.
cs3_and.png
Da det er en AND makro betyder det, at makroen returnerer sand, hvis alle betingelserne er opfyldte. S1 OG S2 er røde = Sand. Hvis bare ét element afviger fra det viste er makroen falsk.

Hvis jeg kalder makroen ovenfor fra en hændelse, får jeg følgende i min hændelse:
cs3_and_in_event.png
Bemærk spørgsmålstegnet over "AND" makroen. Dette betyder at hændelsen vurderer resultatet af AND makroen inden den fortsætter. Hvis makroen returnerer falsk, så kan hændelsen standses og ikke fortsætte. I ovenstående hændelse skal resultatet af AND makroen være sandt, før hændelsen stiller togvejen ind i spor 1.

Spørgsmålstegnet indikerer at elementet i hændelsen er en gate for hændelsens videre forløb. En AND-makro er en avanceret gate. Du kan også have et spørgsmålstegn på et sporskifte, så er det sporskiftets stilling der afgør om hændelsen fortsætter eller ej. Du kan betragte spørgsmålstegnet som et spørgsmål der starter med "Hvis":

HVIS (AND 1 er sand) SÅ fortsætter hændelsen

Enten gør vi det, eller også gør vi det ikke.

Omvendt kan du også undersøge det negerede resultat (NOT AND eller NAND). NOT kan du tænke på som "Hvis ikke". I princippet betyder det, at hændelsen fortsætter hvis det omvendte af resultatet er tilfældet.

HVIS (IKKE AND 1 er sand) SÅ fortsætter hændelsen

Du indstiller dette i makroens egenskaber.
cs3_not_and.png
Bemærk at makroen i udgangspunktet er sat op sådan, at den "venter" på at resultatet opnås når AND makroen kaldes og betingelsen ikke er opfyldt (altså AND-makroen returnerede "falsk").

Det har den konsekvens, at hvis hændelsen bliver aktiveret og betingelsen ikke er opfyldt, så sidder hændelsen klar i starthullet ind til betingelsen bliver opfyldt og så fortsætter den.

Dette er ikke altid ønskværdigt (især ikke ved togveje(!)). Du kan ændre dette til, at hændelsen afbrydes hvis ikke resultatet af din AND er det du ønsker. Her vælger du "Fortsæt" i egenskaberne for makroen under "Betingelse".

"Fortsæt" skal forstås sådan, at hvis betingelsen er opfyldt (altså sand) så fortsætter vi. Det er lidt selvmodsigende, da det alternative valg er "Vente", og skal forstås sådan at "Hvis betingelsen IKKE er opfyldt, så venter vi". Det er lidt forvirrende, men du vænner dig til det.

Det værste ville være en togvej der stiller sig timer efter den blev kaldt, fordi betingelsen først her er opfyldt. Det kan hurtigt blive ærgerligt.

Konklusion
AND- og OR-makroerne er "ganske almindelig" boolsk algebra i din CS3. Det er ekstremt kraftfuldt i forhold til automatik. Du kan læse mere om teorien her (og lad dig ikke slå ud af, at det kan være svært at forstå, hvis man ikke lige kender det):

https://en.wikipedia.org/wiki/Boolean_algebra

AND gate:
https://en.wikipedia.org/wiki/AND_gate

NAND gate:
https://en.wikipedia.org/wiki/NAND_gate

En AND-makro stiller altså ikke værdien af de elementer den indeholder, den vurderer deres status og returnerer det samlede resultat til den kaldende makro, som så kan bruge det til at vurdere det videre forløb. En AND makro i en IF-makro vil blot give IF-makroen information om sand eller falsk, og ikke gøre andet. Der vil derfor ikke ske noget, når en AND makro er i en IF-makro.

IF-makroen vil blot kalde AND-makroen som returnerer enten sand eller falsk, hvortil IF-makroen vil tænke "Nå?" og ikke foretage sig yderligere.

Derfor: Opret to hændelser i stedet for dine AND-makroer, der gør det du ønsker skal ske og smid dem i THEN og ELSE. Så virker det.

Hvad med OR?
OR fungerer på samme måde, men er en OR gate. Hvis vi tager eksemplet ovenfor er udtrykket i en OR makro sandt hvis S1 ELLER S2 er røde. Er både S1 og S2 grønne så er betingelserne for OR gaten ikke opfyldt, og resultatet er derfor falsk.

Jamen? Hvad kan jeg så bruge det til?
Gates er afsindig kraftfulde til avanceret automatik. Du kan bygge hændelser, der benytter gates til at vurdere om en togvej skal sættes.

Det kan f.eks. være et udtryk der kontrollerer, at der ikke er besatte spor på tværs af en togvej. Så kan CS3'eren foretage alternative handlinger, hvis betingelserne for togvejen ikke er opfyldte. Det kan f.eks. være at tænde en advarselslampe eller afspille en lyd.

Hvis man bruger CS3'eren til at bygge en fysisk pult med trykknapper, så åbnes der mange muligheder for at bygge det præcis som det fungerer i virkeligheden.

Tips og ideer
Husk på at det står dig frit for at omdøbe AND-makroen til noget mere sigende end "AND 1". Du kan passende kalde den noget der giver mening for dens brug.

Husk også på, at AND-makroer kan genbruges i andre hændelser. De er ikke bundet til den hændelse, hvor de først blev oprettet. Det betyder, at hvis du f.eks. har en AND makro der kontrollerer en betingelse, som du benytter flere steder, så kan du nøjes med den ene AND-makro.

Både for tiden brugt, men mest for overskuelighedens skyld, så kan det godt betale sig at kigge lidt på at dele dine hændelser og makroer op i små afgrænsede opgaver med hver deres ansvar, og så benytte en anden hændelse til at kombinere dem. Dermed opnår du en stor fleksibilitet i styringen af dit anlæg. Læs evt. mere her: https://en.wikipedia.org/wiki/Single-re ... _principle

Med venlig hilsen
Søren

2-skinne med CS3 Plus, tysk forbillede IV, V og VI | https://railway.zone/

Cman01
Stationsforstander
Indlæg: 50
Tilmeldt: 28 nov 2018, 22:33
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Märklin C

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Cman01 »

Tak for et omfattende bidrag. Jeg tror ikke, jeg har problemer med at forstå principperne bag AND og OR og Makro i øvrigt. Jeg har forsøgt med diverse finurligheder uden held og måske ligger det i indstillingerne for AND, selv om det er meget begrænset, hvad der kan ændres her. Mit eksempel er meget simpelt, og selv efter gennemlæsning og endnu et par afprøvninger har jeg ikke løst problemet. IF med AND er tilsyneladende problematisk, så jeg vælger flere IF uden AND i visse af mine opsætningerne. Jeg har ikke stødt på problemer med OR.
Som jeg ser det, har du forstået min udfordring. Men tak for for hjælpen.
Cman01
Stationsforstander
Indlæg: 50
Tilmeldt: 28 nov 2018, 22:33
Digital: Ja
Scale: H0 - 2-rail
Skinnesystem: Märklin C

Re: CS3 Guide - Hvis-makro (IF-macro)

Indlæg af Cman01 »

Hej Søren, Jeg fik aldrig fulgt helt op på problemet. Jeg forstod, at flere elementer, som indgår i eksempelvis AND, skaber problemer. Ved anvendelse af FSxx løses imidlertid problemet. Så hvis jeg ønsker at indstille flere end to elementer samtidig, for eksempel 2 sporskifte kombineret med et signal, er løsningen tilsyneladende ikke AND med gennem FSxx. Giver dette mening?

Besvar