SCL - Fehler, Bereichslängenfehler beim Lesen

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
FUNCTION FC1002 : VOID
VAR_INPUT
  
  ToCheckUID: ARRAY[0..31]OF Byte;
  Assignment_DB_Number: BLOCK_DB;                         
End_var

VAR_IN_OUT 
  Start: BOOL;
  Assigment_Number: INT;            
  DB_Number: INT;         
  Exist: BOOL; 
END_VAR

VAR_TEMP
  DB_Number_Temp: dWord;
  I, K: INT;
  EQ: BOOL;
  DoExit: BOOL;
  Temp_String1: STRING[32];
  atTemp_String1 AT Temp_String1 : struct
     Header : array [0..1] of Byte ;
     Data : array [0..31] OF Byte;
   end_struct ;
  Temp_String2: STRING[32];
  atTemp_String2 AT Temp_String2 : struct
     Header : array [0..1] of Byte ;
     Data : array [0..31] OF Byte;
   end_struct ;
  Quell_DW: INT;  
  
END_VAR

IF Start THEN
   
    EQ := False;    
    DB_Number := 0;    
    Exist := False;
    atTemp_String1.Data := ToCheckUID;    
    atTemp_String1.Header[0] := 32 ; atTemp_String1.Header[1] := 32 ;  
    DoExit := False;
    Quell_DW:=0;
    i:=0;
    k:=0;
    Assigment_Number:=0;
    
                 
            FOR I := 0 TO 1799 DO
            
            Quell_DW := (34 * I);        
            FOR K := 0 TO 31 DO
                [B][I][COLOR=#ff0000]atTemp_String2.Data[K] :=Assignment_DB_Number.DB[Quell_DW + K];    [/COLOR]              
[/I][/B]             
            END_FOR;    
           
            atTemp_String2.Header[0] := 32 ; atTemp_String2.Header[1] := 32 ;     
                
            EQ := EQ_STRNG(S1 := Temp_String1,S2 := Temp_String2);                          
        
            IF EQ THEN
                Assigment_Number:= Quell_DW;           
                DB_Number_Temp:=Assignment_DB_Number.DW[Quell_DW + 32];               
                DB_Number:=DWORD_TO_INT(DB_Number_Temp);
                Exist := True;
                Start := False;
                DoExit := True;
                EXIT;
            END_IF;
        IF DoExit THEN
            EXIT;
        END_IF; 
           
        END_FOR;     
    
    Start := False;   
    DoExit := False;
END_IF;
 
END_FUNCTION

Bei der rot gemachten zeile wird der bereichslängenfehler angegeben. wenn man die hilfe zum fehler anklickt, erscheint irgendetwas weil es über 65.535
hinahinaus gegangen ist. 34x1800 ist aber nur 61200. :(
hat jemand einen tipp ?
 
Bei der rot gemachten zeile wird der bereichslängenfehler angegeben. wenn man die hilfe zum fehler anklickt, erscheint irgendetwas weil es über 65.535
hinahinaus gegangen ist. 34x1800 ist aber nur 61200. :(
hat jemand einen tipp ?

Aber das sind Byte und du greifst auf DW zu.
Dann wird es ziemlich viel, das du programmieren willst.


bike
 
Du greifst auf DW 61200 zu.
Das sind doch 122400 Byte; oder?
Und da überschreitest du die Grenze von 65535.
Denn dein DW ist 34*i+K also max 61197.

Da ist doch die Grenze deines DB erreicht, denke ich mal

schon einmal mit 100 anstelle von 1799 versucht?


bike
 
Du greifst auf DW 61200 zu.
Das sind doch 122400 Byte; oder?
Und da überschreitest du die Grenze von 65535.
Denn dein DW ist 34*i+K also max 61197.

Da ist doch die Grenze deines DB erreicht, denke ich mal

schon einmal mit 100 anstelle von 1799 versucht?


bike

ja, mit 100 geht es.
oh ha. für mich bedeutet:
Code:
Assignment_DB_Number.DB[1]
sowiel wie z.B.
Code:
db5.dbb1

und was ist mit ?
Code:
Assignment_DB_Number.D[COLOR=#ff0000]W[/COLOR][1]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja wenn man auf DW61200 zugreift greift man auf DBB61200 und DBB61201 zu... ich weis nicht warum du das verdoppelst Bike?


Ich denke eher das Problem wird sein das du auf DB0 zugreifst (Assginment Number)

Grüße

Marcel

Edit: Ich nehme zurück! Das ist Var_IN! Also weis ich nicht was drin steht!
 
Zuletzt bearbeitet:
Naja wenn man auf DW61200 zugreift greift man auf DBB61200 und DBB61201 zu... ich weis nicht warum du das verdoppelst Bike?


Ich denke eher das Problem wird sein das du auf DB0 zugreifst (Assginment Number)

Grüße

Marcel

Edit: Ich nehme zurück! Das ist Var_IN! Also weis ich nicht was drin steht!

Assginment Number = 1000. aber das dürfte ja keine rolle spielen.
 
Hi,

das Problem ist der INT der geht bis maximal +32767 mache aus der Variable Quell_DW einen DINT und ändere den Code wie folgt:

Code:
            Quell_DW := (34 * INT_TO_DINT(I));
            FOR K := 0 TO 31 DO
                atTemp_String2.Data[K] :=Assignment_DB_Number.DB[Quell_DW + INT_TO_DINT(K)];                  
             
            END_FOR;

Achtung das geht aber erst ab SCL Version 5.3 SP1 HF 1.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

das Problem ist der INT der geht bis maximal +32767 mache aus der Variable Quell_DW einen DINT und ändere den Code wie folgt:

Code:
            Quell_DW := (34 * INT_TO_DINT(I));
            FOR K := 0 TO 31 DO
                atTemp_String2.Data[K] :=Assignment_DB_Number.DB[Quell_DW + INT_TO_DINT(K)];                  
             
            END_FOR;

Achtung das geht aber erst ab SCL Version 5.3 SP1 HF 1.

Gruss Daniel

dachte INT geht bis 65535. Sind sie in SCL automatisch alle "signed" ?...vielen dank jedenfalls, werde es morgen gleich mal probieren.
 
Zurück
Oben