嚴格說不屬 OPC 範疇。起因是另一專案 PLC 高手說 OPC 慢,用 Prodave。裝好 Prodave 看英文資料,雖英文不好但這裡很簡單。上網查資料,感謝幾位朋友幫忙,讓我對 C# 與 C++ 資料結構有更深認識,也學會用 DllImport。開頭說明:Prodave 是西門子通訊方式,即使我提供 Prodave6.dll,未註冊也無用,請用西門子安裝程式。別問哪裡下載 dll 或為何報錯未註冊。
說明書描述如下:
LoadConnection_ex6
int LoadConnection_ex6(int ConNr, char* pAccessPoint, int ConTableLen, CON_TABLE_TYPE* pConTable);
Parameters:
ConNr [in] 連線號碼 (max 64 connections)
pAccessPoint [in] 驅動程式存取點, e.g. "S7ONLINE"
ConTableLen [in] 使用者提供的連線表長度 (bytes)
pConTable [in] 連線使用者位址清單指標; 'Adr==0' 為結束標記
#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; // 1=MPI/PB, 2=IP, 3=Mac
unsigned char SlotNr; // Slot number
unsigned char RackNr; // Rack number
} CON_TABLE_TYPE;
#pragma pack(1)
其他轉換網上都有,難點在於 union 共用體,C# 沒有此概念。初參考網路資料,嘗試:
[StructLayout(LayoutKind.Explicit)]
struct S1 { [FieldOffset(0)] int a; [FieldOffset(0)] int b; }