Problem mit Temp-Variable im FC

Bär1971

Level-1
Beiträge
220
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe in einem FC eine Schleife programmiert, welche nur einmal durchlaufen soll, wenn eine Eingangsvariable (#aktive_DatensatzNr [INT]) den Wert ändert.
Versucht habe ich es indem ich eine Temp-Variable (#Temp_aktiver_Datensatz [INT]) angelegt habe, und diese mit der Eingabsvariable vergleiche um den Durchlauf der Schleife zu starten.

Das Problem ist, das die Schleife immer durchlaufen wird, da die Temp-Variable nicht den Wert hat, den ich ihr zuweise.
Lege ich die Temp-Variable in den Bereich Ein-Ausgangsvariable und weise ihr beim Bausteinaufruf des FC´s eine Adresse in einem Datenbaustein zu, funktioniert es.

Allerdings finde ich es unschön, an einem FC-Aufruf "Variablenspeicher" anhängen zu müssen. Gibt es da vielleicht eine elegantere Lösung?

Hier mal der Code-Auszug:

Code:
        SET   
        U(    
        L     #aktive_DatensatzNr
        L     #Temp_aktiver_Datensatz
        <>I   
        )     
        SPBN  _002
        AUF   DB [#t_Datenbank_Nr]
        L     #Startadr_akt_Datensatz
        SLW   3
        LAR1  
        AUF   DI [#t_User_DB_Nr]
        L     #Startadr_Datensatz_HMI
        SLW   3
        LAR2  
        L     #Groesse_Datensatz
Loo1: T     #LOOP_Count_1
        L     DBB [AR1,P#0.0]
        T     DIB [AR2,P#0.0]
        +AR1  P#1.0
        +AR2  P#1.0
        L     #LOOP_Count_1
        LOOP  Loo1
        L     #aktive_DatensatzNr
        T     #Temp_aktiver_Datensatz
_002: NOP   0
 
Der FC "vergisst" die Temps bei seinem Ende. Ist ja auch Sinn der Sache. Oder Du machst nen FB mit IDB.

Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grins...

Da bist Du in die Falle des TEMP gefallen.

Die TEMP-Variablen eines FC sind genau das wie sie heissen - nämlich teporär.
Das heist wenn Dein FC durchgelaufen ist vergiss die CPU sie einfach - oder schreibt irgendwelche werte 'rein.

Um das so zu lösen kannst Du entweder einen FB draus machen und statische Variablen nehmen oder in dem FC in Merkerwort oder so was implementieren.

dtsclipper
 
Zuletzt bearbeitet:
Ein FC ist einen "dumme" Funktion, die Du mehrfach aufrufen kannst. Woher soll er denn "wissen" in welchem Aufruf er ist, und das seine gespeicherte TEMP Variable zu diesem Aufruf gehört oder nicht.

Thomas
 
Das ein FC seine Temp-Variablen am Bausteinende verliert ist mir (jetzt) richtig bewusst geworden, aber ich suche eben noch eine Lösung die innerhalb eines FC´s funktioniert, um eben die Schleife nur in Abhängigkeit einer Wertänderung der Eingangsvariablen (#aktive_DatensatzNr [INT]) durchlaufen zu lassen. Da muss es doch irgendwas geben ?!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein FC ist einen "dumme" Funktion, die Du mehrfach aufrufen kannst. Woher soll er denn "wissen" in welchem Aufruf er ist, und das seine gespeicherte TEMP Variable zu diesem Aufruf gehört oder nicht.

Thomas
irritierend ist hierbei, das die Inhalte der Adressregister und der Schleifenzähler erhalten bleiben...
(Aber das mit der TEMP-Variable ist jetzt klar)
 
Das ein FC seine Temp-Variablen am Bausteinende verliert ist mir (jetzt) richtig bewusst geworden, aber ich suche eben noch eine Lösung die innerhalb eines FC´s funktioniert, um eben die Schleife nur in Abhängigkeit einer Wertänderung der Eingangsvariablen (#aktive_DatensatzNr [INT]) durchlaufen zu lassen. Da muss es doch irgendwas geben ?!?

Dann werte die Werteänderung extern aus, und ruf die Funktion nur auf, wenn sich was geändert hat. Oder Du benutzt "nichtflüchtige" Zwichenspeicher um eine Werteänderung zu erfassen, must aber bei einem mehrfachen Aufruf der Funktion darauf aufpassen.

Thomas
 
naja, das Problem ist, in diesem Baustein läuft mein gesamtes Datenbankhandling ab. Es geht wirklich ausschliesslich um diese eine Schleife welche eben nur einmal durchlaufen werden darf bei Änderung der Anwahl. Ich möchte den FC ungern in 4 oder mehrere FC´s aufteilen, nur um diese eine Teilfunktion einzeln aufzurufen...

Ich weis, ist nicht immer einfach mit mir *grins*
 
Wenn Du nur den einen Aufruf hast, dann nimm statt TEMP Merker oder ein Datenwort in nem DB.
Thomas

Derzeit nehm ich ja ein externes Datenwort in einem Datenbaustein. Ich hatte nur die Hoffnung das jemand eine FC-interne Lösung weis um die Änderungsauswertung zu realisieren...

Trotzdem mal Danke für Deine Mithilfe beim Denken
 
@Bär:
ich habe jetzt immer noch nicht so recht den Sinn deiner Maßnahme verstanden - aber ... was spricht denn gegen den schon gemachten Vorschlag mit dem FB. Der könnte sich ja (im STAT-Bereich) etwas "merken".

Aber davon mal unabhängig. Von wo kommt denn deine Referenzgröße ? Doch nicht aus dem Baustein sondern von außen - was spricht dann also dagegen, den Wert via IN-Parameter zu übergeben und das Ergebnis dann via OUT-Parameter auszugeben ...?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jepp, ich sehs ein, was ich machen mag geht wohl nur über die Lösung, welche ich ja schon habe. Als IN/OUT-Variable mit externer DB-Adresse....

Hätte ja sein können dass doch.....

Und Lust auf ´n Bier hab ich jetzt auch *grins*

Trotzdem mal Danke fürs Mitdenken an alle...
 
Zurück
Oben