Fehler bei Datei öffnen mit CSV_PARSER_FILE

Begonnen von plangner, 03. Mai 2012, 08:02:55

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 3 Gäste betrachten dieses Thema.

plangner

Hallo,

leider muss ich mich schon wieder hier melden.
Ich benutze den Baustein CSV_PARSER_FILE um eine *.csv Datei auszulesen und anschließend in ein Array zu kopieren.
Eigentlich funktioniert das so ganz gut. Jedoch bekomme ich ab und zu, wenn ich den Baustein erneut ausführe, den Fehler: 4. Also das die Datei geöffnet sei.
Der Fehler kommt selbst dann noch wenn ich über FSD den Mode 5, zum schließen der Datei, ausführe.
Durch das nutzen der Auto_Close Funktion wird das alles etwas langsamer was für mich unattraktiv ist.

Hat jemand eine Idee oder gibt es einen Trick damit sowas nicht passiert?

Vielen Dank im Voraus.

Mit freundlichen Grüßen
Philipp Langner

peewit

hallo

ohne dein programm zu kennen kann ich dir relativ wenig helfen
wäre nicht schlecht wenn du dein programm (gekürzte testversion) online stellen würdest , inklusive CSV-Datei

passiert das auch mit dem offiziellen csv_parser_file_demo programm ?

beim auto_close musst du eigentlich auf nichts warten
zeit ist einstellbar, und es muss nur der file_server zyklisch aufgerufen werden.

aber das problem liegt ganz woanders , und dem sollten wir nachgehen...


also bitte mehr details liefern.


plangner

Also das Demo-Programm habe ich jetzt noch nicht getestet.
Jedoch habe ich festgestellt, dass mein Programm nicht grundlegend anders aufgebaut ist. Nur etwas in der Auswertung, was ja selbstverständlich ist.
Anbei ein Auszug aus meinem Programm.
Ich habe eben mal meine SPS neu gestartet und dann versucht den Inhalt der *.csv Datei in mein Array zu kopieren und es hat auch funktioniert. Dann habe ich meine SPS kalt gestartet und es kam die Meldung das die Datei noch offen sei (Error = 4) obwohl die Datei zuvor geschlossen wurde.


If NOT xActivate Then
  iStep := 00;
End_If;

Case iStep Of
00 : xDone := FALSE;
File_Offset := UDINT#0;
iLoop := 1;
FSD.AUTO_CLOSE := T#0ms;
Dateiname := 'gruppenname.csv';
Trennzeichen := BYTE#0;
Startsignal := BYTE#1;
If xActivate and (FSD.ERROR = BYTE#0) Then
iStep := 20;
End_If;

20 : iStep := 50;

50 : If Startsignal = BYTE#0 Then
Startsignal := BYTE#1;
If (Abfrage_Ergebnis = BYTE#1) or (Abfrage_Ergebnis = BYTE#2) Then
Index := CONCAT(INT_TO_STRING(iLoop, '%d'),';');
L := LEN(Index);
Find_Out := FIND(Lese_Ergebnis,Index);
If Find_Out = 1 Then
Tempstring := DELETE(Lese_Ergebnis,L,1);
If iLoop <= 64 Then
gruppenname[iLoop] := Tempstring;
iLoop := iLoop + 1;
End_If;
End_If;
Elsif (Abfrage_Ergebnis = BYTE#10) Then
Startsignal := BYTE#0;
FSD.MODE := BYTE#5;
iStep := 110;
End_If;
End_If;

110 : iStep := 111;

111 : iStep := 140;

140: If FSD.MODE = BYTE#0 Then
xDone := TRUE;
iStep := 170;
End_If;

170 : iStep := 00;

End_Case;

CSV_PARSER_FILE_1(SEP := Trennzeichen,
FILENAME := Dateiname,
FSD := FSD,
RUN := Startsignal,
OFFSET := File_Offset,
VALUE := Lese_Ergebnis,
PT := Network_Buffer);

Dateiname := CSV_PARSER_FILE_1.FILENAME;
FSD :=CSV_PARSER_FILE_1.FSD;
Startsignal := CSV_PARSER_FILE_1.RUN;
File_Offset := CSV_PARSER_FILE_1.OFFSET;
Lese_Ergebnis :=CSV_PARSER_FILE_1.VALUE;
Network_Buffer :=CSV_PARSER_FILE_1.PT;
Abfrage_Ergebnis := CSV_PARSER_FILE_1.RESULT;

FILE_SERVER_1(FSD := FSD ,PT := Network_Buffer);
FSD := FILE_SERVER_1.FSD;
Network_Buffer := FILE_SERVER_1.PT;


[gelöscht durch Administrator]

peewit

hallo

das du die sps neu startest ist ja keine unwesentliche information

ich bitte dich , gleich alle infos weiterzugeben
am besten so: was machst du in welcher reihenfolge und was passiert dann

was hast du für eine sps ? name,hardware,firmware, programmiersoftware name + version

der codeauszug ist nett, aber aber alleine das anlegen der fehlenden variablen dauert mir zu lange
ich möchte dich bitten hier ein wenig entgegen zukommen, und einen passenden testbaustein zur verfügung zu stellen.
mit einer beschreibung was du machst , damit es dann nicht mehr geht


plangner

#4
Ok, kein Problem.

Hardware: Phoenix Contact ILC 330 PN
Firmware: 3.95E
Programmiersoftware: PC WORX 6.20.105
Visu-Software: WebVisit 5.14.05

Gehen wir davon aus, das ich meine SPS eben neu eingeschaltet habe.
Dann öffne ich meine Visualisierung und sage dort über einen Button: importieren. Dadurch wird der Baustein (welcher sich im Anhang befindet) ausgeführt und es wird alles aus der CSV erfolgreich in mein Array importiert.
Wenn ich jetzt meine SPS stoppe und kalt starte und im Anschluss den Baustein wie o.g. ausführe, dann bekomme ich den Fehler 4. Obwohl der Baustein vorher erfolgreich durchlaufen wurde. Der Befehl File_Close wurde auch gesendet.
Ich kann in mein Array jetzt keine Daten aus einer neuen *.csv Datei importieren, bis ich meine SPS neu starte. Da mir ständig gesagt wird, das die Datei bereits geöffnet ist.

Hoffe jetzt habe ich soweit alles beschrieben. Wenn du weitere Infos benötigst, dann schreib mir einfach.


EDIT:
Eben habe ich meinen Programmcode etwas überarbeitet und siehe da, es funktioniert. Lasse ich den ersten Schritt wie in der Demo, bekomme ich den Fehler 4 bei einem nochmaligen ausführen.
Zumindest habe ich das ganze jetzt paar mal ohne Probleme ausführen können.
Im allgemeinen hatte ich das Problem auch nie, wenn ich z.B. eine Zeit von 10ms bei Auto_Close angegeben habe.
Den neuen Code packe ich ebenfalls in den Anhang mit rein, du kannst Ihn dir ja gerne anschauen.
Vielleicht habe ich auch einfach etwas übersehen.

[gelöscht durch Administrator]

peewit

hallo

starte mal den ablauf ohne webvisit, sondern direkt über pcworx (damit können wir webvisit schon mal ausklammern)
wenn das einlesen beendet ist, dann solltest du dir die datenstruktur FSD online ansehen (bildschirmhardcopy)
ob auch wirklich die datei geschlossen ist.


kannst du den ablauf mehrmals manuell ohne fehler starten ?

wenn das alles positiv ausfällt, dann tippe ich fast auf ein controllerspezifisches problem
das zwar von der sps die datei geschlossen wird, aber in der interen firmwareschicht noch offen bleibt

ich werde mal deine ergebnisse abwarten .... und dann meine eigenen verwsuche machen (sobald zeit....)

plangner

Ja das Problem kam auch wenn ich das ganze über PC WORX ausgeführt habe.
Eben hab ich meinen vorherigen Beitrag editiert. Da habe ich das Problem gelöst.
Der geänderte Baustein befindet sich im Anhang CSV_Lesen_neu.ST

Den Ablauf konnte ich nicht mehrmals starten. Das ganze lief vorher immer nur einmal durch.
Ich hatte auch die ganze Zeit FSD im Watch-Fenster. Dort stand bei File-Open immer: FALSE

peewit

hallo

habe ich das richtig verstanden

FSD.AUTO_CLOSE := T#10ms;   -> löst dein problem mit fehler 4 aus
FSD.AUTO_CLOSE := T#0ms;     -> funktioniert problemlos

mit dieser änderung ist dein problem weg ?


plangner

Nein, genau anders rum hatte es funktioniert.

FSD.AUTO_CLOSE := T#10ms;   -> funktionierte problemlos
FSD.AUTO_CLOSE := T#0ms;     -> löste mein Problem mit Fehler 4 aus (erst ab dem 2. nochmaligen durchlaufen)

Aber wie gesagt, nachdem ich meinen Code überarbeitet habe (Schritt 00 und Schritt 01) funktioniert es mit beiden Varianten problemlos.

peewit

hallo


ja, ich meinte es auch anders , habe mich verschaut....



kannst du mir nochmals deinen alten fehlerhaften code und den neuen immer funktionierenden code geben

ich möchte wissen was denn nun genau zu dem effekt geführt hat.....



gut, dann ist die sache somit gegessen.....



plangner

#10
Na klar.

Im Anhang hast du einmal den alten und den neuen Code.

Ja soweit läuft das erstmal. Danke dir nochmals.

Wenn ich dennoch das Problem habe, dass eine Datei wohl geöffnet sein sollte, wie kann ich diese Schließen außer über Mode 5?
Gibt es die Möglichkeit das Schließen zu erzwingen?

[gelöscht durch Administrator]

peewit

das geht immer über mode 5 oder auto_close

normalerweise sollte ein file_close auch sofort wirken, und funktionieren

mir ist diesbezüglich auch kein problem bekannt....