⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umain.cpp

📁 OPC 开发工具包2.0 OPC工具包是用来简化OPC规范服务器开发的工具包
💻 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 + -