Absolute Adressierung in SCL

ASi-Master

Level-1
Beiträge
21
Reaktionspunkte
0
Hallo zusammen,

ich versuche eine Funktion zu schreiben, welche abhängig von einer Eingangsvariablen bestimmte absolute Eingänge/Ausgänge liest/schreibt.

Jetzt geht es darum, nachfolgende Zeilen in SCL zu realisieren:

// L #slave_address_02
// ITD
// LAR1
// O E [AR1,P#0.0]
// O E [AR1,P#0.1]
// O E [AR1,P#0.2]
// O E [AR1,P#0.3]
// = #OSSD_ON;


Aus den Foren habe ich gelesen, dass der rote Text so nicht geht (stammt aus einer AWL-Quelle). Vielmehr soll der AT-Befehl benutzt werden, aber wie?

Vielen Dank im voraus für konstruktive Tips.
 
Zuletzt bearbeitet:
Der AT-Befehl hat auch damit zu tun, aber du mußt dir eher ansehen, wie man in SCL mit Any umgeht, bzw. diese zusammenbaut, dazu kann man dann den AT-Befehl gut gebrauchen.

http://www.sps-forum.de/showthread.php?t=21582&highlight=Any+SCL

Zusätzlich: Suche im Forum unter "SCL + Any"

Nachtrag: Ja wirklich, so kompliziert muß es nicht sein, da gebe ich den folgenden Beitragsschreibern recht
 
Zuletzt bearbeitet:
na ... so kompliziert muß das doch gar nicht sein ...

Wenn du die Eingangs-Adresse als absoluten Wert übergibst, dann kannst du den auch so im Programm verarbeiten ...
Code:
OSSD_On := E[Adresse,0] or E[Adresse,1] or E[Adresse,2] or E[Adresse,3] ;
Gruß
LL
 
Hallo zusammen,

danke für die prompten Antworten.

Was LL schreibt, habe ich noch gestern Abend (eigentlich Nacht...) gefunden, und zwar in einer Siemens-Beschreibung - hört, hört!

Des Rätsels Lösung war die Syntax:

OPERAND [BYTE-NUMMER, BIT-NUMMER]

Leider wurde zum Thema SCL und indizierte Adressierung viel geschrieben, aber eben nie, wie´s gehen könnte (ich hab´s jedenfalls nicht gefunden oder nach den falsche Stichworten gesucht oder es einfach nicht verstanden). Als SCL-Neuling muß ich wohl noch einiges lernen. Fazit ist, es geht am Ende vieles viel einfacher.
 
Der indizierte Zugriff auf Speicherbereiche in der CPU oder auf Datenbausteine ist in der S7-SCL Online-Hilfe ganz gut beschrieben:



Gruß Kai
 
Hallo zusammen,
sorry wenn ich dieses Thema nach so langer Zeit nochmals hervorkrame aber habe auch ein Problem bei dem ich nicht weiterkomme.
Ich habe einige PAC3200 bei denen in der HW-Konfig jeweils die Spannungen L1, L2 und L3 konfiguriert sind.
Es besteht eine Funktion in AWL bei der die Adresse der ersten Spannung angegeben wird und die dann die Werte der 3 Messwerte ausgibt.
Diese sieht so aus:

L #HWADR
L 8
*D
LAR1


L PID [ AR1 , P#0.0 ]
T #SpannungL1
L PID [ AR1 , P#4.0 ]
T #SpannungL2
L PID [ AR1 , P#8.0 ]
T #SpannungL3

Diese Funktion will ich nun mit AWL nachbauen.
Gekommen bin ich leider nur soweit:

#SpannungL1 := #Startadresse + 0;
#SpannungL2 := #Startadresse + 4;
#SpannungL3 := #Startadresse + 8;


#Daten.SpannungL1_L2 := DWORD_TO_REAL();


Ich habe einfach keine Idee wie man in SCL auf HW-Adressen zugreift.
Hat mir vielleicht jemand einen Tipp?
 
Code:
SpannungL1 := PED[Startadresse + 0];
oder bist du im TIA-Portal? Denn da gab es mal Versionen bei denen das zwar programmierbar war, aber nicht funktionierte.
 
Ich verwende TIA-Portal V13, der Baustein soll auf einer S7-1500 laufen.
Es sagt mir das der Operand PED nicht definiert ist.

 
Vielen Dank für den Tipp.
So hats funktioniert:

Code:
    #SpannungL1adr := #Startadr + 0;
    #SpannungL2adr := #Startadr + 4;
    #SpannungL3adr := #Startadr + 8;


    
    #SpannungL1_out := DWORD_TO_REAL(PEEK_DWORD(area := 16#1, dbNumber := 0, byteOffset := #SpannungL1adr));
    #SpannungL1_out := DWORD_TO_REAL(PEEK_DWORD(area := 16#1, dbNumber := 0, byteOffset := #SpannungL2adr));
    #SpannungL3_out := DWORD_TO_REAL(PEEK_DWORD(area := 16#1, dbNumber := 0, byteOffset := #SpannungL3adr));
 
Hey,

ich habe ein ähnliches Problem! Bin im TIA Portal V13 unterwegs mit einer S7-1500. Dazu habe ich ein Euchner EKS System und möchte mehrere einzelne Eingangsbytes (ab dem EB257 bei mir) auslesen!
Da dachte ich, die Lösung von buuhuu könnte ich ja auch anwenden. Allerdings wird bei mir nicht das EB257 auf EB258 gezählt, sondern nur der Inhalt des Bytes mit 1 addiert!

Hab ich da gerade einen Denkfehler oder wo liegt mein Problem? SCL ist leider für mich noch absolutes Neuland... komme ich jetzt aber wohl nicht drum rum :/

Code:
#KeyCodeByte1 := #KC_StartAdr + 0;
#KeyCodeByte2 := #KC_StartAdr + 1;
#KeyCodeByte3 := #KC_StartAdr + 2;
    
        #KeyCode[0] := PEEK_BYTE(area := 16#1, dbNumber := 0, byteOffset := #KeyCodeByte1);
        #KeyCode[1] := PEEK_BYTE(area := 16#1, dbNumber := 0, byteOffset := #KeyCodeByte2);
        #KeyCode[2] := PEEK_BYTE(area := 16#1, dbNumber := 0, byteOffset := #KeyCodeByte3);
 
Zuletzt bearbeitet:
Hallo zusammen,
leider muss ich mich nochmals mit einer ähnlichen Frage wie oben schon einmal gestellt an euch wenden aber ich komm nicht weiter...

Ich arbeite nun mit TIA V13 SP1 und einer S7-315-2 DN/DP und versuche die gleiche Funktion wie beim letzten mal, 3 Spannungswerte aus einem PAC zu lesen so umzusetzen:



#SpannungL1_L2_adr := #Startadresse + 0;
#SpannungL1_L3_adr := #Startadresse + 4;
#SpannungL3_L2_adr := #Startadresse + 8;



#Daten.SpannungL1_L2 := DWORD_TO_REAL(PED(#SpannungL1_L2_adr);
#Daten.SpannungL3_L2 := DWORD_TO_REAL(PID(#SpannungL1_L2_adr);
//#Daten.SpannungL1_L3 :=


Bei PED komt Operand nicht deviiert, bei PID falsche Parameter(wird vermutlich ein Regler sein..)

PEEK und POOK funktioniert wohl nur bei der S7-1500




Hat mir vielleicht jemand noch einen Tipp wie das geht ?

Vielen Dank vorab.
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…