📄 modlinkdemomain.pas
字号:
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 + -