# 🚀 30 天工业软件转型学习计划（详细执行版）

> 🗓️ **30 天系统性转型计划** · 面向有 Web 开发经验的 C# 转型者 · 目标岗位：工业软件 / MES / 上位机（成都）

---

## 📑 目录

  - [📋 前言：三个前提](#前言三个前提)
  - [🛠️ 第 0 天：环境准备（详细版）](#第-0-天环境准备详细版)
    - [IDE 与运行时](#ide-与运行时)
    - [数据库](#数据库)
    - [工业通信模拟工具](#工业通信模拟工具)
    - [IoT 与消息队列](#iot-与消息队列)
    - [开发辅助](#开发辅助)
  - [1️⃣ 第一阶段：C# 上位机基础与通信打底（Day1-Day7）](#第一阶段c-上位机基础与通信打底day1day7)
    - [Day1：C# 核心回炉](#day1c-核心回炉)
    - [Day2：WinForm 快速上手](#day2winform-快速上手)
    - [Day3：WPF + MVVM 入门](#day3wpf--mvvm-入门)
    - [Day4：串口通信开发](#day4串口通信开发)
    - [Day5：TCP Socket 通信](#day5tcp-socket-通信)
    - [Day6：多线程与 UI 解耦](#day6多线程与-ui-解耦)
    - [Day7：工程化与项目骨架](#day7工程化与项目骨架)
  - [2️⃣ 第二阶段：Modbus 协议与数据采集（Day8-Day14）](#第二阶段modbus-协议与数据采集day8day14)
    - [Day8：Modbus 协议原理](#day8modbus-协议原理)
    - [Day9：NModbus4 实战](#day9nmodbus4-实战)
    - [Day10：点位表设计](#day10点位表设计)
    - [Day11：字节序与类型转换坑](#day11字节序与类型转换坑)
    - [Day12：数据库设计](#day12数据库设计)
    - [Day13：实时曲线与报警系统](#day13实时曲线与报警系统)
    - [Day14：阶段复盘与项目包装](#day14阶段复盘与项目包装)
  - [3️⃣ 第三阶段：OPC UA 与 MES 业务开发（Day15-Day22）](#第三阶段opc-ua-与-mes-业务开发day15day22)
    - [Day15：MES 核心业务流](#day15mes-核心业务流)
    - [Day16：MES 数据模型设计](#day16mes-数据模型设计)
    - [Day17：扫码过站追溯实现](#day17扫码过站追溯实现)
    - [Day18：OPC UA 协议原理](#day18opc-ua-协议原理)
    - [Day19：OPC UA 订阅式开发](#day19opc-ua-订阅式开发)
    - [Day20：OEE 计算与设备看板](#day20oee-计算与设备看板)
    - [Day21：生产看板开发](#day21生产看板开发)
    - [Day22：权限审计与系统集成](#day22权限审计与系统集成)
  - [4️⃣ 第四阶段：MQTT、AI 与整合投递（Day23-Day30）](#第四阶段mqttai-与整合投递day23day30)
    - [Day23：MQTT 协议原理](#day23mqtt-协议原理)
    - [Day24：断网缓存与补传机制](#day24断网缓存与补传机制)
    - [Day25：FastAPI 数据服务](#day25fastapi-数据服务)
    - [Day26：大模型自动生成生产日报](#day26大模型自动生成生产日报)
    - [Day27：RAG 工厂知识库问答](#day27rag-工厂知识库问答)
    - [Day28：项目整合与演示视频](#day28项目整合与演示视频)
    - [Day29：简历定稿](#day29简历定稿)
    - [Day30：密集投递与面试准备](#day30密集投递与面试准备)
  - [✅ 每周自检清单](#每周自检清单)
    - [第 1 周末（Day7）自检](#第-1-周末day7自检)
    - [第 2 周末（Day14）自检](#第-2-周末day14自检)
    - [第 3 周末（Day21）自检](#第-3-周末day21自检)
    - [第 4 周末（Day30）自检](#第-4-周末day30自检)
  - [⚠️ 三个常见陷阱](#三个常见陷阱)
    - [陷阱 1：只看教程不动手](#陷阱-1只看教程不动手)
    - [陷阱 2：想先学 PLC 梯形图再转](#陷阱-2想先学-plc-梯形图再转)
    - [陷阱 3：等项目完美了再投简历](#陷阱-3等项目完美了再投简历)
  - [🚀 30 天后的进阶路线](#30-天后的进阶路线)
    - [第 2-3 个月：深化与入职](#第-23-个月深化与入职)
    - [第 4-6 个月：岗位深耕](#第-46-个月岗位深耕)
    - [第 7-12 个月：能力跃迁](#第-712-个月能力跃迁)
  - [💼 面试准备要点](#面试准备要点)
    - [简历关键词清单](#简历关键词清单)
    - [项目包装话术](#项目包装话术)
    - [常见面试问题与回答思路](#常见面试问题与回答思路)
    - [Q1：Modbus 和 OPC UA 有什么区别？什么时候用哪个？](#q1modbus-和-opc-ua-有什么区别什么时候用哪个)
    - [Q2：串口粘包怎么处理？](#q2串口粘包怎么处理)
    - [Q3：多线程 UI 卡怎么优化？](#q3多线程-ui-卡怎么优化)
    - [Q4：为什么选 C# 而不是 Python 做上位机？](#q4为什么选-c-而不是-python-做上位机)
    - [成都本地投递渠道](#成都本地投递渠道)
    - [薪资参考（成都）](#薪资参考成都)

---

## 📋 前言：三个前提

1. 时间投入：工作日每天 2-3 小时，周末 4-6 小时，30 天累计约 80-100 小时。对于有 Web 开发经验的开发者，C# 语法迁移成本较低，重点在于工业协议与硬件通信。
2. 不等学完再投：第 15 天起就开始投递，边学边面。成都高新区、郫都区、龙泉驿区有大量 MES/上位机岗位，面试反馈是最好的学习方向标。
3. 每天有产出：代码、笔记、截图、可演示程序。30 天后你将拥有一个完整的 GitHub 仓库和演示视频，而非一堆零散笔记。

## 🛠️ 第 0 天：环境准备（详细版）

### IDE 与运行时

- Visual Studio 2022 Community：免费，工控首选。安装时勾选「.NET 桌面开发」和「ASP.NET Web 开发」工作负载。
- .NET 8 SDK：LTS 版本，工业界主流。从 https://dotnet.microsoft.com/download/dotnet/8.0 下载，安装后命令行执行 `dotnet --version` 验证。
- Rider（可选）：付费但跨平台体验好，若已有 License 可直接使用。

### 数据库

- SQL Server Express 2022：免费，C# 生态原生支持。从微软官网下载，安装时选择「基本」模式，记住 SA 密码。
- MySQL 8：若目标公司用 MySQL 则装此版本。
- DBeaver：免费开源数据库工具，支持所有主流数据库。从 https://dbeaver.io 下载 Community 版。

### 工业通信模拟工具

- Modbus Slave：Windows 平台，模拟从站设备。从 https://modbustools.com 下载，免费版支持 1 个从站。
- Modbus Poll：模拟主站，用于测试读写。同上网站下载。
- Prosys OPC UA Simulation Server：免费试用 30 天，从 https://prosysopc.com 下载，用于 OPC UA 开发调试。
- FreeOpcUa：开源 OPC UA 服务器，GitHub 搜索 FreeOpcUa/opcua-asyncio 可获取 Python 版本用于测试。

### IoT 与消息队列

- EMQX：Docker 部署，执行 `docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p` `18083:18083 emqx/emqx:latest`。管理面板 http://localhost:18083，默认账号 admin/public。
- MQTTX：跨平台 MQTT 测试工具，从 https://mqttx.app 下载。

### 开发辅助

- Git + GitHub：创建私有仓库 IndustrialSoftware30Days，每天提交代码。
- Postman：API 测试，从 https://www.postman.com 下载。
- VS Code：写 Python/FastAPI 用，安装 Python、Pylance、Jupyter 扩展。
- Python 3.11+：从 https://www.python.org 下载，安装时勾选「Add to PATH」。执行`pip install fastapi uvicorn paho-mqtt sqlalchemy python-dotenv`。

## 1️⃣ 第一阶段：C# 上位机基础与通信打底（Day1-Day7）

### Day1：C# 核心回炉

> 🎯 **学习目标** 补齐 C# 在工控场景下的核心特性，重点掌握异步编程与内存管理。

> 📌 **技术重点**

- async/await 与 Task：工控程序大量 IO 操作（串口、TCP、数据库），必须掌握异步模式。重点理解 `Task.Run()`、`ConfigureAwait(false)`、`CancellationToken` 取消令牌。
- 委托与事件：`Action<T>`、`Func<T>`、`event`、`EventHandler<T>`。工控中设备状态变更、数据到达都靠事件驱动。
- LINQ：`Where`、`Select`、`GroupBy`、`ToDictionary`。处理采集数据时高频使用。
- 泛型与集合：`List<T>`、`Dictionary<TKey,TValue>`、`ConcurrentDictionary`、`BlockingCollection<T>`。线程安全集合在多线程采集中必用。
- 反射与属性：`Type`、`PropertyInfo`、自定义 `Attribute`。用于动态加载配置、自动映射点位。

> 💡 **学习思路** 你有 Web 开发基础，C# 语法迁移快。不要从头看教程，直接针对上述 5 个点写控制台程序验证。重点放在 `async/await` 和 `ConcurrentDictionary`，这两个在工控中踩坑最多。推荐微软官方文档「Asynchronous programming with async and await」章节。

> ✅ **具体练习** 创建一个控制台项目 `Day1_CSharpCore`：

1. 写一个异步方法模拟设备数据采集，使用 `CancellationToken` 支持优雅停止。
2. 用 `ConcurrentDictionary` 实现线程安全的设备状态缓存。
3. 用自定义 `Attribute`+ 反射实现一个简单的配置类自动加载。

> ⚠️ **常见坑与注意事项**

- `async void` 仅用于事件处理程序，其他场景一律返回 `Task`。
- UI 线程中不要直接 `await` 耗时操作，用 `Task.Run()` 包裹。
- `ConcurrentDictionary` 的 `GetOrAdd` 不是原子操作，复杂逻辑需配合 `Lazy<T>`。

### Day2：WinForm 快速上手

> 🎯 **学习目标** 掌握 WinForm 在工控场景下的快速开发能力，很多老项目仍用 WinForm。

> 📌 **技术重点**

- 控件体系：`DataGridView`（数据展示核心）、`Timer`（定时采集）、`BackgroundWorker`（后台任务）、`TabControl`、`SplitContainer`。
- 跨线程 UI 更新：`Invoke`、`BeginInvoke`、`Control.CheckForIllegalCrossThreadCalls`。
- 自定义控件：重写 `OnPaint`、`UserControl`、`ControlStyles`。工控中自定义指示灯、仪表盘是刚需。
- 布局与锚定：`Anchor`、`Dock`、`TableLayoutPanel`、`FlowLayoutPanel`。工控界面需适配不同分辨率。

> 💡 **学习思路** WinForm 上手极快，1 天足够。重点不是学控件属性，而是理解「跨线程 UI 更新」和「自定义控件绘制」。推荐看微软官方「Windows Forms documentation」中的「Custom Painting」章节。

> ✅ **具体练习** 创建 WinForm 项目 `Day2_WinForm`：

1. 用 `DataGridView` 展示模拟设备数据，支持按列排序。
2. 用 `Timer` 每秒更新数据，通过 `BeginInvoke` 安全刷新 UI。
3. 自定义一个 `IndicatorLight` 控件，支持颜色、闪烁、状态文本。

> ⚠️ **常见坑与注意事项**

- `Timer.Tick` 在 UI 线程执行，耗时操作必须丢到后台。
- `DataGridView` 数据量大时（>1000 行）必须用虚拟模式 `VirtualMode`。
- 自定义控件务必调用 `SetStyle(ControlStyles.OptimizedDoubleBuffer, true)` 防闪烁。

### Day3：WPF + MVVM 入门

> 🎯 **学习目标** 掌握 WPF + MVVM，现代上位机开发的主流选择。

> 📌 **技术重点**

- MVVM 模式：`INotifyPropertyChanged`、`ICommand`、`RelayCommand`、数据绑定、命令绑定。
- Prism 框架：模块化、导航、事件聚合器、依赖注入。工控项目复杂度高，Prism 是事实标准。
- 样式与模板：`Style`、`ControlTemplate`、`DataTemplate`、`ResourceDictionary`。工控界面需要统一主题。
- 附加属性与行为：`AttachedProperty`、`Behavior<T>`。扩展控件能力而不继承。

> 💡 **学习思路** WPF 学习曲线陡，但你有 Web 经验，XAML 类比 HTML，Binding 类比 Vue/React 的响应式。不要从零手写 MVVM，直接用 Prism 模板。推荐 Brian Lagunas 的「Prism Bootcamp」免费视频。

> ✅ **具体练习** 创建 WPF 项目 `Day3_WpfMvvm`（使用 Prism 模板）：

1. 实现一个设备监控主界面，左侧设备列表，右侧详情。
2. 用 `EventAggregator` 实现设备选择联动详情刷新。
3. 自定义一个 `LedIndicator` 控件，通过绑定改变状态。

> ⚠️ **常见坑与注意事项**

- 不要在 ViewModel 中引用 View，违反 MVVM 原则。
- `Binding` 忘记设置 `Mode=TwoWay` 导致数据不回传是新手最常见错误。
- Prism 的 `INavigationAware` 接口用于页面间传参，务必掌握。

### Day4：串口通信开发

> 🎯 **学习目标** 掌握串口通信，工控中最基础的物理层通信方式。

> 📌 **技术重点**

- SerialPort 类：`PortName`、`BaudRate`、`DataBits`、`StopBits`、`Parity`、`Handshake`。
- RS232 vs RS485：RS232 点对点，RS485 多点总线，接线方式、终端电阻、通信距离差异。
- 数据接收：`DataReceived` 事件、`ReadExisting()`、`Read(byte[], offset, count)`。
- 粘包处理：串口是字节流，无消息边界。必须实现帧头帧尾校验、状态机解析。
- 编码：ASCII、UTF8、GB2312。工控设备常用 ASCII 或自定义编码。

> 💡 **学习思路** 先理解物理层差异，再写代码。用 Modbus Slave 模拟从站，你的程序作主站发送 Modbus RTU 帧。重点攻克「粘包处理」，这是串口开发的核心难点。推荐看「Serial Communication Protocols」相关文档。

> ✅ **具体练习** 创建项目 `Day4_SerialPort`：

1. 实现串口配置界面（端口、波特率、数据位等下拉选择）。
2. 实现帧解析状态机：IDLE -> HEADER -> DATA -> CHECKSUM -> COMPLETE。
3. 用 Modbus Slave 模拟从站，你的程序发送 03 功能码读取寄存器并解析。

> ⚠️ **常见坑与注意事项**

- `DataReceived` 不一定一次收完一帧，必须缓存+状态机解析。
- 串口打开/关闭必须在非 UI 线程，且需处理异常（如 USB 转串口拔出）。
- RS485 总线注意终端电阻和接地，软件层面注意主从轮询时序。

### Day5：TCP Socket 通信

> 🎯 **学习目标** 掌握 TCP Socket 编程，工业以太网通信的基础。

> 📌 **技术重点**

- Socket 编程：`TcpListener`、`TcpClient`、`NetworkStream`、异步 Accept/Read/Write。
- TCP vs UDP：TCP 可靠有序，UDP 快速不可靠。工控中 Modbus TCP、OPC UA 用 TCP，某些实时采集用 UDP。
- 心跳机制：定时发送心跳包，检测连接存活。工控网络不稳定，心跳是必备。
- 断线重连：指数退避重连策略，避免网络恢复时瞬间大量重连请求。
- 粘包拆包：同串口，TCP 也是流式协议。常用方案：固定长度、长度前缀、分隔符。

> 💡 **学习思路** 你有 Web 后端经验，TCP Socket 概念不陌生。重点放在「心跳+断线重连+粘包」三件套，这是工控 TCP 通信的标配。推荐看《C# Network Programming》相关章节。

> ✅ **具体练习** 创建项目 `Day5_TcpSocket`：

1. 实现 TCP 服务端，支持多客户端连接，用 `ConcurrentDictionary` 管理会话。
2. 实现长度前缀协议：4 字节长度头 + N 字节数据体。
3. 实现心跳检测（30 秒无数据断开）和断线重连（指数退避：1s/2s/4s/8s…最大 60s）。

> ⚠️ **常见坑与注意事项**

- `NetworkStream.Read` 返回值可能小于请求长度，必须循环读取直到收够。
- 服务端必须用异步 Accept，否则单线程只能处理一个连接。
- 心跳超时判断要考虑时钟漂移，用 `Stopwatch` 而非 `DateTime` 差值。

### Day6：多线程与 UI 解耦

> 🎯 **学习目标** 掌握工控程序的多线程架构，确保 UI 流畅、采集稳定。

> 📌 **技术重点**

- Task 与 ThreadPool：`Task.Run()`、`Task.WhenAll()`、`Parallel.ForEach()`。
- Dispatcher：WPF 的 `Dispatcher.Invoke/BeginInvoke`，WinForm 的 `Control.Invoke/` `BeginInvoke`。
- 生产者消费者模式：`BlockingCollection<T>`、`Channel<T>`（.NET Core 推荐）。采集线程生产，处理线程消费。
- 线程安全：`lock`、`SemaphoreSlim`、`Interlocked`、`volatile`。
- 内存泄漏：事件未取消订阅、Timer 未释放、大对象驻留 LOH。

> 💡 **学习思路** 工控程序典型架构：采集线程（后台）-> 消息队列 -> 处理线程（后台）-> UI 更新（主线程）。这个模型必须烂熟于心。重点理解 `Channel<T>`，它是.NET Core 下生产者消费者的最佳实践。

> ✅ **具体练习** 创建项目 `Day6_MultiThread`：

1. 用 `Channel<T>` 实现采集-处理-UI 三层架构。
2. 采集线程每秒产生 100 条模拟数据，处理线程聚合后推送到 UI。
3. 用 `SemaphoreSlim` 限制并发数据库写入数。

> ⚠️ **常见坑与注意事项**

- UI 线程只做渲染，任何耗时操作（包括 JSON 序列化）都丢到后台。
- `BlockingCollection` 在取消时用 `CompleteAdding()`，消费者用 `GetConsumingEnumerable()`自动退出。
- 高频 UI 更新（>30fps）必须节流，用 `DispatcherTimer` 或采样后批量刷新。

### Day7：工程化与项目骨架

> 🎯 **学习目标** 搭建工控项目的标准工程化骨架，后续所有项目复用。

> 📌 **技术重点**

- Serilog 日志：结构化日志、文件滚动、控制台输出、日志级别。工控现场排障全靠日志。
- JSON 配置：`appsettings.json`、`IOptions<T>`、配置热重载。
- 全局异常捕获：`AppDomain.UnhandledException`、`Dispatcher.UnhandledException`、`TaskScheduler.UnobservedTaskException`。
- 单元测试：NUnit/xUnit + Moq。工控逻辑（协议解析、报警规则）必须可测试。
- 依赖注入：`Microsoft.Extensions.DependencyInjection`。Prism 内置 DI，但理解原理很重要。

> 💡 **学习思路** 工程化不是可选项，是工控软件的底线。现场环境千奇百怪，没有日志和异常处理等于裸奔。把 Day7 的产出作为后续所有项目的模板。

> ✅ **具体练习** 创建项目 `Day7_ProjectTemplate`：

1. 集成 Serilog，配置按天滚动+控制台输出。
2. 实现全局异常捕获，异常写入日志并弹窗提示。
3. 写一个协议解析器的单元测试，覆盖正常帧、异常帧、边界值。
4. 将以上整合为 Visual Studio 项目模板。

> ⚠️ **常见坑与注意事项**

- 日志路径必须用绝对路径或 AppData，工控机当前目录可能无写权限。
- 全局异常捕获后不要直接退出，先保存现场再提示用户。
- 单元测试不要依赖真实硬件，全部用 Mock 或模拟器。

## 2️⃣ 第二阶段：Modbus 协议与数据采集（Day8-Day14）

### Day8：Modbus 协议原理

> 🎯 **学习目标** 彻底理解 Modbus 协议，这是工控通信的「普通话」。

> 📌 **技术重点**

- Modbus RTU vs TCP：RTU 基于串口，帧头帧尾用静默时间判断；TCP 基于以太网，6 字节 MBAP 头替代地址+校验。
- 四种数据区：线圈（0x，读写）、离散输入（1x，只读）、输入寄存器（3x，只读）、保持寄存器（4x，读写）。
- 功能码详解：01 读线圈、02 读离散、03 读保持寄存器、04 读输入寄存器、05 写单线圈、06 写单寄存器、15 写多线圈、16 写多寄存器。
- 地址偏移：协议地址从 0 开始，但很多 PLC 文档从 1 开始。40001 对应协议地址 40000。这是最常见的坑。
- 异常响应：功能码+0x80 + 异常码（01 非法功能、02 非法地址、03 非法数据值）。

> 💡 **学习思路** 不要死记硬背，对照 Modbus Slave 的界面理解四种数据区。用 Modbus Poll 手动发几条指令，观察报文和响应。推荐《Modbus Application Protocol Specification V1.1b3》官方文档。

> ✅ **具体练习**

1. 用 Modbus Slave 创建模拟设备：线圈 10 个、保持寄存器 20 个。
2. 用 Modbus Poll 读取并写入，记录每次的完整报文（十六进制）。
3. 手动计算：读 40001 开始的 3 个寄存器，写出完整 RTU 帧和 TCP 帧。

> ⚠️ **常见坑与注意事项**

- 地址偏移问题：务必确认 PLC 文档的地址是协议地址还是显示地址。
- 功能码 16 写多寄存器时，字节数=寄存器数 x2，写错会导致设备拒绝。
- RTU 帧的 CRC 校验是低字节在前，高字节在后，与常规相反。

### Day9：NModbus4 实战

> 🎯 **学习目标** 用 C# 库实现 Modbus 通信，替代手写协议解析。

> 📌 **技术重点**

- NuGet 安装：`NModbus4` 或更现代的 `FluentModbus`。
- ModbusTcpClient：`ReadHoldingRegisters()`、`WriteSingleRegister()`、`WriteMultipleRegisters()`。
- 异步 API：`ReadHoldingRegistersAsync()`，工控程序必须用异步版本。
- 异常处理：`ModbusSlaveException`（设备返回异常）、`IOException`（网络/串口故障）、`TimeoutException`。
- 连接管理：连接池或长连接+重连，避免频繁建连。

> 💡 **学习思路** 先读 NModbus4 的 GitHub README 和示例，理解 API 设计。然后对接 Day8 的 Modbus Slave，验证读写。重点测试异常场景：设备离线、非法地址、超时。

> ✅ **具体练习** 创建项目 `Day9_ModbusClient`：

1. 封装 `ModbusService` 类，提供 `ReadRegistersAsync(address, count)` 和`WriteRegisterAsync(address, value)`。
2. 实现自动重连：连接失败时指数退避重试 3 次。
3. 写单元测试：用 Modbus Slave 模拟正常和异常响应。

> ⚠️ **常见坑与注意事项**

- NModbus4 的 `ReadHoldingRegisters` 返回 `ushort[]`，转 `int/float` 需自行处理字节序。
- 不要每次读写都新建连接，复用连接或实现连接池。
- 超时时间设置要合理：串口建议 500ms-1s，TCP 建议 1-3s。

### Day10：点位表设计

> 🎯 **学习目标** 掌握工业点位表设计，这是数据采集的配置核心。

> 📌 **技术重点**

- Excel 模板设计：设备名、点位名、PLC 地址、数据类型、单位、倍率、读写属性、报警上下限、描述。
- 配置驱动：程序启动时加载 Excel/CSV/JSON 点位表，动态生成采集任务。避免硬编码。
- 数据类型映射：Bool->线圈、Int16/UInt16->单寄存器、Int32/Float->双寄存器、Double->四寄存器。
- 倍率处理：PLC 存整数，上位机乘倍率转浮点。如温度 PLC 存 256，倍率 0.1，实际 25.6 度 C。
- 版本管理：点位表变更需记录版本号，支持回滚。

> 💡 **学习思路** 找一份真实的 MES 点位表模板（网上搜「PLC 点位表模板」），理解每个字段的含义。然后设计自己的模板，用 EPPlus 或 MiniExcel 库实现加载。

> ✅ **具体练习** 创建项目 `Day10_PointTable`：

1. 设计 Excel 点位表模板，包含至少 20 个点位，覆盖各种数据类型。
2. 实现 `PointTableLoader` 类，加载 Excel 并校验（地址格式、数据类型合法性）。
3. 根据点位表自动生成 Modbus 采集任务列表。

> ⚠️ **常见坑与注意事项**

- 点位表必须有校验：地址重复、数据类型与寄存器数不匹配、倍率为 0。
- 浮点数占用 2 个寄存器，需确认高低字顺序（ABCD vs CDAB）。
- 点位表变更后程序应支持热重载或重启提示，不要硬编码。

### Day11：字节序与类型转换坑

> 🎯 **学习目标** 彻底解决工控中最头疼的字节序问题。

> 📌 **技术重点**

- Endianness：BigEndian（大端，高字节在前）、LittleEndian（小端，低字节在前）。Modbus 默认 BigEndian，但 PLC 可能是 LittleEndian。
- 浮点数存储：IEEE754 Float 占 2 个寄存器，4 种字节序：ABCD、CDAB、BADC、DCBA。
- Int32/UInt32：同样占 2 个寄存器，字节序问题同浮点。
- 位操作：从 UInt16 中提取单个 Bit 作为 Bool 值。`value & (1 << bitIndex)`。
- BitConverter：C# 的 `BitConverter` 依赖平台字节序，工控中必须手动处理。

> 💡 **学习思路** 这是纯实操技能，看文档不如写代码验证。准备已知值的浮点数，写入 PLC 后用不同字节序读取，观察哪种正确。推荐用在线工具「Float to Hex Converter」辅助验证。

> ✅ **具体练习** 创建项目 `Day11_Endianness`：

1. 写一个字节序转换工具类，支持 BigEndian/LittleEndian 互转。
2. 实现浮点数与字节数组的双向转换（覆盖 4 种字节序）。
3. 用已知值验证：如浮点数 3.14 在不同字节序下的十六进制表示。

> ⚠️ **常见坑与注意事项**

- 不同品牌 PLC 字节序不同：西门子默认 ABCD，三菱默认 CDAB，欧姆龙可选。
- Modbus 协议规定高位字节在前，但很多 PLC 出厂设置是小端。
- 浮点数转换错误是现场排障最耗时的 bug 之一，务必写单元测试覆盖。

### Day12：数据库设计

> 🎯 **学习目标** 设计工业数据采集的数据库模型，支撑后续 MES 业务。

> 📌 **技术重点**

- 核心表设计：设备表（Device）、点位表（Point）、实时数据表（RealtimeData）、报警表（Alarm）、产量汇总表（ProductionSummary）。
- 时间序列数据存储：实时数据表按时间分区、定期归档到历史表。
- 索引策略：设备 ID+时间戳联合索引、报警表的状态索引。
- ORM 选型：Entity Framework Core（快速开发）或 Dapper（高性能查询）。
- 数据清理策略：实时数据表保留 30 天，历史表按月归档。

> 💡 **学习思路** 先画 ER 图再写 SQL。工业数据的特点是写入量大、读取按时间范围查询。表设计要兼顾写入性能和查询效率。推荐看「Time-series database design patterns」相关文档。

> ✅ **具体练习** 创建项目 `Day12_Database`：

1. 用 SQL Server/MySQL 创建上述 5 张核心表。
2. 写 EF Core 实体类和 DbContext。
3. 实现批量插入优化：用 `BulkCopy` 或 EF Core 的 `AddRange`+ 事务。

> ⚠️ **常见坑与注意事项**

- 实时数据表不要用自增主键，用设备 ID+时间戳做复合主键。
- DateTime 类型注意时区问题，工业现场统一用 UTC 存储。
- 批量插入时注意事务大小，一次插入 1 万条比 100 万条快得多。

### Day13：实时曲线与报警系统

> 🎯 **学习目标** 实现工业监控的核心功能：实时曲线和报警。

> 📌 **技术重点**

- ScottPlot：高性能实时绘图控件，支持百万级数据点流畅渲染。NuGet 安装`ScottPlot.WPF` 或 `ScottPlot.WinForms`。
- LiveCharts2：现代化 WPF 图表库，支持实时数据绑定。NuGet 安装 `LiveCharts2.Wpf`。
- 报警规则引擎：基于点位配置的阈值判断（上限/下限/变化率），支持报警确认/消音/恢复。
- 报警优先级：紧急（红色）、重要（橙色）、一般（黄色）、提示（蓝色）。

> 💡 **学习思路** 先学会用 ScottPlot 画静态曲线，再实现动态刷新。报警系统先做简单的阈值判断，后续可升级为规则引擎。

> ✅ **具体练习** 创建项目 `Day13_Alarm`：

1. 用 ScottPlot 实现温度/压力实时曲线，支持缩放和游标。
2. 实现报警规则：当温度>80 度时触发高级别报警，<30 度触发低级别报警。
3. 报警列表支持确认、消音、历史记录查询。

> ⚠️ **常见坑与注意事项**

- ScottPlot 在 UI 线程高频刷新会卡顿，用 `RenderAsync` 或后台线程渲染。
- 报警不要频繁触发，加防抖机制（如阈值持续 5 秒超限才触发）。
- 曲线数据点过多时要做降采样，否则内存和渲染都会出问题。

### Day14：阶段复盘与项目包装

> 🎯 **学习目标** 整理第一阶段成果，开始准备简历和面试素材。

> 📌 **技术重点**

- README 撰写：项目简介、技术栈、架构图、运行说明、截图展示。
- 架构图绘制：用 Draw.io 或 Excalidraw 画系统架构图、数据流程图。
- Git 规范：语义化提交信息（feat/fix/docs/chore）、标签管理。
- 简历初稿：提炼项目亮点，量化成果（如「实现了毫秒级数据采集」「报警响应时间<1 秒」）。

> 💡 **学习思路** 不要等所有阶段结束才准备简历。第 14 天就开始写，后面每个阶段都往简历里加内容。面试看的是你能做出东西，不是学了多久。

> ✅ **具体练习**

1. 整理 Day1-Day7 的所有代码到一个 GitHub 仓库，写完整的 README。
2. 画一张系统架构图：上位机 -> Modbus -> 数据库 -> 看板。
3. 写简历初稿，重点描述你做的上位机项目。

> ⚠️ **常见坑与注意事项**

- GitHub 仓库设为私有也可以，面试官可以要求你现场演示。
- README 截图要用真实运行效果，不要放空白界面。
- 简历不要写「熟悉」写「掌握」，面试会被深挖。

## 3️⃣ 第三阶段：OPC UA 与 MES 业务开发（Day15-Day22）

### Day15：MES 核心业务流

> 🎯 **学习目标** 理解 MES 系统的核心业务流程，这是工业软件的核心价值所在。

> 📌 **技术重点**

- 工单管理：工单创建、下发、执行、报工、关闭全流程。状态机：待生产->生产中->暂停->完成->关闭。
- 工序定义：工序 BOM、工艺路线、工序参数模板。
- 报工流程：完工报工、废品报工、返工报工、工时统计。
- 批次追溯：正追溯（原料->成品）、反追溯（成品->原料），满足 ISO/食品医药行业要求。
- OEE 计算：OEE = 可用率 x 表现性 x 质量率。可用率=运行时间/计划时间，表现性=实际产量/理论产量，质量率=合格品数/总产量。

> 💡 **学习思路** 先理解业务再写代码。找一份 MES 需求文档（网上搜「MES 系统需求规格说明书」），理解每个业务环节的数据流。推荐看 ISA-95 标准中关于 MES 功能的描述。

> ✅ **具体练习**

1. 画 MES 核心业务流程图：ERP 下计划 -> MES 排工单 -> 产线执行 -> 报工 -> 数据回传 ERP。
2. 设计工单状态机代码，覆盖所有状态流转和非法操作拦截。
3. 实现 OEE 计算器：输入设备运行日志，输出 OEE 指标。

> ⚠️ **常见坑与注意事项**

- 工单状态机一定要做防御性编程，非法状态流转要记录日志并拒绝。
- OEE 计算的分母不能为 0，要有默认值和告警。
- 批次追溯的关联关系要在每个工序报工时就绑定好，不要事后补。

### Day16：MES 数据模型设计

> 🎯 **学习目标** 设计 MES 系统的数据库模型和 API 接口。

> 📌 **技术重点**

- 核心表设计：工单表（WorkOrder）、工序表（Operation）、报工表（Report）、物料消耗表（MaterialConsumption）、质量检验表（QualityInspection）、设备 OEE 表（EquipmentOEE）。
- API 接口设计：RESTful 风格，工单 CRUD、报工提交、数据查询、看板统计。
- 权限模型：RBAC 基于角色的访问控制，车间操作员/班组长/车间主任/管理员不同权限。
- 审计日志：关键操作记录操作人、时间、IP、前后值变更。

> 💡 **学习思路** 先设计表结构再写代码。工业系统的表设计比 Web 系统更复杂，因为涉及大量的状态流转和追溯关系。推荐看「Database design for manufacturing execution systems」相关文档。

> ✅ **具体练习** 创建项目 `Day16_MES_Model`：

1. 创建 MES 核心数据库表（工单、工序、报工、质量、OEE）。
2. 用 EF Core 生成实体类和 DbContext。
3. 实现工单 API：创建、查询、报工、关闭。

> ⚠️ **常见坑与注意事项**

- 工单表要记录 ERP 源单号，方便与 ERP 对账。
- 报工表要记录操作人和操作时间，满足审计要求。
- 质量检验表要支持抽样规则和判定规则配置。

### Day17：扫码过站追溯实现

> 🎯 **学习目标** 实现工业追溯的核心功能：扫码过站。

> 📌 **技术重点**

- 条码/RFID 集成：串口扫码枪模拟键盘输入、RFID 读卡器 TCP 通信。
- 过站逻辑：产品到达工序 -> 扫码确认 -> 绑定工单/批次/设备/操作员 -> 记录过站时间。
- 追溯链构建：正向追溯（原料批次 -> 生产工序 -> 成品批次）、反向追溯（成品批次 -> 生产工序 -> 原料批次）。
- 防错机制：扫码重复提示、工单未下发拦截、物料批次过期拦截。

> 💡 **学习思路** 先用串口模拟扫码枪（很多扫码枪支持串口模式），实现基本的扫码录入。然后构建追溯链。推荐看「Barcode scanning in industrial applications」相关文档。

> ✅ **具体练习** 创建项目 `Day17_Traceability`：

1. 实现串口扫码枪监听，自动读取条码并解析。
2. 实现过站逻辑：扫码后查询工单状态，记录过站信息到数据库。
3. 实现追溯查询：输入成品条码，展示完整生产链路。

> ⚠️ **常见坑与注意事项**

- 扫码枪有各种模式（串口/键盘/HID），要支持多种模式适配。
- 扫码后要有声音/灯光反馈，现场环境嘈杂需要明显提示。
- 追溯数据不能删除，只能标记作废，满足合规要求。

### Day18：OPC UA 协议原理

> 🎯 **学习目标** 理解 OPC UA 协议架构和核心概念，这是工业 4.0 的通信标准。

> 📌 **技术重点**

- OPC UA 架构：客户端-服务器模型、发布订阅模型。
- 命名空间：每个服务器定义自己的命名空间，节点 ID 由命名空间 URI+标识符组成。
- 节点模型：对象节点、变量节点、方法节点、视图节点、引用类型。
- 浏览节点树：Organizes 节点、HasComponent、HasProperty、HasChild 引用。
- 数据类型：基础类型（Int32、Float、Double、Boolean、DateTime）、结构化类型、数组。
- 安全认证：匿名、用户名密码、证书认证三种安全模式。

> 💡 **学习思路** OPC UA 比 Modbus 复杂很多，不要试图一次性学完。先理解架构和节点浏览，能读数据就行。推荐看 OPC Foundation 官方文档「OPC UA Specification Part 1-3」和 Prosys 的免费教程。

> ✅ **具体练习**

1. 启动 Prosys Simulation Server，用 UA Expert（免费 OPC UA 客户端）浏览节点树。
2. 理解命名空间、节点 ID、变量值的结构。
3. 手动读取模拟服务器的温度、压力等变量。

> ⚠️ **常见坑与注意事项**

- OPC UA 的节点 ID 格式复杂（numeric、string、guid、opaque），用字符串格式最容易调试。
- 浏览节点树时要处理分页，大型服务器节点数可能上万。
- 安全策略配置是入门最大障碍，先用 Anonymous+None 安全模式跑通。

### Day19：OPC UA 订阅式开发

> 🎯 **学习目标** 用 C# 实现 OPC UA 客户端，掌握订阅式数据读取。

> 📌 **技术重点**

- C# OPC UA 客户端：使用 `OPCFoundation.NetStandard.Opc.Ua` 官方库。
- 同步读取：`ReadValueAsync`，适合一次性查询。
- 订阅式读取：`CreateSubscription`+`MonitoredItem`，服务器主动推送数据变化。
- 历史数据读取：`ReadHistoryDataAsync`，获取过去某时间段的数据。
- 报警事件订阅：`CreateSubscription` 订阅报警和事件。

> 💡 **学习思路** 先实现同步读取验证连接正常，再实现订阅模式。订阅是工业采集的最佳实践，比轮询更高效。推荐看 GitHub 上 `OPCFoundation/UA-.NETStandard` 的示例代码。

> ✅ **具体练习** 创建项目 `Day19_OpcUaClient`：

1. 实现 OPC UA 客户端连接 Prosys 仿真服务器。
2. 实现同步读取：读取指定节点的值。
3. 实现订阅模式：订阅 10 个变量，数据变化时自动回调处理。
4. 读取历史数据并绘制曲线。

> ⚠️ **常见坑与注意事项**

- 订阅要设置合适的 SamplingInterval，太频繁会拖垮服务器。
- 连接断开后订阅自动失效，需要实现重连后重新订阅。
- 节点 ID 字符串要完全匹配，大小写敏感。

### Day20：OEE 计算与设备看板

> 🎯 **学习目标** 实现 OEE 计算和设备状态看板，这是车间主任最关注的指标。

> 📌 **技术重点**

- OEE 六大类损失：设备故障、换型调整、启动废品、减速运行、加工废品、产能损失。
- 可用率计算：运行时间 = 计划时间 - 停机时间。停机包括计划停机和意外停机。
- 表现性计算：实际节拍 / 理论节拍。需要考虑换型损失和减速运行。
- 质量率计算：合格品数 / 总产量。包括返工品和废品。
- 设备状态机：运行、待机、故障、保养、换型、休息等状态。

> 💡 **学习思路** OEE 计算看似简单，但实际落地有很多细节。先实现基础版本（可用率 x 表现性 x 质量率），后续根据工厂实际情况调整。推荐看 SMED 和 TPM 相关方法论。

> ✅ **具体练习** 创建项目 `Day20_OEE`：

1. 实现设备状态记录服务：记录设备状态切换时间和原因。
2. 实现 OEE 计算器：按班/天/周/月统计 OEE 及三大率。
3. 用 WPF/WinForm 制作设备看板界面：显示实时状态、OEE 趋势、报警信息。

> ⚠️ **常见坑与注意事项**

- 设备状态切换要有确认机制，避免误操作导致数据不准。
- OEE 统计要排除计划保养时间，否则可用率会被拉低。
- 看板数据刷新频率不宜太高，5-10 秒一次即可。

### Day21：生产看板开发

> 🎯 **学习目标** 开发车间生产看板，实时展示生产进度和关键指标。

> 📌 **技术重点**

- 前端框架：Blazor（C# 全栈）或 Vue.js（前端专业）。工控推荐 Blazor，技术栈统一。
- WebSocket 实时推送：SignalR（.NET 内置）实现服务端推送数据到前端。
- 图表组件：Gantt 图（生产进度）、柱状图（产量对比）、折线图（趋势）、仪表盘（OEE）。
- 大屏适配：1920x1080/3840x2160 分辨率适配，字体大小、颜色对比度。

> 💡 **学习思路** 先用 Blazor Server 做一个简单的看板页面，再逐步丰富内容。工控看板不同于 BI 报表，要突出实时性和异常提示。推荐看「Factory dashboard design best practices」相关文档。

> ✅ **具体练习** 创建项目 `Day21_Dashboard`：

1. 用 Blazor Server 创建生产看板页面。
2. 用 SignalR 实现实时数据推送（设备状态、产量、报警）。
3. 集成图表组件：生产进度甘特图、OEE 仪表盘、报警列表。
4. 适配大屏分辨率，设置自动全屏模式。

> ⚠️ **常见坑与注意事项**

- SignalR 在 IIS 部署时要注意连接数限制和超时设置。
- 看板数据不要每次都查数据库，用内存缓存+定时刷新。
- 大屏颜色要考虑到车间照明条件，避免暗色主题看不清。

### Day22：权限审计与系统集成

> 🎯 **学习目标** 完善 MES 系统的权限管理和系统集成能力。

> 📌 **技术重点**

- RBAC 权限模型：用户-角色-权限三级模型，菜单权限+按钮权限+数据权限。
- 审计日志：关键操作记录（谁、何时、做了什么、改了什么），满足 ISO 审计要求。
- Excel 导出：用 EPPlus 或 MiniExcel 实现报表导出，支持多 Sheet、图表嵌入。
- HTTP/WebSocket 接口：对外提供 RESTful API，供 ERP/WMS/AGV 系统调用。
- JWT 认证：API 接口统一认证，支持 Token 刷新和权限校验。

> 💡 **学习思路** 权限和审计是工业系统从「能用」到「好用」的关键。先实现基础 RBAC，再根据实际需求扩展。推荐看「Role-based access control implementation patterns」相关文档。

> ✅ **具体练习** 创建项目 `Day22_Integration`：

1. 实现 RBAC 权限系统：用户管理、角色管理、权限分配。
2. 实现审计日志中间件：自动记录所有写操作。
3. 实现 Excel 导出服务：导出生产报表、质量报表。
4. 用 Postman 测试所有 API 接口，编写接口文档。

> ⚠️ **常见坑与注意事项**

- 权限判断要在 API 层和 UI 层都做，不能只靠前端控制。
- 审计日志不要阻塞主流程，用异步写入。
- Excel 导出大数据量时要分页或异步生成文件。

## 4️⃣ 第四阶段：MQTT、AI 与整合投递（Day23-Day30）

### Day23：MQTT 协议原理

> 🎯 **学习目标** 掌握 MQTT 协议，实现工业设备数据上云。

> 📌 **技术重点**

- 发布订阅模式：Publisher -> Broker -> Subscriber 架构。
- Topic 设计：层级结构（工厂/车间/设备/指标）、通配符（+ 和 #）。
- QoS 等级：QoS 0（最多一次）、QoS 1（至少一次）、QoS 2（恰好一次）。
- Retained 消息：保留消息，新订阅者立即收到最新状态。
- Last Will 遗嘱消息：客户端异常断开时 Broker 发布遗嘱消息。
- EMQX 部署：Docker 部署、用户认证、ACL 权限、WebSocket 桥接。

> 💡 **学习思路** MQTT 比 Modbus 和 OPC UA 简单很多，重点理解 Topic 设计和 QoS。工业场景下 MQTT 常用于边缘设备到云平台的数据传输。推荐看 EMQX 官方文档和 MQTT.org 规范。

> ✅ **具体练习**

1. Docker 部署 EMQX，用 MQTTX 连接测试发布订阅。
2. 设计工业 Topic 规范：如 `factory/{code}/device/{deviceId}/telemetry`。
3. 实现 C# MQTT 客户端：连接 EMQX、发布设备数据、订阅控制指令。

> ⚠️ **常见坑与注意事项**

- Topic 不要包含敏感信息（如设备 IP），用编码后的设备 ID。
- QoS 2 虽然可靠但性能低，工业遥测数据用 QoS 1 即可。
- 遗嘱消息要设置合理的保留消息和过期时间。

### Day24：断网缓存与补传机制

> 🎯 **学习目标** 实现工业场景下的断网数据缓存和恢复补传，这是现场真实痛点。

> 📌 **技术重点**

- 本地缓存策略：SQLite 或 JSON 文件做本地缓存，网络恢复后补传。
- 缓存策略：FIFO 队列、容量限制、过期清理。
- 断网检测：心跳失败判定断网、网络恢复检测。
- 补传机制：断网期间数据暂存本地、网络恢复后按时间顺序补传。
- 消息去重：用消息 ID+时间戳去重，防止网络抖动导致重复上报。

> 💡 **学习思路** 这是区分「Demo 项目」和「工业级项目」的关键能力。现场网络不稳定是常态，不能假设网络永远在线。推荐看「Edge computing data buffering patterns」相关文档。

> ✅ **具体练习** 创建项目 `Day24_Offline`：

1. 实现本地 SQLite 缓存服务：数据写入本地表。
2. 实现断网检测：定时心跳，失败 3 次判定断网。
3. 实现补传服务：网络恢复后从本地表读取未上报数据，按序发送。
4. 实现消息去重：服务端记录最近 N 条消息 ID，拒绝重复。

> ⚠️ **常见坑与注意事项**

- 本地缓存要有容量上限和过期策略，防止磁盘写满。
- 补传时要控制速率，不要瞬间大量请求打爆服务端。
- 缓存数据要加密存储，防止设备丢失导致数据泄露。

### Day25：FastAPI 数据服务

> 🎯 **学习目标** 用 Python FastAPI 搭建工业数据服务接口。

> 📌 **技术重点**

- FastAPI 基础：路由定义、请求/响应模型、依赖注入、中间件。
- RESTful API 设计：资源命名规范、HTTP 状态码、分页、过滤、排序。
- 数据库操作：SQLAlchemy ORM、异步查询、连接池。
- Swagger 文档：FastAPI 自动生成 API 文档，开发调试方便。
- 异步支持：`async/await` 支持高并发 IO 操作。

> 💡 **学习思路** 你有 Python 基础，FastAPI 上手很快。重点理解 RESTful 设计原则和异步编程模式。推荐看 FastAPI 官方文档和「REST API design best practices」相关文档。

> ✅ **具体练习** 创建项目 `Day25_FastAPI`：

1. 搭建 FastAPI 项目骨架：路由、中间件、异常处理、日志。
2. 实现设备数据 API：上传数据、查询数据、统计汇总。
3. 实现 MES 业务 API：工单管理、报工、质量检验。
4. 自动生成 Swagger 文档，用 Postman 测试所有接口。

> ⚠️ **常见坑与注意事项**

- 数据库连接要用连接池，不要每次请求新建连接。
- API 响应要有统一的格式（code/message/data），方便前端解析。
- 敏感接口（如写操作）要加认证和权限校验。

### Day26：大模型自动生成生产日报

> 🎯 **学习目标** 利用大模型能力自动生成生产日报，展示 AI 在工业场景的应用。

> 📌 **技术重点**

- 大模型 API 调用：对接通义千问/OpenAI/GPT 等 API。
- Prompt 工程：设计生产日报的 Prompt 模板，包含数据模板和格式要求。
- 数据格式化：将数据库查询结果格式化为大模型可理解的文本。
- 日报模板：生产概况、OEE 分析、异常汇总、改进建议。
- 异步任务：日报生成耗时操作，用后台任务+邮件/消息通知。

> 💡 **学习思路** 这是 AI Agent 在工业场景最落地的应用之一。先手写几个日报模板，再用大模型自动生成。重点在于 Prompt 工程和数据结构化。推荐看「Prompt engineering for business automation」相关文档。

> ✅ **具体练习** 创建项目 `Day26_AIGen`：

1. 设计生产日报 Prompt 模板（包含日期、产量、OEE、异常等数据占位符）。
2. 实现日报生成服务：查询数据 -> 填充模板 -> 调用大模型 -> 返回日报文本。
3. 支持多种日报：日报、周报、月报、异常专项报告。
4. 集成到 FastAPI，提供 API 接口。

> ⚠️ **常见坑与注意事项**

- 大模型调用要设置超时和重试机制，不能阻塞主流程。
- Prompt 要包含数据校验，防止大模型胡编数据。
- 敏感生产数据不要发送到公共大模型，考虑本地部署或私有化方案。

### Day27：RAG 工厂知识库问答

> 🎯 **学习目标** 实现基于 RAG 的工厂知识库问答系统，让 AI 读懂设备手册和工艺文档。

> 📌 **技术重点**

- RAG 架构：检索增强生成 = 向量数据库检索 + 大模型生成。
- 文档处理：PDF/Word/Excel 文档解析、文本切片、元数据提取。
- 向量数据库：ChromaDB（轻量入门）、Milvus（生产级）、pgvector（PostgreSQL 扩展）。
- 嵌入模型：文本向量化，推荐开源模型如 text2vec、bge-m3。
- 问答流程：用户提问 -> 文本向量化 -> 向量检索相似文档 -> 拼接上下文 -> 大模型生成答案。

> 💡 **学习思路** RAG 是目前企业级 AI 应用最成熟的方案。先从本地文档问答做起，再扩展到设备手册、工艺规程、质量记录等工业文档。推荐看 LangChain 官方文档和「RAG implementation guide」相关文档。

> ✅ **具体练习** 创建项目 `Day27_RAG`：

1. 搭建 RAG 服务：文档上传 -> 解析切片 -> 向量化 -> 存储到 ChromaDB。
2. 实现问答接口：用户提问 -> 检索相关文档片段 -> 调用大模型生成答案。
3. 预导入设备手册、故障排除指南等文档。
4. 测试问答效果，优化检索策略。

> ⚠️ **常见坑与注意事项**

- 文档切片要考虑语义完整性，不要按固定字符数切。
- 向量检索的 top_k 参数要调优，太少信息不全，太多引入噪声。
- 大模型回答要标注信息来源，方便用户验证准确性。

### Day28：项目整合与演示视频

> 🎯 **学习目标** 整合所有模块为一个完整项目，录制演示视频。

> 📌 **技术重点**

- 全链路联调：Modbus 采集 -> 数据库 -> 上位机看板 -> MQTT 上报 -> FastAPI 接口 -> AI 分析。
- 项目架构整理：统一项目结构、配置文件、启动脚本。
- 演示脚本准备：设计 3-5 个演示场景，覆盖核心功能。
- 录屏工具：OBS Studio（免费）、Camtasia（付费），录制+字幕+标注。
- 视频剪辑：剪映/CapCut，添加标题、标注、背景音乐。

> 💡 **学习思路** 面试时一个可演示的项目比 100 句自我介绍都有用。视频要控制在 3 分钟内，突出亮点。推荐看「Technical demo video best practices」相关文档。

> ✅ **具体练习**

1. 整合所有代码到一个 GitHub 仓库，写完整的 README 和架构图。
2. 准备演示场景：设备数据采集 -> 实时看板 -> 报警 -> OEE 统计 -> AI 日报。
3. 录制 3 分钟演示视频，上传 B 站/YouTube（设为不公开）。
4. 在简历中附上项目链接和视频链接。

> ⚠️ **常见坑与注意事项**

- 演示视频不要录屏报错和卡顿，提前彩排。
- 视频开头要有项目简介标题页，结尾有技术栈总结。
- GitHub 代码要有清晰的目录结构和注释。

### Day29：简历定稿

> 🎯 **学习目标** 完成求职简历，针对工业软件岗位优化。

> 📌 **技术重点**

- 简历关键词：C# 上位机、MES 开发、工业软件、智能制造、Modbus、OPC UA、MQTT、WPF、WinForm、SQL Server、FastAPI、AI Agent。
- 项目描述包装：用 STAR 法则（情境-任务-行动-结果）描述项目，量化成果。
- 技能清单：按熟练程度分类（精通/熟练/了解），不要全部写精通。
- 简历排版：简洁专业，1-2 页，PDF 格式，文件名「姓名_工业软件工程师」。
- GitHub 整理：代码规范、README 完整、有 README 截图。

> 💡 **学习思路** 简历不是一次写好的，投几轮面试后根据反馈持续优化。先投 10 个试试水，看看哪些岗位回复率高，再针对性调整。推荐看「Technical resume writing guide」相关文档。

> ✅ **具体练习**

1. 制作简历（Word/PDF），重点突出工业软件项目经验。
2. 整理 GitHub 仓库，确保 README 完整、有截图。
3. 准备 1 分钟和 3 分钟自我介绍话术。
4. 制作技术博客文章 1 篇（如「30 天从 Web 开发转型工业软件」），展示学习能力。

> ⚠️ **常见坑与注意事项**

- 不要写「精通 XX」除非你真能现场手写实现，面试会被深挖。
- 项目经验用数据说话：「采集频率 100Hz」「支持 500 点并发」「报警响应<1 秒」。
- 简历文件名不要用「个人简历.pdf」，要用「张三_C# 上位机工程师_3 年.pdf」。

### Day30：密集投递与面试准备

> 🎯 **学习目标** 开始密集投递，同时准备面试。

> 📌 **技术重点**

- 投递渠道：BOSS 直聘（工控岗位最多）、猎聘、智联招聘、拉勾（偏互联网）、脉脉（内推）。
- 投递策略：每天投 20-30 个，优先投「C# 上位机」「MES 开发」「工业软件工程师」「智能制造」关键词岗位。
- 面试准备：
- 技术面：C# 基础、TCP/串口通信、Modbus/OPC UA 协议、数据库设计、多线程。
- 项目面：准备 3 个项目的 STAR 描述，每个准备 2 个踩坑故事。
- HR 面：离职原因、职业规划、薪资期望、能否接受出差/加班。
- 薪资谈判：成都 C# 上位机/MES 岗位薪资范围 10K-20K，有项目经验可争取 15K-25K。

> 💡 **学习思路** 面试是双向选择，不要怕被拒。每次面试后记录问题和自己的回答，持续优化。推荐看「System design interview patterns」和「Behavioral interview preparation」相关文档。

> ✅ **具体练习**

1. 在 BOSS 直聘投递 30 个工业软件相关岗位。
2. 准备面试题库：技术题 20 道 + 项目题 5 个 + HR 题 5 个。
3. 模拟面试：找朋友或对着镜子练习自我介绍和项目描述。
4. 建立投递台账：公司名、岗位、投递日期、状态、跟进提醒。

> ⚠️ **常见坑与注意事项**

- 不要只投大公司，中小型集成商往往成长更快、接触面更广。
- 面试时带笔记本现场演示项目，比口头描述有力得多。
- 薪资谈判不要先报数字，先了解岗位预算范围。

## ✅ 每周自检清单

### 第 1 周末（Day7）自检

- ☐ 能否不看教程写出串口/TCP 采集程序？
- ☐ 能否实现多线程 UI 不卡顿？
- ☐ 能否写出带日志和异常处理的项目骨架？
- ☐ 项目代码是否已提交 GitHub？

### 第 2 周末（Day14）自检

- ☐ 能否正确解析 Modbus 字节序和倍率？
- ☐ 能否设计合理的数据库表结构？
- ☐ 能否画出系统架构图并解释数据流？
- ☐ 简历初稿是否完成？

### 第 3 周末（Day21）自检

- ☐ 能否讲清工单->工序->报工->追溯的完整流程？
- ☐ 能否拿出可演示的 OEE 看板和 MES 模块？
- ☐ 能否解释 OPC UA 与 Modbus 的适用场景和取舍？
- ☐ 能否用 OPC UA 客户端读取设备数据？

### 第 4 周末（Day30）自检

- ☐ 能否完整演示项目（设备采集->看板->AI 分析）？
- ☐ 能否说出 3 个以上踩坑点和解决方案？
- ☐ 简历和 GitHub 是否已优化到可投递状态？
- ☐ 是否已开始投递并收到面试通知？

## ⚠️ 三个常见陷阱

### 陷阱 1：只看教程不动手

很多开发者陷入「教程地狱」——看 100 个教程不如写 1 个完整项目。每天必须产出可展示的东西：代码、截图、演示视频。面试时展示的是作品，不是看过的教程数量。

### 陷阱 2：想先学 PLC 梯形图再转

你不需要会写 PLC 程序，你需要的是「读懂点位表」和「对接设备数据」。PLC 梯形图是电气工程师的活，你的价值在软件层。花时间在协议和系统架构上，回报率远高于学 PLC 编程。

### 陷阱 3：等项目完美了再投简历

这是最致命的陷阱。第 15 天就应该开始投简历。面试反馈是最好的学习方向标——面试官问什么，你就补什么，效率最高。而且边工作边学比全职学压力小，还有收入。

## 🚀 30 天后的进阶路线

### 第 2-3 个月：深化与入职

- 补 S7 协议（西门子）、MC 协议（三菱），能对接主流品牌 PLC。
- 学习 KepServerEX（工业数据采集平台），很多外企/大厂在用。
- SQL 性能优化：索引优化、查询优化、存储过程。
- 拿第一个 offer，入职工业软件/MES 方向公司。

### 第 4-6 个月：岗位深耕

- 在岗位上打通设备层->执行层->管理层全链路。
- 主导一个完整的 MES 模块开发（工单+报工+追溯）。
- 学习 ERP 接口对接（SAP/用友/金蝶）。
- 争取参与项目售前和技术方案编写。

### 第 7-12 个月：能力跃迁

- 叠加 Python 数据服务与 AI Agent 能力。
- 做工业数据分析和预测性维护项目。
- 往「工业数据工程师」或「智能制造解决方案工程师」方向转型。
- 薪资目标：成都 18K-25K，有经验可到 30K+。

## 💼 面试准备要点

### 简历关键词清单

| 项目 | 内容 |
| --- | --- |
| 核心技术 | C#、.NET 8、WPF、WinForm、SQL Server、MySQL |
| 工业协议 | Modbus TCP/RTU、OPC UA、MQTT、TCP Socket、串口通信 |
| 工业系统 | MES、SCADA、WMS、OEE、工单管理、批次追溯 |
| 框架工具 | Prism、EF Core、Dapper、Serilog、SignalR、FastAPI |
| AI 能力 | 大模型 API、RAG、Prompt 工程、Python 数据分析 |

### 项目包装话术

- 「我设计并实现了一套基于 C# 的上位机数据采集系统，通过 Modbus TCP 协议采集 PLC 数据，支持实时曲线展示和报警监控，采集频率达到 100Hz，数据准确率 99.9%。」
- 「我开发了 MES 工单管理模块，实现了工单状态机、扫码过站追溯和 OEE 自动计算，帮助车间实现生产全过程数字化管理。」
- 「我基于 FastAPI 和 OPC UA 搭建了工业数据服务平台，集成 MQTT 设备接入和 AI 分析能力，实现了生产异常自动分析和日报自动生成。」

### 常见面试问题与回答思路

### Q1：Modbus 和 OPC UA 有什么区别？什么时候用哪个？

答：Modbus 简单轻量，适合单一品牌设备、点对点通信场景；OPC UA 跨品牌、带安全认证和复杂数据模型，适合多系统对接和工业 4.0 场景。我的项目里，设备层用 Modbus（简单稳定），系统层用 OPC UA（标准化对接）。

### Q2：串口粘包怎么处理？

答：串口是字节流没有消息边界，我实现了一个帧解析状态机：IDLE->HEADER->DATA->CHECKSUM->COMPLETE，每收到一个字节状态机推进一步，校验通过后输出完整帧。同时配合超时机制处理不完整帧。

### Q3：多线程 UI 卡怎么优化？

答：核心原则是 UI 线程只做渲染。我用 Channel 实现生产者消费者模式：采集线程生产数据放入 Channel，处理线程消费并聚合，UI 线程通过 Dispatcher 定时从 Channel 取最新数据刷新。同时用 Stopwatch 做高频 UI 更新的节流。

### Q4：为什么选 C# 而不是 Python 做上位机？

答：C# 在 Windows 工控领域是事实标准，WPF/WinForm 生态成熟，.NET 性能优秀，与 PLC/SCADA 等工业软件的集成度高。Python 更适合做数据服务和 AI 分析层，两者配合使用效果最佳。我的方案是 C# 做上位机和数据采集，Python 做数据服务和 AI 分析。

### 成都本地投递渠道

| 项目 | 内容 |
| --- | --- |
| BOSS 直聘 | 搜索「C# 上位机」「MES 开发」「工业软件」，成都岗位最多 |
| 猎聘 | 中高端岗位，适合有 3 年以上经验 |
| 智联招聘 | 传统企业岗位多 |
| 脉脉 | 内推渠道，可联系目标公司员工内推 |
| 猎云网/工控网 | 工控行业垂直招聘 |

### 薪资参考（成都）

| 项目 | 内容 |
| --- | --- |
| 初级 C# 上位机 | 8K-12K |
| 中级 MES 开发 | 12K-18K |
| 高级工业软件工程师 | 18K-25K |
| 智能制造解决方案工程师 | 20K-30K |
| 有 AI 能力加分 | 可上浮 10%-20% |
