TIA FB Array überwachen

TECO

Level-2
Beiträge
32
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich habe mir einen FB geschrieben in dem ich eine Auftragsverwaltung stattfindet.
Die Aufträge werden mit nummern Gesetzt und von einer andern Stelle zurückgesetzt.
Das ganze soll in einer CPU 1500 statt finden mit dem TIA Portal.
Jetzt zu meinem Problem:
im FB habe ich einen Array[0..20] of Bool = 20 Aufträgen.
Sobald ein Auftrag gesetzt ist darf kein anderer gesetzt werden.
Gibt es eine Möglichkeit das Array zu überwachen?

Danke schon mal für eure Hilfe
 
Ganz kurz aus der Hüfte geschossen:

Code:
#tempOneCommandActive := FALSE;
#tempSecondCommandFound := FALSE;

FOR i := #tempFirstCommand TO #tempLastCommand DO
    
    IF #array[#i] AND NOT #tempOneCommandActive THEN
        #tempOneCommandActive := TRUE;
    END_IF;
    
    IF #array[#i] AND #tempOneCommandActive THEN
        #tempSecondCommandFound := TRUE;
        EXIT;
    END_IF;
    
END_FOR;

Mit #tempSecondCommandFound kannst du dann weitere Shenanigans anstellen
 
Bin jetzt nicht ganz so der SCL Mensch, aber gibt es nicht die Möglichkeit das ganze so irgendwie zu machen?

//Auftrag Array[0..20] of Bool

IF #Auftrag > 1 THEN
#Auftag_aktive := TRUE;
Else
#Auftrag := false;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
//Auftrag Array[0..20] of Bool

IF #Auftrag > 1 THEN
#Auftag_aktive := TRUE;
Else
#Auftrag := false;
END_IF;

Das funktioniert so nicht. Es lassen sich nur die einzelnen Elemente eines Arrays überprüfen nicht das gesamte auf einmal. Ein Array kann auch aus zusammengesetzten Datentypen bestehen. Wie willst du da irgendwas auf eine Ganzzahl vergleichen?

Benutze eine FOR- Schleife wie sie Januar oben gezeigt hat oder programmier die Abfrage für das komplette Array Zeile für Zeile aus.
 
Hallo Teco,

im folgenden Code wird in dem Bit "AuftragVorhanden" gespeichert, ob mind. ein Feld des Arrays "Auftraege" TRUE ist.
Zunächst wird das Bit "AuftragVorhanden" mit FALSE initialisiert.
Dann wird innerhalb einer FOR-Schleife geprüft, ob ein Feld des Arrays "Auftraege" TRUE ist. Ist das der Fall, wird die FOR-Schleife durch das EXIT sofort verlassen. Nur in dem Fall, dass kein einziger Auftrag gesetzt ist, bleibt das Bit "AuftragVorhanden" auf FALSE.

Code:
AuftragVorhanden := FALSE;
// Überprüfen, ob bereits ein Auftrag gesetzt ist
FOR i := 0 TO 20 DO
    IF Auftraege[i] THEN
        AuftragVorhanden := TRUE;
        EXIT;
    END_IF;
END_FOR;

Viele Grüße,
Flo
 
Man könnte auch ein zweites Array der gleichen Größe anlegen mit allen Werten = 0 und die Arrays einfach vergleichen:
#istleer := Work_Array = Leer_Array;
und die Effizienz/Schleife dem SCL-Compiler überlassen. Vielleicht kennt der Compiler was effizienteres als eine Schleife? :cool:
Bei "gleich" (#istleer ist TRUE) sind alle Elemente gleich 0, bei "ungleich" (#istleer ist FALSE) ist (schon) mindestens 1 Element ungleich 0.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man könnte auch ein zweites Array der gleichen Größe anlegen mit allen Werten = 0 und die Arrays einfach vergleichen:
#istleer := Work_Array = Leer_Array;
und die Effizienz/Schleife dem SCL-Compiler überlassen. Vielleicht kennt der Compiler was effizienteres als eine Schleife? :cool:
Bei "gleich" (#istleer ist TRUE) sind alle Elemente gleich 0, bei "ungleich" (#istleer ist FALSE) ist (schon) mindestens 1 Element ungleich 0.
Oder auf ungleich leer, ginge ja auch.. wenn natürlich der Rest so sauber ist, dass nur ein Bool gewinnt beim Auftrag setzen.
sag ich doch 🤪
 
Bei einem Array of Bool dieser Größe könnte man auch eine AT-Sicht als DINT drauf legen und die Variable dann einfach auf ungleich 0 vergleichen ...
 
Morgen,
danke für die ganzen Tipps.
Ich habe mich für die einfache Variante entschieden.

Ich kann mich nur nochmals bedanken

Gruß Teco
 
Ich habe mich für die einfache Variante entschieden.
ich habe die Variante von Florian genommen
Falls du später mal die Auftragsverwaltung auf z.B. 32 Bits vergrößern willst, dann musst du bei der "einfachen" handgestrickten Schleife an mehreren Stellen Code anpassen. Beim Vergleich mit einem Leer-Array brauchst du nur die Array-Größe anpassen und übersetzen und fertig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls du später mal die Auftragsverwaltung auf z.B. 32 Bits vergrößern willst, dann musst du bei der "einfachen" handgestrickten Schleife an mehreren Stellen Code anpassen.
Daher immer globale Konstante(n) für Array- und die zugehörige(n) Schleifengrenze(n) verwenden, dann ist es nur eine einzige Stelle, an der man das Array (und damit auch das Programm) auf die benötigte Größe anpasst.


PS:
Wobei ich für so 'nen Vergleich auch lieber ein Leer-Array verwende.
Das kann dann auch gleich zum Ablöschen/Initialisieren des Array's verwendet werden, wenn man den Ausgangszustand wieder herstellen möchte.
 
Zuletzt bearbeitet:
Zurück
Oben