TwinCAT 2 Dateien innerhalb von Funktionen beschreiben?

Paddel

Level-1
Beiträge
4
Reaktionspunkte
0
Hallo,
Wir schreiben momentan ein Program in TwinCAT 2 wobei Werte aus einem Array in eine Datei geschrieben werden sollen. Dies muss innerhalb einer Funktion passieren, die Methode um in TwinCAT Dateien zu beschreiben ist jedoch ein Funktionsblock. Der Versuch ist das Ganze innerhalb einer While-Schleife zu implementieren, es kommt jedoch immer ein Timeout Fehler aus dem Funktionsblock selbst. Der Code sieht wie folgt aus:

Code:
[COLOR=#141823][FONT='inherit']fbTimer(IN:= TRUE, PT := T#2s);[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']fbWrite(udRows:=(iIpolEnd-iIpolStart), bExecute := TRUE, pWriteBuffer := ADR(laMotorValues));[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']WHILEfbWrite.bBusy OR fbTimer.Q DO [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']fbWrite(udRows:=(iIpolEnd-iIpolStart), bExecute := TRUE, pWriteBuffer := ADR(laMotorValues)); [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']IFfbWrite.bError THEN Gerade_Velo := 10; [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']RETURN;[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']END_IF[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']END_WHILE[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']fbTimer.IN:= FALSE;[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']fbWriteist eine Instanz eines Funktionsblocks der so anfängt:[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']RisingEdge(CLK:= bExecute);[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']CASE iStep OF 0:[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']IFRisingEdge.Q THEN iStep := 1; [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']bBusy:= TRUE; [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']bError:= FALSE; [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']nErrId:= 0; hFile := 0;[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']            END_IF[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']1:fbFileOpen(bExecute := FALSE);[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit'] fbFileOpen(sNetId := sNetId, sPathName :=sPathName, nMode := FOPEN_MODEAPPEND OR FOPEN_MODEPLUS OR FOPEN_MODEBINARY,ePath := PATH_GENERIC, tTimeout := T#2s, bExecute := TRUE); [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']iStep:= iStep + 1; [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']2:fbFileOpen(bExecute := FALSE); [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']IFNOT fbFileOpen.bBusy THEN [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']IFNOT fbFileOpen.bError THEN hFile := fbFileOpen.hFile;[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit'] iStep := iStep + 1;[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit'] ELSE iStep := 50;[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit'] nErrId := fbFileOpen.nErrId; bError := TRUE; [/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']END_IF[/FONT][/COLOR]
[COLOR=#141823][FONT='inherit']END_IF[/FONT][/COLOR]


Im Case 2 hängt der sich dann immer am Timeout auf. fbFileOpen ist eine Instanz eines FB_FileOpen Funktionsblock.
Die Frage ist also: Ist es möglich in TwinCAT 2 innerhalb von Funktionen Dateien zu beschreiben?
Vielen Dank!Paddel
 
Hm, ich erinnere mich dunkel an etwas, weiss allerdings nicht genau, ob das die File-FB's betraf. Es gibt jedenfalls bei Beckhoff Bibliotheks-FB's, die ihre Schnittstelle zur Anwendung nur einmal pro Programmzyklus aktualisieren. In diesem Fall würde die WHILE-Schleife nicht funktionieren, ihr müsstet den File-FB ausserhalb der Funktion deklarieren und ihn als VAR_IN_OUT übergeben.
 
Hallo Paddel,
wie StructuredTrash schon richtig bemerkt hat benötigen die File-FBs mehrere Zyklen, daher läuft die Sache mit while nicht. Ich würde außerdem von While und auch For-Schleifen bei der SPS-Programmierung die Finger lassen, wenn Du nicht genau weißt, das die Laufzeit der Schleife nicht deutlich unter der maximalen Zykluszeit liegt, sonst schießt Du Dir ganz schnell die SPS ab.
 
Zuletzt bearbeitet:
Zurück
Oben