# 输入框

> 由操作员输入数值并写入点位：点位接受什么，输入框就接受什么，其余的连同理由一起拒绝。

**输入框**是操作员的录入字段：一份归操作员所有的草稿，加上一个**设定**按键，由它经过工作站唯一的写入出口把草稿送到一个点位上。它自己不画任何读数，谁想在框旁边看到点位的值，就在旁边配一个[数值](component-value)；给字段起名则是一个[文本](component-label)。它属于*控制*类；新放置的一个占 4 × 1 个单元格。

草稿属于操作员：实时刷新绝不覆盖已经键入的东西，被拒绝的输入也留在框里，于是改正是一次编辑，而不是重新敲一遍。

## 数据 {#data}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 地址 | 被写入的那个点位的带根 Logic 地址：一个内部存储值变量、一个可写点位、一个单元的预选字段（`Next.<field>`），或者运行备注点位（`Commands.Comment`）。这里什么都不排除，输入框接下来接受什么，是从点位本身读出来的。 | 自由文本；建议来自实时点位清单 | 空 |

地址下面，面板写出这个字段此刻接受什么（“这个字段接受一个数，0 到 100，保留 1 位小数。”），于是一个两状态的点位，在画面运行之前就能看到这一行变成每种状态一个按键。

## 输入框接受什么 {#what-the-box-takes}

录入的种类是**从点位推导出来的**，绝不是在点位旁边另选的：一个可以对着点位另行声明的类别，等于第二份声明，它随时可以和点位已经作出的那份声明打架。

| 点位 | 输入框 | 行为 |
|---|---|---|
|布尔点位 | 每种状态一个按键（**开** / **关**），而不是一个输入框 | 一次触碰就是完整的指令。这些按键带的是绝对值，所以质量不可用时它们照样能用，这一点和[开关](component-toggle)不同，开关必须知道自己要取反的那个读数。两个按键都不显示点位的状态。 |
| 整数点位 | 只收整数的输入框 | 带小数的输入会被拒绝；触摸键盘给出数字键。量程换算或校准会改变数值的整数点位接受小数：它的工程值是实数。 |
| 实数（小数）点位 | 数值输入框 | 在按下**设定**时对着取值范围和所声明的小数位判定，绝不是每敲一个键判一次；触摸键盘给出小数键盘。 |
| 文本、时刻、预选或备注点位，或者一个还没有任何东西答复的地址 | 自由文本输入框 | 取值范围和小数位不会被读取，面板会说明这一点。 |

## 数字 {#number}

操作员*叠在*点位之上所声明的取值范围和精细程度：

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 最小值 | 这个字段会发出的最小的数。留空就让这一侧的范围敞开。 | 任意数值，或留空 | 空 |
| 最大值 | 这个字段会发出的最大的数。留空就让这一侧敞开。最小值高于最大值时，两者之间没有任何数，面板会警告说这个字段会拒绝每一次输入。 | 任意数值，或留空 | 空 |
| 小数位 | 这个字段发出的输入有多精细。留空就按键入时的精度发出。计数类的点位不管存的是什么都把它钉在 0。所要求的位数是对着数值问的，不是对着数字问的：`12.500` 就是 `12.5`，所以小键盘补上的末尾零绝不会被拒绝。 | 0 到 15，或留空 | 空 |

一个自己声明了限值的点位（它的**限值**转换环节已启用）会把这里声明的东西再收紧一层：字段只接受那条带类型的数值转换链会原样送过去的东西。

超出取值范围、过于精细，或者根本不是一个数的输入，会**连同理由一起被拒绝，什么也不写入**。这个数是给现场的一条指令，在边界上取一个别的数，等于工作站替操作员做了决定。这一点和编辑器自己那些配置字段是故意相反的，后者会把超出区间的输入按最近的边界取，并且把这件事说出来。

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

- **内部存储值变量**：草稿先对着变量的输出类别校验，再经由逻辑出口写入。框里是空的就写入一个空值。
- **可写点位**：草稿以工程值交给出口，不会先被转成点位的节点类型。出口在把它送上总线的路上反向去校准、去换算（也就是这个点位的数值转换链倒着走一遍），所以在量程换算系数为 0.1 的 Int16 点位上写 0.5，设备收到的是 5。反向换算之后节点类型容纳不了的值（无符号类型里的负数、超过类型最大值的数）会连同该类型的范围一起被拒绝，什么也不写入。
- **`Next.<field>`**：把这段文字存进单元的预选区，供下一次运行使用。预选是准备工作，不是对现场的写入：不走出口，也不记日志。答复那一行写“已预选”。
- **`Commands.Comment`**：向单元当前的上下文追加一条运行备注（空闲时则是一条运行后的附注），署名记在登录的操作员名下；输入框清空，答复那一行写“备注已添加”。空的备注会被拒绝。

那一行临时答复报出每一种结果，几秒之后过期。授权在按下的那一刻重新核对。格子里放不下答复行、控件上面也没有角上标题时，答复在显示期间占用 **设定** 按键上文字的位置（在两种状态的点位上，是被按下的那个按键的文字），拒绝用错误的颜色。按键保持自己的宽度，放不下的部分以省略号截断，完整的答复在提示里，输入框绝不会移动。

等现场设备的是这个输入框，不是 Logic，所以那一行报出的是这个值最后怎么样了，而不只是它已经发出去了。拒绝按拒绝者自己的说法写出来：工作站在发送之前就断定的事，用它自己的话（“未写入‘Setpoint’：设备未连接。”），线路上发生的事则用设备或者它的驱动的话。一个在发出之前就被同一点位上更新的录入赶超掉的值不算拒绝，什么都不说：更新的那个值才是现场拿到的。

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

写入一个变量或者一个点位，需要角色具备操作仪表画面的权限；预选点位和备注点位属于对 Process 的改动，需要的是运行流程的权限。被挡下的按下会画出共用的锁标记，理由在提示里，锁着的时候输入框本身也不可用（见[仪表画面页面](home)）。绑定的点位读不到时会戴上共用的读数异常标记，而那两个标志位按键和文本框仍然可用，因为它们的指令并不依赖读数。

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