Problem mit ARRAY - STRUCT

Jörg_24

Level-2
Beiträge
124
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits,
vorweg - ich habe noch nicht viel mit ARRAY und STRUCT zu tun gehabt und tu mich etwas schwer damit...
Ich habe eine Funktion mit folgenden Eingängen:

VAR_INPUT
X : REAL;
XY : ARRAY[1..10,0..1] OF REAL;
Pts : INT;
END_VAR

Ich bekomme es in S7 KOP/FUP nicht hin, den Eingang XY richtig zu bedienen. Bisher habe ich zwei Wege versucht:
1.) per SCL das Array in einem DB 10 "Punkte" mit den notwendigen Daten erzeugt/gefüllt; S7 bietet mir jetzt (in KOP/FUP) am Eingang XY den DB mit der symbolischen Bezeichnung "Punkte" an. Die Datenpunkte heißen im DB WERT[x,y]. Wenn ich den DB "Punkte" übernehmen will kommt die Fehlermeldung "Aktualdatentyp ARRAY passt nicht zu formalem Typ STRUCT des Formalparameters XY". Funktioniert auch nicht mit "Punkte".WERT... in diversen Varianten.
2.) per SCL einen UDT mit den XY-Daten gefüllt und daraus den DB mit den jetzt sichtbaren Datenpaaren erzeugt. Ergebnis wie oben. :confused:
Wie muß die richtige Syntax für Eingang XY lauten? "Punkte".WERT[X,Y] geht auch nicht
Der DB sieht so aus...
moz-screenshot.png
moz-screenshot-1.png

Hat jemand einen/den Tipp für mich?
Oder ist mein Herangehen hier völlig falsch?
Gruß, Jörg
 

Anhänge

  • DB.bmp
    34,8 KB · Aufrufe: 79
Hi,

wenn ich mir den Baustein so anschaue würde ich sagen das ist der LINEAR_INT aus der oscat.lib oder? ;)

bei dem LINEAR_INT wurde der Eingang XY auf UDT16 "XY_LINEAR_INT" geändert. Also ist die Vorgehensweise jetzt etwas anders:

1. Neuen DB-Anlegen
2. Variable z.B. "XY" vom Typ UDT16 anlegen
3. Datenbausteinsymbol vergeben z.B. "DB Werte"
4. Baustein aufrufen und als XY Parameter "DB Werte".XY schreiben

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

...VAR_INPUT
X : REAL;
XY : ARRAY[1..10,0..1] OF REAL;
Pts : INT;
END_VAR...

falls es doch so ist geht es vom Prinzip her genau so.

1. Neuen DB-Anlegen
2. Variable z.B. "XY" vom Typ ARRAY[1..10,0..1] OF REAL anlegen
3. Datenbausteinsymbol vergeben z.B. "DB Werte"
4. Baustein aufrufen und als XY Parameter "DB Werte".XY schreiben

Gruss Daniel
 
Wenn die Funktion als Eingangsparameter ein ARRAY[1..10,0..1] OF REAL erwartet,
dann muß man beim Aufruf auch genau so ein komplettes ARRAY[1..10,0..1] OF REAL
übergeben. Nur ein einzelnes Element oder ein Struct oder ein anders deklariertes
Array kann dann nicht übergeben werden. Die Übergabe geht auch nur symbolisch.

Du müßtest also beim FC-Aufruf an XY übergeben: "Punkte".WERT und im DB deklarieren
Code:
WERT ARRAY[1..10,0..1]
     REAL
Leider zeigt Dein Screenshot nicht, wie Du WERT deklariert hast.

Harald
 
Hallo,
ich schliesse mich den Ausführungen von PN/DP voll an. Allerdings kann ich mir nicht vorstellen, dass das was du machst das ist, was du machen möchtest. Vielleicht fängst du das Ganze mal so rum an.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Knoten im Hirn...

Hallo Leute,
danke erst mal für die Tipps. Wir sprechen zwar die gleiche Sprache aber ich bekomme es trotz allem nicht hin...
(Es geht um die Funktion LINEAR_INT.)
Hier noch mal ein Screenshot von meinem Problem - ich denke/hoffe es wird nur ein banaler Fehler sein.../ Programmeinstellung???

Gruß, Jörg
 

Anhänge

  • Struct.JPG
    Struct.JPG
    128,1 KB · Aufrufe: 87
Hi,

welche Version der oscat.lib ist das? Mach doch mal aus XY kein Array of Real sondern, schreib da UDT16 hin. Diesen vorher aus der oscat.lib in das Projekt kopieren.

Gruss Daniel
 
b.r.

Hi Daniel,
...ist die Version 3.11. FC153 und UDT16 habe ich grad noch mal neu aus der Lib rausgezogen und getestet - keine Änderung.
Wenn ich IN-Var. XY als UDT16 deklariere kommt automatisch der Typ des UDT16 (XY_LINEAR_INT) und es wird wieder ein Array daraus. Ist ja wahrscheinlich auch so gewollt. - b.r. (bin ratlos)

// was soll der DB aus deiner ursprünglichen Anleitung für eine Struktur haben? Manuell angelegt mit den Array[1..20,0..1] in REAL oder vom UDT16 erzeugt? Hab ich beides schon mehrfach durch ...//

Gruß, Jörg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
exakt programmieren

Hallo Jörg,

wenn Du Dein Array im DB1 exakt so deklarierst, wie der IN-Parameter XY der FC "LINEAR_INT" deklariert ist,
dann klappt auch das symbolische Anbinden des Array problemlos.

Weiter oben hast Du geschrieben:
VAR_INPUT
X : REAL;
XY : ARRAY[1..10,0..1] OF REAL;
...

Wieso deklariert Du nun Dein Array XY im DB1 als ARRAY[1..20,0..1] OF REAL?

Und wieso Du als IN-Parameter für Deinen Test-FC1 ein STRUCT OF ARRAY[1..20,0..1] OF REAL deklarierst,
weißt wohl nur Du. Dies hat aber erstmal nichts mit dem Aufruf des FC "LINEAR_INT" zu tun.

Harald
 

Anhänge

  • Array.gif
    Array.gif
    30,9 KB · Aufrufe: 56
Wie kannst Du ohne Tippfehler ein Array im DB1 exakt so deklarieren, wie es der FC "LINEAR_INT" erwartet?

* öffne den FC "LINEAR_INT"
* markiere links oben im Deklarationsbereich das "IN"
* markiere nun oben rechts unter Name das "XY"
* Bearbeiten > Kopieren
* öffne den DB1
* markiere in der linken Spalte das "+0.0"
* Bearbeiten > Einfügen
* DB1 speichern
* den Aufruf-FC (FC1) öffnen
* den Aufruf des FC "LINEAR_INT" einfügen
* am Input XY des FC "LINEAR_INT" "DBWERTE".XY dranschreiben (DB1 hat den symbolischen Name: "DBWERTE")

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...kaum macht man´s richtig, schon geht´s...

Hi,
@ Harald:
deine Anleitung war der richtige Tipp, --> Grafik DB1; Der DB sieht zwar aus wie von hinten durch die Brust in Auge - aber funktioniert, (Muß das so aussehen? Die "Zaunpfähle" von den anderen Schreibern sahen einfacher aus - nicht doppelt geschachtelt - funktionierten bei mir aber nicht, egal wie ich es angestellt habe. Da habe ich wohl noch etwas Nachholungsbedarf...
(Mit den 10 und 20 Feldern das waren Rudimente von diversen Versuchen. Ich weiß schon, das das so nicht geht. Hatte mehrere Varianten in Arbeit :)
@ Daniel:
Danke fürs Beispiel - das mit dem UDT in der Deklaration hatte ich auch probiert, aber nicht mit symbolischer Bezeichnung in "..."
Dabei wäre es doch so einfach gewesen... --> Grafik DBmitUDT

Also Danke an euch alle für die Lektion an diesem verregneten Tag.

Gruß, Jörg
 

Anhänge

  • DB1.JPG
    DB1.JPG
    26,3 KB · Aufrufe: 45
  • DBmitUDT.JPG
    DBmitUDT.JPG
    37,7 KB · Aufrufe: 27
So, ich habe mir nun mal den FC153 "LINEAR_INT" aus dem Beispiel von Dalbi in #11 angesehen.
Zur Ehrenrettung von Dalbi muß ich sagen, Dalbi hat in seinen Beiträgen #2, #3 und #7 exakt
das richtige Vorgehen beschrieben.
icon14.gif


Das Problem war nun, daß der letztendlich benutzte FC153 "LINEAR_INT" am Eingang XY einen UDT16
erwartet und kein ARRAY[1..10,0..1] OF REAL, wie Jörg in #1 angegeben hatte.

Der DB sieht zwar aus wie von hinten durch die Brust in Auge - aber funktioniert, (Muß das so aussehen?
UDT haben immer um die eigentlichen Daten ein STRUCT. Deshalb kommt es hier im speziellen Fall,
wo der STRUCT nur ein ARRAY enthält, zu der augenfällig überflüssigen, aber unvermeidbaren
zusätzlichen "doppelten" Strukturierung XY.XY[1,1].
Für Step7 ist aber (berechtigterweise) ein ARRAY[1..10,0..1] OF REAL nicht das selbe wie ein
STRUCT OF ARRAY[1..10,0..1] OF REAL, obwohl die absolute Datenstruktur exakt die gleiche ist.
Deshalb hat wohl Step7 anfänglich die eigentlich richtige Eingabe "DBWERTE".XY abgelehnt.
Erschwerend kommt noch dazu, daß das Array im UDT16 nun größer ist: ARRAY[1..20,0..1] OF REAL.

@ Daniel:
Danke fürs Beispiel - das mit dem UDT in der Deklaration hatte ich auch probiert, aber nicht mit symbolischer Bezeichnung in "..."
Bei der Deklaration im DB ist es nicht zwingend, die symbolische UDT-Bezeichnung einzutippen.
Die Eingabe von UDT16 muß auch funktionieren.

Harald
 
Zurück
Oben