Smarty160484
Level-2
- Beiträge
- 191
- Reaktionspunkte
- 8
Da ist bei mir im Download nur 'ne *.info drin.Daher habe ich eine Bibliothek erstellt. Bitte mal gucken ob alles enthalten ist!
ok, ich gucke nochmal nach, warum das so ist.Da ist bei mir im Download nur 'ne *.info drin.
Gather beachtet die BYTE-Reihenfolge im WORD.PS:
Die BYTE-Stellung im WORD muss aufgrund des BigEndian beachtet werden.
Mit der Überlagerung wird z.B. aus #STAT_Meldungen[0] das #STAT_Meldungen_to_Word[0].%X8 (und nicht %X0)!
Da weiß ich gerade nicht, wie das bei GATHER ist.
das bedeutet sozusagen das, dass Low- und High- Byte vertauscht sind!Gather beachtet die BYTE-Reihenfolge im WORD.
Somit wird #STAT_Meldungen[0] also zu #STAT_Meldungen_to_Word[0].%X0.
Das ist beim Überlagern logischerweise nicht der Fall, da es ja die selben Bits/Daten sind wie das überlagerte BOOL-Array.
Ich persönlich würde die Überlagerung nutzen, weil Du eh' einen FB hast:
Anhang anzeigen 73373
Dann kannt Du unabhängig von der Firmware diese beiden Regionen komplett rauswerfen:
Anhang anzeigen 73374
Wann immer #STAT_Meldungen[#i] ein Wert zugewiesen wird, steht der dann auch automatisch in #STAT_Meldungen_to_Word[#j].%Xzz.
Ganz ohne weiteren Code.
Das Gleiche für die Störungen:
Anhang anzeigen 73376
Für die beiden Variablen ohne das "to_Word" die Remanenz auf "Im IDB setzen" umstellen und dann bei den Variablen mit dem "to_Word" bei Datentyp (ohne den bereits vorhandenen Typ vorher zu löschen!) einfach nur ein AT eingeben und Enter.
Das AT wandert dann wie im Screenshot zu sehen nach vorne und der schon vorhandene Datentyp wird die Überlagerung.
PS:
Die BYTE-Stellung im WORD muss aufgrund des BigEndian beachtet werden.
Mit der Überlagerung wird z.B. aus #STAT_Meldungen[0] das #STAT_Meldungen_to_Word[0].%X8 (und nicht %X0)!
Da weiß ich gerade nicht, wie das bei GATHER ist.
IF #boolBedinung = TRUE THEN // nicht elegant
doSomething;
END_IF;
// besser:
IF #boolBedingung THEN
doSomething;
END_IF;
// negiert:
IF NOT #boolBedingung THEN
doSomething;
END_IF;
FOR #i := 0 TO 9 BY 1 DO // nicht elegent
#doSomething[#i] := TRUE;
END_FOR;
// "BY 1" ist in einer FOR-Schleife die default-Schrittweite.
// Deshalb kann es entfallen.
FOR #i := 0 TO 9 DO
#doSomething[#i] := TRUE;
END_FOR;
Soweit funktioniert es, aber wenn z.B. die Störung 1 ansteht werden alle anderen Störungen (2-10) nicht mehr angezeigt.
ok, gucke ich mir mal an. Danke erstmalWeil du die Schleife verlässt.
Die darf nicht verlassen werden. Allerdings musst du dann die OUT_Störung_aktiv ändern. Vor der Schleife ein Bool mit False initialisieren. An der Stelle, wo OUT_Störung_aktiv gesetzt wird das Bool auf True setzen (aber nicht auf False im Else Zweig). Nach der Schleife auf das Bool schauen und damit dann OUT_Störung_aktiv setzen.
kannst du das noch mal detaillierter schreiben?Weil du die Schleife verlässt.
Die darf nicht verlassen werden. Allerdings musst du dann die OUT_Störung_aktiv ändern. Vor der Schleife ein Bool mit False initialisieren. An der Stelle, wo OUT_Störung_aktiv gesetzt wird das Bool auf True setzen (aber nicht auf False im Else Zweig). Nach der Schleife auf das Bool schauen und damit dann OUT_Störung_aktiv setzen.
Das stimmt das man einiges weglassen kann, aber es ist für meine Kollegen ersichtlicher und verständlicher.Moin Smarty160484,
warum liegt das Problem am ROR? Das habe ich noch nicht ganz verstanden.
Davon abgesehen noch zwei Tipps für einen "eleganteren" Code:
IF:
Code:IF #boolBedinung = TRUE THEN // nicht elegant doSomething; END_IF; // besser: IF #boolBedingung THEN doSomething; END_IF; // negiert: IF NOT #boolBedingung THEN doSomething; END_IF;
FOR:
Code:FOR #i := 0 TO 9 BY 1 DO // nicht elegent #doSomething[#i] := TRUE; END_FOR; // "BY 1" ist in einer FOR-Schleife die default-Schrittweite. // Deshalb kann es entfallen. FOR #i := 0 TO 9 DO #doSomething[#i] := TRUE; END_FOR;
Bringe es ihnen doch direkt richtig bei.Das stimmt das man einiges weglassen kann, aber es ist für meine Kollegen ersichtlicher und verständlicher.
Man bedenke, das ich der einzige bin der sich zur Zeit mit SCL beschäftigt bzw. Programmiert und unserer jungen Kollegen sind noch nicht so weit!
offtopic:Hab es jetzt herausgefunden - der "EXIT" Befehl war der Krösus Knaktus
Ich hasse es, wenn Menschen Sprichwörter falsch benutzen. Die nerven wie Drahtseile!
#TempBool := FALSE;
FOR #TEMP_Index_Störung := 0 TO #Anzahl_Störungen DO
IF #STAT_Störungen[#TEMP_Index_Störung] THEN
#STAT_Störungen_gespeichert[#TEMP_Index_Störung] := TRUE;
//#OUT_Störung_aktiv := TRUE;
IF NOT #TempBool THEN
#OUT_Störung_aktuell := #TEMP_Index_Störung;
END_IF;
#TempBool := TRUE;
//EXIT;
ELSE
//#OUT_Störung_aktiv := false;
//#OUT_Störung_aktuell := 0;
END_IF;
IF #IN_Quit THEN
#STAT_Störungen_gespeichert[#TEMP_Index_Störung] := FALSE;
END_IF;
END_FOR;
#OUT_Störung_aktiv := #TempBool;
FOR #TEMP_index_Störungen_Word := 0 TO #Anzahl_Störungen_to_Word DO
#STAT_Sörungen_Word [#TEMP_index_Störungen_Word] := ROL(IN := #STAT_Störungen_to_Word [#TEMP_index_Störungen_Word], N := 8);
END_FOR;
den Jüngeren ja. Die Älteren wollen nicht, müssen aber damit arbeiten.Bringe es ihnen doch direkt richtig bei.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?