Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

csv Datei einlesen und verarbeiten

cobra123
2016-04-15
2016-04-22
  • cobra123 - 2016-04-15

    Hallo,

    ich habe folgendes Problem. Ich möchte mit Codesys V3 eine CSV Datei einlesen und verarbeiten. Das Programm soll die einzelnen Zeichen der Datei durchgehen und diese dann in einen weiteren String schreiben. Ich habe mir das Beispiel "File utilities" angeschaut aber damit komme ich nicht ganz zurecht.

    Ich habe folgendes Programm erstellt, dieses Funktioniert nur bedingt. Es werden in ReadBuffer die werte eingelesen, aber dann nicht in Buffer geschrieben. Woran könnte das liegen?

    PROGRAM PLC_PRG
    VAR
    myTON : TON;
    SysFileOpenNum : DWORD;
    FileName : STRING := 'C:\CSV.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);   
            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

    anbei habe ich noch ein Bild mit dem Problem angefügt.

    IMG: Datei lesen.jpg

     
  • alwoso - 2016-04-22

    Hallo Cobra123!

    So wie ich das sehe, mußt du die zwei Zeilen tauschen:

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

    Mit der ersten Anweisung machst du den ReadBuffer leer (ist ja richtig), aber dann mußt du erst lesen und dann das gelesene Zeichen in den ReadBuffer übertragen.

    Dummerweise sieht man im Status bei Schleifen nie den Zustand, der einen interessiert, sondern den letzten Durchlauf - das irritiert dann schon mal.....

    Viel Erfolg

    Alfred

     

Log in to post a comment.