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

📄 iopcitem.pas

📁 iocopm3.04源码,一套很好的工控开发工具
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{*******************************************************}
{                                                       }
{       TiOPCItem Component                             }
{                                                       }
{       Copyright (c) 1997,2003 Iocomp Software         }
{                                                       }
{*******************************************************}
{$I iInclude.inc}

{$ifdef iVCL}unit  iOPCItem;{$endif}
{$ifdef iCLX}unit QiOPCItem;{$endif}

interface

uses
  {$I iIncludeUses.inc}

  {$IFDEF iVCL}  iTypes,  iGPFunctions,  iOPCDLLLoader;{$ENDIF}
  {$IFDEF iCLX} QiTypes, QiGPFunctions, QiOPCDLLLoader;{$ENDIF}

type

  TiOPCItem        = class;
  TiOPCItemManager = class;

  TOPCItemGetDataTypeEvent = procedure(PropertyName: String; var AVarType: TiTypeKind) of object;

  TiOPCItem = class(TPersistent)
  private
    FPropertyName : String;
    FPropertyType : TiTypeKind;
    FGroupName    : String;
    FServerName   : String;
    FComputerName : String;
    FItemName     : String;
    FAutoConnect  : Boolean;
    FUpdateRate   : Integer;

    FSignalHandle : Integer;

    FData         : OleVariant;
    FTimeStamp    : TDateTime;
    FQuality      : Word;

    FOwner        : TiOPCItemManager;
    FAutoError    : Boolean;
  protected
    procedure SetPropertyName(const Value: String);
    procedure SetGroupName   (const Value: String);
    procedure SetServerName  (const Value: String);
    procedure SetComputerName(const Value: String);
    procedure SetItemName    (const Value: String);
    procedure SetAutoConnect (const Value: Boolean);
    procedure SetUpdateRate  (const Value: Integer);
    procedure SetAutoError   (const Value: Boolean);

    function GetActive: Boolean;

    procedure ReceiveData(Data: OLEVariant; TimeStamp: Double; Quality: Word);

    function GetQualityGood: Boolean;

    procedure SetData(const Value: OleVariant);

    procedure UpdateError;
  public
    constructor Create;
    destructor  Destroy; override;

    procedure Activate;
    procedure ActivateSuspend;
    procedure Deactivate;

    procedure UpdateResume;
    procedure UpdateSuspend;

    procedure Loaded;

    property Data         : OleVariant       read FData           write SetData;
    property TimeStamp    : TDateTime        read FTimeStamp;
    property Quality      : Word             read FQuality;
    property Active       : Boolean          read GetActive;

    property QualityGood  : Boolean          read GetQualityGood;

    property Owner        : TiOPCItemManager read FOwner          write FOwner;
  published
    property PropertyName : String           read FPropertyName   write SetPropertyName;
    property GroupName    : String           read FGroupName      write SetGroupName;
    property ComputerName : String           read FComputerName   write SetComputerName;
    property ServerName   : String           read FServerName     write SetServerName;
    property ItemName     : String           read FItemName       write SetItemName;
    property UpdateRate   : Integer          read FUpdateRate     write SetUpdateRate;

    property AutoConnect  : Boolean          read FAutoConnect    write SetAutoConnect;
    property AutoError    : Boolean          read FAutoError      write SetAutoError;
  end;

  TiOPCItemManager = class(TObject)
  private
    FList           : TStringList;
    FOnGetDesigning : TGetDesigningEvent;
    FOnNewData      : TNotifyEvent;
    FOnGetType      : TOPCItemGetDataTypeEvent;
    FOwner          : TComponent;
  protected
    function  GetCount: Integer;
    function  GetItem  (Index: Integer): TiOpcItem;
    function  GetDesigning: Boolean;
  public
    constructor Create;
    destructor  Destroy; override;

    function  DoWriteToStream : Boolean;
    procedure WriteToStream (Writer: TWriter);
    procedure ReadFromStream(Reader: TReader);

    function FindIndex(OPCItem: TiOPCItem): Integer;

    procedure Clear;
    procedure Delete(Index: Integer);
    function  Add: Integer;

    property  Items[Index: Integer]: TiOpcItem                read GetItem;
    property  Count                : Integer                  read GetCount;

    property IsDesigning           : Boolean                  read GetDesigning;

    property Owner                 : TComponent               read FOwner          write FOwner;

    property OnGetDesigning        : TGetDesigningEvent       read FOnGetDesigning write FOnGetDesigning;
    property OnNewData             : TNotifyEvent             read FOnNewData      write FOnNewData;
    property OnGetType             : TOPCItemGetDataTypeEvent read FOnGetType      write FOnGetType;
  end;

implementation

uses
{$IFDEF iVCL}  iComponent;{$ENDIF}
{$IFDEF iCLX} QiComponent;{$ENDIF}

type
  TWriterAccess        = class(TWriter)    end;
  TReaderAccess        = class(TReader)    end;
  TiComponentAccess    = class(TiComponent)end;
//***********************************************************************************************************************************
constructor TiOPCItem.Create;
begin
  FUpdateRate   := 500;
  FAutoConnect  := True;
  FComputerName := 'Local';
end;
//***********************************************************************************************************************************
destructor TiOPCItem.Destroy;
begin
  try
    Deactivate;
  except
  end;
  inherited;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.Loaded;
begin
  try
    if FAutoError then UpdateError;

    if FAutoConnect then
      begin
        try
          if not FOwner.IsDesigning then Activate;
        except
          on exception do;
        end;
      end;
  except
  end;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetServerName(const Value: String);
begin
  FServerName := Value;
  if OPCDLLNotLoaded then Exit;
  if Active then Activate;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetComputerName(const Value: String);
begin
  FComputerName := Value;
  if OPCDLLNotLoaded then Exit;
  if Active then Activate;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetItemName(const Value: String);
begin
  FItemName := Value;
  if OPCDLLNotLoaded then Exit;
  if Active then Activate;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetUpdateRate(const Value: Integer);
begin
  FUpdateRate := Value;
  if OPCDLLNotLoaded then Exit;
  if Active then Activate;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetAutoConnect(const Value: Boolean);
var
  IsLoading : Boolean;
begin
  FAutoConnect := Value;

  if OPCDLLNotLoaded then Exit;

  if not Assigned(Owner)       then Exit;
  if not Assigned(Owner.Owner) then Exit;

  IsLoading := True;

  if Owner.Owner is TiComponent then IsLoading := TiComponentAccess(Owner.Owner as TiComponent).Loading;
  if IsLoading                  then Exit;
  if FAutoConnect               then Activate;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetPropertyName(const Value: String);
begin
  FPropertyName := Value;

⌨️ 快捷键说明

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