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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? driveru.pas

?? omroln OPC 用delphi描述了同OMROLnOPC通訊的過(guò)程
?? PAS
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
 *                函數(shù)功能:根據(jù)設(shè)備變量編號(hào)和索引查找地址信息并生成發(fā)送數(shù)據(jù)
 *                入口參數(shù):1、LocalIndex: Integer。地址索引信息
 *                          2、Value: Variant。發(fā)送數(shù)據(jù)
 *                出口參數(shù):1、Info: TAppDataInfo。應(yīng)用數(shù)據(jù)信息
 *                  返回值:Boolean。執(zhí)行情況
 *}

function TDriver.GeneralWriteData(const LocalIndex: Integer;
  Value: Variant; var Info: TAppDataInfo): Boolean;
var
  DeviceVar: TDeviceVar;
  Data: string;
begin
  Result := False;
  DeviceVar := TDeviceVarList.GetDeviceVarList.GetItem(LocalIndex);
  if not Assigned(DeviceVar) then
  begin
    WriteErrorLog(Format('下發(fā)數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤!地址索引無(wú)效!(%d)', [LocalIndex]));
    Exit;
  end;

  Data := Value;
  Info.dwLocalIndex := LocalIndex;
  Info.rcdAddress := DeviceVar.AddressInfo;
  Info.AppData := Data;
  Info.dtDateTime := Now;
  Result := True;
end;

{*
 *                函數(shù)名稱(chēng):CheckReSendTime
 *                函數(shù)功能:檢查發(fā)送數(shù)據(jù)超時(shí)
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.CheckReSendTime;
var
  I: Integer;
  VarList: TIntegerArray;
  ItemNames: TStringArray;
  DeviceVar: TDeviceVar;
begin
  //超過(guò)一定時(shí)間沒(méi)有讀寫(xiě)操作則嘗試查詢(xún)
  if GetTimeInterval(FRefreshDataPnt) >= Const_TIME_REFRESHDATA then
  begin
    FRefreshDataPnt := GetTickCount;
    FOPCComm.RefershData;
  end;

  //檢查通訊是否中斷, 中斷后則嘗試重新打開(kāi)端口
  if FOPCComm.CommStatus = Const_STATUS_DISCONNECT then
  begin
    ComObj.CoInitializeEx(nil, 0);
    FOPCComm.StopComm;
    FOPCComm.StartComm;
    FOPCComm.RefershData;
  end;

  //超過(guò)規(guī)定的期限則認(rèn)為通訊中斷
  if GetTimeInterval(FCommStateChkPnt) >= Const_TIME_COMMFAILED then
  begin
    FCommStateChkPnt := GetTickCount;
    SetDriveStatus(COMM_STATUS_DISCONNECT);
  end;

  //先獲得發(fā)送數(shù)據(jù)幀列表
  SetLength(VarList, 0);

  //獲得超時(shí)設(shè)備變量索引列表 和 地址列表
  VarList := FWindow.ProcessSendTimeOut(ItemNames);

  //根據(jù)設(shè)備變量索引編號(hào)設(shè)置發(fā)送失敗
  for I := Low(VarList) to High(VarList) do
  begin
    DeviceVar := TDeviceVarList.GetDeviceVarList.GetItem(VarList[I]);
    if Assigned(DeviceVar) then
      DeviceVar.SetState(ITEM_STATUS_SendFailed);
    NotifyToSendPkt;
  end;
end;

{*
 *                函數(shù)名稱(chēng):NotifyToSendPkt
 *                函數(shù)功能:通知調(diào)度對(duì)象發(fā)送數(shù)據(jù)
 *                          1、設(shè)置FSendEvent對(duì)象為有信號(hào)狀態(tài)
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.NotifyToSendPkt;
begin
  SetEvent(FSendEvent);
end;

{*
 *                函數(shù)名稱(chēng):SendNextDataPacket
 *                函數(shù)功能:從發(fā)送隊(duì)列中取出一個(gè)數(shù)據(jù),發(fā)送
 *                          1、發(fā)送成功
 *                             如果是無(wú)應(yīng)答數(shù)據(jù)幀,則認(rèn)定發(fā)送任務(wù)成功
 *                             如果是應(yīng)答數(shù)據(jù)幀,則等待接收數(shù)據(jù)
 *                          2、發(fā)送失敗
 *                             如果是無(wú)應(yīng)答數(shù)據(jù)幀,則認(rèn)定發(fā)送任務(wù)失敗
 *                             如果是應(yīng)答數(shù)據(jù)幀,則認(rèn)定發(fā)送任務(wù)失敗
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:True -- 發(fā)送成功
 *}

function TDriver.SendNextDataPacket: Boolean;
var
  Frm: TFrame;
  DeviceVar: TDeviceVar;
begin
  Result := False;
  Frm := FWindow.GetNextFrame;
  if Assigned(Frm) then
  begin
    Frm.FormFrame;
    Result := SendPktToComm(Frm.DataPacket, Frm.ItemName);
    if Result then //發(fā)送成功
    begin
      if (not Frm.NeedAck) and (Frm.LocalIndex >= 0) then
      begin
        DeviceVar := TDeviceVarList.GetDeviceVarList.GetItem(Frm.LocalIndex);
        if Assigned(DeviceVar) then
          DeviceVar.SetState(ITEM_STATUS_SendSuccess);
      end;
    end
    else begin //發(fā)送失敗,則根據(jù)錯(cuò)誤碼判斷通訊中斷
      FWindow.ProcessSendFailed(Frm);
      if (Frm.LocalIndex >= 0) then
      begin
        DeviceVar := TDeviceVarList.GetDeviceVarList.GetItem(Frm.LocalIndex);
        if Assigned(DeviceVar) then
          DeviceVar.SetState(ITEM_STATUS_SendFailed);
      end;
    end;
    NotifyToSendPkt;
  end;
end;

{*
 *                函數(shù)名稱(chēng):QueryCommData
 *                函數(shù)功能:主動(dòng)查詢(xún)變量數(shù)據(jù)
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.QueryCommData;
var
  I, Count: Integer;
  ItemName: string;
  SendValue: Variant;
  ItemNames: TStringArray;
  ReadInfos: TReadInfoArray;
  WriteInfos: TWriteInfoArray;
begin
  //獲得當(dāng)前所有可以讀取的模擬量OPCITEM信息
  SetLength(ReadInfos, 0);
  SetLength(WriteInfos, 0);
  
  FAddressParse.GetQueryData(ReadInfos);
  Count := Length(ReadInfos);
  if Count > 0 then
  begin
    SetLength(ItemNames, 0);
    for I := 0 to Count - 1 do
    begin
      if FAddressParse.ItemIsNull(ReadInfos[I].szItemName) then
        Continue;
      SetLength(ItemNames, Length(ItemNames) + 1);
      ItemNames[High(ItemNames)] := ReadInfos[I].szItemName;
    end;
    FOPCComm.QueryData(ItemNames);
  end;
  
  //查詢(xún)要自動(dòng)下發(fā)的數(shù)據(jù),并指定下發(fā)
  FAddressParse.GetWriteData(WriteInfos);
  Count := Length(WriteInfos);
  if Count > 0 then
  begin
    for I := 0 to Count - 1 do
    begin
      if FAddressParse.ItemIsNull(WriteInfos[I].szItemName) then
        Continue;

      ItemName := WriteInfos[I].szItemName;
      SendValue := WriteInfos[I].dwWriteValue;
      FOPCComm.SendData(ItemName, SendValue);
    end;
  end;
end;

{*
 *                函數(shù)名稱(chēng):ReceiveCommData
 *                函數(shù)功能:從通訊端口讀取數(shù)據(jù)
 *                          獲得當(dāng)前所有可以讀取的地址信息
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.ReceiveCommData;
var
  ItemName: string; //數(shù)據(jù)項(xiàng)名稱(chēng)
  ItemTime: TDateTime; //采集時(shí)間
  ItemValue: Variant; //數(shù)據(jù)項(xiàng)的數(shù)值
  AddrInfo: TAddressInfo;
  AppDataInfo: TAppDataInfo;
begin
  if not FOPCComm.ReadData(ItemName, ItemValue, ItemTime) then
    Exit;

  SetDriveStatus(COMM_STATUS_CONNECTED);
  FRefreshDataPnt := GetTickCount;
  FCommStateChkPnt := GetTickCount;
  
  {$IFDEF DEBUG}
  FrmOPC.AddPacket(Format('-->: 地址(%s). 數(shù)據(jù)(%s).', [ItemName, String(ItemValue)]));
  WriteDebugLog(Format('-->: 服務(wù)(%s). 地址(%s). 數(shù)據(jù)(%s).', [FOPCComm.MachineName, ItemName, String(ItemValue)]));
  {$ENDIF}
  
  AddrInfo.dwReadItem := ItemName;
  AppDataInfo.rcdAddress := AddrInfo;
  AppDataInfo.AppData := ItemValue;
  AppDataInfo.dtDateTime := ItemTime;
  try
    FAddressParse.SetRecvData(AppDataInfo);
  except
    WriteDebugLog('sss');
  end;
end;

{*
 *                函數(shù)名稱(chēng):StartInputHandler
 *                函數(shù)功能:創(chuàng)建端口數(shù)據(jù)到達(dá)事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StartInputHandler;
begin
  if Assigned(FInputHandler) then
    Exit;

  FInputHandler := TInputHandler.Create(Self, Self);
  FInputHandler.InitEvent(FOPCComm.ReadEvent, Const_Event_RecvDataInd);
  FScheduler.AddEventHandler(FInputHandler);
end;

{*
 *                函數(shù)名稱(chēng):StartSendHandler
 *                函數(shù)功能:創(chuàng)建發(fā)送數(shù)據(jù)事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StartSendHandler;
begin
  if Assigned(FSendHandler) then
    Exit;

  FSendEvent := CreateEvent(nil, False, False, '');
  FSendHandler := TInputHandler.Create(Self, Self);
  FSendHandler.InitEvent(FSendEvent, Const_Event_SendDataReq);
  FScheduler.AddEventHandler(FSendHandler);
end;

{*
 *                函數(shù)名稱(chēng):StartLoopTimer
 *                函數(shù)功能:?jiǎn)?dòng)定時(shí)讀數(shù)事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StartLoopTimer;
begin
  FLoopTimer := TTimerHandler.Create(Self, Self);
  FLoopTimer.InitEvent(Const_Event_LoopCheck, grcdDriverInfo.dwSampleTime, True);
  FScheduler.AddEventHandler(FLoopTimer);
end;

{*
 *                函數(shù)名稱(chēng):StartWaitTimer
 *                函數(shù)功能:?jiǎn)?dòng)發(fā)送超時(shí)檢查事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StartWaitTimer;
begin
  FWaitTimer := TTimerHandler.Create(Self, Self);
  FWaitTimer.InitEvent(Const_Event_WaitAnswer, Const_FrameSendTimeOut, True);
  FScheduler.AddEventHandler(FWaitTimer);
end;

{*
 *                函數(shù)名稱(chēng):StopInputHandler
 *                函數(shù)功能:釋放端口數(shù)據(jù)到達(dá)事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StopInputHandler;
begin
  if not Assigned(FInputHandler) then
    Exit;

  FInputHandler.SetMarked;
  FInputHandler := nil;
end;

{*
 *                函數(shù)名稱(chēng):StopSendHandler
 *                函數(shù)功能:釋放發(fā)送數(shù)據(jù)事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StopSendHandler;
begin
  if not Assigned(FSendHandler) then
    Exit;

  FSendHandler.SetMarked;
  FSendHandler := nil;
  CloseHandle(FSendEvent);
end;

{*
 *                函數(shù)名稱(chēng):StopLoopTimer
 *                函數(shù)功能:停止輪詢(xún)檢查事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StopLoopTimer;
begin
  try
    if Assigned(FLoopTimer) then
    begin
      FLoopTimer.SetMarked;
      FLoopTimer := nil;
    end;
  except
    WriteDebugLog('停止輪詢(xún)讀數(shù)事件失敗!');
  end;
end;

{*
 *                函數(shù)名稱(chēng):StopWaitTimer
 *                函數(shù)功能:停止發(fā)送超時(shí)檢查事件
 *                入口參數(shù):無(wú)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

procedure TDriver.StopWaitTimer;
begin
  try
    if Assigned(FWaitTimer) then
    begin
      FWaitTimer.SetMarked;
      FWaitTimer := nil;
      FWaitCount := 0;
    end;
  except
    WriteDebugLog('停止超時(shí)定時(shí)事件失敗!');
  end;
end;

{*
 *                函數(shù)名稱(chēng):Create
 *                函數(shù)功能:構(gòu)造函數(shù)
 *                入口參數(shù):1、PortInfo: TCommPortInfo。通信端口參數(shù)
 *                出口參數(shù):無(wú)
 *                  返回值:無(wú)
 *}

constructor TDriver.Create(PortInfo: TCommPortInfo);
var
  Param: TCommParam;
begin
  //初始化屬性
  FPortInfo := PortInfo;
  FDriveStatus := COMM_STATUS_UnKnown;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性久久久久久久| 国产一本一道久久香蕉| 日韩午夜av电影| 高潮精品一区videoshd| 午夜视频一区在线观看| 国产色产综合产在线视频 | 91蜜桃在线观看| 日韩国产成人精品| 综合色天天鬼久久鬼色| 欧美一级理论片| 在线视频一区二区三| 成人a级免费电影| 美女免费视频一区| 亚洲成精国产精品女| 亚洲欧洲精品天堂一级| 亚洲精品在线免费播放| 欧美日韩你懂的| 91女厕偷拍女厕偷拍高清| 国产乱理伦片在线观看夜一区| 性做久久久久久| 亚洲欧美电影院| 国产精品乱码一区二区三区软件| 日韩精品一区二区三区视频在线观看 | 欧美主播一区二区三区美女| 国产.欧美.日韩| 美女免费视频一区| 日本三级韩国三级欧美三级| 亚洲香肠在线观看| 一区二区三区在线观看国产| 亚洲欧洲精品一区二区三区不卡| 国产欧美一区二区精品性色超碰| 日韩视频一区在线观看| 欧美人与性动xxxx| 欧美伊人久久大香线蕉综合69| jizz一区二区| 成人免费看的视频| 丰满岳乱妇一区二区三区| 精品一区二区三区在线观看 | 成人黄色免费短视频| 国产一区二区免费在线| 另类欧美日韩国产在线| 日本女人一区二区三区| 视频一区在线视频| 日韩和的一区二区| 日日摸夜夜添夜夜添国产精品| 亚洲高清免费在线| 午夜精品福利在线| 男人操女人的视频在线观看欧美 | 高清在线成人网| 国产成人精品亚洲午夜麻豆| 丰满亚洲少妇av| 不卡一区中文字幕| 色狠狠桃花综合| 欧美蜜桃一区二区三区| 91麻豆精品国产91久久久久久久久| 欧美卡1卡2卡| 精品日韩一区二区三区| 久久久亚洲精品石原莉奈| 国产日韩欧美麻豆| 亚洲乱码国产乱码精品精小说| 亚洲一区二区精品视频| 日韩av一区二区在线影视| 久久99九九99精品| 国产99久久久国产精品免费看| 91视视频在线观看入口直接观看www | 久久久不卡网国产精品二区| 国产女人aaa级久久久级 | 91麻豆精品国产91久久久久久| 欧美第一区第二区| 久久久www成人免费无遮挡大片| 国产精品久久久久影院色老大| 亚洲免费在线观看视频| 五月婷婷激情综合网| 久久国产生活片100| 国产99久久久国产精品免费看| 91日韩精品一区| 91麻豆精品国产91久久久更新时间| 精品福利一二区| 亚洲欧美一区二区不卡| 三级一区在线视频先锋| 国产精品一品视频| 日本丶国产丶欧美色综合| 欧美精品日韩一区| 国产婷婷色一区二区三区| 亚洲尤物在线视频观看| 国产一区二区福利视频| 在线观看av一区二区| 精品国产乱码久久| 亚洲免费观看高清完整版在线| 免费成人在线视频观看| 99在线视频精品| 日韩免费一区二区| 亚洲黄色尤物视频| 国产精品一区免费视频| 欧美日韩一区 二区 三区 久久精品| 精品国产成人在线影院 | 91精品国产综合久久婷婷香蕉 | 国产成人免费高清| 欧美午夜一区二区| 国产精品丝袜久久久久久app| 日韩黄色小视频| 91麻豆产精品久久久久久 | 欧美r级电影在线观看| 亚洲人精品午夜| 经典三级在线一区| 欧美色老头old∨ideo| 亚洲国产精品成人综合色在线婷婷| 午夜精品久久久久久久蜜桃app| 成人黄色片在线观看| 日韩欧美国产三级电影视频| 一区二区三区中文免费| 国产激情91久久精品导航| 欧美一区二区啪啪| 亚洲欧美日韩久久| 成人免费av在线| 26uuu久久综合| 蜜臀久久99精品久久久久久9 | 成人午夜视频在线观看| 欧美www视频| 石原莉奈在线亚洲三区| 在线观看一区二区视频| 国产精品久久午夜| 国产91丝袜在线观看| 日韩欧美国产精品| 日韩va亚洲va欧美va久久| 欧美日精品一区视频| 亚洲一区二区三区美女| 在线视频中文字幕一区二区| 亚洲三级在线观看| www.亚洲人| 国产精品乱码人人做人人爱| 国产成人日日夜夜| 久久精品一区二区三区不卡 | 久久国产综合精品| 日韩精品一区二区三区在线观看| 日本aⅴ免费视频一区二区三区| 在线观看视频一区二区欧美日韩| 亚洲精品伦理在线| 色综合咪咪久久| 亚洲精品高清在线| 在线看日本不卡| 亚洲成人av资源| 制服丝袜av成人在线看| 蜜臀国产一区二区三区在线播放| 欧美一区二区久久| 久久精品久久99精品久久| 日韩欧美激情四射| 国内成人自拍视频| 久久精品夜夜夜夜久久| 国产99精品视频| 亚洲天堂福利av| 色婷婷精品大在线视频 | 亚洲一级二级三级在线免费观看| 欧美亚洲一区三区| 日韩专区中文字幕一区二区| 欧美丰满美乳xxx高潮www| 美腿丝袜亚洲综合| 国产日韩三级在线| 99精品视频在线观看| 亚洲黄色免费网站| 91精品欧美综合在线观看最新| 精品在线你懂的| 国产精品三级久久久久三级| 色婷婷综合五月| 天天综合网 天天综合色| 精品sm捆绑视频| 播五月开心婷婷综合| 亚洲va韩国va欧美va精品| 日韩欧美亚洲一区二区| 成人性生交大片免费看在线播放| 亚洲欧美日韩人成在线播放| 91精品麻豆日日躁夜夜躁| 国产高清成人在线| 亚洲在线中文字幕| 精品日产卡一卡二卡麻豆| av影院午夜一区| 日韩不卡在线观看日韩不卡视频| 国产亚洲欧美一级| 在线观看亚洲a| 国产福利一区二区三区视频在线| 亚洲视频一区二区在线| 日韩欧美在线综合网| 北条麻妃一区二区三区| 亚洲午夜久久久| 精品对白一区国产伦| 成人一区二区三区中文字幕| 亚洲精品日产精品乱码不卡| 成人免费视频播放| 一区二区三区四区在线播放| 91精品麻豆日日躁夜夜躁| 不卡的av电影| 午夜电影网一区| 久久久精品影视| 欧美日韩大陆一区二区| 国产中文字幕精品| 亚洲男人电影天堂| 在线观看视频欧美| av电影一区二区| 三级不卡在线观看| 欧美激情艳妇裸体舞|