Vom Symbolnamen einer E/A Adresse auf die Adresse als DWORD schließen?

Muphin

Level-1
Beiträge
51
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag!
Ich möchte die WRREC funktion nutzen, für deren Aufrug man ja bei der ID die unterste E/A Adresse der Baugruppe angeben muss.
Nun wäre es sehr sinnvoll das ganze auch in Abhängigkeit der Symboltabelle machen zu können.
Dort sind sowieso die Ein- und Ausgabeadressen der entsprechenden Baugruppe angegeben. Also z.B. Symbol "Eingangsword0" verweißt auf die Adresse "PEW 260" was ja für die ID angabe heißen müsste "DW#0260".
Gibt es jetzt eine Möglichkeit von dem "Eingangsword0" auf das "DW#0260" zu schließen?

Hoffe ihr habt da wieder ne hervorragende Idee ;)

Grüße
Muphin
 
Hi,

das geht nur wenn der Baustein in einem FC oder FB aufgerufen wird.
Das PEW übergibst Du mittels Pointer, so kann man es symbolisch Adressieren.

Code:
      L     P##IN
      LAR1  

      L     B [AR1,P#2.0]
      T     #Speicherbereich            // Speicherbereich h80 bei PEW

      L     D [AR1,P#2.0]
      L     DW#16#FFFFFF                // Speicherbereich ausblenden
      UD    
      SRD   3                           // Bitadresse entfernen
      T     #Adresse

IN wäre der POINTER an dem z.B. PEW256 steht.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallö!
Der Aufruf erfolgt über einen FB, das ganze sollte also machbar sein.
Allerdings ist der komplette Ablauf in SCL geschrieben und ich komm bei der Umsetzung des Codes als SCL Programm nicht wirklich voran.
Hast du auch eine Idee dazu wie das ganze in SCL aussehen muss?

Grüße
Muphin
 
Hallo,
du müßtest dir eine AT-Sicht auf den IN-Parameter machen, die ihn entsprechend abbildet. Bei einem FB sollte das gehen - etwa so :
Code:
myInput : pointer ;
at_Sicht AT myInput : struct
   DB_Nr : byte ;
   Adresse : DWORD ;
end_struct ;

Mit der Variablen "at_Sicht.Adresse" dann weiter verfahren wie von Dalbi schon geschildert ...

Gruß
Larry
 
Hallo!
So ich hab mal ein Beispiel dazu programmiert, leider will das ganze noch nich so richtig funktionieren, ich durchschau die Funktionsweiße wohl nich so 100%.

Aufruf im OB1 (in AWL); "ReglerEW0" ist das Symbol für "PEW260"
Code:
CALL  "Steuerung" , "Steuerungsdaten"
       ReglerEAAdressePoint:="ReglerEW0"

Funktionsblock zur Steuerung (in SCL)
Code:
FUNCTION_BLOCK Steuerung
...
VAR_INPUT
    ReglerEAAdressePoint  : POINTER;
    ReglerEAAdresseStruct AT ReglerEAAdressePoint : STRUCT
        ReglerEAByte      : BYTE;
        ReglerEAAdresse   : DWORD;
    END_STRUCT;
END_VAR
...
WRREC...
        ,ID := ReglerEAAdresseStruct .ReglerEAAdresse

Kannst du mir sagen wo es da hängt?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... das müßte dann so aussehen :
Code:
myPerepherieAdresse := DINT_to_INT(DWORD_to_DINT (ReglerEAAdresseStruct.ReglerEAAdresse and dw#16#FFFFFF) / 8) ;
... ist aber ungetestet ...

Gruß
Larry
 
Weiß auch jemand von euch wieso das mit diesem seltsamen struct so an die Adresse des Slave herankommen kann?
Liegt das am internen Aufbau von Simatic und da steht hinter dem Eingangsbyte im Speicher dann immer die Adresse?
Also praktisch so, dass man über den Pointer, der ja eigentlich auf das Eingangsbyte zeigt, und das dahinterliegende struct, an die Daten die im Speicher nach den Eingangsbytewerten liegen, dran kommt?

Aber wofür ist dann noch das ...AND dw#16#FFFFFF / 8?

Also nach meinem Test scheint da wirklich dann die Adresse als dezimalwert raus zu kommen, super! Danke! :)

Allerdings muss für WRREC dem ID Wert ein DW zuweisen.
Das sieht im Moment so bei mir aus:
Code:
WRREC...
   ,ID := SHR( IN := (ReglerEAAdresseStruct.ReglerEAAdresse AND dw#16#FFFFFF), N := 3);
Das "/8" hab ich durch den SHR Befehl ersetzt, da eine Division nur mit INT funktioniert, nicht mit einem DW!
Jetzt wird in meinem Fall der ID allerdings 16#0104 zugewiesen, das entspricht in Dez dem Wert 260 was ja die Adresse wäre, ich brauch die allerdings als DW, also DW#16#0260!
Kennt jetzt noch jemand eine Möglichkeit von den dezimalen 260 auf ein DW#16#0260 zu kommen? Meine Überlegungen bringen da bisher kein Ergebnis :-/

Grüße
 
Zuletzt bearbeitet:
Hallo,
den Aufbau des Pointers kannst du in der Step7-Hilfe nachlesen - den möchte ich hier jetzt nicht unbedingt posten - das wird dort aber gut beschrieben. Durch das (Aus-)Maskieren bildest du dir den Bit-Pointer der Adresse. Durch den Schiebebefehl machst du daraus einen (Byte-)Adresspointer. Dadurch kommst du an die Adresse.

Jetzt zu deiner Frage - was ist der Hintergrund, weshalb du von dem Adresswert, den du nun ja absolut hast, einen BCD-Wert erzeugen willst ? Ich habe den Sinn dessen leider nicht verstanden und kann dir aus dem Grund auch keine Antwort geben - also ... was soll daraus dann werden ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kennt jetzt noch jemand eine Möglichkeit von den dezimalen 260 auf ein DW#16#0260 zu kommen? Meine Überlegungen bringen da bisher kein Ergebnis :-
Grüße

Denn Sinn darin Verstehe Ich auch nicht, aber wandeln kannst du das schon.
In AWL geht das mit dem ITB Befehl.

Für SCL siehe hier:
http://support.automation.siemens.c...extranet=standard&viewreg=WW&load=treecontent
 
Also jetzt bin ich doch etwas überrascht wieso das nich so ganz klar zu sein scheint. Das rührt ja von meinem ursprünglichen Problem her.
Ich möchte auf eine bestimmte Peripherieadresse mit WRREC zugreifen, die unterste Eingabeadresse des Slaves ist die 260 und die muss man dem WRREC als Input in Form eines DW mitgeben, das würde normalerweiße dann so aussehen:
Code:
WRREC...
        ,ID := DW#260;...
Deshalb brauch ich auch die 260 als DW#260 und nicht als dezimalzahl!

Da ich ja für die Eingabeadresse ein Symbol angelegt habe, das "ReglerEW0" mit "PEW 260", ist es ja absolut Sinnvoll auch den Zugriff des WRREC über dieses Symbol zu gestalten, z.B. falls sich an der Adresse einmal etwas ändern sollte.

@Larry
Ich habe mich nun auch durch die Step7 Hilfe und auch die Hilfe zu SCL durchgeklickt und ebenfalls nach Pointer, Adresse und Adressierung gesucht, konnte allerdings keine relevanten Hilfeeinträge finden.
Kannst du mir sagen unter was für einem Eintrag oder über was für ein Stichwort das ganze auffindbar sein sollte?

Grüße
 
Also, wenn Ich an einen FC normalerweise die Adresse der Baugruppe in Hex mitgeben muss, dann ist das wenn die Baugruppe die Adresse 260 hat nicht W#16#0260 sondern W#16#104!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wäre normalerweiße auch meine Vermutung gewesen, scheint bei WRREC und ebenso bei RDREC allerdings anders zu sein.
Das ganze funktioniert ja prinzipiell schon, zumindest wenn ich da "ID := DW#260" angeb, bei "ID := DW#104" allerdings nicht! :?
 
Hallo Muphin,
in der SCL-Hilfe wirst du zum Thema "Pointer" nicht so viel finden da SCL mit den Dingern nicht so viel zu tun haben möchte. Ich sprach aber auch von Step7 und nicht von SCL. Wenn du es nicht findest dann kopiere ich es dir aber auch gerne da raus ...

Wenn du aus 260 dw#16#260 machen möchtest so geht das nur über die Umwandlungsbefehle. Du mußt den Dezimalwert in BCD wandeln. Das hiesse dann in SCL z.B. "DINT_to_BCD_DWord".

Gruß
Larry
 
*lol*...
Ihr hattet doch recht, man braucht das 16#104 für die ID!
Wenn man da eine Zwischenvariable einführt z.B. tempID : DWORD und weißt der tempID := DW#260 zu, steht danach in tempID = 16#104 drin. :p

Ich hätte jetzt gedacht es gibt gar keine Umwandlungen von Dez 260 auf ein 16#260, das mit den BCD umwandlungen muss ich mir da gleich merken, danke!

Wie gesagt, ich hab auch in der Step7 Hilfe nachgeschaut und auch nichts entdeckt, wär also echt super wenn du mir da noch nen Tipp hast wo ich das genau find, nachschlagen in der Hilfe kann ich das ja ohne Probleme! (Darfst es natürlich aber auch hier rein kopiere, wie du magst!)

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also denn :
In Step 7 einen Baustein öffnen.
Dann Hilfe-Hilfethemen und bei der Suche "Pointer" eingeben.
Dann erscheint darunter der Eintrag "Pointerformat" und da den Sub-Eintrag "Format des Parametertyps Pointer" anwählen - und schwupps ... da ist der Aufbar erklärt und beschrieben ...

Gruß
Larry
 
Hallo Muphin,
ich muss Dein wissen mal anzapfen, da Du Dich wohl sehr gut mit symbolischer Adressierung in SCL auskennst. (Ich hoffe ich darf das hier so dazwischen schmieren, weil ich noch nicht einmal herausgefunden habe, wie man hier ein neues Thema anfängt:confused:.)

Ich habe einen SCL-FC bei dem ich als Eingangsparameter den auszulesenden ParamDB := BLOCK_DB und die absolute Adresse ParamAdr := INT übergebe. Innerhalb des FC's kann ich dann jeden Wert ab dieser Startadresse absolut adressieren und auslesen:
dSpeed := ParamDB.DD[ParamAdr + i*4];
... das funktioniert.

Jetzt wollte ich aber die Adresse symbolisch übergeben und habe mir einen neuen FB geschrieben, mit einer POINTER-Variablen, welche ich jedoch nicht ausgewertet bekomme. Es handelt sich um eine Struktur (kein Array) mit diversen Real-Sollwerten, von denen ich mir eine Auswählen möchte:

FUNCTION_BLOCK cSpeed
TITLE = 'cSpeed '

VAR_INPUT
ActPos: INT; // actual position inbetween 0 .. 100
ParamDB: POINTER; // data base with HMI machine parameters
at_Sicht AT ParamDB: STRUCT
DB_Nr: INT;
Adr: DWORD;
END_STRUCT;
END_VAR

VAR_OUTPUT
oSpt: REAL; // nominal speed at related position
DBx: INT;
Adr: INT;
END_VAR

VAR_TEMP
dSpt: DWORD; // nominal speed at related position
END_VAR

BEGIN
DBx := at_Sicht.DB_Nr;
Adr := DINT_TO_INT(DWORD_TO_DINT(SHR(IN := (at_Sicht.Adr AND dw#16#FFFFFF), N := 3)));
dSpt := ParamDB.DD[Adr + ActPos*4];
oSpt := DWORD_TO_REAL(dSpt);
END_FUNCTION_BLOCK

Das Auslesen des Pointerinhalts um entsprechende "ActPos" Werte verschoben schaffe ich aber nicht. Ich brauche also eine Lösung für die Fettgedruckte Zeile?!
Die Strukturzuweisung at_Sicht AT ParamDB: STRUCT
habe ich nur eingebaut um das ursprünglich beschriebene Thema auszuprobieren, hilft mir jedoch auch nicht weiter - oder?

Danke
 

Anhänge

  • S7-PrgAufrufe.jpg
    S7-PrgAufrufe.jpg
    61,5 KB · Aufrufe: 5
Zurück
Oben