AWL; Laden und Aufschlagen von Datenbausteinen

svkers

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo AWLer ;)

ich bin noch ein Neuling in AWL und versuche gerade einen vorhanden Code nachzuvollziehen. Dabei ist mir folgender Beispielcode unklar:

L "ABC".VAR; // DB900.DBW66
T #Eine_Var;
L DBD 110; //DB900.DBD 110
T #Andere_Var;

Woher weiß ich, dass das Statement 'L DBD 110; //DB900.DBD 110 auf den DB900 zugreift? Bisher dachte ich, dass man mit "L DBD" auf aufgeschlagenen Datenbausteinen arbeitet. In dem Code wurde aber kein DB aufgeschlagen (AUF)! Schlägt das Statement "L "ABC".VAR; // DB900.DBW66" den DB 900 automatisch auf, so dass ich in den darauffolgenden Statements direkt auf dem Datenbaustein arbeiten kann? Leider habe ich in der Doku dazu überhaupt nichts gefunden. Über Hinweise und Aufklärung wäre ich sehr dankbar!

Vielen Dank!
Sven
 
sauber ist das nicht, aber gehten tut das

L DB1.DBD 0

sind eigentlich 2 befehle

auf db 1
und L dbd0

Das DB Register bleibt auf dem DB bei dir 900 stehen

drumm kannst du L DBD 110 machen und er greift auf die richtige variable zu

aber wehe da ändert jemand was

und setzt z.B.

U DB901.dbx2.0
= M1.0

zwischen rein, dann gibt es Crash
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay, vielen Dank!

Das mit dem ändern ist mir allerdings noch nicht ganz klar geworden.

L DB1.DBD 0;
U DB2.DBD 0
= M1.0;
L DBD 110; //soll sein DB1.DBD 110

Wenn ich es richtig verstanden habe, funktioniert obiges nun nicht mehr. L DBD 110, würde auf auf Grund des vorstehenden UNDs auf DB2 zugreifen, ja?

Wenn der Code stattdessen so geschrieben wäre, würde es wieder richtig funktionieren? Oder habe ich da dann etwas falsch verstanden?

AUF DB1
L DBD 0;
U DB2.DBD 0
= M1.0;
L DBD 110; //soll sein DB1.DBD 110


Vielen Dank!
Grüße
 
Okay, vielen Dank!

Das mit dem ändern ist mir allerdings noch nicht ganz klar geworden.

L DB1.DBD 0;
U DB2.DBD 0
= M1.0;
L DBD 110; //soll sein DB1.DBD 110

Wenn ich es richtig verstanden habe, funktioniert obiges nun nicht mehr. L DBD 110, würde auf auf Grund des vorstehenden UNDs auf DB2 zugreifen, ja?

Wenn der Code stattdessen so geschrieben wäre, würde es wieder richtig funktionieren? Oder habe ich da dann etwas falsch verstanden?

AUF DB1
L DBD 0;
U DB2.DBD 0
= M1.0;
L DBD 110; //soll sein DB1.DBD 110


Vielen Dank!
Grüße


ob du das so schreibst oder so das ändert nichts

Mit U DB2.dbd 0 (was sowie so nicht geht)
läds du den DB2 in das DB Register
Wenn du dann nur schriebst

L DBD 110
läd die steuerung dir das datendoppelwort 110 im db 2

wenn du doch den db 1 haben willst musst du entweder

L db1.dbd110

oder

Auf DB1
L dbd110

programmieren
 
Okay, alles klar! Hab ich verstanden! D.h. bei jeweiligen Zugriff auf einem DB (egal, ob U, O, ... L), das DB-Register würde gesetzt werden.
Ja, das DB-Register (genauer das Adressregister 1 (AR1) ) zeigt immer auf den aktuell geöfneten (globalen) DB.
Es ist egal ob Du "AUF DB1" oder "U DB1.DBX0.0" oder "L DB1.DW2" verwendet immer zeigt danach das Adressregister 1 auf den DB1.
Ein Zugriff ohne DB-Spezifikation, wie "L DBW66" nutzt immer den aktuellen (globalen) DB.

Fortgeschrittene Anwender können das Adressregister auch selber nutzen, dann taucht im Programm irgend was mit "AR1" auf, z.B. "TAR1" dann wird der Zeiger auf den aktuellen DB überschrieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das Register, das auf den aktuellen (globalen) DB zeigt heißt Adressregister 1.
Nur der Name "DB-Register" ist nicht richtig, die Funktion die Du damit meinst aber stimmt.
 
Bin gerade mal online im PLC-Sim...

- die Anweisung L DB101.DBW34 wird ausgeführt
- die Spalte DB-Register füllt sich mit "101"
- die Spalte AR1 bzw. AR2 bleibt auf 0.0 --> hier zeigt nix auf DB 101
 
Zuletzt bearbeitet:
So, nun hast Du es geschafft und mich verunsichert! ;)

Also habe ich mir den Aufbau eines AR angesehen:
Die Adressregister sind 32bit Register, Sie enthalten einen Operantenbereich (Peripherie, Eingänge, Ausgänge, Merker, Global-DB, Instanz-DB, Lokaldaten oder und eine Bitadresse (byte.Bit).
Der Aufbau ist "10000zzz 00000yyy yyyyyyyy yyyyyxxx" (z=Bereich, y=Byteadresse,z=Bitadresse).
Also ohne Platz auch die DB-Nummer zu speichern. Offensichtlich gibt es also tatsächlich ein DB- und ein DI-Register.

Dann habe ich mal in der Onlinhilfe gesucht und folgendes gefunden:
onlinhilfe schrieb:
Hinweise zur Änderung von Register-Inhalten
Wenn Sie die im Anschluss beschriebenen Programmiermöglichkeiten und gleichzeitig die genannten Register/Akkus nutzen, müssen Sie selbst für eine Wiederherstellung der Register- bzw. Akku-Inhalte sorgen, da es sonst zu einem Fehlverhalten kommen kann.

Die Verwendung der folgenden höheren Sprachkonstrukte kann dazu führen, dass die Inhalte von DB-Register und Adressregister AR1 verändert werden:
  • vollqualifizierter DB-Zugriff (z.B. DB20.DBW10) als Aktualparameter für FC
  • FB- und Multiinstanz-CALL
  • Strukturkomponente eines Formalparameters als Operand innerhalb eines FC oder FB
  • Strukturkomponente eines Formalparameters als Aktualparameter für FC oder FB
Beim FB-, FC-, Multiinstanz-CALL dürfen VKE oder AKKU1 und AKKU2 nicht als zusätzliche (implizite) Parameter verwendet werden.

Das DI-Register und das Adressregister AR2 werden systemseitig für den FB- und Multiinstanz-CALL verwendet und dürfen deshalb innerhalb von FB's nicht verändert werden.

Das Adressregister AR1 wird von einem Teil der ladbaren Standardbausteine verwendet.

Der Befehl "L P#Parametername" lädt innerhalb eines FB den Adressoffset des angegebenen Parameters, relativ zum Adressregister AR2. Um in multiinstanzfähigen FBs den absoluten Offset im Instanzdatenbaustein zu ermitteln, muss zu diesem Wert noch der bereichsinterne Zeiger (nur Adresse) des AR2-Registers addiert werden.
Weitere Information zu den Registern der CPU finden Sie in der Hilfe zur Programmiersprache (KOP/FUP/AWL).
Daraus schliesse ich,
  1. dass meine Aussage "AR1 beinhaltet einen Zeiger auf den global DB" nicht korrekt war :oops:
  2. dass das AR1 zwar mit den Global-DB und AR2 mit dem Instanz-DB zu tun hat, aber zusätzlich auch so was wie ein DB- bzw DI-Register beteiligt sein muss.
  3. dass es sehr schwirig ist, detalierte Informationen zu diesem Thema zu bekommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
AR1 ist grundsätzlich für eigene indirekte Addressierung zu Verfügung.
AR2 sollte man bei Instanzverarbeitung in Ruhe lassen, da es die Adresse der aktuellen
Instanz-Daten endhält. (siehe auch multiinstanz)

MfG
Günther
 
Daraus schliesse ich,
  1. dass meine Aussage "AR1 beinhaltet einen Zeiger auf den global DB" nicht korrekt war :oops:
  2. dass das AR1 zwar mit den Global-DB und AR2 mit dem Instanz-DB zu tun hat, aber zusätzlich auch so was wie ein DB- bzw DI-Register beteiligt sein muss.
  3. dass es sehr schwirig ist, detalierte Informationen zu diesem Thema zu bekommen.

Nee, nicht unbedingt.
Nutze mal die Suchfunktion hier im Forum !
 
Zurück
Oben