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

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

?? cabinetcontroler.pas

?? 自己用API編寫的端口通訊
?? PAS
字號(hào):
unit CabinetControler;

interface
uses
    Windows,Dialogs,SysUtils,SyncObjs;



type
    DiskBoxOpenState= array [0..15] of integer;
    TCabinetControler = class
    private
       FDiskBoxIndex:integer;       //盒子編號(hào)
       FCabinetAddress:integer;     //柜子地址
       FStoreUnitIndex:integer;     //單元格編號(hào)
       FDiskState:DiskBoxOpenState;    //抽屜開(kāi)關(guān)狀態(tài)
       FComEvent:TSimpleEvent;           //事件
       FComEventQuery:TSimpleEvent;      //查詢事件
       FComCabinet:THandle;         //串口句柄
       FReady:Boolean;

       function InputQueryEx():Boolean;     //查詢輸入,使用事件方式
       function InputQuery( ):Boolean;     //查詢輸入
       function InputOpen( ):Boolean;  //打開(kāi)
       function InitPort(InterfaceName:string ):Boolean;  //初始化串口句柄
    public
       constructor Create(ValSpName: String);
       Destructor Destroy; override;
       function OpenDiskBox(DiskBoxIndex,DiskCabinetAddress:integer):boolean;
       function LighterStoreUnit(CabinetAddress,DiskBoxIndex,StoreUnitIndex:integer):boolean;
       function GetIsDiskBoxOpen(CabinetAddress:integer;var OutState:DiskBoxOpenState):Boolean;
    end;
implementation

{ TCabinetControler }


constructor TCabinetControler.Create(ValSpName: String);
begin
  inherited Create;
  Self.InitPort(ValSpName);
end;

destructor TCabinetControler.Destroy;
begin
  if Self.FComCabinet <> INVALID_HANDLE_VALUE then
  begin
      CloseHandle(Self.FComCabinet);
  end;
  self.FComEventQuery.Destroy;
  self.FComEventQuery:=nil;
  self.FComEvent.Destroy;
  self.FComEvent:=nil;
  inherited;
end;

function TCabinetControler.GetIsDiskBoxOpen(CabinetAddress:integer;
  var OutState:DiskBoxOpenState): Boolean;

begin
     result:=false;
     Self.FCabinetAddress:=CabinetAddress;
     if not (Self.InputQueryEx()) then
         exit;
//     if not (self.InputQuery( )) then
//         exit;

     OutState:=Self.FDiskState;
     result:=True;
     //返回值待商議

end;

//InterFaceName為串口名稱:COM1或COM2;
function TCabinetControler.InitPort(InterfaceName:string): Boolean;
var
     ValDCB: TDCB;
     ValTimeOuts: TCommTimeouts;
begin
     result:=False;

     FComEvent:=TSimpleEvent.Create;
     FComEventQuery:=TSimpleEvent.Create;

     //打開(kāi)Com端口
//     FComCabinet:=CreateFile(PChar('\\.\'+InterfaceName),
//          GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
//          0,0);
     FComCabinet:=CreateFile(PChar('\\.\'+InterfaceName),
          GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
          FILE_FLAG_OVERLAPPED,0);
     if (FComCabinet=INVALID_HANDLE_VALUE) then
     begin
          ShowMessage('初始化COM串口失敗');
          exit;
     end;

     //設(shè)置Com狀態(tài)
     if GetCommState(Self.FComCabinet, ValDCB) then
     begin
         {利國(guó) VAS9002A 通信協(xié)議:
            8 data bits, 1 stop bit, and no parity}
        ValDCB.BaudRate := CBR_9600;
        ValDCB.ByteSize := 8;
        ValDCB.StopBits := ONESTOPBIT;
        ValDCB.Parity := SPACEPARITY;
//        ValDCB.Flags := 1;

        if not SetCommState(Self.FComCabinet, ValDCB) then
              exit;
     end
     else
     begin
        exit;
     end;

     //設(shè)置等待時(shí)間
     ValTimeOuts.ReadIntervalTimeout := 300;
     ValTimeOuts.ReadTotalTimeoutMultiplier := 300;
     ValTimeOuts.ReadTotalTimeoutConstant := 600;
     ValTimeOuts.WriteTotalTimeoutMultiplier := 100;
     ValTImeOuts.WriteTotalTimeoutConstant := 100;

     if SetCommTimeOuts(Self.FComCabinet, ValTimeOuts) then
          Self.FReady := true;


     result:=True;
end;

function TCabinetControler.InputOpen:Boolean;
var
    tempOL:TOverlapped;
    SendBuff:array[0..2] of Byte;
    SendBytes:DWORD;
begin
    result:=False;

    if ((Self.FComCabinet=INVALID_HANDLE_VALUE) and Self.FReady) then
    begin
       ShowMessage('設(shè)備沒(méi)準(zhǔn)備好');
       exit;
    end;
    //初始化tempOL;
    ZeroMemory(@tempOL, Sizeof(TOverlapped));
    tempOL.Internal:=0;
    tempOL.Offset:=0;
    tempOL.OffsetHigh:=0;
    tempOL.hEvent:=self.FComEvent.Handle;
    self.FComEvent.ResetEvent;

    //發(fā)送的字節(jié)
    //保留位為1
    SendBuff[0]:= $40 or Byte(Self.FCabinetAddress);
    SendBuff[1]:= $A0 or Byte(Self.FDiskBoxIndex);
    SendBuff[2]:= $C0 or Byte(self.FStoreUnitIndex);
//    if (self.FStoreUnitIndex=0) then
//    begin
//       SendBuff[2]:=$55 or Byte(self.FStoreUnitIndex);
//    end
//    else
//    begin
//        SendBuff[2]:= $c0 or Byte(Self.FStoreUnitIndex);
//    end;

    PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);
    WriteFile(self.FComCabinet,SendBuff[0],1,SendBytes,@tempOL);

    if Self.FComEvent.WaitFor(300)=wrSignaled then
    begin
         Self.FComEvent.ResetEvent;
//         result:=True;
    end
    else
    begin
         ShowMessage('打開(kāi)柜子超時(shí)');
         exit;
    end;

    WriteFile(self.FComCabinet,SendBuff[1],1,SendBytes,@tempOL);

    if Self.FComEvent.WaitFor(300)=wrSignaled then
    begin
         Self.FComEvent.ResetEvent;
//         result:=True;
    end
    else
    begin
         ShowMessage('打開(kāi)柜子超時(shí)');
         exit;
    end;

    WriteFile(self.FComCabinet,SendBuff[2],1,SendBytes,@tempOL);


    if Self.FComEvent.WaitFor(300)=wrSignaled then
    begin
         Self.FComEvent.ResetEvent;
//         result:=True;
    end
    else
    begin
         ShowMessage('打開(kāi)柜子超時(shí)');
         exit;
    end;
    result:=True;
    PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);
end;

function TCabinetControler.InputQuery( ):Boolean;
var
     tempOL : TOverlapped;
     SendBuff: Byte;
     ReciveBuff: array[0..1] of Byte;
     SendBytes: DWORD;
//     fSuccess:BOOL;
//     dwEvtMask:DWORD;
begin
     result:=False;
     if ((Self.FComCabinet=INVALID_HANDLE_VALUE) and self.FReady) then
     begin
       ShowMessage('設(shè)備沒(méi)準(zhǔn)備好');
       exit;
     end;

     Zeromemory(@tempOL,sizeof(TOverlapped));
     tempOL.Internal:=0;
     tempOL.Offset:=0;
     tempOL.OffsetHigh:=0;
     tempOL.hEvent:=self.FComEvent.Handle;
     self.FComEvent.ResetEvent;

     PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);

     //發(fā)送查詢數(shù)據(jù)
     SendBuff:= Byte(Self.FCabinetAddress);
     WriteFile(self.FComCabinet,SendBuff,1,SendBytes,@tempOL);

     if self.FComEvent.WaitFor(3000)=wrSignaled then
     begin
          self.FComEvent.ResetEvent;
     end
     else
     begin
          ShowMessage('發(fā)送請(qǐng)求超時(shí)');
          exit;
     end;

     //接收數(shù)據(jù)
     ReciveBuff[0]:=0;
     ReciveBuff[1]:=0;
     PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);
     ReadFile(self.FComCabinet,ReciveBuff[0],2,SendBytes,@tempOL);

     if (self.FComEvent.WaitFor(3000)=wrSignaled)  then
     begin
          self.FComEvent.ResetEvent;
          //對(duì)接受的數(shù)據(jù)進(jìn)行處理
          Self.FDiskState[7]:=ReciveBuff[0] and $80;
          Self.FDiskState[6]:=ReciveBuff[0] and $40;
          Self.FDiskState[5]:=ReciveBuff[0] and $20;
          Self.FDiskState[4]:=ReciveBuff[0] and $10;
          Self.FDiskState[3]:=ReciveBuff[0] and $8;
          Self.FDiskState[2]:=ReciveBuff[0] and $4;
          Self.FDiskState[1]:=ReciveBuff[0] and $2;
          Self.FDiskState[0]:=ReciveBuff[0] and $1;

          Self.FDiskState[15]:=ReciveBuff[1] and $80;
          Self.FDiskState[14]:=ReciveBuff[1] and $40;
          Self.FDiskState[13]:=ReciveBuff[1] and $20;
          Self.FDiskState[12]:=ReciveBuff[1] and $10;
          Self.FDiskState[11]:=ReciveBuff[1] and $8;
          Self.FDiskState[10]:=ReciveBuff[1] and $4;
          Self.FDiskState[9]:=ReciveBuff[1] and $2;
          Self.FDiskState[8]:=ReciveBuff[1] and $1;

          result:=true;
     end
     else
     begin
          ShowMessage('接收請(qǐng)求超時(shí)間');
          exit;
     end;
//     }
     PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);
end;

//false——點(diǎn)亮失敗
function TCabinetControler.InputQueryEx: Boolean;
var
//     tempOL : TOverlapped;
     tempOL : POverlapped;
     SendBuff: Byte;
     ReciveBuff: array[0..1] of Byte;
     SendBytes: DWORD;
//     fSuccess:BOOL;
     dwEvtMask:DWORD;
begin
     result:=False;

     //初始化
     dwEvtMask:=0;
     SendBuff:= Byte(Self.FCabinetAddress);
     ReciveBuff[0]:=0;
     ReciveBuff[1]:=0;
     GetMem(tempOL,sizeof(_OVERLAPPED));
     Zeromemory(tempOL,sizeof(_OVERLAPPED));
     tempOL.Internal:=0;
     tempOL.Offset:=0;
     tempOL.OffsetHigh:=0;
     tempOL.hEvent:=self.FComEventQuery.Handle;
     self.FComEventQuery.ResetEvent;

     if ((Self.FComCabinet=INVALID_HANDLE_VALUE) and self.FReady) then
     begin
       ShowMessage('設(shè)備沒(méi)準(zhǔn)備好');
       exit;
     end;

     PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);
     WriteFile(self.FComCabinet,SendBuff,1,SendBytes,tempOL);
     SetCommMask(self.FComCabinet,0);
     SetCommMask(self.FComCabinet, EV_RXCHAR);

     WaitCommEvent(self.FComCabinet, dwEvtMask, tempOL);

     if (self.FComEventQuery.WaitFor(500)=wrSignaled) then
     begin
          if ((dwEvtMask and EV_RXCHAR)<>0) then
          begin
               // To do.
//               PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
//           or PURGE_TXABORT or PURGE_RXABORT);
               ReadFile(self.FComCabinet,ReciveBuff[0],2,SendBytes,tempOL);

               if (self.FComEventQuery.WaitFor(1000)=wrSignaled) then
//               if (self.FComEvent.WaitFor(3000)=wrSignaled) then
               begin
                 self.FComEventQuery.ResetEvent;
//                 self.FComEvent.ResetEvent;
                 //對(duì)接受的數(shù)據(jù)進(jìn)行處理
                 Self.FDiskState[7]:=ReciveBuff[0] and $80;
                 Self.FDiskState[6]:=ReciveBuff[0] and $40;
                 Self.FDiskState[5]:=ReciveBuff[0] and $20;
                 Self.FDiskState[4]:=ReciveBuff[0] and $10;
                 Self.FDiskState[3]:=ReciveBuff[0] and $8;
                 Self.FDiskState[2]:=ReciveBuff[0] and $4;
                 Self.FDiskState[1]:=ReciveBuff[0] and $2;
                 Self.FDiskState[0]:=ReciveBuff[0] and $1;

                 Self.FDiskState[15]:=ReciveBuff[1] and $80;
                 Self.FDiskState[14]:=ReciveBuff[1] and $40;
                 Self.FDiskState[13]:=ReciveBuff[1] and $20;
                 Self.FDiskState[12]:=ReciveBuff[1] and $10;
                 Self.FDiskState[11]:=ReciveBuff[1] and $8;
                 Self.FDiskState[10]:=ReciveBuff[1] and $4;
                 Self.FDiskState[9]:=ReciveBuff[1] and $2;
                 Self.FDiskState[8]:=ReciveBuff[1] and $1;

                 result:=true;
              end
              else
              begin
                 ShowMessage('接收請(qǐng)求超時(shí)間');
                 exit;
              end;
          end;
     end
     else
     begin
          SetCommMask(self.FComCabinet,0);
          ShowMessage('接收超時(shí)間');
          exit;
     end;

     PurgeComm(Self.FComCabinet, PURGE_TXCLEAR or PURGE_RXCLEAR
           or PURGE_TXABORT or PURGE_RXABORT);
//     Self.FComEventQuery.ResetEvent;
//     Self.FComEvent.ResetEvent;
end;

function TCabinetControler.LighterStoreUnit(CabinetAddress, DiskBoxIndex,
  StoreUnitIndex: integer): boolean;
begin
     result:=False;
     if (FReady=False) then
     begin
          ShowMessage('設(shè)備沒(méi)準(zhǔn)備好');
          exit;
     end;
     Self.FCabinetAddress:=CabinetAddress;
     Self.FDiskBoxIndex:=DiskBoxIndex;
     if (StoreUnitIndex>31) then
     begin
          Self.FStoreUnitIndex:=StoreUnitIndex;
     end
     else
     begin
          Self.FStoreUnitIndex:=(StoreUnitIndex-31)*(-1);
     end;
//     Self.FStoreUnitIndex:=StoreUnitIndex;
     //發(fā)送2次打開(kāi)的指令,防止不能有效點(diǎn)亮。
     if  (InputOpen) then
        result:=True
     else
        result:=False;
     Sleep(1000);
     if (InputOpen) then
        result:=True
     else
        result:=False;
end;

function TCabinetControler.OpenDiskBox(DiskBoxIndex,
  DiskCabinetAddress: integer): boolean;
begin
     result:=False;

     if  not (self.FReady) then
     begin
         ShowMessage('設(shè)備沒(méi)準(zhǔn)備好');
         exit;
     end;

     Self.FCabinetAddress:=DiskCabinetAddress;
     Self.FDiskBoxIndex:=DiskBoxIndex;
     Self.FStoreUnitIndex:=1;
     if  (InputOpen) then
        result:=True
     else
        result:=False;
end;



end.

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一二三区| 中文字幕一区二区三区不卡在线 | 99国产欧美另类久久久精品| 亚洲国产欧美另类丝袜| 国产午夜精品一区二区三区四区 | 91视频观看视频| 青青草精品视频| 亚洲六月丁香色婷婷综合久久| 日韩精品专区在线影院观看 | 欧美成人国产一区二区| 色婷婷激情综合| 国产精品一区二区在线播放| 亚洲高清在线精品| 亚洲天堂成人在线观看| 久久久精品影视| 日韩精品一区二区三区四区| 精品视频免费在线| www.欧美日韩国产在线| 久久99精品久久久久久国产越南| 一区二区成人在线| 国产精品久久久久久久久果冻传媒| 日韩免费在线观看| 欧美日高清视频| 91久久精品国产91性色tv| 国产不卡高清在线观看视频| 久久爱www久久做| 天天操天天综合网| 亚洲国产精品综合小说图片区| 中文字幕亚洲精品在线观看| 久久亚洲精品国产精品紫薇| 日韩三级视频在线观看| 欧美日韩www| 欧美日韩一本到| 欧美色大人视频| 欧美性一级生活| 91高清视频免费看| 91九色最新地址| 91久久精品一区二区三区| 91免费观看在线| 91亚洲精品久久久蜜桃| 99久久精品国产观看| av在线不卡网| 97久久精品人人做人人爽| eeuss鲁片一区二区三区在线看| 国产成a人亚洲精品| 成人精品一区二区三区中文字幕| 国产福利一区二区三区视频 | 1000精品久久久久久久久| 国产精品三级视频| 中文字幕日本不卡| 一区二区在线免费| 亚洲一区二区视频在线| 午夜精品aaa| 久久精品国产**网站演员| 毛片不卡一区二区| 精久久久久久久久久久| 国产不卡高清在线观看视频| 91在线观看高清| 欧美三级在线播放| 日韩限制级电影在线观看| 久久色在线视频| 中文字幕亚洲区| 午夜伊人狠狠久久| 久久狠狠亚洲综合| 东方欧美亚洲色图在线| 91在线小视频| 日韩一区二区视频| 久久精品视频在线免费观看| 中文字幕一区二区三区蜜月| 午夜日韩在线电影| 国产伦理精品不卡| 一本久久精品一区二区| 欧美精品 日韩| 久久久久97国产精华液好用吗| 中文字幕日韩欧美一区二区三区| 亚洲一区二区三区美女| 精品亚洲欧美一区| 91污在线观看| 欧美一区二区私人影院日本| 国产欧美日韩视频在线观看| 一区二区三区自拍| 国精产品一区一区三区mba桃花| 99天天综合性| 日韩天堂在线观看| 亚洲欧美另类久久久精品| 日韩不卡免费视频| 成人av在线资源| 欧美一三区三区四区免费在线看| 欧美国产乱子伦 | 婷婷丁香久久五月婷婷| 国产乱国产乱300精品| 色综合久久久久综合体| 精品国精品国产尤物美女| 一区二区三区四区蜜桃| 美女一区二区久久| 色一情一乱一乱一91av| 久久女同性恋中文字幕| 亚洲综合999| 国产成人午夜高潮毛片| 欧美久久一区二区| 国产日韩精品一区二区三区在线| 亚洲一线二线三线视频| 成人精品电影在线观看| 日韩女同互慰一区二区| 亚洲h精品动漫在线观看| 成人黄动漫网站免费app| 日韩免费视频一区| 亚洲高清在线精品| 一本久久a久久免费精品不卡| 国产午夜精品久久| 日本中文一区二区三区| 在线精品亚洲一区二区不卡| 中文av一区二区| 经典三级视频一区| 欧美精品三级在线观看| 亚洲图片激情小说| 国产69精品久久久久777| 欧美大片在线观看一区| 青青青伊人色综合久久| 欧美日韩精品久久久| 亚洲女爱视频在线| 成年人网站91| 国产欧美精品一区二区三区四区 | 亚洲美女在线一区| 国产福利不卡视频| 日韩你懂的电影在线观看| 石原莉奈在线亚洲二区| 欧美挠脚心视频网站| 亚洲超碰精品一区二区| 欧美午夜不卡在线观看免费| ㊣最新国产の精品bt伙计久久| 成人激情文学综合网| 国产精品久久久久久久久快鸭| 国产高清精品在线| 国产片一区二区三区| 国产高清成人在线| 国产欧美日韩另类视频免费观看| 国产久卡久卡久卡久卡视频精品| 日韩欧美国产三级电影视频| 美女脱光内衣内裤视频久久网站| 欧美日韩在线播放三区四区| 亚洲国产精品影院| 欧美久久久久中文字幕| 婷婷成人激情在线网| 欧美一级免费大片| 韩国一区二区三区| 国产亚洲美州欧州综合国| 成人av电影在线观看| 亚洲欧美二区三区| 欧美日韩免费一区二区三区视频| 午夜视频一区在线观看| 日韩欧美一级在线播放| 国产精品夜夜嗨| 国产精品福利在线播放| 99国产精品99久久久久久| 亚洲精品免费看| 欧美日韩大陆一区二区| 另类小说欧美激情| 久久久久久久久蜜桃| 成人精品国产福利| 亚洲一区二区偷拍精品| 日韩一二三区视频| 高清beeg欧美| 一二三四社区欧美黄| 91精品国产一区二区人妖| 激情综合网av| 17c精品麻豆一区二区免费| 欧美色大人视频| 久久国产欧美日韩精品| 欧美极品另类videosde| 欧美在线观看视频一区二区| 日本视频一区二区三区| 久久精品网站免费观看| 91福利在线导航| 久久精品国产99| 日韩理论片在线| 日韩视频一区在线观看| 成人精品小蝌蚪| 亚洲国产你懂的| 亚洲精品一区二区三区99| 色诱亚洲精品久久久久久| 免费在线看成人av| 国产精品伦理一区二区| 欧美一区二区视频观看视频 | 91福利在线免费观看| 久久国产综合精品| 亚洲视频一区二区免费在线观看| 7777精品伊人久久久大香线蕉最新版| 韩国女主播成人在线观看| 国产精品国产三级国产普通话蜜臀 | 7799精品视频| 国产91精品精华液一区二区三区 | 精品一区二区综合| 自拍偷拍国产精品| 日韩精品一区在线观看| 91精品福利视频| 国产精品1区二区.| 午夜精品久久久| 亚洲激情男女视频| 国产精品欧美久久久久一区二区|