# Absolute Adressierung in SCL



## ASi-Master (5 Oktober 2008)

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.


----------



## Ralle (5 Oktober 2008)

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


----------



## Larry Laffer (6 Oktober 2008)

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



```
OSSD_On := E[Adresse,0] or E[Adresse,1] or E[Adresse,2] or E[Adresse,3] ;
```
Gruß
LL


----------



## ASi-Master (6 Oktober 2008)

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.


----------



## Kai (6 Oktober 2008)

Der indizierte Zugriff auf Speicherbereiche in der CPU oder auf Datenbausteine ist in der S7-SCL Online-Hilfe ganz gut beschrieben:



> *Indizierter Zugriff auf Speicherbereiche der CPU *
> 
> Die Indizierung muss den folgenden Regeln entsprechen:
> 
> ...


 


> *Indizierter Zugriff auf Datenbausteine*
> 
> Die Indizierung muss den folgenden Regeln entsprechen:
> 
> ...


 
Gruß Kai


----------



## buhuu (4 Januar 2015)

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?


----------



## Thomas_v2.1 (4 Januar 2015)

```
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.


----------



## buhuu (4 Januar 2015)

Ich verwende TIA-Portal V13, der Baustein soll auf einer S7-1500 laufen.
Es sagt mir das der Operand PED nicht definiert ist.


----------



## PN/DP (4 Januar 2015)

Ich meine, bei der S7-1500 brauchst Du die PEEK-Anweisung.

Harald


----------



## buhuu (6 Januar 2015)

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


```
#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));
```


----------



## PN/DP (6 Januar 2015)

Danke für die Erfolgs-Rückmeldung. So haben Andere auch was davon. 

Harald


----------



## buhuu (7 Januar 2015)

So soll es sein..


----------



## dertobi05 (11 Februar 2015)

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 :/


```
#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);
```


----------



## Larry Laffer (11 Februar 2015)

... dann poste doch vielleicht einfach mal deinen Code ...


----------



## buhuu (1 Oktober 2015)

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.


----------

