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

Ergebnis 1 bis 10 von 10

Thema: Problem Concat TWINCAT2

  1. #1
    Registriert seit
    04.09.2012
    Beiträge
    253
    Danke
    45
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe ein kleines Problem mit der Funktion Concat.
    Ich möchte gerne für die csv-Dateien eine je Spalte eine Überschrift erstellen. Das habe ich so gemacht:

    FILEDATA1 := CONCAT ('Datum', ';');
    FILEDATA1 := CONCAT (FILEDATA1, 'Mess1');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1,'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1,'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, ';');
    FILEDATA1 := CONCAT (FILEDATA1, 'Mess2');
    FILEDATA1 := CONCAT (FILEDATA1, '$N');

    buffer:= FILEDATA1;

    Das funktioniert auch soweit. Wenn ich aber die Strings Mess2 vergrößere, also zum Beispiel Scheinwiderstand schreibe, dann kommt alles durcheinander und die Werte werden irgendwo abgehackt und oder woanders geschrieben.

    Ich habe versucht dieses Problem mit einem Array of String zu lösen, nur leider habe ich hier dasselbe Problem.

    Hat jemand eine Idee, wie ich beliebige große Worte als Überschrift haben kann?
    Zitieren Zitieren Problem Concat TWINCAT2  

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

    Standard

    Vergiss die Funktion Concat hierfür. Die funktioniert nur mit Strings und die haben eine Begrenzung. Arbeite mit Bytearrays. Hier die Funktion die ich immer nehme für CSV, Irgendwasanders,... schreiben

    Code:
    FUNCTION FUN_AddString : DWORD
    VAR_INPUT
     byBuffer   : POINTER TO ARRAY [0..MAX_BYTE_ARRAY] OF BYTE;
     nActWritePos  : DWORD;
     strAddText   : STRING(255);
    END_VAR
    VAR
     iLength    : UINT := 0;    
    END_VAR
    
    
    // Neue Version = Memmove
    iLength := INT_TO_UINT(LEN(strAddText));
    
    
    // Fehler Grenzen überschritten
    IF nActWritePos + iLength >= MAX_BYTE_ARRAY THEN
     FUN_AddString := nActWritePos + iLength;
     RETURN;
    END_IF
    
    
    // Daten anhängen
    mem.MemMove(
     pDestination := ADR(byBuffer^[nActWritePos]),
     pSource := ADR(strAddText), 
     uiNumberOfBytes := iLength
    );
    
    
    FUN_AddString := nActWritePos + iLength;
    Aufruf der Funktion:

    Code:
    VAR
     nWritePos : DWORD := 0; // Schreibposition im Puffer
     byWriteBuffer : ARRAY [0..MAX_BYTE_ARRAY] OF BYTE; // Bytepuffer der später in Datei gespeichert wird
    END_VAR
    
    nWritePos := 0;
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert1;Messwert2;Messwert3;$R$N'); // Aufpassen nicht mehr als 255 Zeichen verwenden! Falls mehr notwendig ist dann auftrennen und Fkt mehrmals aufrufen
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, CONCAT('WERT;','WERT'));//Natürlich geht hier auch CONCAT in der FKT
    file.SysFileWrite(rtsHandle, ADR(byWriteBuffer), nWritePos,ADR(rtsResult));  // Dann Bytearray schreiben
    
    // Nun entweder die Variable nWritePos wieder auf 0 setzen und neu das Bytearry befüllen oder Datei schließen
    // Ich schreibe immer wieder mit SysFileWrite damit die Bytegrenzen nicht überschritten werden
    nWritePos := 0;
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'BLABLUBBSDASD$R$N');
    file.SysFileWrite(rtsHandle, ADR(byWriteBuffer), nWritePos,ADR(rtsResult));  // Dann Bytearray schreiben
    
    
    file.SysFileFlush(hFile:= rtsHandle);
    file.SysFileClose(rtsHandle);
    Geändert von excelite (30.04.2016 um 13:41 Uhr)

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

    Standard

    Falls du die Fkt "MEMMOVE" nicht hast kannst du das auch mit einer Schleife lösen. So habe ich das früher genutzt aber das ist deutlich langsamer und ich mag Performance. Trotzdem hier als Schleifenlösung:

    Code:
    FUNCTION FUN_AddString : DWORD
    VAR_INPUT
     byBuffer   : POINTER TO ARRAY [0..MAX_BYTES_TO_EXPORT] OF BYTE;
     nActWritePos  : DWORD;
     strAddText   : STRING(255);
    END_VAR
    VAR
     i       : DWORD  := 0;
     pTemp    : POINTER TO BYTE;
     iLength    : UINT := 0;    
    END_VAR
    
    pTemp := ADR(strAddText);
    FOR i := nActWritePos TO nActWritePos + INT_TO_DWORD(LEN(strAddText)) DO
     byBuffer^[i] := pTemp^;
     pTemp := pTemp + 1;
    END_FOR;
    FUN_AddString := i-1;

  4. #4
    siegener19 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    253
    Danke
    45
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Danke für den Code, aber ich sehe den wald vor lauter bäumen nicht

    Das könnte ich doch auch nehmen? :

    Überschrift:= 'Messwert1;Messwert2;.....;SN'

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

    Standard

    Kopiere die Fkt rein dann ruf die so auf:

    nWritePos := 0;

    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert1;');
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert2;');
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert3;');
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert4;');
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert5;');
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, 'Messwert6;$R$N');

    FOR i := 0 TO WERTEMAX DO
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub[i].Wert1) );
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub[i].Wert2) );
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub[i].Wert3) );
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub[i].Wert4) );
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, DINT_TO_STRING(blablub[i].Wert5) );
    nWritePos := FUN_AddString(ADR(byWriteBuffer), nWritePos, '$R$N' );
    END_FOR;

    file.SysFileWrite(rtsHandle, ADR(byWriteBuffer), nWritePos,ADR(rtsResult)); // Dann Bytearray schreiben
    file.SysFileFlush(hFile:= rtsHandle);
    file.SysFileClose(rtsHandle);

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

    siegener19 (30.04.2016)

  7. #6
    siegener19 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    253
    Danke
    45
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Okay, vielen Dank. Werde ich später dann ausprobieren. Ich hoffe es funktioniert dann

  8. #7
    siegener19 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    253
    Danke
    45
    Erhielt 3 Danke für 3 Beiträge

    Standard

    USchrift:='Messwert1;Messwert2;Messwert3;Messwert4;Messwert5;Messwert6;Messwert7 ;Messwert8;Messwert9;Messert10;$N';

    Das hat auch geklappt.

  9. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.302
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Zitat Zitat von siegener19 Beitrag anzeigen
    Das könnte ich doch auch nehmen? :

    Überschrift:= 'Messwert1;Messwert2;.....;SN'
    Ja. Besonders wenn man Performance mag.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #9
    siegener19 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    253
    Danke
    45
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Ja, so kann man das auch sehen

  11. #10
    siegener19 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    253
    Danke
    45
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Bin jetzt beim nächsten Problem (von einem zum anderen )

    Siehe ersten Beitrag: Ich möchte gerne das Datum einfügen ( Datum + Uhrzeit).
    ich habe es mit dem "NT_GetTime" versucht und daraus per concat mir ein String gebaut und es dann in die Stelle von "Datum" getan. Das führt aber leider zu Problemen, wo die Daten dann durcheinander geworfen werden.
    Weiß jemand wie man das am besten löst?

Ähnliche Themen

  1. PHP+Twincat2
    Von shrimps im Forum Hochsprachen - OPC
    Antworten: 3
    Letzter Beitrag: 09.05.2016, 20:15
  2. TwinCat2 NC Teilnehmerausfall
    Von tomatensaft im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 23.04.2016, 20:32
  3. Step 7 SCL: Probleme mit Concat/Insert
    Von TheElkExperience im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.08.2013, 09:53
  4. S7 - CONCAT mit Lokaldaten
    Von Majestic_1987 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 27.09.2012, 09:12
  5. Problem mit Systembaustein Concat
    Von qpec_hagen im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.05.2012, 11:15

Lesezeichen

Berechtigungen

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