📄 umain.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <malloc.h>
#include "uMain.h"
#include "DASVRSDK.h"
#include "stddef.h"
#include "stdlib.h"
#include "SysUtils.hpp"
#include "objbase.h"
#include "uAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
AnsiString _fastcall VarTypeToString(unsigned short AVarType)
{
switch(AVarType)
{
case VT_I2: return "VT_I2";
case VT_I4: return "VT_I4";
case VT_I8: return "VT_I8";
case VT_R4: return "VT_R4";
case VT_R8: return "VT_R8";
case VT_CY: return "VT_CY";
case VT_DATE: return "VT_DATE";
case VT_BSTR: return "VT_BSTR";
case VT_BOOL: return "VT_BOOL";
}
return "";
}
AnsiString FileTimeToString(_FILETIME AFileTime)
{
_FILETIME ft;
SYSTEMTIME st;
WORD Year, Month, Day, Hour, Min, Sec, MSec;
FileTimeToLocalFileTime(&AFileTime, &ft);
FileTimeToSystemTime(&ft, &st);
return Format("%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d", ARRAYOFCONST((st.wYear,st.wMonth,st.wDay,st.wHour,
st.wMinute, st.wSecond, st.wMilliseconds)));
}
TForm1::AddTags()
{
int I;
TTreeNode* rNode;
_FILETIME ft;
VARIANT v;
unsigned int Handle;
AnsiString str;
GetSystemTimeAsFileTime(&ft);
SetTagQualifier('.');
rNode=TreeView1->Items->AddChildFirst(NULL,"CBDEMO");
TreeView1->Items->AddChild(rNode,"Integer");
v.vt=varInteger;
v.intVal=0;
Handle= RegTag(0,"Integer",v,0,0);
for(I=0;I<8;I++)
{
TagList[I].ID= "TagInt"+IntToStr(I);
TagList[I].Type= VT_I4;
TagList[I].Value.vt=VT_I4;
TagList[I].Value.intVal=0;
TagList[I].Quality=192;
TagList[I].ft= ft;
// TagList[I].Handle= RegTag(Handle,TagList[I].ID.c_str(),TagList[I].Value,TagList[I].Quality,3);
TagList[I].Handle= RegTagEx(Handle,TagList[I].ID.c_str(),VT_I4,3);
}
TreeView1->Items->AddChild(rNode,"String");
Handle= RegTag(0,"String",v,0,0);
for(I=8;I<16;I++)
{
TagList[I].ID= "TagStr"+IntToStr(I-8);
TagList[I].Type= VT_BSTR;
TagList[I].Value.vt=VT_BSTR;
TagList[I].Value.bstrVal=SysAllocString(L" ");
TagList[I].Quality=192;
TagList[I].ft= ft;
// TagList[I].Handle= RegTag(Handle,TagList[I].ID.c_str(),TagList[I].Value,TagList[I].Quality,3);
TagList[I].Handle= RegTagEx(Handle,TagList[I].ID.c_str(),VT_BSTR,3);
}
TreeView1->Items->AddChild(rNode,"Bool");
Handle= RegTag(0,"Bool",v,0,0);
for(I=16;I<24;I++)
{
TagList[I].ID= "TagBool"+IntToStr(I-16);
TagList[I].Type= VT_BOOL;
TagList[I].Value.vt=VT_BOOL;
TagList[I].Value.boolVal=False;
TagList[I].Quality=192;
TagList[I].ft= ft;
// TagList[I].Handle= RegTag(Handle,TagList[I].ID.c_str(),TagList[I].Value,TagList[I].Quality,3);
TagList[I].Handle= RegTagEx(Handle,TagList[I].ID.c_str(),VT_BOOL,3);
}
TreeView1->Items->AddChild(rNode,"Float");
Handle= RegTag(0,"Float",v,0,0);
for(I=24;I<32;I++)
{
TagList[I].ID= "TagFloat"+IntToStr(I-24);
TagList[I].Type= VT_R8;
TagList[I].Value.vt=VT_R8;
TagList[I].Value.fltVal=0;
TagList[I].Quality=192;
TagList[I].ft= ft;
// TagList[I].Handle= RegTag(Handle,TagList[I].ID.c_str(),TagList[I].Value,TagList[I].Quality,3);
TagList[I].Handle= RegTagEx(Handle,TagList[I].ID.c_str(),VT_R8,3);
}
rNode->Expand(true);
return 0;
}
bool TForm1::CheckParam(AnsiString Param)
{
if(LowerCase(ParamStr(1))=="/regserver")
{
RegServer(OPCClsID,OPCProgID,OPCDescr,Application->ExeName.c_str());
return true;
}
if(LowerCase(ParamStr(1))=="/unregserver")
{
UnregServer(OPCClsID,OPCProgID);
return true;
}
return false;
}
TForm1::CreateOPCServer()
{
// ActiveCode("","");
if(CreateServer(OPCClsID,1000))
{
SetServerNotify(&ServerNotify);
SetWriteCallback(&WriteCallback);
SetReadCallback(&ReadCallback);
SetServerState(1);
AddTags();
this->InitOK=true;
Timer1->Enabled= true;
}
return 0;
}
TForm1::FreeOPCServer()
{
if(this->InitOK)
{
SetServerNotify(NULL);
SetWriteCallback(NULL);
FreeServer();
}
return 0;
}
TForm1::Simulate()
{
int I, Index;
TListItem* item;
_FILETIME ft,ft1;
GetSystemTimeAsFileTime(&ft);
AnsiString str;
for(int I=0; I<32; I++)
{
switch(TagList[I].Type)
{
case varInteger:
TagList[I].Value.intVal= random(101);
break;
case varOleStr:
str=IntToStr(random(101));
StringToWideChar(str,TagList[I].Value.bstrVal,str.WideCharBufSize());
break;
case varBoolean:
if(random(100)>50)
{
TagList[I].Value.boolVal=true;
}
else
{
TagList[I].Value.boolVal= false;
}
break;
case varDouble:
TagList[I].Value.dblVal= 99*random(101) / 99.1;
break;
}
TagList[I].Quality= 192;
TagList[I].ft= ft;
UpdateTagWithTimeStamp(TagList[I].Handle, TagList[I].Value, TagList[I].Quality, TagList[I].ft);
}
if((TreeView1->Selected!=NULL)&&(TreeView1->Selected->Level==1))
{
for(I=0; I<ListView1->Items->Count; I++)
{
item=ListView1->Items->Item[I];
if(TreeView1->Selected->Text=="Integer")
{
item->SubItems->Strings[0]=IntToStr(TagList[I].Value.intVal);
item->SubItems->Strings[1]=IntToStr(TagList[I].Quality);
item->SubItems->Strings[2]=FileTimeToString(TagList[I].ft);
}
if(TreeView1->Selected->Text=="String")
{
item->SubItems->Strings[0]=TagList[8+I].Value.bstrVal;
item->SubItems->Strings[1]=IntToStr(TagList[8+I].Quality).c_str();
item->SubItems->Strings[2]=FileTimeToString(TagList[8+I].ft);
}
if(TreeView1->Selected->Text=="Bool")
{
item->SubItems->Strings[0]=BoolToStr(TagList[16+I].Value.boolVal);
item->SubItems->Strings[1]=IntToStr(TagList[16+I].Quality).c_str();
item->SubItems->Strings[2]=FileTimeToString(TagList[16+I].ft);
}
if(TreeView1->Selected->Text=="Float")
{
item->SubItems->Strings[0]=FloatToStr(TagList[24+I].Value.dblVal);
item->SubItems->Strings[1]=IntToStr(TagList[24+I].Quality).c_str();
item->SubItems->Strings[2]=FileTimeToString(TagList[24+I].ft);
}
}
}
return 0;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
InitOPCDef();
if(ParamCount()>=1)
{
if(CheckParam(ParamStr(1)))
{
Application->Terminate();
}
}
CreateOPCServer();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
FreeOPCDef();
FreeOPCServer();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Click(TObject *Sender)
{
TListItem* item;
int I;
if(TreeView1->Selected==NULL) return;
ListView1->Items->Clear();
if(TreeView1->Selected->Text=="Integer")
{
for(I=0; I<8; I++)
{
item=ListView1->Items->Add();
item->Caption= TagList[I].ID;
item->SubItems->Add(IntToStr(TagList[I].Value.intVal).c_str());
item->SubItems->Add(IntToStr(TagList[I].Quality).c_str());
item->SubItems->Add(FileTimeToString(TagList[I].ft));
}
}
if(TreeView1->Selected->Text=="String")
{
for(I=8; I<16; I++)
{
item=ListView1->Items->Add();
item->Caption= TagList[I].ID;
item->SubItems->Add(TagList[I].Value.bstrVal);
item->SubItems->Add(IntToStr(TagList[I].Quality).c_str());
item->SubItems->Add(FileTimeToString(TagList[I].ft));
}
}
if(TreeView1->Selected->Text=="Bool")
{
for(I=16; I<24; I++)
{
item=ListView1->Items->Add();
item->Caption= TagList[I].ID;
item->SubItems->Add(BoolToStr(TagList[I].Value.boolVal));
item->SubItems->Add(IntToStr(TagList[I].Quality).c_str());
item->SubItems->Add(FileTimeToString(TagList[I].ft));
}
}
if(TreeView1->Selected->Text=="Float")
{
for(I=24; I<32; I++)
{
item=ListView1->Items->Add();
item->Caption= TagList[I].ID;
item->SubItems->Add(FloatToStr(TagList[I].Value.dblVal));
item->SubItems->Add(IntToStr(TagList[I].Quality).c_str());
item->SubItems->Add(FileTimeToString(TagList[I].ft));
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Simulate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::mnExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::mnRegisterClick(TObject *Sender)
{
if(RegServer(OPCClsID,OPCProgID,OPCDescr,Application->ExeName.c_str()))
ShowMessage("注册成功");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::mnUnregisterClick(TObject *Sender)
{
if(UnregServer(OPCClsID,OPCProgID))
ShowMessage("注销成功");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::A1Click(TObject *Sender)
{
About->ShowModal();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -