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.
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:
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.
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