MQTT 插件
此插件让您能够使用 MQTT 将 MERLIC 作为 MQTT 客户端集成到制造机器中,并通过 TCP 设置与另一个 MQTT 客户端(例如可编程逻辑控制器 [PLC] 或 SCADA 系统)的通讯。MQTT 是开放 OASIS 标准消息传递协议,可用于 IoT 设备之间的消息交换。MQTT 插件允许您监视流程集成系统的状态和结果,同时对其进行控制。
工作原理
主题和消息
对于通过 MQTT 进行的通讯,消息长度可为 2 字节到 256 兆字节。消息按层次结构主题组织并且支持多种消息类型,例如,建立连接、发布数据以及确认收到数据。MQTT 消息代理负责管理消息的收集和分发。该代理从所有客户端收集消息并将它们发送到订阅相应主题的任意客户端。可为每个主题保留一条消息,以便发送给以后订阅特定主题的客户端。
MQTT 客户端
MQTT 客户端可以是运行 MQTT 库并能够与 MQTT 消息代理通讯的任何设备。使用 MQTT 插件时,MERLIC 本身充当 MQTT 客户端并能够与 MQTT 代理交换消息。
要测试 MQTT 插件的函数,可以使用机器视觉系统设置中的任何现有 MQTT 客户端设备,或在本地系统上安装 MQTT 客户端软件,例如 MQTT Explorer。
MQTT 消息代理
MQTT 代理是一个服务器,用于从客户端接收所有消息,然后将消息路由到已订阅特定主题的 MQTT 客户端。您可以使用任何可用的 MQTT 代理,例如,Eclipse Mosquitto™ 代理。mqtt://test.mosquitto.org:1883 上提供有一个公开实例。
限制
- MQTT 插件目前缺少安全功能,特别是基于证书的 TLS/SSL 加密。
- 其他插件可能会干扰插件的运行,例如,集成在 MERLIC RTE Setup 的“硬件设置”选项卡中的模拟 PLC。
要求
MQTT 代理和客户端
如果您的网络上没有 MQTT 代理可用,则必须安装并运行一个代理。此外,至少必须启动并连接一个 MQTT 客户端。
有效配置
您必须为流程集成模式 () 定义具有至少一个配方的有效配置。可在 MERLIC RTE Setup 中设置该配置。
结合 MQTT 插件在流程集成模式下操作
运行流程集成模式,即 MERLIC RTE 与 MQTT 插件时必须执行以下步骤:
- 在本地系统上或通过远程连接提供一个 MQTT 消息代理。
- 提供 MQTT 客户端,以便就“merlic/action”主题向代理发送消息。这些消息可用于在流程集成模式下控制 MERLIC。
- 启动 Communicator 并配置 MQTT 插件。请参阅配置选项部分了解更多信息。
- 启动 MQTT 插件,并建立与 MQTT 消息代理的连接。请参阅启动 MQTT 插件部分了解更多信息。
- 在流程集成模式下启动 MERLIC 并提供包含至少一个有效配方的配置。
- 可选:使用 MQTT 客户端将有关“merlic/action”主题的消息发送到代理,以便控制处于流程集成模式下的 MERLIC。
- 可选:提供 MQTT 客户端以显示和浏览 MQTT 插件发布的消息。客户端可以与步骤 2 中的相同。
MQTT 插件启动后,会自动收集关于 MERLIC 视觉系统的当前状态的信息。它还会自动连接到在 MERLIC RTE Setup 的“MQTT Connection Details”部分中为插件实例定义的 MQTT 代理。MQTT 插件会在消息中将来自 MERLIC 的信息发布到以下指定的 MQTT 主题:
- merlic/mode
- merlic/preparedRecipeIds
- merlic/recipes
- merlic/runningJobId
- merlic/state
如果已配置默认配方,MERLIC 将从初始状态“Preoperational”转变成“Initialized”,然后转变成“Ready”。在“Ready”状态下,可通过将 {"actionType": "StartSingleJob"} 发布到主题“merlic/action”来触发视觉系统的单次执行。至于连续执行,可使用 {"actionType": "StartContinuous"} 触发并使用 {"actionType": "Stop"} 停止。
请参阅传入消息部分了解更多信息。
当流程集成模式被执行时,即 MERLIC RTE 应用程序,来自 MVApp 的结果由 MQTT 插件发布到主题“merlic/recipes/0/result”:
- 如果 MERLIC RTE 正在运行,MQTT 插件会自动更新并发送相关信息。
- 如果 MERLIC RTE 未在运行,则其不会收集任何信息。插件假设视觉系统的状态为“Halted”且配方列表为空。
启动 MQTT 插件
您可以通过 MERLIC RTE Setup和命令行启动 MQTT 插件。
通过 MERLIC RTE Setup
在启动 MERLIC RTE Setup之前,您首先必须确保 Communicator 正在运行。
- 通过
图标打开 MQTT 插件实例的菜单,然后单击“
启动”。
- 或者,选择左侧的 MQTT 插件实例,然后单击 MERLIC RTE Setup 底部的“
Start plug-in”按钮。
通过命令行
打开命令提示符窗口,转到 MERLIC 安装中的“bin\x64-win64”目录并使用以下命令:
merlic_communicator.exe --plugin MQTT
有关其他命令行选项和通过命令行启动插件时的副作用的更多信息,请参阅启动 Communicator 和插件主题。
在启动 MQTT 插件之前,确保按照自己的喜好配置 Communicator,例如,如需记录发布至 MQTT 消息代理的消息,必须将日志等级设置为“debug”。
加载和更改配方
如果配置了默认配方,MERLIC 将加载它并从初始状态“Preoperational”转变成“Initialized”,然后转变成“Ready”。如果没有默认配方,MERLIC 在启动后直接保持“Initialized”状态。要加载第一个配方,可以使用 MQTT 客户端将以下 JSON 消息发布到主题“merlic/action”。MQTT 插件将自动接收消息。
{
"actionType": "PrepareRecipe",
"recipeId": "0"
}
只有当 MERLIC 处于“Ready”状态时,才可以加载其他配方。
配置选项
要检查并编辑 MQTT 插件的配置,Communicator 必须正在运行,但插件必须已停止运行。您可以使用具有不同设置的多个配置。仅应使用 MERLIC RTE Setup 进行配置,如以下部分所述。但是,在文件损坏等情况下,可以在“MQTT.json”文件中手动检查和更改设置。
Plug-in Parameters
此类型参数代表 Communicator 插件中无法在“通讯”选项卡的配置区域中调整的一般参数。它们可显示插件的版本号、日志等级的当前参数值、插件的访问等级,以及插件配置的验证设置。这些值需要在不同的位置或通过不同的方法分别进行设置。
Version
此参数显示在插件实现期间定义的版本号。它由主要版本、次要版本和维护版本组成。添加新插件实例时也会显示此版本号。版本是可选的。因此,在实现过程中可能并未定义版本号。
Log level
还可以为 Communicator 整体设置不同的日志等级,或仅针对特定插件实例进行设置。
Access level
此参数显示为插件设置的访问等级。对于 MQTT 插件,访问等级默认设置为“monitor and control”。这表示插件可以接收“事件”并发送“操作”。访问级别与插件实现中定义的功能相关。实现的功能无法在 MERLIC RTE Setup 中调整。
Supports rapid validation
该参数显示插件是否支持立即验证当前的插件配置。对于这个插件,勾选复选框表示支持“快速验证”。这意味着,每次在 MERLIC RTE Setup 的“通讯”选项卡中修改任何可编辑参数时,都会验证插件的配置。如果插件不支持“快速验证”,则只有在保存配置时才会验证插件的配置。
User Parameters
“User parameters”代表可为插件配置的参数集。它们显示在可以展开或关闭的不同类别中。
以下部分介绍每个类别的参数。
MQTT Connection Details
此类别参数定义 MQTT 代理的连接设置。如果 MQTT 代理在本地系统上通过传统端口 1883 运行,则可以使用默认配置,而无需修改。目前尚不支持基于证书的 SSL/TLS 或基于预共享密钥的 TLS。
下图显示 MQTT 连接的可用参数以及相应的默认设置。图下有参数的详细说明。
Hostname
此参数定义 MQTT 代理的主机名或 IP 地址。默认情况下,该参数设置为“localhost”。
Port
此参数定义 MQTT 代理的运行端口。默认情况下,此参数设置为 1883。
Authentication
通过此类别中的参数,您可以定义用户凭据,以便能连接到需要密码身份验证的 MQTT 代理。
下图显示可用于身份验证的参数。
Authenticate with username/password
此参数定义是否使用身份验证。默认情况下它未选中,并且在连接到 MQTT 代理时不提供用户凭据。
Username
此参数定义身份验证的用户名。它只能在选中“Authenticate with username/password”参数时设置。
Password
此参数定义身份验证的密码。它只能在选中“Authenticate with username/password”参数时设置。默认情况下,密码不显示,而是用项目符号表示。要查看纯文本密码,请单击 图标。
密码以明文形式存储。当前不支持 TLS 加密。
Topics & Messages
此类别参数定义 Communicator 通过 MQTT 插件发送的消息的设置。消息以 JSON 格式发布。
下图显示主题和消息的可用参数以及相应的默认设置。图下有参数的详细说明。有关可用主题和相应 JSON 方案的更多信息,请参阅主题概述部分。
Topic prefix
此参数定义 Communicator 用于标识其消息的主题前缀。默认情况下,前缀设置为“merlic”。请参阅传出消息部分了解更多信息。
Compact JSON
如果设置此参数,输出将采用 JSON 格式且不包含空格或换行符。默认情况下已设置该参数。
JSON indentation level
此参数定义 JSON 缩进等级,即 JSON 消息中使用的空格数量。此选项仅在未设置“Compact JSON”参数时适用。通常使用 2 到 4 之间的缩进等级。默认情况下,此参数设置为 2。
Publish errors
如果设置此参数,则 MERLIC RTE 报告的错误将发布到“merlic/error”主题及其子主题。错误消息不会被保留,也就是说,它们只会在错误发生时传递给主题的订阅者。默认情况下已设置该参数。
Publish recipe data
如果设置此参数,配方列表会发布到“merlic/recipes”主题。此外,对于每个配方,会将 Boolean 发布到“merlic/recipes/{id}/isPrepared”形式的主题,其中 {id} 是数字配方 ID。Boolean 值表示该配方当前是否已准备。这些消息将被保留,以便在插件已经运行时订阅这些主题的客户端将接收当前配方数据。默认情况下已设置该参数。
Publish result data
如果设置此参数,新结果将发布到“merlic/recipes/{id}/result”形式的主题及其子主题,其中 {id} 指生成结果的配方的数字配方 ID。结果消息不会被保留,也就是说,它们只会在结果到达时传递给主题的订阅者。默认情况下已设置该参数。
Publish result images
此参数定义是否将检索和发布作为配方执行的 MVApp 的结果图像。此参数仅在设置了“Publish result data”参数时才启用。
如果设置了“Publish result images”,则将成功检索到的结果图像的数据发布到主题“{prefix}/recipes/{id}/result/images/{dataIndex}/data”。该主题是唯一一个不传达 JSON 消息的主题。
{dataIndex} 是指 MVApp 的对应图像结果的数字(从 0 开始)索引。如果选择发布结果图像,您可以为结果图像指定一些其他设置,如滤镜模式或图像数据的有效负载格式。您可以在“Image Results”类别中找到相应的参数以及结果图像的其他配置选项。
如果无法检索图像,例如,因为该图像不再存储在 MERLIC 中或因为转换为所需格式失败,则将错误发布到“{prefix}/recipes/{id}/result/images/{dataIndex}/error”。此主题使用主题“{prefix}/error”已使用的“error.json”方案。
默认情况下不设置此参数,因此不会发布结果图像。
Image Results
此类别中的参数定义如何发布结果图像。仅当设置了类别“Topics & Messages”中的参数“Publish result images”时,这些参数才可配置。
Image result filter mode
通过此参数可以启用用于确定将检索哪些图像结果的筛选器。您可以选择以下选项。默认情况下设置为“None”。
|
模式 |
描述 |
|---|---|
|
None |
未应用筛选器,将检索所有结果图像。 |
|
Regular expression |
仅检索名称与 Result name filter regex 参数中指定的正则表达式相匹配的结果图像。 |
Result name filter regex
Payload format for image data
此参数定义应如何在 MQTT 主题上发布实际图像数据。默认情况下,该参数设置为“Data URI (base64)”。
|
格式 |
描述 |
|---|---|
|
Binary |
以“raw”二进制数据形式发布图像数据。这是最简单且最有效的选项,但许多 MQTT 客户端无法处理或显示二进制数据。 |
|
Base64‑encoded string |
以 base64 编码字符串的形式发布图像数据。使用 base64 编码将数据清晰地表示为文本(大小开销为 33%)。 |
|
Data URI (base64) |
以 base64 编码数据 URI 的形式发布图像数据。它还使用 base64 编码,但会为负载加上一个数据 URI 协议方案前缀,其中包括 MIME 类型,如适用于 HALCON Serialized Item 的“image/jpeg”、“image/png”或“application/octet-stream”。 |
Image format
|
格式 |
描述 |
|---|---|
|
PNG |
|
|
JPEG |
以 JPEG 图像格式发布图像。如果选择此格式,则以下其他参数可用: |
|
HALCON Serialized Item |
|
通常,“byte”、“int1”、“uint2”、“int2”、“int4”、“int8”以及“real”类型的所有图像均可导出为 MVApp 结果,并转换为可用的图像格式。但是,“real”类型的图像是个例外,因为它们只能转换为“HALCON Serialized Item”格式。有关图像格式及相应的像素转换的信息,请参阅配置 Communicator 插件主题中的图像结果部分。
Use progressive JPEG
仅当“Image format”参数设为“JPEG”时,此参数才可用。
JPEG quality
仅当“Image format”参数设为“JPEG”时,此参数才可用。它定义压缩为 JPEG 的质量,用百分比表示。默认情况下设置为 50%。
PNG compression
仅当“Image format”参数设为“PNG”时,此参数才可用。它定义压缩为 PNG 的级别。可设置为 0 到 9 之间的值。默认情况下设置为 6。
Image zoom mode
此参数可用于调整结果图像的大小。下表列出了可用选项。根据所选的模式,其他参数将可进行配置。默认情况下,该参数设置为“None”。
|
模式 |
描述 |
|---|---|
|
None |
|
|
Fixed width and height |
将图像缩放到 Image width 和 Image height 参数中定义的大小。 |
|
Zoom factor |
系统将根据 Image zoom factor 参数中指定的系数延两个维度调整图像大小。 |
Image width
仅当“Image zoom mode”参数设为“Fixed width and height”时,此参数才可用。它定义结果图像的宽度。
Image height
仅当“Image zoom mode”参数设为“Fixed width and height”时,此参数才可用。它定义结果图像的高度。
Image zoom factor
仅当“Image zoom mode”参数设为“Zoom factor”时,此参数才可用。它定义用于沿两个维度调整图像大小的百分比值。您也可以指定大于 100% 的值。默认情况下,该参数设置为 100%,这表示保留原始图像大小。
Quality of Service (QoS)
此类别参数定义传输期间出现数据包丢失(例如,因数据传输错误或网络拥塞)时的代理行为。
每个参数的值均可设置为 0、1 或 2。选定的值会以蓝色突出显示。要选择其他值,请单击相应的值。下表提供其含义概述。
|
QoS 值 |
描述 |
|---|---|
|
0 |
消息仅发送一次,而无论是否被确认(“即发即弃”)。 |
|
1 |
消息至少发送一次,直到获得确认(“确认送达”)。 |
| 2 |
消息刚好发送一次(“保证送达”) |
下图显示可用参数以及相应的默认设置。图下有参数的详细说明。
QoS for status updates
此参数定义状态更新的 QoS。默认情况下设置为 1。
QoS for errors
此参数定义错误消息的 QoS。默认情况下设置为 2。此参数仅在设置了“Publish errors”参数时适用。
QoS for updates of the recipe list
此参数定义配方列表更新的 QoS。默认情况下设置为 2。此参数仅在设置了“Publish recipe data”参数时适用。
QoS for the delivery of new results
此参数定义新结果发送的 QoS。默认情况下设置为 0。此参数仅在设置了“Publish result data”参数时适用。
订阅 MQTT 主题
传入消息
MQTT 插件会自动订阅主题 merlic/action。但是,如果插件使用访问等级“monitor”启动,则不会订阅此主题。如果插件使用访问等级“control”启动,则不会发布有关此主题的消息。您可以通过发送以下“actionType”消息到主题 merlic/action,使用任意 MQTT 客户端控制 MERLIC 的执行:
- SelectMode
- PrepareRecipe
- UnprepareRecipe
- StartSingleJob
- StartContinuous
- Halt
- Reset
- Stop
- Abort
示例和其他信息
开始执行
使用配方启动 MVApp 的连续执行:
{
"actionType": "StartContinuous",
"recipeId": "3"
}
启动单个工作:
{
"actionType": "StartSingleJob"
}
对于这两种执行模式,不能指定配方 ID,因为只能执行当前准备的配方文件中引用的 MVApp。如果指定配方 ID,必须确保提供当前准备的配方的 ID,否则会发生错误。
使用参数值开始执行
如果要覆盖当前准备的配方中定义的参数值,可以为执行指定参数值,如以下示例中所示。
使用以下参数启动连续执行:
{
"actionType": "StartContinuous",
"parameters": [42, 3.141, "mvapp-parameter"]
}
使用以下参数启动单个工作:
{
"actionType": "StartSingleJob",
"parameters": [42, 3.141, "mvapp-parameter"]
}
对于参数的规范,适用在 Communicator API 参考文档的 Available Actions 主题中为参数“MV_PARAM_START_PARAMS”所述的相同规则。
JSON 数组中指定的参数值需要与配方文件中定义的值的数量相对应,并且其数据类型必须适合于无损转换为配方中相应参数值的数据类型。
目前,无法无损转换为 REAL 数据类型。因此,我们建议对 MVApp 中的各个参数使用 MVApp 数据类型,以确保在启动执行时也可以对这些参数进行参数化。
使用可选元数据启动执行
您可以在启动工作时指定测量 ID 或部分 ID:
{
"actionType": "StartSingleJob",
"measId": "optional-measurement-id",
"partId": "S/N-123456789"
}
“measId”和“partId”都是可选的,可以忽略,也可以显式设置为空。如果设置了这些 ID,对于工作执行过程中生成的结果,这些 ID 将在发布到“merlic/recipes/{id}/result”的消息中引用。
传出消息
MQTT 插件会在流程集成模式下通过消息将来自 MERLIC 的信息自动发布到以下指定的 MQTT 主题:
- merlic/mode
- merlic/preparedRecipeIds
- merlic/recipes
- merlic/runningJobId
- merlic/state
您可以使用任意 MQTT 客户端订阅 MQTT 插件发布的消息。
每个主题以占位符 {prefix} 开头,该占位符必须根据主题和消息设置使用可配置的前缀路径进行替换。对于 MQTT 插件,默认为 merlic,例如,“merlic/state”。配置自定义前缀有助于将视觉应用程序集成到现有主题层次结构中,并允许多个不同视觉应用程序在同一 MQTT 代理上同时运行。
有关如何配置信息等级的信息,请参阅MQTT 插件部分。
发送到主题“merlic/recipes/0/result”的消息(如果“Compact JSON”已停用):
{
"id": 111,
"recipeId": "0",
"jobId": 111,
"measId": "measurement-42",
"partId": null,
"timestamp": "2024-02-05T15:12:27.699Z",
"processingTimes": {
"executionStartTime": "2024-02-05T15:12:27.528Z",
"executionEndTime": "2024-02-05T15:12:27.698Z",
"acquisitionDurationMillis": 0.368,
"processingDurationMillis": 168.952
},
"resultState": "Completed",
"content": [
{
"name": "Match_Result",
"value": true
},
{
"name": "Match_Confidence",
"value": 0.99
},
{
"name": "Detected_Part_Number",
"value": "B21TA9322"
}
]
}
保留消息
MQTT 插件自动将部分消息标记为保留,以发送给当前状态和配方列表的订阅者。客户端将在订阅主题后立即收到最新的保留消息,即使该消息是插件在订阅之前发布的。此行为仅适用于状态类信息。错误和新结果等事件类信息不会保留。
主题概述
下表列出了包含相应 JSON 方案的所有可用主题。
|
主题 |
保留 |
示例 |
JSON 方案 |
|---|---|---|---|
|
{prefix}/action |
不适用 |
|
|
|
{prefix}/error |
✘ |
|
|
|
{prefix}/error/brief |
✘ |
"brief error message" |
|
|
{prefix}/error/code |
✘ |
8565 |
|
|
{prefix}/error/message |
✘ |
"error message" |
|
|
{prefix}/mode |
✔ |
"Automatic", null |
|
|
{prefix}/preparedRecipeId |
✔ |
[], ["4"] |
|
|
{prefix}/recipes |
✔ |
|
|
|
{prefix}/recipes/{id}/isPrepared |
✔ |
false, true |
|
|
{prefix}/recipes/{id}/result |
✘ |
|
|
|
{prefix}/recipes/{id}/result/content/{idx}/value |
✘ |
5, 3.141592, "strings" |
|
|
{prefix}/recipes/{id}/result/images/{dataIndex}/data |
✘ |
"data:image/png;base64" |
Binary、base64 或 Data URI (base64) |
|
{prefix}/recipes/{id}/result/images/{dataIndex}/error |
✘ |
|
|
|
{prefix}/state |
✔ |
"SingleExecution" |
|
|
{prefix}/status/runningJobId |
✔ |
42, null |
JSON 方案
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
"actionType": {
"enum": [
"SelectMode",
"PrepareRecipe",
"UnprepareRecipe",
"StartSingleJob",
"StartContinuous",
"Halt",
"Reset",
"Stop",
"Abort"
]
}
},
"required": [
"actionType"
],
"allOf": [
{
"if": {
"properties": {
"actionType": {
"const": "SelectMode"
}
}
},
"then": {
"properties": {
"mode": {
"enum": [
"Automatic",
"FrontendAccess"
]
}
},
"required": [
"mode"
]
}
},
{
"if": {
"properties": {
"actionType": {
"const": "PrepareRecipe"
}
}
},
"then": {
"properties": {
"recipeId": {
"type": "string"
}
},
"required": [
"recipeId"
]
}
},
{
"if": {
"properties": {
"actionType": {
"enum": [
"UnprepareRecipe",
"StartSingleJob",
"StartContinuous"
]
}
}
},
"then": {
"properties": {
"recipeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
}
},
{
"if": {
"properties": {
"actionType": {
"enum": [
"StartSingleJob",
"StartContinuous"
]
}
}
},
"then": {
"properties": {
"measId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"partId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"parameters": {
"anyOf": [
{
"type": "array"
},
{
"type": "null"
}
]
}
}
}
}
]
}
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"severity": {
"enum": [
"Warning",
"Error",
"Critical"
]
},
"cause": {
"enum": [
null,
"SelectMode",
"PrepareRecipe",
"UnprepareRecipe",
"StartSingleJob",
"StartContinuous",
"Halt",
"Reset",
"Stop",
"Abort"
]
},
"brief": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"code",
"severity",
"cause",
"brief",
"message"
]
}
{
"$schema": "http://json-schema.org/schema#",
"type": "string"
}
{
"$schema": "http://json-schema.org/schema#",
"type": "integer",
"minimum": 0,
"maximum": 65535
}
{
"$schema": "http://json-schema.org/schema#",
"type": "string"
}
{
"$schema": "http://json-schema.org/schema#",
"enum": [
null,
"Automatic",
"FrontendAccess"
]
}
{
"$schema": "http://json-schema.org/schema#",
"type": "array",
"items": {
"type": "string"
}
}
{
"$schema": "http://json-schema.org/schema#",
"$defs": {
"recipe_parameters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"valueType": {
"enum": [
"Scalar",
"Array"
]
},
"dataType": {
"enum": [
"Bool",
"Int8",
"UInt8",
"Int16",
"UInt16",
"Int32",
"UInt32",
"Int64",
"UInt64",
"Float",
"Double",
"String",
"Variant"
]
}
}
}
},
"data_infos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
},
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"description": {
"type": "string"
},
"acquisitionSequence": {
"type": ["string", "null"]
},
"inputs": {
"$ref": "#/$defs/recipe_parameters"
},
"outputs": {
"$ref": "#/$defs/recipe_parameters"
},
"outputData": {
"$ref": "#/$defs/data_infos"
}
},
"required": [
"id",
"inputs",
"outputs",
"outputData"
]
}
}
{
"$schema": "http://json-schema.org/schema#",
"type": "boolean"
}
{
"$schema": "http://json-schema.org/schema#",
"$defs": {
"scalar": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "number"
},
{
"type": "string"
}
]
},
"timestampRfc3339": {
"type": "string",
"pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,3})Z$"
}
},
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 0
},
"recipeId": {
"type": "string"
},
"jobId": {
"type": "integer",
"minimum": 1
},
"measId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"partId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"timestamp": {
"$ref": "#/$defs/timestampRfc3339"
},
"processingTimes": {
"anyOf": [
{
"type": "object",
"properties": {
"executionStartTime": {
"$ref": "#/$defs/timestampRfc3339"
},
"executionEndTime": {
"$ref": "#/$defs/timestampRfc3339"
},
"acquisitionDurationMillis": {
"type": "number"
},
"processingDurationMillis": {
"type": "number"
}
}
},
{
"type": "null"
}
]
},
"resultState": {
"type": "string",
"enum": [
"Completed",
"Processing",
"Aborted",
"Failed"
]
},
"content": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"anyOf": [
{
"$ref": "#/$defs/scalar"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/scalar"
}
}
]
}
},
"required": [
"name",
"value"
]
}
}
},
"required": [
"id",
"recipeId",
"jobId",
"timestamp",
"resultState",
"content"
]
}
{
"$schema": "http://json-schema.org/schema#",
"$defs": {
"scalar": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "number"
},
{
"type": "string"
}
]
}
},
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 0
},
"recipeId": {
"type": "string"
},
"jobId": {
"type": "integer",
"minimum": 1
},
"timestamp": {
"type": "string",
"pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]Z$"
},
"resultState": {
"type": "string",
"enum": [
"Completed",
"Processing",
"Aborted",
"Failed"
]
},
"content": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"anyOf": [
{
"$ref": "#/$defs/scalar"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/scalar"
}
}
]
}
},
"required": [
"name",
"value"
]
}
}
},
"required": [
"id",
"recipeId",
"jobId",
"timestamp",
"resultState",
"content"
]
}
{
"$schema": "http://json-schema.org/schema#",
"$defs": {
"scalar": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "number"
},
{
"type": "string"
}
]
}
},
"anyOf": [
{
"$ref": "#/$defs/scalar"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/scalar"
}
}
]
}
{
"$schema": "http://json-schema.org/schema#",
"type": ["null", "integer"]
}
{
"$schema": "http://json-schema.org/schema#",
"enum": [
"Preoperational",
"Halted",
"Error",
"Initialized",
"Ready",
"SingleExecution",
"ContinuousExecution",
"FrontendAccess"
]
}