OUT - Variable in FC lesen

scrolllkock

Level-2
Beiträge
112
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe hier ein Programm das ich nicht verstehe.
Meines Wissens soll man OUT Variablen nur lesen, wenn sie im Baustein weiter oben zugewiesen (mit =) worden sind.
z.B.

u e0.0
= #out_x

u e0.1
u #out_x
= m0.1

Hier ist ein "Standard"-Programm das in vielen Maschinen bei Kunden läuft.

z.B.

u e0.1
u #out_x
= m0.1

u e0.0
= #out_x

Ist nicht bei jedem Aufruf #out_x erstmal unsicher?
oder

u e1.0
fp m1.0
s #out_y
u e2.0
r #out_y

u #out_y
u e3.3
= m1.4

Wenn hier #out_y zugewiesen wird (Impuls) ist #out_y weiter unten natürlich 1. Was passiert im zweiten Aufruf? #out_y wird nicht mehr gesetzt, aber der Merker außerhalb des FC = true.

Das Programm läuft auch, aber warum brauche ich dann noch INOUT - Variablen?
 
Hallo,
ist es denn eine OUT- oder eine IN_OUT-Variable ?
Wenn es eine OUT-Variable bei einem FC ist, dann hast du Recht. Bei einem FB wäre das so OK (der kann es sich merken ...).

Gruß
LL
 
Sehr dubios!!!
Eine Mischung aus Externen und Internen Variablen ist das auch noch!!!
Toller Softwareentwickler!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ist ein FC und ist OUT-Variable. Und ist im ganzen Programm immer wieder mal so gemacht.


au weia ... soweit ich weis, steht in einem "unbeschiebenen" OUT von
einem FC nur alter "STACK"-Mist von irgenwelchen vorherigen
SPS-Programmteilen drin. Das kann 1000 * gutgehen aber irgendwann
knallt es.

Gruß
 
Hallo zusammen,

IHMO werden bei einem FC-Aufruf Referenzen auf die Parameter übergeben. Damit wird innerhalb des FC direkt aus dem übergeben Parameter gelesen.

Es wird also schon funktionieren, schön ist's aber nicht.
 
@yy1:
das habe ich auch schon mal irgendwo gelesen und daraufhin versucht, das nachzustellen ... hat bei mir nicht funktioniert ...
Ich habe allerdings Werte verwendet, die "by Value" (also alles bis Größe Doppelwort) und nicht welche, die "by Referenz" (also z.B. Pointer etc.) übergeben werden ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab' jetzt auch noch einmal versucht das nachzustellen - bei mir funktioniert's (BOOL - also wie im Beispiel von scrolllkock - und INT).

@Larray Lafer: woran ist's bei Dir gescheitert?
 
@yy1:
ich habe mir einen FC geschrieben mit 2 OUT-Variablen (Var_1 und Var_2) vom Typ BOOL.
In dem FC habe ich dann programmiert :
Code:
U #Var_2
= #Var_1
Ich kann nun von aussen am dem FC die Var_2 mit "1" und "0" beschalten, wie ich will - es ändert sich nichts am Zustand von Var_1 (in meinem Fall bleibt es "0").

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

IHMO werden bei einem FC-Aufruf Referenzen auf die Parameter übergeben. Damit wird innerhalb des FC direkt aus dem übergeben Parameter gelesen.

Es wird also schon funktionieren, schön ist's aber nicht.


Du hast fast Recht, Referenzen werden bei einfachen Parameter übergeben: z.B. Merker, bei komplexen z.b. ein Datenbit wirds über den Umweg L-Stack gemacht.

Beispiel:
aus AWL-Code
Code:
      CALL  FC  1000
       IN :=M10.0
       OUT:=M100.0

wird auf der CPU folgender Code ausgeführt (es wird im FC direkt auf Merker gelesen und geschrieben)

Code:
      BLD   1
      =     L     20.0
      UC    FC  1000
 
            P#M 10.0
            P#M 100.0
      BLD   2

Beispiel für AWL DB-Zugriff:

Code:
      CALL  FC  1000
       IN :="DB".bool_1
       OUT:="DB".bool_2

wird: (Umschichtung über Lokaldaten => Inhalt des OUT-Parameters ist dann vor Zuweisung zufällig)

Code:
      BLD   1
      =     L     20.0
      AUF   "DB"
 
      U     DBX    0.0
      =     L     20.1
      UC    FC  1000
            P#L 20.1
            P#L 20.2
      U     L     20.2
      AUF   "DB"
      =     DBX    0.1
      BLD   2
 
Du hast fast Recht, Referenzen werden bei einfachen Parameter übergeben: z.B. Merker, bei komplexen z.b. ein Datenbit wirds über den Umweg L-Stack gemacht.

Beispiel:
aus AWL-Code
Code:
      CALL  FC  1000
       IN :=M10.0
       OUT:=M100.0
wird auf der CPU folgender Code ausgeführt (es wird im FC direkt auf Merker gelesen und geschrieben)

Code:
      BLD   1
      =     L     20.0
      UC    FC  1000
 
            P#M 10.0
            P#M 100.0
      BLD   2
Beispiel für AWL DB-Zugriff:

Code:
      CALL  FC  1000
       IN :="DB".bool_1
       OUT:="DB".bool_2
wird: (Umschichtung über Lokaldaten => Inhalt des OUT-Parameters ist dann vor Zuweisung zufällig)

Code:
      BLD   1
      =     L     20.0
      AUF   "DB"
 
      U     DBX    0.0
      =     L     20.1
      UC    FC  1000
            P#L 20.1
            P#L 20.2
      U     L     20.2
      AUF   "DB"
      =     DBX    0.1
      BLD   2

Hallo,

jetzt verstehe ich auch warum wir (ich) manchmal Probleme haben bei Out-Variablen und manchmal nicht. Wir nutzen Merker und in Programmübergaben Datenbausteine. Wenn ich das richtig verstanden habe, gehen Merker wegen übergabe einer Referenz, aber Datenbausteine gehen nicht da die Zuweisung wirklich erst am Ende des FC erfolgt. Richtig?!? Ich glaube ich muss ein paar Bausteine umschreiben:rolleyes:

Woher kann man eigentlich so was wissen? Steht das irgendwo zum nachlesen (und Kollegen/Chefs zeigen)?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

jetzt verstehe ich auch warum wir (ich) manchmal Probleme haben bei Out-Variablen und manchmal nicht. Wir nutzen Merker und in Programmübergaben Datenbausteine. Wenn ich das richtig verstanden habe, gehen Merker wegen übergabe einer Referenz, aber Datenbausteine gehen nicht da die Zuweisung wirklich erst am Ende des FC erfolgt. Richtig?!? Ich glaube ich muss ein paar Bausteine umschreiben:rolleyes:

Woher kann man eigentlich so was wissen? Steht das irgendwo zum nachlesen (und Kollegen/Chefs zeigen)?

Du hast es genau richtig verstanden!

Deinen Chef/Kollegen kannst Du dies mit SCL demonstrieren
Übersetze folgende SCL-Quelle:

Code:
DATA_BLOCK DB1000
    STRUCT
        BOOL1: BOOL;
        BOOL2: BOOL;               
    END_STRUCT
BEGIN
END_DATA_BLOCK
 
 
 
FUNCTION FC1000 : VOID
VAR_INPUT
    IN: BOOL;
END_VAR
VAR_OUTPUT
    OUT:BOOL;
END_VAR
BEGIN
   OUT:=IN AND NOT OUT ; 
END_FUNCTION
 
 
 
FUNCTION FC2000 : VOID
BEGIN
   FC1000(IN := M20.0 ,OUT := M20.1); 
   FC1000(IN := DB1000.BOOL1 ,OUT := DB1000.BOOL2);   
END_FUNCTION

Dann öffne den AWL-Editor und öffne den FC2000

Code:
      SET   
      SAVE  
      =     L      0.1
      UC    FC  1000
            P#M 20.0
            P#M 20.1
      U     DB1000.DBX    0.0
      =     L      0.2
      UC    FC  1000
            P#L 0.2
            P#L 0.3
      U     L      0.3
      =     DBX    0.1
      U     L      0.1
      SAVE  
      BE
 
jetzt verstehe ich auch warum wir (ich) manchmal Probleme haben bei Out-Variablen und manchmal nicht. Wir nutzen Merker und in Programmübergaben Datenbausteine. Wenn ich das richtig verstanden habe, gehen Merker wegen übergabe einer Referenz, aber Datenbausteine gehen nicht da die Zuweisung wirklich erst am Ende des FC erfolgt. Richtig?!? Ich glaube ich muss ein paar Bausteine umschreiben:rolleyes:

Woher kann man eigentlich so was wissen? Steht das irgendwo zum nachlesen (und Kollegen/Chefs zeigen)?

Siehe dazu die folgende Siemens-FAQ:

2. Versorgung der elementaren Ein- und Ausgangsparameter

Bei der Versorgung von elementaren Formalparametern (z.B. die Datentypen BOOL, BYTE, WORD oder DWORD) der Schnittstelle einer Funktion sind zwei Fälle zu unterscheiden.
  1. Der elementare Formalparameter wird mit einem Merker, einem Ein- oder Ausgang aus dem Prozessabbild oder aus dem Lokaldatenstack (L-Stack) des aufrufenden Bausteines versorgt.
    In diesem Fall arbeitet der Code der Funktion mit einem bereichsübergreifenden Zeiger direkt(!) auf diesen elementaren Aktualparametern (z.B. P#E0.0, P#M0.0).
  2. Der elementare Formalparameter wird mit einer Konstanten oder einem Datenbausteinelement versorgt.
    In diesem Fall wird der Wert des Aktualparameters vor dem Aufruf der Funktion in den L-Stack des aufrufenden Bausteines kopiert. Der Code der Funktion arbeitet dann mit einem bereichsübergreifenden Zeiger auf diesen Lokaldatenbereich des aufrufenden Bausteines.
    Beachten Sie bitte, dass bei Ausgangsparametern keine Initialisierung erfolgt und die Eingangsparameter nicht gelöscht werden. Deshalb ist in diesem Fall darauf zu achten, dass Eingänge nur gelesen und Ausgänge in jedem Zyklus geschrieben werden. Bei Befehlen wie "S" oder "R" wird das Signal nur abhängig vom VKE geschrieben. Deshalb sollten Sie diese Befehle durch die Zuweisung "=" ersetzen oder die Werte vor der Abfrage initialisieren.
    Wenn Sie das Beschreiben der Werte nicht in jedem Zyklus sicherstellen können, sollten Sie einen IN/OUT- Parameter verwenden.

ID189227: Warum liefert eine Funktion bei den OUT-Parametern sporadisch falsche Rückgabewerte und was ist bei der Parametrierung der Ein- und Ausgangsparameter zu beachten?

Gruß Kai
 
Deinen Chef/Kollegen kannst Du dies mit SCL demonstrieren

zum glück geht das auch anders ... es ist kein hexenwerk den "eigentlichen code" anzuzeigen ... auch ohne SCL

@LL: hast du meine pdf noch? kannst du die mir nochmal zurückschicken? das letzte vista-update ist fehlgeschlagen und alle meine lokalen dokumente sind hopps gegangen... danke!
 
zum glück geht das auch anders ... es ist kein hexenwerk den "eigentlichen code" anzuzeigen ... auch ohne SCL

Wie geht es ohne SCL? Hab ich leider nicht.

Das wird dir 4L nicht verraten, irgendwie sitzt er da drauf. Hab schon mehrere Male versucht, daß er mal die Anleitung dazu rausrückt, entweder er weiß es selbst nicht mehr oder er will es nicht rausrücken. *ROFL*

Versuchs mal damit, den betreffenden Baustein von Online in ein leeres Projekt zu kopieren, vielleicht dann.
 
Zurück
Oben