RONIN
Level-3
- Beiträge
- 2.574
- Reaktionspunkte
- 805
-> Hier kostenlos registrieren
Hallo Leute!
In einem meiner FB's verwende ich die altbekannte Methode der Übergabe eines Datenbereichs an den FB via Any-Pointer.
Der Pointer wird dann im FB umkopiert, kurz aufbereitet und dann an einen SFC20 übergeben.
Diese Variante funktioniert tadellos, solange bis der Multiinstanz-Offset beim Aufruf die Zahl 4095 überschreitet. Anscheinend ergibt sich das Problem
in der Verwendung des Befehls +AR1, welcher einen Offset auf das AR1 aufaddiert. Hier verwendet um den Multiinstanz-Offset aufzuaddieren.
Anscheinend funktioniert der +AR1 Befehl nur bis zu einem Wert von 4095.
Die Ursache wird wohl hier liegen: (Auszug aus der Hilfe zum Befehl +AR1)
16Bit - Vorzeichen -> 15Bit - 3Bit Bitadresse -> 12Bit: 4095
Soweit eigentlich klar: Meine Frage jetzt nur.... wie könnte man das umgehen? Ich möchte nicht jedes mal eine neuen FB anfangen nur weil mir die Multiinstanzen ausgehen.
In einem meiner FB's verwende ich die altbekannte Methode der Übergabe eines Datenbereichs an den FB via Any-Pointer.
Der Pointer wird dann im FB umkopiert, kurz aufbereitet und dann an einen SFC20 übergeben.
Code:
TAR1 #SaveAR1 //Adressregister sichern
TAR2 #SaveAR2
LAR1 P##P_Data //P_Data aus IN-Bereich nach TEMP kopieren
L #SaveAR2
+AR1
LAR2 P##P_Data_tmp
L D [AR1,P#0.0] //Zeiger kopieren
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]
L LW [AR2,P#2.0] //Zeiger umwandeln auf Hälfte 1 des Ursprungszeigers
L 2 //Enstspricht SX-Bereich des vorangegangenen Bausteins
/I
T LW [AR2,P#2.0]
LAR1 #SaveAR1 //Adressregister wiederherstellen
LAR2 #SaveAR2
Diese Variante funktioniert tadellos, solange bis der Multiinstanz-Offset beim Aufruf die Zahl 4095 überschreitet. Anscheinend ergibt sich das Problem
in der Verwendung des Befehls +AR1, welcher einen Offset auf das AR1 aufaddiert. Hier verwendet um den Multiinstanz-Offset aufzuaddieren.
Anscheinend funktioniert der +AR1 Befehl nur bis zu einem Wert von 4095.
Die Ursache wird wohl hier liegen: (Auszug aus der Hilfe zum Befehl +AR1)
Wenn ich das richtig lese wird eine 16Bit Zahl als Pointer interpretiert und dann aufgerechnet."+AR1: Die Ganzzahl (16 Bit), die zum Inhalt von AR1 addiert werden soll, wird durch den Wert in AKKU1-L angegeben. Zulässig sind Werte von -32768 bis +32767"
16Bit - Vorzeichen -> 15Bit - 3Bit Bitadresse -> 12Bit: 4095
Soweit eigentlich klar: Meine Frage jetzt nur.... wie könnte man das umgehen? Ich möchte nicht jedes mal eine neuen FB anfangen nur weil mir die Multiinstanzen ausgehen.