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

📄 p_main.~pas

📁 OPC Client本软件是一个利用OPC协议通讯的实例。其中用到的驱动是非注册版
💻 ~PAS
字号:
unit P_Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, Grids, ExtCtrls;

type
  TOPC_Client = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    OPC1: TMenuItem;
    Memo1: TMemo;
    OPC2: TMenuItem;
    N2: TMenuItem;
    OPC3: TMenuItem;
    Splitter1: TSplitter;
    StringGrid1: TStringGrid;
    N3: TMenuItem;
    Timer1: TTimer;
    N4: TMenuItem;
    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure OPC1Click(Sender: TObject);
    procedure OPC3Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    Function FuncName(Row:Integer;aParam:Variant): Integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  OPC_Client: TOPC_Client;

implementation
uses
  U_Public, T_CloseRegistForm;
{$R *.dfm}

procedure TOPC_Client.FormShow(Sender: TObject);
begin
  LoadFunction;
  if My_KOC_Init then
     ShowMessage('OPC库初始化成功')
  else
     ShowMessage('OPC库初始化不成功');
end;

procedure TOPC_Client.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
var
  i:Integer;
begin
  CanClose:=False;
  ////////////关闭前所需准备/////////////////
  for i:=1 to ItemCount do
  begin
    My_KOC_RemoveItem(OPCServerHandle,OPCGroupName,My_ItemInfo[i-1].Handle);
  end;
  My_KOC_RemoveGroup(OPCServerHandle,OPCGroupName);
  My_KOC_Disconnect(OPCServerHandle);
  My_KOC_Uninit;
  ///////////////////////////////////////////
  CanClose:=True;
end;

procedure TOPC_Client.OPC1Click(Sender: TObject);
var
  StrName:String;
  BActive:PBoolean;
  Rate,TimeBias,wLCID:PInteger;
  DeadBand :PSingle;
begin
  My_CloaeThread:=CloseRegistForm.Create(False);
  OPCServerHandle:=My_KOC_Connect('PANFEN','PCOS.OPC.20',True);
  strName:='Group1';
  GetMem(BActive,SizeOf(Boolean));
  BActive^:=True;
  GetMem(Rate,SizeOf(Integer));
  Rate^:=100;
  GetMem(TimeBias,SizeOf(Integer));
  TimeBias^:=0;
  GetMem(wLCID,SizeOf(Integer));
  wLCID^:=0;
  GetMem(DeadBand,SizeOf(Single));
  DeadBand^:=0;
  OPCGroupName:=My_KOC_AddGroup(OPCServerHandle,StrName,bActive,
                                Rate,TimeBias,DeadBand,wLCID);
  FreeMem(BActive);
  FreeMem(Rate);
  FreeMem(TimeBias);
  FreeMem(wLCID);
  FreeMem(DeadBand);
end;

procedure TOPC_Client.OPC3Click(Sender: TObject);
var
  i:Integer;
  j:Integer;
  Buffer:PChar;
  ItemName:String;
begin

  GetMem(Buffer,SizeOf(Char)*100);
  ItemCount:=My_KOC_GetItemCount(OPCServerHandle);
  StringGrid1.RowCount:=ItemCount;
  SetLength(My_ItemInfo,ItemCount);
  Memo1.Clear;
  for i:=0 to ItemCount-1 do
  begin
    if My_KOC_GetItemName(OPCServerHandle,i,Buffer,100) then
    begin
      ItemName:='';
      for j:=0 to 99 do
          ItemName:=ItemName+Buffer[j];
      My_ItemInfo[i].Handle:=My_KOC_AddItem(OPCServerHandle,OPCGroupName,ItemName);
      Memo1.Lines.Add(ItemName);
      Application.ProcessMessages;
    end;
  end;
  FreeMem(Buffer);
end;

procedure TOPC_Client.N3Click(Sender: TObject);
begin
  Timer1.Enabled:=True;
end;

procedure TOPC_Client.N4Click(Sender: TObject);
begin
  Timer1.Enabled:=False;
end;

procedure TOPC_Client.Timer1Timer(Sender: TObject);
var
  i,j:Integer;
  FT:PFILETIME;
  Quality:PLongWord;
  Value:String;
begin
  Timer1.Enabled:=False;
  GetMem(FT,SizeOf(FileTime));
  GetMem(Quality,SizeOf(Integer));
  for i:=0 to ItemCount-1 do
  begin
    try
    GetMem(My_ItemInfo[i].Value,SizeOf(Variant));
    if My_KOC_ReadItem(OPCServerHandle,OPCGroupName,My_ItemInfo[i].Handle,My_ItemInfo[i].Value,FT,Quality) then
    begin
      Value:='';
      for j:=1 to FuncName(i,My_ItemInfo[i].Value^) do
      begin
        Value:=Value+String(My_ItemInfo[i].Value^[j])+',';
        OPC_Client.StringGrid1.Cells[0,i]:=Value;
      end;
    end;
    Except
      Continue;
    end;
  end;
  Timer1.Enabled:=True;
end;

Function TOPC_Client.FuncName(Row:Integer;aParam:Variant):Integer;
var
  Num:Integer;
  TypeStr: String;
begin
  if VarIsArray(aParam) = False then
  begin
    case varType(aParam) of
      varEmpty: 
        TypeStr:='Empty';
      varNull:
        TypeStr:='Null';
      varSmallint:
        TypeStr:='SmallInt';
      varInteger:
        TypeStr:='Integer';
      varSingle:
        TypeStr:='Single';
      varDouble:
        TypeStr:='Double';
      varCurrency:
        TypeStr:='Currency';
      varDate:
        TypeStr:='Date';
      varOleStr:
        TypeStr:='OleStr';
      varDispatch:
        TypeStr:='DisPatch';
      varError:
        TypeStr:='Error';
      varBoolean:
        TypeStr:='Boolean';
      varVariant:
        TypeStr:='Variant';
      varUnknown:
        TypeStr:='UnKnow';
      varShortInt:
        TypeStr:='ShortInt';
      varByte:
        TypeStr:='Byte';
      varWord:
        TypeStr:='Word';
      varLongWord:
        TypeStr:='LongWord';
      varInt64:
        TypeStr:='Int64';
      varStrArg:
        TypeStr:='StrArg';
      varString:
        TypeStr:='String';
      varAny:
        TypeStr:='Any';
      varTypeMask:
        TypeStr:='TypeMask';
      varArray:
        TypeStr:='Array';
      varByRef:
        TypeStr:='ByRef';
    end;
    OPC_Client.StringGrid1.Cells[0,Row]:=My_ItemInfo[Row].Value^;
    OPC_Client.StringGrid1.Cells[1,Row]:=(Format('%s', [TypeStr]));
    Result:=0;
  end
  else
  begin
    Num:=VarArrayDimCount(aParam);
    case VarType(aParam[1]) of
      varEmpty:
        TypeStr:='Empty';
      varNull:
        TypeStr:='Null';
      varSmallint:
        TypeStr:='SmallInt';
      varInteger:
        TypeStr:='Integer';
      varSingle:
        TypeStr:='Single';
      varDouble:
        TypeStr:='Double';
      varCurrency:
        TypeStr:='Currency';
      varDate:
        TypeStr:='Date';
      varOleStr:
        TypeStr:='OleStr';
      varDispatch:
        TypeStr:='DisPatch';
      varError:
        TypeStr:='Error';
      varBoolean:
        TypeStr:='Boolean';
      varVariant:
        TypeStr:='Variant';
      varUnknown:
        TypeStr:='UnKnow';

      varShortInt:
        TypeStr:='ShortInt';
      varByte:
        TypeStr:='Byte';
      varWord:
        TypeStr:='Word';
      varLongWord:
        TypeStr:='LongWord';
      varInt64:
        TypeStr:='Int64';

      varStrArg:
        TypeStr:='StrArg';
      varString:
        TypeStr:='String';
      varAny:
        TypeStr:='Any';
      varTypeMask:
        TypeStr:='TypeMask';
      varArray:
        TypeStr:='Array';
      varByRef:
        TypeStr:='ByRef';
    end;
    OPC_Client.StringGrid1.Cells[1,Row]:=(Format('Array %d is a %s', [Num+1, TypeStr]));
    Result:=Num+1;
 end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -