Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: codesys v3 csv Datei einlesen und verarbeiten

  1. #1
    Registriert seit
    14.04.2016
    Beiträge
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen, ich bin dabei mich in die Programmiersprache strukturierter Text einzuarbeiten und habe dabei folgendes Problem.

    Ich möchte mit Codesys V3 eine CSV Datei einlesen und verarbeiten. Die Datei soll aus drei Spalten bestehen (Index, Zeit, Spannung) die jeweils durch ein Trennzeichen getrennt werden. Mit Hilfe des Trennzeichen möchte ich erkennen zu welchen dieser drei Kategorien die Zeichen gehören.
    Beim einlesen möchte ich die Zeichen einzeln einlesen und anschließend in einem weiteren String wieder zusammen fügen. Das einlesen klappt soweit, allerdings funktioniert das zusammensetzen mit dem Befehl "CONCAT(x ,y)" der beiden STRINGs nicht. Mein Problem hierbei ist das ich online sehe dass die einzelnen Zeichen eingelesen werden allerdings werden diese nicht wie gewünscht zusammen gesetzt.

    Mein Programm sieht wie folgt aus:

    PROGRAM PLC_PRG
    VAR
    myTON : TON;
    SysFileOpenNum : DWORD;
    FileName : STRING := 'C:\CoDeSysCSV.csv';
    ReadBuffer : STRING;
    Buffer : STRING;
    pResult : WORD;
    pResult_1 : WORD;
    DwWritten : DWORD;
    myCount : INT;
    END_VAR



    myTON(IN:=NOT myTON.Q, PT:=T#1S); (* Sekunden oszi *)
    IF myTON.Q THEN

    CASE myCount OF
    0: SysFileOpenNum := SysFileOpen(FileName, am:= ACCESS_MODE.AM_READ, pResult:= pResult);

    1..20: ReadBuffer := ' ';
    Buffer := CONCAT(Buffer ,ReadBuffer); // In ReadBuffer sind die einzelnen Zeichen zu sehen aber im Buffer wird nichts geschrieben
    DwWritten := SysFileRead(SysFileOpenNum, ADR(ReadBuffer), LEN(ReadBuffer), pResult:= pResult_1);

    21: SysFileClose(SysFileOpenNum);

    END_CASE

    IF myCount < 22 THEN
    myCount := myCount + 1;
    END_IF;
    END_IF
    Zitieren Zitieren codesys v3 csv Datei einlesen und verarbeiten  

  2. #2
    Registriert seit
    29.09.2014
    Ort
    Hessen
    Beiträge
    102
    Danke
    4
    Erhielt 22 Danke für 20 Beiträge

    Standard

    Hi,
    am besten nimmst du für den ReadBuffer ein array of Byte dann kannst du mit einer Schleife das array durchlaufen und auf die Trennzeichen reagieren.
    If you always do what you’ve always done, you’ll always get what you’ve always got.
    „Wer immer tut, was er schon kann, bleibt immer das, was er schon ist.“

    Henry Ford

  3. Folgender Benutzer sagt Danke zu lord2k3 für den nützlichen Beitrag:

    cobra123 (18.04.2016)

  4. #3
    cobra123 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.04.2016
    Beiträge
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo lord2k3,

    Vielen Dank für die schnelle Antwort.

    Das ist leider nicht ganz das was ich wissen wollte, aber danke für den Tipp (Die Auswertung der Trennzeichen habe ich noch nicht versucht).

    Ich kann die Zeichen aus der Datei lesen diese werden im "ReadBuffer" nacheinander angezeigt allerdings werden diese nicht in "Buffer" übernommen woran kann dies liegen?

    anbei ein Bild im Online Modus ich hoffe das verdeutlicht mein Problem.

    Datei lesen.jpg

  5. #4
    Registriert seit
    24.10.2010
    Beiträge
    132
    Danke
    2
    Erhielt 22 Danke für 22 Beiträge

    Standard

    Hallo,
    du musst das Zusammensetzen nach dem Lesen ausführen.
    Bei deinem aktuellen Code ist der ReadBuffer beim Zusammensetzen leer initialisiert.

    Versuchs mal so:

    ReadBuffer := ' ';
    DwWritten := SysFileRead(SysFileOpenNum, ADR(ReadBuffer), LEN(ReadBuffer), pResult:= pResult_1);
    Buffer := CONCAT(Buffer ,ReadBuffer);


    Gruß
    Erfahrung ist nicht das, was einem zustößt. Erfahrung ist, was du aus dem machst, was dir zustößt.
    Aldous Huxley

  6. Folgender Benutzer sagt Danke zu Ghosty für den nützlichen Beitrag:

    cobra123 (18.04.2016)

  7. #5
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    ich vermute du bekommst in der Onlineansicht "Der Wert des Ausdrucks kann nicht gelesen werden" angezeigt. Korrekt? Oder hat "????"

    Das ist ein Problem wenn der keine Termininierung am Ende findet. Ist mir neulich auch passiert.

    Hier ein Beispiel (noch nicht fertig) wie ich CSV einlese:

    ACHTUNG: Die Abbruchbedingung ist noch nicht gut mit dem "bNewLineFound", es besteht noch ein Risiko einer Endlosschleife. Es handelte sich hierbei nur um eine schnelle Lösung was zu testen, vielleicht hilft dir das so schon mal weiter.
    Es funktioniert auch nur wenn deine Zeilen immer <255 Zeichen sind sonst gibt's ein Problem und $R wird nicht gefunden.

    Code:
    PROGRAM PRG_CSVREAD
    VAR
     strParameterFile : STRING(80) := 'EPCO.csv';
     iStep : INT := 0;
      
     rtsHandle : CmpErrors.RTS_IEC_HANDLE;
     rtsResult : CmpErrors.RTS_IEC_RESULT;
     iBytesRead : UDINT := 0;
     
     strLineBuffer : STRING(255) := '';
     strPNU : STRING(20) := '';
     strSubindex : STRING(20) := '';
     strDataType : STRING(20) := '';
     strValue : STRING(30);
     iNewLinePosition : INT := 0;
     iReadStartPosition : INT := 0;
     iReadEndPosition : INT := 0;
     iReadPosInFile : DINT := 0;
     bNewLineFound : BOOL := FALSE;
    // byLineBuffer : ARRAY [0..200] OF BYTE;
    
    
     
    END_VAR
    
    
    
    
    
    rtsHandle := file.SysFileOpen(
        szFile := strParameterFile,
        am := file.AM_READ,
        pResult := ADR(rtsResult)
       );
    
    
    bNewLineFound := TRUE;
    WHILE bNewLineFound DO
      
     // Datei einlesen   
     iBytesRead := file.SysFileRead(
          hFile := rtsHandle, 
          pbyBuffer := ADR(strLineBuffer), 
          ulSize := SIZEOF(strLineBuffer),
          pResult := ADR(rtsResult)
         ); 
     iNewLinePosition := FIND(strLineBuffer, '$R'); 
     IF iNewLinePosition = 0 THEN
      bNewLineFound := FALSE;
      EXIT;
     END_IF;
      
     IF iNewLinePosition > 0 THEN
      strLineBuffer := MID(strLineBuffer, iNewLinePosition,1);
      
      iReadStartPosition := 1;
      iReadEndPosition := FIND(strLineBuffer,',');
      strPNU := MID(strLineBuffer, iReadEndPosition - iReadStartPosition, iReadStartPosition);
      strLineBuffer := MID(strLineBuffer,LEN(strLineBuffer),iReadEndPosition+1 );
      
      iReadStartPosition := 1;
      iReadEndPosition := FIND(strLineBuffer,',');
      strSubindex := MID(strLineBuffer, iReadEndPosition - iReadStartPosition, iReadStartPosition);
      strLineBuffer := MID(strLineBuffer,LEN(strLineBuffer),iReadEndPosition+1 );
      
      iReadStartPosition := 1;
      iReadEndPosition := FIND(strLineBuffer,',');
      strDataType := MID(strLineBuffer, iReadEndPosition - iReadStartPosition, iReadStartPosition);
      strLineBuffer := MID(strLineBuffer,LEN(strLineBuffer),iReadEndPosition+1); 
      
      iReadStartPosition := 1;
      iReadEndPosition := FIND(strLineBuffer,'$R');
      strValue := MID(strLineBuffer, iReadEndPosition - iReadStartPosition, iReadStartPosition);
      strLineBuffer := MID(strLineBuffer,LEN(strLineBuffer),iReadEndPosition+1 );
      
      
         
     END_IF;
     iReadPosInFile := iReadPosInFile + iNewLinePosition+1;
     // Leseposition auf Anfang setzen
     file.SysFileSetPos(
      hFile := rtsHandle,
      ulOffset := iReadPosInFile
     );
    END_WHILE
        
    file.SysFileClose(rtsHandle);

  8. Folgender Benutzer sagt Danke zu excelite für den nützlichen Beitrag:

    cobra123 (18.04.2016)

  9. #6
    cobra123 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.04.2016
    Beiträge
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @ghosty wenn ich das Zusammensetzen verschiebe funktioniert es.

    @excelite es wird leider keine Meldung angezeigt.

    Den angefügten Programmcode kann ich leider nicht ausführen da folgende Fehlermeldung angezeigt wird: "Bezeichner 'file' nicht definiert" . Meine Versuche file zu deklarieren sind leider gescheitert. Wie muss 'file' definiert werden?

  10. #7
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    Das ist ein Namespace, kein Bezeichner. Musst im Blibiotheksmanager schauen wie deine Syslibfile Lib eingebunden ist. Da steht dann der Namespace dran.

  11. Folgender Benutzer sagt Danke zu excelite für den nützlichen Beitrag:

    cobra123 (18.04.2016)

  12. #8
    Registriert seit
    24.10.2010
    Beiträge
    132
    Danke
    2
    Erhielt 22 Danke für 22 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo cobra,
    freut mich wenn es funktioniert.
    Vielleicht noch eine kurze Anmerkung. Ich würde bei der Programmierung von SPS-Steuerungen versuchen, möglichst auf While-Schleifen zu verzichten.
    Du hast hier einen Task mit festem Zeitraster. In diesem Zeitraster muss dein Programm abgearbeitet werden. Ansonsten wirst du Probleme mit Zykluszeitüberschreitungen bekommen.
    Bei While-Schleifen kannst du nie wissen wie lange diese zur Abarbeitung brauchen. Im schlechtesten Fall wird deine Schleife nie beendet.
    Erfahrung ist nicht das, was einem zustößt. Erfahrung ist, was du aus dem machst, was dir zustößt.
    Aldous Huxley

  13. Folgender Benutzer sagt Danke zu Ghosty für den nützlichen Beitrag:

    cobra123 (19.04.2016)

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 18.03.2016, 08:21
  2. neue Reihe in CSV Datei mit SysLibFile und Codesys ?
    Von moumie im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 09.09.2015, 10:25
  3. Step 7 CSV-Datei mit ANSIC in WinCC 7.2 einlesen und bearbeiten
    Von Thomas71 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 07.09.2015, 13:09
  4. Antworten: 7
    Letzter Beitrag: 27.02.2015, 17:04
  5. .csv Datei in S7 einlesen
    Von Fanatic im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 04.10.2007, 15:41

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •