C# Modbus 数据读取 使用NModBus4库
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 |
Modbus Slave
这个是安装包ModbusSlaveSetup64Bit 注册码:4414147662


modbus通讯协议NET库
这样的开源库很多,我这边用的库是github的开源实现类库:NModBus4,github地址:https://github.com/NModbus4/NModbus4
我用Modbus Slave模拟一个从机

设置数据

NModbus4的读取从机代码示例
IPAddress address = new IPAddress(new byte[] { , , , });
using (TcpClient client = new TcpClient(address.ToString(), ))
{
client.SendTimeout = ;
//client.op
ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
//master.op
// read five input values
ushort startAddress = ;
ushort numInputs = ;
bool[] inputs = master.ReadCoils(, startAddress, numInputs);
for (int i = ; i < numInputs; i++)
{
Console.WriteLine($"Input {(startAddress + i)}={(inputs[i] ? 1 : 0)}");
}
}
这边值得注意的是主机Read的方法第一个参数是slaveId 如果不加就startAddress And numInputs NModbus就会默认 slaveId是0 一直异常( d(╯﹏╰)b 痛苦经历~~)

以上数据是 刚才设置的DO 状态
在演示一个读取AI的值


代码没差多少就是方法ReadInputRegisters不一样 . 以下是示例代码
IPAddress address = new IPAddress(new byte[] { , , , });
using (TcpClient client = new TcpClient(address.ToString(), ))
{
client.SendTimeout = ;
//client.op
ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
//master.op
// read five input values
ushort startAddress = ;
ushort numInputs = ;
ushort[] inputs = master.ReadInputRegisters(, startAddress, numInputs);
for (int i = ; i < numInputs; i++)
{
Console.WriteLine($"Register {(startAddress + i)}={(inputs[i])}");
}
}
C# Modbus 数据读取 使用NModBus4库的更多相关文章
- 使用Modbus批量读取寄存器地址
使用modbus单点读取地址是轮询可能会导致效率很低,频繁发送读取报文会导致plc响应时间拉长,批量读取可大大减少数据通信的过程,每次读取完成后,在内存中异步处理返回来的数据数组. modbus 功能 ...
- 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性
本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...
- Spark学习之数据读取与保存总结(一)
一.动机 我们已经学了很多在 Spark 中对已分发的数据执行的操作.到目前为止,所展示的示例都是从本地集合或者普通文件中进行数据读取和保存的.但有时候,数据量可能大到无法放在一台机器中,这时就需要探 ...
- 【转载】PyTorch系列 (二):pytorch数据读取
原文:https://likewind.top/2019/02/01/Pytorch-dataprocess/ Pytorch系列: PyTorch系列(一) - PyTorch使用总览 PyTorc ...
- TensorFlow走过的坑之---数据读取和tf中batch的使用方法
首先介绍数据读取问题,现在TensorFlow官方推荐的数据读取方法是使用tf.data.Dataset,具体的细节不在这里赘述,看官方文档更清楚,这里主要记录一下官方文档没有提到的坑,以示" ...
- flume-ng-sql-source实现oracle增量数据读取
一.下载编译flume-ng-sql-source 下载地址:https://github.com/keedio/flume-ng-sql-source.git ,安装说明文档编译和拷贝jar包 嫌麻 ...
- [Pytorch]PyTorch Dataloader自定义数据读取
整理一下看到的自定义数据读取的方法,较好的有一下三篇文章, 其实自定义的方法就是把现有数据集的train和test分别用 含有图像路径与label的list返回就好了,所以需要根据数据集随机应变. 所 ...
- [转帖]时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取
时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取 http://hbasefly.com/2018/05/02/timeseries-database-7/ 2018年5月2日 ...
- Pandas_数据读取与存储数据(全面但不精炼)
Pandas 读取和存储数据 目录 读取 csv数据 读取 txt数据 存储 csv 和 txt 文件 读取和存储 json数据 读取和存储 excel数据 一道练习题 参考 Numpy基础(全) P ...
随机推荐
- 6.redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
作者:中华石杉 面试题 redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的? 面试官心理分析 redis 如果仅仅只是将数据缓存在内存里面,如果 redi ...
- Linux shell case条件判断及位置变量
case语句使用于需要进行多重分支的应用情况 case分支判断结构 语法: case 变量名称 in value1) statement statemen ...
- django 基础进阶ORM COOKIE
ORM: class Book(models.Model): title=models.CharFiled(max_length=32) 类-----------------表 # Book- ...
- django 权限设置 左侧菜单点击显示,面包屑
1.左侧菜单点击显示 就是在点击的时候保留点击的功能 方法. 1.加入新的字段,pid来判断 class Permission(models.Model): """ 权限 ...
- adb 命令之push pull
C:\Users\ceshi>adb pull /storage/emulated/legacy/00001.vcf D:/E:\eclipse\Demo1>adb push E:\ecl ...
- getElementsByName兼容ie 但并不是兼容ie下的所有标签
document.getElementsByName('someName') 返回一个节点列表(数组) document.getElementById('id') 返回一个节点或者null 注意在IE ...
- Python 的AES加密与解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...
- 洛谷 P3368 【模板】树状数组 2 题解
P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个 ...
- Android studio中怎么导入android.support.v4包
Android studio中怎么导入android.support.v4包 1.File点击选择projectStructure选择对应的APP然后点击Dependencies 2.点击+号,点击第 ...
- C++ 重写虚函数的代码使用注意点+全部知识点+全部例子实现
h-------------------------- #ifndef VIRTUALFUNCTION_H #define VIRTUALFUNCTION_H /* * 派生类中覆盖虚函数的使用知识点 ...