事件条目

对被测对象所监视的条件,写成一个建立在模型通道之上的 JavaScript 表达式,在一次运行期间判,或者始终判。

以 Markdown 查看

一个事件条目记下被测对象做了一件值得记的事。报警监视的是厂区和设备,而事件条目属于流程:它的跳变随观测到它的那次运行一起保存,同时也进入事件页面上那条持久的事件条目时间线。它的条件是一个建立在模型通道之上的 JavaScript 表达式,两个跳变方向都去抖动,并由它所读之物的质量把关。事件条目住在 Process > 模型 > 某个模型 > 设定 > 事件条目下面,需要编辑配方与判定权限。

事件条目文件夹

选中事件条目那一行会打开文件夹页面(“对被测对象所监视的条件。凡是适用的,每一次跳变都随它的运行记录保存,同时进入持久的事件条目历史。”),一个事件条目一张卡片,按名称排;点一张卡片就打开它,那个叉则把它删掉。一个都没有时,页面写着“还没有事件条目。添加一个。”

命令 做什么 什么时候变灰(情形) 什么时候不画出来(角色)
新建事件条目(选中文件夹时在详情栏上;右键添加事件条目 添一个 Occurrence <n>:严重程度为警告,仅在流程期间投入,已启用,没有消息,条件为空。并选中它。 任何一个单元上有运行,或者运行时已停止。 没有编辑配方与判定时。

事件条目的页面

标题栏带着名称、一枚写着严重程度的小药丸(用该严重程度自己的颜色),事件条目关着时还带一枚已禁用小药丸。它下面可能立着两种提示:

  • 保存下来的条件通不过校验时的一条警示附注(草稿照样保存;附注说明哪里不对,见下)。
  • 每一个实时条件求不出值的单元一条求值不可用提示条,写作“<unit><error>”。同一个错误不变时,一个单元的诊断只写一次,等求值又成功了就清掉。

标识与行为

字段 是什么 取值 / 默认 效果
名称 这个事件条目的名称:树里那一行、运行记录文件里的事件标签、事件时间线和那些报告里用的都是它。 自由文本;创建时是 Occurrence <n> 给树里那一行改名,也改流程的清单里对它的称呼。
严重程度 一次成立的分量。选择框把每一个选项按它的小药丸将来的墨色显示出来。 提示警告(默认)、严重 决定小药丸和那段发生记录在任何地方被列出时的颜色。运行期间,一个警告或严重事件条目的成立,还会在应用被遮住或最小化时请求一条操作系统通知;提示则留在窗口里。
投入时机 什么时候判这个条件。 仅在流程期间(默认):只在一次投入它的流程的运行进行期间,在记录下来的那些行上判。始终:运行之外也判,由一个后台监视程序实时读取这个单元的绑定。 一个始终的事件条目不需要任何流程来投入它;一个仅在流程期间的事件条目,只由勾选了它的那些流程来判。
成立延时(ms) 条件必须持续成立多久,Activated 才被确认,分辨率取决于采样。 一个毫秒数;默认 0。这个字段不接受负数:输入会被拒绝,字段下面的附注会写出来,之前的值回来。 给上升沿去抖动。
复归延时(ms) 条件必须持续不成立多久,Cleared 才被确认。 同上;默认 0。 给下降沿去抖动。
已启用 这个事件条目到底投不投入。 默认开。 被禁用的事件条目永远不投入,运行里运行外都不投入,也从不挡住启动。
消息 随一次成立一起记录并播报的那段文字。 自由文本;默认为空。 随每一次跳变一起进入运行记录文件和日志。

条件

“一个返回 Bool 的 JavaScript 表达式。”这张卡片装着一个代码编辑器、你可以使用的那些引用的清单(“可用的通道引用:Channels.Ch_1、Channels.Outlet_temperature、…”),以及那句提醒“运行期间,条件读取记录下来的数据记录列;‘始终’监视器则实时读取单元的绑定。写法错误、引用缺失和求值失败都会显示在这里,而不会被当成假或者信号丢失。”

一条通道写作 Channels.<identifier>,其中的标识符是通道名称规范化之后的样子:字母和数字原样保留,其他每一个字符变成 _,以数字开头的名称前面补一个 _Channels 里只有这个模型的通道,别无他物,因此一条名叫 MathisNaNtrue 的通道仍然是合法的通道名,也不会遮住任何 JavaScript 全局对象。一个存在且质量良好的 NaN 是数据,你可以用 isNaN(Channels.Pv) 去判它。例子:Channels.Outlet_temperature > 80Channels.Door_open && Channels.Heater_on

草稿在你输入时就按每条通道类型的示例值校验,标题下面那条警示附注说出哪里通不过:

附注 含义
“语法错误:…” 这个表达式解析不了。
“通道引用‘Channels.X’在这个模型里不存在。” 一个引用没有指到任何通道。
“不止一条通道映射到‘Channels.X’。” 两个通道名称规范化成同一个标识符;请到通道表里给其中一个改名。
“条件必须返回 Bool,实际返回了 <type>。” 表达式得出的不是真也不是假。
“求值错误:…” 表达式抛了异常。

无效的条件仍然作为草稿保存下来。它在别处有后果:一个已启用、通不过校验、而且被某个流程投入(在它上面勾选了,或者投入时机是始终)的事件条目,会挡住那个流程的启动,流程的页面上写着“事件条目‘<name>’无效:…”;一个无效的始终事件条目不会启动它运行之外的监视程序,只在这里留下一条看得见的诊断,而不是每轮轮询都重复一遍。

每一次求值都跑在一个受约束的引擎里(500 ms 的上限、有界的语句条数和有界的内存),因此一个失控的表达式失败的是它这次求值,而不是工作站。

一个事件条目是怎么被判的

运行期间,条件是在数据记录记下来的那些行上判的,因此这个流程的数据记录没有记录的通道,对它来说就是不可用的。一个流程在这样一条通道上投入了事件条目,或者投入了事件条目却什么都不记录,会在它自己那一页上和启动时被拒绝:那个事件条目永远判不了,警示附注会写出它的名字。运行之外,一个始终事件条目由一个实时读取该单元绑定的监视程序来判。两种判定程序在任何一条被引用的通道不可用期间,都保持最后确认过的状态:只有值缺失或者质量不良才会把判定挂起,而一个存在、质量良好的值(包括 NaN)是可以求值的数据。判定程序记录四种状态变化:Activated(成立延时之后)、Cleared(复归延时之后)、Unavailable(一条被引用的通道丢了信号)和 Restored(每一条被引用的通道都回来了;条件重新被判,相应的延时也重新开始)。

运行期间,每一次状态变化先写进运行记录文件,然后连同它的运行上下文复制进事件页面上那份持久日志;运行之外,监视程序只写日志。启动一次运行会丢弃这个单元运行之外的那个判定程序,离开运行时再造一个新的,因此没有哪一次成立会跨过一段没有被观测的边界带过来。改名称、消息或严重程度只影响之后的跳变;改条件、延时、投入时机或启用状态,会开始一次全新的监视。

发生记录(从成立到解除,其间任何信号丢失的区间单独计)是从这些跳变里推导出来的,应用在哪里显示它们就在哪里推导:操作面板的事件条目卡片、事件页面、历史和那些报告。一段发生记录的持续时间正好是两次持久化跳变之间的间隔,因此它不含成立延时而含复归延时:计时是在条件已经持续满足了成立延时之后开始的,而它要等复归延时走完、解除被写下来时才停。那就是一份报告交给第三方的那个数字。

一个事件条目在哪里被用到

一个流程的页面上带着这个流程期间投入的事件条目卡片,配一枚“已投入 <n> 个”的小药丸,以及这个模型每一个事件条目一个复选框,按名称排。勾上一个,就在那个流程的运行期间投入它;一个投入时机为始终的事件条目不管怎样都在监视,不需要勾。这个模型里一个事件条目都没有时,卡片写着“这个模型里还没有事件条目。请到模型的事件条目下面添加一些。”见流程

给一条通道改名,会改写这个模型每一条条件里那条通道的 Channels.<identifier> 引用;它不动字符串、不动注释,也不动另一个对象上同名的属性。

删除事件条目

删除事件条目在选中这个事件条目时立在详情栏的危险组里,也在它的右键菜单里,还是文件夹页面卡片上那个叉。它先问一次(“删除事件条目”,“这会把这个事件条目从模型里删掉。”),并把它从每一个勾选了它的流程上撤下来。它需要编辑配方与判定,在工程锁定和运行时停止之下变灰。

一个事件条目不做的事

  • 它不是报警:它不被确认,它没有优先级,它也不监视点位。厂区的报警在 Logic 页面上。
  • 它不触发任何东西。一次成立被记录下来并播报出去;没有任何动作、标签或报告挂在它上面。
  • 除了这个模型的通道,它什么都读不了:没有点位,没有变量,也没有别的模型。
  • 它不会按单元判得不一样:一个条件服务于每一个单元,在那个单元自己的绑定或记录下来的行上判。