FILE_SERVER v1.21 mit PC WORX 6.3

Begonnen von arsh0r, 02. Oktober 2014, 09:53:55

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

arsh0r

Hi,

ich mache das erste mal was mit PC WORX, weis also nicht ob der Baustein in anderen Versionen korrekt funktioniert. Der DLOG_STORE_FILE_CSV wollte bei mir nicht laufen und hat immer mit ERROR=161 (FILE_REMOVE Datei konnte nicht gelöscht werden) abgebrochen. Wenn eine neue Datei mit FSD.MODE=BYTE#3 angelegt wird, dann wird immer zuerst die Datei gelöscht mti FILE_REMOVE. Wenn die Datei nicht vorhanden ist, dann gibt FILE_REMOVE im meinem Fall Fehler 21 (File could not be deleted.) aus. Das ist völlig in Ordnung, nur darf deswegen der FILE_SERVER die Operation nicht abbrechen.

Hier mein Workaround:

(* ------------ File Remove ------------- *)
FILE_REMOVE.Execute := command = BYTE#7;
FILE_REMOVE.Name := FSD.FILENAME;
FILE_REMOVE();

IF command = BYTE#7 THEN
IF FILE_REMOVE.Done THEN
error := FILE_REMOVE.Error;
(*<neu>*)
IF FSD.MODE = BYTE#3 AND FILE_REMOVE.ErrorID = UINT#21 THEN
error := FALSE; (*beim neu Anlegen kann es schonmal vorkommen das die Datei vorher nicht gelöscht werden kann*)
END_IF;
(*</neu>*)
command := BYTE#0;
error_code := SEL_BYTE(error,BYTE#00,UINT_TO_BYTE(FILE_REMOVE.ErrorID + UINT#140)); (* Errorcode basis verschieben *)
(* ---------------------- Debug-Message ----------------------------*)
(*IF _debug_enable THEN
LOG_CL.NEW_MSG := 'Remove: File ~1, error ~7, code ~8';
LOG_CL.PRINTF[1] := used_filename;
LOG_CL.PRINTF[7] := INT_TO_STRING(BOOL_TO_INT(error),'%d');
LOG_CL.PRINTF[8] := BYTE_TO_STRING(error_code,'%u');
LOG_MSG();
END_IF;*)
(* -----------------------------------------------------------------*)
END_IF;
END_IF;


Greetz
arsh0r

peewit

hi

fragen

1. welche oscat bibliotheks version benutzt du
2. wie heisst deine sps genau bzw. siebenstelige artikelnummer
3. welche firmware ist auf der sps
4. die genaue versionnummer vom pcworx
5. welche pcworx formatvorlage hast du genommen also Firmware >= xxxx


kann es sein das die datei schon geöffnet war und du sps reset oder ähnliches das datei-handle verloren ging
und somit die datei eigentlich noch geöffnet war und somit auch nicht gelöscht werden kann.

hast du nach spannung aus/ein trotzdem immer da gleiche problem ?


arsh0r

zu 1.) ich benutze die oscat_basic_333, oscat_network_121
zu 2.) PC WORX SRT mit der Bestellnummer 2701680
zu 3.) Rev 00/1.00
zu 4.) PC WORX 6.30.767
zu 5.) PC WORX SRT V1.0 Rev. > 00/1.00

die Datei war noch garnicht angelegt, darum kam auch ein Fehler als er versuchte eine Datei zu löschen die nicht da war.
sobald DLOG_STORE_FILE_CSV eine neue Datei erzeugen wollte (weil sich der Dateiname geändert hat) kam der Fehler.

Die Soft-SPS lockt auch die csv Dateien (kann von anderen Programmen nicht gelesen werden), sodass ich sie erst lesen kann sobald auf einen neuen Dateinamen umgeschaltet wurde.

peewit

als die bibliothek programmiert wurde gab es noch gar kein PCWORX SRT
somit verhält sich SRT anders als alle anderen Steuerungen

pcworx srt steht auch nicht auf unserer liste der getesteten umgebungen


ich werde mir das bei gelegenheit ansehen, wird dauern

besser ist wenn du mit deiner eigenlösung vorerst mal gegnügst.

ich bin dir aber dankbar wenn du mir alle merkwürdigkeiten und abweichungen und lösungsvorschläge mitteilst.
ist immer gut wenn einer mitdenkt

danke...

arsh0r

wir haben zu danken.

wieso unterstützt der FILE_SERVER von Haus aus keine "ans Ende der Datei anhängen" Funktion? Ich hab ihn jetzt etwas umgeschrieben damit das geht. Ausserdem wollte ich nicht, das die Dateien andauern gelockt sind, also nicht lesbar solange die Soft-SPS sie offen hat. Und jeder Eintrag soll sofort geschrieben werden, ich habe ja keine Einschränkungen wegen Flashspeicher in einer SPS...

Funzt auch, aber ist halt nur ein Hack:

DLOG_STORE_FILE_CSV

...
CASE step OF

00: IF ENABLE THEN
fn_last := fn;
FSD.FILENAME := fn; (* Dateiname *)
FSD.OFFSET := UDINT#0; (* Start bei Dateianfang *)
FSD.AUTO_CLOSE := T#10s; (* Auto-Close *) (*<neu>*)
step := 20;
END_IF;
...
20: IF X.UCB.BUF_COUNT > 0 THEN (* Einträge vorhanden *)
X.UCB.D_MODE := 10;
UCB(DATA:=X.UCB); (* Element lesen , aber noch nicht entfernen *)
X.UCB := UCB.DATA;
IF X.UCB.D_HEAD = WORD#16#FF00 THEN (* LOG_STOP Command *)
X.UCB.D_MODE := 11;
UCB(DATA:=X.UCB); (* Element entfernen *)
X.UCB := UCB.DATA;
log_stop := TRUE;
step := 40; (* Daten schreiben *)
ELSIF idx + LEN(X.UCB.D_STRING) + 2 < buf_totalsize THEN (* Platz für Element vorhanden ? *)
X.UCB.D_MODE := 11;
UCB(DATA:=X.UCB); (* Element entfernen *)
X.UCB := UCB.DATA;
_STRING_TO_BUFFER(STR:=X.UCB.D_STRING, POS:=idx, PT:=PT.BUFFER, SIZE:=INT_TO_UINT(buf_totalsize));
PT.BUFFER:=_STRING_TO_BUFFER.PT;
idx := idx + LEN(X.UCB.D_STRING);
n := n + USINT#1;
IF n = X.ID_MAX THEN (* letztes Element einer Zeile *)
n := USINT#0;
PT.BUFFER[idx] := BYTE#16#0D;
idx := idx + 1;
PT.BUFFER[idx] := BYTE#16#0A;
step := 40; (* Daten schreiben *) (*<neu>*)
ELSE
PT.BUFFER[idx] := SEP;
END_IF;
idx := idx + 1;
ELSE
step := 40; (* Daten schreiben *)
END_IF;
END_IF;

40: IF idx > 0 THEN (* Daten schreiben *)
FSD.MODE := BYTE#2; (* write append *) (*<neu>*)
PT.SIZE := INT_TO_UINT(idx); (* Datenlänge eintragen *)
idx := 0;
END_IF;
step := 60;
...


FILE_SERVER

...
200: (* File Seek *)
IF FSD.OFFSET > FSD.FILE_SIZE THEN (* prüfe auf gültige offset-vorgabe *)
error_code := BYTE#255;
step := 30000; (* Beenden *)
ELSIF FSD.OFFSET <> file_position THEN
command := BYTE#5; (* File-Seek *)
seek_mode := UINT#0; (* Positionierung relativ zum Dateianfang *)
(*<neu>*)
IF FSD.MODE = BYTE#2 THEN
seek_position := FSD.FILE_SIZE;
ELSE
seek_position := FSD.OFFSET;
END_IF;
(*</neu>*)
step := 210;
ELSE
step := 300;
END_IF;
...

peewit

hi

1. der file_server beherscht ein automatisches Append man muss nur wissen wie man es anspricht
    -> man könnte auch behaupten das ich vergessen habe es in die doku zu schreiben :-)


FSD.MODE := BYTE#2; (* File_Open_Exist + File_Write *)
FSD.OFFSET := UDINT#4294967294; (* 16#FFFF_FFFE ->Spezialcode: Daten automatisch an Dateiende anhängen *)
PT.SIZE := INT_TO_UINT(idx); (* Datenlänge eintragen *)



2. damit die datei nicht ständig blockiert ist kann man bei der network v1.30 (siehe link)
    die auto_close zeit vorgeben, die nun auch effektiv eine auswirkung hat.

    DLOG_STORE_FILE_CSV
    sobald keine daten zum schreiben vorhanden sind bzw alles erledigt ist und die zeit ist abgelaufen
    wird die datei geschlossen und bei erneuter anhäufung von daten wird diese wieder geöffnet
    usw...

    blind jedes mal zu schliessen und öffnen bremst das system nur unnötig aus.


http://www.oscat.de/community/index.php/topic,1872.msg9862.html#msg9862


es freut mich das sich jemand mit dem code auseinander setzt und auch alternative lösungen hier anderen zur verfügung stellt.

weiter so.