TIA SCL Code beschreibt Array of Bool falsch

Hendrik2k1

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe ein Problem mit einer Programmierung in SCL. Mein Projekt soll Sensoren auswerten (Näherungssensor, nur Bool) und die Ergebnisse in einem Array of Bool abspeichern. Die Liste sollte eigentlich nach und nach, nachdem alle Sensoren testweise "von Hand" an der Anlage einmal ausgelöst worden sind, sich mit lauter TRUE werten füllen. Tut sie allerdings nicht. Es werden immer nur einzelne Einträge auf TRUE gesetzt und fallen dann wieder auf FALSE zurück, obwohl meiner Meinung die Programmierung in SCL das nicht zulässt.
Anbei der Code:

#i := 0;

FOR #i := 0 TO 7 DO
IF #InputArray[#i] = TRUE
THEN
#SensorID := #i;
EXIT;
END_IF;
END_FOR;

#SensorID_out := #SensorID;

IF #Sensor_List[#SensorID + (#Station_select - 1) * 8] = FALSE
THEN
#Sensor_List[#SensorID + (#Station_select - 1) * 8] := TRUE;
END_IF;


#Sensor_List_out := #Sensor_List;


Es sind 6 Station mit je 8 Sensoren, die abgelaufen und getestet werden. Station_select variiert zwischen 1 und 6. InputArray ist ein Array of Bools der Größe 8.
Meiner Meinung nach müsste die IF Abfrage es verhindern, dass einzelne Werte von Sensor_List wieder auf False zurückfallen.

Ich gebe zu, ich bin neu in SCL. Vielleicht übersehe ich irgendwas?
 
Wo ist denn Dein #SensorList deklariert? In welchem Variablenbereich... Wenn es der Temp-Bereich ist, vergißt er am Ende des Bausteins seine Werte.
Ist der Baustein überhaupt ein FB? Ein FC vergißt ebenfalls am Ende vom Aufruf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal anschaulicher in Code Brackets:

Code:
#i := 0; // doppelt, kann weg

FOR #i := 0 TO 7 DO
    IF #InputArray[#i] = TRUE THEN // Bool auf TRUE abfragen ist nicht notwendig
        #SensorID := #i;
        EXIT;
    END_IF;
END_FOR;

#SensorID_out := #SensorID;

IF #Sensor_List[#SensorID + (#Station_select - 1) * 8] = FALSE THEN
    #Sensor_List[#SensorID + (#Station_select - 1) * 8] := TRUE;
END_IF;

#Sensor_List_out := #Sensor_List;
 
Return mit Exit verwechselt, habs schon angepasst ;)

Aber ja, Screenshots der Datentypen und von der Funktion (+ Deklaration) wären hilfreich für den Codeschnipsel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mir aber gerade auffällt:
Wenn kein aktiver Sensor gefunden wird, ist #SensorID nicht gesetzt (ggf. also Null). Damit wird eigentlich immer, wenn nichts passiert, der Sensor 0 in Deinem Array gesetzt. Du mußt also eigentlich in der Schleife noch eine Hilfvariable setzen, OB Du mit Exit raus bist, oder ohne was zu finden durchgelaufen bist. Die nachfolgende IF-Abfrage muß dann noch die Hilfsvariable prüfen.
Alternativ kannst Du die SensorID vor dem Schleifendurchlauf mit einem unplausiblen Ergebnis (z.B. 99) vorbelegen und darauf prüfen.
 
Wo ist denn Dein #SensorList deklariert? In welchem Variablenbereich... Wenn es der Temp-Bereich ist, vergißt er am Ende des Bausteins seine Werte.
Ist der Baustein überhaupt ein FB? Ein FC vergißt ebenfalls am Ende vom Aufruf.
Screenshot.JPG

Es handelt sich um einen FB, mit einem Instanz Datenbaustein hinterlegt. Sensor_List ist tatsächlich Temp. Müsste es unter Static sein?
Oder müsste auch Sensor_List_out als Remanent geschaltet werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es handelt sich um einen FB, mit einem Instanz Datenbaustein hinterlegt. Sensor_List ist tatsächlich Temp. Müsste es unter Static sein?
Oder müsste auch Sensor_List_out als Remanent geschaltet werden?

Sensor_List muß in Static rein, Temp-Variablen liegen nicht im Instanz-Datenbaustein und werden nicht gespeichert.
Sensor_List_Out wird ja in jedem Zyklus neu geschrieben UND liegt im Instanz-Datenbaustein, somit wird der Wert nicht vergessen, Remanenz ist nur relevant, wenn Du Spannungsausfall hast, damit die Daten bis zum nächsten Einschalten gespeichert werden.
 
Anhang anzeigen 77583

Es handelt sich um einen FB, mit einem Instanz Datenbaustein hinterlegt. Sensor_List ist tatsächlich Temp. Müsste es unter Static sein?
Oder müsste auch Sensor_List_out als Remanent geschaltet werden?
Der Tempbereich ist flüchtig.. hält nur einen Zyklus die Daten. Ab in den statischen Bereich damit. Remanenz ist wieder etwas anderes.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mir aber gerade auffällt:
Wenn kein aktiver Sensor gefunden wird, ist #SensorID nicht gesetzt (ggf. also Null). Damit wird eigentlich immer, wenn nichts passiert, der Sensor 0 in Deinem Array gesetzt. Du mußt also eigentlich in der Schleife noch eine Hilfvariable setzen, OB Du mit Exit raus bist, oder ohne was zu finden durchgelaufen bist. Die nachfolgende IF-Abfrage muß dann noch die Hilfsvariable prüfen.
Alternativ kannst Du die SensorID vor dem Schleifendurchlauf mit einem unplausiblen Ergebnis (z.B. 99) vorbelegen und darauf prüfen.
Dafür kann die Abfrage auf FALSE wegfallen.
Spielt ja keine Rolle, wenn der Sensor gesetzt werden soll, ob er vorher schon gesetzt war oder nicht.
Entweder ist schon gesetzt oder er wird neu gesetzt, das Ergebnis ist also das Gleiche.

Ergibt in Summe in etwa sowas:
Code:
#SensorID := -1; // Wert für ungültig

FOR #i := 0 TO 7 DO
    IF #InputArray[#i] THEN
        #SensorID := #i;
        EXIT;
    END_IF;
END_FOR;

IF ##SensorID > -1 THEN  // Sensor gefunden
    #SensorID_out := #SensorID;
    #Sensor_List[#SensorID + (#Station_select - 1) * 8] := TRUE;
END_IF;

#Sensor_List_out := #Sensor_List;
+ die STATIC-Geschichte
 
Und dann weitergesponnen:
Soll SensorID_out sich nur ändern, wenn ein Sensor getätigt wurde, also auf ewig den letzten Wert halten?
Wie wird denn irgendwann die Sensor_List abgelöscht, um sie neu zu benutzen?
Code:
#SensorID := -1; // Wert für ungültig

1713867272909.png

Dann lieber SensorID := 99 ;)
Oder SensorID und SensorID_out auf INT ändern....
 
Zurück
Oben