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

📄 devreader.pas

📁 通过USB接口通信 实现USB UPS电源的自动开关机
💻 PAS
📖 第 1 页 / 共 2 页
字号:
          Result := true;
        end;
      end;
    end;
  except
    Result := false;
  end;
end;


procedure TMainForm.Timer1Timer(Sender: TObject);
var
  dtopen, dtclose: Ttime;
  Openmm, Closetime, Opentime: string;
  currentlytime: string;
  Buf: array[0..64] of byte;
  i: integer;
begin
  currentlytime := formatdatetime('hh:mm', now);
  Closetime := formatdatetime('hh:mm', CloseDateTimePicker.DateTime);
  if Closetime = currentlytime then begin
    if UpsvListBox then begin
      if CloseDateTimePicker.DateTime > OpenDateTimePicker.DateTime then
        dtopen := 1 - CloseDateTimePicker.DateTime + OpenDateTimePicker.DateTime
      else
        dtopen := CloseDateTimePicker.DateTime - OpenDateTimePicker.DateTime;
      Openmm := formatdatetime('hhmm', dtopen);
      Opentime := inttostr(strtoint(copy(Openmm, 1, 2)) * 60 + strtoint(copy(Openmm, 3, 2)));
      Closetime := '1';
      AddToHistory('');
      Readdata := '';
      tmpReadData := '';
      Closetime := format('%.2d', [StrToIntdef(trim(Closetime), 0)]);
      OpenTime := format('%.4d', [StrToIntdef(trim(Opentime), 0)]);
      for i := 0 to 64 do Buf[i] := $00;
      Buf[0] := $53;
      for i := 0 to 1 do Buf[i + 1] := Ord(Closetime[i + 1]);
      Buf[3] := $52;
      for i := 1 to 4 do Buf[i + 3] := Ord(OpenTime[i]);
   //53 30 32 52 - 30 30 30 31  S02R0001       4.0ms       465.2.0
      SendCommand(Buf);
      for i := 0 to 64 do Buf[i] := $00;
      Buf[0] := $0D;
      for i := 0 to 1 do Buf[i + 1] := Ord(Closetime[i + 1]);
      Buf[3] := $52;
      for i := 1 to 4 do Buf[i + 3] := Ord(OpenTime[i]);
    //14  DO     0d 30 32 52 - 30 30 30 31  .02R0001       7.9ms       466.2.0
      SendCommand(Buf);
      InsertLogfile('关机时间离开机时间:' + Opentime + '分钟');
      AddToHistory('启动关机,' + OpenTime + '分钟后开机!');
      
      InsertLogfile('关机时输入电压:' + UPSSTATE.InputPower);
      InsertLogfile('关机时输出电压:' + UPSSTATE.OutputPower);
      InsertLogfile('关机时负载:' + format('%d', [StrToint(UPSSTATE.PowerLoad)]) + '%');
      InsertLogfile('关机时温度:' + UPSSTATE.Tmprt);

      delay(300);
      Timer1.Enabled := false;
      close;
    end;
  end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
  Buf: array[0..64] of byte;
  i: integer;
begin
  if UpsvListBox then begin
    AddToHistory('');
    Readdata := '';
    tmpReadData := '';
    for i := 0 to 64 do Buf[i] := $00;
    Buf[0] := $51;
    Buf[1] := $31;
    Buf[2] := $0D;
    Buf[3] := $6F;
    Buf[4] := $F1;
    Buf[5] := $CF;
    Buf[6] := $11;
    Buf[7] := $88;
    SendCommand(Buf);
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
  MyIni: TIniFile;
  IniFile: string;
  closetime, opentime, curtime: string;
begin
  curtime := formatdatetime('yyyy-mm-dd hh:mm:ss',now);
  IniFile := ExtractFilePath(Application.ExeName);
  IniFile := IniFile + 'AutoUpDown.ini';
  MyIni := TIniFile.Create(IniFile);
  closetime := MyIni.ReadString('Atuo', 'closetime', '');
  opentime := MyIni.ReadString('Atuo', 'opentime', '');
  CloseDateTimePicker.DateTime := strtodatetime(closetime);
  OpenDateTimePicker.DateTime := strtodatetime(opentime);
  CloseDateTimePicker.Format := 'HH:mm';
  OpenDateTimePicker.Format := 'HH:mm';
  InsertLogfile('开机时间' + opentime + '  ' + '关机时间' + closetime);
  InsertLogfile('系统启动时间:'+ curtime);
end;

procedure TMainForm.Button3Click(Sender: TObject);
var
  MyIni: TIniFile;
  IniFile: string;
  closetime, opentime: string;
begin
  IniFile := ExtractFilePath(Application.ExeName);
  IniFile := IniFile + 'AutoUpDown.ini';
  MyIni := TIniFile.Create(IniFile);
  Closetime := formatdatetime('hh:mm', CloseDateTimePicker.DateTime);
  opentime := formatdatetime('hh:mm', openDateTimePicker.DateTime);
  MyIni.WriteString('Atuo', 'closetime', closetime);
  MyIni.WriteString('Atuo', 'opentime', opentime);
  AddToHistory('开机:' + opentime + ' 关机:' + closetime + '保存成功!');
  InsertLogfile('重新设置开机时间' + opentime + '  ' + '重新设置关机时间' + closetime);
end;

function TMainForm.WinExitInNT(iFlags: integer): boolean;
begin
  Close;
  Result := True;
  if (SetPrivilege('SeShutdownPrivilege', True)) then
  begin
    if (not ExitWindowsEx(iFlags, 0)) then
    begin
      Result := False;
    end;
    SetPrivilege('SeShutdownPrivilege', False)
  end
  else begin
    Result := False;
  end;
end;

function TMainForm.SetPrivilege(sPrivilegeName: string; bEnabled: boolean): boolean;
var
  TPPrev,
    TP: TTokenPrivileges;
  Token: THandle;
  dwRetLen: DWord;
begin
  Result := False;
  //opens the access token associated with a process.
  OpenProcessToken(GetCurrentProcess, //handle to process
    TOKEN_ADJUST_PRIVILEGES //Required to change the privileges specified in an access token.
    or TOKEN_QUERY, //Required to query the contents of an access token.
    Token);

  TP.PrivilegeCount := 1;
  //retrieves the locally unique identifier (LUID) used on a specified system to locally represent the specified privilege name.
  if (LookupPrivilegeValue(
    nil, //attempts to find the privilege name on the local system.
    PChar(sPrivilegeName), // address of string specifying the privilege
    TP.Privileges[0].LUID) // address of locally unique identifier
    ) then
  begin
    if (bEnabled) then
    begin
      TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    end
    else begin
      TP.Privileges[0].Attributes := 0;
    end;
    dwRetLen := 0;
    //enables or disables privileges in the specified access token.
    Result := AdjustTokenPrivileges(
      Token, // handle to token that contains privileges
      False, //modifies privileges
      TP, // pointer to new privilege information
      SizeOf(TPPrev), // size, in bytes, of the TPPrev buffer
      TPPrev, // receives original state of changed privileges
      dwRetLen // receives required size of the TPPrev buffer
      );
  end;
  CloseHandle(Token);
end;

procedure TMainForm.Delay(waittime: integer);
var
  EndTime: DWORD;
begin
  EndTime := GetTickCount + waittime;
  while GetTickCount < EndTime do
    Application.ProcessMessages;
end;

procedure TMainForm.InsertLogfile(log_str: string);
var
  F: TextFile;
  MyStr: string;
  time: string;
  sss: string;
  FileHandle: Integer;
  FileLogpath: string;
  MyIni: TIniFile;
begin
  MyIni := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'AutoUpDown.ini');
  FileLogpath := ExtractFilePath(Application.ExeName) + MyIni.ReadString('system', 'logfilepath', '\log\');
  try
    time := FormatDateTime('yyyymmdd', Now) + '_AutoUPDOWN';
    sss := FileLogpath + time + '.txt';
    if not FileExists(sss) then begin
      FileHandle := FileCreate(sss);
      FileClose(FileHandle);
    end;
    AssignFile(F, sss);
    Append(F);
    MyStr := FormatDateTime('yyyy-mm-dd hh:mm:ss', Now) + '  |  ' + log_str;
    Writeln(F, MyStr);
    Flush(F);
    CloseFile(F);
  except
    exit;
  end;
end;

procedure TMainForm.Button4Click(Sender: TObject);
var
  dtopen, dtclose: Ttime;
  Openmm, Closetime, Opentime: string;
  currentlytime: string;
  Buf: array[0..64] of byte;
  i: integer;
begin

  dtopen := CloseDateTimePicker.DateTime - OpenDateTimePicker.DateTime;
  Openmm := formatdatetime('hhmm', dtopen);
  Opentime := inttostr(strtoint(copy(Openmm, 1, 2)) * 60 + strtoint(copy(Openmm, 3, 2)));
  showmessage(opentime);
end;

procedure TMainForm.Timer2Timer(Sender: TObject);
var
  Buf: array[0..64] of byte;
  i: integer;
begin
  Timer2.Enabled := false;
  if UpsvListBox then begin
    AddToHistory('');
    Readdata := '';
    tmpReadData := '';
    for i := 0 to 64 do Buf[i] := $00;
    Buf[0] := $51;
    Buf[1] := $31;
    Buf[2] := $0D;
    Buf[3] := $6F;
    Buf[4] := $F1;
    Buf[5] := $CF;
    Buf[6] := $11;
    Buf[7] := $88;
    SendCommand(Buf);
    delay(5000);
    Timer2.Enabled :=true;
  end;
end;


procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  WinExitInNT(EWX_SHUTDOWN);  //关机
end;

procedure TMainForm.MinMin(var Msg: TWMSYSCOMMAND);
begin
  if (Msg.CmdType=SC_CLOSE) then
    Msg.CmdType:=SC_MINIMIZE;  //使其最小化
  Inherited;
end;

end.


Test bewteen time code
var
  dtopen, dtclose: Ttime;
  Openmm, Closetime, Opentime: string;
  currentlytime: string;
  CommandStr: string;
begin
  if CloseDateTimePicker.DateTime > OpenDateTimePicker.DateTime then
    dtopen := 1 - CloseDateTimePicker.DateTime + OpenDateTimePicker.DateTime
  else
    dtopen := CloseDateTimePicker.DateTime - OpenDateTimePicker.DateTime;
  Openmm := formatdatetime('hhmm', dtopen);
  Opentime := inttostr(strtoint(copy(Openmm, 1, 2)) * 60 + strtoint(copy(Openmm, 3, 2)));
  showmessage(opentime);
end;

⌨️ 快捷键说明

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