unit VisInverterAControlPanel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VisInverterA, ExtCtrls, ScadaBase, VisMachine, VisMcha, VisCheckBox,
  StdCtrls, VisButton, VisLabel, Buttons, VisDataboard, VisNumericPanel,
  VisControl;


type
  TVisInverterAControlPanelForm = class(TForm)
    ScadaUpdateTimer: TTimer;
    pnlControl: TPanel;
    btReverse: TVisButton;
    Bevel1: TBevel;
    pnlDeviceName: TPanel;
    pnlSost: TPanel;
    pnlBlok: TPanel;
    Bevel2: TBevel;
    VisLabel1: TVisLabel;
    Bevel5: TBevel;
    pnlParams: TPanel;
    Label1: TLabel;
    btStart: TBitBtn;
    btStop: TBitBtn;
    btExtErr: TBitBtn;
    btReset: TBitBtn;
    VisLabel6: TVisLabel;
    VisLabel2: TVisLabel;
    VisLabel3: TVisLabel;
    VisLabel4: TVisLabel;
    Label3: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    VisNumericPanel1: TVisNumericPanel;
    VisNumericPanel2: TVisNumericPanel;
    VisNumericPanel3: TVisNumericPanel;
    VisNumericPanel4: TVisNumericPanel;
    Label4: TLabel;
    VisNumericPanel5: TVisNumericPanel;
    memo: TMemo;
    procedure ScadaUpdateTimerTimer(Sender: TObject);

    procedure FormActivate(Sender: TObject);
    procedure VisButtonDownChange(Sender: TObject);
    procedure VisButtonClick(Sender: TObject);
    procedure pnlDeviceNameClick(Sender: TObject);
    procedure VisButton4CanClick(Sender: TObject; var Can: Boolean);
    procedure btReverseCanClick(Sender: TObject; var Can: Boolean);
    procedure VisButton2CanClick(Sender: TObject; var Can: Boolean);
    procedure VisButton5CanClick(Sender: TObject; var Can: Boolean);
    procedure VisButton3CanClick(Sender: TObject; var Can: Boolean);
    procedure btStartClick(Sender: TObject);
    procedure btStopClick(Sender: TObject);
    procedure btExtErrClick(Sender: TObject);
    procedure btResetClick(Sender: TObject);
    procedure VisLabel1Click(Sender: TObject);
  private
    idxErrorflag: Integer;
    idxError: Integer;
    idxErrCode: Integer;
    procedure updateStatusMemo;
  public
    M: TVisInverterA;
    tagname: string;
  end;

var
  VisInverterAControlPanelForm: TVisInverterAControlPanelForm;

implementation
uses
  infodlg,
  InputDialog,
  users,
  MesConst,
  TrendWindow,
  meslogging,
  SetChannel,
  TagStorage,
  RpVisualGlobal,
  RpVisualLegacyPanels,
  RpVisualUtils,
  RpVisualMain;

{$R *.dfm}

// Таймер
procedure TVisInverterAControlPanelForm.ScadaUpdateTimerTimer(Sender: TObject);
begin
  CustomScanScadaObjects(self, UpdateDeviceProc);
  updateStatusMemo;
end;

procedure TVisInverterAControlPanelForm.updateStatusMemo;
var
  s: string;
  i: Integer;
begin
  s := '';
  if GetTagValue( idxErrorflag ) > 0 then
    s := s + 'Нет связи'#13#10#13#10;

  if GetTagValue( idxError ) > 0 then begin
    i := GetTagValue(idxErrCode);
    case i of
      01: s:=s + 'Сбой программы(CPF)'#13#10#13#10;
      02: s:=s + 'Сбой памяти (EPR)'#13#10#13#10;
      03: s:=s + 'Перенапряжение (0V)'#13#10#13#10;
      04: s:=s + 'Низкое напряжение (LV)'#13#10#13#10;
      05: s:=s + 'Перегрев (OН)'#13#10#13#10;
      10: s:=s + 'Перегрузка по току при торможении (OC-D)'#13#10#13#10;
      11: s:=s + 'Перегрузка по току при разгоне (OC-A)'#13#10#13#10;
      12: s:=s + 'Перегрузка по току при работе (OC-C)'#13#10#13#10;
      13: s:=s + 'Перенапряжение при работе (OV-C)'#13#10#13#10;
      14: s:=s + 'Перегрев при работе (OН-C)'#13#10#13#10; 
      15: s:=s + 'Превышение скорости (OV3F)'#13#10#13#10;
      16: s:=s + 'Прерывание процессора (CTER)'#13#10#13#10; 
      17: s:=s + 'Перегрузка по току при пуске (OCS)'#13#10#13#10; 
      20: s:=s + 'Перегрузка по току при останове (ОС)'#13#10#13#10;
      21: s:=s + 'Перегрузка двигателя (OL1)'#13#10#13#10; 
      22: s:=s + 'Перегрузка преобразователя (OL2)'#13#10#13#10;
      23: s:=s + 'Перегрузка по моменту (OL3)'#13#10#13#10; 
      24: s:=s + 'Низкое напряжение при работе (LV-C)'#13#10#13#10;
      29: s:=s + 'Ошибка восстановления заводских уставок (Err8)'#13#10#13#10;
      30: s:=s + 'Остановка на нулевой скорости (STPO)'#13#10#13#10;
      31: s:=s + 'Запрет пуска (STP 1)'#13#10#13#10;
      32: s:=s + 'Аварийный останов с пульта управления (STP2)'#13#10#13#10;
      33: s:=s + 'Аварийный останов от внешнего сигнала (E.S.)'#13#10#13#10;
      34: s:=s + 'Внешняя блокировка (b.b.)'#13#10#13#10;
      35: s:=s + 'Ошибка автонастройки (AT ER)'#13#10#13#10;
      36: s:=s + 'Потеря обратной связи (PDER)'#13#10#13#10;
      37: s:=s + 'Внешняя ошибка (EFO)'#13#10#13#10;
      38: s:=s + 'Потеря сигнала энкодера (ECER)'#13#10#13#10;
      39: s:=s + 'Ошибка аналогового сигнала (Err4)'#13#10#13#10;
      40: s:=s + 'Запрет изменения константы (LOC)'#13#10#13#10;
      41: s:=s + 'Запрет нажатия кнопки (Err1)'#13#10#13#10;
      42: s:=s + 'Ошибка установки константы (Err2)'#13#10#13#10;
      43: s:=s + 'Ошибка изменения константы (Err5)'#13#10#13#10;
      44: s:=s + 'Ошибка связи (Err6)'#13#10#13#10;
      45: s:=s + 'Некорректное значение константы (Err7)'#13#10#13#10;
    end;
  end;


  if memo.Text <> s then
    memo.Text := s;


end;


// Инициализация
procedure TVisInverterAControlPanelForm.FormActivate(Sender: TObject);
begin
  if M=nil then exit;

  SetPathRootScadaObjects(self, M.TagPath, M.TagRoot );
  pnlDeviceName.Caption := M.DeviceName;

  pnlSost.Visible := true;
  pnlControl.Visible := not M.HideControl;
  pnlBlok.Visible := true;


  idxErrorflag := GetTagIndex(M.TagPath + '.SYSTEM.ErrorFlag');
  idxError := GetTagIndex(M.TagPath + '.Error');
  idxErrCode := GetTagIndex(M.TagPath + '.ErrCode');


  // заготовка для получения имен тегов
  tagname := M.TagPath + '.' + M.TypeName1 + '_' + repl(M.TagName, M.TagIdRoot, M.TagRoot) + '_';



end;

// Жирный шрифт для нажатых кнопок
procedure TVisInverterAControlPanelForm.VisButtonDownChange(Sender: TObject);
begin
  with Sender as TVisButton do
    if objButton.Down then
      objButton.Font.Style := [fsBold]
    else
      objButton.Font.Style := [];
end;

// Параметры
procedure TVisInverterAControlPanelForm.VisButtonClick(Sender: TObject);
begin
  with sender as TVisButton do
    SaveMessageText(mcMode_text, M.DeviceName, Hint, mcMode_bc, mcMode_fc);
end;

procedure TVisInverterAControlPanelForm.pnlDeviceNameClick(Sender: TObject);
begin
  if m.OnlyDat then exit;

  ShowTrendWindow(
    M.DeviceName,
    tagname + 'Sost;' + tagname + 'Plata',
    'Состояние;Контроль',
    'mchb_',
    '',
    'Состояние: '#13+
    '  0 - выключено'#13+
    '  1 - работает'#13+
    '  2 - запуск'#13+
    '  3 - останов'#13+
    '  4 - авария'#13+
    '  5 - приостановлено'#13+
    '  7 - выключено, но фаза=1'#13+
    '  8 - неправильный адрес'
  );
end;

procedure TVisInverterAControlPanelForm.VisButton4CanClick(Sender: TObject;
  var Can: Boolean);
begin
end;

procedure TVisInverterAControlPanelForm.btReverseCanClick(Sender: TObject;
  var Can: Boolean);
begin
end;

procedure TVisInverterAControlPanelForm.VisButton2CanClick(Sender: TObject;
  var Can: Boolean);
begin
end;

procedure TVisInverterAControlPanelForm.VisButton5CanClick(Sender: TObject;
  var Can: Boolean);
begin
  Can := CheckAccess(PREVILEG_BLOK, true);
end;

procedure TVisInverterAControlPanelForm.VisButton3CanClick(Sender: TObject;
  var Can: Boolean);
begin
  Can := CheckAccess(PREVILEG_MCHMODE, true);
end;

procedure TVisInverterAControlPanelForm.btStartClick(Sender: TObject);
begin
  SetTagValueByName( M.TagPath + '.SetRun', 1);
  SaveMessageText('Изменение режима работы', M.DeviceName, 'Старт', clLime, clBlack);
end;

procedure TVisInverterAControlPanelForm.btStopClick(Sender: TObject);
begin
  SetTagValueByName( M.TagPath + '.SetRun', 0);
  SaveMessageText('Изменение режима работы', M.DeviceName, 'Стоп', clLime, clBlack);
end;

procedure TVisInverterAControlPanelForm.btExtErrClick(Sender: TObject);
begin
  if showInfoDlg('Установить аварию "Внешняя неисправность"?', mtConfirmation, mbOKCancel, 0) <> mrOk then Exit;
  SetTagValueByName( M.TagPath + '.SetExtErr', 1);
  SaveMessageText('Изменение режима работы', M.DeviceName, 'Внешняя авария', clLime, clBlack);
end;

procedure TVisInverterAControlPanelForm.btResetClick(Sender: TObject);
begin
  SetTagValueByName( M.TagPath + '.SetReset', 1);
  SaveMessageText('Изменение режима работы', M.DeviceName, 'Сброс аварии', clLime, clBlack);
end;

procedure TVisInverterAControlPanelForm.VisLabel1Click(Sender: TObject);
var
  s: string;
  r: real;
  v,i: Integer;
begin
  v := GetTagValueByName(M.TagPath + '.FreqReq');
  str(v/100:1:2, s);
  if not ShowInputDialog('Установка частоты', 'Частота, Гц', s) then
    exit;

  Val(s, r, i);
  v := round(r * 100);
  str(v/100:1:2, s);


  SetTagValueByName( M.TagPath + '.SetFreq', v);
  SaveMessageText('Установка частоты инвертера', M.DeviceName, 'F=' + s, clLime, clBlack);
end;

end.
