B&R Bibliothek Var Input als Pointer

rudl

Level-1
Beiträge
61
Reaktionspunkte
13
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine Bibliothek in meinem B&R Automation Studio erstellt. In Dieser Bibliothek befindet sich ein Funktionsblock, der mir ein zweidimensionales String-Array füllt. Damit ich nicht zu viel Speicher brauche, übergebe ich dem Funktionsblock das Array als Pointer. Soweit so gut.
Also lege ich in der Bibliothek mit folgendem Eintrag in der *.fun Datei mit folgendem Eintrag das Stringarray an:
VAR_INPUT
ptStringArr : REFERENCE TO ARRAY[1..diColumnMax, 1..diRowMax] OF STRING[diStringLength];
END_VAR
In der *.var Datei definiere ich die Grenzen als Konstante:
VAR CONSTANT
diColumnMax : DINT := 5;
diRowMax : DINT := 5;
diStringLength : DINT := 256;
END_VAR

In meiner Hauptapplikation übergebe ich der Instanz des Funktionsblocks das globale String-Array
Inst(ptStringArr := ADR(sStrArr));

Im Funktionblock der Bibliothek fülle ich dann das Array mit zwei FOR- Schleifen mit Werten:
ptStringArr [m,n]='Wert';
In meiner Hauptapplikation ist dann jeweils nur der erste Index beschrieben: sStrArr[1,1].

Wenn ich den Code ausserhalb der Bibliothek ausführe und das Stringarray global anlege funktioniert alles bestens.

Hat mir jemand einen Tip? Bei CoDeSys greift man auf Indizes eines Pointers mit dem ^-Zeichen zu, etwa so: ptStringAr^[m,n]='Wert', bei B&R bekomme ich einen Fehler, dass es sich nicht um einen Pointer handelt. Was mache ich falsch?

Herzlichen Dank für eure Hilfe.
 
Hallo,
ich hab ein kleines Problem mit deinem Problem da ich es nicht schaffe die Arrays so zu definieren wie du das angegeben hast (2-Dimensionales Stringarray)

Daher habe ich folgenden Weg gewählt das zu machen

Du kannst ja mal mit deinem Code vergleichen, wo die Unterschiede liegen....

Setze ich im Hauptprogramm fillArr = 1 wird das Array über den Fub befüllt mit den Zahlen > 100
Setze ich im Hauptprogramm fillArr = 2 wird das Array im Hauptprogramm befüllt mit Zahlen > 10

lg

---
Hauptprogramm
---

if (fillArr = 1) then
fillArr = 0
fill2DimArray(adr(StringArr))
else if (fillArr = 2) then

; "heraussen" befühllen
fillArr = 0
loop x = 0 to 5 do
loop y = 0 to 5 do
itoa(x * 10 + y, adr(StringArr[x].OneDimArr[y]))
endloop
endloop

endif

---
Datentyp
---
MWSnap 2010-04-22, 22_02_15.jpg
---
fub
---
MWSnap 2010-04-22, 21_58_50.jpg

MWSnap 2010-04-22, 22_00_46.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Herzlichen Dank für die ausführliche Beschreibung. Deine Version hat funktioniert, meine grundsätzlich auch. Mehrfacharrays sind erst ab dem Automation Studio V3.0.80.25, das Ende letzten Jahres erschienen ist, möglich. Scheinbar ist in dieser Version noch ein Fehler, wenn Mehrfacharrays, deren Grenzen als Konstanten definiert sind, als Pointer übergeben werden. Dieser sollte in einem der nächsten Updates behoben sein. Ich habe das Array jetzt lokal in der Bibliothek als Outputvariable definiert. Somit kann ich mit Instanz.Variable[m,n] auf die einzelnen Indizes zugreifen. Jetzt funktionierts einwandfrei. :s12:
 
Zurück
Oben