02 · 名词表
这份表不用背。看到不懂的词回来查一下就行。每个词后面标了"详见第几章"。
一、数据相关
点(Tag,也叫点位 / 变量)
软件里最小的数据单位,一个点就是一个值。比如"锅炉温度""1号泵运行状态"都是一个点。
点有名字(Boiler_Temp1)、类型(浮点/整数/布尔/字符串)、当前值、质量戳、时间戳。
详见第 05 章。
实时库(RTDB,Real-Time DataBase) "内存里的点值表"。所有点的当前值都放在这里,采集循环往里写、界面和报警从里读。 它不是 MySQL 那种数据库,就是一个为高速读写设计的内存结构,进程一关就没了。 详见第 04 章。
⚠ 别把它和历史库搞混:实时库只有"现在的值",历史库存的是"过去的值"(见第 14 章)。
质量戳(Quality)
这个值"可不可信"。取值有 Good(正常)、Bad(读失败)、Uncertain(不确定)等。
PLC 断线时采集循环不会假装值是 0,而是把质量戳标成 Bad —— 界面据此显示成灰色或横杠。
判断一个值能不能用,要看质量戳,不能只看数值。
时间戳(TimestampUtc) 这个值是什么时候采到的。统一用 UTC 存储,显示时才转成本地时间。
点类型(TagDataType)
这个点存的是什么东西:Bool / Int16 / Int32 / Float / Double / String 等。
类型决定了它占几个寄存器、怎么解析字节。
量程 / 工程量(RawMin / RawMax / EngMin / EngMax) PLC 里存的是原始整数(比如 0~27648),你要显示成实际物理量(0~100.0 ℃)。 四个值就是"原始范围 → 工程范围"的线性换算参数。
死区(Deadband) 值变化小于这个幅度就不算变化,不触发分发。防止传感器末位抖动导致界面狂刷新、历史库爆量。
二、连接相关
通道(Channel) 一条通信链路,相当于"一根网线 / 一个串口"。一条通道下面可以挂多个设备。 通道上有扫描周期、超时、重试次数这些参数。详见第 05 章。
设备(Device) 通道下面的一个具体从站,有 IP、端口、从站号。 层级关系:通道 1 : N 设备 1 : N 点。 一个点一定挂在某个设备下(内部变量除外)。
驱动(Driver) "会讲某种协议的那段代码"。Modbus 有 Modbus 驱动,西门子有 S7 驱动。 驱动负责:连上设备 → 按地址读数据 → 把字节解析成值。详见第 07 章。
协议(Protocol)
设备之间约定的"说话方式"。Modbus、西门子 S7、三菱 MC、欧姆龙 FINS 都是协议。
软件里用 ProtocolId 这个字符串标识,比如 ModbusTcp、S7-1200/1500。
地址(Address)
"读 PLC 里哪个位置"。不同协议写法完全不同:
Modbus 写 40001(保持寄存器第一个),西门子写 DB1.DBD0,三菱写 D100。
详见第 08 章。
块读(Block Read)
一次请求读一片连续的地址,而不是一个点读一次。因为一次网络往返比解析开销贵得多,
把地址相近的点合并成一个块能快几十倍。BlockPlanner 就是干这个的(见第 07 章)。
三、程序相关
程序集(Assembly)
一个 .csproj 项目编译出来的 .dll。本仓库有 15 个,每个负责一块能力。
"程序集"是 .NET 的术语,你可以简单理解成"一个模块"。
宿主(Host)
"负责把别人跑起来的那个东西"。比如 Hmi.RuntimeCore.Host 就是运行内核的宿主进程。
壳(Shell)
最外层的桌面程序窗口。Hmi.Shell 是一个 WPF 窗口,里面套了个 WebView2 浏览器显示前端界面。
桥(Bridge)
"两边之间的转接层"。Hmi.HostBridge 负责把前端发来的消息转给后端方法;
RtdbBridge 负责把工程里的点定义转成运行时对象。
进程(Process) 操作系统里独立运行的程序实例。这套软件有"一个壳进程 + 一个运行内核进程"的结构(见第 17 章)。
四、机制相关
订阅(Subscribe) "我关心这几个点,有变化告诉我"。界面订阅它显示的点,报警引擎订阅它要监视的点,历史库订阅它要记的点。 好处是不用轮询 —— 没变化就没有开销。详见第 04 章。
分发(Dispatcher) "变化了,通知所有订阅者"这个动作。在一个独立线程上做,不占用采集线程。
投递车道(DeliveryMode)
分发时数据排队的两条道:
- Droppable(可丢) —— 队列满了就丢最旧的。界面刷新用这条,反正下一帧就是新值。
- Lossless(不可丢) —— 一个都不许丢。报警和历史用这条,丢一条报警就是事故。
详见第 04 章。
快照(Snapshot) 读的时候一次性拿到的完整数据副本。因为值随时在变,读的时候要保证"这几个字段是同一时刻的",不能读到一半值变了。
seqlock 一种无锁读技术:读的时候记一个版本号,读完再看版本号变没变,变了就重读。 好处是读的时候不加锁,多个线程同时读不会互相阻塞。这是实时库能扛高频读的关键。
写门禁(RuntimeWriteGate) 脚本想写值时的一道关卡。它只放行"内部软件变量",通道点和 PLC 点的写入一律拦下。 这是那条"绝不暴露运行态写值"边界的执行者(见第 12 章)。
五、工程相关
工程(Project) 一个完整的配置,对应磁盘上一个目录。里面有工程信息、点表、通道、画面、脚本、报警配置等。 目录结构见第 06 章。
画面(Screen) 一个界面页,比如"主画面""报警页""参数设置页"。画面上摆着一堆元素。
元素(Element)
画面上的一个控件:按钮、指示灯、文本框、仪表盘、图表……
每个元素有属性(位置、颜色、字体)和事件(点击、鼠标移入)。模型在 Hmi.Project/Screens/ 下,有 60 多个子类。
绑定(Binding)
"这个元素显示哪个点的值"。比如把温度文本框绑定到 Boiler_Temp1,值一变文本框就跟着变。
动作(Action)
"点了这个按钮要干什么"。可以是写点、切画面、跑脚本。
运行期由 Hmi.Backend 提供实现(IActionDispatcher)。
脚本(Script) 用 C# 简写方言写的一小段程序,让工程能做逻辑判断。有全局脚本、画面脚本、元素事件脚本、周期脚本等形态。 详见第 12 章。
模块(Module) 一组可复用的脚本函数。模块名必须和画面名一样,这个模块才属于那个画面(随窗口生死)。 这个规则在[项目长期记忆]里被反复强调过,别搞混。
配方(Recipe) "一套参数组合"。比如同一台设备生产 A 产品和 B 产品,温度、压力、时间参数不同,存成两套配方,现场一键切换。
报表(Report) 按模板生成的数据汇总表,通常按天/班次出。
内部变量 vs 采集点 两者存储结构一样,但概念必须分开: - 采集点 = 外部数据,从 PLC 经通道读上来的 - 内部变量 = 内部软件变量,不接 PLC,纯粹给脚本/界面用的中间量
界面上它们是两个独立的页面(点表 / 全局变量),别混。详见第 05 章。
六、命名容易混的几组
| 容易混 | 区别 |
|---|---|
| 实时库 / 历史库 | 现在 vs 过去 |
| 采集点 / 内部变量 | 外部 PLC vs 内部软件 |
| 通道 / 设备 / 点 | 链路 / 从站 / 数据 |
| 组态期 / 运行期 | 改工程 vs 跑工程 |
| 点表 / 全局变量 | 界面上是两个独立页面 |
| 驱动 / 协议 | 代码 vs 约定(一个驱动实现一种协议) |
下一步:第 03 章 我该从哪一章开始看