Hilfe bei der Programmierung in SCL

DocHoff

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

gerade stehe ich etwas auf dem Schlauch und bräuchte mal eure Hilfe.

Ich möchte einen absolut adressierten Baustein indexiert auslesen.
Der Baustein besteht aus 256 Doppelwörtern beginnend mit DB700.DBD0

Jetzt würde ich gerne die einzelnen DWörter mit einer FOR-Schleife auslesen.
Vorgestellt habe ich mir das so:

Code:
    FOR #i := 0 TO 255 DO
        cache[#i] := DB700.DBD[#i]; 
    END_FOR;

Funktioniert so aber leider nicht.

System: TIA V13SP2

MfG
 
FOR #i := 0 TO 255 by 4 DO
cache[#i] := DB700.DBD[#i];
END_FOR;

Das dürfte nicht funktionieren, dann würde er ja bei DB700.DBD255 aufhören.
Er hat aber 256 DWORTE, wass ja als höchste Adresse DB700.DBD1020 ergibt.

Es müsste dann so sein:

Code:
FOR #i := 0 TO 1020 [COLOR=#0000ff]by 4[/COLOR] DO
        cache[#i] := DB700.DBD[#i]; 
    END_FOR;
 
Zuletzt bearbeitet:
Danke für die schnelle Hilfe,

das mit der Schrittweite ist einleuchtend, aber soweit komme ich garnicht.

Ich bekomme die Fehlermeldung: Ungültige Adresse DBD

Entschuldige , ich hatte nicht genau genug hingeschaut.
Dein Problem ist, wie du die Adresse bildest.
Hier müßtest du mit PEEK auf die Adresse zugreifen - schau dir dazu mal die Hilfe an ...

Gruß
Larry
 
Wenn DocHoff gleich angegeben hätte welche CPU er programmiert, dann wäre die Antwort mit dem PEEK sicher schon eine Stunde früher gekommen...

Falls er aber eine S7-300/400 hat - da gibt es die Anweisung PEEK nicht. Da müsste er schreiben "cache[#i] := %DB700.DD(#i * 4); "

Harald
 
Wenn DocHoff gleich angegeben hätte welche CPU er programmiert, dann wäre die Antwort mit dem PEEK sicher schon eine Stunde früher gekommen...

Hallo Harald,
hat er ... steht in seinem ersten Beitrag, dass er mit TIA V13 arbeitet ...
Bist du dir sicher, dass PEEK an der CPU hängt und nicht vielmehr am Entwicklungssystem ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder den DB mit einem Array of DWORD aufbauen, dann ginge das auch.
Du machst einen indizierten Zugriff auf ein STRUCT. Das tut nur mit PEEK, wie Larry bereits anmerkte.
PEEK und POKE gibt's aber nicht in der Classic-Welt 300er/400er!
 
Code:
FOR #i := 0 TO (255 * 4) BY 4 DO
    
    #cache[[COLOR=#FF0000]#i * 4[/COLOR]] := PEEK_DWORD(area := 16#84, dbNumber := 703, byteOffset := #i);
    
END_FOR;

Bist du sicher, du multiplizierst den Index ja jetzt 2x nacheinander mit 4
 
Code:
FOR #i := 0 TO (255 * 4) BY 4 DO
    
    #cache[[COLOR=#FF0000]#i * 4[/COLOR]] := PEEK_DWORD(area := 16#84, dbNumber := 703, byteOffset := #i);
    
END_FOR;

Bist du sicher, du multiplizierst den Index ja jetzt 2x nacheinander mit 4


Ja das stimmt, der Code ist fehlerhaft.
Ist mir im Eifer des Gefechts nicht aufgefallen.

Richtig wäre es so:
Code:
#cache[[COLOR=#ff0000]#i / 4[/COLOR][COLOR=#0000cd]][/COLOR] := PEEK_DWORD(area := 16#84, dbNumber := 703, byteOffset := #i);

#cache ist ein array of real.

Inzwischen sieht der Code so aus:
Code:
FOR #i := 0 TO 255 DO
    
    #DWort_rv := PEEK_DWORD(area := 16#84, dbNumber := 703, byteOffset := #i * 4);
    
    #DWort_rt.%B2 := #DWort_rv.%B0;
    #DWort_rt.%B3 := #DWort_rv.%B1;
    #DWort_rt.%B1 := #DWort_rv.%B2;
    #DWort_rt.%B0 := #DWort_rv.%B3;
    
    #cache[#i] := DWORD_TO_REAL(#DWort_rt);
    
END_FOR;

Das Problem ist zusätzlich, das die Byteorder der ausgelesenen Daten umgestellt werden muss.

Grüsse Thomas
 
Zurück
Oben