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

📄 modlinkdemomain.pas

📁 ModLink VCL component 组件以及代码。版本是shareware edition of ModLink 2.10
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  with Item do
  begin
    Caption := IntToStr(PServerItem(Data)^.Addr);
    SubItems[0] := ItemKinds[PServerItem(Data)^.Kind];
    if PServerItem(Data)^.Kind in [ikCoil, ikDiscreteInput] then
    begin
      SubItems[1] := Booleans[Boolean(PServerItem(Data)^.Value)];
      SubItems[2] := 'N/A';
      SubItems[3] := 'N/A';
    end
    else
    begin
      SubItems[1] := IntToStr(PServerItem(Data)^.Value);
      SubItems[2] := IntToStr(PServerItem(Data)^.MinValue);
      SubItems[3] := IntToStr(PServerItem(Data)^.MaxValue);
    end;
    if PServerItem(Data)^.Kind in [ikCoil, ikHoldingRegister] then
        SubItems[4] := StatusMessages[PServerItem(Data)^.Writeable]
      else
        SubItems[4] := StatusMessages[False];
  end;
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ValidateRegisterMaskWriteGroupBox;
begin
  ValidateNumberInEditBox(MaskWriteRegAddrEdit, 0, High(Word));
  ValidateNumberInEditBox(AndMaskEdit, 0, High(Word));
  ValidateNumberInEditBox(OrMaskEdit, 0, High(Word));
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ValidateDiscreteReadGroupBox;
begin
  ValidateNumberInEditBox(ReadStartBitEdit, 0, High(Word));
  ValidateNumberInEditBox(ReadBitCountEdit, 1, 2008);
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ValidateDiscreteWriteGroupBox;
begin
  ValidateNumberInEditBox(WriteStartBitEdit, 0, High(Word));
  ValidateNumberInEditBox(WriteBitCountEdit, 1, 1976);
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ValidateRegisterReadGroupBox;
begin
  ValidateNumberInEditBox(ReadStartRegEdit, 0, High(Word));
  ValidateNumberInEditBox(ReadRegCountEdit, 1, 125);
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ValidateRegisterWriteGroupBox;
begin
  ValidateNumberInEditBox(WriteStartRegEdit, 0, High(Word));
  ValidateNumberInEditBox(WriteRegCountEdit, 1, 123);
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.FileExitItemClick(Sender: TObject);
begin
  Close;
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ToolsConnectionOptionsItemClick(Sender: TObject);
begin
  try
    try
      if EditModbusConnection(ModbusConnection1, 'Modbus Connection Options') then
      begin
        AccessSettings(GetSettingsFileName, SaveSettings);
        ModbusConnection1.Open;
      end;
    except
      on E: Exception do
      begin
        LogString(Format('Failed to open Modbus connection. %s'#13#10, [E.Message]));
        raise;
      end;
    end;
  finally
    ConnectionModeChanged;
    UpdateConnectionStatus;
  end;
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ToolsClientOptionsItemClick(Sender: TObject);
const
  SCaptionFmt = 'Modbus Client Options';
  SPrompt = 'Enter the address of a remote server ' +
    '(acceptable values are 1 through 247):';
var
  S: string;
  NewAddress: Byte;
begin
  S := IntToStr(ModbusClient1.ServerAddress);
  if InputQuery(SCaptionFmt, SPrompt, S) then
  begin
    try
      NewAddress := Byte(StrToInt(S));
    except
      on E: EConvertError do
      begin
        E.Message := Format('''%s'' is not a valid server address.', [S]);
        raise;
      end
      else raise;
    end;
    ModbusClient1.ServerAddress := NewAddress;
    AccessSettings(GetSettingsFileName, SaveSettings);
    UpdateConnectionStatus;
  end;
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.HelpAboutItemClick(Sender: TObject);
begin
  ShowModLinkAboutBox;
end;


//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ReadCoilsButtonClick(Sender: TObject);
var
  StartBit, BitCount: Word;
  ID: Cardinal;
begin
  ValidateDiscreteReadGroupBox;
  StartBit := Word(StrToInt(ReadStartBitEdit.Text));
  BitCount := Word(StrToInt(ReadBitCountEdit.Text));
  ID := ModbusClient1.ReadCoils(StartBit, BitCount);
  LogInit(ID, 'Read Coils (code $01)');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ReadDiscreteInputsButtonClick(Sender: TObject);
var
  StartBit, BitCount: Word;
  ID: Cardinal;
begin
  ValidateDiscreteReadGroupBox;
  StartBit := Word(StrToInt(ReadStartBitEdit.Text));
  BitCount := Word(StrToInt(ReadBitCountEdit.Text));
  ID := ModbusClient1.ReadDiscreteInputs(StartBit, BitCount);
  LogInit(ID, 'Read Discrete Inputs (code $02)');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.WriteSingleCoilButtonClick(Sender: TObject);
var
  S: string;
  BitAddr: Word;
  BitValue: Boolean;
  ID: Cardinal;
begin
  with DiscreteListView.Items[0] do
  begin
    S := Caption;
    System.Delete(S, 1, Length('Coil '));
    BitAddr := Word(StrToInt(S));
    BitValue := Checked;
  end;

  if DiscreteBroadcastCheckBox.Checked then
  begin
    ID := ModbusConnection1.WriteSingleCoil(BitAddr, BitValue);
    LogInit(ID, 'Write Single Coil (code $05)');
    LogBroadcast;
  end
  else
  begin
    ID := ModbusClient1.WriteSingleCoil(BitAddr, BitValue);
    LogInit(ID, 'Write Single Coil (code $05)');
  end;
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.WriteMultipleCoilsButtonClick(Sender: TObject);
var
  S: string;
  StartBit, BitCount: Word;
  BitValues: TBitValues;
  I: Integer;
  ID: Cardinal;
begin
  with DiscreteListView.Items[0] do
  begin
    S := Caption;
    System.Delete(S, 1, Length('Coil '));
    StartBit := Word(StrToInt(S));
  end;

  BitCount := DiscreteListView.Items.Count;
  SetLength(BitValues, BitCount);

  try
    for I := 0 to BitCount - 1 do
      BitValues[I] := DiscreteListView.Items[I].Checked;

    if DiscreteBroadcastCheckBox.Checked then
    begin
      ID := ModbusConnection1.WriteMultipleCoils(StartBit, BitValues);
      LogInit(ID, 'Write Multiple Coils (code $0F)');
      LogBroadcast;
    end
    else
    begin
      ID := ModbusClient1.WriteMultipleCoils(StartBit, BitValues);
      LogInit(ID, 'Write Multiple Coils (code $0F)');
    end;
  finally
    Finalize(BitValues);
  end;
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ModbusClient1CoilsRead(Sender: TModbusClient;
  const Info: TTransactionInfo; BitStart, BitCount: Word;
  const BitValues: TBitValues);
var
  I: Integer;
begin
  LogDone(Info.ID, 'Read Coils (code $01)');
  LogStatus(Info);
  if Info.Reply = srNormalReply then
  begin
    LogProcessedBits(BitCount, True);
    for I := 0 to BitCount - 1 do
      LogSingleBit(BitStart + I, BitValues[I], True);
  end;
  LogString('');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ModbusClient1DiscreteInputsRead(
  Sender: TModbusClient; const Info: TTransactionInfo; BitStart,
  BitCount: Word; const BitValues: TBitValues);
var
  I: Integer;
begin
  LogDone(Info.ID, 'Read Discrete Inputs (code $02)');
  LogStatus(Info);
  if Info.Reply = srNormalReply then
  begin
    LogProcessedBits(BitCount, False);
    for I := 0 to BitCount - 1 do
      LogSingleBit(BitStart + I, BitValues[I], False);
  end;
  LogString('');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ModbusClient1SingleCoilWrite(Sender: TModbusClient;
  const Info: TTransactionInfo; BitAddr: Word; BitValue: Boolean);
begin
  LogDone(Info.ID, 'Write Single Coil (code $05)');
  LogStatus(Info);
  if Info.Reply = srNormalReply then
  begin
    LogProcessedBits(1, True);
    LogSingleBit(BitAddr, BitValue, True);
  end;
  LogString('');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ModbusClient1MultipleCoilsWrite(
  Sender: TModbusClient; const Info: TTransactionInfo; BitStart,
  BitCount: Word; const BitValues: TBitValues);
var
  I: Integer;
begin
  LogDone(Info.ID, 'Write Multiple Coils (code $0F)');
  LogStatus(Info);
  if Info.Reply = srNormalReply then
  begin
    LogProcessedBits(BitCount, True);
    for I := 0 to BitCount - 1 do
      LogSingleBit(BitStart + I, BitValues[I], True);
  end;
  LogString('');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ModbusConnection1FrameSend(
  Sender: TModbusConnection; const Data: TFrameData);
begin
  LogFrame(Data, True);
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ModbusConnection1FrameReceive(
  Sender: TModbusConnection; const Data: TFrameData);
begin
  LogFrame(Data, False);
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ReadHoldingRegistersButtonClick(Sender: TObject);
var
  StartReg, RegCount: Word;
  ID: Cardinal;
begin
  ValidateRegisterReadGroupBox;
  StartReg := Word(StrToInt(ReadStartRegEdit.Text));
  RegCount := Word(StrToInt(ReadRegCountEdit.Text));
  ID := ModbusClient1.ReadHoldingRegisters(StartReg, RegCount);
  LogInit(ID, 'Read Holding Registers (code $03)');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.ReadInputRegistersButtonClick(Sender: TObject);
var
  StartReg, RegCount: Word;
  ID: Cardinal;
begin
  ValidateRegisterReadGroupBox;
  StartReg := Word(StrToInt(ReadStartRegEdit.Text));
  RegCount := Word(StrToInt(ReadRegCountEdit.Text));
  ID := ModbusClient1.ReadInputRegisters(StartReg, RegCount);
  LogInit(ID, 'Read Input Registers (code $04)');
end;

//--------------------------------------------------------------------------------------------------

procedure TModLinkDemoMainForm.WriteSingleRegisterButtonClick(Sender: TObject);
var
  S: string;
  RegAddr, RegValue: Word;
  ID: Cardinal;
begin
  with RegisterListView.Items[0] do
  begin
    S := SubItems[0];
    System.Delete(S, 1, Length('Register '));
    RegAddr := Word(StrToInt(S));

    S := Caption;
    RegValue := Word(StrToInt(S));
  end;

  if RegisterBroadcastCheckBox.Checked then
  begin
    ID := ModbusConnection1.WriteSingleRegister(RegAddr, RegValue);
    LogInit(ID, 'Write Single Register (code $06)');
    LogBroadcast;
  end
  else

⌨️ 快捷键说明

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