鲲鹏恒控 · 程序集使用手册

这本手册是写给谁的

写给第一次接触鲲鹏恒控后端代码的人。你可能是:

  • 要接一台 PLC、把现场数据采上来的工程师
  • 要给某个冷门协议写驱动的开发者
  • 想把组态能力嵌进自己程序、或者用脚本自动化改工程的集成商
  • 接手这套代码、想先搞明白"它内部是怎么搭起来的"的新同事

不需要你事先懂这套架构。 每个术语第一次出现时都会用大白话解释一遍,每一章都先说"这是干什么用的、什么时候你会需要它",然后才讲怎么调用。

这套后端由什么组成

一句话:15 个 .NET 程序集,从下往上四层,上层用下层、下层不认识上层。

┌─ 宿主 / 集成层 ──────────────────────────────────────────────┐
│  Hmi.Shell(WPF 壳)  Hmi.HostBridge(前后端消息路由)            │
│  Hmi.Mcp.Host(给外部 AI 的 MCP 服务)                          │
│  Hmi.RuntimeCore.Host(运行内核进程)  Hmi.Supervisor(进程监督) │
├─ 组合层 ─────────────────────────────────────────────────────┤
│  Hmi.Automation(组态+感知统一 API)  Hmi.Backend(运行数据引擎) │
│  Hmi.ScriptRuntime(运行时脚本宿主)                            │
├─ 领域库层 ───────────────────────────────────────────────────┤
│  Hmi.Project(工程模型)  Hmi.Drivers(采集框架)                 │
│  Hmi.Scripting(脚本引擎)  Hmi.Historian(历史库)               │
│  Hmi.Alarms(报警引擎)  Hmi.Security(账号权限)                 │
├─ 内核层 ─────────────────────────────────────────────────────┤
│  Hmi.Core(实时库 + 点模型 + 变化分发)                          │
└──────────────────────────────────────────────────────────────┘

目标框架 net8.0(WPF 壳 Hmi.Shell 为 net8.0-windows),解决方案 FangLikong.sln, 源码在 src/,测试在 tests/。

两个"独立户":Hmi.Security 和 Hmi.Supervisor 不依赖任何 Hmi.*,可以单独摘出来用。

六篇导航

篇 讲什么 建议什么时候看
1 入门 整套东西怎么跑起来的、术语表、按目标选路线 先看这篇,尤其第 01 章
2 内核层 数据放在哪:实时库、点/通道/设备、工程文件 要读实时值、要读写工程文件
3 采集层 数据怎么进来:驱动原理、内置协议、自己写插件 要接 PLC、要支持新协议
4 运行层 数据怎么流转:数据引擎、脚本、历史、报警 要让工程真正跑起来
5 集成层 给外部程序用:自动化 API、消息路由、MCP 要把能力嵌进自己的程序或 AI
6 安全与附录 账号权限、程序集速查表、常见问题 做权限、或者查不到东西时

逐章清单

第 1 篇 · 入门

章 标题 一句话
01 这套软件是怎么跑起来的 组态器、工程文件、运行内核、PLC 之间的关系
02 名词表 程序集、实时库、点、通道、驱动、宿主……都什么意思
03 我该从哪一章开始看 按你的目标给出四条阅读路线

第 2 篇 · 内核层:数据存在哪

章 标题 一句话
04 实时库:内存里的点值表 Hmi.Core 的读写与订阅
05 点、通道、设备:数据从哪来 三个核心概念的关系与字段
06 工程文件与加载保存 Hmi.Project 与磁盘上的目录结构

第 3 篇 · 采集层:数据怎么进来

章 标题 一句话
07 驱动是怎么工作的 采集循环、块读规划、重连与超时
08 内置协议怎么用 8 种内置协议的地址写法与连接参数
09 写一个自己的协议插件 从零到能加载的完整流程

第 4 篇 · 运行层:数据怎么流转

章 标题 一句话
10 运行数据引擎 Hmi.Backend 把工程跑起来
11 脚本引擎:从代码到运行 脚本怎么被编译、怎么被拦住危险操作
12 脚本运行时与脚本形态 全局/画面/事件/周期脚本怎么挂、能写什么
13 脚本函数库速查 15 个函数库、185 个函数,每个干什么
14 历史库与报警引擎 什么时候记、怎么查、报警怎么流转

第 5 篇 · 集成层:给外部程序用

章 标题 一句话
15 自动化 API 总览 最省事的入口,一次拿到全部组态能力
16 自动化 API 方法速查 按功能分组的完整方法清单
17 宿主、进程与壳 消息路由、运行内核进程、进程监督、WPF 壳
18 MCP 服务器 让外部 AI 连进来改工程

第 6 篇 · 安全与附录

章 标题 一句话
19 账号、角色与权限 Hmi.Security 的模型与 API
20 程序集速查表 一页看全 15 个程序集
21 常见问题与坑 踩过的坑集中放这里

三条典型集成路线

不知道从哪下手?看这三条里有没有和你像的:

路线 A —— 我只想在自己的程序里读工程、改组态,不碰运行 → 只用 Hmi.Automation。ProjectAutomation.Open(工程目录) 拿到统一 API,组态类方法改工程、感知类方法只读查询,Save() 落盘。最省事的一条。见 第 15 章。

路线 B —— 我要把工程真正跑起来,连 PLC、出实时值 → 用 Hmi.Backend.RuntimeHost 建实时库 + 跑采集循环;要历史、报警、脚本再叠 RuntimeDataServices.Compose(...)。见 第 10 章和第 14 章。

路线 C —— 我要给外部 AI(Claude / Cursor 之类)开一个组态入口 → 直接跑 Hmi.Mcp.Host 这个 exe,参数指向工程目录,支持 stdio 和 http 两种传输。见 第 18 章。

一条不可逾越的边界

Hmi.Automation / MCP / HostBridge 对外只暴露两件事:

  • 组态 —— 改工程文件里的 JSON,可逆,随时能撤销
  • 感知 —— 只读查询,绝不产生副作用

绝不暴露运行态写值、PLC 下发、设备启停。 即便在脚本运行时,RuntimeWriteGate 也只放行内部软件变量,通道点和 PLC 点的脚本侧写入一律被拦下。

把这条边界记牢 —— 它贯穿所有上层程序集,也是这套软件敢把接口开放给外部 AI 的底气。


本手册对应源码版本见仓库 docs/更新日志.md。发现手册和代码对不上,以代码为准,并回头修手册。