grauerwolf - 2015-12-07
ist erledigt, siehe am Ende des Beitrages...

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...

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