NModBus的使用
前言:最近在做一个项目,需要使用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展示其使用方法:
/// <summary>
/// 创建 ModBus RTU 连接
/// </summary>
/// <param name="portName">端口号</param>
/// <param name="baudRate">波特率</param>
/// <param name="parity">奇偶校验位</param>
/// <param name="dataBits">数据位</param>
/// <param name="stopBits">停止位</param>
/// <returns></returns>
public IModbusSerialMaster CreateModBusRtuConnection(string portName,int baudRate,Parity parity,int dataBits,StopBits stopBits)
{
return CreateModBusRtuConnect(new SerialPort(portName, baudRate, parity, dataBits, stopBits));
} public IModbusSerialMaster CreateModBusRtuConnection(SerialPort serialPort)
{
IModbusSerialMaster master = null;
if (!serialPort.IsOpen)
{
try
{
serialPort.Open();
}
catch (Exception e)
{
throw e;
}
}
try
{
master = ModbusSerialMaster.CreateRtu(serialPort);
///同时也可以配置master的一些参数
master.Transport.ReadTimeout = ;//读取数据超时100ms
master.Transport.WriteTimeout = ;//写入数据超时100ms
master.Transport.Retries = ;//重试次数
master.Transport.WaitToRetryMilliseconds = ;//重试间隔 }
catch(Exception e)
{ throw e;
}
return master;
}
}
NModBus的使用的更多相关文章
- NModbus类库使用
通过串口进行通信 : 1.将 NMobus 类库导入工程中,添加引用.命名空间.工程属性必须配置 为 .NET 4.0. 2.创建 SerialPort 类的一个实例,配置参数,打开串口,如: pub ...
- C# NModbus RTU通信实现
Modbus协议时应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络/串口和其它设备之间可以进行通信.它已经成为了一种工业标准.有了这个通信协议,不同的厂商生成的控制设备就可 ...
- 开源项目 Modbus C#实现
刚刚上线,内容不断完善... Modbus协议中文版下载 http://files.cnblogs.com/badnewfish/Modbus%E5%8D%8F%E8%AE%AE%E4%B8%AD%E ...
- 推荐一本书:清华出版的《Modbus软件开发实战指南》
前言: 最近在研究Modbus开发,如果只是简单的了解了一些modbus基础知识,但是不够系统和全面. 其实,modbus虽然比较简单,但是如果不注意有很多坑,特别是寄存器的位数,大小端处理,浮点数, ...
- freemodbus移植讲解 ZZ
一 为什么要移植Freemodbus 为什么要移植Freemodbus,这个问题需要从两个方面来回答.第一,modbus是一个非常好的应用层协议,它很简洁也相对完善.对于还没有接触过modbus的 ...
- .net core跨平台应用研究-ubuntu core下配置.net core运行时
引言 年初研究了一阵子.net core跨平台应用,先后发表了几篇应用研究的文章.因工作原因,忙于项目上线,有一阵子没来博客园写文章了.最近项目基本收尾,抽空翻了下自己的博客,廖廖几篇文章,真让人汗颜 ...
- C# Modbus 数据读取 使用NModBus4库
ModBus通讯协议 方法名 作用 所需参数 返回值 对应功能码 ReadCoils 读取DO的状态 从站地址(8位) byte slaveAddress 起始地址(16位) ushort start ...
- C#ModBus Tcp的学习及Master的实现
Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式. 所以这也是我们工控领域软件开发的所必懂的通讯协议,我也是初次学习,先贴上我的学习笔记 一 ...
- C# 使用modbus 读取PLC 寄存器地址
使用的组件Nmodbus 定义参数,全局变量: //创建modbus实体对象 private static ModbusFactory modbusFactory; private static IM ...
随机推荐
- URL编码和Base64编码 (转)
我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码. 先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...
- css3兼容IE8的方案 各个ie的hack
虽然现在很多项目已经对低版本IE不要求了,但是还有部分公司对IE8还是很执着的,咱作为屌丝前端程序员不能和老板说前端潮流,不能说趋势,只能动脑子了,下面就分享一些css3兼容ie8的方案思路.主要是实 ...
- MySQL 主从复制那些事(一)
本部分主要以理论为主,具体的主从搭建环境,大家可以参考博客其他部分.下面我就给大家数说主从复制那些理论的东西.说的不一定都是正确的,有不同出入的地方,欢迎大家一起交流沟通,以下我把我自己整理出来的主从 ...
- maven入门(8)maven的依赖管理
我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置 依赖可以声明如下: <project> ... <dependenci ...
- SpringBoot实现多环境配置
1.为什么需要配置多环境配置 在实际的开发中,我们往往需要在不同的环境中使用不同的数据库.缓存配置,如果使用同一套配置文件,在不同环境部署的时候手动去修改配置文件,会使部署变得很繁琐.使用多环境配置文 ...
- Python之函数基础
1.函数的定义与调用 函数从大方针上考虑总共分为两种:一种是内置函数,另一种是自定义函数.今天主要讲的是自定义函数. s = '金老板小护士' #len(s) def my_len(): #自定义函数 ...
- jdk的server模式修改无效(关于client和server模式)
本机为64位操作系统,64位jdk,win10. 修改C:\Program Files\Java\jre8\lib\amd64\jvm.cfg无效. 我的文件的内容为: 原因参考如下: http:// ...
- JavaScript(js)/上
JavaScript(js) ECMA-----定义的基础语法 DOM------document object model BOM------Browser object model Jav ...
- Java基础之关键字,标识符,变量
Java基础 首先,来看一下Java基础知识图解,以下便是在java学习中我们需要学习设计到的一些知识(当然不是很完全). 这些都是接下来在以后的学习中我们会学到的一些知识. 1 关键字 首次先来学习 ...
- Ubuntu 18.04 LTS修改 国内源(以中科大源为例)
国内有很多Ubuntu的镜像源,包括阿里的.网易的,还有很多教育网的源,比如:清华源.中科大源. 我们这里以中科大的源为例讲解如何修改Ubuntu 18.04里面默认的源. 可以进入这个链接进行下载: ...