Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Array eines .NET Objects (Struktur) erzeugen
11.10.2012, 20:53
Beitrag: #1
Array eines .NET Objects (Struktur) erzeugen
Hallo mal wieder,

Ich habe da ein Problem mit VEE, ich glaube das kann ich gar nicht richtig beschreiben.

Mein Programm muß mit einem Produktionsleitsystem (MES) kommunizieren. An das MES werden Daten gemeldet (z.B. Messdaten) oder auch Daten abgefragt (z.B. Auftragsdaten).

Vom der MES-Software wird für diese Zwecke ein API (Application Programming Interface) zur Verfügung gestellt das man z.B. über eine .NET-DLL ansprechen kann.

Diese DLL lässt sich auch ganz bequem in VEE einbinden und die Funktionen/Methoden lassen sich im „Function&Object Browser“ finden.
Jede Methode benötigt bei Ihrem Aufruf gewisse Daten, die vom Datentyp her (Int,Real ect.) exakt stimmen müssen. Das ist alles soweit kein Problem.

Jetzt gibt es in der DLL vordefinierte „Objekte“, (hier: checkSetupData) die im Prinzip einem (VEE-) Record entsprechen. Dieses Objekt ist eine Ansammlung von Daten verschiedener Datentypen..

Was ich jetzt bei einem Funktions(Methoden)
aufruf brauche ist ein Array eines solchen Objekts (hier CheckSetupDataArray).

Und da fangen meine Probleme an.

Ich habe schon vieles probiert, aber nichts führte zum Erfolg.
Von „CheckSetupData“ gibt es einen Constructor, der sich auch einer (Laufzeit-)Variablen zuordnen lässt. Versuche ich diesen Constructor in einem Collector zu „sammeln“, bekomme ich die Fehlermeldung „Too many array dimensions given (maximum =0)“

Der Constructor lässt sich auch eine „declare-ten“ Variablen vom Typ „Variant“ zuordnen. Aber dafür gibt es dann kein „Allocate Array“ zum initialisieren.

Eine Variable lässt sich auch direkt als .NET Object genau diesen Typs (CheckSetupData) deklarieren, aber auch hier lässt sich kein Array daraus machen.

Bilde ich die Datenstruktur (von CheckSetupData) durch einen Record nach (gleiche Feldnamen, gleiche Datentypen) lässt sich zwar ein Array daraus machen aber biete ich dieses Array der DLL-Methode an bekomme ich Fehlermeldung 551 „Cannot convert incompatible ActiveX automation data type“ – was immer das heißt.

Hängt ich nur eine Variable des Typs „checkSetupData“ (kein Array !) an, bekomme ich die berühmte Fehlermeldung 751.

Fällt Euch da noch etwas ein ? In Labview soll das schon jemand realisiert haben, sollte doch dann in VEE auch funktionieren.

Gruß Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2012, 17:34
Beitrag: #2
RE: Array eines .NET Objects (Struktur) erzeugen
Moin Peter,

bei komplexen Datenstrukturen wird es schwerig genau die gewünschte Form im DLL konformen Format zu erzeugen.
Eine echte Hilfe kann dabei .net sein.
Dort gibt es garantiert in den Untiefen der Funktionen den richtigen Aufruf zum Daten konvertieren.
Schau mal unter mscorlib/system ob da was bei ist.
Fang erstmal mit kleinen Umwandelungen an (als Byte).
Siehe dazu auch http://msdn.microsoft.com/en-us/library/yxcx7skw.aspx

Oder du schreibst dein eigenes C# Programm mit "C# Express 2008" oder "C# Express 2010" als Datenconverter.
Das geht im Prinzip ganz einfach, dazu nur einen ähnlichen Beispielprogrammcode downloaden und als dein Datentyp-Converter Programm entspechend erweitern.

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2012, 00:05
Beitrag: #3
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

danke für Deine Antwort.
An den "Umweg" über ein C# Programm habe ich auch schon gedacht.
Hoffe allerdings immer noch es doch irgendwie "direkt" hinzubekommen.

Problem ist auch, das die Methode Daten wieder über so ein Array-Construct zurückgeben will. Wenn VEE also so ein Array nicht "packt" wird's schwierig.
Die Hilfsfunktion (.NET oder C#) muß das Array dann häppchenweise zurückgeben.
Alternativ bleibt auch die ganze Anwendung in VB oder C# zu schreiben, VEE war die erste Wahl, da IO-Karten mit abgefragt werden und viele graphische Anzeigen dabei sind.

Gruß Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2012, 09:05
Beitrag: #4
RE: Array eines .NET Objects (Struktur) erzeugen
Moin Peter,

da ich deine MES Software nicht kenne, musst du mal deine Anforderungen an die Struktur posten.
Problem ist meist nur die Dateneingabe an die DLL und nicht die Rückgabe an VEE.
VEE ist da in der Regel ziemlich "schmerzfrei" und deshalb sollten wir erstmal das Übergabeproblem an die DLL lösen.

Also was wird benötigt?

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2012, 09:21
Beitrag: #5
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

habe mal die Beschreibung aus dem Handbuch und der Hilfe hier einkopiert:

int setupCheck
in IMSApiSessionContextStruct sessionContext
long sessionId
long persId
String locale
in String stationNumber
in String serialNumberRef
in String serialNumberRefPos
in String workOrderNumber
in int processLayer
in int checkMode
in int resultMode
out String workOrderNumber
out String productNumber
out String placementName
out int setupActive
out CheckSetupData[] checkSetupDataArray
String partNumber
String parentPartNumber
String compName
String materialBinNumber
double materialBinQtyActual
String materialBinState
long expirationDate
String setupPosition
long setupStartDate
int setupPositionActive
String machineGroup
int returnCode

METHOD Int32 setupCheck(com.itac.mes.imsapi.domain.container.IMSApiSessionContextStruct sessionContext, Text stationNumber, Text serialNumberRef, Text serialNumberRefPos, Text workOrderNumber, Int32 processLayer, Int32 checkMode, Int32 resultMode, ByRef Text workorderNumber, ByRef Text productNumber, ByRef Text placementName, ByRef Int32 setupActive, ByRef com.itac.mes.imsapi.domain.container.CheckSetupData[ ] checkSetupDataArray)


Problem macht wie gesagt das "checkSetupDataArray"

von (nur) "CheckSetupData" gibt es einen Constructor der sich bei VEE auch in eine Variable schieben läßt, nur ein Array kann ich eben nicht machen.

CONSTRUCTOR checksetupdata = CreateInstance("IMSApiDotNet", "com.itac.mes.imsapi.domain.container.CheckSetupData" )


eigentlich wird das Array ja nur für die Rückgabe der Werte benötigt, muß aber der Methode "byRef" übergeben werden. Wenn ich das richtig interpretiere ist das "Zeigerübergabe".
Was ich mich dabei frage ist: Wie wird die Länge des Rückgabearrays gehandhabt (soll beliebig lang sein können). Wenn das Array länger ist als der intern reservierte Speicherbereich gibt's doch Konflikte.

Gruß Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2012, 14:58
Beitrag: #6
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Peter,

ByRef -> heißt, dass das Datenformat vorgegeben wird (hier auch die Arraygröße).

So wie es aussieht müsstest du das Objekt "checksetupdata" an den Eingang "checkSetupDataArray" deines Methodenaufrufs setupCheck() legen.
Am besten ruft du dazu den CONSTRUCTOR checksetupdata vorher auf und weist mit SET das Objekt der Variablen "checksetupdata" zu.
Also so ->
Code:
SET checksetupdata = CreateInstance("IMSApiDotNet", "com.itac.mes.imsapi.domain.container.CheckSetupData" )
Ich hab dazu mal ein Beispiel gemacht.
Wichtig ist, dass die Methode erst aufgerufen wird wenn die Daten an den Eingängen komplett sind. Deshalb die Verbindung (violett) beachten.

Probiere das mal aus.


Angehängte Datei(en) Thumbnail(s)
   

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2012, 11:54
Beitrag: #7
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

als Kollege vom Peter mische ich hier mal mit ein. Wir abreiten beide am gleichen Problem.
Ich versuche es mal anders zu beschreiben:
Das Arbeiten mit den Structuren klappt schon soweit mit der .NET API. Jetzt brauchen wir aber von der einen Structur eben ein Structur-ARRAY.
Vielleicht hilft der Bildschirmausdruck besser auszudrücken was wir brauchen?

   

Ich hoffe das Bild wird mit angezeigt. In der Vorschau sehe ich leider nichts?

Danke, Sigi
Diese Nachricht in einer Antwort zitieren
17.10.2012, 15:27
Beitrag: #8
RE: Array eines .NET Objects (Struktur) erzeugen
Moin Sigi,

leider kenn ich nicht den Aufruf um ein Struct in VEE mit .NET zu erzeugen.
So kannst du aber ein Record Array erzeugen, vielleicht wird es ja angenommen.

Vielleicht geht ja diese Variante, wenn statt system.array als elementType dein Struct angelegt wird?


Angehängte Datei(en) Thumbnail(s)
       

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2012, 16:32
Beitrag: #9
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

der Aufruf mit Array.CreateInstace.. sieht vielversprechend aus!
Den habe ich auch auf der MS .NET Doku gefunden, aber nicht in VEE?
Wo versteckt sich denn der Aufruf, bzw. wie komme ich zu diesen?

Deine anderen Beispiele haben wir getestet, bzw. bereits schon so umgesetzt gehabt. Leider ohne Erfolgt.

Danke, Sigi
Diese Nachricht in einer Antwort zitieren
17.10.2012, 19:39 (Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2012 19:39 von Bratbaecker.)
Beitrag: #10
RE: Array eines .NET Objects (Struktur) erzeugen
Dazu die .NET Assembly "mscorlib" auswählen.
namespace "system" dort unter Array
Dazu die .NET Assembly "mscorlib" auswählen.
namespace "system" dort unter Array

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2012, 16:12
Beitrag: #11
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

danke für den "mscorlib" Tipp, konnte ich nun nachvollziehen und einbinden.
Leider komme ich damit auch nicht weiter. Mit der erhofften Funktion "Array.CreateInstance(elementType, length);" klappt es so leider auch nicht.
Dein Beispiel System.Array klappt:
   
Verbinde ich nun mit meiner Structrue, gibt es Fehler:
   
Grund dürfte sein, dass System.Array bereits ein Array enhält.
Im Vergleich zu unserer Structure = Object - Scalar ohne Array.
   

Mittlerweile habe ich mir peinlichst genau ein Record-Array aufgebaut die der API Structure entspricht. Damit bekomme ich nun wieder den Fehler 551, wie schon Peter anfangs geschrieben hat. Es liegt vermutlich daran, dass das eben ein VEE Record-Array ist und nicht das API Object-Array.

Möglicherweise gibt es da noch Möglichkeiten über .NET was zu erreichen. Hier haben wir aber beide keine Erfahrung. Bis jetzt habe ich hierzu noch nichts vernünftiges gefunden. Vielleicht habt Ihr ja noch ein paar Ideen.

Danke, Sigi
Diese Nachricht in einer Antwort zitieren
18.10.2012, 17:27
Beitrag: #12
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Sigi,

warum weist du nicht dem Struct die Werte vorher zu?
Das ist doch eigentlich kein Problem und sollte so funktionieren.


Angehängte Datei(en) Thumbnail(s)
   

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2012, 07:06
Beitrag: #13
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

das haben wir das schon getestet.
Ich habe die API Structure aufgerufen, zerlegt und wieder zusammen gebaut. Darüber sind nun die zurückgemeldeten Datenformate eindeutig bekannt. INT16/INT32..
Über Build Record - Collector, Record-Array ist fertig.
   
Als nächstes habe ich ein Record aufgebaut, welches exakt den Datentypen und Namen entspricht.
   
Damit habe ich mir nun mein Record-Array erzeugt, welches Datentechnisch und Namensgebung exakt der API Structure entspricht.
   
Ich hätte erwartet, dass die API nun damit funktioniert, was aber leider wieder mit Fehler 551 verweigert wird.
Der Unterschied liegt offensichtlich darin, dass die selbst zusammengebaute Structure unter VEE ein Record-Array ist. Hingegen die geladene Structure der API als Object behandelt wird.
Wir brauchen also in VEE ein Object-ARRAY dieser Structure.

Danke, Sigi
Diese Nachricht in einer Antwort zitieren
19.10.2012, 10:02
Beitrag: #14
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker,

nun habe ich es über .NET Array offensichtlich geschafft, ein Array von der API Structure zu erzeugen.
   
Zumindes sieht das nun schon mal danach aus.
Meine .NET API verweigert nun aber mit "Value must be a 1 dimensional array".

Insofern ist das dann doch noch nicht ganz was wir brauchen.

Guß, Sigi
Diese Nachricht in einer Antwort zitieren
19.10.2012, 17:53
Beitrag: #15
RE: Array eines .NET Objects (Struktur) erzeugen
Hallo Bratbaecker, hallo Sigi,

nachdem Ihr jetzt so schön mit dem Ball vor dem Tor hin und her gespielt habt, hab' ich den Ball jetzt mal reingeschossen.

Die "Input_Terminal_Information" von "checkSetupDataArray" stand auf Record (required Type) und Array_1D (required Shape). Wenn man hier auf "Any" stellt funktioniert der Methodenaufruf ohne Fehlermeldung !!!!!!!!!!

   

Das Array, das am Eingang ankommt ist vom Type "Object" und vom Shape "Scalar".
Da das "Array" hier schon im Objekt "versteckt" ist, wäre Shape "Array" ja dann ein Array vom Array.

@Bratbaecker
ohne deinen Hinweis auf die mscorlib/array hätten wir da noch lange probiert ! Vielen Dank !

Das Thema "Array eines .NET Objects" ist damit gelöst - hurra und schönes Wochenende.

Gruß Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:




Partnerforen: LabVIEWForum.de| DIAdem-Forum.de| Machine-Vision-Forum.de| goMatlab.de| VEEforum.de