TIA Verständnisproblem

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, hänge an folgendem Problem:

In FC1 wird ein bestimmter Wert an den Ausgang "OUT" gegeben, wenn der Merker M10.0 den Status 1 hat.

In FC2 wird ein bestimmter Wert an den Ausgang "OUT" gegeben, wenn der Merker M10.1 den Status 1 hat.

Beim Aufruf von FC1 und FC2 im OB1 schreibe ich bei beiden Ausgängen "OUT" den DB10 (Datentyp INT) an.

Das Problem:

Wenn z.B. M10.0 den Status 0 hat, so wird offensichtlich permanent eine 0 in den DB geschrieben – ganz egal, was in der FC2 passiert.

Aber wenn der Code in FC1 nicht bearbeitet wird, dann müssten doch eigentlich die Werte an den DB übergeben werden, die in FC2 erzeugt werden, oder nicht?


Vielen Dank!
 
Hallo,

grundsätzlich müsste das so funktionieren. Nur ist die Frage, in welcher Reihenfolge deine FC´s abgerufen werden oder ob die überhaupt Daten reinschreiben. Kannst vielleicht mal Bilder deiner FC´s und des OB´s hier einfügen, dann kann man dir besser helfen.

Mit freundlichen Grüßen
 
Weil Du am FC-OUT einen Merker angebunden hast, könnte es so funktionieren wie von Dir gewünscht. Du solltest das besondere Verhalten bei Merkern aber nicht ausnutzen sondern "sauber" einen IN_OUT nehmen.
http://www.sps-forum.de/simatic/647...n-ausgangsparametern-bei-fc-s.html#post453355

EDIT: Quatsch, Du hast ja ein DBX am OUT, da wird beim Verlassen des FC der OUT immer zugewiesen, egal ob im FC dem OUT was zugewiesen wird. Also gewinnt immer der FC der zuletzt aufgerufen wird.
Trotzdem: IN_OUT benutzen ist die Lösung.

Harald
 
Zuletzt bearbeitet:
Hallo und schon mal vielen Dank für die Hilfe Münchnerjunge!

Ja, exakt so wie auf deinen Bildern ist es im Grunde programmiert. Nur dass ein Code in SCL ist - aber das tut ja nichts zur Sache.

Wenn ich im OB1 auf der Online-Sicht bin, dann wird bei der FC2, die nach der FC1 aufgerufen wird, eine 0 am Ausgang OUT angezeigt. Und genau diese 0 steht auch wie verwurzelt im DB!

Und das, obwohl ja dieser Teil der Programmcodebearbeitung in der FC2 gesperrt ist und eigentlich die Werte der FC1 übertragen werden sollten ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
EDIT: Quatsch, Du hast ja ein DBX am OUT, da wird beim Verlassen des FC der OUT immer zugewiesen, egal ob im FC dem OUT was zugewiesen wird. Also gewinnt immer der FC der zuletzt aufgerufen wird.
Trotzdem: IN_OUT benutzen ist die Lösung.

Harald

Danke Harald, aber eigentlich habe ich am OUT ja einen Int-Wert, der an den DB übergeben wird ...
 
Es ist egal, ob der Ausgang ein INT oder BOOL oder REAL... ist, entscheidend ist, daß die Variable am OUT-Parameter eine DB-Adresse ist. Dadurch wird der OUT immer zugewiesen, egal welchen zufälligen oder kontrollierten Wert der OUT hat. Wenn man das nicht will, dann darf der FC garnicht erst aufgerufen werden. (EN beschalten oder Aufruf überspringen)
Nochmal: IN_OUT nehmen

Harald
 
Dein FC-Out wird zufällig, sobald der Merket False ist.
Das kann man ganz gut sehen wenn du dir deine Netzwerke mal in Aal ansiehst.

Code:
      U     M10.0
      SPBNB _001
      L     1234
      T     #MyOut
_001: NOP   0

Der Code wird komplett umprungen, der Out bekommt nichts zugewiesen, hängt also in der "Luft"
Wie PN/DP schon schrieb, wird in so einem Fall der OUT zufällig belegt, abhängig davon, was gerade im Stack "rumliegt".
Deshalb muß man in einem FC ausginge generell immer zuweisen, im Notfall mit einem Hilfswert am Anfang des FC. Oder eben eine INOUT nutzen, was in deinem Fall ohnehin ganz gut wäre.
 
Zitat TIA-Hilfe zu "Parameterversorgung von Funktionen" - Ausgangsparameter:
Wenn ein Ausgangsparameter einer Funktion in dieser Funktion nicht geschrieben wird, wird der Wert verwendet, der für den angegebenen Datentyp vordefiniert ist. Für BOOL ist z. B. der Wert "false" vordefiniert. Strukturierte Ausgangsparameter werden jedoch nicht mit einem Wert vorbelegt.

@Ralle
Daraus folgt nun also, das der Wert bei TIA nicht mehr unbedingt als zufällig bezeichnet werden kann.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, hänge an folgendem Problem:

In FC1 wird ein bestimmter Wert an den Ausgang "OUT" gegeben, wenn der Merker M10.0 den Status 1 hat.

In FC2 wird ein bestimmter Wert an den Ausgang "OUT" gegeben, wenn der Merker M10.1 den Status 1 hat.

Hi Spirit,

unabhängig von dem Problem mit den 2 FCs, besteht ja schon ein Denkfehler in jedem einzelnen der beiden, wie Ralle Dir bereits mitgeteilt hat.
Und ich dachte immer, Frauen vergessen nichts: http://www.sps-forum.de/simatic/71971-kann-es-mir-noch-nicht-erklaeren.html!
;)
 
Zitat TIA-Hilfe zu "Parameterversorgung von Funktionen" - Ausgangsparameter:
Wenn ein Ausgangsparameter einer Funktion in dieser Funktion nicht geschrieben wird, wird der Wert verwendet, der für den angegebenen Datentyp vordefiniert ist.
Gilt das für alle CPU oder nur für S7-1200/1500? (Und stimmt das auch wirklich??)

@spirit
Gibt es von dem TIA eine Warnung bei den FC, weil der Ausgang nur bedingt beschrieben wird?


Im übrigen würde ich mich nicht darauf verlassen, daß der Compiler ungefragt meine Programmierfehler ausbügelt.

Harald
 
Gilt das für alle CPU oder nur für S7-1200/1500? (Und stimmt das auch wirklich??)
Also es steht jetzt zumindestens keine diesbezügliche Einschränkung da (wie bei verschiedensten anderen Punkten),
insofern kann man davon ausgehen, das dies unter TIA ebenfalls für die 300/400er gilt.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, egal was TIA mit dem OUT-Formalparameter nun innerhalb der FC anstellt - es ergibt nicht das, was spirit will. Auch wenn im FC dem Formalparameter nichts absichtlich zugewiesen wird, wird trotzdem bei Verlassen des FC dem Aktualparameter ein Wert zugewiesen, der nichts zu tun hat mit dem Wert, den der Aktualparameter vor Aufruf der FC hatte.

spirit will entweder einen bestimmten Wert zuweisen oder gar keine Zuweisung haben. "Gar keine Zuweisung" gibt es nicht bei OUT-Parametern. Dieses Verhalten kann man nur mit IN_OUT erreichen oder indem man den FC garnicht aufruft.

Harald
 
Bei TIA mag das so sein, ich hab ihm eigentlich für die Classic geantwortet, da die Bilder, die er eingestellt hatte eigentlich die Classic zeigen.
Aber so ist das ja nun recht umfassend für TIA und Klassik klargestellt.

PS: Mit ist ja auch lieber der Default-Wert, als irgendein zufälliger Wert aus dem Stack. Allerdings werden sich viele dann wundern, wurm ihr Wert nicht so oder so ist.
Für eine Funktion ist das Verhalten aber logisch, denn die hat ja kein speicherndes Verhalten, also wird ein OUT, der nicht beschrieben wird auf Default gebracht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
IHR ;),

wie sie selbst hier im Forum schon mehrfach dezent verkündet hat. Z.B.:


:ROFLMAO:

IHM ... dem Menschen

(die Kurve meines Vaters beim Besuch meiner neugeborenen Tochter nach der Frage "wo ist denn der Kleine? ... ... Mensch?")
 
Zuletzt bearbeitet:
Hi hucki und Ralle, die Bilder mit der classic-Ansicht sind nicht von spirit, sondern von Münchnerjunge.

Daß spirit wohl neuerdings in TIA programmiert sieht man nur daran, daß ihr Thema im Forum TIA eingestellt ist. Sie selbst hat nicht extra geschrieben, ob sie nun TIA oder classic meint. Wir waren wohl alle auf dem (falschen?) Trip, daß es um eine Frage zu Step7 classic geht. Erst MSB hat das Thema TIA explizit in den Thread gebracht. Doch seitdem hat sich spirit noch nicht wieder geäußert.

Für das was sie (spirit) vorhat ist es aber unerheblich, ob sie in classic oder TIA programmiert - es funktioniert in beiden Welten nicht wie gewünscht.

Harald
 

Naja hucki, das mit dem Vergessen bei Frauen gilt vor allem für zwischenmenschliche Bereiche ... :p

Aber es ist mir in der Tat jetzt doch etwas peinlich, dieses Thema hätte ich echt nicht nochmals aufmachen müssen. Immer, wenn etwas von meiner "wilden" Fragerrei abgeschlossen ist, dann notiere ich mir das peinlichst genau mit Link zum Thema. Das hat zweierlei Gründe:

Zum einen kann ich dann selber besser suchen, wenn ich wieder auf ein gleiches/ähnliches Thema stoße und zum anderen kann ich euch damit entlasten, dass ihr nicht immer wieder die gleichen, ollen Fagen beantworten müsst. In diesem Fall jedoch, habe ich mir das Thema (aus welchen Gründen auch immer) nicht notiert und leider auch keinen Zusammenhang zwischen damals und jetzt gesehen ... sorry!



@spirit
Gibt es von dem TIA eine Warnung bei den FC, weil der Ausgang nur bedingt beschrieben wird?

Harald

Nein Harald, TIA hat keine Fehlermeldung, bzw. Warnung ausgegeben! Und im DB wurde permanent eine 0 eingeschrieben; ganz egal was in FC1 programmiert ist.

Naja TIA ist nicht ganz freiwillig - aber die 1200er kann Modbus und in diesem Zusammenhang dachte ich mir, dann arbeite ich mich da halt auch ein wenig ein. FRAU (Männer würden hier im Forum vermutlich hier nicht so doof fragen wie ich) bleibt ja Nichts erspart! ;)

Aber ehrlich gesagt, mir gefällt es nicht. Und auch beim Laden in die CPU merkt sich dieses TIA nichts und will ständig wieder die IP's usw. angegeben haben ... oder aber ich mache da was falsch.

Ok, dachte das wäre klar, dass ich in der TIA-Abteilung bin, da ich ja auch als Präfix TIA angegeben habe ...

Wie auch immer, wenn ich das, wie von dir vorgeschlagen, als IN_OUT mache, so klappt alles ganz prima! Die CPU ist eine vierer Version vom Typ 1215er.

In einem FB wäre das dann wohl nicht aufgetreten, da der ja diesen Instanz-DB hat, richtig?


Lieben Dank ...
 
Zurück
Oben