# 仪表画面组件

> 什么是仪表画面组件：类型目录、它们绑定的地址、读数如何绘制，以及每一种类型共有的属性分区。

**组件**是仪表画面上的一个条目：一块由网格单元格围成的矩形，在里面画出点什么。多数组件读取实时地址空间并把它呈现出来，少数向它写入，还有少数只负责绘制。你从[仪表画面编辑器](view-editor)工具栏的**添加**区放置一个组件，把它拖到某个确定的单元格上，或者点一下让它占用第一个空位，放好之后它会在属性里打开，等你配置。

每一种类型都有自己的参考页，列在[类型目录](#the-catalog)里，也列在本分组自己的目录里。本页写的是它们共有的东西：绑定的地址、读数如何绘制，以及每一种类型上都会重复出现的属性分区。哪个角色可以按下某个控件，以及登录角色无权时组件所戴的那把锁的标记，写在[View 与仪表画面](home)。

## 类型目录 {#the-catalog}

添加面板按类别把目录分组，类别说明的是一个家族做什么。**显示**是所有负责报告的组件：朴素的数值显示与表格、指示灯，以及那些按时间跟踪点位或者把点位并排比较的图表。**控制**是专门用来写入的家族：它的每一个组件都是为了把一个值放到某个点位上而存在的。不过它并不是操作员唯一会按的界面。**报警**把待处理的报警清单搬到画面上，报警提示条就在那里确认，可以逐行确认，也可以整批确认。**媒体**放置图片、图元库里的标记和工业图形。**布局**在整幅画面的后面把一个区域框起来。

| 类别 | 组件 |
|---|---|
| 显示 | [文本](component-label) · [数值](component-value) · [点位表](component-point-table) · [状态指示灯](component-status-led) · [折线图](component-line-chart) · [柱状图](component-bar-chart) · [饼图](component-pie-chart) · [仪表盘](component-gauge) · [指标卡](component-kpi-card) · [进度](component-progress) |
| 控制 | [开关](component-toggle) · [输入框](component-input) · [按钮](component-button) · [选择器](component-selector) · [设定值滑块](component-setpoint-slider) · [步进按键](component-step-keys) |
| 报警 | [报警提示条](component-alarm-banner) |
| 媒体 | [图片](component-image) · [图标](component-icon) · [图元](component-symbol) |
| 布局 | [边框](component-frame) |

本组中有三页讲的是[单元面板](view-unit-panels)的组成部分，而不是组件：[联锁](component-interlock)提示条、[事件条目列表](component-occurrence-list)和[备注时间线](component-comment-timeline)。单元面板为它自己的单元画出它们；它们从不放到画面上，添加面板里也不提供。

媒体类组件所画的图片、标记和图形，来自 Logic 页面上工作站自己的资源库：[资源库](logic-assets)存放图片、图标和颜色，[图元](assets-symbols)则是挑选一个[图元](component-symbol)的那份目录，其中还带着连线所连接的连接点。

## 地址与实时读数 {#addresses-and-live-readings}

实时组件绑定的是**地址**：指向工作站实时地址空间的带根名称，和 Logic 所读的是同一个空间（见 [Logic 页面](logic)）。一个地址指名一个点位，不管它在哪里：

| 地址写法 | 指的是什么 |
|---|---|
| `Connector.<Driver>.<Device>.<Tag>` | 一个 Connector 点位的工程值；设备如果归在文件夹里，驱动和设备之间还要写上这些文件夹（见 [Connector 页面](connector)） |
| `Variables.<name>` | 一个 Logic 变量（内部存储值或计算值） |
| `Alarms.<name>` | 一条报警的活动状态 |
| `Assets.Icons.<name>` | 图标库里的一个标记 |
| `Process.<Model>.<Unit>.…` | 一个单元的运行点位：各项读数、`Commands.*`、`Next.<field>`、`Commands.Comment` |

地址字段是带建议的自由文本：建议列表取自实时点位清单，最多 50 行，按该字段所消费的值类别收窄（仪表盘建议数值，开关把布尔点位排在前面，写入类控件只列出可写的东西），每一行都标出自己的类型。你随时可以手写一个列表里没有的地址，包括一个还不存在的地址。字段一旦指名了某个点位，编辑器就在字段下面显示**这个点位此刻读到什么**：一个自己不画数字的组件，靠它才能给出这份确认。在基于 Process 模型定义的画面上，模型的抽象通道排在每一份列表的最前面；选中一条，绑定的就是这条通道，至于是哪个单元，留到某个单元打开这幅画面时再回答。

画布按实时地址空间刷新自己的组件：在工作站自己的窗口上每 150 ms 一次，在远程浏览器上每 400 ms 一次，读的是逻辑扫描周期发布出来的那些值。对每一个实时组件，有两条规矩始终成立：

- **绝不显示陈旧的值。** 一个点位不再读到数据时，组件落到它自己的占位表示上（缺口短横、空心的灯、图表上的断口），绝不是最后那个数字。
- **只有一种读数异常标记。** 一个组件所绑定的点位*读不到*（地址解析不到任何东西，或者点位答复的质量不可用）时，它戴上同一个标记：单元格四周一圈虚线的警示轮廓，右上角一个带圈的 `!` 小徽标。每一种类型戴的标记都一样，所以只需要学一次。一个解析得到、质量良好、但*没有值*的点位不算故障（两次运行之间空着的试验台、循环之外的计数器），因此组件保持它那安静的占位表示，标记不会亮起。而**没有绑定**的地址不是谁的过错：一幅还在拼装当中的画面，不该读起来像一幅满是警告的画面。

## 数值的显示 {#value-display}

一个读数画多大，由同一份约定管着，画布上每一处文字表面都遵守它（数值显示、说明文字、按键面、状态词）：

- 每一处表面要么是**自动**的（由单元格决定大小，上限是这处表面自己所声明的内容需要预留的宽度：位数、小数位、单位，或者写好的那些字），要么是**指定**的，也就是你给出一个磅值（9 到 144）。指定的字号是照字面来的：不管在哪个单元格里都按那个字号绘制，绝不会为了塞下内容而缩小。字号从来不跟着恰好到来的那个值走，所以一个在四到六个字符之间跳动的数字，绝不会把字体大小推来推去。
- **数字绝不画成截断的样子。** 凡是显示不全的地方（位数多于字段所声明的，或者指定的字号宽过单元格），表面就画出 `####`，也就是电子表格和 DCS 用来表示字段窄于其值的那个记号，完整读数放在提示里。
- **自由文本用省略号截断**，完整文字放在提示里。文字绝不戴数字的那个记号。
- 一个**读不到数据**的点位，又是另一回事：缺口短横，并且在这份沉默确实是故障时再加上那个共用的读数异常标记。没有读数和没有地方，从不互相借用对方的记号。
- 数字靠在自己字段的右边，用等宽数字，这样一列读数才能自己对齐。

11 px 的可读性下限处处成立，共用的**内容缩放**旋钮在解析出来的字号上再乘一个系数：往小调总是看得见（仍受下限约束），往大调只能长到这一行仍然不被截断为止。

## 共有的属性分区 {#the-shared-property-sections}

选中一个组件就打开它的属性。以组件自身类型命名的那些分区排在最前面（它的内容、它的数据、它的格式），写在那一种组件自己的页面上。围绕着它们的，是每一个组件都共有的那些分区。绘制这些分区的面板、每个地址字段下面的实时读数，以及在各种类型之间重复出现的那些控件（显示字号、读数形式、刻度区段、图表工具栏），写在[仪表画面编辑器](view-editor)。

**标识**是为编辑这幅画面的人给组件起的名字：名称写在属性面板的最上方，在组件列表里作为这一行的标签，也由它回答搜索。它不会在操作员的画面上画出任何东西，那是外观里的标题。

**外观**是组件的那个方框：

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 显示边框 | 画出组件自己的轮廓。 | 开 / 关 | 关 |
| 边框粗细（px） | 这道轮廓有多重。1 px 是一张卡片的边；更重的一笔不必再动第二种颜色，就能把一组东西和周围分开。 | 1 到 4 | 1 |
| 显示背景 | 用那对颜色填满组件的矩形，把它变成一张卡片。关掉时，网格从后面透出来。 | 开 / 关 | 关 |
| 背景色 | 填充色是一对，每个主题各占一半，两半一起编辑，因为屏幕上出现哪一半由当前运行的主题决定。 | 各写 `#RRGGBB` | 浅色 `#FFFFFF` · 深色 `#2B2B2B` |
| 标题（角上） | 组件自己的角上标签，说明这张卡片*是什么*，位于这一类型所绘制的内容之上。留空就没有这一行说明。 | 自由文本 | 空 |
| 标题字号（px） | 留空时每张卡片按自己的单元格决定标题大小；指定的字号照字面来，正是它让整幅画面的标题保持一致。放不下的部分用省略号截断，完整标题在提示里。 | 11 到 96，或留空 | 空（自动） |
| 标题颜色 | 标题的一对墨色。不去动它，标题就跟着主题自己那种安静的色调。 | 各写 `#RRGGBB` | 浅色 `#6B6B6B` · 深色 `#A0A0A0` |
| 内容缩放 | 内容占它这个方框的多少：你画出的单元格已经决定了内容的大小，这个旋钮在单元格内部再调一次，不必重画网格。图形按几何方式响应它，数值显示按排版方式响应它。 | 0.25 到 3 | 1 |

**位置与图层**放着数值形式的 X / Y / 宽 / 高、图层（Z），以及**移到最前** / **移到最后**这一对。**高级**只在带有不常用附加项的类型上出现。**动作**用来复制或删除组件。

按住 **Ctrl** 可以选中多个组件，一起编辑它们共有的东西：外观里的字段会铺到整份选择上（成员之间取值不一致的字段写“不一致”），图层命令保持这一批之间的相对次序，复制和删除对它们全体生效。按类型独有的字段则需要单独选中一个组件。
