- 博客(100)
- 资源 (1)
- 收藏
- 关注
原创 深入浅出理解 C# WPF 的事件
可视化树是WPF 用于渲染 UI、处理事件、布局的核心树形结构,由所有可视化的 WPF 控件 / 元素组成(即继承自Visual的对象),描述了 UI 元素的父子包含关系。简单说:外层容器是父节点,内部控件是子节点,层层嵌套形成树。路由事件是 WPF 自定义的事件系统,事件触发后,会沿着可视化树的节点进行传播,允许事件源之外的其他节点注册并处理该事件,核心价值是:解耦事件源和事件处理器、简化嵌套控件的事件处理。和 WPF 的依赖属性类似,我们也可以自定义路由事件。
2026-02-04 12:30:42
449
原创 深入浅出地理解 C# WPF 中的属性
CLR 属性是字段的封装,通过getset访问器控制字段的读写,核心作用是封装数据、添加访问逻辑,避免直接操作私有字段。// 私有字段(实际存储数据)private string _name = "默认名称";// CLR属性(对外暴露的访问接口)// 读访问器:获取字段值// 写访问器:设置字段值,value是关键字,表示传入的新值依赖属性是WPF 自定义的属性系统,它的核心特点是:。
2026-02-04 12:06:21
461
原创 WPF Binding 从入门到精通
Binding 本质是一个 **“桥梁”,连接源(Source)和**目标(Target):只能是WPF 的依赖属性(DependencyProperty)**(几乎所有 UI 控件的可显示 / 可交互属性都是依赖属性,如**源(Source)**:可以是任意 CLR 对象(普通类、实体、ViewModel 等)、控件、集合等;数据流向:Binding 的核心方向,分为单向、双向、一次性等,决定数据从源到目标,还是能从目标回传源。实际开发中,更多是UI 绑定业务数据对象。
2026-02-03 13:39:17
631
原创 C#中开放 - 封闭原则(**Open-Closed Principle,OCP**)
/ 支付方式接口// 物流方式接口// 商品核心服务接口OCP 是 SOLID 的核心:其他 SOLID 原则(SRP、LSP、ISP、DIP)都是为 OCP 服务的,是实现 OCP 的手段;OCP 的本质是隔离变化:识别变化点、封装变化点、扩展变化点,让不变的核心逻辑与可变的实现分离;OCP 的关键是抽象与面向抽象编程:抽象是 OCP 的基础,面向抽象编程是 OCP 的实现手段,多态是 OCP 的具体表现。
2026-02-03 09:56:29
688
原创 C# 中的 SOLID 五大设计原则
SOLID 五大原则是一套协同工作的设计准则单一职责:一个类只做一件事,减少修改点;开闭原则:扩展开放、修改关闭,核心是抽象和多态;里氏替换:子类兼容父类契约,无感知替换,保证继承的合理性;接口隔离:接口拆分为专用小接口,避免强迫实现无用方法;依赖倒置:面向抽象编程,高层 / 低层都依赖抽象,是解耦的核心,C# 中通过 DI/IOC 落地。在 C# 开发中(如ASP.NET。
2026-02-03 09:55:20
593
原创 C# 中实现窗口拖动功能
如果不需要整个窗体都能拖动,只希望通过自定义标题栏(如PanelLabel)实现拖动,可使用此方法,核心逻辑与方法一一致,只是将事件绑定到指定控件。WinForms 窗口拖动的核心原理:记录鼠标起始坐标 → 计算移动偏移量 → 更新窗体屏幕坐标。两种常用实现:① 重写窗体鼠标事件(整个窗体可拖动);② 绑定自定义控件鼠标事件(指定区域可拖动,推荐)。关键注意点:仅响应鼠标左键操作,鼠标松开后重置起始坐标,避免无效拖动;WinForms 需手动计算坐标,WPF 可直接调用DragMove()
2026-01-19 11:11:52
807
原创 C# 中实现自定义的窗口最大化、最小化和关闭按钮
实现自定义窗口按钮的核心是隐藏系统边框 + 绑定控件事件 + 调用窗体内置状态方法。关键步骤:移除、绑定Click事件、实现窗体拖动、适配窗口状态变化。上述代码可直接在 WinForms 项目中运行,修改控件名称后即可快速集成到你的项目中。
2026-01-19 11:10:53
350
原创 Halcon 示例详解:带高容错的形状匹配
本示例的核心是的负金字塔层级配置,解决离焦 / 变形目标的匹配问题;形状匹配流程:读取模板图像→创建 ROI→构建形状模板→批量匹配→结果展示;[0,-1](容错核心)、相似度阈值、旋转角度范围,直接影响匹配的鲁棒性和精度。
2026-01-18 11:06:40
37
原创 C# 各种类型转换深入剖析
implicit// 自定义货币结构体set;} // 金额set;} // 货币编码(CNY/USD等)// 1. 重载隐式转换运算符:Currency → decimal(安全,仅提取Amount属性)// 2. 重载显式转换运算符:decimal → Currency(不安全,默认货币编码为CNY,需显式指定)// 3. 重载显式转换运算符:Currency → string(格式化输出,显式转换)// 调用自定义转换。
2026-01-18 10:41:24
774
原创 Halcon 形状匹配(Shape-Based Matching)示例详细讲解
整体流程闭环:环境配置→图像获取→ROI 提取→模板创建→多帧匹配→资源清理,这是工业视觉中形状匹配的标准落地流程,可直接迁移到实际项目中。核心思想:形状匹配的本质是 **“特征提取→特征匹配”**,通过提取目标的形状轮廓特征(忽略光照、纹理的次要影响),再通过在待搜索图像中寻找相似的形状特征,从而实现目标的快速、精准定位。适用场景:适用于目标物体形状固定、光照变化较小、无明显变形的场景(如零件定位、二维码识别、包装检测等)。
2026-01-16 16:47:29
62
原创 C# 文件的输入与输出(I/O)详解
1、C# 文件 I/O 核心分为文本文件(字符流)和二进制文件(字节流)操作,对应不同的类库。2、小文件优先使用File静态类(便捷高效),大文件 / 复杂场景优先使用StreamReader/StreamWriter/FileStream(内存友好)。3、异步 I/O(async/await+*Async方法)是高并发场景的最佳选择,避免阻塞主线程。4、文件 I/O 操作需注意资源释放、路径安全、编码指定和异常处理,确保程序健壮性。
2026-01-16 08:44:27
587
原创 C# TreeView 控件详解与应用
1、TreeView 核心是TreeNode 节点的层级管理,节点的添加、删除、修改是基础操作,通过 Nodes 集合实现。2、常用交互依赖 AfterSelect(选中)和 NodeMouseClick(鼠标点击)事件,可满足大部分交互场景。3、大数据量场景下,** 懒加载(BeforeExpand 事件按需加载)** 是提升性能的关键。4、开发中可通过 Tag 属性存储节点附加数据,通过 BeginUpdate()/EndUpdate() 优化界面刷新性能。
2026-01-16 08:43:49
618
原创 Halcon 低对比度高噪声图像形状匹配优化示例详细讲解
默认参数测试(获取基准)→ 金字塔层级分析(定位噪声干扰层级)→ 舍弃低层级,使用高层级匹配(核心抗噪声手段)→ 自适应调整MinContrast(适配低对比度)→ 优化匹配度量方式(提升鲁棒性)→ 提高MinScore(消除假阳性)
2026-01-15 07:37:56
26
原创 Halcon 各向异性形状匹配(SMD 电容检测)例子详细讲解
匹配类型:使用各向异性形状匹配),支持行、列方向独立缩放,区别于等比缩放的普通形状匹配。图像深度处理:通过配置 uint2 图像的有效位深度,确保 10 位深度图像的正确处理。模板创建:通过合成 XLD 轮廓生成模板,无需现成模板图像,灵活高效。结果可视化:通过仿射变换将模板轮廓与检测目标姿态对齐,实现直观的检测结果展示。关键输出:除了目标坐标、旋转角度,核心输出行 / 列缩放比例(ScaleRScaleC),体现各向异性匹配的特性。
2026-01-14 17:50:57
28
原创 Halcon 刹车盘孔洞形状匹配示例详细讲解
整个示例分为两大阶段前期预处理与几何参数提取:读取刹车盘图像,通过二值化、区域选择、亚像素边缘提取,拟合出孔洞的圆形参数(中心坐标、半径),计算平均半径作为后续创建标准轮廓的依据。两大形状匹配示例(核心)示例 1:基于单个圆形 XLD 轮廓创建形状模型,实现单个孔洞的匹配,解决极性信息缺失导致的误匹配问题。示例 2:基于正方形排列的四个圆形 XLD 轮廓创建形状模型,利用孔洞的空间排列信息,进一步提升匹配的精准度和效率。收尾工作:多测试图像验证匹配效果,最终清理环境。XLD 轮廓的核心价值。
2026-01-14 10:35:51
25
原创 Halcon 摆锤 logo 检测示例详细讲解
环境配置→图像采集→模板图像分割(高亮区域提取→卡片筛选→logo 提取)→ROI 优化→形状模型创建→序列图像匹配追踪→资源释放。先从模板图像中精准提取目标区域,创建具有鲁棒性的形状匹配模型,再利用该模型在序列图像中实现快速、准确的目标定位,这也是工业机器视觉中目标检测与追踪的典型流程,可迁移到零件定位、logo 检测、缺陷追踪等多种场景。
2026-01-14 10:26:32
21
原创 在DataGridView中实现数据的筛选功能
1、筛选功能的核心:保留原始数据源 → LINQ 生成筛选副本 → 重新绑定刷新 DataGridView。2、关键技术:LINQ Where() 方法实现条件筛选,Contains() 实现模糊匹配,== 实现精准匹配,ToList() 完成结果集转换。3、核心注意点:始终不修改原始数据源,做好输入验证和边界处理,支持筛选重置,提升用户体验。4、扩展方向:可通过 TextChanged 事件实现实时筛选,或增加更多筛选条件(如日期范围、多值选择)满足复杂业务需求。
2026-01-14 09:52:35
882
原创 DataGridView 中实现分页功能
分页功能的核心:LINQ Skip() + Take() 截取数据片段 + 分页状态变量记录 + 重新绑定 DataGridView。关键步骤:计算总页数 → 边界验证页码 → 截取当前页数据 → 绑定展示 → 更新分页信息。核心注意点:总页数向上取整、页码边界验证、保留原始数据源不修改,确保分页稳定性和可扩展性。扩展方向:支持自定义每页条数、筛选后分页、页码输入跳转,满足复杂业务场景需求。
2026-01-14 09:51:37
643
原创 C#操作Datagridview-增、删、改、查、上移、下移
1. CRUD 操作的核心基础是「全局数据源(_studentGlobalList)+ 数据绑定(DataSource)」,所有操作均基于全局数据源,最后通过重新绑定刷新表格。查:筛选全局数据源副本 → 重新绑定;增:验证 → 添加到全局数据源 → 重新绑定;改:选中验证 → 匹配全局数据源实体 → 更新属性 → 重新绑定;删:选中验证 → 确认删除 → 移除全局数据源实体 → 重新绑定。3. 数据一致性:所有操作必须同步全局数据源,避免表格展示与底层数据脱节。
2026-01-14 06:30:00
1494
原创 C# DataGridView 控件使用详解
1、 DataGridView 核心是数据绑定,推荐优先使用「实体类集合」或「DataTable」绑定,效率远高于手动添加列 / 行。2、关键操作:通过 DataSource 绑定数据、通过 SelectedRows 获取选中数据、通过重新绑定实现数据刷新。3、优化体验:合理配置外观和交互属性(隔行变色、整行选择、禁止空行),使用常用事件响应用户操作。4、适用场景:WinForm 项目中所有结构化数据的展示、编辑、筛选需求,是桌面开发中数据交互的核心控件。
2026-01-13 18:39:33
691
原创 C# 异步代码手写详解
C# 异步编程的核心是 async/await 关键字和 Task 类,async 标记方法,await 等待异步操作且不阻塞线程。异步方法返回类型优先使用 Task(无返回值)和 Task<TResult>(有返回值),避免使用 void(仅事件处理)。实际开发中遵循 “异步到底” 原则(所有调用链都使用 async/await),避免同步等待,充分发挥异步优势。异步代码的可读性与同步代码一致,无需复杂的回调嵌套(解决了 “回调地狱” 问题)。
2026-01-13 11:59:25
822
原创 Halcon 摆锤 logo 检测示例详细讲解
环境配置→图像采集→模板图像分割(高亮区域提取→卡片筛选→logo 提取)→ROI 优化→形状模型创建→序列图像匹配追踪→资源释放。先从模板图像中精准提取目标区域,创建具有鲁棒性的形状匹配模型,再利用该模型在序列图像中实现快速、准确的目标定位,这也是工业机器视觉中目标检测与追踪的典型流程,可迁移到零件定位、logo 检测、缺陷追踪等多种场景。如何在Halcon中进行图像预处理?除了示例中的方法,还有哪些方式可以创建模型ROI?如何提高模型ROI的准确性?
2026-01-13 08:15:41
796
原创 Halcon 自带案例(Create_mode_green_dot)讲解
形状匹配模板制作流程:图像获取→预处理→区域分割→模型创建→模型保存→资源释放,这是 Halcon 形状匹配的标准流程,适用于大多数目标定位场景。尺度不变的实现:通过的第 6、7 个参数(最小 / 最大缩放比例)实现,支持目标尺寸在指定范围内变化的匹配。鲁棒性提升技巧:孔洞填充、膨胀操作、忽略全局极性、金字塔模型,这些步骤和参数都能提升模型在复杂场景下的匹配成功率。资源管理是必须的步骤,用于释放模型内存,避免内存泄漏,尤其是在大型项目中需要重点关注。分步调试的重要性:示例中多次使用stop()
2026-01-11 22:14:18
763
原创 在C#中实现异步通信
C# 异步通信的核心是模式,底层依赖Task类型,核心价值是非阻塞、高并发。网络异步通信优先使用.NET 内置的异步 API(如WriteAsyncReadAsync),无需手动管理线程。实现关键:异步方法命名规范(后缀Async)、避免同步等待、合理使用、完善异常处理。工业级场景中,异步通信需结合断线重连、粘包处理、资源释放等特性,确保稳定性和可靠性。
2026-01-10 11:58:52
737
原创 C# 开发工业级 TCP 客户端
工业场景中最常用的是「固定长度头 + 数据体」协议,这里定义头长度为 4 字节(存储数据体长度),后续可根据需求扩展。// 推荐使用微软日志抽象,也可替换为其他日志框架/// 工业级TCP客户端#region 配置参数// 服务端IP// 服务端端口// 重连间隔(毫秒)// 最大重连次数(-1表示无限重试)// 日志记录器#endregion#region 核心字段_tcpClient;// 基础TCP客户端// 网络流(用于读写数据)_cts;
2026-01-10 08:20:43
274
原创 工业 2D 相机与镜头选型详解
工业 2D 相机与镜头的选型是一个系统工程,核心是参数匹配和需求导向。在实际项目中,需结合检测精度、效率、成本和环境,通过公式计算 + 实物验证的方式,选择最优组合。对于创业型项目,建议优先采用成熟的标准化方案(如 GigE 相机 + 定焦镜头),降低开发难度和成本。
2026-01-09 17:59:51
844
原创 C# 接口(Interface)全面详解(概念 + 用法 + 落地示例)
接口(interface)是 C# 中一种特殊的引用类型,它仅定义一套「行为规范 / 契约」,只声明方法、属性、索引器或事件的签名(无具体实现),要求实现该接口的类 / 结构必须严格遵守这份契约,完成所有成员的具体实现。简单理解:接口是一份「说明书」,定义了 “必须要做什么”,但不规定 “具体怎么做”,实现者需按照说明书完成具体功能。使用interface关键字定义接口,接口命名通常以I开头(行业约定俗成,便于区分接口和类,如/// 示例接口:定义“可读写数据”的契约。
2026-01-09 14:40:17
1079
原创 C# WinForm 数据绑定详解
/ 业务实体类:用户信息// 私有字段// 公共属性(支持绑定)set= value)// 触发属性变更通知setif (_age!= value)// 实现INotifyPropertyChanged接口的事件// 触发事件的辅助方法(简化代码)WinForm 数据绑定分为简单绑定(单个控件,)和复杂绑定(列表控件,DataSource实体类实现是属性变更通知的核心,是集合变更通知的首选。
2026-01-09 08:27:31
692
原创 C#winform数据绑定
内置集合变更通知机制,集合数据变化(新增、删除、修改)会自动同步到界面,是 WinForm 列表绑定的首选集合数据源。,当数据源数据变化时自动同步到控件,或控件内容修改时同步回数据源(双向绑定)。为了让数据源属性变化自动同步到控件,自定义实体类需要满足。仅支持一次性绑定,数据新增 / 删除时界面不会自动刷新;(列表控件绑定数据集合),覆盖绝大部分开发场景。等展示数据集合的控件,核心是直接设置控件的。WinForm 数据绑定的本质是。WinForm 数据绑定分为。(单个控件绑定单个数据项)和。
2026-01-08 11:31:07
446
原创 S7-1200 CPU 与 S7-200 SMART S7通信(S7-1200 作为服务器)
S7-200 SMART 作为 S7 客户端只能访问服务器的V区,而S7-1200没有V区, V 区对应 S7-1200 中 DB1,且只能对应 DB1 ,所以需要把 DB9 中数据传送到 DB1,而将DB1的数据传送到DB8,进而间接实现 S7-200 SMART 对 S7-1200 DB8、DB9 写和读的操作;S7-1200 作为服务器进行 S7 通信,对于 CPU V4.0以后的固件版本,需要勾选“允许来自远程对象的PUT/GET通信访问”,否者,无法建立通信,如图 6 所示。
2026-01-08 08:11:36
902
原创 S7-1200 CPU 与 S7-200 SMART S7 通信(S7-1200 作为客户端)
S7-200 SMART CPU 固件版本 V2.0 及其以上,本体集成的 PROFINET 通信接口支持 S7 通信,可以通过向导或使用 GET/PUT 指令两种方式实现,最多可以建立 16 个 S7 连接,其中包括:8 个客户端,8 个服务器。本文档中S7-200 SMART 作服务器,占用 S7-200 SMART CPU 的 S7 被动连接资源,CPU 中不需要做任何编程,只需设定 CPU 的 IP 地址和在 S7-1200 中设置的伙伴 IP 地址一致即可(图3),如图 8 所示。
2026-01-08 08:09:57
1053
原创 C# 写一个Http 服务器和客户端
1、该 WinForm 服务器基于实现,能够稳定处理 JSON 格式的 GET/POST 请求,核心是异步监听 + 多线程处理请求,避免阻塞 UI。2、关键要点:需要管理员权限运行、正确处理跨线程 UI 更新、严格遵循 HTTP 响应规范(设置 Content-Type、关闭响应流)。
2026-01-07 11:30:51
1069
原创 S7-1200 与 S7-1200/S7-1500 S7 通信
在“设备组态”中 ,选择“网络视图”栏进行配置网络,点中左上角的“连接”图标,连接框中选择“S7连接”,然后选中client v4.1 CPU(客户端),右键选择“添加新的连接”,在创建新连接对话框内,选择连接对象“server v2.0 CPU”,选择“主动建立连接”后建立新连接,如图 2 所示。请注意,以上例子中使用的作为服务器的PLC是固件版本V2.0的S7-1200 CPU,如果您使用固件版本为 V4.0 以上的 S7-1200 CPU 作为服务器,则需要如下额外设置,才能保证S7通信正常。
2026-01-07 08:15:06
573
原创 S7-1200 使用数组实现间接寻址
在 PLC 变量表 I、Q 是不能直接定义为数组的,但是从 CPU V4.0 固件以后,I、Q 可以定义为 PLC 数据类型,这样在 PLC 数据类型中定义数组,间接的使得 I、Q 成为数组数据类型,方便的间接寻址,无需再使用 PEEK 指令。S7-1200 从 固件版本 V2.0 开始就支持数组下标使用变量的方式,这就意味着数组是最方便的间接寻址的方法,通过改变下标变量实现各式各样的功能。普通数组变量就是一般常见的在 DB 块中直接定义的数组,或者在块接口中出现的,例如常见的 FB 静态变量的数组。
2026-01-07 08:11:29
380
原创 博途V16中1200/1500PLC通过Sina Para块对V90参数进行读写操作
先将选件包中的sinapara指令添加到程序 ,再添加一个新的全局DB块,命名为sinapara_param(可以随意命名) ,打开新建的背景数据编辑器,(1)创建博途项目,打开OB1,在指令中选择“选件包”,再选SINAMICS中的“SinaPara”,将其拖到网络中,并填写相关参数。在驱动器的组态中,选择需要读取的驱动对象的报文,在属性中找到Hardware。需要注意,在读取/写入参数前,需查看V90手册,清楚需要读/写参数的数据类型。3、ParaNo:需要读/写参数的数量,范围1~16。
2026-01-06 11:15:16
297
原创 西门子-FB284功能说明
• Jog1 及Jog2 用于控制EPOS的点动运行,运动方向由V90 PN驱动中设置的点动速度来决定,默认设置为Jog1 = 负向点动速度,Jog2 = 正向点动速度 ,与Positive 及Negative参数无关,默认设置为"0"。(7)运行条件 "CancelTransing" 及 "IntermediateStop"必须设置为 "1",Jog1 及 Jog2 必须设置为 "0"。• 点动速度在V90 PN中设置,速度的OverV参数对于点动速度设定值进行倍率缩放,建议使用默认值100%
2026-01-06 10:51:47
871
原创 西门子V90 EPOS控制相关参数设置
需要设置正确的齿轮比,以及设置负载转动一圈物体移动距离所对应的长度单位(LU)。如果定义1LU对应0.001mm,负载转动一圈移动10mm,则此时负载转动一圈对应的长度单位为10000LU。PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,使用V90 PN的其本定位功能(EPOS)时,需要使用调试软件V-Assistant对V90 PN进行项目配置。可设置最大加减速度,运行程序段的参数、Jog点动参数和定位监控窗口参数。7. 其他相关基本定位参数,在参数列表中设置。
2026-01-06 10:47:18
219
原创 S7-1200对V90 PN进行位置控制的三种方法
• 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱动执行速度控制)。• 方法二、在PLC中使用FB284(SINA_POS)功能块,V90使用西门子111报文,实现相对定位、绝对定位等位置控制,这种控制方式属于分布控制方式(位置控制在驱动器中计算)。3.在TIA 博途中添加库文件,并将库中的Easy_SINA_Pos功能块拖拽到左侧"程序块"中。
2026-01-05 08:52:40
797
原创 S7-1200对V90 PN进行速度控制的两种方法
S7-1200系列PLC可以通过PROFINET 与V90 PN伺服驱动器搭配进行速度控制,PLC进行启停和速度给定,速度控制计算在V90驱动器中,实现的方法主要有以下两种:• 方法一、PLC通过FB285(SINA_SPEED)功能块,V90使用1号标准报文,进行速度控制。• 方法二、不使用任何专用程序块,利用报文的控制字和状态字通过编程进行控制,V90使用1号标准报文,使用这种方式需要对报文结构比较熟悉。V90 PN配置要点• 设置控制模式为"速度控制(S)"• 配置标准通信报文1。
2026-01-05 08:07:02
912
Halcon解决方案指南ii图像采集-中文版.pdf
2026-01-06
【工业自动化】基于变量、ST语言与FB的PLC程序标准化设计:提升代码复用性与维护性的关键技术方案
2026-01-02
【工业自动化】FANUC机器人操作编程与维护:基于TP示教盒的坐标系设置、程序调试及故障诊断技术指南
2026-01-02
【智能制造装备】基于MTF6000控制器的精密拧紧系统操作规范:微扭工具编程、校准与数据管理全流程技术指南
2026-01-02
ZDesignerV8驱动将字体下载到打印机.pdf打印技术基于ZDesignerV8驱动的TrueType字体下载方案:ZPL打印机自定义字体导入与调用流程设计
2026-01-02
【自动识别技术】霍尼韦尔扫码枪串口模式配置:驱动安装与COM口设置指南
2026-01-02
【工业自动化】基于面向对象的PLC标准化编程框架:高内聚低耦合设计与跨品牌模块化应用
2026-01-02
halcon例程标注-V1.3.pdf
2026-01-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅