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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: String in Array of String schreiben

  1. #11
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von carepicha Beitrag anzeigen
    Danke für deine Beschreibung.
    Kann es sein dass der Befehl für das Speichern im ZielArray fehlt?
    Sonst ist es soweit klar.

    Noch eine Frage für die Zuweisung.

    Warum
    Neue_Wert:=ArrayStruct[x].Eintrag

    Ich möchte ja den Wert jeweils indexiert zum Struct hinzufügen.
    Erfolgt dies nicht mit
    ArraySTRUCT[X]:=Neue_Wert;


    Danke für Eure Hilfe
    Genau das, will man noch mehr, dann besteht die die Möglichkeit im Qellarray weitere Informationen zu definieren, die über den Index mitkopiert werden.
    Das Speichern erfolgt hinter der IF Abfrage mit der Anweisung ArraySTRUCT[X]:=Neue_Wert;

  2. #12
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Anzahl:=0;
    while _i < ArrayItem_Max+1 do
    if ArraItem[x].String <> '' then (*hier wird nach einen String gesucht, wenn nichts da, wird der naechste Arrayfeld bearbeitet*)
    NewArrayItem[Anzahl].String:=ArraItem[x].String(*und wenn was da, dann in neuen Array kopieren*)
    Anzahl:=Anzahl+1;(*Index erhoehen, sonst wird alles ueberschrieben*)
    end_if;
    _i:=_i+1;
    end_while;

    Im neuen Array werden dann die gesuchten Werte uebernommen
    PS.: Schreibweise durch englische Tastatur bedingt

  3. #13
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von Irek Beitrag anzeigen
    Anzahl:=0;
    while _i < ArrayItem_Max+1 do
    if ArraItem[x].String <> '' then (*hier wird nach einen String gesucht, wenn nichts da, wird der naechste Arrayfeld bearbeitet*)
    NewArrayItem[Anzahl].String:=ArraItem[x].String(*und wenn was da, dann in neuen Array kopieren*)
    Anzahl:=Anzahl+1;(*Index erhoehen, sonst wird alles ueberschrieben*)
    end_if;
    _i:=_i+1;
    end_while;

    Im neuen Array werden dann die gesuchten Werte uebernommen
    PS.: Schreibweise durch englische Tastatur bedingt

    eine andere Version
    PROGRAM MAIN
    VAR
    String_Array_Qelle:ARRAY[1..10] OF STRING(2):='1','','2','','3','','4','','5','';
    String_Array_Ziel:ARRAY[1..10] OF STRING(2);
    State_Machine:INT:=1;
    Start_Kopieren:BOOL;
    _X:INT:=1;
    _Y:INT:=1;
    END_VAR
    (****************************************************)

    CASE State_Machine OF
    (*Start*)
    1: IF Start_Kopieren THEN
    State_Machine :=2;
    END_IF;
    (*weitersuchen oder Ende*)
    2: IF _X < (10+1) THEN
    State_Machine :=3;
    ELSE
    State_Machine :=5;
    END_IF
    (*Item mit oder ohne Inhalt*)
    3: IF String_Array_Qelle[_X] <> '' THEN
    State_Machine :=4;
    ELSE
    _X:=_X+1;
    State_Machine :=2;
    END_IF;
    (*gefundenen Inhalt kopieren*)
    4: String_Array_Ziel[_Y]:= String_Array_Qelle[_X] ;
    _X:=_X+1;
    _Y:=_Y+1;
    State_Machine :=2;
    END_CASE;


    **************************************************************)

  4. Folgender Benutzer sagt Danke zu Irek für den nützlichen Beitrag:

    carepicha (11.10.2013)

  5. #14
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    OK, die Schlaufe funktioniert nun soweit.
    Nun erhalte ich nun aber eigenartige Sachen wenn mit der Übergabe des Pointers für das Struct.

    Ich erstelle eine Instanz des Struct;
    Code:
    Diag:ST_DIAG;
    und übergebe den Pointer;
    Code:
    ArrayDiagTemp := ADR (Diag);
    Wenn ich im Struct die String Daten prüfe sind alle schön vorhanden.

    Das Problem scheint nun schon bei der Übergabe des Pointers zu entstehen. Es stimmt lediglich der erste Eintrag.
    Weiss jemand warum das so ist?
    Danke für Eure Inputs

    Array.JPG

  6. #15
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Hi,

    das wird nur bedingt funktionieren. Eine CPU (µC) kennt keine geschriebenen Zahlen
    oder Buchstaben.
    Dies wir im Byte als ASCI-Wert dargestellt, will heißen ein Buchstabe=1Byte (8bit).
    „1“=16#31
    „9“=16#39
    „A“=16#41
    „Z“=16#5A
    „a“=16#61
    „z“=16#7A

    weil:

    Nibble=4bit
    2 Nibble=8bit=1byte

    und die Werte im Nibble dazu
    0000 = 0
    0001 = 1
    0010 = 2
    0011 = 3
    0100 = 4
    0101 = 5
    0110 = 6
    …...........
    1001 = 9
    1010 = A (10 Dez)
    …........
    1111 = F (15 Dez)
    daraus folgt Byte 16#FF=1111 1111 (High Nibble Low Nibble)
    16#11=0001 0001

    Für den String im Speicher brauchen wir die Startadresse, seine Länge (Anzahl Bytes), dann
    Byte für Byte alles auslesen, Umwandeln und zusammenfügen.
    Der Operator ADR liefert nur die Adresse vom ersten Byte, versuch dann mit SIZEOF die
    Gesamtlänge für den Arrayitem zu ermitteln.
    Ist der String 5 Buchstaben Lang werden dementsprechend 5 Bytes benötigt.
    Irek

    direkt vom Beckhoff:

    pt:POINTER TO INT;
    var_int1:INT := 5;
    var_int2:INT;
    pt := ADR(var_int1);(*das ist nur Die Speicheradresse*)
    var_int2:= pt^; (* var_int2 ist nun 5 ) (In die der Wert 5 reingeschrieben wird*)

  7. #16
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ok Danke,
    eigentlich wollte ich nur strings loggen......scheint nicht ohne weiteres möglich zu sein.

    Wenn ich die Strings in ein CSV schreiben möchte, werde ich wohl auf die gleiche Problematik stossen, oder?

    Sonstige Ideen wie dies am einfachsten realisiert werden kann?

    Danke für eure Unterstützung

  8. #17
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von carepicha Beitrag anzeigen
    Ok Danke,
    eigentlich wollte ich nur strings loggen......scheint nicht ohne weiteres möglich zu sein.

    Wenn ich die Strings in ein CSV schreiben möchte, werde ich wohl auf die gleiche Problematik stossen, oder?

    Sonstige Ideen wie dies am einfachsten realisiert werden kann?

    Danke für eure Unterstützung
    Hi,

    1)Es geht auch anders, leider gegen Entgeld. Wenn ich Daten (Strings) logge und das ueber langen Zeitraum, dann bitet XML-Server
    die Loesung.
    Du kannst jede Information als String nach Daum und Uhrzeit sortiert im Log.xml File speichern.
    Man nehme anschliessend FTP und XML Editor vom MS.
    2) CSV ist eigentlich die primitive Version von XML, kann genauso im File gespeichert werden, und ueber XCell Import als EXcell-Tabelle ausgelesen werden.

  9. #18
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Leider ist mir noch nicht alles ganz klar.

    Mit dem Pointer zeigen wir lediglich auf den Start des Speicherortes.
    => Mit
    if ArraItem[x].String <> '' then (*hier wird nach einen String gesucht, wenn nichts da, wird der naechste Arrayfeld bearbeitet*)
    kann der Start des Array bestimmt werden wo ein String vorhanden ist.
    => An diesem Speicherort sind die Charakter im ASCI-Format abgelegt und sind pro Charakter 1 Byte gross.
    => Um den kompletten String zu bestimmen muss die länge diese Strings bestimmt werden und die Char dementsprechend entschlüsselt werden.



    Was ich jetzt nicht verstehe ist warum der erste Eintrag korrekt angezeigt wird.

    Logger.JPG

    Was sind dann die restlichen Einträge? Ich hätte erwartet die restlichen Einträge aus dem Struct zu Filtern.
    (Des Weitern sollten einige Einträge wie ein Teil einer IP-Adresse eigentlich gar nicht erscheinen)

    Danke für Eure Hilfe

  10. #19
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Hi,

    wenn dein String als noLimit definiert wurde, dann liest die PLC max 80 Zeichen (Standartgroesse), oder
    es gib den Zeichen "Stringende", was zu neuen Arrayeintrag fuehrt.
    Was du da siehst, ist der Speicherabbild beginnend mit Startadresse Quellstring.

    Irek

  11. #20
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich möchte nochmals auf die Adressierung zurückkommen.

    Ich habe ein Struct mit 21 Einträgen

    z.B
    Code:
    TYPE ST_Diag :
    STRUCT
    
    
    	SFCCurrentStepRef			:STRING (40);
    	SFCCurrentStepSystem                 :STRING (40);
            etc....
    Code:
    	Diag:ST_DIAG;
    Nun mache ich den Zugriff auf dieses Struct mit einem Pointer

    Code:
    ArrayDiagTemp := ADR (Diag);
    Code:
    ArrayDiagTemp:  POINTER TO ARRAY [0.. n] OF STRING;	                                (*This is the diag array which hold all the temp machine status*)
    														(*to access the diag infos more easly there is a struct defined which points to the same array*)
    														(*use this array only in *)

    Frage 1;
    Wieviel Speicherplatz wird nun für das ArrayDiagTemp reserviert?
    Könnte dies auch mit STRING (40) limitiert werden da die Daten im Struct nicht grösser sein können?
    Was passiert nun wenn das Array keine explizite hat Zuweisung hat?
    Es werden 80 Byte reserviert pro Array reserviert, oder?
    Da mein Eintrag im Struct mit 40 Byte limitiert ist bleiben dann der Speicherplatz von 41-80 immer leer?

    Frage 2;
    Warum zeigt es nur bei der ersten Zeile im Array den Korrekten Text vom Struct an?
    Ist jetzt nicht zu erwarten dass beim Array am Speicherplatz 81 sich der nächste String befindet?
    Gemäss vorherigem Post sind die Daten im ASCII abgelegt. Warum ist nun aber 1 Eintrag korrekt und der Rest ist Müll?

    Frage 3;
    Warum befinde ich mich im Speicherabbild der SPS?
    Ich hätte erwartet, dass ich mich lediglich im Speicher vom ArrayDiagTemp befinde.

    Sorry dass ich hier nochmals nachhacken muss, aber es lässt mich nicht in Ruhe wenn ich die Funktionsweise nicht verstehe.
    Danke für Eure Unterstützung?

Ähnliche Themen

  1. Test
    Von Anonymous im Forum Feldbusse
    Antworten: 0
    Letzter Beitrag: 06.11.2003, 18:29

Lesezeichen

Berechtigungen

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