TIA Multdimensionales Array beschreiben und auslesen

Dranix

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen.

Wir versuchen derzeit eine Vergleichsdatenbank mithilfe eines Arrays zu erstellen.

Wir verwenden TIA V14 SP1 mit einer S7-1200 und einem HMI Basic Panel.

Die Idee ist, mithilfe eines Multidimensionalen Arrays eine Vergleichstabelle zu erstellen. Praktisch sollte es so aussehen das man eine Eingangsvariable mit dem Datentyp (Hex, Char, int ) erhält. Diese soll dann mit dem Multidimensionalen Array verglichen werden und demenstprechend ein FALSE für keine Übereinstimmung und ein TRUE für eine Übereinstimmung herausgegeben werden. Dabei soll der erste Wert eines Zweidimensionalen Arrays verglichen werden und der zweite ausgegeben. Wie ließt man das richtig aus oder vergleicht das anstänstig? Wir finden keinen richtigen Ansatz um soetwas umzusetzen. Wir haben in diese Richtung auch noch nicht soviel Erfahrung.

Mfg dranix
 
Verstehe ich das richtig das du ein (Beispiel) Array [x][y] hast und du nur das erste Feld mit deinem Eingang vergleichen möchtest und bei Übereinstimmung das zweite Feld ausgeben möchtest?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Verstehe ich das richtig das du ein (Beispiel) Array [x][y] hast und du nur das erste Feld mit deinem Eingang vergleichen möchtest und bei Übereinstimmung das zweite Feld ausgeben möchtest?


Genau.

In meinem Beispiel habe ich einen DB angelegt mit einem Array "MyArray[0..10,0,10] of Uint" Dieser wird dann mit dem jweiligen gesetzten Startwert verglichen?
 
Also wenn ich es richtig verstanden hätte würde es so in der Art gehen.

Code:
FOR #i := 1 TO 10 DO
IF #input = #data[#i, 1] THEN
        #found := TRUE;
        #output := #data[1, #i];
    ELSE
        #found := FALSE;
    END_IF;
END_FOR;
 
Danke für die schnelle Antwort.

So in etwa dachte ich mir das es sein könnte. Nun wollte ich das aus einem DB auslesen dafür müsste ich dann die "#data" Temp-Variable gegen die DB Bezeichung tauschen oder?
Als Ausgabe bekommen ich dann die Position des Arrays der gefunden wurde, sehe ich ich das richtig?

01_RFID_Array, ist dabei der DB der als Eingang dient zur Weiterverarbeitung.

Code:
FOR #i := 1 TO 100 DO
    IF "01_RFID_Array".RFID[1] = "02_MultiArray".MyArray[#i, 1] THEN
        #found := TRUE;
        #output := #data[1, #i];
    ELSE
        #found := FALSE;
    END_IF;
END_FOR;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort.

So in etwa dachte ich mir das es sein könnte. Nun wollte ich das aus einem DB auslesen dafür müsste ich dann die "#data" Temp-Variable gegen die DB Bezeichung tauschen oder?
Als Ausgabe bekommen ich dann die Position des Arrays der gefunden wurde, sehe ich ich das richtig?

01_RFID_Array, ist dabei der DB der als Eingang dient zur Weiterverarbeitung.

Code:
FOR #i := 1 TO 100 DO
    IF #data = "02_MultiArray".MyArray[#i, 1] THEN
        #found := TRUE;
        #output := #data[[B][COLOR=#ff0000]#i, 2[/COLOR][/B]];
        [COLOR=#ff0000][B]EXIT; // damit unterbricht man die schleife wenn man den Index gefunden hat[/B][/COLOR]
    ELSE
        #found := FALSE;
    END_IF;
END_FOR;


ich würde die schleife noch abbrechen wenn man das Element gefunden hat.


Genau.

In meinem Beispiel habe ich einen DB angelegt mit einem Array "MyArray[0..10,0..1] of Uint" Dieser wird dann mit dem jeweiligen gesetzten Startwert verglichen?
in der Zweiten Dimension würden doch zwei plätze reichen - oder nicht?

Welchen Datentyp nutzt ihr zum Vergleich?
Wenn man von Byte (wie im Eingangspost gesetzt) ausgeht, könnte mann auch ein eindimensionales Array machen [0..255] - dann ist der wert gleichzeitig der Index und der zugriff geht schneller.
Allerdings muss man sich dann überlegen ob der wert valid ist, z.b. nur wenn <> 0....

#data und das DatenArray kann man per in/out übergeben - man sollte aus Bausteinen heraus nicht direkt auf global Daten in DB's zugreifen :)
 
Zuletzt bearbeitet:
Die Schleife muss man sogar abbrechen, sonst bekommt man als found immer false. (außer beim letzten Element)
Gruß
Erich

Danke, das hatte ich eben gar nicht auf dem Schirm :)

Mann könnte den ELSE zweig auch weglassen und #FOUND vor dem eintritt in die Schleife einmal auf FALSE setzen was wiederum etwas an Code und Bearbeitungszeit sparrt - wenn auch nur homöopathisch :-D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würde die schleife noch abbrechen wenn man das Element gefunden hat.



in der Zweiten Dimension würden doch zwei plätze reichen - oder nicht?

Welchen Datentyp nutzt ihr zum Vergleich?
Wenn man von Byte (wie im Eingangspost gesetzt) ausgeht, könnte mann auch ein eindimensionales Array machen [0..255] - dann ist der wert gleichzeitig der Index und der zugriff geht schneller.
Allerdings muss man sich dann überlegen ob der wert valid ist, z.b. nur wenn <> 0....

#data und das DatenArray kann man per in/out übergeben - man sollte aus Bausteinen heraus nicht direkt auf global Daten in DB's zugreifen :)

Im Grunde sieht die Aufgabenstellung wie folgt aus.
Man ließt einen Chip aus, dieser hat eine feste 4-6 stellige Zahl hinterlegt. Diese soll mit einer Datenbank verglichen werden, zudem soll bei einem positiven Vergleich ein Wert weitergegeben werden.

Wir hatten uns überlegt es mit einem Zweidimensionalen Array zu realisieren. Leider blicken wir da bei dem Code noch nicht so ganz durch. Zumal wir das Codebeispiel bisher noch nicht, für uns sinnvoll und funktionierend, umschreiben konnten.

MfG dranix
 
ich glaube Dranix meint, dass er die ankommende 4-6 stellige Zahl mit der im Array Spalte A vorhandenen Zahl vergleicht und den dazugehörigen, aus Spalte B definierten Wert ausgibt.
Kann man so machen, aber dann reicht ein "myArray[1..100,1]" anstatt "myArray[1..100,1..2]".
 
Kann man so machen, aber dann reicht ein "myArray[1..100,1]" anstatt "myArray[1..100,1..2]".
[1..100,1]? Hinter [1..100,1] versteckt sich doch wohl nicht so etwas wie [1..100,0..1]?
Oder denkst Du an ein Array eines Benutzer-definierten DatenTyps bestehend aus mehr als nur 1 "Spalte"?
Oder meinst Du, dass die "überflüssige Spalte" sowieso nur die IndexNr enthält?
Wenn die 2. Dimension in der GrössenOrdnung 1..2 bleiben soll und der HinderungsGrund nur ein "ungutes Gefühl" beim Umgang mit der 2. Dimension ist oder die beiden "Spalten" unterschiedliche Datentypen haben sollen, so könnte man doch 2 Arrays "spendieren": eines für die Spalte mit dem SuchBegriff und das andere für die Spalte mit dem "Ergebnis".
Damit könnte der TE schonmal loslegen und eines schönen Tages, wenn er die Scheu vor der 2. Dimension überwunden hat . . .
Ich weiss, das klingt nicht gut, aber ehe hier noch Tage und Wochen auf eine Lösung gewartet wird, die ihm 300%ig zusagt, finde ich:
Machen ist besser als beim Grübeln zu verzweifeln, denn man kann dabei zumindest Erfahrungen und Routine sammeln.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
[1..100,1]? Hinter [1..100,1] versteckt sich doch wohl nicht so etwas wie [1..100,0..1]?
Dahinter steck ein [1..100,1..1] was nichts anderes wie ein [1..100,1] ja wäre (1 Spalte), da er ja nur pro gefunden Eintrag jeweils nur ein Ausgabewert braucht.

Oder meinst Du, dass die "überflüssige Spalte" sowieso nur die IndexNr enthält?
Genau.

Damit könnte der TE schonmal loslegen und eines schönen Tages, wenn er die Scheu vor der 2. Dimension überwunden hat . . .
Mir ging es nur darum ob es generell Sinn macht ein 2-D Array für seine Anwendung anzulegen, da meiner Meinung nach es auch anderes geht.
 
[1..100,1]? Hinter [1..100,1] versteckt sich doch wohl nicht so etwas wie [1..100,0..1]?
Oder denkst Du an ein Array eines Benutzer-definierten DatenTyps bestehend aus mehr als nur 1 "Spalte"?
Oder meinst Du, dass die "überflüssige Spalte" sowieso nur die IndexNr enthält?
Wenn die 2. Dimension in der GrössenOrdnung 1..2 bleiben soll und der HinderungsGrund nur ein "ungutes Gefühl" beim Umgang mit der 2. Dimension ist oder die beiden "Spalten" unterschiedliche Datentypen haben sollen, so könnte man doch 2 Arrays "spendieren": eines für die Spalte mit dem SuchBegriff und das andere für die Spalte mit dem "Ergebnis".
Damit könnte der TE schonmal loslegen und eines schönen Tages, wenn er die Scheu vor der 2. Dimension überwunden hat . . .
Ich weiss, das klingt nicht gut, aber ehe hier noch Tage und Wochen auf eine Lösung gewartet wird, die ihm 300%ig zusagt, finde ich:
Machen ist besser als beim Grübeln zu verzweifeln, denn man kann dabei zumindest Erfahrungen und Routine sammeln.

Hatte mich nochmals mit dem 2-Dimensionalen Array beschäftigt und bin zu keinem richtigen Ergebnis der Umsetzung gekommen. Wir wollten nun mithilfe zwei DB's bzw. zwei Arrays den vergleich Programmieren. Der erste Array ist ein Code-Array[1..25] of DInt. Dieser beinhaltet mehrere 4 stellige Zahlen die verglichen werden sollen. Der zweite Array ist ein Namens-Array[1..25] of String, dieser beinhaltet verschiedene Namen. Sollte nun im Code-Array eine Zahl übereinstimmen und ist diese an Postion 11 im Array sollte dann die Position 11 im Namens-Array ausgegeben werden. Der Vergleich des Code-Arrays funktioniert aber das Gleichsetzen der beiden Arrays noch nicht so ganz ...
 
Mit 2D-Array:
Code:
FOR i := 1 TO 25 DO
    IF codeArray[i, 1] = vergleichswert THEN
        ausgabe := codeArray[i, 2];
        EXIT;
    END_IF;
END_FOR;

Mit 2 verschiedenen Arrays:
Code:
FOR i := 1 TO 25 DO
    IF codeArray[i] = vergleichswert THEN
        ausgabe := stringArray[i];
        EXIT;
    END_IF;
END_FOR;

Der Vergleich des Code-Arrays funktioniert aber das Gleichsetzen der beiden Arrays noch nicht so ganz ...
Wieso Gleichsetze? Muss man doch gar nicht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit 2D-Array:
Code:
FOR i := 1 TO 25 DO
    IF codeArray[i, 1] = vergleichswert THEN
        ausgabe := [B]codeArray[[COLOR=#0000ff]1, i[/COLOR]][/B];  ändern in [B][COLOR=#222222][FONT=Verdana]codeArray[[/FONT][/COLOR][COLOR=#ff0000]i, 2[/COLOR][COLOR=#222222][FONT=Verdana]]  [/FONT][/COLOR][/B]
        EXIT;
    END_IF;
END_FOR;

Mit 2 verschiedenen Arrays:
Code:
FOR i := 1 TO 25 DO
    IF codeArray[i] = vergleichswert THEN
        ausgabe := stringArray[i];
        EXIT;
    END_IF;
END_FOR;

Wieso Gleichsetze? Muss man doch gar nicht.
Verstehe die Frage nicht … welches Gleichsetzen?

Eintrag [i, 1] in Array C gehört zu Eintrag [i, 2] in Array C (Version 1 2-dimensionales Array)
Eintrag in Array A gehört zu Eintrag in Array B (Version 2 1-dimensionale Arrays)
Bei Verwendung von 2 Arrays müssen genau so, wie bei 1 2-dim. Array die Daten natürlich so abgelegt sein, dass die zusammengehörigen unter demselben Index gespeichert werden.
 
Zuletzt bearbeitet:

Verstehe die Frage nicht … welches Gleichsetzen?

Eintrag [i, 1] in Array C gehört zu Eintrag [i, 2] in Array C (Version 1 2-dimensionales Array)
Eintrag in Array A gehört zu Eintrag in Array B (Version 2 1-dimensionale Arrays)
Bei Verwendung von 2 Arrays müssen genau so, wie bei 1 2-dim. Array die Daten natürlich so abgelegt sein, dass die zusammengehörigen unter demselben Index gespeichert werden.


Ist ja eigentlich ganz einfach :D. Hatten da nur einen Denkfehler und wollten es mit zwei Forschleifen ermitteln. Geht ja aber mit einer. Funktioniert nun. Der Index aus dem ersten Array entspricht dem gewollten Index aus dem zweiten Array und wird als Ergebnis ausgegeben.

Werden es nun nochmal mit dem 2-D Array versuchen. :D
 
Ist ja eigentlich ganz einfach.
Werden es nun nochmal mit dem 2-D Array versuchen.
Ist auch ganz einfach! Und 2-D-Arrays sind auch keine Geheimwissenschaft. Die Eingewöhnung fällt einfach leichter, wenn man den Umgang mit 1-D-Arrays bereits im Griff hat.
2-D wird evtl. noch KopfZerbrechen wegen der unterschiedlichen Datentypen in den beiden "Spalten" bereiten …
Gutes Gelingen! Heinileini
 
Zurück
Oben