+ -
当前位置:首页 → 问答吧 → OPC数据读取内存溢出

OPC数据读取内存溢出

时间:2011-08-19

来源:互联网

最近了一个OPC客户端程序(用的是自动化接口【OPCDAAuto.dll】),写了如下的OPC Item数据读取函数,在线程里调用,程序运行过程中,内存不断增加。


函数内容:

function TOPCMan.getOPCItemData(itemname: OleVariant): String;
var
  NumItems: Integer;
  OVItemID: OleVariant;
  OVClientHandles: OleVariant;
  OVServerHandles: OleVariant;
  Value, Quality, TimeStamp: OleVariant;
  OVErrors: OleVariant;
  FOPCItems: OPCItems;
  FOPCItem: OPCItem;
begin
  Value := '0.00';

  FOPCItems := dm.OPCGroup.OPCItems;
  if(not assigned(FOPCItems))then Exit;
  NumItems := 1;
  OVItemID := VarArrayCreate([1, 1], varOleStr);
  OVItemID[1] := itemname;

  OVClientHandles := VarArrayCreate([1, 1], varInteger);
  OVClientHandles[1] := 1;

  OVServerHandles := VarArrayCreate([1, 1], varInteger);
  OVServerHandles[1] := 0;

  OVErrors := VarArrayCreate([1, 1], varOleStr);
  OVErrors := EmptyParam;
  
  FOPCItems.AddItems(
  NumItems,
  PSafeArray(TVarData(OVItemID).VOleStr),
  PSafeArray(TVarData(OVClientHandles).VInteger),
  PSafeArray(TVarData(OVServerHandles).VInteger),
  PSafeArray(TVarData(OVErrors).VInteger),
  EmptyParam,
  EmptyParam
  );

  if(OVServerHandles[1] > 0)then
  begin
  FOPCItem := FOPCItems.GetOPCItem(OVServerHandles[1]);
  if(not Assigned(FOPCItem))then Exit;
  FOPCItem.Read(OPCDevice, Value, Quality, TimeStamp);
  end;

  OVClientHandles := unassigned;
  OVServerHandles := unassigned;
  OVErrors := unassigned;

  FOPCItems := nil;
  FOPCItem := nil;
  result := FormatFloat('0.00', Value);
end;

跪求高手指点

作者: xiaoping1984   发布时间: 2011-08-19

表示关注!!

作者: lixiaolongmylove   发布时间: 2011-08-19

热门下载

更多