Step 7 Übertragen von Temporären Variablen des OB86

CZach001

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, kann mir jemand ein Beispiel geben wie ich einen Datenbereich aus den Temporären Variablen des OB86 in einen Datenbereich eines Datenbausteins transfereieren kann.

mit den Bytes hab ich kein Problem.

Aber es gibt eine Temporäre Variable mit dem Namen OB86_RACKS_FLTD und dem Datentyp Array(0..31) of Bool

Die größe entspricht einem Datenwort, aber ich habe keine ahnung wie ich das übertragen soll.


Danke schon mal für eure Unterstützung

Mfg
CZach
 
Oder die Variable OB86_RACKS_FLTD umdeklarieren von Array [0..31] of Bool nach DWORD (sollte mMn auch funktionieren!). Dann kannst du auch wieder symbolisch mit
Code:
L # OB86_RACKS_FLTD
T DB86.DBD 8
arbeiten!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
etwas schöner wäre es so :
Code:
LAR1 p#OB86_RACKS_FLTD
L D [ar1,p#0.0]
T DB86.dbd 8
Gruß
Larry

100%ACK

Also Zugriffe auf Lokalbyte über Adressen kann ich leiden wie Zahnweh.
Habs früher auch gemacht und irgendwann genügend Lehrgeld bezahlt.
Deshalb entweder über AR oder mit Blockmove oder in SCL mit einer View.
Dem DB86.DBD8 gehört auch noch ein Symbol verpasst.

Gruß
Dieter
 
Normalerweise greife Ich auch so wie Larry es sagt auf Lokaldaten zu, aber hier würd ichs wahrscheinlich nicht machen, da die Cpu die Daten ja immer an der gleichen Adresse übergibt, auch wenn man das Sybol verschieben würde....
Aber das ist dann wohl eine philosophiefrage...
 
... deshalb habe ich ja auch geschrieben : "... etwas schöner ..."

Dessen ungeachtet erspart es natürlich auch noch unnötige Rückfragen ... (was ist LD 6 ?)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich hab das Beispiel von Larry verwendet.
Danke hat super funktioniert.
Hab aber leider den tieferen sinn nicht verstanden.
Vielleicht könnte jemand mal versuchen mir diese Funktion zu erklären, ob ichs dann verstehe steht auf einem anderen Blatt.


In diesem Doppelwort stehen auch unterschiedlich informationen.


OB86_Z23: Adresse des betroffenen DP-Slaves:
- Bit 0 bis 7: Nr. der DP-Station
- Bit 8 bis 15: DP-Mastersystem-ID
- Bit 16 bis 30: logische Basisadresse bei einemS7-Slave bzw. Diagnoseadresse bei einem DP-Normslave
- Bit 31: I/O-Kennung

Währe es auch möglich das Doppelwort in die obigen bereiche aufzusplitten.

So das ich im DB dann ein Byte mit der Nr. der DP Station ein Byte mit der Nr. der MastersystemID und ein Wort mit der log Basisadresse (wobei ich ja da dann das Bit 31 in diesem Wort nicht brücksichtigen darf.)


Danke schon mal für euere bemühungen.

Mfg
CZach
 
OB86_Z23: Adresse des betroffenen DP-Slaves:
- Bit 0 bis 7: Nr. der DP-Station
- Bit 8 bis 15: DP-Mastersystem-ID
- Bit 16 bis 30: logische Basisadresse bei einemS7-Slave bzw. Diagnoseadresse bei einem DP-Normslave
- Bit 31: I/O-Kennung

Währe es auch möglich das Doppelwort in die obigen bereiche aufzusplitten.

Hallo,
ja das geht auch und das mit der Erklärung versuche ich mal dem Code-Beispiel :
Code:
LAR1 p#OB86_Z23   // den Pointer auf die variable in das AR1-Register laden

L B [AR1,p#0.0]    // den Speicherwert, auf den das AR1-Register zeigt, laden
T DB500.DBB10    // die Nummer der DP-Station

L B [AR1,p#1.0] // den Speicherwert, auf den das AR1-Register zeigt + eine Offset-Verschiebung um 1 Byte, laden
T DB500.DBB11 // die Mastersystem-ID

L W [AR1,p#2.0] // den Speicherwert, auf den das AR1-Register zeigt + eine Offset-Verschiebung um 2 Byte, laden
L W#16#7FFF     // Maskierung für das Byte 31
T DB500.DBW12 // Basis-Adresse ...

U [AR1,p#3.7] // den Speicherwert, auf den das AR1-Register zeigt + eine Offset-Verschiebung um 3 Byte und 7 Bit, laden
= M 10.0         // IO-Kennung

Versuch dich mal selbst ...

Gruß
Larry
 
Währe es auch möglich das Doppelwort in die obigen bereiche aufzusplitten.

So das ich im DB dann ein Byte mit der Nr. der DP Station ein Byte mit der Nr. der MastersystemID und ein Wort mit der log Basisadresse (wobei ich ja da dann das Bit 31 in diesem Wort nicht brücksichtigen darf.)
Deklariere Deine 2 Bytes und das Word in einem DB, z.B.:
Code:
...
 +8.0 OB86_Z_Slave    : BYTE : B#16#0		
 +9.0 OB86_Z_MasterID : BYTE : B#16#0		
+10.0 OB86_Z_Base     : WORD : W#16#0		
+12.0 ...

Dann übertrage das DWORD #OB86_Z23 einfach absolut in den DB (Variante A) oder besser per symbolischen Zugriff auf den DB (Variante B oder C):
Code:
//(A) absolut in DB schreiben
      LAR1  P##OB86_Z23
      L     D [AR1,P#0.0]
      UD    DW#16#7FFFFFFF              //I/O-Kennung ausblenden
      T     DB86.DBD    8               //DB86.DBB8..DBB11

//(B) symbolisch in DB schreiben
      LAR1  P##OB86_Z23
      L     B [AR1,P#3.0]
      T     "DB86".OB86_Z_Slave         //DB86.DBB8
      L     B [AR1,P#2.0]
      T     "DB86".OB86_Z_MasterID      //DB86.DBB9
      L     W [AR1,P#0.0]
      UW    W#16#7FFF                   //I/O-Kennung ausblenden
      T     "DB86".OB86_Z_Base          //DB86.DBW10

//(C) symbolisch in DB schreiben
      LAR1  P##OB86_Z23
      L     D [AR1,P#0.0]
      T     "DB86".OB86_Z_Slave         //DB86.DBB8
      SRD   8
      T     "DB86".OB86_Z_MasterID      //DB86.DBB9
      SRD   8
      UW    W#16#7FFF                   //I/O-Kennung ausblenden
      T     "DB86".OB86_Z_Base          //DB86.DBW10

Harald
 
@Harald:
Ja ... Alles klar ... Das kommt davon, wenn man den Code "nur" runterschreibt und nicht gegencheckt ...

@TE:
In einem Doppelwort (und das ist hier ja die Quelle - wegen der Struktur) stehen die einzelnen Bytes NICHT an der von mir angegebenen Stelle. Dazu kann man aber mittels der Step7-Hilfe etwas herausfinden. Ich lasse es also mit dem Nachsatz von Harald mal so stehen - auch wenn es falsch ist (aber eben nicht vollkommen falsch ...) 8)
 
Zurück
Oben