Problem mehrfach Aufruf FC

Ladwig

Member
Beiträge
9
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Zusammen,

ich habe einen FC selbst erstellt ohne Globaldaten zu verwenden um in Bibliothek-Fähig zu halten.
Hier der FC:

Code:
[COLOR=#222222][FONT=Verdana]FUNCTION"FC42_Korrektur_Zeit2" : VOID
TITLE =Ändern einer Zeit im Sekundenraster
//Über diesen Baustein kann eine Zeit die im Sekundenraster vorliegt im 
//Sekundenraster nach oben und unten korriegiert werden.
//Wertebereich 0-999sek - 999sek = 16m39s
{ S7_language := '9(1) Englisch (USA) 21.12.2007 10:50:25' }
AUTHOR : Ludwig
VERSION : 1.0[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]
VAR_INPUT
Enable : BOOL ; //Start des Bausteins
Grundzeit_sec : INT ; //Grundzeit in Sekunden 
Zeitkorrektur_sec : INT ; //Zeiteingabe Zeitkorrektur in Sekunden
END_VAR
VAR_OUTPUT
Erg_Zeit_BCD_sec : WORD ; //Umgerechnete Zeit +/- Korrektur in Sekunden mitZeitbasis
Erg_Zeit_DEC_sec : INT ; //Umgerechnete Zeit +/- Korrektur in Sekunden ohneZeitbasis
END_VAR
VAR_TEMP
tmp_Korrektur : INT ; 
tmp_Ergebnis : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Kontrolle ob Zeiteinbgabe Positiv oder Negativ[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]UN #Enable; 
SPB end; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]U( ; 
L #Grundzeit_sec; 
L #Zeitkorrektur_sec; 
<I ; 
) ; 
O( ; 
L #Grundzeit_sec; 
L #Zeitkorrektur_sec; 
OW ; 
L 0; 
==I ; 
) ; 
SPB e001; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]U( ; 
L #Zeitkorrektur_sec; 
L 0; 
<I ; 
) ; 
SPB c001; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]NETWORK
TITLE =Umrechnung der Zeit bei Toleranz Positiv[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]L #Grundzeit_sec; 
L #Zeitkorrektur_sec; 
+I ; 
T #tmp_Ergebnis; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]SPA d001; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]NETWORK
TITLE =Umrechnung der Zeit bei Toleranz Negativ[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]c001: NOP 0; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]L #Zeitkorrektur_sec; 
L -1; 
*I ; 
T #tmp_Korrektur; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]L #Grundzeit_sec; 
L #tmp_Korrektur; 
-I ; 
T #tmp_Ergebnis; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]NETWORK
TITLE =Auswertung ob Zeit 0-999sek, wenn OK und Wert nach Ausgabe[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]d001: NOP 0; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]U( ; 
L #tmp_Ergebnis; 
L 0; 
<I ; 
) ; 
O ; 
U( ; 
L #tmp_Ergebnis; 
L 999; 
>I ; 
) ; 
SPB e001; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]L #tmp_Ergebnis; 
T #Erg_Zeit_DEC_sec; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]L #tmp_Ergebnis; 
ITB ; 
L W#16#2000; 
OW ; 
T #Erg_Zeit_BCD_sec; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]SPA end; 
NETWORK
TITLE =Rückgabewert auf 0 bei nichtausführung oder Fehler[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]e001: NOP 0; 
SET ; 
L 0; 
T #Erg_Zeit_BCD_sec; 
T #Erg_Zeit_DEC_sec; 
NETWORK
TITLE =[/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]end: NOP 0; [/FONT][/COLOR]
[COLOR=#222222][FONT=Verdana]END_FUNCTION[/FONT][/COLOR]


Mein Problem ist nun folgendes.
Wenn ich diesen FC aus einem anderen FC aus unterschiedlichen Netzwerken mehrfach aufrufe wird er mehrfach durchlaufen obwohl das Enable-Bit nur in einemNetzwerk für einen Zyklus True ist.
Es werden somit alle Out-Variablen aller aufrufe geändert (Doppelbelegungen liegen nicht vor). Die In-/Outvariablen sowie das Enable-Bit liegen einem DB.Zudem wird wenn das Enable-Bit auf False steht an der OutvariableErg_Zeit_BCD_sec ein Wert von H7861 ausgegeben, wo auch immer dieser Fabelwert herkommt. Darauf kann ich mir keinen Reim machen. Den wenn das Enable-Bit nicht aktiv ist wird ja nur ans Ende des FC‘s gesprungen und die oben genannte Out-Variablen eigentlich gar nicht verändert.

Ich habe das Problem zwar schon gelöst indem ich aus den Out-Variablen einfach IN-/Out-Variablen gemacht habe. Warum es nun allerdings mit dem Enable-Bitfunktioniert versteh ich nicht wirklich.
Dies hat doch nicht mit Outvariablen bzw. In-/Outvariablen zu tun.

Kann mich dazu zufälligerweise jemand aufklären?
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
17.562
Punkte Reaktionen
5.166
Zuviel Werbung?
->Hier kostenlos registrieren
Wenn ein FC aufgerufen wird, dann muß er seinen OUT-Parametern auch etwas zuweisen. Davon geht der unsichtbare Aufruf-Code aus, der aus den FC-OUT-Parametern auf die OUT-Aktualparameter kopiert.

Wenn der FC nichts tun soll, dann besser gar nicht aufrufen --> also bedingt aufrufen oder den Aufruf überspringen.

In FUP/KOP hat der Baustein noch einen EN-Eingang, der genau für den bedingten Aufruf da ist. Schreibe Deine Aufrufbedingung an diesen EN-Eingang statt Deinem Enable-IN-Parameter. Das ist das für solche Sachen vorgesehene Standard-Vorgehen.

Harald
 
Oben