Problem mit OUT Variabeln

explorer42

Level-2
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe folgendes Problem. Hab zwar Step7 Hilfen und Forum durchgestöbert aber bin nicht schlauer geworden:(.
Ich habe einen FC mit OUT Variablen. Diese Out Variabeln werden mit Eingängen zyklisch beschrieben d.h. ist eine zuweisung sprich.

U E1.0
= #Release


Der FC wird von einem FB aufgerufen. Die Out Variable speichere ich in eine Stat variable von dem aufrufenden FB ab. Diese Stat variable lege ich dann auf einen anderen FC als Freigabe IN Variable z.B. für ein Zylinder.
Das Problem ist das der Zylinder vorher schon fährt obwohl er noch nicht die Freigabe bekommen. Lege ich den Eingang auf den FC direkt an oder ich deklariere die out variable als INout Variable klappt alles wunderbar.
Ich weiss das immer der letzt gespeicherte Wert geladen wird beim Aufruf eines FBs. Aber die Anlage ist sehr langsam d.h Schrittkette sind nacheinander es gibt keine überschneidenen Prozesse, das ich irgendwelche zeitliche überschneidungen bekommen sollte.

Danke im Voraus für eure Antworten.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry,aber OUT Variablen mit Eingängen beschreiben???
Denk mal nach, ob das funktioieren kann.

Warum nicht, geht auf jeden Fall.
Was nicht geht, ist im Baustein lesend auf den Out zuzugreifen, und danach sieht es hier aus.
@explorer42
Wenn es mit In-Out geht, warum lässt du es nicht dabei ?
 
Nein, ich beschreibe nur die Out variable ich lese sie intern nicht aber warum soll lesen nicht gehen wenn ich die Variable vorher zugewiesen habe? Ich speichere die out Variable ausserhalb in eine stat variable und versuche sie in einen anderen FC über einen IN Eingang zu lesen.
Warum ich nicht INOUT nicht nehme? Macht für mich keinen logischen Sinn. Weil ich den Zustand eines Sensors lese und ausgeben möchte d.h. es läuft in eine Richtung. Aber INOUT bedeutet für mich eine Variable lesen bearbeiten und dann wieder beschreiben.
 
Zeig mal deinen Code her falls er nicht streng geheim ist.
Dann kann man sich ein besseres Bild machen.


Code:
Call FC1
OUT1:=E0.0
OUT2:=A0.0
 
im FC
 
U #OUT1
= #OUT2
Funktioniert so nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FC-OUT lesen und weiterverarbeiten

In FC kann man durchaus Ausgangsparameter lesen, macht aber nur Sinn, wenn man vorher was zuweist.
Einem FC-OUT-Formalparameter kann man auch einen (PAE-)Eingang als Aktualparameter zuweisen.
Code:
im FC1:

U #IN1
= #OUT1

U #OUT1
= #OUT2

-------------------
Aufruf:

Call FC1
IN1 :=E0.1
OUT1:=E0.0
OUT2:=A0.0
Nach Aufruf des FC1 haben E0.0 und A0.0 den gleichen Zustand wie E0.1.

Wenn ich explorer42 richtig verstanden habe, dann hat er folgendes gemacht:
Code:
im FC1:

U E1.0
= #OUT_Release

-------------------
Aufruf in einem FB:

Call FC1
OUT_Release:=#Stat1

Call FC2
IN1:=#Stat1
Das muß funktionieren, egal ob OUT_Release als OUT oder IN_OUT deklariert ist.
Das Problem muß woanders liegen.
Um das Problem zu finden müßte explorer42 aber seinen Code herzeigen.

Gruß
Harald
 
Code:
  Netzerk1:
  U(    
      O     "ResetMain"
      O     "ResetKartEinlage"
      )     
      =     L      1.0
      BLD   103
      U     #AufrEinlInPos
      =     L      1.1
      BLD   103
      U     "-42B6"
      =     L      1.2
      BLD   103
      CALL  "Kartoneinlagentransport"
       StReset      :=L1.0
       PrevOK       :=L1.1
       NextOK       :=L1.2
       RelPrev      :=#KartEinlTranInPos1
       RelNext      :=#KartEinlTranInPos2
       Schrittnummer:="SchrNrKartEinlTran"
       ProdPrev     :="Einlage_aufgerichtet"
       ProdNext     :="Einlage_abgeschoben"
      NOP   0
 
Netzwerk 2:
 U(    
      O     "ResetMain"
      O     "ResetHauptantrieb"
      O     "ResetWareneinschub"
      )     
      =     L      1.0
      BLD   103
      U     #PPInPos
      =     L      1.1
      BLD   103
      U     #MainDrvInPos
      =     L      1.2
      BLD   103
      CALL  "Wareneinschub"
       StReset      :=L1.0
       PrevOk       :=L1.1
       NextOk       :=L1.2
       RelPrev      :=#WareneinschubInPos1
       RelNext      :=#WareneischubInPos2
       ProdNext     :="Wareneinschub_Fertig"
       Schrittnummer:="SchrNrWarEins"
       ProdPrev1    :="Karton_2.Pos"
       ProdPrev2    :="Einlage_abgeschoben"
       ProdPrev3    :="PickPlace"
      NOP   0

Hinweis:
wo "-42B6" steht , stand vorher #WareneinschubInPos1(statische Variable).
Ich programmiere in FUP habe in AWL umgeschalten.
 
Zuletzt bearbeitet:
Hallo,
2 Fragen dazu :
1.) ist es 42B6 mit der das Problem auftritt ?
2.) von den jeweiligen FC's - was sind davon IN's und was OUT's und was ist die Durchgangsvariable (IN_OUT) ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
zu 1) Nein mit -42B6 gibt es keine Probleme ist eine Zylinderabfrage. Es gibt Probleme wenn ich den Zustand des Sensor in eine statische Variable zwischenspeichere und es im Programm an einem anderen FC als IN verwenden sprich lesen möchte.
zu 2) PrevOK, Next Ok sind IN Variabeln, RelPrev, RelNext sind Out Variabeln, Schrittnummer und ProdPrev und ProdNext sind inout variabeln.
alle mit vorangestelltem # sind statische Variablen

gruß
explorer42
 
Wo ist das Problem? Wie lautet die Frage?

Es gibt Probleme wenn ich den Zustand des Sensor in eine statische Variable zwischenspeichere und es im Programm an einem anderen FC als IN verwenden sprich lesen möchte.

Meinst Du das so?
Code:
      U     "-42B6"
      =     [COLOR="Blue"]#Stat_Sensorzustand[/COLOR]

      U(
      O     "ResetMain"
      O     "ResetKartEinlage"
      )     
      =     L      1.0

      CALL  "Kartoneinlagentransport"
       StReset      :=L1.0
       PrevOK       :=#AufrEinlInPos
       NextOK       :=[COLOR="blue"]#Stat_Sensorzustand[/COLOR]
       RelPrev      :=#KartEinlTranInPos1
       RelNext      :=#KartEinlTranInPos2
       Schrittnummer:="SchrNrKartEinlTran"
       ProdPrev     :="Einlage_aufgerichtet"
       ProdNext     :="Einlage_abgeschoben"


      CALL  "anderer_FC"
       IN_Sensor    :=[COLOR="blue"]#Stat_Sensorzustand[/COLOR]

Was genau ist denn nun Dein Problem? Laß' Dir doch nicht alles aus der Nase ziehen ;)
Wie lautet nochmal Deine Frage? Geht es nun um ein Problem bei OUT, IN_OUT oder IN ???

Gruß
Harald
 
also noch mal:

FC1:

U E1.0
= #sensor (ist eine out variable)


im FB1:

Call FC1
sensor:=#stat_sensorzustand (ist eine statische variable)
...

Call FC2
invariable:=#stat_sensorzustand
...

so funktioniert aber Anlage richtig:

Call FC2
invariable:="-42B6"
...
 
Out lesen...

Also wenn man Out Variablen auch vorher lesen will, sollte man immer in_out verwenden. Es geht zwar normalerweise mit L/M/E und A Bereichen, da dort ein Pointer übergeben wird, aber was ist wenn Siemens dies dann mal ändern würde (wie auch immer). Und mit DB gehts nicht, und dann ist man am Fehlersuchen wenn man dann denkt das der Baustein sonnst immer Funktioniert hat!
 
also noch mal:

FC1:

U E1.0
= #sensor (ist eine out variable)


im FB1:

Call FC1
sensor:=#stat_sensorzustand (ist eine statische variable)
...

Call FC2
invariable:=#stat_sensorzustand
...

so funktioniert aber Anlage richtig:

Call FC2
invariable:="-42B6"
...

Geht nicht, da eine Statische Variable eine DB variable ist, und auf DB gehen keine direkten Out Zugriffe.

Du kannst ja mal mit meinem MC7 to AWL Converter nachsehen was der Step 7 aus deinem Call aufruf bei einem Eingangs und bei einem DB Zugriff macht. (gibts hier http://jochensserver.dyndns.org/wordpress/?page_id=55) Dann wirds vielleicht klarer...
 
Nochmal ich

siehe aus dem:

IN-Beispiel:

Code:
      CALL  "POSITIONSKONTROLLE"
       aa:=EW1

macht Step7

Code:
 BLD   1             
      =     L15.0         
      UC    FC1           
            P#E 1.0
      BLD   2

und aus..

Code:
      CALL  "POSITIONSKONTROLLE"
       aa:=DB1.DBW0

Code:
 BLD   1             
      =     L15.0         
      AUF   DB1           
      L     DBW0          
      T     LW16          
      UC    FC1           
            P#V 16.0
      BLD   2

doch wenn Ich nun eine Out nehme, dann belibt der aufruf mit dem EW gleich, aber aus dem DB aufruf wird:

Code:
 BLD   1             
      =     L15.0         
      UC    FC1           
            P#V 16.0
      L     LW16          
      AUF   DB1           
      T     DBW0          
      BLD   2
 
Danke für die Antworten!

d.h. wenn ich es richtig verstanden habe:

eine db-variable am in eingang eines FCs wird irgendetwas aus dem L-Stack geladen.
bei einem Eingangswort nicht weil der Pointer direkt auf das EW zeigt.

Aber was passiert wenn ich die db variable nicht vorher lese sondern vorher immer zyklisch über einen FC out beschreibe
und dann später lese?
 
Zurück
Oben