lokale Variable "hängt sich auf"

D

Dodo

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich "hätte mal gerne ein Problem", bei dem ich die Hilfe erfahrener S7 Programiierer brauche:
in einer S7 400 habe ich in einem FC eine lokale Variable (Bool) deklariert.
Ich benutze die Variable sozusagen als "Schmiermerker": Ich weise der Variablen ein VKE zu, und rufe dann einen FC auf, bei dem diese Variable einen Eingangsparameter bildet.

Nach dem Aufruf des FCs wird die Variable auf Null gesetzt.

Das ganze lieg monatelang problemlos.
Letzte Woche hatte ich folgende Erscheinung:
Die lokale Variable hatte immer den Wert "1", obwohl die Verknüpfungsbedingung nicht erfülllt war und (wie bschrieben), die Variable ja in jedem Zyklus gelöscht wird.
Ich habe die Zuweisung der Variable dann mal ganz gelöscht und nur noch in jedem Zyklus auf Null gesetzt, trotzdem hat die Variable im nächsten Zyklus
wieder den Wert 1.

Jemand ne Idee, woher so was herkommen kann?

Hier noch ein kurzer Programmauszug

//Drucker starten
U M 1010.2 //Startimpuls für Zebra Drucker
UN M 1016.6 //kein Fehler am Applizierer
S #Start_Drucker

//Drucker starten
CALL FC 1017
Trigger:=MB2012 //Triggerbyte
Start :=M2010.5 //Start Impuls
Spezial:=M0.0

U M 0.1 // Immer
R #Start_Drucker
 
Hupps, Schäm!

Da war in dem Programmauszug noch ein Fehler drin
(Nur hier, nicht im eigentlichen Progrmm):

//Drucker starten
U M 1010.2 //Startimpuls für Zebra Drucker
UN M 1016.6 //kein Fehler am Applizierer
S #Start_Drucker

//Drucker starten
CALL FC 1017
Trigger:=MB2012 //Triggerbyte
Start :=#Start_Drucker //Start Impuls
Spezial:=M0.0

U M 0.1 // Immer
R #Start_Drucker
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

versuch mal folgendes
und den Rücksetzbefehl weg lassen.

//Drucker starten
U M 1010.2 //Startimpuls für Zebra Drucker
UN M 1016.6 //kein Fehler am Applizierer
= #Start_Drucker // <==

//Drucker starten
CALL FC 1017
Trigger:=MB2012 //Triggerbyte
Start :=#Start_Drucker //Start Impuls
Spezial:=M0.0


gruss
frank
 
Hallo,
ich würde die lokale Variable vor der Erzeugung auf null setzen, damit sie vor der Abfrage initialisiert ist und nicht erst danach. Nebenbei gefragt: Macht ein Setzen einer lokalen Variablen in einem FC überhaupt Sinn?

U M 0.1 // Immer
R #Start_Drucker

//Drucker starten
U M 1010.2 //Startimpuls für Zebra Drucker
UN M 1016.6 //kein Fehler am Applizierer
S #Start_Drucker

//Drucker starten
CALL FC 1017
Trigger:=MB2012 //Triggerbyte
Start :=#Start_Drucker //Start Impuls
Spezial:=M0.0

Gruß

Andreas
 
wie oben schon geschrieben, mach aus dem setzen ne einfache Zuweisung. Damit stellst du sicher, daß die Variable das von dir benötigte VKE darstellt.
 
"lokale Variaben" im FC sind temporäre Lokaldaten und werden im Lokaldatenstack (L-Stack) abgelegt.
Bei der Deklaration wird dem FC nur der notwendige Bereich zur Verfügung gestellt, aber nicht initialisiert.
Die Werte im L-Stack sind beim Aufruf "zufällig", da der L-Stack ja auch von anderen Bausteinen verwendet wird.
Deshalb immer im Baustein initialiseren, es sei denn, es erfolgt eine Zuweisung, die auch nie übersprungen wird.
Bisher ging's, aber seit einer beliebigen Änderung geht's nicht mehr, ist ein typisches Symptom für fehlende Initialisierung.
mfG. Jo
 
Jo schrieb:
"lokale Variaben" im FC sind temporäre Lokaldaten und werden im Lokaldatenstack (L-Stack) abgelegt.
Bei der Deklaration wird dem FC nur der notwendige Bereich zur Verfügung gestellt, aber nicht initialisiert.
Die Werte im L-Stack sind beim Aufruf "zufällig", da der L-Stack ja auch von anderen Bausteinen verwendet wird.
Deshalb immer im Baustein initialiseren, es sei denn, es erfolgt eine Zuweisung, die auch nie übersprungen wird.
Bisher ging's, aber seit einer beliebigen Änderung geht's nicht mehr, ist ein typisches Symptom für fehlende Initialisierung.
mfG. Jo

Stimmt, da liegt der Hase im Pfeffer!
Ursprünglich war da mal eine Zuweisung, so dass die Variable automatisch initialisiert wurde.

Aus nem Grund, den ich selber nicht mehr genau weiss, hatte ich dass dann geändert zu nem Setz Befehl und hinterher wieder rückgesetzt!
Ich hab jetzt sowieso einfach nen "richtigen" Merker genommen!

Danke noch mal für die Infos!
 
Zurück
Oben