当前位置: 首页 > news >正文

Modbus入门

Modbus入门

  • Modbus
    • Modbus模拟工具
      • 模拟工具使用
        • 配置Slave
        • 配置Poll
    • C#使用ModBus通讯
    • 在无法使用 SerialPort类 的情况下使用TCP进行

Modbus

modbus使用范围广泛,广泛应用于各类仪表,PLC等。它属于应用层协议,底层硬件基于485/以太网。

Modbus的存储区有:输入线圈(布尔,只读,代号1区),输入寄存器(寄存器,只读,代号3区),输出线圈(读写,布尔,代号0区),输出寄存器(寄存器,读写,代号4区)

Modbus是典型的半双工模式,有且只有一个master,请求由master发出,slave响应。slave之间不能通讯,只能通过master转达。相当于master是客户端,slave都是服务器。

Modbus模拟工具

模拟工具使用Modbus Slave 以及 Modbus Poll 。其中 Slave相当于服务器(Modbus Slave),Poll相当于客户端(Modbus Master)。

模拟工具使用

配置Slave

配置Slave
在这里插入图片描述
基本配置,配置完选择ok,接下来只要配置要使用的接口方式(网卡,串口等)

在这里插入图片描述
在这里插入图片描述
选择接口方式,选择串口,初始化波特率、数据位、校验位、停止位,然后选择ok即可打开链接。
在这里插入图片描述

配置Poll

打开Poll选择需要进行的操作
在这里插入图片描述

选择写入可以寄存器,会发现Slave这边对应的已经改变了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上面type中可以写入浮点数等类型。

C#使用ModBus通讯

使用NuGet中的NModbus4通讯库,进行ModBus RTU(串口)通讯

namespace ModusCommunication
{internal class Program{static void Main(string[] args){ModuleHandle moduleHandle = new ModuleHandle();   // NuGet 安装 NModbus4 库// 确定通讯方式 这边是串口SerialPort port = new SerialPort("COM2");// 波特率port.BaudRate = 9600;// 数据位port.DataBits= 8;// 停止位port.StopBits = StopBits.One;// 校验位port.Parity = Parity.None;port.Open();var master = ModbusSerialMaster.CreateRtu(port);//  读取保持型寄存器  slaveid 寄存器起始位置 读取个数ushort [] values = master.ReadHoldingRegisters(1,10,2);Console.WriteLine($"index 10:{values[0]},index 11:{values[1]}");// 写入保持型寄存器  slaveid 在18号寄存器 写入 133master.WriteSingleRegister(1, 18, 133);// 读写线圈型寄存器 bool [] coils = master.ReadCoils(2, 0, 3);Console.WriteLine($"index 0:{coils[0]},index 2:{coils[2]}");// 写入线圈状态 将2号线圈寄存器值改为falsemaster.WriteSingleCoil(2, 2, false);// 在10寄存器处写入浮点数(实际占用10,11两个寄存器)master.WriteFloat(1, 10, 3.14f);Console.WriteLine($"写入浮点数:3.14");// 读取浮点数  浮点数在Modbus中是由两位寄存器构成(一位寄存器是16bit)float val = master.ReadFloat(1, 10, 2);Console.WriteLine($"浮点数 index 10-11:{val}");Console.ReadLine();port.Close();}}
}public  static class NModbusExtensions
{/// <summary>/// 从寄存器中读取float值/// </summary>/// <param name="master"></param>/// <param name="slaveAddress"></param>/// <param name="startAddress"></param>/// <param name="numberOfPoints"></param>/// <returns></returns>/// <exception cref="Exception"></exception>public static float ReadFloat(this ModbusSerialMaster master , byte slaveAddress, ushort startAddress, ushort numberOfPoints){try{float? floatValue;ushort[] registers = master.ReadHoldingRegisters(slaveAddress, startAddress, 2); // 2寄存器对应一个浮点数if (registers.Length == 2){// 从两个16位整数重新组合为浮点数ushort intValue1 = registers[1]; // 低位ushort intValue2 = registers[0]; // 高位byte[] bytes = new byte[4];Buffer.BlockCopy(new ushort[] { intValue1, intValue2 }, 0, bytes, 0, 4);floatValue = BitConverter.ToSingle(bytes, 0);return floatValue.Value;}else{throw new Exception();}}catch(Exception ex){throw new Exception("读取失败");}}/// <summary>/// 向寄存器中写入浮点数/// </summary>/// <param name="master"></param>/// <param name="slaveAddress"></param>/// <param name="startAddress"></param>/// <param name="value"></param>public static void WriteFloat(this ModbusSerialMaster master, byte slaveAddress, ushort startAddress, float value){// 将浮点数转换为字节数组byte[] bytes = BitConverter.GetBytes(value);// 提取字节数组中的两个16位整数ushort intValue1 = BitConverter.ToUInt16(bytes, 0); // 低位ushort intValue2 = BitConverter.ToUInt16(bytes, 2); // 高位master.WriteMultipleRegisters(slaveAddress, startAddress, new ushort[] { intValue2, intValue1 });}}

在这里插入图片描述

在无法使用 SerialPort类 的情况下使用TCP进行

在Web以及移动端是不能使用SerialPort的,这时候可以使用TCP进行链接
在slave连接配置中是有ip地址以及端口的,可以通过这个进行ModbusTcp通讯
在这里插入图片描述

NuGet 安装 ModbusTcp 包


static async void ModbusTCPTest()
{ModbusTcp.ModbusClient client = new ModbusTcp.ModbusClient("127.0.0.1", 502);client.Init();// 读取一个 整数short[] values = await client.ReadRegistersAsync(15,1);Console.WriteLine($"index 15:{values[0]}");// 读取两个浮点数float[] value = await client.ReadRegistersFloatsAsync(10, 4);Console.WriteLine($"index 10-11:{value[0]},index 12-13:{value[1]}");
}

在这里插入图片描述

相关文章:

Modbus入门

Modbus入门 ModbusModbus模拟工具模拟工具使用配置Slave配置Poll C#使用ModBus通讯在无法使用 SerialPort类 的情况下使用TCP进行 Modbus modbus使用范围广泛&#xff0c;广泛应用于各类仪表&#xff0c;PLC等。它属于应用层协议&#xff0c;底层硬件基于485/以太网。 Modbus的…...

Sysmon 日志监控

系统监视器 &#xff08;Sysmon&#xff09; 是一个 Windows 日志记录加载项&#xff0c;它提供精细的日志记录功能并捕获默认情况下通常不记录的安全事件。它提供有关进程创建、网络连接、文件系统更改等的信息。分析 Sysmon 日志对于发现恶意活动和安全威胁至关重要。 在不断…...

JWT(JSON web token)的三个组成部分

每日鸡汤&#xff1a;每个你想要学习的瞬间都是未来的你向自己求救 前几天去考 系统架构师的考试&#xff0c;有一道案例分析题就是关于JWT的&#xff0c;作为一个前端工程师&#xff0c;我居然没答上来&#xff0c;真的气的拍大腿&#xff0c;但凡再努力一点呀&#xff01;这次…...

CUDA学习笔记7——CUDA内存组织

CUDA内存组织 CUDA设备内存的分类与特征 内存类型物理位置访问权限可见范围生命周期1全局内存芯片外可读写所有线程和主机端由主机分配与释放2常量内存芯片外只读所有线程和主机端由主机分配与释放3纹理和表面内存芯片外一般只读所有线程和主机端由主机分配与释放4寄存器内存…...

C#把自启动程序添加到注册表中

1.Regedit自启动注册表路径 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 2.获取运行程序路径 SetAutoStart(AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.BaseDirectory); 3.添加到注册表中&#xff0c;如果注册表已经存…...

Java面试题(每天10题)-------连载(26)

目录 多线程篇 1、什么是FutureTask&#xff1f; 2、什么是同步容器和并发容器的实现&#xff1f; 3、什么是多线程的上下文切换&#xff1f; 4、ThreadLocal的设计理念与作用&#xff1f; 5、ThreadPool&#xff08;线程池&#xff09;用法与优势&#xff1f; 6、Concur…...

通用型 SPI-Flash 相关知识汇总(w25q16\q64,gd25q128\q256)

目录 管脚定义&#xff1a; 常用指令&#xff1a; GD25q16: gd25Q28 ​编辑 gw25q16 ​编辑 芯片丝印说明&#xff1a; GD系列&#xff1a; winbond系列&#xff1a; Read Identification&#xff08;9FH&#xff09;&#xff1a; 常见ID&#xff1a; GD: ​编辑…...

鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用

一、了解超级终端模拟器支持的设备情况 该特性在DevEco Studio V2.1 Release及更高版本中支持。 目前超级终端模拟器支持“PhonePhone”、“PhoneTablet”和“PhoneTV”的设备组网方式&#xff0c;开发者可以使用该超级终端模拟器来调测具备跨设备特性的应用/服务&#xff0c;如…...

抖音AAN服务商有几家?

大家都知道抖音服务商多如牛毛&#xff0c;有本地生活服务商&#xff0c;MCN机构服务商&#xff0c;企业认证服务商&#xff0c;ISV服务商等等。但是aan服务商就屈指可数。 aan技术服务商 从关系层面讲&#xff0c;aan服务商的关系友好到啥程度呢&#xff0c;就好比微信指定了…...

10-26 maven配置

打开idea 打开setting 基于Idea创建idea项目 加载jar包&#xff1a;(一般需要自己去手动加入&#xff0c;本地仓库是没有的)...

贰[2],OpenCV函数解析

1&#xff0c;imread&#xff1a;图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename)&#xff1a;文件地址 //参数2(flags):读取标志 注:ImreadModes&#xff0c;参数2(flags)枚举定义 enum ImreadModes { IMREAD…...

探秘Python闭包与作用域

文章目录 闭包的定义与作用LEGB规则nonlocal与global关键字在Python的世界里,理解闭包(Closure)和作用域(Scope)是提升编程技巧和深度的一大步。这篇文章将带你深入了解闭包的神秘面纱,掌握LEGB规则,并使用nonlocal与global关键字来巧妙控制变量作用域。 闭包的定义与作…...

GPT-4V:AI在教育领域的应用

OpenAI于9月25日发布了最新的GPT-4V模型&#xff0c;为ChatGPT引入了语音和图像功能&#xff0c;为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验&#xff0c;用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…...

自动化之Java面试

1.重写与重载的区别 重载规则&#xff1a; 方法名相同&#xff0c;参数个数或类型不同&#xff0c;与返回值类型无关&#xff0c;节约词汇,例如driver.switchTo().frame&#xff08;index/nameOrId/frameElement&#xff09; java的重载(overload) 最重要的应用场景就是构造器…...

Redis中的Zset类型

目录 Zset的相关命令 zadd zrange zcard zcount zrevrange zrangebyscore zpopmax bzpopmax zpopmin和bzpopmin zrank zrevrank zscore zrem zremrangebyrank zremrangebyscore 操作集合间的命令 zinterstore和zunionstore 内部编码 Zset的应用场景 Zset表…...

Python行对齐工具difflib

1 用途 1.1 功能 对比两个字符串数组之间的差异&#xff0c;以第一个参数为基准&#xff0c;与第二个参数比较。 1.2 使用场景 一个原文件&#xff0c;一个改过的文件&#xff0c;对比差异&#xff1b;一个纯文本&#xff0c;一个带格式的&#xff0c;对比差异&#xff1b;…...

Flutter利用GridView创建网格布局实现优美布局

文章目录 简介使用详解导入依赖项创建一个基本的 GridView一些参数说明使用GridView.count来构造 其他控制总结 简介 GridView 是 Flutter 中用于创建网格布局的强大小部件。它允许你在行和列中排列子小部件&#xff0c;非常适合显示大量项目&#xff0c;例如图像、文本、卡片…...

IDEA 基本配置

IDEA 基本配置 1、基本样式2、环境参数3、基本插件4、参考 1、基本样式 设置全局字体大小 配置font 字体大小&#xff1a;15 配置类注释 /** ** Author: ${USER}* Date: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}* Version: 1.0.0 */配置注释keymap 添加 注释 ccm&…...

计算机组成原理平时作业一

计算机组成原理平时作业一 1.单选题 1.1计算机中使用总线结构便于增减外设&#xff0c;同时&#xff08;c &#xff09;。 a.减少了信息传输量 b.提高了信息传输量 c.减少了信息传输量的条数 d.三者均正确 答案解析&#xff1a; 概念规定 1.2在定点补码运算器中&#xff0c;…...

iOS Crash 治理:淘宝VisionKitCore 问题修复

本文通过逆向系统&#xff0c;阅读汇编指令&#xff0c;逐步找到源码&#xff0c;定位到了 iOS 16.0.<iOS 16.2 WKWebView 的系统bug 。同时苹果已经在新版本修复了 Bug&#xff0c;对于巨大的存量用户&#xff0c;仍旧会造成日均 Crash pv 1200 uv 1000&#xff0c; 最终通…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...