# 开关

> 一个写入布尔点位的开关，状态跟随现场：点击负责写入，现场负责确认。

**开关**架在一个可写的布尔点位之上。它遵守 SCADA 关于状态归属的那条规矩：画面*跟着点位走*，由实时地址空间刷新，而点击只写入点位当前所说状态的反面，开关是在现场确认之后才翻过去的。屏幕上绝不会出现一个点位没有报出来的状态。它属于*控制*类；新放置的一个占 4 × 1 个单元格。

## 内容 {#content}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 标签 | 画在开关旁边的可选说明文字。 | 自由文本 | 空 |

## 数据 {#data}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 地址 | 被开关的那个点位的带根 Logic 地址：一个内部存储值变量，或者一个可写的点位。建议列表把布尔点位排在前面。 | 自由文本；建议来自实时点位清单 | 空 |

字段下面，编辑器显示所选点位此刻读到什么。

## 什么时候这个开关可以操作 {#when-the-switch-can-be-operated}

只有下面这几条同时成立时，开关才是可用的：

- 点位解析得到一个**合法的写入目标**：一个内部存储值变量（不能是表达式变量，它的值是算出来的），或者一个非只读的点位；
- 点位读到的**质量良好**：点击写入的是当前状态的*反面*，没有可信的读数，也就没有什么可以取反；
- 这个开关发出的写入没有一个还在途中；
- 登录的角色**可以操作仪表画面**（见[仪表画面页面](home)上的权限模型）。无权的角色看到的是那个安静的锁标记，理由写在组件的提示里。

## 写入的含义 {#write-semantics}

一次点击写入 `true` 或 `false`，永远是点位最后一次良好读数的反面，经由工作站唯一的逻辑写入出口，并且和其他每一次写入一样记入日志。开关下面那一行临时答复报出结果（“已写入‘开’”“已写入‘关’”，或者错误），几秒之后自行清除。格子里放不下答复行、开关上面也没有角上标题时，答复在显示期间写在开关旁边标签的位置上，拒绝用错误的颜色，完整的答复在提示里；开关不会移动，答复清除后标签回来，没有标签的开关也为答复留出同一个位置。授权在点击的那一刻重新核对，所以画面开着的时候换了角色或者退出登录，都不会派发出一次过期的按下。

等现场设备的是这个开关，不是 Logic，所以“已写入‘开’”意味着现场设备已经收下了它。别的情形都把拒绝摆在那一行上，用的是拒绝者自己的说法：工作站在发送之前就断定的事，用它自己的话（“未写入‘Cmd’：设备未连接。”），线路上发生的事则用设备或者它的驱动的话。一个在发出之前就被同一点位上更新的写入赶超掉的状态不算拒绝，照样报为已写入，因为更新的那个状态才是现场拿到的。

绑定的点位读不到时（地址解析不到，或者质量不可用），组件戴上共用的读数异常标记，开关一直不可用，直到读数回来。

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