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

Seite 5 von 5 ErsteErste ... 345
Ergebnis 41 bis 47 von 47

Thema: Array in DB suchen

  1. #41
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn es ein Array of Byte als Input benötigt, macht es die Sache für mich noch einfacher. So funktioniert der Code wie gewünscht. Danke an Alle.


    Code:
    FUNCTION FC2 : VOID
    VAR_INPUT
      // Eingangsparameter
     ToCheckArray: array [0..31] OF BYTE
     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

  2. #42
    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
    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
    Ne Larry, ich widerspreche da mal. Hier #26 hab ich das Programm eingestellt, da gibts nur String[30] und AT-Array 0...31. Das sollte passen und funktioniert. Ich habe aber als Input auch schon einen String[30] und beide Temp-Strings als erstes mal mit dem Input-String initailisiert.
    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

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

    Hast Recht - Asche auf mein Haupt ...
    Ich habe mich auf den Beitrag #33 von Limette bezogen, wo es ja hies, dass es von deinem abgeleitet war ...
    Im Beitrag #26 findet sich dann ja auch die Sache mit dem Init, die ich ein wenig vermisst hatte ...

    Wie auch immer - es scheint ja nun zu funktionieren ...

    Gruß
    Larry

  4. #44
    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

    Ahhhrggggg,

    da hab ich doch noch einen grundsätzlichen Designfehler im Baustein gefunden.
    Die Outputs sollten besser zu den IN_OUT geschrieben werden, da bei einem FC Outputs unbedingt immer beschrieben werden müssen.
    Wenn also der Baustein fertig ist, wird einmalig der Output korrekt beschrieben (innerhalb der Schleife) und danach wird er zufällig beschrieben.
    Im OB1 funktioniert das ganze, in einem anderen Baustein aufgerufen kann das böse aussehen, zumindest in der Simulation ist das so, immer abhängig, was das restliche Programm so an Lokaldaten etc.
    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. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Limette (24.01.2012)

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

    Code:
    VAR_IN_OUT
    
    Nummer: INT;
    
    END_VAR
    
    VAR_TEMP
    
    Nummer_Temp: Word; 
     
    END_VAR
    
    // Funktion
    
    
    Nummer_Temp:=WORD_TO_BLOCK_DB(INT_TO_WORD(1001)).DB[66];               
    Nummer:=WORD_TO_INT(Nummer_Temp);
    
    
    // End Funktion
    In DB 1001 steht an der Adresse 66.0 eine Integer mit Wert "1004",
    angezeigt beim Output wird mir aber "3".
    An was könnte das liegen ?

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

    ... lies doch mal ein Word statt einen Byte ein - also :
    Code:
    Nummer_Temp:=WORD_TO_BLOCK_DB(INT_TO_WORD(1001)).DW[66];
    Gruß
    Larry

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

    Limette (25.01.2012)

  9. #47
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... lies doch mal ein Word statt einen Byte ein - also :
    Code:
    Nummer_Temp:=WORD_TO_BLOCK_DB(INT_TO_WORD(1001)).DW[66];
    Gruß
    Larry
    funktioniert.

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