Moubus
Modbus 通信协议,是一种工业现场总线协议标准。
Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,主要有以下三种:
Modbus RTU、Modbus ASCII和Modbus TCP
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave
优势: 免费、简单、容易使用
缺点:根据第一个字节就发现从站地址就一个字节只能带动255个设备,请求的从站地址若为0,则为广播模式,从站不做响应;240以后的保留,所以就是 1-239
从站只能等待主站发送信息才回复,不会主动给主站发送数据
只可以有一个主站

1 存储区代号

Modbus有4个寄存器,分别是:
01寄存器:也叫线圈寄存器,存放bit位数据,可读写,对应功能码为01H
02寄存器:也叫输入线圈寄存器,存放bit位数据,只读,对应功能码为02H
03寄存器:也叫保持寄存器,存放字数据,可组合表达更多数据类型,可读写,对应功能码为03H
04寄存器:也叫输入寄存器,存放字数据,可组合表达更多数据类型,只读,对应功能码为04H
2 存储区范围
上面的是绝对地址6位,实际不会使用,只是用作文档 、够用、对接
下面的是相对地址5位:实际用的就是这个

3 功能码
类似业务指令,比如1 表示登陆 2 表示登出

4 协议分类
4.1 MoudusRTU 没有标识头 、标识尾

5 报文




0x01、0x02 获取线圈状态
请求
01(从站地址) 01(功能码 Function:读取线圈状态) 00 00 (起始地址 )00 0A (读取长度 即为十进制的10) BC 0D (CRC16)
响应
01(从站地址) 01(功能码 Function:读取线圈状态) 02(后续字节数) 0E 00 (数据) BD 9C(CRC16)
0E 输出状态7-0,即为 二进制的 0000 1110
00 输出状态15-8,即为二进制的 0000 0000
string s= Convert.ToString(0x0E, 2).PadLeft(8,'0');
char[] ss=s.ToArray();
foreach (char item in ss)
{
bool res= item == '1';
}


功能码-0x03读保持寄存器 一个寄存器有2个字节
主机发送: 01(从站地址) 03(功能码) 00 00(开始地址 )00 01(读取个数) 84 0A (CRC16)
从机回复: 01(从站地址) 03(功能码) 02 (后续字节数) 12 34 {数据} B5 33 (CRC16)
功能码-0x06写单个寄存器
主机发送: 01 (从站地址) 06 (功能码) 00 00 (开始地址 ) 00 01 (修改的值) 48 0A(CRC16)
从机回复: 01 (从站地址) 06 (功能码) 00 00 (开始地址 ) 00 01 (修改的值)48 0A (CRC16)
功能码-0x10写多个寄存器 一个寄存器有2个字节,如果你写个folat4个字节这时候就要用0x10
主机发送: 01 (从站地址) 10 (功能码) 00 00 (开始地址 ) 00 01(修改的寄存器数量) 02 (后续字节数)11 22 (修改的值) 2A 19 (CRC16)
从机回复: 01 (从站地址) 10 (功能码) 00 00 (开始地址 ) 00 01(修改的寄存器数量)01 C9 (CRC16)
6 仿真工具使用
Configure Virtual Serial Port Driver 虚拟成对的串口
Modbus Slave 从站
ModbusPoll 主站
1 添加 10 11 一对串口

2 Modbus Slave 从站 Com10

点击链接 就会将NO connecton 删除,
设置参数,最多能设置10000个参数

3 ModbusPoll 主站 com 11


7 NMoudbus 使用
打开串口连接 向COM1端口发出请求
SerialPort serialPort = new SerialPort("COM1");
//设置串口基本参数
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.StopBits=StopBits.One;
serialPort.Parity = Parity.None;
serialPort.Open();
ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);
读取线圈数据

读取离散线圈数据

读取保存寄存器

读取输入寄存器

写入单线圈
写入单寄存器
写入多线圈
写入多寄存器
打开串口连接:使用SerialPort类打开与Modbus RTU从设备的串口连接。需要设置串口参数,如波特率、数据位、校验位和停止位等。
创建Modbus RTU客户端实例:使用ModbusSerialMaster类的CreateRtu方法创建一个Modbus RTU客户端实例,该实例将用于与从设备进行通信。
设置从设备地址:通过设置slaveAddress属性来指定要与之通信的从设备的地址。
读取输入线圈:使用ReadCoils方法读取从设备的输入线圈的状态。需要指定从设备地址和起始地址以及要读取的线圈数量。
读取输出寄存器:使用ReadHoldingRegisters方法读取从设备的输出寄存器的值。需要指定从设备地址和起始地址以及要读取的寄存器数量。
读取输入寄存器:使用ReadInputRegisters方法读取从设备的输入寄存器的值。需要指定从设备地址和起始地址以及要读取的寄存器数量。
写单个输出线圈:使用WriteSingleCoil方法将单个输出线圈的状态写入从设备。需要指定从设备地址和要写入的线圈地址以及线圈状态。
写单个输出寄存器:使用WriteSingleRegister方法将单个输出寄存器的值写入从设备。需要指定从设备地址和要写入的寄存器地址以及要写入的值。
写多个输出线圈:使用WriteMultipleCoils方法将多个输出线圈的状态写入从设备。需要指定从设备地址和起始地址以及要写入的线圈状态数组。
写多个输出寄存器:使用WriteMultipleRegisters方法将多个输出寄存器的值写入从设备。需要指定从设备地址和起始地址以及要写入的寄存器值数组。

浙公网安备 33010602011771号