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 ...
随机推荐
- Python内置函数(21)——tuple
英文文档: The constructor builds a tuple whose items are the same and in the same order as iterable's it ...
- Docker学习笔记 - Docker容器与外部网络的连接
学习目的: ip_forward 包过滤防护墙 iptables 允许端口映射访问 限制ip访问容器 1.ip_forward 控制系统是否会转发流量 检查linux系统转发是否开启命令:sysctl ...
- ssh_maven之controller层开发
我们已经完成了前两层的开发,现在 只剩下我们的controller层了,对于这一层,我们需要创建一个动作类CustomerAction,另外就是我们的strutss.xml以及我们的applicati ...
- C++中const对象和非const对象调用成员函数问题
一.类MyClass 二.主函数调用 三.结果
- 南京邮电大学java第二次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...
- enumerate给列表加索引
>>> list = ['a','b','c'] >>> for i,j in enumerate(list): print(i,j) 0 a 1 b 2 c &g ...
- Text-查找文本
from tkinter import * master=Tk() text=Text(master,width=30,height=5) text.pack() text.insert(INSERT ...
- 前端开发必备之Chrome开发者工具(下篇)
本文介绍的 Chrome 开发者工具基于 Chrome 65版本,如果你的 Chrome 开发者工具没有下文提到的那些内容,请检查下 Chrome 的版本 本文是 前端开发必备之Chrome开发者工具 ...
- Java图形界面学习---------简易登录界面
/** * @author Administrator * Java图形界面学习---------简易登录界面 * date:2015/10/31 */ import java.awt.BorderL ...
- [ABP]浅谈工作单元 在整个 ABP 框架当中的应用
ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...