亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uopcasyncio2.pas

?? delphi 開發(fā)OPc工業(yè)通訊 delphi 開發(fā)OPc工業(yè)通訊
?? PAS
字號:
//******************************************************************************
// sOPC created by ACHAT SOLUTIONS GmbH, http://www.achat-solutions.de/
//******************************************************************************
unit uOPCAsyncIO2;

{$IFDEF VER150}
{$WARN UNSAFE_CAST OFF}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_TYPE OFF}
{$ENDIF}

interface

uses
  Windows, ActiveX, ComObj, Axctrls, SysUtils, Dialogs, Classes,
  OPCtypes, OPCDA, OpcError, uGlobals, uOPCGroup, uOPCItem;

type
  sOPCMode = (omRead, omWrite, omRefresh, omTimerRefresh);

  TFileTimeArray = array[0 .. 65535] of TFileTime;
  PTFileTimeArray = ^TFileTimeArray;

  sOPCAsyncIO2 = class
  private
    mClientID: PDWORDARRAY;
    mVariant: POleVariantArray;
    mQuality: PWordArray;
    mTime: PTFileTimeARRAY;
    mError: PResultList;

    OPCGroup: sOPCGroup;
    OPCMode: sOPCMode;
    dwTransactionID: DWORD;
    dwCount: DWORD;
    DataSource: integer;

    FCancelFlag: boolean;
    pdwCancelID: DWORD;

    hServer: array of OPCHANDLE;
    ItemValues: array of OleVariant;

    procedure Read(bEnable: boolean); virtual;
    procedure Write(bEnable: boolean); virtual;
    procedure Refresh(bEnable: boolean); virtual;

  public
    constructor Create(
      aOPCGroup: sOPCGroup;
      aOPCMode: sOPCMode;
      adwTransactionID,
      adwCount: DWORD;
      aDataSource: integer);

    function Init: boolean;
    // Result: False -> initialisation error

    procedure Done;

    procedure ProcessRequest(bEnable: boolean); virtual;

    procedure Copy_phServer(aphServer: POPCHANDLEARRAY);
    procedure Copy_pItemValues(apItemValues: POleVariantArray);

    property CancelFlag: boolean write FCancelFlag;
    property CancelID: DWORD read pdwCancelID write pdwCancelID;
  end;

implementation

uses
  uOPCDataAccess;

constructor sOPCAsyncIO2.Create(
  aOPCGroup: sOPCGroup;
  aOPCMode: sOPCMode;
  adwTransactionID,
  adwCount: DWORD;
  aDataSource: integer);
begin
  OPCGroup := aOPCGroup;
  OPCMode := aOPCMode;
  dwTransactionID := adwTransactionID;
  dwCount := adwCount;
  DataSource := aDataSource;
  pdwCancelID := CreateHandles.CancelID;
  FCancelFlag := False;
end;

function sOPCAsyncIO2.Init: boolean;
var
  Dummy: HResult;
begin
  Result := False;

  mClientID := nil;
  mVariant := nil;
  mError := nil;
  mQuality := nil;
  mTime := nil;

  try
    mClientID := TaskMemAlloc(dwCount, mkDWORD, Dummy);
    mError    := TaskMemAlloc(dwCount, mkHResult, Dummy);
    if OPCMode <> omWrite then begin
      mVariant := TaskMemAlloc(dwCount, mkOleVariant, Dummy);
      mQuality := TaskMemAlloc(dwCount, mkWord, Dummy);
      mTime    := TaskMemAlloc(dwCount, mkFileTime, Dummy);
    end;
  except
    on E: Exception do begin
      OPCLogException('sOPCAsyncIO2.Init', E);
      Done;
      exit;
    end;
  end;

  if OPCMode = omWrite then begin
    if (mClientID = nil) or (mError = nil) then begin
      Done;
      exit;
    end;
  end else begin
    if (mQuality = nil)  or
       (mTime = nil)     or
       (mClientID = nil) or
       (mVariant = nil)  or
       (mError = nil)
    then begin
      Done;
      exit;
    end;
  end;

  Result := True;
end;

procedure sOPCAsyncIO2.Done;
var
  i: integer;
begin
  if mClientID <> nil then CoTaskMemFree(mClientID);
  if mVariant  <> nil then begin
    for i := 0 to dwCount - 1 do VarClear(mVariant[i]);
    CoTaskMemFree(mVariant);
  end;
  if mError    <> nil then CoTaskMemFree(mError);
  if mQuality  <> nil then CoTaskMemFree(mQuality);
  if mTime     <> nil then CoTaskMemFree(mTime);
end;

procedure sOPCAsyncIO2.Read(bEnable: boolean);
var
  i, ix, c: integer;
  ReadResult: HResult;
  OPCItem: sOPCItem;
begin
  if not Init then exit;
  ReadResult := S_OK;
  try
    c := 0;
    for i := 0 to dwCount - 1 do begin
      OPCItem := OPCGroup.GetOPCItem(hServer[i], ix);
      if (OPCItem = nil) then begin
        mQuality[i] := OPC_QUALITY_BAD;
        mError[i] := OPC_E_INVALIDHANDLE;
        ReadResult := S_FALSE;
      end else if not OPCItem.Active then begin
        mQuality[i] := OPC_QUALITY_OUT_OF_SERVICE;
        mError[i] := E_FAIL;
        ReadResult := S_FALSE;
      end else if not OPCItem.ReadAble then begin
        mQuality[i] := OPC_QUALITY_BAD;
        mError[i] := OPC_E_BADRIGHTS;
        ReadResult := S_FALSE;
      end else begin
        inc(c);
        mTime[i] := ConvertToFileTime(OPCItem.OPCNode.LastUpdate);
        mClientID[i] := OPCItem.ClientHandle;
        mVariant[i] := OPCItem.Read(DataSource);
        mQuality[i] := OPCItem.Quality;
        mError[i] := S_OK;
      end;
    end;
    if bEnable and (OPCGroup.DataCallback <> nil) then begin
      sOPCDataAccess(OPCGroup.DataAccess).LastDataUpdateToClient := Now;
      if c > 0 then IOPCDataCallback(OPCGroup.DataCallback).OnReadComplete(
        dwTransactionID,
        OPCGroup.ClientGroup,
        OPC_QUALITY_GOOD,
        ReadResult,
        dwCount,
        @mClientID^,
        @mVariant^,
        @mQuality^,
        @mTime^,
        @mError^);
    end;
  except
    on E: Exception do OPCLogException('sOPCAsyncIO2.Read', E);
  end;
  Done;
end;

procedure sOPCAsyncIO2.Write(bEnable: boolean);
var
  i, ix, c: integer;
  WriteResult: HResult;
  OPCItem: sOPCItem;
begin
  if not Init then exit;
  WriteResult := S_OK;
  try
    c := 0;
    for i := 0 to dwCount - 1 do begin
      OPCItem := OPCGroup.GetOPCItem(hServer[i], ix);
      if (OPCItem = nil) then begin
        mError[i] := OPC_E_INVALIDHANDLE;
        WriteResult := S_FALSE;
      end else if not OPCItem.Active then begin
        mError[i] := E_FAIL;
        WriteResult := S_FALSE;
      end else if not OPCItem.WriteAble then begin
        mError[i] := OPC_E_BADRIGHTS;
        WriteResult := S_FALSE;
      end else begin
        inc(c);
        mClientID[i] := OPCItem.ClientHandle;
        OPCItem.Write(ItemValues[i]);
        mError[i] := S_OK;
      end;
    end;
    if bEnable and (OPCGroup.DataCallback <> nil) then begin
      sOPCDataAccess(OPCGroup.DataAccess).LastDataUpdateToClient := Now;
      if c > 0 then IOPCDataCallback(OPCGroup.DataCallback).OnWriteComplete(dwTransactionID,
        OPCGroup.ClientGroup,
        WriteResult,
        dwCount,
        @mClientID^,
        @mError^);
    end;
  except
    on E: Exception do OPCLogException('sOPCAsyncIO2.Write', E);
  end;
  Done;
end;

procedure sOPCAsyncIO2.Refresh(bEnable: boolean);
var
  i, x: integer;
  RefreshResult: HResult;
  OPCItem: sOPCItem;
begin
  // set Active and ReadAble OPCItems to 1
  for i := 0 to OPCGroup.OPCItemList.Count - 1 do begin
    OPCItem := sOPCItem(OPCGroup.OPCItemList[i]);
    if OPCItem.Active and OPCItem.ReadAble
      then OPCItem.Tag := 1
      else OPCItem.Tag := 0;
  end;

  // update active OPCItem's on Timer or on Refresh Device
  if (OPCMode = omTimerRefresh) or (DataSource = OPC_DS_DEVICE) then begin
    for i := 0 to OPCGroup.OPCItemList.Count - 1 do begin
      OPCItem := sOPCItem(OPCGroup.OPCItemList[i]);
      if OPCItem.Tag = 1 then OPCItem.Read(OPC_DS_DEVICE);
    end;
  end;

  try
    OPCGroup.OPCLock := True;
    dwCount := 0;
    if (OPCMode = omTimerRefresh) then begin
      // count Items where the value has changed
      for i := 0 to OPCGroup.OPCItemList.Count - 1 do begin
        OPCItem := sOPCItem(OPCGroup.OPCItemList[i]);
        if OPCItem.Tag = 1 then begin
          if (OPCItem.CallBackTime <> OPCItem.OPCNode.LastUpdate) then begin
            OPCItem.Tag := 2;
            inc(dwCount);
          end;
        end;
      end;
    end else begin
      // count active Items
      for i := 0 to OPCGroup.OPCItemList.Count - 1 do begin
        OPCItem := sOPCItem(OPCGroup.OPCItemList[i]);
        if OPCItem.Tag = 1 then begin
          OPCItem.Tag := 2;
          inc(dwCount);
        end;
      end;
    end;

    if dwCount = 0 then exit;
    if not Init then exit;
    RefreshResult := S_OK;

    x := 0;
    for i := 0 to OPCGroup.OPCItemList.Count - 1 do begin
      OPCItem := sOPCItem(OPCGroup.OPCItemList[i]);
      if OPCItem.Tag = 2 then begin
        if (OPCMode = omTimerRefresh)
          then OPCItem.CallBackTime := OPCItem.OPCNode.LastUpdate;
        mVariant[x] := OPCItem.Read(OPC_DS_CACHE);
        mQuality[x] := OPCItem.Quality;
        mTime[x] := ConvertToFileTime(OPCItem.OPCNode.LastUpdate);
        mClientID[x] := OPCItem.ClientHandle;
        mError[x] := S_OK;
        inc(x);
      end;
    end;
  finally
    OPCGroup.OPCLock := False;
  end;

  if bEnable and (OPCGroup.DataCallback <> nil) then begin
    sOPCDataAccess(OPCGroup.DataAccess).LastDataUpdateToClient := Now;
    try
      IOPCDataCallback(OPCGroup.DataCallback).OnDataChange(dwTransactionID,
        OPCGroup.ClientGroup,
        OPC_QUALITY_GOOD,
        RefreshResult,
        dwCount,
        @mClientID^,
        @mVariant^,
        @mQuality^,
        @mTime^,
        @mError^);
    except
      on E: Exception do OPCLogException('sOPCAsyncIO2.Refresh', E);
    end;
  end;
  Done;
end;

procedure sOPCAsyncIO2.ProcessRequest(bEnable: boolean);
begin
  if FCancelFlag then exit;
  case OPCMode of
    omRead:         Read(bEnable);
    omWrite:        Write(bEnable);
    omRefresh,
    omTimerRefresh: Refresh(bEnable);
  end;
end;

procedure sOPCAsyncIO2.Copy_phServer(aphServer: POPCHANDLEARRAY);
var
  i: integer;
begin
  SetLength(hServer, dwCount);
  for i := 0 to dwCount - 1 do hServer[i] := aphServer[i];
end;

procedure sOPCAsyncIO2.Copy_pItemValues(apItemValues: POleVariantArray);
var
  i: integer;
begin
  SetLength(ItemValues, dwCount);
  for i := 0 to dwCount - 1 do ItemValues[i] := apItemValues[i];
  // +++ pr黤en
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品婷婷国产综合久久竹菊| 国产精品久久久久影院色老大| 精品理论电影在线| 国产蜜臀97一区二区三区 | 美女网站一区二区| 国产一区二区看久久| av色综合久久天堂av综合| 欧美日韩一本到| 精品久久久久久久人人人人传媒| 国产精品久久久久久一区二区三区| 一级中文字幕一区二区| 国产一区在线精品| 在线观看不卡一区| 久久伊99综合婷婷久久伊| 亚洲欧美另类在线| 国精产品一区一区三区mba视频| 91美女蜜桃在线| 精品国产乱码久久久久久1区2区 | 成人性生交大片免费看视频在线| 色拍拍在线精品视频8848| 日韩美女视频一区二区在线观看| 国产精品免费丝袜| 久久国产免费看| 欧美影视一区二区三区| 久久久综合九色合综国产精品| 一区二区在线电影| 国产精品影视在线| 欧美理论片在线| 亚洲日本在线看| 奇米影视在线99精品| 91视频在线观看免费| 日韩精品中文字幕一区| 一区二区三区精密机械公司| 国产一区二区三区黄视频| 欧洲日韩一区二区三区| 国产精品理伦片| 久久99国产精品尤物| 欧美日韩国产首页在线观看| 国产精品理伦片| 久久9热精品视频| 亚洲天堂av老司机| 欧美日韩精品一区二区在线播放| 国产乱人伦精品一区二区在线观看| 色94色欧美sute亚洲线路二| 久久久综合精品| 另类专区欧美蜜桃臀第一页| 在线观看日韩国产| 中文字幕第一区二区| 麻豆成人91精品二区三区| 欧美视频在线播放| 亚洲欧美日韩久久| 成人午夜视频福利| 久久久精品国产99久久精品芒果 | 51精品秘密在线观看| 亚洲三级电影网站| www.成人在线| 国产欧美日韩亚州综合| 国内精品久久久久影院色| 欧美一区二区三区播放老司机| 亚洲国产中文字幕| 在线观看视频一区二区欧美日韩| 亚洲色图20p| 99久久精品情趣| 国产精品二三区| 成人精品国产一区二区4080| 久久久精品影视| 国产成人av电影在线播放| 久久精品一区二区三区不卡 | 久久久久国产成人精品亚洲午夜| 精品一区二区免费| 欧美精品一区二区三区四区| 麻豆精品在线观看| 精品国产乱码久久久久久浪潮| 九九视频精品免费| 久久久天堂av| 成人自拍视频在线| 国产精品成人在线观看| bt欧美亚洲午夜电影天堂| 日韩毛片高清在线播放| 91极品美女在线| 亚洲国产成人av| 欧美一三区三区四区免费在线看| 日韩不卡免费视频| 精品免费日韩av| 成人综合激情网| 亚洲色图视频免费播放| 欧美色区777第一页| 爽好久久久欧美精品| 日韩免费性生活视频播放| 国产乱色国产精品免费视频| 国产精品久线在线观看| 欧美在线一区二区三区| 午夜a成v人精品| 精品捆绑美女sm三区| 成人一道本在线| 亚洲精品国产品国语在线app| 在线国产电影不卡| 免费三级欧美电影| 国产欧美一区二区精品婷婷 | 亚洲成精国产精品女| 日韩欧美亚洲国产精品字幕久久久| 紧缚奴在线一区二区三区| 国产人妖乱国产精品人妖| 一本一道久久a久久精品综合蜜臀| 亚洲综合在线五月| 91精品国产91久久综合桃花 | 中文字幕电影一区| 欧美性做爰猛烈叫床潮| 美女在线观看视频一区二区| 久久精品无码一区二区三区| av网站一区二区三区| 日韩不卡手机在线v区| 日本成人在线电影网| 精品久久久影院| 色综合久久综合网欧美综合网| 天堂久久久久va久久久久| 久久蜜桃av一区精品变态类天堂 | 亚洲美女免费视频| 91精品久久久久久蜜臀| 国产酒店精品激情| 亚洲一区二区在线播放相泽| 精品久久久久久最新网址| 色综合天天在线| 卡一卡二国产精品| 亚洲日本青草视频在线怡红院| 欧美一区二区三区公司| 99国产精品久| 久久精品国产亚洲一区二区三区| 18成人在线观看| 精品国产伦一区二区三区观看方式 | 欧洲在线/亚洲| 国产精品亚洲视频| 日韩国产精品久久久久久亚洲| 国产精品久久久久永久免费观看| 91精品国产高清一区二区三区| 99久久久久免费精品国产| 久久国产尿小便嘘嘘尿| 亚洲一区在线看| 欧美激情一区二区三区| 日韩精品一区二区三区四区| 日本乱人伦一区| 高清av一区二区| 蜜桃av噜噜一区| 午夜精品久久久久影视| 国产精品久久久久久久久图文区 | 国产精品中文字幕一区二区三区| 亚洲图片自拍偷拍| 亚洲特黄一级片| 日本一二三不卡| 精品美女被调教视频大全网站| 欧美日韩一区二区在线观看视频| 成人白浆超碰人人人人| 国内精品嫩模私拍在线| 日韩精品一二三四| 亚洲成国产人片在线观看| 亚洲视频在线一区| 国产亚洲欧美一区在线观看| 9191成人精品久久| 欧美日韩高清影院| 91久久精品一区二区二区| 成人免费视频免费观看| 国产精品影视天天线| 美女视频黄a大片欧美| 偷拍一区二区三区四区| 亚洲一区国产视频| 亚洲综合在线观看视频| 亚洲精品视频一区| 亚洲欧洲精品成人久久奇米网| 国产欧美日韩精品一区| 国产午夜一区二区三区| 久久久国产综合精品女国产盗摄| 日韩欧美成人一区二区| 日韩欧美一区二区不卡| 日韩欧美中文字幕公布| 日韩欧美一级精品久久| 日韩欧美一二三四区| 日韩久久一区二区| 精品国偷自产国产一区| 九九久久精品视频| 在线成人av影院| 免费成人美女在线观看| 精品国精品自拍自在线| 国产在线看一区| 国产亚洲一区二区三区四区 | 美女高潮久久久| 欧美一二三在线| 久久99久久99| 国产亚洲视频系列| 99视频超级精品| 青青草国产精品亚洲专区无| 91精品在线免费| 国产精品一二一区| 国产精品国产自产拍高清av王其 | 制服丝袜亚洲精品中文字幕| 日韩中文字幕亚洲一区二区va在线 | 午夜精品一区二区三区电影天堂| 日本一区二区成人| 中文字幕av资源一区| 中文字幕欧美日韩一区| 国产欧美一区二区精品性色|