📄 p_main.~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 + -