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

Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 54

Thema: String: Übergabe der Max Länge Falsch

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... ist nicht so ganz einfach zu helfen, wenn man das Ziel nicht so richtig verstanden hat.
    Aber egal - mal einfach ein paar grundsätzliche Dinge dazu :

    - Zunächst würde ich mich mal von den TEMP-Variablen lösen. Da kannst du später wieder hin, wenn die Grundlage läuft - im Augenblick nimmst du dir so die Chance des debuggen.
    - Strings sind nach ihre Deklaration erstmal speichertechnisch nichts. Nur wenn du z.B. in einem DB einen String anlegst und ihn dort per Vorbelegung auch schon zuweist dann ist der Header korrekt. Das Gleiche tut auch SCL wenn du schreibst : "myString := '1234' ;". Ohne das ... ???
    - eine wie auch immer geartete COPY-Funktion ändert daran auch nichts.
    - Ist der String nicht korrekt initialisiert so funktionieren die entsprechenden Routinen wie z.B. LEFT, RIGHT, MID usw. aus der Siemens-Bibliothek erst gar nicht.

    So ... jetzt bist du erst wieder dran ...

    Gruß
    LL

  2. #12
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    also der string ist 100% richtig initializiert Var := ''; habe ich gemacht dann kommt auch der Stringheader richtig rüber. wenn ich nun aber die Var in einen String in nem DB kopieren will macht der den Header völlig kaputt.

  3. #13
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    ... wo kopierst du wen und wie in was ?
    Zeig mir mal den zugehörigen Code-Abschnitt ...

  4. #14
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich weiß das Var3 den richtigen Header hat weil ich den string mit ner maske zerlege, aber er wird nicht korekt in DATA.LocationID angezeigt.

    Code:
    FUNCTION DCI_HandleCommand:Void
    VAR
        Var1 : DINT;
        Var2 : STRING[16];
        Var3 : STRING[16];
        S_REF AT Var3: STRUCT
            s_max:BYTE;
            s_act:BYTE;
            s_chars:ARRAY[1..16] OF BYTE;
        END_STRUCT;
    END_VAR
    Var2 := '';
    Var3 := '';
    
    IF DCI_Command.MessageID=501 THEN
        DCI_COMMAND.handled := True;    
        //read all parameters
        Var1 := DCI_GetDIntParam(101);
        DCI_GetStringParam(id:=100,s:=Var2);
        DCI_GetStringParam(id:=102,s:=Var3);
        //if the message is valid, use them
        IF DCI_Command.isOK THEN  
            DATA.PortID     := Var1;
            DATA.MaterialID := Var2;
            DATA.LocationID := Var3;
        END_IF;
        User_Config.size     := BYTE_TO_INT(S_REF.s_act);
        User_Config.max_size := BYTE_TO_INT(S_REF.s_max);
    END_IF;
    
    END_FUNCTION

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    ich nehme mal an, dass dein String von "GetStringParam" von dieser Sequenz kommt :
    Code:
    IF size>max_size THEN
        DCP_Seek(size);
        S_REF.s_act:=0; 
    ELSE
        FOR pos:=1 TO size DO
           S_REF.s_chars[pos]:=DCP_ReadByte(); 
        END_FOR;
        S_REF.s_act:=INT_TO_BYTE(size); 
    END_IF;
    was macht DCP_Seek und vor Allem, was macht DCP_ReadByte ?

    Ergänzung:
    was macht außerdem "DCI_SeekByParamID" ? Wie hängt das alles zusammen ?
    Geändert von Larry Laffer (23.02.2010 um 15:49 Uhr)

  6. #16
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    DCP_Seek() überspringt den speicherbereich wo der string ist, falls der String größer ist als das max.

    DCP_ReadByte ließt den Buffer Byte für Byte aus und schreibt alles in den string

  7. #17
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    lass dir nicht alles einzeln aus der Nase ziehen ...
    Welcher Puffer wird ausgelesen und woher weiß "DCP_ReadByte" welches Element es wann liefern soll.
    Es wäre schon hilfreich, das ganze Konstrukt zu kennen. Ich vermute mittlerweile den Fehler / das Problem in der Interaktion der einzelnen Funktionen.

  8. #18
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    dachte ehr das das unwichtig sei aber ok.
    also ich bekommen von nem pc daten über TCP rein diese werden dann in einen Empfangspuffer geschrieben. Danach wird der gleich ausgewertet.
    So eine nachricht besteht aus nem Header und mehreren Variablen.
    DCI_SeekByParamID überprüft, wo die gesuchte Variable im string steht.

    brauchst du noch infos?

  9. #19
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Es wäre schon hilfreich, das ganze Konstrukt zu kennen. Ich vermute mittlerweile den Fehler / das Problem in der Interaktion der einzelnen Funktionen.
    ... diese Anmerkung bezog sich auf den funktionellen Inhalt der genannten Funktionen (also den Programm-Code).

  10. #20
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
    FUNCTION DCP_ReadByte: BYTE
        DCP_ReadByte := buff.data[ buff.buffers[buff.current_buffer].start + buff.buffers[buff.current_buffer].pos ];
        DCP_Seek(delta:=1);
    END_FUNCTION
    Code:
    DATA_BLOCK BUFF
        // buffer(s) for sending and receiving of messages
        STRUCT
            sourceID        : INT   := 0;
            destinationID   : INT   := 0;
            packageID       : INT   := 0;
            messageID       : DWORD := DW#16#0;
            param_count     : INT   := 0;
            seekError       : BOOL  :=false;
            
            current_buffer:INT:=0;
            
            msg_lost_bOverflow    : INT:= 0;
            event_lost_bOverflow  : INT := 0;
            alarm_lost_bOverflow  : INT := 0;
            
            buffers: ARRAY [0..4] OF STRUCT
                start: INT:=-1;
                size: INT:=-1;
                pos: INT:=0;     //cursor for read/write operations
                msg_pos: INT:=0; //start of the current message
                tcp_pos: INT:=0;
            END_STRUCT;
            TYPE_SIZES: ARRAY[1..10] OF INT;
            data: ARRAY [0..20000] OF BYTE;
        END_STRUCT
    BEGIN
    END_DATA_BLOCK

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 04.06.2010, 09:55
  2. Länge eines String mit der LEN-Funktion auslesen
    Von baggerandy im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 10.04.2009, 16:13
  3. String in Int. Was ist hier falsch ?
    Von noeppkes im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 06.10.2007, 17:57
  4. Optimale String übergabe ?
    Von Projekt 06 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 28.03.2006, 20:36
  5. Länge im Bausteinkopf falsch
    Von kolbendosierer im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 02.02.2006, 12:10

Lesezeichen

Berechtigungen

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