TIA Übergabewert wird nicht Null

Hallo,

ich habe in einem FB folgende Zeile programmiert:

Code:
#Alarm[#iSchritt] := #TON.Q;   // Alarm => Array[0..13] of Bool

Nun wird beispielsweise in Schritt 4 der Alarm ausgelöst - das klappt auch prima!

Frage:

Was müsste ich aber programmieren, dass - egal welcher Schritt den Alarm ausgelöst hat - der Alarm wieder rückgesetzt wird, wenn die SK wieder in Schritt 0 steht?

Anders gefragt - wie kann das ganze Array "genullt" werden? :confused:
 
Zuletzt bearbeitet:
Danke Sascha,

das heißt die Elemente eines Arrays können IMMER nur über eine Schleife auf Null gesetzt werden?
 
nö du kannst auch ein gleichartiges Array welches schon 0 hat draufmoven (Blockmove)

in SCL
Code:
#Alarm := #Alarmleer;

Bei grösseren Arrays ist das Zyklusfreundlicher. Bei Boolarrays kann es sinn machen ein Array aus DWORD oder Word per Sicht draufzulegen und dann per Schleife das WORDArray zu überarbeiten.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei einem FB in SCL kannst du folgendes schreiben:

Code:
VAR
   Alarm : ARRAY[0..12] OF BOOL;
   Reset_Alarm : ARRAY[0..12] OF BOOL := [13(FALSE)];
END_VAR

BEGIN
   Alarm := Reset_Alarm;
 
Zuletzt bearbeitet:
Noch eine Verständnisfrage hierzu:

Warum bleibt denn eigentlich das jeweilige Bit aus dem Array, z.B.

Code:
#Alarm[4] := #TON.Q;

gesetzt, wenn der Timer wieder "FALSE" wird? Es handelt sich hier doch "nur" um eine Zuweisung und nicht um ein Setzen! :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Zuweisung nur im Schritt 4 erfolgt und danach keine mehr, dann ändert sich an dem Zustand des Alarm-Bits nichts. Erst, wenn der Schritt 4 wieder aktiv wird, ändert sich das Bit, falls TON.Q sich verändert hat.
 
Wenn die Zuweisung nur im Schritt 4 erfolgt und danach keine mehr, dann ändert sich an dem Zustand des Alarm-Bits nichts. Erst, wenn der Schritt 4 wieder aktiv wird, ändert sich das Bit, falls TON.Q sich verändert hat.

Danke,

aber wenn die Zuweisung im Schritt 4 erfolgt und danach - z.B. durch Quittieren - der Schritt 0 eingenommen wird und dadurch auch der Timer wieder "FALSE" wird, dann wäre das doch eine NEUE Zuweisung für das Alarm-Bit, oder nicht?

Es bleibt aber trotzdem auf "TRUE".

Erst durch eine Schleife, oder Ähnliches wird es wieder auf Null gesetzt!
 
Nein, da dein Schritt 0 aktiv ist. Schritt 4 ja nicht mehr. Wie soll dann eine Zuweisung erfolgen? Im Schritt 0 machst du dann deine Array-Zuweisung, und alles ist Null, wenn resetet wird.
Zum Zeitpunkt deines Schritt-Resets war TON.Q ja noch "1" und somit der Alarm auch. Nach dem Reset wird Schritt "0" aktiv und TON.Q auch. Aber die Zuweisung in Schritt 4 wird nicht mehr aufgerufen.
Daher keine Zuweisung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, da dein Schritt 0 aktiv ist. Schritt 4 ja nicht mehr. Wie soll dann eine Zuweisung erfolgen? Im Schritt 0 machst du dann deine Array-Zuweisung, und alles ist Null, wenn resetet wird.
Zum Zeitpunkt deines Schritt-Resets war TON.Q ja noch "1" und somit der Alarm auch. Nach dem Reset wird Schritt "0" aktiv und TON.Q auch. Aber die Zuweisung in Schritt 4 wird nicht mehr aufgerufen.
Daher keine Zuweisung.

Hm, also bleibt der Zustand des Alarm-Bits, das es bei der Zuweisung (im Schritt 4) hatte, solange gespeichert, bis wieder der Schritt 4 zugewiesen wird und dann wird erst wieder eine neue Auswertung (je nach Zustand des Timers) getroffen ... hoffe es stimmt so? ;)

Dumme Frage - aber wo bleibt eigentlich der Zustand gespeichert - gibt es dafür spez. Speicherbereiche in der SPS?
 
Die Frage ist nicht dein Ernst :)? Bei über 700 Beiträgen.... Aber ok, ich helfe gerne ;)

Die SPS hat Speicherbereiche für Eingänge, für Ausgänge und für Merker, die flüchtig sind, was heißt, das bei Spannungsverlust oder Fehler, der einen CPU-Stopp auslöst, gelöscht werden. Bei den Merkern kann man noch einen Bereich definieren, der auch dann noch erhalten bleiben soll.
Zusätzlich hat man noch die Möglichkeit sich die DBs anzulegen, die ihren Wert auch bei Spannungsverlust behalten.

Bei der Bearbeitung eines Programms ändert sich der Wert eine Variable (E,A,M,DB) erst, wenn die SPS einen direkten Zugriff drauf macht. Wird diese Bearbeitung übersprungen, speichert sie den letzten Zustand so lange, bis dieser wieder aktiv bearbeitet wird. Auch wenn in der Zwischenzeit der zugewiesene Wert sich geändert hat.

Daher bleibt dein Bit solange "1" bis der Schritt 4 wieder aktiv wird, weil der Speicherbereich (in diesem Fall der Instanz-DB vom FB) den Wert solange beibehält, bis du ihm sagst, er soll sich ändern.

Beispiel: Ein Raum mit einem Männchen, der ein Schild hält hat ne Tür. Auf dem Schild steht nix. Nun kommst du zur Bearbeitung an die Stelle und machst die Tür auf. Dabei siehst du, das auf dem Schild nix steht. Also machst du die Tür zu und merkst dir, das auf dem Schild nix steht. Nun nimmt das Männchen ein anderes Schild in die Hand, darauf steht "Hallo". Du weißt davon aber nix. Erst wenn du wieder die Tür aufmachst, kannst du das Hallo lesen. Bis dahin bist du der Meinung, das auf dem Schild nix steht. Und so macht das auch die SPS :)
 
Zurück
Oben