ModbusRTU控件使用
# Smart之ModbusRTU控件使用
# 1. 说明
范例实现ModbusRTU控件的使用。为使用ModbusRTU协议进行通信的设备调试提供基础。Modbus是工业界广泛使用的通信协议,使用控件可用于控制工业设备,采集数据信息等功能。在使用以下功能之前,需提前在PC设备上安装Modbus Slave或者其他Modbus仿真软件,开启ModbusRTU协议,并使用虚拟串口的软件(比如Virtual Serial Port Driver等)建立虚拟串口用于调试。
通过范例学习,可以掌握ModbusClient的使用方式以及ModbusConnection的配置方法。
# 2. 设计明细
开启Smart智慧控制平台,分别加入下插图之控件。或者通过点击菜单栏[文件]-[打开项目]
选择范例项目文件来打开该范例。

①:TImage组件,控件名称为Image1
。
②:TModbusClient组件,控件名称为ModbusClient1
。
③:TLabel组件,控件名称为Label1
。
④:TMemo组件,控件名称为Memo1
。
⑤:TModbusConnection,控件名称为ModbusConnection1
。
⑥:TBitBtn组件,控件名称为BitBtn01
。
⑦:TBitBtn组件,控件名称为BitBtn02
。
⑧:TBitBtn组件,控件名称为BitBtn03
。
⑨:TBitBtn组件,控件名称为BitBtn04
。
⑩:TBitBtn组件,控件名称为BitBtn05
。
(11):TBitBtn组件,控件名称为BitBtn06
。
(12):TBitBtn组件,控件名称为BitBtn15
。
(13):TBitBtn组件,控件名称为BitBtn16
。
Main窗体属性设置
Caption
:设置窗体标题=ModbusRTU控件使用
。ClientHeight
:设置窗体显示区的高度=394
。ClientWidth
:设置窗体显示区的宽度=533
。
①Image1属性设置
Align
:设置对齐方式,设定为alClient
。Stretch
:设置图片拉伸对齐,设定为True
。Picture
:设置图片。点击Picture
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。
②ModbusClient1属性设置
Connection
:设置控件的连接配置,此处选择为ModbusConnection1
。
③Label1属性设置
AutoSize
:设置控件大小与字体自适应=True
。Caption
:设置显示标签的内容=ModbusRTU控件使用
。Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
④Memo1属性设置
Height
:设定控件高度=149
。Width
:设定控件宽度=460
。
⑤ModbusConnection1属性设置
BaudRate
:串口通信速率设定,此处设置为br9600
。DataBits
:设定串口单次传输的数据位数,此处设置为db8
。Parity
:设定串口通信的校验方式,此处设置为psEven
。Port
:设定串口的通信端口,仿真软件端则应设置在虚拟串口工具中配对的对应端口,例如在虚拟串口配对工具中将COM5与COM6相连接,在Modbus仿真软件中设置的端口为COM5,则在控件中设置为COM6
。StopBits
:设定串口通信的停止位,此处设置为sb1
。
⑥BitBtn01属性设置
Caption
:设定按钮显示的文字内容,设定为01 读取线圈寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn01
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
⑦BitBtn02属性设置
Caption
:设定按钮显示的文字内容,设定为02 离散输入寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn02
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
⑧BitBtn03属性设置
Caption
:设定按钮显示的文字内容,设定为03 读取保持寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn03
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
⑨BitBtn04属性设置
Caption
:设定按钮显示的文字内容,设定为04 读取输入寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn04
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
⑩BitBtn05属性设置
Caption
:设定按钮显示的文字内容,设定为05 写单个线圈寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn05
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
(11)BitBtn06属性设置
Caption
:设定按钮显示的文字内容,设定为06 写单个保持寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn06
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
(12)BitBtn15属性设置
Caption
:设定按钮显示的文字内容,设定为15 写多个线圈寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn15
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
(13)BitBtn16属性设置
Caption
:设定按钮显示的文字内容,设定为16 写多个线圈寄存器
。Height
:设定控件高度=33
。Width
:设定控件宽度=220
。Name
:设定控件名称,为BitBtn16
。Glyph
:设定按钮显示的图片。点击Glyph
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。仅支持bmp格式的图片。
# 3. 程序设计
# 3.1. 程序初始设置
在程序启动时,建立ModbusRTU通信。
constructor TMyHandler.Create(AOwner: TComponent);
begin
FThis :=TBaseForm(AOwner);、
//建立Modbus连接
FThis.ModbusConnection1.Active := True;
end;
2
3
4
5
6
- ⑥BitBtn01-OnClick事件
点击该按钮,读取线圈寄存器数据。
procedure TMyHandler.BitBtn01Click;
//BitBtn01的OnClick事件,对应的Modbus功能码为01 读取线圈寄存器,可选择读取单个或者多个寄存器的数据
begin
FThis.ModbusClient1.ReadCoils(1,2,nil); //从地址1开始,读取两位
end;
2
3
4
5
- ②ModbusClient1-OnCoilsRead事件
当读取线圈寄存器数据时返回结果。
procedure TMyHandler.ModbusClient1CoilsRead;
//ModbusClient1的OnCoilsRead事件,用于获取读取线圈寄存器的结果
var
i:Integer;
begin
FThis.Memo1.Lines.Add('线圈寄存器读取结果:');
for i := Low(BitValues) to High(BitValues) do
begin
if BitValues[i] then
FThis.Memo1.Lines.Add('True')
else
FThis.Memo1.Lines.Add('False')
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
- ⑦BitBtn02-OnClick事件
点击该按钮,读取离散输入寄存器数据。
procedure TMyHandler.BitBtn02Click;
//BitBtn02的OnClick事件,对应的Modbus功能码为02 读取离散输入寄存器,可选择读取单个或者多个寄存器的数据
begin
FThis.ModbusClient1.ReadDiscreteInputs(1,2,nil);
end;
2
3
4
5
- ②ModbusClient1-OnDiscreteInputsRead事件
当读取离散输入寄存器数据时返回结果。
procedure TMyHandler.ModbusClient1DiscreteInputsRead;
//ModbusClient1的OnDiscreteInputsRead事件,用于获取读取离散输入寄存器的结果
var
i:Integer;
begin
FThis.Memo1.Lines.Add('离散输入寄存器读取结果:');
for i := Low(BitValues) to High(BitValues) do
begin
if BitValues[i] then
FThis.Memo1.Lines.Add('True')
else
FThis.Memo1.Lines.Add('False')
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
- ⑧BitBtn03-OnClick事件
点击该按钮,读取保持寄存器数据。
procedure TMyHandler.BitBtn03Click;
//BitBtn03的OnClick事件,对应的Modbus功能码为03 读取保持寄存器,可选择读取单个或者多个寄存器的数据
begin
FThis.ModbusClient1.ReadHoldingRegisters(1,2,nil);
end;
2
3
4
5
- ②ModbusClient1-OnHoldingRegistersRead事件
当读取保持寄存器数据时返回结果。
procedure TMyHandler.ModbusClient1HoldingRegistersRead;
//ModbusClient1的OnHoldingRegistersRead事件,用于获取读取保持寄存器的结果
var
i:Integer;
begin
FThis.Memo1.Lines.Add('保持寄存器读取结果:');
for i := Low(RegValues) to High(RegValues) do
begin
FThis.Memo1.Lines.Add(IntToStr(RegValues[i]));
end;
end;
2
3
4
5
6
7
8
9
10
11
- ⑨BitBtn04-OnClick事件
点击该按钮,读取输入寄存器数据。
procedure TMyHandler.BitBtn04Click;
//BitBtn04的OnClick事件,对应的Modbus功能码为04 读取输入寄存器,可选择读取单个或者多个寄存器的数据
begin
FThis.ModbusClient1.ReadInputRegisters(1,2,nil);
end;
2
3
4
5
- ②ModbusClient1-OnInputRegistersRead事件
当读取输入寄存器数据时返回结果。
procedure TMyHandler.ModbusClient1InputRegistersRead;
//ModbusClient1的OnInputRegistersRead事件,用于获取输入寄存器读取结果
var
i:Integer;
begin
FThis.Memo1.Lines.Add('输入寄存器读取结果:');
for i := Low(RegValues) to High(RegValues) do
begin
FThis.Memo1.Lines.Add(IntToStr(RegValues[i]));
end;
end;
2
3
4
5
6
7
8
9
10
11
- ⑩BitBtn05-OnClick事件
点击该按钮,写入单个线圈寄存器。
procedure TMyHandler.BitBtn05Click;
//BitBtn05的OnClick事件,对应的Modbus功能码为05 写单个线圈寄存器
begin
FThis.ModbusClient1.WriteSingleCoil(1,True,nil);
FThis.Memo1.Lines.Add('写单个线圈寄存器:1');
end;
2
3
4
5
6
- (11)BitBtn06-OnClick事件
点击该按钮,写入单个保持寄存器。
procedure TMyHandler.BitBtn06Click;
//BitBtn06的OnClick事件,对应的Modbus功能码为06 写单个保持寄存器
begin
FThis.ModbusClient1.WriteSingleRegister(1,123,nil);
FThis.Memo1.Lines.Add('写单个保持寄存器:123');
end;
2
3
4
5
6
- (12)BitBtn15-OnClick事件
点击该按钮,写入多个线圈寄存器。
procedure TMyHandler.BitBtn15Click;
//BitBtn15的OnClick事件,对应的Modbus功能码为15 写多个线圈寄存器
var
v: TBitValues;
begin
SetLength(v,3);
v[0] := True;
v[1] := False;
v[2] := True;
FThis.ModbusClient1.WriteMultipleCoils(1,v,nil);
FThis.Memo1.Lines.Add('写多个线圈寄存器:True,False,True');
end;
2
3
4
5
6
7
8
9
10
11
12
- (13)BitBtn16-OnClick事件
点击该按钮,写入多个保持寄存器。
procedure TMyHandler.BitBtn16Click;
//BitBtn16的OnClick事件,对应的Modbus功能码为16 写多个保持寄存器
var
v: TRegValues;
begin
SetLength(v,3);
v[0] := 1;
v[1] := 123;
v[2] := 224;
FThis.ModbusClient1.WriteMultipleRegisters(1,v,nil);
FThis.Memo1.Lines.Add('写多个保持寄存器:1,123,224');
end;
2
3
4
5
6
7
8
9
10
11
12
# 4. 运行模板
通过工具栏保存,将程序保存为 sdb 项目文件。
使用鼠标点击工具栏运行(Run),测试运行结果。

仿真软件切换至线圈寄存器模式,点击[01 读取线圈寄存器]
,程序读取对应的线圈寄存器位址并返回读取结果。点击[05 写单个线圈寄存器]
,程序向单个线圈寄存器位址写入数据并返回结果。点击[15 写多个线圈寄存器]
,程序向多个线圈寄存器位址写入数据并返回结果。
仿真软件切换至离散输入寄存器模式,点击[02 读取离散输入寄存器]
,程序读取对应的离散输入寄存器位址并返回读取结果。
仿真软件切换至保持寄存器模式,点击[03 读取保持寄存器]
,程序读取对应的保持寄存器位址并返回读取结果。点击[06 写单个保持寄存器]
,程序向单个保持寄存器位址写入数据并返回结果。点击[16 写多个保持寄存器]
,程序向多个保持寄存器位址写入数据并返回结果。
仿真软件切换至输入寄存器模式,点击[04 读取输入寄存器]
,程序读取对应的输入寄存器位址并返回读取结果。