Any-Pointer - Multiinstanz-Schachtelungstiefe???

xhasx

Level-2
Beiträge
416
Reaktionspunkte
48
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Ich moechte gerne einen Any-Pointer an die dritte Schachtelungstiefe weiterreichen. Das Ganze als Multiinstanz. Beim weiterreichen an die zweite Multiinstanz passiert's... Der Pointer ist mit P#0.0 belegt. Hab ich in meinem Code nen Fehler??? Eigentlich rette ich mir die Adressregister temporär. Sollte ich das etwa statisch machen?

TAR1 #TempAr1 // Adressregister 1 retten
TAR2 #TempAr2 // Adressregister 2 retten
LAR1 P##HmiKurvendatenQuelle // Lade Adressregister 1 mit Pointer aus Schnittstelle IN
LAR2 P##TempAny1 // Lade Adressregister 2 mit Pointer aus Schnittstelle TEMP
L W [AR1,P#0.0] // Code des Datentypes lesen
T W [AR2,P#0.0]
L W [AR1,P#2.0] // Wiederholfaktor lesen
T W [AR2,P#2.0]
L W [AR1,P#4.0] // Nummer des Datenbausteines oder "0"
T W [AR2,P#4.0]
L D [AR1,P#6.0] // Bereichszeiger
T D [AR2,P#6.0]
LAR2 #TempAr2 // Adressregister 2 wiederherstellen
LAR1 #TempAr1 // Adressregister 1 wiederherstellen
 
Hallo!

Ich verstehe jetzt nicht was passiert?

Wie gibst du deinen Any-Pointer weiter?

Wenn du in den Temp Bereich indirekt Adressieren willst und schon
T W [AR1,P#0.0] schreibst dann sollte es so heißen
T LW[AR1,P#0.0] weil du ja lokaldaten ansprichst.

Code:
TAR1 #TempAr1 // Adressregister 1 retten
TAR2 #TempAr2 // Adressregister 2 retten
LAR1 P##HmiKurvendatenQuelle // Lade Adressregister 1 mit Pointer aus Schnittstelle IN
LAR2 P##TempAny1 // Lade Adressregister 2 mit Pointer aus Schnittstelle TEMP
L W [AR1,P#0.0] // Code des Datentypes lesen
T LW [AR2,P#0.0]
L W [AR1,P#2.0] // Wiederholfaktor lesen
T LW [AR2,P#2.0]
L W [AR1,P#4.0] // Nummer des Datenbausteines oder "0"
T LW [AR2,P#4.0]
L D [AR1,P#6.0] // Bereichszeiger
T [COLOR=black]L[/COLOR][COLOR=black]D[/COLOR] [AR2,P#6.0]
LAR2 #TempAr2 // Adressregister 2 wiederherstellen
LAR1 #TempAr1 // Adressregister 1 wiederherstellen

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nö... ...dann muestte es heissen

L W [AR1,P#0.0]
T LW 0
.
.
.
L D [AR1,P#6.0]
T LD 6

Ich nehme das Adressregister 2 her und verweise auf den L-Bereich (Temp). Sozusagen steht der Quellepointer im Ar1 und der Zielpointer im Ar2. Bei den Sprüngen aus den Unterprogrammen wird das jeweilige Ar zurückgesichert. Ich kann aber kein Ar auf dem STAT Bereich sichern...
 
hier mal ein code der sicher funkt

Code:
FUNCTION_BLOCK FB 3
TITLE =
VERSION : 0.1

VAR_INPUT
  Any_Pointer_in : ANY ; 
END_VAR
VAR_TEMP
  Any_Pointer_Temp : ANY ; 
END_VAR
BEGIN
NETWORK
TITLE =

      L     P##Any_Pointer_in; 
      LAR1  ; 
      L     B [AR1,P#0.0]; //  B#16#10
      L     B [AR1,P#1.0]; //  B#16#2
      L     W [AR1,P#2.0]; //  10
      L     W [AR1,P#4.0]; //  1
      L     D [AR1,P#6.0]; //  P#DBX 0.0
END_FUNCTION_BLOCK
FUNCTION_BLOCK FB 2
TITLE =
VERSION : 0.1

VAR_INPUT
  Any_Pointer_in : ANY ; 
END_VAR
VAR
  Instanz : FB 3; 
END_VAR
VAR_TEMP
  Any_Pointer_Temp : ANY ; 
  Save_AR1 : DWORD ; 
  Save_AR2 : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =
      TAR1  #Save_AR1; 
      TAR2  #Save_AR2; 
      LAR1  P##Any_Pointer_in; 
      LAR2  P##Any_Pointer_Temp; 
      L     D [AR1,P#0.0]; 
      T     LD [AR2,P#0.0]; 
      L     D [AR1,P#4.0]; 
      T     LD [AR2,P#4.0]; 
      L     W [AR1,P#8.0]; 
      T     LW [AR2,P#8.0]; 
      LAR1  #Save_AR1; 
      LAR2  #Save_AR2; 

      CALL #Instanz (
           Any_Pointer_in           := #Any_Pointer_Temp);
END_FUNCTION_BLOCK
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1

VAR_INPUT
  Any_Pointer_in : ANY ; 
END_VAR
VAR
  Instanz_1 : FB 2; 
END_VAR
VAR_TEMP
  Any_Pointer_Temp : ANY ; 
  Save_AR1 : DWORD ; 
  Save_AR2 : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =
      TAR1  #Save_AR1; 
      TAR2  #Save_AR2; 
      LAR1  P##Any_Pointer_in; 
      LAR2  P##Any_Pointer_Temp; 
      L     D [AR1,P#0.0]; 
      T     LD [AR2,P#0.0]; 
      L     D [AR1,P#4.0]; 
      T     LD [AR2,P#4.0]; 
      L     W [AR1,P#8.0]; 
      T     LW [AR2,P#8.0]; 
      LAR1  #Save_AR1; 
      LAR2  #Save_AR2; 
      CALL #Instanz_1 (
           Any_Pointer_in           := #Any_Pointer_Temp);
 

END_FUNCTION_BLOCK

ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1

VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
  ANY_Pointer : ANY ; 
END_VAR
BEGIN
NETWORK
TITLE =
      L     P##ANY_Pointer; 
      LAR1  ; 
      L     B#16#10; 
      T     LB [AR1,P#0.0]; 
      L     B#16#2; 
      T     LB [AR1,P#1.0]; 
      L     10; 
      T     LW [AR1,P#2.0]; 
      L     1; 
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; 
      T     LD [AR1,P#6.0]; 

      CALL FB     1 , DB     3 (
           Any_Pointer_in           := #ANY_Pointer);
 
END_ORGANIZATION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Den Versuche ich jetzt aber nicht mehr :)
Wenn der funktioniert bedanke ich mich natürlich schön brav und denk drüber nach warum da LW und nicht nur L steht. Mein Code geht ja auch, aber nur für eine Instanztiefe...
Trotzdem Danke mal!!!
 
Warum LW?
Die SPS muss auch wissen was sie beschreibt.
LW = Lokalwort
also es wird ein Wort in den Lokaldaten (=Temp-Bereich) der CPU Adressiert
 
Vesuch mal in der Multiinstanz nochmal ne Multiinstanz aufzurufen und die Any weiterzureichen... So dass du ne Schachtelungstiefe von 3 Fb's mit nur einem Instanz Db hast. Als bei mir (WinRTX) geht's nicht.
 
nimm den code von oben den ich geschrieben habe und lösche die L weg und es funktioniert noch immer!
Habe auch 2 Multiinstanzaufrufe drinn
 
Also der Code funktioniert! Aber das ist genau der den ich auch im 1. Posting drin habe. Anscheinend geht da irgendwo noch was stiften. Ich hab mal ne komplette Quelle meines Programms gemacht. Ausser 13 Warnungen war da nichts...
Ich such mal weiter...

Und das mit dem L wäre ja auch geklärt :)
 
Zurück
Oben