自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 四轴运动控制系统 — 博客四 Modbus TCP/RTU 通信、大端字节序、数据轮询与异常处理

结论:ABCD = 大端模式。Q2: “大端对应低地址存放高字节,值 1 存放为 0000 0001,数组 0 是低地址,所以把 0001 放进去了?”答:混淆了两个概念——“16 位寄存器内部字节序"和"两个寄存器之间的顺序”。答:对,这是寄存器级别的理解。Q4: Bit 层面最左边永远是高位,地址层面最左边就是低位?答:对,两个不同的维度。Q5: 断开连接后 MessageBox 一直弹窗怎么修复?答:轮询异常的 catch 块中缺少"只弹一次"的标志位控制。原因: 每隔 200ms 触发一

2026-06-23 00:08:31 46

原创 四轴运动控制系统 — 博客三:ViewModel + XAML 前后端交互

用户操作 XAML → 绑定触发 ICommand → ViewModel 逻辑 → Service 通信 → 结果写回属性 → 属性通知 → UI 刷新。

2026-06-21 18:15:41 277

原创 四轴运动控制系统 — 博客二:服务层 (Services)

知识点代码说明抽象类不能直接 new,必须继承抽象方法子类必须 override,强迫实现protectedMaster只有子类能访问,外部看不到空包容运算符Master!告诉编译器"我知道它不为 null"支持 using 或手动 Dispose。

2026-06-21 18:14:55 257

原创 四轴运动控制系统 — 博客一:数据模型层 (Models)

决策理由CommConfig 单独一个类与服务层解耦,方便未来从配置文件/数据库加载AxisStatus 用枚举类型安全,XAML 直接显示文字AxisData 组合 + 嵌套避免 12 个 float 平铺在 ViewModel 里AxisParam 独立通知嵌套属性变化时 UI 自动更新默认值全部初始化即可用下一篇博客二:服务层 — Modbus 通信基类与 RTU/TCP 实现。

2026-06-21 18:14:19 221

原创 四轴运动控制第一篇 - WPF MVVM 基础框架搭建

作用:定义整个应用程序中所有窗口和控件都可以引用的全局资源。在这里我们定义了 14 个颜色画刷,实现统一的暗色主题风格。-- 背景色 - 深蓝黑 --> < SolidColorBrush x: Key = " BackgroundBrush " Color = " #1B1B2F " /> <!-- 面板色 - 深蓝 --> < SolidColorBrush x: Key = " PanelBrush " Color = " #162447 " /> <!

2026-06-20 20:59:05 331

原创 # WPF 学习第四天 — SQLite 数据库入门与实践

SQLite 是一个嵌入式关系型数据库引擎,它不是传统的客户端-服务器架构,而是直接把数据库写在一个.db 文件中。│ 你的 C# 程序 ││ │ │▼│ PlcData.db │ ← 一个文件,全部数据都在这里点击“执行 SQL”-- 查询写入历史-- 按轴号统计SELECT axis_id, COUNT(*) AS 次数 FROM read_plc GROUP BY axis_id;-- 查询最后 10 条SQLite = 单文件 + 零配置 + 轻量级嵌入式数据库↓。

2026-06-18 20:52:48 228

原创 WPF 学习第三天 — Modbus RTU 串口通信

Modbus 是一种工业通信协议,广泛应用于 PLC、传感器、驱动器等工业设备之间的通信。字节序(Endianness)是指多字节数据在内存中的存放顺序。假设我们有一个 16 位整数0x1234字节序低位地址高位地址说明大端(Big-Endian, AB CD)0x120x34高位字节存低地址小端(Little-Endian, CD AB)0x340x12低位字节存低地址大端:像写数字一样,先写高位(0x12 0x34小端:反过来,先写低位(0x34 0x12拿0x1234。

2026-06-16 22:52:38 752

原创 # WPF 学习记录( 第二天)

用 Dictionary 只收集有值的字段,用 LINQ Select + string.Join 一次性展示。禁掉中文输入法,因为 PreviewTextInput 对 IME 拦截不可靠。分隔符数量 = 元素数量 - 1。集合为空返回空字符串。),用 for 循环逐个检查每个字符是否合法。返回 null,自动取消粘贴。只有 1 个字符,但粘贴时。从索引 n 到字符串末尾。剪贴板不是文本时(如图片),行自然被推到窗口底部。

2026-06-13 23:56:58 842

原创 c#学习WPF笔记(一)

一个基于的 PLC 监控面板雏形,通过批量生成轴控制行(Label + TextBox + Button),为后续写入 PLC 做准备。

2026-06-12 23:45:20 763

原创 并发单词频率统计器 - 从零到完整实现(C# 实战)

异步编程(Task并发控制(lock、线程安全)正则表达式(、单词分割)文件 I/O(异步读写、目录操作)集合高级用法(嵌套字典、LINQ、元组)用户交互(循环输入、异常处理)本项目可以作为学习上位机开发的起点,后续可以扩展为工业数据采集与监控系统。

2026-06-03 18:59:57 290

原创 C# WinForms 后台轮询 Modbus 数据与 UI 更新实践

如何在 WinForms 中使用后台线程执行周期性的通信任务利用实现优雅的线程退出理解前台线程与后台线程的区别,并通过设置防止进程残留使用lock保护共享串口资源,避免多线程冲突跨线程安全更新 UI 的Invoke模式Modbus 保持寄存器中多字节浮点数的解析(低字在前 + 小端转换)稳定的串口连接管理(含自动重连监控)后台实时数据轮询安全、无残留的程序退出机制本系列持续记录我学习 C# 与 Modbus RTU 通信的每一步,欢迎参考与交流。

2026-05-24 20:47:02 486

原创 C# 与 PLC Modbus RTU 通信实践:从单例到线程安全的连接监控

掌握的核心技能本文记录了我学习用 C# 通过 Modbus RTU 协议与 PLC 通信的过程。内容涵盖RtuConnect类的设计思路、关键代码解析、线程安全的考虑、连接状态监控以及优雅的程序退出机制。技能分类具体内容单例模式C# 中线程安全的单例模式实现(Lazy<T>串口通信使用进行串口通信配置Modbus 协议NModbus 库的 RTU 主站建立连接监控用后台线程实现连接状态监控与自动重连线程同步锁与线程同步在通信场景中的正确使用资源管理程序生命周期中资源清理的可靠方式。

2026-05-24 19:45:02 413

原创 从宿主机(Windows)通过 NAT 模式连接虚拟机(Ubuntu)中的 MySQL

环境:Windows 宿主机 + VMware Workstation(Ubuntu 虚拟机,NAT 网络)目标:从宿主机通过本地网络连接虚拟机内的 MySQL,并允许 Java 等程序远程访问。

2026-04-05 23:00:25 729

原创 S7-1500 常用工业通信协议详解与对比

本文系统梳理了西门子S7-1500 PLC常用的工业通信协议,包括PUT/GET、Modbus RTU/TCP、开放式用户通信(OUC)和PROFINET。通过对比分析各协议的物理层特性、传输机制、性能指标及应用场景,为工程师提供选型参考。PUT/GET适合西门子PLC间简单通信;Modbus RTU适用于远距离低速传输,TCP适合高速以太网环境;OUC提供UDP/TCP两种方式;PROFINET则满足实时性要求高的工业场景。文中还给出协议对比表格和典型应用建议,帮助用户根据距离、速率、可靠性等需求选择合适

2026-03-31 09:59:04 474

原创 网络编程原理:回显服务器与客户端通信交互功能

交换机是因为路由器的LAN口过少,而需要连接到路由器的节点过多,这时候交换机的WAN通过连接路由器的LAN口,然后通过交换机的LAN口来连接其他的路由器的WAN或者电脑,来实现层层连接,构成更复杂的网络结构。在计算机中,通过网络,可以让两个主机之间相互通信,在实现相互通信的过程时,需要我们开发者通过应用程序(应用层)通过系统的API与传输层进行交互。在网络中,本质是通过光/电信号来传输数据,通过低电平表示1,高电平表示0 ,高频光信号表示1 ,低频光信号表示0。

2024-12-29 16:05:39 7978 112

原创 Java多线程第三篇-多线程的代码相关案例

而上述代码中,如果线程1和线程2在执行的过程中,线程1可能会在编译器中为了优化从而将创建对象的步骤打乱,由原来的123,可能修改为132步骤,直接将将一个地址给到instance,这时候给到t2的是一个非空的非法对象,这时候因为不为空,t2直接返回该结果,这时候t2可以访问到属性方法,就会导致出现bug。在懒汉模式中,我们将类成员定义为null,初次创建对象是在条件中进行的,而当我们在条件中时,因为多线程是同时执行,我们这时候可能会因为多个条件成立而进入从而new出多个对象,这样会导致线程不安全。

2024-12-23 12:13:54 1510 79

原创 Java多线程第二篇-线程的常用方法和线程安全

我们可以减少读取的次数,通过sleep睡眠来限定load的读取次数,此时就不会出发内存可见性问题,但是什么时候代码会被JVM优化,我们人是不清楚的,只有机器清除,所以我们尽量使用volatile更保险一些,此方法知道即可。这时候就陷入一种嵌套循环,形成死锁。如果有两把锁设a、b,线程1获取到锁a,然后线程2也获取到锁b,这时候线程1嵌套获取b锁,线程2嵌套获取a锁,则循环等待锁释放,进不去出不来。所谓的可重入锁,指的是一个线程,一把锁,加锁两次,会出现死锁,就是“不可重入“,反之,就是”可重入“。

2024-12-23 12:13:33 2049 42

原创 Java多线程第一篇-认识多线程

当重写Thread方法时,run和start都是Thread的成员属性,run描述了线程的入口(线程要做的事情)start才是真正的调用了系统的API,在系统中创建出了线程,让线程在调用run。,操作系统目前包含多个进程而每个进程中包含着单个或者多个线程,一个进程由多个PCB(线程)来表示在代码中,如果进程出错后,不会影响到其他的进程的资源分配。线程的身份标识,类似于PID,标记一个进程中唯一的线程,是java提供的id,而不是API或者PCB提供的id。状态、优先级、上下文、记账信息…

2024-12-19 18:20:41 2662 88

原创 macOs中配置环境变量进入mysql

这时候我们直接mysql -u root -p直接进入mysql数据库。如果是bash输入以下命令。

2024-12-16 17:15:12 1983 41

原创 git 多人协作开发

最后查看是否删除。

2024-12-16 17:14:35 3395 66

原创 git企业的使用详细命令行操作

git是Linux创始人通过内核开发而创作的分布式版本的控制系统,而我们作为开发者需要开发与维护,避免不了版本的迭代和更新,git就是用来保存修改删除等操作的工具,可以记录代码改动情况,它能够保存代码的每个版本,每个版本文件中修改和删除git都会跟踪,通过追踪的方式使得开发者能够更有效率的获取到之前的版本,让开发的效率提高。这里的HEAD指针指向master通过 cat .git/HEAD查看。

2024-12-14 22:53:50 3844 88

原创 MySQL语句学习第四篇_数据库:通过intellij IDE连接MySQL数据库使用JDBC实现增删查改

MySQL语句学习第四篇_数据库通过intellij IDE连接MySQL数据库使用JDBC来实现增删查改本章的专栏📚➡️本博客前一章节指向➡️。

2024-12-10 10:17:08 6136 106

原创 MySQL语句学习第三篇_数据库

MySQL语句学习第三篇_数据库本章的专栏📚➡️本博客前一章节指向➡️。

2024-12-06 17:48:56 6495 92

原创 MySQL语句学习第二篇_数据库

mysql服务器上有很多表,将许多具有关联关系的表放在一起,构成一个数据集合,被称之为数据库,在mysql服务器上可以有多个这样的数据库。在查询的时候,写做由列名构成的表达式,把这一列中的所有行带入到表达式中,之后参与运算,这里查询的时候,是把服务器的数据读出来后返回给了客户端,以临时表的形式来进行展示。mysql的服务器,是真正的本体,复杂保存和管理数据,数据都存储在硬盘中。硬盘:速度慢,空间大,硬盘数据持久保存,成本费用低。内存:速度快,空间小,内存数据容易丢失,成本费用高。,操作后返回给客户端。

2024-12-03 22:17:44 8603 97

原创 MacOS 命令行详解使用教程

本章讲述MacOs命令行详解的使用教程,感谢大家观看。本人博客:如烟花般绚烂却又稍纵即逝的主页MacOs命令行前言:在 macOS 上,Terminal(终端) 是一个功能强大的工具,它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS 命令行的基础与进阶操作,帮助你更高效地使用 Mac。文章目录一、什么是终端与 Shell1.1 终端介绍1.2 Shell 的作用二、终端的基本操作2.1 打开终端2.2 基本命令三、文件与目录操作3.1 查看当前目录3.2 切换目录3.3 创建

2024-12-03 16:44:21 11869 49

原创 Tree搜索二叉树、map和set_数据结构

HashSet是java集合框架中Set的常用类。HashSet不允许存储重复元素的集合,它使用哈希表来存储元素(val),确保每一个元素是唯一的,时间复杂度为O(1).HashMap是java集合框架Map的常用类。HashMap也是用哈希表通过key键值来存储val,与HashMap不同,它通过key键值来存储,元素可以相同,但是key键值一单相同val值就会被覆盖掉。

2024-12-01 20:09:50 3180 94

原创 六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

1.2 希尔排序二.选择排序2.1 单向选择排序2.2双向选择排序2.3 堆排序堆序详情堆排序三.交换排序3.1 冒泡排序3.2 快速排序3.2.1 Hoare排序这里定义一个left为左,right为右,将任意左右位置两边定义一个基准值,根据基准值的大小,直到left为大于基准值数,right为小于基准值数停下,若定义左边为基准值则右边先走,同理右边为基准值左边先走。

2024-11-28 13:35:01 12662 98

原创 非递归遍历二叉树(数据结构)

因为中序遍历是左根右,给定一个辅助栈,每次走到最后一个节点的left或者right为空时将栈中的元素给到数组,然后再去遍历栈顶右边元素是否为空。在数据结构中的学习难免少不了递归的学习,递归有时候也会让代码变得更加简洁,学习递归让我们对代码有更近一步的思考。每遍历一个节点打印一次元素且将其放入栈中,直到为空时,将栈顶元素移除来并打印并让其查看另一子树是否为空节点。二叉树的遍历方式有:前序遍历、中序遍历、后续遍历,层序遍历,而树的大部分情况下都是通过递归的方式来进行的。

2024-11-25 22:31:16 1961 73

原创 数据结构优先级队列PriorityQueue

我们使用大根堆来进行排序,将0下标值与最后下标值进行交换,end为最后下标值,然后向下筛选重新获取最大的节点值,每次的有效元素数量-1(由最后一个下标开始–直到为0,获取由小到大的元素)。而优先级队列(PriorityQueue)指的是具有优先级别的队列(特殊队列),根据指定类型的大小,每次出队的元素都是该类型中最大或者是最小的值,具有优先级。删除元素我们可以将对首的元素将队尾的元素进行互换,并将队尾元素的下标值删除,后续进行覆盖,然后通过向下筛选,设定根节点为0下标互换的位置,进行向下筛选。

2024-11-25 22:27:59 3150 41

原创 二叉树oj题解析

最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节点。也就是说这两个节点在树中距离最近的相交例如:8 与6中的最近公共节点为2,因为他的最大深度就是2(在同一颗子树中)。8与4的最近公共节点为3,因为他的最大深度是3(在左右两棵子树中的情况)。

2024-11-22 23:06:37 1269 47

原创 数据结构在二叉树Oj中利用子问题思路来解决问题

如果a释放完且a树的值给到了一维数组后,会得到b和c两个子树并放到队列中,这时候需要一个计数器来计算当前的层数,当层数为0时,我们将一维数组所有的值放到二维数组中就好了。这里当我们递出去时,我们就会减少一层当k等于1时,这里我们就在k层找到一个节点然后回归到父节点然后继续子树找下一个节点,知道将k层的节点数遍历完。只判断了根的节点的话它的左右子树的差确实为1,但是左子树中b的左子树和右子树的差值为2,这也不是一个平衡的二叉树。(ret如果为空,说明root根或者递归的条件就是空的,没有要找的元素)

2024-11-20 20:58:50 3956 78

原创 使用Mac下载MySQL修改密码第一篇_数据库

MySQL官网当进入到官网后下滑到community社区,进行下载然后选择community sever下载这里就是要下载的界面,如果需要下载之前版本的话可以点击archives,可能会因为这是外网原因,有时候下载会很慢,但是多下载几次一定会下载来的,然后我们就一直点安装,这里注意在安装后会跳出来一个窗口,这里面有你的初始密码,这里我们跳过安装步骤。如果是没有保存初始密码后,无法配置好MySQL。

2024-11-18 17:14:08 5807 53

原创 数据结构树和二叉树知识点和递归序列

完全二叉树:在二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶子结点集中在左子树的位置上,如果没有集中在左树则不是一个非完全二叉树。树是一种数据结构,它是由n个或大于n个的结点来组成具有层次关系的一个集合(一个树及n个子树的关系集合):在任意的二叉树中,若叶子结点的个数为n0,度为1的结点数为n1,度为2的结点数为n2。:度为0的结点称为叶子结点/终端结点(不含有子树的结点)。:若该结点含有子结点,则这个结点称为子结点的父亲结点。:一个结点中含有子树的根结点称为该结点的子结点。

2024-11-18 17:13:52 1432 28

原创 Java的栈与队列以及代码实现

栈分为栈顶和栈底,最先进的为栈底,最后进的为栈顶。队列分为队头和队尾,最先进的为队头,最后进的为队尾。

2024-11-15 10:49:54 6905 57

原创 LeetCode通过栈解题逆波兰表达式 有效的括号 栈的压入、弹出序列 最小栈 清除数字

对计算机而言中缀表达式是非常复杂的结构。相对来说,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。*我们将其中缀式的中每一个括号内对应的符号位置放到括号外去形成后缀表达式。条件三每个右括号都需要包含相同类型的左括号。条件二左括号和右括号的顺序需保持正确。条件一需以相应的右括号闭合。

2024-11-13 23:01:54 1067 17

原创 java双向链表解析实现双向链表的创建含代码

想要删除任意节点可以直接通过访问下一个节点使其prev获取想要删除的上一个节点,然后将想要删除的上一个节点.next获取到被删除对象下一个节点的指向这里我们可以模拟实现MyListCode类中的一些方法,入头插法、尾叉法、任意位置插入节点、指定元素删除含有该元素的第一个节点、指定元素删除含有该元素的所有节点等…

2024-11-11 22:17:51 1843 14

原创 Leetcode链表回文 链表分割 链表相交 环形链表I 环形链表II 获取链表中倒数k的节点

因为是单链表我们需要将中间点的后续节点翻转,从而由最后一个节点开始走知道slow的下一个节点指向slow,将slow下一个节点给到cur对象,让cur的下一个节点指向slow。如果cur下一个节点指向slow的话,cur就会失去后续节点的链接,所以我们还需要一个对象来接收cur的下一个节点。首先求得回文串中的中间位置,因为回文串两边的头节点往中间靠拢,在相同的情况下,如果两边头节点相遇则是回文串。然后cur=curNext,cur的节点更新,知道找到最后一个节点。然后slow=cur将slow更新为头步。

2024-11-09 23:37:51 837 8

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除