- 博客(71)
- 收藏
- 关注
原创 Modbus数据采集工具项目总结
面向对象编程类和对象封装、继承、多态属性和方法数据类型和转换基本数据类型枚举类型转换位运算集合和 LINQListLINQ 查询委托和事件文件 I/O文件读写CSV 格式编码处理网络通信TCP 协议串口通信Modbus 协议多线程线程安全锁机制UI 线程更新异常处理try-catch异常传播错误日志WinForms 开发控件使用事件处理数据绑定对话框。
2026-03-16 19:16:56
359
原创 # SQL基础知识学习指南
SQL(Structured Query Language,结构化查询语言)是一种专门用于管理关系型数据库的标准编程语言。它由IBM在20世纪70年代开发,现在已经成为数据库管理系统的国际标准语言。SQL之所以如此重要,是因为它提供了一套统一的方式来与数据库进行交互。无论你使用的是MySQL、SQL Server、PostgreSQL还是Oracle,SQL的基本语法都是相通的,这使得开发者可以轻松地在不同的数据库系统之间切换。查询数据(SELECT): 从数据库中检索数据,这是SQL最常用的功能。
2026-03-11 20:22:47
400
原创 Modbus协议介绍
Modbus 是一种工业自动化领域广泛使用的串行通信协议,由 Modicon 公司于 1979 年开发。它具有以下特点:🔴 开放标准,无版权限制🔴 简单易实现,广泛支持🔴 支持多种物理层(串口、以太网)🔴 主从架构(Master-Slave)特性Modbus RTUModbus TCP物理层串口(RS-232/RS-485)以太网(TCP/IP)传输方式二进制编码TCP 数据包帧格式需要校验(CRC)内置 TCP 校验传输距离较短(RS-485 约 1200m)
2026-03-08 15:24:50
380
原创 基于 TCP/IP 的远程运动控制模拟系统
原因界面是"展示层",依赖所有底层功能先保证核心功能正常,再考虑用户体验界面开发相对独立,不影响业务逻辑协议层 → 通信层 → 业务层 → 界面层原因底层是基础,上层依赖底层先实现底层,上层才有"东西"可以用修改底层不会影响上层设计修改上层不会破坏底层功能。
2026-02-27 16:41:01
680
原创 详解C#中的TcpClient对象
TcpClient 类是用于基于 TCP 协议进行客户端通信的重要类。它封装了连接、数据传输、异常处理等常见操作,提供了易用的 API。通过 TcpClient,你可以轻松地实现客户端与服务器之间的连接,并进行可靠的数据交换。NetworkStream 类则为数据传输提供了流式接口,使得发送和接收数据变得更加简单和直观。
2026-02-13 14:49:17
541
原创 详解C#中的TcpListener 对象
是.NET Framework中提供的一个类,用于创建基于TCP协议的服务器端应用程序。它封装了底层的Socket操作,使得开发者可以更加便捷地监听和接受TCP网络连接。类继承自类,提供了简单易用的API来处理TCP网络通信。的配置参数对于优化网络通信性能和调整服务器行为至关重要。这些参数允许开发者根据具体的应用场景和网络环境定制的行为。的生命周期管理是确保资源有效利用和服务器稳定性的关键。它包括正确地初始化、启动、执行和关闭的各个阶段。
2026-02-13 14:31:43
678
原创 详解C#中的Socket对象
Socket是网络编程中的一个基本概念,它代表了网络中不同主机上的应用进程之间进行双向通信的端点。在C#中,Socket类位于命名空间下,提供了创建和使用套接字的方法。一个Socket对象可以看作是网络上进程通信的一端,它提供了应用层进程利用网络协议交换数据的机制。从结构上讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,也是应用程序与网络协议栈进行交互的接口。
2026-02-11 22:51:52
601
原创 TCP协议在C#中的基本概念和工作原理
传输控制协议(TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,其定义在RFC 793中。TCP的主要作用是为应用程序提供一种可靠的数据传输服务,确保数据在网络中传输的完整性和顺序性。TCP通过三次握手建立连接,保证了数据传输的可靠性,并通过确认应答、数据重传、流量控制和拥塞控制等机制,确保数据的正确送达。
2026-02-11 20:39:24
576
原创 Git 基础操作学习指南
修改提交信息 git commit --amend # 将新修改加入最后一次提交 git add 新文件.cs git commit --amend --no-edit--amend会修改历史,已推送的提交不要使用。Git 是现代软件开发必备的技能,掌握基础操作后,可以在实际项目中逐步深入学习。git clone- 克隆仓库git add- 添加到暂存区git commit- 提交git push- 推送到远程git pull- 从远程拉取git branch- 查看/创建分支- 切换分支。
2026-02-10 14:33:38
425
原创 文本文件流&文件夹选择对话框
是.NET WinForm 提供的系统级文件夹选择控件,作用是让用户通过可视化界面选择文件夹(目录),而非手动输入路径,是 “选文件夹” 的标准方式。通俗比喻:就像 Windows 系统里 “另存为” 时选择保存文件夹的弹窗,只让你选文件夹,不能选文件。是.NET WinForm 提供的系统级文件选择控件,作用是让用户通过可视化界面选择单个 / 多个文件,是 “选文件” 的标准方式。通俗比喻:就像 Word 里 “打开文件” 的弹窗,能筛选文件类型、选择具体文件。控件用途核心区别选文件夹。
2026-02-07 17:27:24
633
原创 C#串口通信
本文档专注于深入学习串口通信技术,这是工业自动化领域最基础、最重要的通信方式之一。学完本专题,你将能够独立开发串口通信应用程序。✅ 理解串口通信的基本原理✅ 熟练使用 SerialPort 类✅ 掌握串口参数配置✅ 能够发送和接收数据✅ 处理异步事件✅ 开发完整的串口调试工具串口通信(Serial Communication)是一种按位(bit)顺序传输数据的通信方式。数据一个接一个地通过单根线缆传输。特性串口通信并口通信传输方式按位顺序传输同时传输多个位线缆数量少(2-3根)
2026-02-04 22:41:10
1107
原创 上位机通信入门概念
上位机通信是工业自动化、物联嵌入式系统等邻域中非常关键的技术环节,主要用于主控计算机(上位机)与终端设备(下位机,如PLE、传感器、执行器、智能仪表等)之间的数据交互。
2026-02-04 15:29:33
327
原创 C#生产者-消费者模式
生产者-消费者模式(Producer-Consumer Pattern)是一种经典的多线程设计模式,它描述了如何协作地处理数据流。生活中的例子:餐厅后厨厨师(生产者) 传菜窗口(缓冲区) 服务员(消费者)做菜 放置菜品 端给客人持续制作 临时存放 持续服务厨师。
2026-02-03 16:54:05
697
原创 C# 异常处理
在 C# 中,程序运行时的错误通过一种称为"异常"的机制在程序中传播。异常从错误的代码引发,由能够更正错误的代码捕作。C# 提供了内置的 try-catch、try-finally 和 try-catch-finally 的异常处理语句,可以使用这些语句来完成对异常发生的响应。异常指的是程序运行过程中发生的特殊响应,通常是由外部问题(如硬件、输入错误)所导致的。例如在下面的代码示例中,变量 n 在 try 块内部初始化,尝试在 WriteLine(n) 语句的 try 块外部使用此变量将生成编译器错误。
2026-02-03 13:25:57
571
原创 C# 定时器和后台任务
周期性任务:如每100ms读取一次轴位置延时操作:如等待某个动作完成后再执行下一步状态监控:如实时检测轴的运动状态定时触发:如定时保存数据、定时报警检测。
2026-02-02 20:31:36
696
原创 C#使用Cancellation来取消异步任务
在开发应用程序时,我们经常会遇到一些需要长时间运行的操作,比如:从网络下载大文件处理大量数据在运动控制系统中,电机从当前位置运动到目标位置执行复杂的计算任务这些操作可能需要几秒、几分钟甚至更长时间才能完成。但是如果用户想中途取消这个操作,或者发生了紧急情况需要立即停止,我们应该怎么做呢?在传统的编程方式中,如果我们想停止一个正在运行的线程,可能会使用这样的方法。但这种方式非常危险,因为它会强制终止线程,可能会导致:数据不一致(线程正在修改数据时被突然打断)
2026-01-28 19:07:43
1166
原创 C#异步编程入门概念及核心概念
Task是包含了异步任务的各种状态的一个引用类型,比如是否正在运行 完成 结果 报错等,另有ValueTask值类型版本。
2026-01-26 14:39:23
700
原创 C#多线程编程入门概念
线程是操作系统中能够独立运行的最小单位,也是程序中能够并发执行的一段指令序列。线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程的资源。进程有入口线程,也可以创建更多的线程一组预先创建的线程,可以被重复使用来执行多个任务。避免频繁地创建和销毁线程,从而减少了线程创建和销毁的开销,提高了系统的性能和频率。异步编程默认使用线程池。多个线程访问共享资源时,对共享资源的访问不会导致数据不一致或不可预期的结果。
2026-01-25 19:53:17
608
原创 Winforms实战项目:运动控制界面原型
创建一个完整的运动控制界面原型,模拟单轴运动控制系统的基本功能。这个项目将帮助你掌握 WinForms 的核心概念,为后续的运动控制卡开发打下基础。
2026-01-21 19:27:30
793
原创 WinForms 多窗体应用程序详解
类型方法阻塞父窗体应用场景普通子窗体Show()否工具窗口模态窗体是设置对话框MDI 子窗体Show()MdiParent否多文档编辑单例窗体自定义管理否状态窗口。
2026-01-19 19:38:08
451
原创 Winforms开发——数据绑定
在 WinForms 中,几乎所有用于展示集合数据的控件(如ListBoxComboBox)都有一个DataSource属性。这个属性是数据绑定的入口,你可以将一个数据集合赋值给它,控件便会自动根据集合内容来填充自己。List<T>:最常用的泛型列表集合。DataTableDataSet:ADO.NET 中的数据表和数据集对象。:一个特别的列表,当其内容发生增删改时,可以自动通知绑定的控件更新。任何实现了IList或接口的对象。数据绑定是连接数据与UI的桥梁,可以大幅提升开发效率。始终优先使用。
2026-01-19 18:53:40
773
原创 Winform 菜单、工具栏和状态栏
在经典的桌面应用中,菜单栏、工具栏和状态栏是构成窗体框架的核心元素。WinForms 提供了一套功能强大且统一的“条带”控件来实现它们,主要包括MenuStripToolStrip, 和。
2026-01-19 17:13:11
948
原创 Winform控件样式
WinForms 没有像 WebCSS那样的样式表(Stylesheet)系统。在 WinForms 中,控件的外观和感觉(Look and Feel)是通过直接设置其属性来实现的。
2026-01-19 17:11:03
942
原创 C# WinForms界面设计
输入框在上面,按钮在下面, 窗体缩小太多,可能会导致输入框消失,可以指定 输入框 MinimumSize 400,200。从前面一章的例子中我们发现,界面开发,好像很简单:就是先了解各个控件的作用,然后拖拽摆放你需要的控件。一般做复杂界面的顶级区域设置,都会使用 TableLayoutPanel, 比如典型的网站布局,如下。通常要添加的控件都是动态的,比如从数据库中获取的商品列表,或者从文件中读取的图片列表。就是 3行2列的网格布局,左侧是导航栏,右侧是内容区,顶部是标题栏,底部是页脚。
2026-01-19 14:48:39
1024
原创 泛型、部分类、枚举、结构体
先看一段介绍泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。
2026-01-16 21:10:41
978
原创 接口隔离、反射、特性、依赖注入
依赖注入最重要的就是有一个容器Container,现在使用的容器是 Microsoft.Extensions.DependencyInjection: 这是.NET Core内置的依赖注入容器,提供了基本的DI功能1。这么底层的东西,原理一定是很深奥,很复杂。好处是,以主体程序为中心,生成一个生态圈,在这个生态圈中,不断的更新主体程序,于是就有人不断用插件往上面添加新功能并且从中获利。直到显式的使用这种接口类型的变量,去引用一个实现了这个接口的具体类的实例的时候,这个接口内的方法才能被看见,才能被使用。
2026-01-16 17:15:49
800
原创 接口、依赖反转、单元测试
我们为什么追求松耦合呢,就是因为松耦合它最大的好处就是可以让功能的提供方变得可替换,从而降低,紧耦合的时候功能的提供方不能被替换所带来的高风险和高成本,高风险指的是服务的提供方本身有毛病,就导致依赖在它上面的其他类和功能,都不能正常工作,这是高风险,高成本是指:如果要是服务提供方的开发的程序员工作慢了,比如离职也好,生病也好,请假也好等,有可能导致整个团队工作受阻,那就成本高了。,当我们的服务提供者出问题的时候,我们的服务使用者也会跟着出问题,这就是我们说的依赖关系,或者说是耦合关系。
2026-01-16 00:20:51
796
原创 重写与多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。多态常见有两种一种是重写多态一种是重载多态;
2026-01-15 17:52:19
344
原创 类的继承和类成员的访问
是派生类在基类已有的基础上对基类进行横向和纵向的扩展,但只能扩招,不能删减。所以要小心谨慎的在类库添加。class Car:Vehicle//car和vehicle就构成了一个继承类这就表示Car就是从Vehicle派生出来的。子类的实例,也是父类的实例如一个汽车,也是一个交通工具。老师,是人的派生,所以,一个老师也是一个人一个类最多有一个基类,子类的访问级别不能超越父类。
2026-01-15 12:07:12
354
原创 揭秘类的构造与析构奥秘
类是一种数据结构,它可以包含数据成员(常量和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数)以及嵌套类型。类本身是抽象的结果,同时也是抽象数据,抽象行为的载体类是一种数据类型,类是一种引用类型,具体到每一个类上,每一个类都是一个自定义的类型代表现实世界中的“种类”,【静态成员】的作用就会凸显。
2026-01-14 18:06:18
376
原创 C#事件详解
事件英文解释为:a thing that happens,especially something important.中文通顺的理解为:能够发生的什么事情。例:手机可以发生响铃这一事情,响铃就是一个事件。
2026-01-12 18:47:01
975
原创 C#委托详解
1 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。2 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。委托可以链接在一起,一次性调用多个方法3 你可以通过委托实例调用方法。4 委托用于将方法作为参数传递给其他方法,可用于定义回调方法5 可将任何可访问类或结构中与委托类型匹配的任何方法分配给委托。该方法可以是静态方法,也可以是实例方法。此灵活性意味着你可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。
2026-01-11 15:51:29
732
原创 字段、属性、索引器、常量
类的成员是静态成员 (static member) 或者实例成员 (instance member)。静态成员属于类, 实例成员属于对象(类的实例)。下表提供了类所能包含的成员种类的概述。成员说明常量与类关联的常量值字段类的变量方法类可执行的计算和操作属性与读写类的命名属性相关联的操作索引器与以数组方式索引类的实例相关联的操作事件可由类生成的通知运算符类所支持的转换和表达式运算符构造函数初始化类的实例或类本身所需的操作析构函数在永久丢弃类的实例之前执行的操作类型。
2026-01-09 13:48:52
860
原创 表达式、语句详解
表达式是任何一门编程语言的基本组件之一,表达式是由操作数、运算符和分隔符组成的序列,用于计算值或执行操作。表达式可以简单到一个字面量,也可以复杂到包含多个子表达式。C#中的表达式是构建程序逻辑的基础,掌握各种表达式的语法和用法对于编写高效、可维护的代码至关重要。本文详细介绍了C#中的各种表达式类型,包括算术表达式、关系表达式、成员访问表达式、Lambda表达式、查询表达式等,并通过综合示例展示了它们的实际应用。
2026-01-09 10:50:18
670
原创 C#语言——类型、变量与对象
表面上来看,变量的用途是存储数据实际上,变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量变量一共有七种:静态变量、实例变量(成员变量,字段)、数组元素、值参数、引用参数、输出形参、局部变量侠义的变量指局部变量,因为其他种类的变量都有自己的约定名称简单的讲,局部变量就是方法体(函数体)里的变量变量的声明有效的修饰符组合 类型 变量名 初始化器变量=以变量名所对应的内存地址为起点、以其数据类型所要求的存储空间为长度的一块内存区域。
2025-09-27 16:41:00
775
原创 wps表格函数
DATEDIF函数,主要用于计算两个日期之间的天数、月数或年数。其返回的值是两个日期之间的年\月\日间隔数。Start_Date:为一个日期,它代表时间段内的第一个日期或起始日期;End_Date:为一个日期,它代表时间段内的最后一个日期或结束日期;Unit:为所需信息的返回类型。1、"Y":计算2个日期间隔的年数2、"M":计算2个日期间隔的月份数3、"D":计算2个日期间隔的天数4、"YD":忽略年数差,计算2个日期间隔的天数5、"MD":忽略年数差和月份差,计算2个日期间隔的天数。
2025-03-09 14:48:06
3241
原创 二分法(算法)
思路:利用答案二分是最常考的一种方式,假设可以打包成每组x个花束,那么我们就能得知x*k<=sum的,我们只需要将所有的花相加得到sum,再判断其和x,k的关系即可,若是x*k<=sum,则表示x还能取得更多,更新l=mid,若是x*k>=sum,表示不能够满足,更新r=mid。我们要在一组升序的数组找一个数的下标,那我们肯定是先拿中间的与他进行比较,比较大小的判断,其实就相当于是这个性质,且这个性质满足二段性,将大于和小于我们要查找的值分为两段,而我们的查找结果就是。返回右边界,则当≥目标值时移动 r。
2025-03-06 19:20:42
837
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅