文档章节

NModBus的使用

o
 osc_mervd488
发布于 2018/04/26 13:32
字数 767
阅读 0
收藏 0

  前言:最近在做一个项目,需要使用ModBus RTU与PLC进行通讯,现在将使用过程记录,以便备查。


 

一、什么是ModBus通讯协议

  Modbus协议是应用于电子控制器上的一种通用语言,此协议支持传统的RS-232、RS-422、RS-485和以太网设备。

  ModBus功能码

01 READ COIL STATUS
02 READ INPUT STATUS
03 READ HOLDING REGISTER
04 READ INPUT REGISTER
05 WRITE SINGLE COIL
06 WRITE SINGLE REGISTER
15 WRITE MULTIPLE COIL
16 WRITE MULTIPLE REGISTER

 

二、ModBus通讯协议的.Net实现

    因为实现并不困难,网上有许多网友自己的实现,但在这里我推荐一个github的开源实现类库:NModBus4,github地址:https://github.com/NModbus4/NModbus4。针对TCP、UDP、RTU等的ModBus通讯方式都有实现。

    

    读写方法:

方法名 作用 所需参数 返回值 对应功能码
ReadCoils 读取DO的状态

从站地址(8位)

byte slaveAddress

起始地址(16位)

 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

bool[] 01
ReadInputs 读取DI的状态

从站地址(8位)

byte slaveAddress

起始地址(16位)

 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

bool[] 02
ReadHoldingRegisters 读取AO的值

从站地址(8位)

byte slaveAddress

起始地址(16位) 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

ushort[] 03
ReadInputRegisters 读取AI的值

从站地址(8 位)

byte slaveAddress

起始地址(16位)

 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

ushort[] 04
WriteSingleCoil 写入值到DO

从站地址(8位)

byte slaveAddress

线圈地址(16位)

ushort coilAddress

写入值(布尔型)

bool value

无返回值 05
WriteSingleRegister 写入值到AO

从站地址(8位)

byte slaveAddress

寄存器地址(16位)

ushort registerAddress

写入值(16位)

ushort value

无返回值 06
WriteMultipleCoils 写多线圈寄存器

从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress

写入值(布尔型数组)

bool[] data

无返回值 15
WriteMultipleRegisters 写多个保持寄存器

从站地址(8位)

byte slaveAddress

 

起始地址(16位)

ushort startAddress,

寄存器值(16位整型数组)

ushort[] data

无返回值 16
ReadWriteMultipleRegisters 读写多个保持寄存器

从站地址(8位)

byte slaveAddress

读起始地址(16位)

ushort startReadAddress

 

读取数量(16位)

ushort numberOfPointsToRead,

写入起始地址(16位)

ushort startWriteAddress,

写入值(16位整型数组)

ushort[] writeData

ushort[] 23

    每个方法都有各自的异步方法实现。

 

    这里以RTU展示其使用方法:

 

 1    /// <summary>
 2          /// 创建 ModBus RTU 连接
 3          /// </summary>
 4          /// <param name="portName">端口号</param>
 5          /// <param name="baudRate">波特率</param>
 6          /// <param name="parity">奇偶校验位</param>
 7          /// <param name="dataBits">数据位</param>
 8          /// <param name="stopBits">停止位</param>
 9          /// <returns></returns>
10          public  IModbusSerialMaster CreateModBusRtuConnection(string portName,int baudRate,Parity parity,int dataBits,StopBits stopBits)
11          {
12               return CreateModBusRtuConnect(new SerialPort(portName, baudRate, parity, dataBits, stopBits));
13          }
14 
15          public  IModbusSerialMaster CreateModBusRtuConnection(SerialPort serialPort)
16          {
17             IModbusSerialMaster master = null;
18             if (!serialPort.IsOpen)
19             {
20                 try
21                 {
22                     serialPort.Open();
23                 }
24                 catch (Exception e)
25                 {
26                     throw e;
27                 }
28             }
29             try
30             {
31               master = ModbusSerialMaster.CreateRtu(serialPort);
32               ///同时也可以配置master的一些参数
33               master.Transport.ReadTimeout = 100;//读取数据超时100ms
34               master.Transport.WriteTimeout = 100;//写入数据超时100ms
35               master.Transport.Retries = 3;//重试次数
36               master.Transport.WaitToRetryMilliseconds = 10;//重试间隔
37 
38             }
39             catch(Exception e)
40             {                 throw e;
41             }
42             return master;
43         }
44     }
View Code

 

    

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Vue-插槽slot/具名插槽

插槽的基本使用: <div id="app"> <cpn> <span>我是替换slot的元素1</span> </cpn>------------------------------------- <cpn2> <span>......

心田已荒
21分钟前
12
0
标准Android按钮具有不同的颜色 - Standard Android Button with a different color

问题: I'd like to change the color of a standard Android button slightly in order to better match a client's branding. 我想稍微更改标准Android按钮的颜色,以便更好地匹配客户的品......

技术盛宴
38分钟前
24
0
如何在Ruby中生成随机字符串 - How to generate a random string in Ruby

问题: I'm currently generating an 8-character pseudo-random uppercase string for "A" .. "Z": 我目前正在为“ A” ..“ Z”生成一个8个字符的伪随机大写字符串: value = ""; 8.times{......

法国红酒甜
今天
20
0
原价500元的认证证书,限时免费考取!

本文作者:y****n 百度云智学院致力于为百度ABC战略(人工智能、大数据、云计算)提供人才生态体系建设,包括基于百度ABC、IoT的课程体系,整合百度优势技术能力的深度学习技术、Apollo无人车...

百度开发者中心
昨天
17
0
在virtualenv中使用Python 3 - Using Python 3 in virtualenv

问题: Using virtualenv , I run my projects with the default version of Python (2.7). 使用virtualenv ,我使用默认版本的Python(2.7)运行项目。 On one project, I need to use Pyth......

富含淀粉
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部