Array in DB suchen

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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:cool: 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 ... :rolleyes:

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

Gruß
Larry
 
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.
 
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 ?
 
Zurück
Oben