Pointer als Out Variable Daten schreiben

mkd

Level-2
Beiträge
197
Reaktionspunkte
30
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe in einer Funktion Daten einer in Variable (Typ Pointer), möchte diese Daten bearbeiten und das Ergebnis in eine Out Variable (Typ Pointer) schreiben.

Zuerst habe ich den ersten Schritt programmiert, also das Lesen und bearbeiten des IN Parameters.
Das Ergebnis wird hier in DB1.DBD8...15 geschrieben.

Code:
     L     P##DATEN
      LAR1  
      L     D [AR1,P#2.0]
      T     #temp

      L     #temp
      LAR1  



      L     D [AR1,P#0.0]
      T     DB1.DBD    8               


      L     D [AR1,P#4.0]
      UD    DW#16#FFFFFFF7         //z.B.     
      T     DB1.DBD   12

Soweit funktioniert alles wie gewünscht.
Jetzt möchte ich die Daten flexibel in den DB schreiben. Also in eine Out Variable (Datentyp Pointer).

Code:
     L     P##OB1_Date_Time
      LAR1  
      L     D [AR1,P#2.0]
      T     #temp

      L     #temp
      LAR1  

//geht nicht!!!
      L     P##DATE_TIME_PLC
      LAR2  
      L     D [AR2,P#0.0]
      T     #temp

      L     #temp
      LAR2  



      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]

      L     D [AR1,P#4.0]
      UD   DW#16#FFFFFFF7             //z.B.
      T     D [AR2,P#4.0]


Wenn ich den Code so in die Steuerung lade, geht die CPU mit der Meldung "Bereichlängenfehler beim schreiben" in Stop.

Ja, ich habe das mit den Pointern wohl nicht ganz verstanden :confused: :-(

Wie könnte ich das Problem lösen / was mache ich falsch?



Gruß
Daniel
 
Hallo,

ich habe in einer Funktion Daten einer in Variable (Typ Pointer), möchte diese Daten bearbeiten und das Ergebnis in eine Out Variable (Typ Pointer) schreiben.

Zuerst habe ich den ersten Schritt programmiert, also das Lesen und bearbeiten des IN Parameters.
Das Ergebnis wird hier in DB1.DBD8...15 geschrieben.

Code:
     L     P##DATEN
      LAR1  
      L     D [AR1,P#2.0]
      T     #temp

      L     #temp
      LAR1  



      L     D [AR1,P#0.0]
      T     DB1.DBD    8               


      L     D [AR1,P#4.0]
      UD    DW#16#FFFFFFF7         //z.B.     
      T     DB1.DBD   12

Soweit funktioniert alles wie gewünscht.
Jetzt möchte ich die Daten flexibel in den DB schreiben. Also in eine Out Variable (Datentyp Pointer).

Code:
     L     P##OB1_Date_Time
      LAR1  
      L     D [AR1,P#2.0]
      T     #temp

      L     #temp
      LAR1  

//geht nicht!!!
      L     P##DATE_TIME_PLC
      LAR2  
      L     D [AR2,P#[COLOR="Red"]0[/COLOR].0]
      T     #temp

      L     #temp
      LAR2  



      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]

      L     D [AR1,P#4.0]
      UD   DW#16#FFFFFFF7             //z.B.
      T     D [AR2,P#4.0]


Wenn ich den Code so in die Steuerung lade, geht die CPU mit der Meldung "Bereichlängenfehler beim schreiben" in Stop.

Ja, ich habe das mit den Pointern wohl nicht ganz verstanden :confused: :-(

Wie könnte ich das Problem lösen / was mache ich falsch?

Gruß
Daniel

Siehe rotes Zeichen.
Außerdem steht im Wort P#0.0 die DB-Nummer und du mußt noch den richtigen DB öffnen, falls die angelegten Pointer unterschiedliche DB adressieren!
Siehe auch hier: http://www.sps-forum.de/showthread.php?t=8663

Achtung, Falls du das mal in einem FB nutzen willst, ist bei Verwendung von AR2 auf einiges zu achten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ralle,

o.k. das rote zeichen war ein Tippfehler im Beitrag aber nicht im Programm.

So läuft es:

Code:
      L     P##Daten
      LAR1  
      L     D [AR1,P#2.0]
      T     #temp

      L     #temp
      LAR1  

//Erst einmal Pointer auf Datenbaustein kontrollieren

      L     P##DATE_TIME_PLC            // Andresse des Eingangs- Bits, aus Pointer lesen
      LAR2                              // Adresspointer adressieren
      L     W [AR2,P#0.0]               // erstes Wort eines Pointers enthält DB-Nr.
      T     #temp_DB_NR
      L     0                           // Wenn DB-Nr = 0, dann kein D sondern E/A/M
      ==I   
      SPB   noDB

      AUF   DB [#temp_DB_NR]            // Wenn DB-Nr <>0, dann DB öffnen

noDB: NOP   0


      L     P##DATE_TIME_PLC
      LAR2  
      L     D [AR2,P#2.0]
      T     #temp

      L     #temp
      LAR2  


      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]               

      L     D [AR1,P#4.0]
      UD    DW#16#FFFFFFF7              
      T     D [AR2,P#4.0]
SUPER! DANKE!

Da ich immer, soweit möglich, auf FB verzichte brauche ich mir bei der Verwndung mit dem AR2 ja keine Gedanken zu machen.
Der oben stehende Code wird in einem FC verwendet.


Gruß
Daniel
 
Zurück
Oben