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

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 47

Thema: Array in DB suchen

  1. #31
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Oh peinlich, habe ich voll übersehen.
    Sollte Feierabend machen, war ein harter Tag.

    Edit: Dann nur noch ein letzter Tipp!
    Nimm doch für den String Vergleich den Baustein EQ_STRING so wie Ralle schon geschrieben hat:
    Code:
              //Stringvergleich    
                EQ := EQ_STRNG(S1 := Temp_String1
                              ,S2 := Temp_String2 
                              );
    Geändert von Paule (19.01.2012 um 21:30 Uhr) Grund: TIPP
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  2. #32
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Zitat Zitat von Paule Beitrag anzeigen
    Oh peinlich, habe ich voll übersehen.
    Sollte Feierabend machen, war ein harter Tag.
    Erst wenn du das problem gelöst hast, darfst du feierabend machen. *spaß*

  3. #33
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Danke für diesen Code. Er umfasst mehr als ich brauche. Habe ihn mal nach meinen Bedurfnissen gesetutzt. Leider bringt der FC ständig "gefunden = 1" obwohl es nicht sein kann. Habe mein zu suchenden array of byte, zuvor per blkmov in einen string gewandelt, siehen Input.

    Code:
    FUNCTION FC2 : VOID
    VAR_INPUT
      // Eingangsparameter
      ToCheckArray: STRING[32];
      Start_DB_Nummer: INT;             //Beginn der Suche bei DB
      
    END_VAR
    
    
    VAR_OUTPUT 
                  
      DB_Nummer:   INT;       
      gefunden: BOOL;                   
    END_VAR
    
    
    VAR_IN_OUT 
      Start: Bool;
    END_VAR
    
    
    VAR_TEMP
      
      I, J, K: INT;
      EQ: BOOL;
      DoExit: BOOL;
      Temp_String1: STRING[32];
      atTemp_String1 AT Temp_String1: ARRAY[0..31] OF BYTE;
      Temp_String2: STRING[32];
      atTemp_String2 AT Temp_String2: ARRAY[0..31] OF BYTE;
      Quell_DB, Quell_DW: INT;  
    END_VAR
    
    IF Start THEN
        //Anfangswerte setzen
        EQ := False;    
        DB_Nummer := 0;    
        gefunden := False;
        Temp_String1 := ToCheckArray;    
        DoExit := False;
       
            
            FOR I := 0 TO 5 DO
                Quell_DB := Start_DB_Nummer + J;
                Quell_DW := (16 * I) + (1 * I); // 32byteArray + 2 byteBuffer = 34 Byte => 1 Array of Struckt        
    
                FOR K := 0 TO 31 DO
                    atTemp_String2[K] :=WORD_TO_BLOCK_DB(INT_TO_WORD(Quell_DB)).DB[Quell_DW + K];
           
                END_FOR;    
                    
                //Die Teilstringvergleiche benötige ich nicht.   
                EQ := EQ_STRNG(S1 := Temp_String1,S2 := Temp_String2);                          
            
                IF EQ THEN               
                    
                    gefunden := True;
                    Start := False;
                    DoExit := True;
                    EXIT;
                END_IF; 
            END_FOR;
            IF DoExit THEN
                EXIT;
            END_IF; 
        
        Start := False;   
        DoExit := False;
    END_IF;
     
    END_FUNCTION
    Geändert von Limette (19.01.2012 um 21:56 Uhr)

  4. #34
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Zitat Zitat von Limette Beitrag anzeigen
    Danke für diesen Code. Er umfasst mehr als ich brauche. Habe ihn mal nach meinen Bedurfnissen gesetutzt. Leider bringt der FC ständig "gefunden = 1" obwohl es nicht sein kann. Habe mein zu suchenden array of byte, zuvor per blkmov in einen string gewandelt, siehen Input.

    Code:
    FUNCTION FC2 : VOID
    VAR_INPUT
      // Eingangsparameter
      ToCheckArray: STRING[32];
      Start_DB_Nummer: INT;             //Beginn der Suche bei DB
      
    END_VAR
    
    
    VAR_OUTPUT 
                  
      DB_Nummer:   INT;       
      gefunden: BOOL;                   
    END_VAR
    
    
    VAR_IN_OUT 
      Start: Bool;
    END_VAR
    
    
    VAR_TEMP
      
      I, J, K: INT;
      EQ: BOOL;
      DoExit: BOOL;
      Temp_String1: STRING[32];
      atTemp_String1 AT Temp_String1: ARRAY[0..31] OF BYTE;
      Temp_String2: STRING[32];
      atTemp_String2 AT Temp_String2: ARRAY[0..31] OF BYTE;
      Quell_DB, Quell_DW: INT;  
    END_VAR
    
    IF Start THEN
        //Anfangswerte setzen
        EQ := False;    
        DB_Nummer := 0;    
        gefunden := False;
        Temp_String1 := ToCheckArray;    
        DoExit := False;
       
            
            FOR I := 0 TO 5 DO
                Quell_DB := Start_DB_Nummer + J;
                Quell_DW := (16 * I) + (1 * I); // 32byteArray + 2 byteBuffer = 34 Byte => 1 Array of Struckt        
    
                FOR K := 0 TO 31 DO
                    atTemp_String2[K] :=WORD_TO_BLOCK_DB(INT_TO_WORD(Quell_DB)).DB[Quell_DW + K];
           
                END_FOR;    
                    
                //Die Teilstringvergleiche benötige ich nicht.   
                EQ := EQ_STRNG(S1 := Temp_String1,S2 := Temp_String2);                          
            
                IF EQ THEN               
                    
                    gefunden := True;
                    Start := False;
                    DoExit := True;
                    EXIT;
                END_IF; 
            END_FOR;
            IF DoExit THEN
                EXIT;
            END_IF; 
        
        Start := False;   
        DoExit := False;
    END_IF;
     
    END_FUNCTION
    Mach mal den Code mit dem DB10 rein, dann kannst du dir in einer Variablentabelle ansehen, was genau umkopiert wird.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #35
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    er kopiert bei "Start" Trigger den String von dem DB in den Test DB. Das passt ja dann schon mal. Leider wird ständig "gefunden" gesetzt obwohl die strings nicht stimmen können. "gefunden" ist eigentlich ständig "1".

    edit: ne doch nicht. nur wenn der string nicht mehr als 3 stellen ("1","1","1") lang ist. Ab 4 wird nichts mehr kopiert und gefunden ist "0".
    Geändert von Limette (20.01.2012 um 11:22 Uhr)

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

    Standard

    Wenn ich mir den Beispiel-Code so ansehe fällt mir das Folgende auf :
    Auf die Temp-Strings wird eine AT-Sicht mit einem Array [0..31] of Byte gemacht. Das ist nicht korrekt - es müßte dann schon [-2 ..31] of byte sein, da die Strings ja noch einen Header haben.
    Der Header wäre dann der nächste Punkt. hier sollte dann natürlich die max. Lnge und die deklarierte Länge (hier in beiden Fällen für die Eq_String-Funktion = 32) eingetragen werden.

    Mein Vorschlag demnach :
    Code:
    FUNCTION FC2 : VOID
    VAR_INPUT
      // Eingangsparameter
      ToCheckArray: STRING[32];
      Start_DB_Nummer: INT;             //Beginn der Suche bei DB
      
    END_VAR
    
    
    VAR_OUTPUT 
                  
      DB_Nummer:   INT;       
      gefunden: BOOL;                   
    END_VAR
    
    
    VAR_IN_OUT 
      Start: Bool;
    END_VAR
    
    
    VAR_TEMP
      
      I, J, K: INT;
      EQ: BOOL;
      DoExit: BOOL;
      Temp_String1: STRING[32];
      atTemp_String1 AT Temp_String1 : struct
         Header : array [0..1] of byte ;
         Daten : array [0..31] OF BYTE;
       end_struct ;
      Temp_String2: STRING[32];
      atTemp_String2 AT Temp_String2 : struct
         Header : array [0..1] of byte ;
         Daten : array [0..31] OF BYTE;
       end_struct ;
      Quell_DB, Quell_DW: INT;  
    END_VAR
    
    IF Start THEN
        //Anfangswerte setzen
        EQ := False;    
        DB_Nummer := 0;    
        gefunden := False;
        atTemp_String1.Daten := ToCheckArray;    
        atTemp_String1.Header[0] := 32 ; atTemp_String1.Header[1] := 32 ;
    
        DoExit := False;
       
            
            FOR I := 0 TO 5 DO
                Quell_DB := Start_DB_Nummer + J;
                Quell_DW := (16 * I) + (1 * I); // 32byteArray + 2 byteBuffer = 34 Byte => 1 Array of Struckt        
    
                FOR K := 0 TO 31 DO
                    atTemp_String2.Daten[K] :=WORD_TO_BLOCK_DB(INT_TO_WORD(Quell_DB)).DB[Quell_DW + K];
                END_FOR;    
                atTemp_String2.Header[0] := 32 ; atTemp_String2.Header[1] := 32 ;
                    
                //Die Teilstringvergleiche benötige ich nicht.   
                EQ := EQ_STRNG(S1 := Temp_String1,S2 := Temp_String2);                          
            
                IF EQ THEN               
                    
                    gefunden := True;
                    Start := False;
                    DoExit := True;
                    EXIT;
                END_IF; 
            END_FOR;
            IF DoExit THEN
                EXIT;
            END_IF; 
        
        Start := False;   
        DoExit := False;
    END_IF;
     
    END_FUNCTION
    Gruß
    Larry

  7. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Limette (20.01.2012)

  8. #37
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Danke für deine Hilfe LL.

    bei
    Code:
    atTemp_String1.Daten := ToCheckArray; 
    Bringt er die Fehlermeldung zu "ToCheckArray" : ungültiger Datentyp.

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

    Standard

    ... ich muss dir nun auch gestehen, dass ich (auch wenn mein Code es anders darstellt) das ToCheckArray noch als Array [0..31] of Byte in Erinnerung hatte. Ist es ein String, so gilt das, was ich geschrieben habe und wie ich es geschrieben habe, so nicht. Die Zuweisung von TempString_1 wäre dann, wie bei Ralle dargestellt, richtig gewesen. Das setzt dann natürlich immer noch voraus, dass der Übergabe-Parameter an den FC (ToCheckArray) korrekt formatiert ist (also die Header-Info's tatsächliche Länge und deklarierte Länge korrekt eingetragen sind). Im Falle der Schleife, die den DB-Inhalt dann aber in den TempString_2 bringt, sollte es aber so richtig sein und funktionieren, wie von mir dargestellt.

    Ganz wichtig für die Verwendung aller Siemenes-String-Routinen : Die hier verwendeten Strings müssen immer korrekt formatiert sein (Header-Info wie oben genannt). Ansonsten funktionieren sie nicht oder nicht richtig.

    Gruß
    Larry

  10. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Limette (21.01.2012)

  11. #39
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Wenn ich mir den Beispiel-Code so ansehe fällt mir das Folgende auf :
    Auf die Temp-Strings wird eine AT-Sicht mit einem Array [0..31] of Byte gemacht. Das ist nicht korrekt - es müßte dann schon [-2 ..31] of byte sein, da die Strings ja noch einen Header haben.
    Der Header wäre dann der nächste Punkt. hier sollte dann natürlich die max. Lnge und die deklarierte Länge (hier in beiden Fällen für die Eq_String-Funktion = 32) eingetragen werden.

    Mein Vorschlag demnach :
    Code:
    FUNCTION FC2 : VOID
    VAR_INPUT
      // Eingangsparameter
      ToCheckArray: STRING[32];
      Start_DB_Nummer: INT;             //Beginn der Suche bei DB
      
    END_VAR
    
    
    VAR_OUTPUT 
                  
      DB_Nummer:   INT;       
      gefunden: BOOL;                   
    END_VAR
    
    
    VAR_IN_OUT 
      Start: Bool;
    END_VAR
    
    
    VAR_TEMP
      
      I, J, K: INT;
      EQ: BOOL;
      DoExit: BOOL;
      Temp_String1: STRING[32];
      atTemp_String1 AT Temp_String1 : struct
         Header : array [0..1] of byte ;
         Daten : array [0..31] OF BYTE;
       end_struct ;
      Temp_String2: STRING[32];
      atTemp_String2 AT Temp_String2 : struct
         Header : array [0..1] of byte ;
         Daten : array [0..31] OF BYTE;
       end_struct ;
      Quell_DB, Quell_DW: INT;  
    END_VAR
    
    IF Start THEN
        //Anfangswerte setzen
        EQ := False;    
        DB_Nummer := 0;    
        gefunden := False;
        atTemp_String1.Daten := ToCheckArray;    
        atTemp_String1.Header[0] := 32 ; atTemp_String1.Header[1] := 32 ;
    
        DoExit := False;
       
            
            FOR I := 0 TO 5 DO
                Quell_DB := Start_DB_Nummer + J;
                Quell_DW := (16 * I) + (1 * I); // 32byteArray + 2 byteBuffer = 34 Byte => 1 Array of Struckt        
    
                FOR K := 0 TO 31 DO
                    atTemp_String2.Daten[K] :=WORD_TO_BLOCK_DB(INT_TO_WORD(Quell_DB)).DB[Quell_DW + K];
                END_FOR;    
                atTemp_String2.Header[0] := 32 ; atTemp_String2.Header[1] := 32 ;
                    
                //Die Teilstringvergleiche benötige ich nicht.   
                EQ := EQ_STRNG(S1 := Temp_String1,S2 := Temp_String2);                          
            
                IF EQ THEN               
                    
                    gefunden := True;
                    Start := False;
                    DoExit := True;
                    EXIT;
                END_IF; 
            END_FOR;
            IF DoExit THEN
                EXIT;
            END_IF; 
        
        Start := False;   
        DoExit := False;
    END_IF;
     
    END_FUNCTION
    Gruß
    Larry
    Das müßte ich noch einmal testen, denn der von mir gepostete Code inkl. dem Vergleich funktioniert bei mir völlig problemlos, der "Header" landet in Byte 0 und Byte 1, wie das bei einem S7-String aussieht.
    Ob du das Array 0..31 oder -2... 31 anlegst, ist m.E. nach einfach Geschmacksache, das betrifft eigentlich nur die Adressierbarkeit der einzelnen Bytes in der AT-Ansicht. (ich hatte String[30], also sollt 0.31 passen) Wenn ich also den Header anspreche, spreche ich Byte 0 und Byte 1 an.

    PS: Den String in die Struct packen geht auch, ist aber nicht unbedingt nötig.
    Geändert von Ralle (20.01.2012 um 22:44 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  12. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Limette (21.01.2012)

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Ralle,
    nein ... du hattest String[32] (und der ist dann ja tatsächlich ein 34-Byte-Array) - das war es dann ja, was mich dabei etwas befremdet hatte.
    Ich hatte dann auch nicht die Header-Initialisierung des Temp-String 2 gefunden. Das würde dann aber schon zu dem von Limette beschriebenen Verhalten führen (oder beitragen).
    Bi der Art, eine AT-Sicht darauf zu bilden kann man natürlich dann phantasievoll sein ...

    Gruß
    Larry

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. FB' in FB's suchen
    Von Poldi007 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.08.2009, 07:30
  3. Suchen Elektroingenieur
    Von WEKO im Forum Suche - Biete
    Antworten: 4
    Letzter Beitrag: 20.09.2007, 08:05
  4. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12
  5. Perepherie suchen in S5
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 22.03.2005, 15:02

Lesezeichen

Berechtigungen

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