Structur erstellen

Anfängerfragen zum Programmieren mit PureBasic.
Folli
Beiträge: 7
Registriert: 20.05.2010 18:14

Structur erstellen

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Structur erstellen

Beitrag 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...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Structur erstellen

Beitrag 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
Win11 64Bit / PB 6.0
Antworten