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方法将多个输出寄存器的值写入从设备。需要指定从设备地址和起始地址以及要写入的寄存器值数组。

 

 

 

posted @ 2024-06-04 10:17  陌念  阅读(90)  评论(0)    收藏  举报