INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

prodave dll in lv aufrufen



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

08.03.2013, 11:52 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2013 11:58 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: prodave dll in lv aufrufen
(08.03.2013 11:10 )vanbasten schrieb:  Hallo,
ich habe erfolgreich mittels Prodave eine Verbindung zu einer SoftPLC (ACCONtrol S7) aufgebaut. In C++ sieht der Code folgendermassen aus:
Code:
//load connection (automatically sets as active)
    int loadConRV = 0; //return value
    unsigned short conNr = 0; //ID
    char* accessPoint = "S7ONLINE"; //default, as opposed to MPI
    CON_TABLE_TYPE conTable[MAX_CONNECTION+1]; //CON_TABLE_TYPE conTable; works as well to simplify LV access
    CON_TABLE_TYPE* pConTable = &conTable[conNr]; //&conTable; works as well to simplify LV access
    unsigned short conTableLen = sizeof(CON_TABLE_TYPE);
    pConTable[conNr].Adr.Ip[0] = 127; //IP irrelevant for softplc
    pConTable[conNr].Adr.Ip[1] = 0;
    pConTable[conNr].Adr.Ip[2] = 0;
    pConTable[conNr].Adr.Ip[3] = 1;
    pConTable[conNr].AdrType = 2; //IP
    pConTable[conNr].SlotNr = 2;
    pConTable[conNr].RackNr = 0;
    loadConRV = LoadConnection_ex6(conNr, accessPoint, conTableLen, pConTable);
    printf("LoadConnection() return value: %x\n", loadConRV);

Nun versuche ich dasselbe mit lv11_img unter WinXP 32-bit. Die Funktion lässt sich nicht importieren, weil unter den Parametern union innerhalb struct vorkommt. Ausschnitt aus dem Prodave-Manual:
Code:
int LoadConnection_ex6 (int ConNr, char* pAccessPoint, int ConTableLen,
CON_TABLE_TYPE * pConTable);
Parameters
ConNr
[in] Number of the connection (max. 64 connections).
pAccessPoint
[in] access point (zero-terminated) of the driver used, e.g. "S7ONLINE" for the MPI
driver or 0 (default).
ConTableLen
[in] length of the connection structure provided by the user in bytes
pConTable
[in] pointer to address structure of the user
#pragma pack(1)
typedef union {
unsigned char Mpi; // MPI/PB station address (2)
unsigned char Ip[4]; // IP address (192.168.0.1)
unsigned char Mac[6]; // MAC address (08-00-06-01-AA-BB)
} CON_ADR_TYPE;
typedef struct {
CON_ADR_TYPE Adr; // connection address
unsigned char AdrType; // Type of address: MPI/PB (1), IP (2), MAC (3)
unsigned char SlotNr; // Slot number
unsigned char RackNr; // Rack number
} CON_TABLE_TYPE;
#pragma pack(1)

Ich habe mir bereits folgende Seite angeschaut. Man soll theoretisch die Parameter eines Structs einzeln nacheinander auflisten. Jedoch mein Code verursacht einen Absturz von LV..

Im Anhang findet ihr das Beispiel. Für jede Hilfe wäre ich dankbar.

pConTable ist ein Pointer auf eine struct, nicht die struct selber. Demgemäss musst Du die Elemente dieser struct nicht einzeln als Funktionsparameter übergeben, sondern als struct. Und man kann das in LabVIEW machen indem man einen Cluster erstellt der mit dieser struct kompatibel ist und dann den Call Library Node Parameter als Adapt to Type konfiguriert und den Cluster dort anschliesst.

Der Cluster sollte 6 Bytes für CON_ADR_TYPE enthalten (der Size des grössten Unionelementes) und dann je ein Byte für die anderen drei Elemente. Und bitte die 6 Bytes als 6 seperate Bytes anlegen (möglicherweise als ein Subcluster) aber sicher nicht als Array.

Und der erste Parameter ist ein int, das ist ein 32 bit Integer, kein 16 bit Integer wie in Deinem VI. int == 16 bit war voor Urzeiten mit DOS!!

Übrigens ist das pragma pack(1) in der Prodav-Beschreibung erstens überflüssig da alle Elemente in der struct sowieso byte sized sind und zweitens ziemlich sicher auch falsch, da man üblicherweise das pragma am Ende mit einem Aufruf ohne Parameter wieder auf default zurücksetzt und nicht einfach nochmals auf den selben Wert setzt wie zuvor.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Nachrichten in diesem Thema
prodave dll in lv aufrufen - vanbasten - 08.03.2013, 11:10
RE: prodave dll in lv aufrufen - rolfk - 08.03.2013 11:52
RE: prodave dll in lv aufrufen - rolfk - 08.03.2013, 14:00

Gehe zu: