Modbus是工业电子设备间通信的业界标准,可通过串口、以太网以及其他支持互联网协议的网络进行通信。
Modbus有以下的优势 :
- Modbus协议是开源免费的,任何工业通讯传感器设备等都可以使用。
- Modbus支援多种常见工控接口(RS232, RS485, TCP/IP etc.),且可以各种物理层装置上传输(双绞线、光纤、无线等)。
- Modbus格式简单易于开发。
- Modbus能够将众多设备连接到DCS, PLC系统上,再利用中控(云、中央计算机)进行监控与下达指令,以便于集中式控制。
Modbus通信协议是一个主-从架构,在整个Modbus通讯网路中能够同时拥有多个从机但是只允许拥有一个专门发送请求的的主机。
Modbus是一个一主多从协议(最多可连接247台从机,所以从机地址范围在1~247之间),只有在主机发出请求时从机才会做出回应,从机之间不能相互沟通。
每条主机所发出的指令,都包含一个从机地址,每台主机都会收到该请求,都只有符合该地址的主机才会回应该请求。
ModbusRTU是利用RS485作为物理层实现的Modbus通信协议,也是现代工业通信中使用广泛的通讯连接方式,这种方式的连接抗干扰能力强,连接速率稳定,适应工业的恶劣环境。
硬件设备连接完成后,我们需要使用专用的客户端来作为Modbus主机读取其中的数据,我们可以使用Smart物联网开发平台来制作ModbusRTU通讯连接测试的示例。
示例的布局界面如下,在Smart物联网开发平台中以下布局的示例可以很快做到。
功能实现的部分程序如下:
procedure TMyHandler.BitBtn01Click;
//BitBtn01的OnClick事件,对应的Modbus功能码为01 读取线圈寄存器,可选择读取单个或者多个寄存器的数据
begin
FThis.ModbusClient1.ReadCoils(1,2,nil); //从地址1开始,读取两位
end;
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;
procedure TMyHandler.BitBtn05Click;
//BitBtn05的OnClick事件,对应的Modbus功能码为05 写单个线圈寄存器
begin
FThis.ModbusClient1.WriteSingleCoil(1,True,nil);
FThis.Memo1.Lines.Add('写单个线圈寄存器:1');
end;
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;
保存设计后,不需要执行编译操作,直接运行就可以启用程序功能。此处可以使用相关仿真软件或者实体Modbus协议通讯的设备连接来进行。
仿真软件切换至线圈寄存器模式,点击[01 读取线圈寄存器]
,程序读取对应的线圈寄存器位址并返回读取结果。点击[05 写单个线圈寄存器]
,程序向单个线圈寄存器位址写入数据并返回结果。点击[15 写多个线圈寄存器]
,程序向多个线圈寄存器位址写入数据并返回结果。
仿真软件切换至离散输入寄存器模式,点击[02 读取离散输入寄存器]
,程序读取对应的离散输入寄存器位址并返回读取结果。
仿真软件切换至保持寄存器模式,点击[03 读取保持寄存器]
,程序读取对应的保持寄存器位址并返回读取结果。点击[06 写单个保持寄存器]
,程序向单个保持寄存器位址写入数据并返回结果。点击[16 写多个保持寄存器]
,程序向多个保持寄存器位址写入数据并返回结果。
仿真软件切换至输入寄存器模式,点击[04 读取输入寄存器]
,程序读取对应的输入寄存器位址并返回读取结果。