Absolute Adressierung in SCL

ASi-Master

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :ROFLMAO:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Indizierter Zugriff auf Speicherbereiche der CPU

Die Indizierung muss den folgenden Regeln entsprechen:

  • Jeder Index muss dabei ein arithmetischer Ausdruck vom Datentyp INT sein
  • Bei einem Zugriff, der vom Datentyp BYTE, WORD oder DWORD ist, müssen Sie genau einen Index verwenden. Der Index wird als Byteadresse interpretiert. Die Zugriffsbreite wird durch das Größen-Präfix festgelegt.
  • Bei einem Zugriff, der vom Datentyp BOOL ist, müssen Sie zwei Indizes benutzen. Der erste Index spezifiziert die Byteadresse, der zweite Index die Bitposition innerhalb des Bytes.
Beispiel

MESSWERT := EW[ZAHELER];

AUSMARKE := E[BYTENR, BITNR];

Indizierter Zugriff auf Datenbausteine

Die Indizierung muss den folgenden Regeln entsprechen:

  • Bei einem Zugriff, der vom Datentyp BYTE, WORD oder DWORD ist, müssen Sie genau einen Index verwenden. Der Index wird als Byteadresse interpretiert. Die Zugriffsbreite wird durch das Größen-Präfix festgelegt.
  • Bei einem Zugriff, der vom Datentyp BOOL ist, müssen Sie zwei Indizes benutzen. Der erste Index spezifiziert die Byteadresse, der zweite Index die Bitposition innerhalb des Bytes.
  • Jeder Index muss dabei ein arithmetischer Ausdruck vom Datentyp INT (0 - 32767) sein
Beispiel

STATUS_1 := DB11.DW[ZAEHLER];

STATUS_2 := DB12.DX[WNR, BITNR];

STATUS_1 := Datenbasis1.DW[ZAEHLER];

STATUS_2 := Datenbasis2.DX[WNR, BITNR];

STATUS_1 := WORD_TO_BLOCK_DB(INDEX).DW[ZAEHLER];

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
Bild1.PNG
Bild2.PNG
 
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:
Zuviel Werbung?
-> Hier kostenlos registrieren
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

Bild.pngBild1.PNG


Hat mir vielleicht jemand noch einen Tipp wie das geht ?

Vielen Dank vorab.
 
Zurück
Oben