# 按钮

> 命令按键：写入一个预设值、发出一条单元运行命令、打开另一张仪表画面，或者执行一个 Logic 动作。

**按钮**是这份面板里的命令按键。一次点击只做组件所声明的那一件事，也就是它的*动作*，随后属性面板只问这一个动作自己的字段，于是屏幕上不会有哪个字段藏着一条“什么时候才算数”的暗规矩。它属于*控制*类；新放置的一个占 3 × 1 个单元格。

不管是哪种动作，按钮都带着自己的样子：一对颜色和一个可选的图标。在一块操作面板上，按钮是操作员的手要去按的那一块，颜色和标记正是让人一眼就找得到它的东西。

## 内容 {#content}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 标签 | 按键上的文字。留空就退回到所选动作指向的东西：被写入点位地址的最后一段、目标仪表画面的名称，或者所绑定 Logic 动作的名称；在还没有东西可以命名时，写的是“（未选点位）”“（未选仪表画面）”“（未选动作）”或者“（已缺失）”。 | 自由文本 | 空 |

## 动作 {#action}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 点击时 | 点击做什么。下面每一个字段都属于所选的那个动作。 | `写入一个值` · `执行一条单元命令` · `打开另一张仪表画面` · `执行一个 Logic 动作` | `写入一个值` |

### 写入一个值 {#write-a-value}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 点位 | 被写入的点位。列表收窄到真正可以写入的东西：内部存储值变量，以及非只读的点位。 | 自由文本；建议的是可写点位 | 空 |
| 写入的值 | 每次点击发出的那个预设字面值。它先对着点位自己的类型来读，所以一个点位放不下的值会在按钮的答复行上被拒绝，永远进不了队列。 | 自由文本 | `true` |

写入经由工作站唯一的逻辑出口，并且和其他每一次写入一样记入日志。等现场设备的是按钮，不是 Logic，所以只有值真的被收下之后，答复行才写“已写入”；别的情形都把拒绝摆在那一行上，用的是拒绝者自己的说法：工作站在发送之前就断定的事，用它自己的话（“未写入‘Cmd’：设备未连接。”），线路上发生的事则用设备的话。一个在发出之前就被同一点位上更新的写入赶超掉的值，读作“‘Cmd’在发送前已被更新的值替换。”

在**限值**环节已启用的点位上，超出这些限值的预设值会在答复行上被拒绝，理由会说出这些限值，什么也不写入：否则点位会按边界取值，而按钮会确认一个现场从未收到的值。

在存放整数的点位上（量程换算和校准都不改变数值的整数类型点位，或者存放整数的内部存储值变量），带小数的预设值会在答复行上被拒绝，而不是被取整（“这个点位接受整数，因此不会写入 2.5。”），什么也不写入。

### 执行一条单元命令 {#run-a-unit-command}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 命令 | 一个单元的运行命令点位（`Process.<Model>.<Unit>.Commands.*`）。发出这条命令就是完整的指令，没有值要写。 | 自由文本；列表给出的是单元的运行命令点位 | 空 |

命令点位读得出“此刻能不能执行”，所以命令不适用时按钮把自己变成不可用；运行时被挡住时的启动，还会另外写出被挡的理由。按下之后命令对着这个单元执行，署名记在登录的操作员名下，答复行写出执行了哪条命令。

### 打开另一张仪表画面 {#open-another-dashboard}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 仪表画面 | 目的地画面。挑选器列出工作站的各张仪表画面；基于 Process 模型定义的画面不在其中，因为它们只从单元里打开。 | `（无）`，或者一张仪表画面 | `（无）` |

换画面是一次操作动作：正在全屏运行的一块面板，在操作员到达时仍然是全屏。这个引用是松的：被删掉的画面，或者登录角色看不到的画面，都不会连累别的东西不可用，按下之后按钮在自己那一行上答复“那张仪表画面不可用。”，而不是把整幅画面弄坏。

### 执行一个 Logic 动作 {#run-a-logic-action}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 动作 | 所绑定的 Logic 动作（见 [Logic 页面](logic)）。 | `（无）`，或者一个动作 | `（无）` |

动作在动作通道上执行，日志里记为来自仪表画面。答复行报出结果：“成功 · 12 ms”，或者动作自己的错误。被删掉或者已禁用的动作让按钮变成不可用，而不是把它弄坏。

## 颜色与图标 {#color-and-icon}

不管动作是哪一种，都读这两项：

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 按钮颜色 | 按键的正面，是一对颜色，每个主题各占一半，两半同时留在屏幕上，因为由当前运行的主题决定哪一半上色。只写了一半的十六进制会被拒绝，字段弹回当前生效的颜色。一种颜色表示什么，是你自己的约定，应用不去解读。 | 各写 `#RRGGBB` | 浅色 `#FFFFFF` · 深色 `#2B2B2B` |
| 图标 | 文字前面的可选标记，从应用的图标库里挑（大约 2,770 个标记），按名称或关键词搜索（“用英文：play、stop、warning…”）。`—` 那一格表示不要图标。 | 目录里的字形，或者不选 | 不选 |

文字的墨色是**推导出来的**，不是写死的：在正面每一半颜色之上，应用挑出自己那两种文字色调里对比更好的一种，所以你挑的任何颜色都不会让文字变得读不出来。文字按共用的显示约定给自己定大小：按键容不下的部分用省略号截断，完整文字在提示里。

## 权限与锁 {#permissions-and-the-lock}

每一种动作都需要角色具备操作仪表画面的权限。除此之外一次按下还需要什么，是从它的*目标*读出来的，不是从种类读出来的：只有**执行一条单元命令**碰到了对 Process 的改动，因此另外需要运行流程的权限。登录角色不能做的按下，会画出共用的锁标记，理由在组件的提示里（见[仪表画面页面](home)）；授权在点击的那一刻重新核对。那一行临时答复几秒之后过期。格子里放不下答复行、按键上面也没有角上标题时（密集网格里一行高的按钮），答复在显示期间占用按键上文字的位置：它用文字本身墨色里更安静的一种色调叠在文字上，拒绝用错误的颜色，完整的答复在提示里。图标和按键留在原处，答复过期后文字回来（见[仪表画面页面](home#commands-permissions-and-the-lock-mark)）。

共用的外观、标识、位置与图层、动作这几个分区，写在[组件页面](components#the-shared-property-sections)。
