Hi noch mal,
@pt
genau! dachte ich auch bis eben
aber das ganze ist viel trickreicher!
@all
hab die kurze Sequenz eben mal im PLCSIM laufen lassen und analysiert.
Stimmt, in Stop geht sie nicht, es wird ja auch nichts in den ominösen DB0 geschrieben.
im Detail:
Die IN-Variable DT wird nicht direkt übergeben, sondern als Pointer auf die Variable, also mit 3 Worten, die in den Lokaldaten von OB1 nach den letzten, in OB1 tatsächlich verwendeten L-Daten, abgelegt werden.(siehe Online-Hilfe PARAMETERTYPEN)
Format:
1.Wort: DB-Nr, falls die DT-Var im DB liegt, oder 0
2.&3.Wort: tatsächlicher Pointer mit Speicherbereichskennung
L P##IN;
LAR1;
--> AR1 zeigt jetzt NICHT auf OB1_DATE_AND_TIME, sondern auf das 1. Wort des obigen Pointers.
L W [AR1,P#0.0]
--> läd das Wort der Lokaldaten OB1, welches ggf. die DB-Nummer enthält
T #w_db_nr
AUF DB [#w_db_nr]
--> öffnet, falls nötig, den angegebenen DB
L D [AR1,P#2.0]
-->läd den tatsächlichen Pointer aus den Lokaldaten von OB1, also mit Bereichskennung und adresse
LAR1
--> jetzt steht in AR1 die Adresse der Variablen, in diesem Beispiel V 12.0
(Vorgänger-Lokaldaten ab byte 12)
... ab hier kann die DT-Variable über AR1 tatsächlich gelesen werden
Die Datenbaustein-Sequenz wird in diesem Beispiel gar nicht benötigt, sie kommt nur zum tragen, wenn an dem Parameter IN eine Datuhr-Variable aus einem Datenbaustein angegeben wird.
gibt man z.B "DB1".datuhr an, steht in w_db_nr eine 1, der DB1 wird geöffnet und die daten richtig gelesen
So ist es egal, in welchem Speicherbereich die Varaible tatsächlich liegt
wirklich tricky
Gruß Jörg