Logic
Logic 页面、它的“地址空间”栏、文件夹、命令栏、每个面板背后的逻辑扫描周期和写入出口,以及决定这个页面画出什么的三个权限。
Logic 是导航栏上的第三项。任何拥有查看 Logic 权限的角色都能打开它,它的标题栏写着“在地址空间之上定义变量(派生值或可写值)和动作(写入这些值的脚本)。”它是一个主从页面(见页面是怎么用的):左边是标题为地址空间的一栏,右边是命令栏和详情面板。你在这里编辑的一切都随打字自动保存;整个页面上没有“保存”按钮。
本区域的页面
| 页面 | 讲什么 |
|---|---|
| 地址空间 | 七个保留根、一个地址怎么书写和规整、筛选框,以及输入一个地址的三种办法。 |
| 变量 | 变量编辑器:身份与地址、表达式和内部存储值两种种类、“数值”卡片、设置值。 |
| 表达式 | 表达式语言、一个点位的可读面、求值器执行的那些规则、脚本编辑器。 |
| 动作 | 动作编辑器、脚本可以写什么、每一条校验提示、运行和启用/禁用。 |
| 触发器 | 触发器编辑器和定时间隔调度。 |
| 报警 | 报警编辑器、状态机、报警提示、确认和全部确认。 |
| 来自其他页面 | System、Server、Connector 和 Process 这几个根、点位面板,以及点名由哪个页面编辑它们的那条通知。 |
同一栏里的 Assets 根自成一组:资源讲图像、图标、颜色、图元和连线类型。
“地址空间”栏
这一栏在两个小标题下列出地址空间的那些根。在这里定义放的是这个页面创建和编辑的东西:Variables、Alarms、Actions、Triggers 和 Assets。来自其他页面放的是它只显示的东西:System、Server、Connector 和 Process。第一个小标题下的每一个根都带一个数量(Variables 和 Alarms 数它们的定义,Actions 和 Triggers 数它们的,Assets 数它五个类别的总和),而 Alarms 根、每个报警文件夹和每一行报警都带一个彩色圆点,颜色是它下面处于活动或等待确认状态的最高优先级;报警一被答复,圆点就清掉。
这棵树是懒加载的:一根树枝在你展开它时才载入。树里从不画实时数值;选中节点的详情面板才显示它们,每秒刷新两次。
| 控件 | 作用 |
|---|---|
| 筛选… | 把树收窄到名称里含有这段文字的那些行,不区分大小写。只要有任何后代匹配,文件夹就留下来,并展开到它的那些匹配项;Assets 根收窄到名称匹配的那些类别,而只有它自己的名称匹配时就整个留下;名称自己匹配的地址空间根仍然列着,展开时才载入它的树枝,而 Actions 和 Triggers 两节只列出匹配的行。 |
| 新建…(栏底) | 打开创建菜单:新建变量、新建动作、新建触发器、新建报警,然后是新建文件夹,每一节(Variables、Alarms、Actions、Triggers)各一个去处。在这里造出来的一切都落在它所属那一节的根上,取 Variable1、Action1、Trigger1、Alarm1 或 Folder1 系列里第一个空闲的名字,并打开来编辑。只对拥有配置 Logic 的角色画出来;工作站被锁住时它带着原因置灰。 |
| 全部展开 / 全部折叠 | 展开每一根树枝(每一层在展开时载入),或者把一切收回到那些根。 |
| 右键 | 在一节的根上、你自己的某个文件夹上或者一行定义上:选中这一行并打开它的菜单(见下)。在来自其他页面的节点上不会打开任何菜单。 |
右键菜单随行和角色而带上:新建变量 / 新建动作 / 新建触发器 / 新建报警(建到你点的那个文件夹或根里)、新建文件夹(已经嵌套三层的文件夹上不提供)、确认(报警行,需要“操作 Logic”)、移动到(一个子菜单,列出这一节的根以及这一行可以归进去的每一个文件夹)、复制、删除,在文件夹上还有重命名文件夹和移除文件夹。没有“配置 Logic”的角色根本看不到菜单,只有在它拥有“操作 Logic”时,报警行上的“确认”那一项还在。
在你选中什么之前,详情区是空的:“选中一个节点即可查看它:变量、动作、触发器和报警会打开各自的编辑器。用“新建”创建一个。”
命令栏
命令栏画的是选中节点的那些命令。角色永远不允许的根本不画出来;此刻这个情况所拒绝的仍然画着并置灰,提示文字里写着原因:工程操作期间是“有单元在运行时,配置被锁定。”,工作站以只读方式运行时是“运行时已停止”。
| 选中的东西 | 前导的一组 | 末尾(危险)的一组 |
|---|---|---|
| 你自己的一个文件夹 | 新建变量 / 动作 / 触发器 / 报警(看这一节装的是哪一种)、新建文件夹(到了嵌套上限时置灰并写“这个文件夹已经到了文件夹能嵌套的最深一层。”)、重命名文件夹 | 移除文件夹 |
| 一个变量 | 复制 | 删除变量 |
| 一个动作 | 运行、启用或禁用、复制 | 删除动作 |
| 一个触发器 | 启用或禁用、复制 | 删除触发器 |
| 一个报警 | 确认、启用或禁用、复制 | 删除报警 |
| Alarms 根 | 全部确认 | |
| Assets 的“图像” | 导入图像… | |
| Assets 的“图标” | 新建用户图标 | |
| Assets 的“颜色” | 新建颜色 | |
| Assets 的“图元” | 新建用户图元、导入图元…、复制对话指令 | |
| 一个 System、Server、Connector 或 Process 节点 | “由别处编辑”的通知和它的“打开”按钮 |
复制把选中的那份定义复制到它所属那一节的根上,源名字空着时就用源的名字,否则依次是 Name (2)、Name (3),然后打开副本来编辑;复制出来的报警从“正常”开始,复制出来的触发器没有排程,复制出来的动作没有运行记录。启用和禁用通过和任何字段一样的自动保存翻转这份定义的“已启用”标志。每一个删除都先问一句(“要删除‘X’吗?……此操作无法撤销。”),并在操作记录条里报告“已删除。”;删掉一个变量或一个报警,会让每一处点过它地址的表达式、脚本、条件和仪表画面绑定悬空,那些由验证列出来。
文件夹
这四节中的每一节都可以用文件夹来组织。一个文件夹属于一节,而且只装那一节的东西;它最多嵌套三层。文件夹只是组织方式:它没有权限、不参与求值、也没有状态。
对 Variables 和 Alarms 来说,文件夹链参与构成地址:Forno 里的一个变量读作 Variables.Forno.Setpoint,它 Zona1 子文件夹里的那个读作 Variables.Forno.Zona1.Setpoint。一节里的一层就是一个由它的文件夹和它的定义共用的单段命名空间:两个文件夹可以各有一个 Setpoint,但同一层上归档的东西不能规整成同一段,编辑器会在你打字时就拒绝这样的名字,并点名那个已经被占用的地址。Actions 和 Triggers 是按身份被引用的,所以它们的文件夹只组织这棵树,它们的面板显示的是一行位置,而不是一个地址。
| 命令 | 会发生什么 |
|---|---|
| 新建文件夹 | 创建一个名叫 FolderN 的空文件夹,并在树的那一行上打开它的名称字段;把字段留空或者不改,就保留那个名字。 |
| 重命名文件夹 | 在那一行上打开名称字段。这个文件夹下面的每一个地址都跟着挪,每一处引用都被改写,记录条会说有多少处(“文件夹已重命名;更新了 3 处引用。”)。 |
| 移动到 | 把一个文件夹或一份定义归到同一节的另一个文件夹下面,或者退回这一节的根上;地址和引用都跟着走。列表只提供合法的去处:绝不会是这个文件夹自己、它自己的某个子文件夹、另一节,也不会是会让它的子文件夹越过嵌套上限的那一层。 |
| 移除文件夹 | 先问一句,并说明什么会挪走:“它的 3 项内容会挪到 Variables;什么都不会被删掉。指向这些挪走地址的引用都会被更新。”里面的东西和子文件夹都被重新归到上一层;两项在去处会撞名时,这次移除被拒绝。 |
逻辑扫描周期与队列
运行时每 100 毫秒在一条顺序执行的逻辑队列上跑一次逻辑扫描周期:它先给每一个表达式变量求值,再给每一个已启用的报警条件求值,就是这个顺序,所以一个条件读到的是本次扫描周期的变量值。动作的运行、内部存储值的写入、点位写入和确认都搭同一条队列,所以一个脚本绝不会插在一次扫描周期或者另一个脚本中间。另有一次同样每 100 毫秒的扫查,把到点的触发器投到这条队列上。消费者(仪表画面、通道、这个页面)读的是已发布的状态;这个页面上没有任何东西会手工触发一次求值。
写入数值
不管是谁发起的,每一次写入都走同一个出口:一个脚本里的赋值或者 Write(...)、一个内部存储值变量的设置值字段、一个仪表画面控件、一份 Process 配方、代理,或者一个写公开节点的外部 OPC UA 客户端。这个出口会拒绝不是有限数、或者转换不成目标类型的值,会拒绝一个正在被运行中的配方或者被联锁占住的信号源(并点名占着的那一方),把这次写入按它的来源(操作员、MCP、那次运行)记成“从旧值到新值”,并在逻辑队列上把它应用下去。来源是动作的写入是个例外:它只进详细捕获,绝不进事件控制台,因为一个每次扫描周期都写的脚本会产出成千上万个值,会把工作站的要闻埋掉。控制台从动作那里留下的,是它的失败。点位写入接收的是工程值,并把这个点位的转换链反过来走一遍,得到设备要的那个原始值。细节在变量和动作里。
权限与锁定
| 权限 | 在这里允许什么 |
|---|---|
| 查看 Logic | 打开这个页面并读它上面的一切,实时数值也在内。 |
| 配置 Logic | 创建、编辑、重命名、搬动、复制、启用、禁用和删除变量、动作、触发器、报警和文件夹,以及打理素材库。 |
| 操作 Logic | 写一个内部存储值、运行一个动作、确认报警,在这里、在仪表画面上和在事件页面上都算。 |
只有“查看 Logic”的角色把整个页面读一遍:那些编辑器不可用,上面有一句说明(“你的角色可以查看 Logic,但不能配置它(变量、动作、触发器、报警和资源)。”),任何配置类或操作类的命令都不画出来。有“操作”而没有“配置”的角色,仍然留着运行、确认、全部确认和设置值。有一个 Process 单元占住工作站时,页面显示工程锁定的通知,每一个配置类命令和编辑字段都置灰;运行、确认和设置值仍然可用。运行时已停止时,配置类和操作类都以“运行时已停止”被拒绝;树和面板仍然读得了,但不带实时数据。权限位的完整目录在权限里。
这个页面不做什么
没有保存,也没有撤销:一次按键就是一次已经落盘的改动(记录条写“已保存。”),而一次被拒绝的保存会把字段重新载入成工作站里的内容。代理通过它自己的工具创建或删除的那些定义,不会自己去刷新一个开着的栏;那根树枝会在这个页面下一次在那一节里创建、复制或删除时重新读一遍。报警历史、事件控制台和仪表画面各在自己的页面上。