ANY Pointer als RECORD

akus0n

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ähnlich wie beim SFC14 und 15 möchte ich einen FB erstellen, der in einen bestimmten Bereich "RECORDEN" soll.

Hierzu habe ich als IN Parameter:

fault_pew (Typ INT)
fault_record (Typ ANY)

Die zu verarbeiteten Daten werden über fault_pew im FB benutzt und sollen dann über den SFC 20 "BLKMOV" in einen am fault_record angegeben Bereich geschrieben werden, der immer 10 Byte groß ist (z.B. fault_record ist mit P#DB100.DBX50.0 BYTE 10 beschaltet)

Wie kriege ich es hin, dass ich die Daten mit Hilfe des Ausgangs DSTBLK am SFC 20 an den am fault_record vorgegeben Bereich senden kann?

Hab mir bereits viel über die Any(Pointer) Geschichte hier durchgelesen, finde aber nicht wirklich einen passenden Einstieg auf Anhieb.

Ich hoffe, dass mir jemand helfen kann :) Danke :)
 
Hab mir bereits viel über die Any(Pointer) Geschichte hier durchgelesen, finde aber nicht wirklich einen passenden Einstieg auf Anhieb.

Schade, denn die Beschreibungen zu dem Thema (und dazu gibt es außer dem wirklich tollen Beitrag in der FAQ etliche, die zum Teil eine ähnliche Sache, wie deine beschreiben) sind wirklich gut.

Was verstehst du denn konkret nicht ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo akus0n,

Wie kriege ich es hin, dass ich die Daten mit Hilfe des Ausgangs DSTBLK am SFC 20 an den am fault_record vorgegeben Bereich senden kann?

das Hauptproblem ist wohl, dass der übergebene Any-Pointer gar nicht ans den SFC20 als DSTBLK geschrieben werden kann. Ich kopieren mir den Any-Pointer zu diesem Zweck immer erst in einen lokalen Pointer im Temp-Bereich:
Code:
VAR_INPUT
  fault_record : ANY ;    
END_VAR
VAR_TEMP
  ptr : ANY ;    
  ar2_save : DWORD ;    
END_VAR

NETWORK
TITLE =Any-Pointer in temp-Bereich basteln

//ar2 muss unbedingt gerettet werden, wenn Multinstanzen im Spiel sind
      TAR2  ; 
      T     #ar2_save; 

// anypointer umkopieren
      L     P##fault_record; 
      LAR1  ; 
      L     P##ptr; 
      LAR2  ; 
      L     D [AR1,P#0.0]; 
      T     D [AR2,P#0.0]; 
      L     D [AR1,P#4.0]; 
      T     D [AR2,P#4.0]; 
      L     W [AR1,P#8.0]; 
      T     W [AR2,P#8.0]; 

//ar2 wiederherstellen      
      L     #ar2_save; 
      LAR2  ;

Den lokalen Pointer ptr kannst Du nun an den Ausgang DSTBLK des SFC 20 schreiben.

Gruß
apollo13
 
Hallo,

erst einmal Danke für die schnelle Hilfe :)

Habe den FB von mir jetzt nach apollo13's Idee angepasst, funktioniert auch soweit, ABER nur wenn ich meinen FB nicht als Multiinstanz calle sondern jedem meiner FBs eine extra DB zuordne..

Woran kann das liegen?

Mein Aufbau des Programms sieht wie folgt aus:

FB20 (mein FB) wird 4 mal im FB30 gecallt, FB30 wird im OB1 gecallt.

Wenn FB20 jeweils einen eigenen DB hat funktioniert es wunderwar, sobald ich meinen 4x FB20 verschiedene Multiinstanzen zuordne funktioniert es nicht mehr.
 
Du mußt den Offset vom Adressregister dazuzählen. Wenn du Multiinstanz bei der Suche eingibst, wirst du die Lösung finden.
 
Zurück
Oben