Step 7 Var_out eines FCs-Was zum schmunzeln- oder doch zu doof?

mausi17

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich habe ja nun in den letzten 15 Jahren schon allerlei Unglaubliches erlebt mit verschiedensten Automatisierungskomponenten,
aber das ist schon ein besonderes Schmankerl, finde ich:

Im aufgerufenen FC steht als erstes BEA, um diese Fehlerquelle auszuschließen.

Code:
      CALL  "Sollpos_Zufuehr"
       i_berechne             :=#t_Pos_berechnen
       i_ist_Pos_Inkr         :="DB_Zufuehrband".PE.Ist_Position
       i_Taschen_pro_U_Zufuehr:="DB_Einstellungen".Zufuehrband.Taschen_pro_Umdrehung
       i_Fenstergroesse       :=#t_Fenster
       o_Sollpos              :="DB_Zufuehrband".PA.Soll_Position (Dint)
Wenn ich das so schreibe, durchläuft "DB_Zufuehrband".PA.Soll_Position den gesamten Wertebereich, sobald ein weiterer Antrieb läuft,
von dem der Start dieses Antriebs ("Zufuehrband") abhängt.

"DB_Zufuehrband".PA.Soll_Position wird am Ende jeden Zykluses (wie sagt man das?)mit SFC 15 an den Umrichter übertragen.
Ansonsten keine Verwendungsstellen im Programm, die irgendeine Rolle spielen könnte, was hier aber auch egal ist, wie sich gleich zeigen wird:

Also schreibe ich wohl irgendwo die Istposition des anderen Antriebs nach "DB_Zufuehrband".PA.Soll_Position, sollte man denken, ist aber nicht so:
wenn ich jetzt nämlich an den FC irgendein MD hänge und darunter L "DB_Zufuehrband".PA.Soll_Position schreibe, bleibt der Wert von
"DB_Zufuehrband".PA.Soll_Position konstant!

Code:
CALL  "Sollpos_Zufuehr"
       i_berechne             :=#t_Pos_berechnen
       i_ist_Pos_Inkr         :="DB_Zufuehrband".PE.Ist_Position
       i_Taschen_pro_U_Zufuehr:="DB_Einstellungen".Zufuehrband.Taschen_pro_Umdrehung
       i_Fenstergroesse       :=#t_Fenster
       o_Sollpos              :=MD110 //jetzt verändert sich der Wert nicht mehr

L    "DB_Zufuehrband".PA.Soll_Position //..und dieser auch nicht mehr ;-)
.. auch wenn der andere Antrieb läuft.

Inswischen schon urgelöscht, Speicherkarte und CPU getauscht, gespeichert mit Reorganisation- mir fällt nix mehr ein-

Euch?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Scheinbar hast du nach 15 Jahren immer noch nicht das Speicherprinzip von TEMP-Variablen bzw. FCs verstanden, sonst wärst du auch nicht so überrascht.
Der Wert einer unbeschriebenen OUT-Variable, wenn Sie mit einem Vollqualifizierten DB Zugriff versorg ist, ist reiner Zufall.

Hier ein wenig Lesestoff:
http://support.automation.siemens.com/WW/view/de/189227

Insofern ist das weder verblüffend noch überraschend, noch ein Fehler von Siemens.

Mfg
Manuel
 
Naja, das sehe ich doch anders,
oder wie erklärst Du Dir oder mir, dass das Phänomen nicht mit dem MD auftritt?

Außerdem ist eine out-variable keine temp-variable
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da brechen wir das Ganze doch mal auf ein einfacheres Projekt und schon sieht man wunderbar, dass da eben doch Lokalvariablen im Einsatz sind:
OB1:
Code:
      L     2
      T     "Daten".Hinein_FC1

      L     5
      T     "Daten".Hinein_FC2

      CALL  "EinFC"
       Hinein:="Daten".Hinein_FC1
       Hinaus:="Daten".Hinaus_FC1

      CALL  "NochnFC"
       Hinein:="Daten".Hinein_FC2
       Hinaus:="Daten".Hinaus_FC2

      CALL  "NochnFC"
       Hinein:="Daten".Hinein_FC2
       Hinaus:=MD0

FC1:
Code:
      L     #Hinein
      +     L#1
      T     #Hinaus
      BEA
(mit Hinein und Hinaus als DINTs)

FC2:
Code:
      BEA
(mit Hinein und Hinaus als DINTs)

Soweit der Code, den dir der Simatic Manager anzeigt. Schauen wir uns aber mal die Befehle an, die die CPU zur Ausführung erhält:
OB1:
Code:
      L     2
      T     DB1.DBD    0
      L     5
      T     DB1.DBD    8
      Call
      BLD   1
      =     L     20.0
      AUF   DB     1
      L     DBD    0      <--- Dies ist der IN Parameter
      T     LD    21      <--- Übergabe via Lokaldaten (also Temp)
      UC    FC     1     <--- Aufruf FC1 mit den IN und OUT Parameter über die folgenden Pointer
            P#L 21.0
            P#L 25.0
      L     LD    25      <--- Und hier kommt das Ergebnis raus (Lokaldaten!)
      AUF   DB     1
      T     DBD    4     <--- und wird ins DBD geschrieben
      BLD   2
      End Call
      Call
      BLD   1
      =     L     20.0
      AUF   DB     1
      L     DBD    8
      T     LD    21
      UC    FC     2     <--- Aufruf FC2 mit den IN und OUT Parameter über die folgenden Pointer
            P#L 21.0
            P#L 25.0
      L     LD    25      <--- Und hier kommt das Ergebnis raus (Lokaldaten!)
      AUF   DB     1
      T     DBD   12     <--- und wird ins DBD geschrieben
      BLD   2
      End Call
      Call
      BLD   1
      =     L     20.0
      AUF   DB     1
      L     DBD    8
      T     LD    21
      UC    FC     2     <--- Aufruf FC2 mit den IN und OUT Parameter über die folgenden Pointer
            P#L 21.0
            P#M 0.0     <--- aber Merker werden direkt übergeben, nicht via Temp!
      BLD   2
      End Call

Da in FC2 keine Zuweisung erfolgt, bleibt LD25 so stehen, wie es durch FC1 gesetzt wurde. Da aber in FC2 nichts passiert bleibt MD0 so wie es war.

Ist doch alles ganz logisch, oder?

Grüße, hovonlo
 
Jo, wenn man's so sieht,
bzw. sich die Mühe macht, das so sehen zu können;-)

Wie machst Du das? Ich hab mir jetzt erst 'ne SCL Quelle gemalt, in die CPU/Simu übertragen und dann das ganze online
mit 'nem Projekt, dem die Quelle/der FC nicht bekannt war geöffnet- ganz schön umständlich- geht das einfacher?

Naja, so oft braucht man das ja nicht- ich bin immer noch am grübeln, warum mir das noch nie passiert ist-
wahrscheinlich, weil meistens brav immer alles zuweise, ohne bedingte Funktionsabbrüche-keine Ahnung..

Ist wie's ist, allerbesten Dank auf jeden Fall ;-)

MfG

mausi17
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann auch die Ansicht im Simtaic Manager umschalten, ich habe aber vergessen wie das geht.
Ich erzeuge einfach ein WLD-File und kopiere dann den aufrufenden Baustein (also nicht die FCs!) in das WLD. Öffnet man dann den aufrufenden Baustein aus dem WLD heraus, so gibt's die obige Ansicht. Sobald aber die aufgerufenen Bausteine mit im WLD sind, kennt der Simatic Manager die Schnittstelle dieser Bausteine und stellt wieder das übliche Call-Makro dar.
 
Ich weis nicht wie das Umschalten der Ansicht im Simatic Manager funktionieren soll? Ich kenns nur wenn man die Bausteine aus dem Projekt löscht, auch alle die per Call aufgerufen werden, und dann nur den einen von der SPS lädt, dann sieht mans so.

Du kannst aber auch meine Toolbox verwenden: http://www.sps-forum.de/werbung-und-produktneuheiten/40921-s7projecttoolbox.html da kannst du die Calls betrachten wie Sie wirklich aussehen!
 
Zurück
Oben