在工业自动化领域,无论是 PLC、HMI、变频器、伺服驱动器、仪器仪表,还是机器视觉设备,你经常会看到Modbus的身影。例如:PLC与上位机通信、PLC与上位机通信、PLC与IO模块通信等等。几乎所有的工业设备都会支持Modbus。在初次接触Modbus后,产生了很多疑问:
- 什么是Modbus?
- RTU和TCP有什么区别?
- 主站和从站是什么意思?
本文将采用问题驱动的方式,带你一步步理解Modbus。
在工业自动化领域,无论是 PLC、HMI、变频器、伺服驱动器、仪器仪表,还是机器视觉设备,你经常会看到Modbus的身影。例如:PLC与上位机通信、PLC与上位机通信、PLC与IO模块通信等等。几乎所有的工业设备都会支持Modbus。在初次接触Modbus后,产生了很多疑问:
本文将采用问题驱动的方式,带你一步步理解Modbus。
在现代工业化设备中,串口通信大量存在。例如:PLC通信、伺服驱动器、扫码枪、光源控制器、温控器等等。虽然现在Ethernet、TCP/IP越来越普及,但串口因为成本低、稳定、硬件简单等原因,仍然是工业现场最常见的通信方式之一。很多开发者初次接触串口通信,会觉得非常简单:
|
|
但是在实际工业项目中,很快会遇到为什么收到的数据经常不完整?为什么一次Read读不到完整协议?如何设计一个可扩展通信系统?真正困难的不是打开串口,而是:
如何设计一个可靠的串口通信系统。
shadowsocks-windows是一个经典的C#网络代理客户端项目,它将SOCKS5代理、TCP/UDP Relay、加密通信、系统代理管理以及Windows桌面应用结合在一起。本文通过问题驱动的方式阅读源码,深入分析其架构设计、网络通信模型以及C#工程实践,探索一个成熟的开源项目是如何实现高性能、稳定的网络代理能力。
在工业软件、设备控制系统、网络诊断工具开发中,经常需要获取当前计算机的网络状态,例如:
.NET提供了一个非常方便的命名空间System.Net.NetworkInformation,其中核心类:
| 类 | 作用 |
|---|---|
| NetworkInterface | 获取网卡信息 |
| IPInterfaceProperties | 获取 IP 配置 |
| IPAddressInformation | 获取 IP 地址状态 |
| PhysicalAddress | 获取 MAC 地址 |
| NetworkChange | 监听网络变化 |
本文将系统介绍如何使用这些API构建一个网络信息采集工具。
在软件开发过程中,代码并不是写完提交之后就结束了。一个项目真正的生命周期,往往伴随着持续的修改、扩展和维护。需求会不断变化,新的功能会不断加入,原本简单的模块可能逐渐变得复杂。如果代码经过良好的设计和整理,随着时间推移,系统会慢慢演变成难以理解、难以修改,甚至无人敢触碰“遗留代码”。
正如软件工程领域常说的一句话:
代码的第一读者是人,第二读者才是机器。
计算机只关心代码是否能够正确运行,而开发人员需要面对代码背后的意图、结构以及未来变化的可能性。一段能够运行的代码,并不一定是一段优秀的代码。
由Robert C. Martin(人称Uncle Bob)编写的《代码整洁之道》正是围绕这一问题展开讨论。本书从变量命名、函数设计、类的职责划分,到错误处理、测试、架构设计等多个方面,系统总结了如何编写更加清晰、可维护的软件代码。
书中提出:
“Clean code always looks like it was written by someone who cares.”
优秀的代码不仅仅是满足需求,更体现了开发者对软件质量的关注。在实际开发中,我们经常会遇到这样的代码:
这些问题并不是某一天突然出现的,而是在一次次“先实现功能,以后再优化”的过程中逐渐累积形成的。《代码整洁之道》提供了一套思考方式:
学习整洁代码,并不是为了追求代码形式上的“漂亮”,而是为了降低软件长期维护的成本,让系统能够面对未来的不确定变化。在本文中,我将结合书中的核心思想,并结合实际工程开发中的案例,对《代码整洁之道》进行深入学习和总结,希望能够探索:
什么样的代码才是真正适合长期维护的软件代码?
在 GitHub 闲逛时,我偶然发现了NETworkManager这个开源项目。作为一款网络管理和故障排查工具,它已经积累了超过 8.5k Star,足以说明社区对它的认可。更让我感兴趣的是,这个项目采用 C# + WPF 进行开发,与我当前正在深入学习和实践的技术栈高度契合。因此,我产生了一个想法:通过深入分析 NETworkManager 的源码,探索一个成熟的 WPF 桌面应用是如何进行架构设计、模块划分以及工程实践的。接下来,我将以 NETworkManager 为切入点,逐步拆解它在 WPF UI 设计、MVVM 架构、依赖注入、配置管理、网络通信、异步编程以及工程化实践 等方面的实现,希望能够从优秀的开源项目中学习桌面应用开发的最佳实践。
日志是软件工程中最基础也是最重要的能力之一。无论是Web服务、AI应用、数据处理任务、自动化脚本、后台Worker,都离不开日志。Python标准库提供了logging。它功能强大,但实际工程使用中经常会遇到一些问题:
例如标准logging:
|
|
简单记录一条日志到文件,需要很多代码。这也是为什么可以尝试用Loguru。
论文:You Only Look Once: Unified, Real-Time Object Detection
作者:Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi
Python诞生于1991年,经过30多年发展,已经成为:
但Python工程化一直存在一个问题:
代码开发体验优秀,但项目管理体验长期落后。
特别是在依赖管理方面。
在日常开发中CSV导入是一个比较常见的数据处理场景。例如:
很多项目开始都会写出类似下面的代码:
|
|
数据只有几千条时,这段代码运行地非常流畅。然而,当数据增长到几十万甚至几百万条之后,问题便开始暴露出来:
在阅读一些大型 C++ 项目源码时,经常会看到类似下面这样的代码:
|
|
第一次看到这种写法,很多人都会疑惑:
Impl类?.cpp中实现?实际上,这就是C++中非常经典的Pimpl(Pointer to Implementation)设计模式。本文将从设计思想、实现方式、优缺点以及使用场景几个方面详细介绍Pimpl。
Hugo基于 Chroma 实现代码高亮,对 Go、Python、C++、Matlab 等主流语言都提供了开箱即用的支持。最近阅读机器视觉算法与应用 第2版 (Carsten Steger)时,需要在博客中展示 HDevelop 代码,却发现 Hugo 默认并不支持这种语言。与其退而求其次使用普通文本展示,不如直接扩展 Hugo 的语法高亮能力。因此本文记录整个实现过程,包括: