Seite 1 von 1

Structur erstellen

Verfasst: 20.05.2010 18:25
von Folli
Hallo
Ich versuche einen OPC-Server (SPS von Möller) anzusprechen.
Dazu starte ich einen CoDeSys Gateway Server und greife über eine DLL (XC_Comm.dll) darauf zu.
Geschrieben ist diese DLL natürlich für C.
Meine Frage: Wie erstelle ich folgende Structure (XCVarInfos) in PB?
ulChannel und ulNumberOfSymbols ist klar aber die Zeiger (auf Zeiger) bereiten mir Probleme.

Code: Alles auswählen

enum TypeClass
{
	TYPE_BOOL,
	TYPE_INT,
	TYPE_BYTE,
	TYPE_WORD,
	TYPE_DINT,
	TYPE_DWORD,
	TYPE_REAL,
	TYPE_TIME,
	TYPE_STRING,
	TYPE_ARRAY,
	TYPE_ENUM,
	TYPE_USERDEF,
	TYPE_BITORBYTE,
	TYPE_POINTER,
	TYPE_SINT,
	TYPE_USINT,
	TYPE_UINT,
	TYPE_UDINT,
	TYPE_DATE,
	TYPE_TOD,
	TYPE_DT,
	TYPE_VOID,
	TYPE_LREAL,
	TYPE_REF
};

//  Symbolinformationen
typedef struct tagXCVarValue
{
	ULONG ulTimeStamp;
	BYTE  bQuality;
	BYTE  byData[1];
}XCVarValue;

typedef struct tagXCSymbolDesc
{
	LPSTR pszName;
	LPSTR pszType;
	WORD  uRefId;
	ULONG ulOffset;
	ULONG ulSize;
	char  szAccess[2];
}XCSymbolDesc;

typedef void* XCVARLIST;

typedef struct tagXCVarInfos
{
	XCVARLIST		hVarList;
	XCVarValue		**ppValues;
	XCSymbolDesc	**ppSymbolList;
	enum TypeClass	*pTypeClass;
	ULONG			ulNumberOfSymbols;
	ULONG			ulChannel;
}XCVarInfos;

typedef struct tagDataRef
{
	WORD	POURef;		
	DWORD	Offset;		
	DWORD	Size;		
}DataRef;
Code-Tags eingefügt
Bitte per Button in der Leiste selber machen
-- Andesdaf

Re: Structur erstellen

Verfasst: 20.05.2010 21:11
von mk-soft
Hi,

versuch es mal hiermit -> http://www.purebasic.fr/german/viewtopi ... =8&t=20003

Dann bist du von den CoDeSys Gateway nicht abhängig.

FF :wink:

P.S. Die Beispiele sind eher Testprogramme...

Re: Structur erstellen

Verfasst: 21.05.2010 10:53
von alter Mann
Grundsätzlich sollte man wissen, dass ein Pointer (auch void*) die selbe Größe wie ein Integer (.i) hat.

Dann es gib 2 Möglichkeiten :

1. Du musst den Speicher bereitstellen auf den die aufgerufene Funktion die Informationen schreibt :

Code: Alles auswählen

Structure tagXCVarInfos
   *hVarList.i
   *ppValues.i
   *ppSymbolList.i
   *pTypeClass.i
   ulNumberOfSymbols.i
   ulChannel.i
EndStructure

Protected XCVarInfos.tagXCVarInfos
...
iAnz.i = ... ; 
*Symbols.XCSymbolDesc = AllocateMemory(iAnz*SizeOf(XCSymbolDesc));
iPointer.i = *Symbols.XCSymbolDesc;
...
XCVarInfos\ppSymolList = @iPointer
...
*SymbolsTemp.XCSymbolDesc = *Symbols.XCSymbolDesc
For i=0 To XCVarInfos\ulNumberOfSymbols-1
  ...
  *SymbolsTemp + SizeOf(XCSymbolDesc)
Next i
...
FreeMemory(*Symbols.XCSymbolDesc)
2. Du musst den Speicher nur auslesen

Code: Alles auswählen

Protected XCVarInfos.tagXCVarInfos
Protected *Symbols.XCSymbolDesc

...
*Symbols.XCSymbolDesc = PeekI(XCVarInfos\ppSymbolList)
...
*SymbolsTemp.XCSymbolDesc = *Symbols.XCSymbolDesc
For i=0 To XCVarInfos\ulNumberOfSymbols-1
  ...
  *SymbolsTemp + SizeOf(XCSymbolDesc)
Next i