当前位置: 首页 > 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; 最终通…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...