📄 iopcitem.pas
字号:
if not Assigned(Owner) then Exit;
if Assigned(Owner.OnGetType) then Owner.OnGetType(PropertyName, FPropertyType);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetGroupName(const Value: String);
begin
FGroupName := Value;
if Active then Activate;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.Activate;
begin
if OPCDLLNotLoaded then Exit;
if not Assigned(Owner) then Exit;
if Owner.IsDesigning then Exit;
if FAutoError then UpdateError;
if FSignalHandle <> 0 then Deactivate;
if Trim(FPropertyName) = '' then Exit;
if (Trim(FGroupName) = '') and (Trim(FServerName) = '') then Exit;
if Trim(FItemName) = '' then Exit;
if Active then Deactivate;
if OPCDLLNotLoaded then Exit;
FSignalHandle := OPCDLLSignalAdd(PChar(FComputerName), PChar(FServerName), PChar(FItemName), PChar(FGroupName), FUpdateRate, False, FPropertyType, ReceiveData);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.ActivateSuspend;
begin
if OPCDLLNotLoaded then Exit;
if not Assigned(Owner) then Exit;
if Owner.IsDesigning then Exit;
if FAutoError then UpdateError;
if FSignalHandle <> 0 then Deactivate;
if Trim(FPropertyName) = '' then Exit;
if (Trim(FGroupName) = '') and (Trim(FServerName) = '') then Exit;
if Trim(FItemName) = '' then Exit;
if Active then Deactivate;
if OPCDLLNotLoaded then Exit;
FSignalHandle := OPCDLLSignalAdd(PChar(FComputerName), PChar(FServerName), PChar(FItemName), PChar(FGroupName), FUpdateRate, True, FPropertyType, ReceiveData);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.Deactivate;
begin
if OPCDLLNotLoaded then Exit;
if not Assigned(Owner) then Exit;
if Owner.IsDesigning then Exit;
if OPCDLLNotLoaded then Exit;
OPCDLLSignalRemove(FSignalHandle);
FSignalHandle := 0;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.ReceiveData(Data: OLEVariant; TimeStamp: Double; Quality: Word);
begin
FData := Data;
FTimeStamp := TimeStamp;
FQuality := Quality;
if FAutoError then UpdateError;
if Assigned(FOwner.OnNewData) then FOwner.OnNewData(Self);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetData(const Value: OleVariant);
begin
if OPCDLLNotLoaded then Exit;
OPCDLLSignalSendData(FSignalHandle, Value);
end;
//***********************************************************************************************************************************
{ TiOPCItemManager }
//***********************************************************************************************************************************
constructor TiOPCItemManager.Create;
begin
FList := TStringList.Create;
end;
//***********************************************************************************************************************************
destructor TiOPCItemManager.Destroy;
begin
Clear;
FList.Free;
inherited;
end;
//***********************************************************************************************************************************
function TiOPCItemManager.Add: Integer;
var
iOPCItem : TiOPCItem;
begin
iOPCItem := TiOPCItem.Create;
iOPCItem.Owner := Self;
Result := FList.AddObject('',iOPCItem);
end;
//***********************************************************************************************************************************
procedure TiOPCItemManager.Clear;
begin
while FList.Count > 0 do
begin
FList.Objects[0].Free;
FList.Delete(0);
end;
end;
//***********************************************************************************************************************************
procedure TiOPCItemManager.Delete(Index: Integer);
begin
FList.Objects[Index].Free;
FList.Delete(Index);
end;
//***********************************************************************************************************************************
function TiOPCItemManager.GetCount: Integer;
begin
Result := FList.Count;
end;
//***********************************************************************************************************************************
function TiOPCItemManager.GetItem(Index: Integer): TiOPCItem;
begin
Result := FList.Objects[Index] as TiOPCItem;
end;
//***********************************************************************************************************************************
function TiOPCItemManager.FindIndex(OPCItem: TiOPCItem): Integer;
begin
Result := FList.IndexOfObject(OPCItem);
end;
//***********************************************************************************************************************************
function TiOPCItemManager.DoWriteToStream: Boolean;
begin
Result := Count > 0;
end;
//***********************************************************************************************************************************
procedure TiOPCItemManager.WriteToStream(Writer: TWriter);
var
x : Integer;
begin
TWriterAccess(Writer).WriteValue(vaCollection);
for x := 0 to Count - 1 do
begin
Writer.WriteListBegin;
WriterWriteProperties(Writer, GetItem(x));
Writer.WriteListEnd;
end;
Writer.WriteListEnd;
end;
//***********************************************************************************************************************************
procedure TiOPCItemManager.ReadFromStream(Reader: TReader);
var
Item : TiOPCItem;
begin
Clear;
if not Reader.EndOfList then Clear;
if TReaderAccess(Reader).ReadValue <> vaCollection then exit;
while not Reader.EndOfList do
begin
Item := TiOPCItem.Create;
Item.Owner := Self;
FList.AddObject('',Item);
Reader.ReadListBegin;
while not Reader.EndOfList do TReaderAccess(Reader).ReadProperty(Item);
Reader.ReadListEnd;
Item.Loaded;
end;
Reader.ReadListEnd;
end;
//***********************************************************************************************************************************
function TiOPCItemManager.GetDesigning: Boolean;
begin
Result := False;
if Assigned(FOnGetDesigning) then FOnGetDesigning(Self, Result);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.UpdateResume;
begin
if OPCDLLNotLoaded then Exit;
OPCDLLSignalResume(FSignalHandle);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.UpdateSuspend;
begin
if OPCDLLNotLoaded then Exit;
OPCDLLSignalSuspend(FSignalHandle);
end;
//***********************************************************************************************************************************
procedure TiOPCItem.SetAutoError(const Value: Boolean);
begin
if FAutoError <> Value then
begin
FAutoError := Value;
if FAutoError then UpdateError;
end;
end;
//***********************************************************************************************************************************
procedure TiOPCItem.UpdateError;
var
iComponent : TiComponent;
begin
if not Active then Exit;
if not Assigned(Owner) then Exit;
if not Assigned(Owner.Owner) then Exit;
if Owner.Owner is TiComponent then iComponent := Owner.Owner as TiComponent else Exit;
if Active then
begin
if QualityGood then TiComponentAccess(iComponent).ErrorActive := False
else TiComponentAccess(iComponent).ErrorActive := True;
end;
end;
//***********************************************************************************************************************************
function TiOPCItem.GetQualityGood: Boolean;
begin
Result := (FQuality and $C0) = $C0;
end;
//***********************************************************************************************************************************
function TiOPCItem.GetActive: Boolean;
begin
Result := False;
if not Assigned(Owner) then Exit;
if Owner.IsDesigning then Exit;
if OPCDLLNotLoaded then Exit;
Result := OPCDLLSignalGetActive(FSignalHandle);
end;
//***********************************************************************************************************************************
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -