TIA Sehe das Problem nicht ...

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Zusammen,

ich habe folgende Ungereimtheit beim Ansteuern eines FESTO-Antriebes:

In einer FC15 habe ich folgende Zeilen programmiert:

Code:
U  #Start_Antrieb  // Input
FP M10.0
S  #Start_Task

U #Ack_Start       // Input
R #Start_Task

Die Variable #Start_Task wurde ursprünglich als OUT-Variable deklariert und wird an einen DB übergeben.
Im OB1 wird am FESTO-FB am Eingang "StartTask" dieser DB-Wert übergeben.


Das Problem:

Der Input "StartTask" des FESTO-Bausteins wird nur sporadisch TRUE; d.h. ich muss mehrmals #Start_Antrieb antriggern.

Wenn ich allerdings im FC15 die Variable #Start_Task als IN_OUT deklariere, dann klappt alles Bestens (also auch beim ersten Mal).


Frage:

Aus welchem Grund muss hier #Start_Task als IN_OUT deklariert werden? :confused:
 
Das Problem ist, dass ein bedingtes zuweisen von OUT's in einem FC problematisch ist. Im Prinzip wird der OUT nämlich nicht bearbeitet und am Ende des FC-Aufrufes können da beliebige Werte (zufällig aus den Lokaldaten) drinnenstehen.

Das funktioniert sicher:
Code:
U  #Start_Antrieb  // Input
FP M10.0
S M10.1

U #Ack_Start       // Input
R M10.1

U M 10.1
= #Start_Task
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem ist, dass ein bedingtes zuweisen von OUT's in einem FC problematisch ist. Im Prinzip wird der OUT nämlich nicht bearbeitet und am Ende des FC-Aufrufes können da beliebige Werte (zufällig aus den Lokaldaten) drinnenstehen.

Das funktioniert sicher:
Code:
U  #Start_Antrieb  // Input
FP M10.0
S M10.1

U #Ack_Start       // Input
R M10.1

U M 10.1
= #Start_Task

Vielen Dank schon mal borromeus,

aber diese zufälligen Werte kommen doch eigentlich nur bei Temp-Variablen vor, oder nicht?

Dann dürfte ich ja auch die ganzen Ausgangsvariablen (z.B. für Zylinder) niemals in einem FC als OUT deklarieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Hilfe von KOP/FUP/AWL steht unter "Funktionen (FC)":

Achtung

Wird in einem solchen Fall ein OUTPUT Parmeter in einem FC nicht beschrieben, können die ausgegebenen Werte zufällig sein!

Der für die Kopie bereitgestellte Bereich in den Lokaldaten des rufenden Bausteins wird mangels Zuweisung an den OUTPUT Parmeter nicht beschrieben und bleibt somit unverändert. Damit wird zufällig der in diesem Bereich stehende Wert ausgegeben, da Lokaldaten nicht automatisch mit z. B. 0 vorbelegt sind.
 
Code:
U Mx
S OUT

Ist das VKE nach U Mx null wird der S Befehl nicht bearbeitet!

Eine Zuweisung mit = wird immer bearbeitet.


Lieben Dank!

Dann dürfte ich in einer FC also programmieren,

Code:
U #Eingang      // Input
U #Freigabe     // Input
= #Zylinder_A   // Output


weil es sich hier um eine Zuweisung handelt. Stimmt das so? :confused:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
U #Eingang      // Input
U #Freigabe     // Input
= #Zylinder_A   // Output
Ne, bei deinem Code wir der Zylinder_A immer mit einem definierten Wert beschrieben (wegen =) .
Dieser Wert ist dann abhängig vom VKE (der Und-Bedingung) entweder 0 oder 1.

Code:
U  #Start_Antrieb  // Input
FP M10.0
S  #Start_Task

U #Ack_Start       // Input
R #Start_Task
Dahingegen wird ein Setzen oder Rücksetzen nur ausgeführt, wenn das VKE 1 ist.
D.h. ist das VKE vor S und das VKE vor R false, bekommt der Ausgang in diesem FC-Aufruf keinen Wert.

Gruß Käse
 
Code:
U #Eingang      // Input
U #Freigabe     // Input
= #Zylinder_A   // Output

Ne, bei deinem Code wir der Zylinder_A immer mit einem definierten Wert beschrieben (wegen =) .
Dieser Wert ist dann abhängig vom VKE (der Und-Bedingung) entweder 0 oder 1.


Gruß Käse


Also wäre diese Programmierung (mit Zuweisung) auch in einer FC absolut korrekt, richtig? :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
spirit;630263[U schrieb:
Frage:
[/U]
Aus welchem Grund muss hier #Start_Task als IN_OUT deklariert werden? :confused:
Weil genau das Gleiche gilt, wie bei den temporaeren Variablen:
Ein FC hat kein Gedaechtnis!

Wo soll also der Zustand des Outs vom letzten Zyklus gespeichert werden?
Genau wie Temps muessen Outs also in jedem Zyklus zugewiesen werden. Der Unterschied zu Temps ist lediglich die Weitergabe an die Bausteinschnittstelle.
Erfolgt das Zuweisen nicht in jedem Zyklus, muss ausserhalb des Bausteins gespeichert und beim naechsten Aufruf zurueck uebertragen werden - INOUT.
 
Genau wie Temps muessen Outs also in jedem Zyklus zugewiesen werden.

... und wenn in einem Zyklus das VKE vor dem Setz- bzw. Rücksetzbefehl FALSE ist, dann wird quasi ein zufälliger Wert (bei TIA false) zugewiesen. Könnte man/frau das so ausdrücken?

Und wenn es dann doch mal geht, liegt das dann daran, dass in jenem Zyklus gerade das Setzen bzw. Rücksetzen ausgeführt wird und so dieses Mal kein zufälliger Wert zugewiesen wird?

Lieben Dank ...
 
Den zufaelligen Wert erhaelt der Out beim Aufruf des FCs.
Der Programmierer hat dafuer zu sorgen, dass er vor Beendigung des FCs einen definierten Zustand erhaelt.

Da kommen auch die Frauen unter den Programmierern nicht drum herum.
;)

:grins:
 
Das hat mit dem VKE erst einmal nichts zu tun.

Beim Aufruf des FCs wird für jede Variable ein Bereich des Speichers reserviert, aber nicht initialisiert.
Diesen Speicher hat vorher ein anderer Baustein ( oder vlt. auch der gleiche) benutzt und bei der Freigabe nicht gelöscht.
Daher kann man nicht genau sagen, was in diesem Speicherbereich für Werte stehen - er ist undefiniert.

Erst wenn eine Zuweisung (=, S oder R) erfolgt, erhält dieser Speicher einen definierten Wert.
Da aber S oder R nicht in jedem Zyklus erfolgen , behält der Speicher seinen Wert, den irgend ein anderer Baustein dort hin geschrieben hat, als dieser Bereich noch für ihn reserviert war.

Deswegen funktioniert so ein FC manchmal scheinbar, wenn es nur wenige Bausteine gibt und der FC zufällig jedes Mal den gleichen Speicherbereich reserviert bekommt. Dann stehen halt zufällig noch die Werte vom letzten Zyklus im neu zugewiesenen Speicher.

Wie Du liest sind es wirklich genau die gleichen Bedingungen wie bei temporären Variablen.
 
Zurück
Oben