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

Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 54

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

  1. #1
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich Habe eine Funktion in die folgendermaßen aussieht.
    Bei DCI_GetStringParam() wird nun eine ID als Input und die Var2 und Var3 als Output übergeben.
    Code:
    FUNCTION Command:Void
    VAR_TEMP
        Var1 : DINT;
        Var2 : STRING[16];
        Var3 : STRING[16];
    END_VAR
    
    Var1 := DCI_GetDIntParam(101);
    DCI_GetStringParam(id:=100,s:=Var2);
    DCI_GetStringParam(id:=102,s:=Var3);
    
    END_FUNCTION
    Ich zerlege nun den String und bekomme bei s_max 132 statt 16 raus und kann mir das nicht erklären. Habe auch schon als IN_Out deklariert, aber da kommt das selbe. Hat einer eine Idee woran das liegt das der max nicht richtig übergeben wird?

    Code:
    FUNCTION DCI_GetStringParam: VOID
    VAR_INPUT
        id:DWord;
    END_VAR
    VAR_OUTPUT
        s:STRING;
        S_REF AT s: STRUCT
            s_max:BYTE;
            s_act:BYTE;
            s_chars:ARRAY[1..254] OF BYTE;
        END_STRUCT;
    END_VAR
    VAR_TEMP
        size:INT;
        max_size:INT;
        pos:INT;
    END_VAR
    DCI_SeekByParamID(rid:=id,rtyp:=9);
    max_size:=BYTE_TO_INT(S_REF.s_max);
    size := DINT_TO_INT(DCP_ReadDInt());
    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;
    END_FUNCTION
    Zitieren Zitieren String: Übergabe der Max Länge Falsch  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    woher kommen denn die Eingangs-Strings der Funktion "Command" ?
    Sind die Strings korrekt initialisiert ? Die Header-Bytes stehen da nur korrekt drin, wenn du sie auch (beim Initialisieren bzw. Zuweisen) korrekt hineingeschrieben hast ...

    Gruß
    LL

  3. #3
    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

    Es gibt keine Eingangsstrings bei Command ich erstelle die da als Temp Vars und übergebe die der GetStringParam als Outputparameter. Diese maskiert die dann und kann dann lesend auf die max_länge zugreifen. Diese habe ich bei Command als 16 definiert wie man sieht. und diese 16 will ich auch in der funktion getstringparam wieder auslesen.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    ... entschuldigung ... beim hinsehen habe ich bei der "Command" die Variablen irgendwie als INPUT-Var's gesehen. Das mit dem TEMP hatte ich gar nicht registriert - ändert aber gar nichts an meiner Aussage.
    In dem Script von Command sind die Strings NICHT initialisiert - d.h. das steht irgendein Speicher-Müll drin. Die blosse Deklaration bewirkt gar nichts. Du mußt als mindestens das rot markierte noch einfügen ...
    Code:
    FUNCTION Command:Void
    VAR_TEMP
        Var1 : DINT;
        Var2 : STRING[16];
        Var3 : STRING[16];
    END_VAR
    
    Var2 := '' ;
    Var3 := '' ;
    
    Var1 := DCI_GetDIntParam(101);
    DCI_GetStringParam(id:=100,s:=Var2);
    DCI_GetStringParam(id:=102,s:=Var3);
    
    END_FUNCTION
    ... dann sollte es funktionieren ...

  5. #5
    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

    OK danke für den Hinweis ich werde es gleich mal testen

  6. #6
    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

    Ok damit gehts , aber wenn ich den string nun in Command übergebe ändert sich der aktwert des string auf 16. warum das??? in der funktion getstringparam ist noch alles ok akt ist in dem fall 9 und max ist 16. nun wird er in einen string in einem Datenbaustein kopiert, darin steht dann beides mit 16 drin.

    kann es sein das er den max wert als neuen aktwert übernimmt? wenn ja warum macht der so ein blödsinn?
    Geändert von kai86 (23.02.2010 um 13:51 Uhr)

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Gegenfrage :
    Was ist der Sinn dieser Routine - was bezweckst du damit ?

  8. #8
    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

    Im Prinzip wird ein Commando, welches in einem Buffer steht ausgewertet(wurde über ethernet darein gelesen) und die darin befindlichen parameter werden in einen Datenbaustein geschrieben.

    mein problem ist nur das folgende.

    DATA.LocationID := Var3;

    bei diesem aufruf macht der mist.

    aus max_size(Var3)=16 macht der natürlich das max_size(LocationID)=254
    aber aus act_size(Var3)=9 macht der in den meisten fällen 16 und das darf der nicht der muss doch die 9 übernehmen oder etwa nicht?

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.720
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    ... tut mir leid ... vielleicht ist heute nicht mein tag ... aber ich habe nichts verstanden ...
    Also nochmal : was möchtest du genau machen (von Anfang an) ? Was ist der Sinn von "DCI_GetStringParam" ?

  10. #10
    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
    vielleicht habe ich es auch dumm erklärt.
    Eigentlich ist alles gerade unwichtig für dich.
    Ich will nur einen String kopieren.

    DataBlock.String1 := String2

    Vor dem Copy:
    Struktur String1 :
    Byte0 : 16 //Max_Size
    Byte1 : 0 //Aktuelle_Size
    Byte2 : 0
    Byte3 : 0

    Struktur String2 :
    Byte0 : 16
    Byte1 : 2
    Byte2 : 41
    Byte3 : 42

    Nach dem Copy:

    Struktur String1 :
    Byte0 : 16 //Max_Size
    Byte1 : 16 //Aktuelle_Size
    Byte2 : 41
    Byte3 : 42

    mein wunsch ist aber das in Byte1 2 steht weil das logisch ist ^^

Ä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
  •