OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9
OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3 KOS_UnInit...6 2.2.4 KOS_Register...6 2.2.5 KOS_RegisterB...6 2.2.6 KOS_UnRegister...7 2.2.7 KOS_UnRegisterB...7 2.3...7 2.3.1 KOS_SetClientWriteProc...8 2.3.2 KOS_SetClientShutdownProc...8 2.3.3 KOS_SetItemConnectProc...9 2.4 Item...9 2.4.1 KOS_AddItem...10 2.4.2 KOS_AddItemB...10 2.4.3 KOS_UpdateItem...11 2.4.4 KOS_RemoveItem...11 2.4.5 KOS_SetAddressDelimiter...11 2.5...12 2.5.1 KOS_GetClientCount...12 2.5.2 KOS_ShutdownClients...12 2.5.3 KOS_SetHashSize...12 3...13 3.1...13 3.2 step1...13 3.3 step2...14 3.4 step3 CLSID...14 3.5 step4...15 3.5.1...15 3.5.2...16 3.5.3...16 3.5.4...18 2
Knight OPC Server Rapid Development Toolkits 3.6 step5 OPC...19 3.7 step6 OPC...20 3.8 step7 OPC...21 4...24 4.1...24 4.2...24 3
OPC 1 KOSRDK Knight OPC Server Rapid Development Kit KOSRDK OPC OLE For Process KOSRDK OPC OPC DA: Data Access 1.0/2.0 DLL ATL/DCOM OPC Visual C++, Visual Basic, Borland C++ builder, Delphi 4
Knight OPC Server Rapid Development Toolkits 2 API 2.1 KOSRDK API kosrdkapi.h API KOS_ 2.2 2.2.1 KOS_Init OPC BOOL KOS_Init(GUID CLSID_Svr, UINT UpdateRate); 0 (1) GUID CLSID_Svr Class ID GUIDGEN.EXE (2) UINT UpdateRate 10~60000 ms 2.2.2 KOS_InitB OPC KOS_Init C++ Visual Basic BOOL KOS_InitB(BYTE *pclsid_svr, UINT UpdateRate); 0 (1) BYTE *pclsid_svr Class ID GUIDGEN.EXE (2) UINT UpdateRate 10~60000 ms 5
OPC 2.2.3 KOS_UnInit BOOL KOS_UnInit(); 0 OPC 2.2.4 KOS_Register BOOL KOS_Register (GUID CLSID_Svr, CString Name, CString Descr, CString ExePath); 0 (1) GUID CLSID_Svr Class ID GUIDGEN.EXE (2) CString Name: (3) CString Descr: (4) CString ExePath: OPC OPC OPC 2.2.5 KOS_RegisterB BOOL KOS_RegisterB (BYTE *pclsid_svr, LPCSTR Name, LPCSTR Descr, LPCSTR ExePath); 0 (1) BYTE *pclsid_svr Class ID GUIDGEN.EXE (2) LPCSTR Name: (3) LPCSTR Descr: 6
Knight OPC Server Rapid Development Toolkits (4) LPCSTR ExePath: OPC OPC OPC KOS_Register C++ Visual Basic 2.2.6 KOS_UnRegister BOOL KOS_UnRegister (GUID CLSID_Svr, CString Name); 0 (1) GUID CLSID_Svr Class ID GUIDGEN.EXE (2) CString Name: OPC OPC OPC 2.2.7 KOS_UnRegisterB BOOL KOS_UnRegisterB (BYTE *pclsid_svr, LPCSTR Name); 0 (1) BYTE *pclsid_svr Class ID GUIDGEN.EXE (2) LPCSTR Name: OPC OPC OPC KOS_UnRegister C++ Visual Basic 2.3 OPC Server DLL 7
OPC 2.3.1 KOS_SetClientWriteProc BOOL KOS_SetClientWriteProc ( CLIENTWRITEPROC lpcallback) 0 (1) CLIENTWRITEPROC lpcallback OPC OPC OPC OPC OPC void CALLBACK EXPORT ClientWriteProc ( HANDLE Handle,VARIANT *pvar ) (1) HANDLE Handle OPC Server OPC (2) VARIANT *pvar 2.3.2 KOS_SetClientShutdownProc BOOL KOS_SetClientShutdownProc ( CLIENTSHUTDOWNPROC lpcallback ) 0 CLIENTSHUTDOWNPROC lpcallback OPC OPC OPC Server DLL OPC void CALLBACK EXPORT ClientShutdownProc(UINT wclientcount) (1) UINT wclientcount OPC 8
Knight OPC Server Rapid Development Toolkits 2.3.3 KOS_SetItemConnectProc BOOL KOS_SetItemConnectProc ( ITEMCONNECTPROC lpcallback ) 0 ITEMCONNECTPROC lpcallback OPC OPC DLL OPC OPC OPC OPC OPC OPC OPC OPC OPC OPC OPC OPC (1) OPC OPC (2) OPC OPC void CALLBACK EXPORT ItemConnectProc(HANDLE itemhandle, BOOL bconnected) HANDLE itemhandle OPC BOOL bconnected TRUE OPC OPC FALSE OPC OPC 2.4 Item API OPC / 9
OPC 2.4.1 KOS_AddItem HANDLE KOS_AddItem (CString Name, VARIANT Value, WORD InitialQuality, BOOL IsWritable); NULL OPC OPC Server DLL HANDLE (1) CString Name OPC (2) VARIANT Value OPC (3) WORD InitialQuality OPC OPCDA.H OPC OPC KOSRDK.dll OPC 2.4.2KOS_AddItemB HANDLE KOS_AddItemB (LPCSTR Name, VARIANT Value, WORD InitialQuality, BOOL IsWritable); NULL OPC OPC Server DLL HANDLE (1) LPCSTR Name OPC (2) VARIANT Value OPC (3) WORD InitialQuality OPC OPCDA.H (4) BOOL IsWritable OPC TRUE- FALSE- (4) BOOL IsWritable OPC TRUE- FALSE- OPC OPC KOSRDK.dll OPC KOS_AddItem C++ Visual Basic 10
Knight OPC Server Rapid Development Toolkits 2.4.3 KOS_UpdateItem BOOL KOS_UpdateItem (HANDLE ItemHandle, VARIANT Value, WORD Quality); 0 (1) HANDLE ItemHandle OPC OPC OPC (2) VARIANT Value OPC (3) WORD Quality OPC OPCDA.H 2.4.4 KOS_RemoveItem BOOL KOS_RemoveItem (HANDLE ItemHandle); 0 (1) HANDLE ItemHandle OPC OPC OPC 2.4.5 KOS_SetAddressDelimiter char KOS_SetAddressDelimiter (char delimiter); char delimiter OPC OPC OPC OPC A.A.A, A.A.B, A.B.A, A.B.B. 11
OPC 2.5 2.5.1 KOS_GetClientCount int KOS_GetClientCount(); 0 2.5.2 KOS_ShutdownClients void KOS_ShutdownClients(); OPC OPC 2.5.3 KOS_SetHashSize UINT KOS_SetHashSize(UINT HashSize); OPC KOSRDK.dll OPC OPC OPC OPC OPC 1.2 500 OPC OPC 12
Knight OPC Server Rapid Development Toolkits 3 3.1 Microsoft Visual C++ 6.0 OPC \Samples\source\KOSVC\TestServer.dsw 3.2 step1 OPC / OPC / DLL http://www.opcfoundation.org http://www.eehoo.net/opcdist.zip KOSRDK 1.6 4 system32 opcproxy.dll opccomn_ps.dll opcae_ps.dll opchda_ps.dll 4 REGSVR32 opcproxy.dll REGSVR32 opccomn_ps.dll REGSVR32 opc_aeps.dll REGSVR32 opchda_ps.dll actxprxy.dll aprxdist.exe 13
OPC 3.3 step2 Visual C++ KOSRDK 3 (1) kosrdk.dll KOSRDK OPC (2) kosrdk.lib kosrdk.dll (3) kosrdkapi.h KOSRDK KOSRDK API opcda.h OPC Visual Basic Delphi 3.4 step3 CLSID OPC GUID CLSID GUIDGEN.EXE Visual C++ 6.0 VC \common\tools\ GUIDGEN.EXE 1 14
Knight OPC Server Rapid Development Toolkits 3-1 GUIDGEN.EXE 2 GUID 3 Copy 3 Visual Studio MainFrm.h CLSID_Svr Edit Paste GUID <<name>> CLSID_Svr 4 //Filename: MainFrm.h // User Application Parameters // CLSID_Svr: the classid of this OPC Server static const GUID CLSID_Svr = { 0x42cc3bf1, 0x4409, 0x429a, { 0xb9, 0x9b, 0xab, 0x60, 0xf8, 0x82, 0x1, 0x4e } }; 3.5 step4 3.5.1 OPC //Filename: MainFrm.cpp 15
OPC //Function: CMainFrame::CMainFrame() // Name of OPC server m_strsvrname = "Knight.OPC.Server.Test" ; // Description of OPC server m_strsvrdesc = "OPC Server for test"; 3.5.2 KOS_Init() BOOL KOS_Init(GUID CLSID_Svr, UINT UpdateRate) CLASSID //Filename: MainFrm.cpp //Function: CMainFrame::CMainFrame() // Knight OPC Server Initialization KOS_Init(CLSID_Svr,100); 3.5.3 KOSRDK CALLBACK OPC Server DLL (1) OPC OPC OPC Server DLL //Filename: MainFrm.cpp //Function: CMainFrame::CMainFrame() 16
Knight OPC Server Rapid Development Toolkits // Setting write callback procedure KOS_SetClientWriteProc(&ClientWriteProc); ClientWriteProc //Filename: MainFrm.cpp void CALLBACK EXPORT ClientWriteProc ( HANDLE Handle,VARIANT *pvar ) { TRACE("Client Write Data, Item Handle=%d, float value = %f\n",handle,pvar->fltval); // } (2) OPC OPC OPC Server DLL //Filename: MainFrm.cpp //Function: CMainFrame::CMainFrame() // Setting client shutdown callback procedure KOS_SetClientShutdownProc (&ClientShutdownProc); ClientShutdownProc //Filename: MainFrm.cpp void CALLBACK EXPORT ClientShutdownProc ( UINT wclientcount) { TRACE("Client Shutdown, remain connections count = %d\n",wclientcount); } wclientcount 0 17
OPC OPC 3.5.4 OPC OPC CLSID (1) //Filename: MainFrm.cpp //Function: CMainFrame::OnOpcRegserver void CMainFrame::OnOpcRegserver() { // TODO: Add your command handler code here int i; BOOL bret = FALSE; CString strfile; strfile = AfxGetApp()->m_pszHelpFilePath; i = strfile.reversefind('\\'); strfile = strfile.left(i+1); strfile += "kostest.ext"; bret = KOS_Register( CLSID_Svr, m_strsvrname, m_strsvrdesc, strfile); if (bret) AfxMessageBox("Register OK"); } (2) 18
Knight OPC Server Rapid Development Toolkits //Filename: MainFrm.cpp //Function: CMainFrame::OnOpcUnregserver void CMainFrame::OnOpcUnregserver() { BOOL bret; bret = KOS_UnRegister( CLSID_Svr, m_strsvrname); if (bret) AfxMessageBox("Unregister OK"); } 3.6 step5 OPC OPC OPC Server DLL OPC OPC OPC API HANDLE WINAPI KOS_AddItem (CString Name, VARIANT Value, WORD InitialQuality, BOOL IsWritable); API //Filename: MainFrm.cpp //Function: CMainFrame::OnOpcAdditem() // CItem *pitem; HANDLE hitem; pitem = new CItem; pitem->name = dlg.m_strname; COleVariant vt( dlg.m_strvalue ); // initialize as a string switch (dlg.m_ndatatype) { case 0://BOOL pitem->value.vt = VT_BOOL; 19
OPC break; case 1://SHORT pitem->value.vt = VT_I2; break; // }//end switch vt.changetype( pitem->value.vt );//let COleVariant convert! hitem = KOS_AddItem (pitem->name, pitem->value, OPC_QUALITY_GOOD, TRUE); if (hitem == NULL) { } delete pitem; return; pitem->handle = hitem; // 3.7 step6 OPC OPC OPC Server DLL OPC OPC OPC OPC OPC OPC OPC Server DLL OPC OPC Server DLL OPC API BOOL WINAPI KOS_UpdateItem (HANDLE ItemHandle, VARIANT Value, WORD Quality); API OPC Server DLL OPC 20
Knight OPC Server Rapid Development Toolkits //Filename: MainFrm.cpp //Function: CMainFrame::OnTimer(UINT nidevent) // CItem *pitem; Lock(); for (i=0;i<m_itemlist.getsize();i++) { pitem = (CItem *)m_itemlist.getat(i); //read value form hardware pitem->readfromhardware(); //update current value to OPC Server DLL KOS_UpdateItem ( pitem->handle, pitem->value, pitem->quality); } UnLock(); OPC (1) OPC (2) OPC (3) OPC OPC (1) OPC (2) OPC (3) OPC (4) OPC 3.8 step7 OPC OPC (1) 21
OPC //Filename: MainFrm.cpp //Function: CMainFrame::OnOpcDisconnect if ( KOS_GetClientCount()>0 ) { KOS_ShutdownClients(); } (2) new (3) KOS_RemoveItem() OPC OPC (4) KOS_UnInit() OPC //Filename: MainFrm.cpp //Function: CMainFrame:: ~CMainFrame() // // free all items in local m_itemlist Lock(); int i; CItem *pitem; for (i=0;i<m_itemlist.getsize();i++) { } pitem = (CItem *)m_itemlist.getat(i); KOS_RemoveItem(pItem->Handle); delete pitem; m_itemlist.removeall(); UnLock(); // Knight OPC Server Uninitialization 22
Knight OPC Server Rapid Development Toolkits KOS_UnInit(); // 23
OPC 4 4.1 KOSRDK 4.2 http://www.eehoo.net OPC opc@eehoo.net / sales@eehoo.net support@eehoo.net 24