Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
Hallo zusammen,
ich sitze schon stundenlang am gleichen Thema - da scheine ich eine Blockade zu haben. Ich will einen Funktionsbaustein schreiben, der x-mal mit verschiedenen Parametern aufgerufen wird - eigentlich ganz normal. Ein boolscher Eingang wechselt und bei einem Wechsel wird der zugehörige Text genau einmal in ein Logfile geschrieben. Zusätzlich wird die Flankenerkennung einen Zyklus lang nach aussen gegeben (OUTPUT_ON/OUTPUT_OFF).
VAR_OUTPUT
OUTPUT_ON:BOOL; (Aussgabesignal nach Flankenermittlung ON (1 Zyklus auf ON))
OUTPUT_OFF:BOOL; (Aussgabesignal nach Flankenermittlung OFF (1 Zyklus auf ON))
END_VAR
VAR
MERKE_SIGNAL:BOOL;
Log_Flanke_ON: R_TRIG;
Log_Flanke_OFF: F_TRIG;
Log_eintragen: Text_Logging; ( Textlogging ist auch ein FB, sollte hier aber keine Rolle spielen )
END_VAR
IF Log_Flanke_ON.Q THEN
Log_eintragen(log_text_input:=Text_ON); ( Das ist der eigentliche Zweck hier )
OUTPUT_ON:=Log_Flanke_ON.Q; ( Erkennen der Flanken einen Zyklus lang )
END_IF;
IF Log_Flanke_OFF.Q THEN
Log_eintragen(log_text_input:=Text_OFF); ( Leider knallts mir die Logfiles mit vielen gleichen Einträgen zu )
OUTPUT_OFF:=Log_Flanke_OFF.Q;
END_IF;
-----------------------[/color][/code]
Er soll dazu dienen, beim Wechsel des Zustandes eines boolschen Eingabesignals genau einmal pro Wechsel einen Logging-Eintrag zu machen.
Mein Problem ist, das die Signale Log_Flanke_ON.Q und Log_Flanke_OFF.Q bei der Anordnung von mehreren Aufrufen hintereinander nicht nur einen Zyklus auf ON gehen, sondern dort bleiben, und zwar dann, wenn der Eingang eines Aufrufes nicht identisch mit dem des nächsten Aufrufes ist. Also die F_TRIG/R_TRIG-Funktionalität ausser Kraft gesetzt ist .
Debuggt man das Ganze, erkennt man, das die Flags Log_Flanke_ON.M bzw. Log_Flanke_OFF.Q nicht gemerkt werden und damit bei weiteren Zyklen auf TRUE stehen bleiben - total entgegen meinem Wunsche.
Das Ganze wiederspricht doch dem Instanzen-Gedanken, daß sich Variable "gemerkt" werden.
Wo habe ich denn da den Denkfehler...
ich hatte nur eine Instanz definiert und die 4mal aufgerufen. Jetzt hat jeder Aufruf seinen eigenen Instanznamen - und siehe da ... es funktioniert !!! <<<<<
Viele Grüße
Thomas
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo zusammen,
ich sitze schon stundenlang am gleichen Thema - da scheine ich eine Blockade zu haben. Ich will einen Funktionsbaustein schreiben, der x-mal mit verschiedenen Parametern aufgerufen wird - eigentlich ganz normal. Ein boolscher Eingang wechselt und bei einem Wechsel wird der zugehörige Text genau einmal in ein Logfile geschrieben. Zusätzlich wird die Flankenerkennung einen Zyklus lang nach aussen gegeben (OUTPUT_ON/OUTPUT_OFF).
[code][color=#0000FF]
FUNCTION_BLOCK Logging_bei_EIN_AUS
VAR_INPUT
E_SIGNAL: BOOL;
Text_ON: STRING;
Text_OFF: STRING;
END_VAR
VAR_OUTPUT
OUTPUT_ON:BOOL; (Aussgabesignal nach Flankenermittlung ON (1 Zyklus auf ON))
OUTPUT_OFF:BOOL; (Aussgabesignal nach Flankenermittlung OFF (1 Zyklus auf ON))
END_VAR
VAR
MERKE_SIGNAL:BOOL;
Log_Flanke_ON: R_TRIG;
Log_Flanke_OFF: F_TRIG;
Log_eintragen: Text_Logging; ( Textlogging ist auch ein FB, sollte hier aber keine Rolle spielen )
END_VAR
Log_Flanke_ON (CLK:=E_SIGNAL);
Log_Flanke_OFF(CLK:=E_SIGNAL);
IF Log_Flanke_ON.Q THEN
Log_eintragen(log_text_input:=Text_ON); ( Das ist der eigentliche Zweck hier )
OUTPUT_ON:=Log_Flanke_ON.Q; ( Erkennen der Flanken einen Zyklus lang )
END_IF;
IF Log_Flanke_OFF.Q THEN
Log_eintragen(log_text_input:=Text_OFF); ( Leider knallts mir die Logfiles mit vielen gleichen Einträgen zu )
OUTPUT_OFF:=Log_Flanke_OFF.Q;
END_IF;
-----------------------[/color][/code]
Er soll dazu dienen, beim Wechsel des Zustandes eines boolschen Eingabesignals genau einmal pro Wechsel einen Logging-Eintrag zu machen.
Mein Problem ist, das die Signale Log_Flanke_ON.Q und Log_Flanke_OFF.Q bei der Anordnung von mehreren Aufrufen hintereinander nicht nur einen Zyklus auf ON gehen, sondern dort bleiben, und zwar dann, wenn der Eingang eines Aufrufes nicht identisch mit dem des nächsten Aufrufes ist. Also die F_TRIG/R_TRIG-Funktionalität ausser Kraft gesetzt ist .
Debuggt man das Ganze, erkennt man, das die Flags Log_Flanke_ON.M bzw. Log_Flanke_OFF.Q nicht gemerkt werden und damit bei weiteren Zyklen auf TRUE stehen bleiben - total entgegen meinem Wunsche.
Das Ganze wiederspricht doch dem Instanzen-Gedanken, daß sich Variable "gemerkt" werden.
Wo habe ich denn da den Denkfehler...
Viele Grüße
Thomas