功能概述
摩尔信使MThings的逻辑控制功能以图形化组件和连线组织数据处理流程,可把设备数据、定时事件、人工操作或日期时间经过运算、判断、延时、脚本、调节和状态处理后,送往设备命令、数据显示、趋势监视或警告标识。该功能面向需要在工业数据采集项目中完成数据换算、条件分流、设备联动和轻量过程控制的工程配置、调试及运维人员,核心价值是在不编写完整应用程序的情况下组合可观察、可验证的数据处理流程。
本指南重点说明每个组件的端口数量、输入类型、有效输入条件、输出类型、输出时机以及空值处理方式。这里的"输出"通常是一次数据更新事件,并不等同于持续输出电平;下游组件是否执行,也往往取决于是否收到新的更新事件。
逻辑控制适合以下场景:
| 场景 | 可采用的组件组合 |
|---|---|
| 周期采集并显示设备数据 | 定时器 → 模拟量输入或数字量输入 → 数据标签或示波器 |
| 按条件分流 | 比较器或状态判断 → 真分支、假分支 |
| 设备联锁与启停 | 逻辑门、设置/重置优先、延时组件 → 模拟量输出或数字量输出 |
| 批量设置多个点位 | 多路指令控制或多路输出控制 |
| 累计、计次和统计 | 事件计数器、数据累加器、高值选择器、低值选择器、中值选择器 |
| 过程调节 | PID、限幅器、斜率控制器、越限监控 |
| 自定义计算 | lua脚本、多段线控制、数学运算组件 |
| 运行状态可视化 | 数据标签、示波器、警告标识、静态文本 |
关键字
摩尔信使MThings、MThings、逻辑控制、Logic Control、图形化逻辑、节点编排、Data Flow、模拟量、Analog Value、数字量、Digital Value、输入端口、输出端口、数据更新事件、Event Trigger、空值、设备数据、设备命令、定时器、Timer、闹钟、时钟、脉冲、延时、等待、比较器、逻辑门、事件计数、数据累加、PID Control、限幅、变化率限制、lua脚本、Lua Script、数学运算、多设备控制、工业自动化、边缘控制
功能详解
端口和数据的阅读规则
| 标记 | 含义 | 使用要求 |
|---|---|---|
| A、B、C、X、Y | 模拟量端口 | 用于数值、时间参数、设备数值或计算结果。参加运算时按数值解释。 |
| D、S、R、T、F、sw | 数字量端口 | 通常使用0和1。1表示真,0表示假;空值与0不是同一概念。 |
| T(时间参数) | 模拟量时间端口 | 单位以组件说明为准,多数延时组件使用毫秒。 |
| T、F(分支输出) | 数字量真/假分支 | T只在条件成立时产生有效输出,F只在条件不成立时产生有效输出;未选中的分支为空。 |
| 空值 | 未连接、上游清空或无有效数据 | 不同组件可能清空输出、复位状态、忽略本次输入或停止运行,应按各组件说明处理。 |
逻辑流程采用事件驱动方式。上游端口收到一次更新,下游才可能重新计算。某个端口当前"有值",不代表组件会自动持续执行;反过来,即使数值没有变化,上游再次发出更新事件,部分计数、触发和命令组件仍会再次动作。
建议先确定四件事再连线:数据类型是否匹配、哪个端口负责触发、空值如何处理、组件是否保留内部状态。对设备写入、计数、累计、PID和延时流程,还应明确启动、停止、复位及异常恢复路径。
组合与说明组件
| 组件 | 输入要求 | 输出 | 行为和使用方法 |
|---|---|---|---|
| 组合(GROUP) | 输入数量、顺序、名称和类型由组合内部被公开的输入端口决定 | 输出数量、顺序、名称和类型由组合内部被公开的输出端口决定 | 流程运行时,外部输入会传给组合内部对应端口,内部输出变化后再传到组合外部。适合封装可复用子流程。编辑组合后如果改变端口数量、顺序或类型,应重新检查外部连线。 |
| 静态文本 | 无输入 | 无输出 | 仅用于添加流程说明,不参与运算,也不会产生常量。 |
| 流程终止 | 1个模拟量输入 | 无输出 | 作为流程图中的终点或占位接收器。收到数据后不执行额外动作,也不会停止其他支路运行。 |
数据源与人工输入组件
| 组件 | 输入端口及要求 | 输出端口 | 输出规则 |
|---|---|---|---|
| 固定数值 | 1个数字量触发输入;输入值本身不参与计算 | 1个模拟量Y | 编辑固定值时会更新输出;触发端收到更新时再次输出当前固定值。适合为延时、阈值、增益等端口提供参数。 |
| 定时器 | 1个数字量使能输入;1启用,0或空值停用 | 1个数字量Y | 可通过组件自身开关或使能输入启停。启动时产生一次真值更新,此后按周期持续产生真值更新;停止时不额外输出0。它不是0/1交替方波。周期可选毫秒、秒、分、时、天。 |
| 闹钟 | 1个数字量使能输入;1启用,0或空值停用 | 1个数字量Y | 可通过组件自身开关或使能输入启停。到达指定时间时输出一次真值更新,停用时不额外输出0。支持单次时刻和每隔若干天的周期时刻;单次任务触发后停止。 |
| 日期时间 | 无输入 | 8个模拟量输出 | 依次输出年、月、日、时、分、秒、毫秒、星期。星期使用1至7,1表示星期一,7表示星期日。内部约每秒采样一次,因此毫秒端口不是高频毫秒计时器。 |
| 开关 | 无输入 | 1个数字量Y | 人工保持型开关,切换后输出0或1。流程重新打开或软件重新启动后,不应把界面开关状态当作可靠的持久状态,应重新设置并核对。 |
| 脉冲按钮 | T:1个模拟量输入,表示脉宽,单位毫秒 | 1个数字量Y | 点击按钮立即输出1,达到T后输出0。脉冲期间按钮不可重复点击。T为空时按100毫秒处理,小于10毫秒时按10毫秒处理;T输入只设置脉宽,不会自动触发脉冲。 |
| 触发脉冲 | X:1个数字量输入 | 1个数字量Y | 每收到一次非空更新,Y就在0和1之间翻转;X本身是0还是1不影响翻转。空值更新被忽略。该组件实质是事件翻转器,不是固定脉宽脉冲。 |
| 随机数 | X:1个数字量触发输入 | 1个模拟量Y | 每收到一次非空更新,产生一个0至9999范围内的整数值;X的真假不影响触发。用于测试或模拟,不应用于安全、密码或计量用途。 |
日期时间组件的年、月、日、时、分和星期端口仅在对应字段变化时产生新输出;秒和毫秒端口约每秒产生一次新输出。毫秒值是每秒采样瞬间的毫秒部分,不表示每毫秒连续触发。
定时器的周期范围如下:
| 单位 | 可配置范围 | 说明 |
|---|---|---|
| 毫秒 | 10~60000毫秒 | 适合较短周期触发。实际精度还受操作系统调度和流程负载影响。 |
| 秒 | 1~3600秒 | 按秒级检查。 |
| 分 | 1~3600分 | 按秒级检查是否到期。 |
| 时 | 1~360时 | 按秒级检查是否到期。 |
| 天 | 1~360天 | 适合低频周期任务。 |
闹钟的周期天数可设为1~400天。单次计划时间如果已经早于当前时间,不会补发历史触发;周期任务触发后按配置的天数推进到下一次时刻。对要求严格准点或断电补偿的场景,应由上层业务补充校时、错过任务处理和运行监控。
脉冲发生器
脉冲发生器有5个输入和1个输出:
| 端口 | 类型 | 含义与有效范围 |
|---|---|---|
| S | 数字量输入 | 起始电平,0从低电平开始,1从高电平开始。 |
| N | 模拟量输入 | 输出的电平段数,范围1~10000。N表示电平段数量,不表示完整周期数量。 |
| HT | 模拟量输入 | 高电平保持时间,1~100000毫秒。 |
| LT | 模拟量输入 | 低电平保持时间,1~100000毫秒。 |
| X | 数字量输入 | 启动触发。收到更新后先终止并复位上一轮;只有X为1时才开始新一轮。 |
| Y | 数字量输出 | 按S指定的起始电平,在高低电平之间交替输出;完成N个电平段后清空输出。 |
S、N、HT、LT必须先具备有效值,再触发X。N、HT、LT应提供整数,带小数的数值按整数部分参与。任何必需参数为空或超出范围时,本轮不会有效运行,并会清除组件内部当前输出。重复触发X会从头开始,因此不应把抖动信号直接接到X。X为0会终止上一轮,但不会主动输出一个0事件;下游如果必须收到明确的低电平复位,应另外设计复位路径。
设备读取与设备写入组件
| 组件 | 输入端口及要求 | 输出端口 | 行为和限制 |
|---|---|---|---|
| 模拟量输入 | 1个数字量触发输入;非空即可触发,真假不作使能判断 | 1个模拟量Y | 每次触发输出摩尔信使MThings当前已获得的所选点位值。空触发被忽略。应先选择有效设备和数据项。 |
| 数字量输入 | 1个数字量触发输入;非空即可触发 | 1个数字量Y | 每次触发取得摩尔信使MThings当前已获得的点位值。精确真值输出1,其他非空值输出0,当前没有数据时输出空值。应选择本身就是数字状态的点位。 |
| 模拟量输出 | 1个模拟量X | 无输出 | 流程载入完成后,X收到非空更新时把值写入所选设备点位;空值不写。组件不返回写入成功、失败或设备回读结果。 |
| 数字量输出 | 1个数字量X | 无输出 | 流程载入完成后,X收到0或1更新时写入所选点位;空值不写。0也是有效写命令,不能把0误认为"无动作"。 |
| 多路输出控制 | D:数字量输入;A:模拟量输入 | 无输出 | D或A任一端收到非空更新,都会把该次输入值写入全部已选目标,最多可选择1000个目标。D不是使能端,A也不是唯一数据端;两个端口都是独立的批量命令入口。 |
| 多路指令控制 | sw:数字量触发输入;随后每个目标对应1个模拟量输入 | 无输出 | 最多可选择10个目标。各模拟量端保存对应目标的待写值。sw未连接或为空时,任一参数更新都会用当前已保存的整组有效值执行批量写入;sw已有值时,仅sw收到1的更新才批量发送,sw为0不发送。 |
多路指令控制使用触发模式时,应先更新所有目标值,最后再让sw收到1;否则尚未更新的端口会被跳过,或可能沿用该端口之前保留的值。使用自动发送模式时,每改动一个参数都可能立即触发整组写入,不适合要求"全部参数同时准备完毕后再下发"的设备。
所有设备命令组件都属于无反馈写入端。需要确认写入结果时,应增加独立的设备数据回读路径,并比较命令值与回读值;不能用"流程已经经过命令组件"代替设备确认。
模拟量输入和数字量输入的触发作用是取出软件当前已有的点位值,不等同于临时向现场设备发起一次新的协议轮询。数据新鲜度由对应设备和通信通道的采集周期决定;需要判断超时或断线时,应同时观察设备通信状态和数据更新时间。
当前这些设备读写组件的点位选择范围以界面中可见的Modbus主站、Modbus从站和本机设备数据为准。模拟量输入和数字量输入会优先列出可读数据;输出与批量控制应由用户确认目标点位确实允许写入。多路输出控制会把同一个到达值写给全部目标,不会逐点转换数据类型或校验工程范围,因此同一批目标应具备兼容的数据类型、量纲和允许值范围。多路指令控制的各数据端均为模拟量端口,需要接入数字状态时可先通过DAC转换为0或1数值。
显示与监视组件
| 组件 | 输入要求 | 输出 | 行为和使用方法 |
|---|---|---|---|
| 数据标签 | 1个模拟量输入 | 无输出 | 显示输入的文本化结果,适合查看数值或流程中间值,不改变原数据。 |
| 示波器 | DA、DB、DC:3个模拟量曲线输入;T:1个模拟量时间窗输入 | 无输出 | 同时绘制最多3条曲线。T以秒为单位,默认60秒,有效范围1~6000秒;某条曲线输入为空时清除该曲线,T为空时保持当前时间窗。绘图刷新间隔约不快于100毫秒。 |
| 警告标识 | 1个数字量输入 | 无输出 | 输入为1时显示警告状态,输入为0或空值时显示非警告状态。它只改变流程图中的图标,不生成告警记录,也不替代正式告警配置。 |
延时与等待组件
延时和等待都有3个输入、2个输出:A为模拟量数据,D为数字量数据,T为延时时间;输出端分别返回延时后的模拟量A和数字量D。两者的执行语义不同。
| 组件 | T要求 | 输入与输出行为 | 适用场景 |
|---|---|---|---|
| 延时器 | 依次输入模拟量A、数字量D、模拟量T;依次输出模拟量A、数字量D;T单位为毫秒,T小于10时模拟量A直通 | T达到10毫秒后,A和D的更新分别进入队列。首次进入等待后,达到T只激活延后状态;此后每来一个同类型更新,才输出该类型队列中最早的数据。A或D收到空值会清空两类队列并复位。连续约5秒没有新更新会取消已激活状态,但已排队值不一定被清除;下次数据将重新经历首次等待。 | 需要保持数据更新顺序、形成延后数据流的场景。它不是"每个样本各自启动一个独立定时器"。T小于10时数字量D不宜作为可靠直通路径,数字量无需延时时应直接连线。 |
| 等待 | 依次输入模拟量A、数字量D、模拟量T;依次输出模拟量A、数字量D;T单位为毫秒,T不大于100时A或D在自身更新时直通 | T大于100时,组件空闲期间任一端口更新都可能启动一次等待,包括T参数更新。等待期间继续接收A和D,但只保留各自最新值,且不会重新计时;到期后一次性输出最新的非空A和D。T为空会停止等待并转为直通。 | 防抖、合并短时间内多次更新、等待数据趋于稳定。 |
改变延时器的T会重置其队列和运行状态。等待组件在计时期间改变T或其他输入,不会把本轮等待从头开始。若业务要求"每次更新都重新计时",应明确验证现有组合是否满足,不要把等待组件直接等同于可重触发延时器。
比较与分支组件
| 组件 | 输入要求 | 输出要求与结果 |
|---|---|---|
| 比较器(>) | 依次输入2个非空模拟量A、B | 输出2个数字量分支T、F。A>B时T输出1、F为空;否则F输出0、T为空。 |
| 比较器(≥) | 依次输入2个非空模拟量A、B | 输出2个数字量分支T、F。A大于或近似等于B时走T分支,否则走F分支;相等判断考虑浮点近似,不是字符串比较。 |
| 比较器(=) | 依次输入2个非空模拟量A、B | 输出2个数字量分支T、F。A与B近似相等时走T分支,否则走F分支。 |
| 比较器(介于) | 依次输入3个非空模拟量A、B、C | 输出2个数字量分支T、F。C位于A与B之间且包含边界时走T分支,否则走F分支;A和B顺序可以互换。 |
| 状态判断 | 输入1个数字量X | 输出2个数字量分支T、F。X为1时T输出1、F为空;X为0时F输出0、T为空;X为空时不产生新的分支输出。它不是从整数中提取某一位。 |
比较组件的T、F是互斥分支端口,不是同时给出两个互补电平。把T和F分别连接到不同后续流程,可以只在对应条件成立时触发该分支。条件从真变假时只更新F,原T支路不会额外收到一次"清空"事件;从假变真时同理。若下游需要一个持续的0/1结果,应使用保持、选择或合并逻辑设计完整状态路径。F端的有效值为0,如果后续组件要求1才启用,可先经过"非"组件转换。
数字逻辑与选择组件
| 组件 | 输入要求 | 输出规则 |
|---|---|---|
| 与 | 依次输入2个非空数字量X1、X2 | 输出1个数字量Y。两者都为1时Y为1,否则Y为0;任一输入为空时Y为空。 |
| 或 | 依次输入2个非空数字量X1、X2 | 输出1个数字量Y。任一输入为1时Y为1,否则Y为0;任一输入为空时Y为空。 |
| 异或 | 依次输入2个非空数字量X1、X2 | 输出1个数字量Y。两者不同时Y为1,相同时Y为0;任一输入为空时Y为空。 |
| 非 | 输入1个数字量X | 输出1个数字量Y。X为1时Y为0;其他非空数字值按假处理并输出1;X为空时Y为空。 |
| 设置优先 | 依次输入2个非空数字量S、R | 输出1个数字量Y。S为1时优先置Y为1;否则R为1时置Y为0;S、R都为0时保持上一状态。任一输入为空时Y为空。 |
| 重置优先 | 依次输入2个非空数字量S、R | 输出1个数字量Y。R为1时优先置Y为0;否则S为1时置Y为1;S、R都为0时保持上一状态。任一输入为空时Y为空。 |
| 数字通道开关 | 依次输入数字量sw、X1、X2 | 输出1个数字量Y。sw为0选择X1,sw为1选择X2;sw为空或被选输入为空时Y为空。 |
| 模拟通道开关 | 依次输入数字量sw、模拟量X1、模拟量X2 | 输出1个模拟量Y。sw为0选择X1,sw为1选择X2;sw为空或被选输入为空时Y为空。 |
| 多路数值选择器 | 依次输入4个模拟量通道 | 输出1个模拟量。任一端口收到非空更新,就把该次值送到输出端;最后到达的更新生效。空值被忽略,没有选择控制端。 |
| 多路事件选择器 | 依次输入4个数字量通道 | 输出1个数字量。任一端口收到非空更新,就把该次值送到输出端;最后到达的更新生效。空值被忽略,没有选择控制端。 |
| 数据暂存器 | 依次输入模拟量X、数字量sw | 输出1个模拟量Y。X始终更新暂存值;sw为1时X的更新传到Y,sw变为1时也立即输出当前暂存值。sw为0或空时阻止输出,但不清除暂存值。 |
"多路数值选择器"和"多路事件选择器"实质是四路事件合并器,不会根据编号只选一路。如果多个上游可能同时更新,最终值由事件到达顺序决定;需要确定性通道选择时,应使用带sw端口的模拟通道开关或数字通道开关。
计数、累计和数值选择组件
| 组件 | 输入要求 | 输出规则 |
|---|---|---|
| 事件计数器 | 依次输入数字量X、数字量R | 输出1个模拟量Y。X每收到一次非空更新,Y加1,不区分X是0还是1;X为空时计数清零。R收到任何更新都会清零,也不判断R真假。 |
| 数据累加器 | 依次输入模拟量X、数字量R | 输出1个模拟量Y。X每收到一次非空更新,把该值加到累计值并输出;X为空时累计值清零。R收到任何更新都会清零。 |
| 高值选择器 | 依次输入3个模拟量X1、X2、X3,可部分为空 | 输出1个模拟量Y,为参与比较值中的最大值。只接一路可以工作;但当X1和X3有值而X2为空时,X3不会参与比较,因此应避免这种跨空端口组合。全部为空时不产生新的输出。相同文本值的重复更新不重新输出。 |
| 低值选择器 | 依次输入3个模拟量X1、X2、X3,可部分为空 | 输出1个模拟量Y,为参与比较值中的最小值。只接一路可以工作;但当X1和X3有值而X2为空时,X3不会参与比较,因此应避免这种跨空端口组合。全部为空时不产生新的输出。相同文本值的重复更新不重新输出。 |
| 中值选择器 | 依次输入3个模拟量X1、X2、X3,必须全部非空 | 输出1个模拟量Y。三个值齐备时输出排序后的中间值;缺少任一输入时不产生新的结果。相同文本值的重复更新不重新输出。 |
事件计数器统计的是"更新次数",不是上升沿次数。若需要每个上升沿只计一次,可先使用上升沿脉冲,再用状态判断把脉冲的真、假更新分流,仅将状态判断的T端连接到事件计数器X;如果把上升沿脉冲直接连到计数器,脉冲开始的1和结束的0都会被计数。
数据类型转换组件
| 组件 | 输入 | 输出 | 转换规则 |
|---|---|---|---|
| DAC | 1个数字量X | 1个模拟量Y | 将数字量的0或1作为模拟量数值传递;空值也会传为空。这里的DAC是逻辑数据类型转换,不是硬件数模转换器。 |
| ADC | 1个模拟量X | 1个数字量Y | 数值接近0时输出0,非零时输出1;空值或不能解释为数值的内容按0处理。这里的ADC是零/非零判断,不是硬件模数转换器,也没有可配置阈值。 |
定时数字量组件
下列组件都使用T和X两个输入:T为模拟量延时时间,单位毫秒,必须大于0;X为数字量状态;Y为数字量输出。每次X更新时,组件都会同时检查T和X;此时若T无效或X为空,计时和边沿状态会复位并输出0。单独改变T只更新参数,不会立即输出,也不会立即终止已经启动的本轮计时,新的有效性检查要等下一次X更新。组件第一次收到完整有效的X时先建立当前状态基线,不把该状态误判为刚发生的边沿。
| 组件 | 触发条件 | 输出过程 |
|---|---|---|
| 延时开启 | 依次输入模拟量T(毫秒且大于0)、数字量X;X从0变为1触发 | 输出1个数字量Y。上升沿开始计时;期间X回到0则取消并输出0,X保持到T后Y变为1。 |
| 延时关闭 | 依次输入模拟量T(毫秒且大于0)、数字量X;X从1变为0触发 | 输出1个数字量Y。X为1时Y保持1;下降沿后继续保持1,达到T后Y变为0。 |
| 延时清除 | 依次输入模拟量T(毫秒且大于0)、数字量X;X从0变为1触发 | 输出1个数字量Y。上升沿立即输出1并开始计时,达到T后输出0;若X提前变为0,则提前取消并输出0。 |
| 上升沿脉冲 | 依次输入模拟量T(毫秒且大于0)、数字量X;X从0变为1触发 | 输出1个数字量Y。上升沿立即输出1,保持T后输出0;期间X变为0不会取消本次脉冲。 |
| 下降沿脉冲 | 依次输入模拟量T(毫秒且大于0)、数字量X;X从1变为0触发 | 输出1个数字量Y。下降沿立即输出1,保持T后输出0;期间X变为1不会取消本次脉冲。 |
这些组件依赖边沿变化。长期保持1或0不会反复触发。流程刚加载时的第一个有效X用于初始化,因此如果必须在启动时立即执行,应另外设计明确的启动事件。
高低限、变化率与表决组件
| 组件 | 输入端口 | 输出规则 |
|---|---|---|
| 越限监控 | 依次输入模拟量H、L、DB、X | 输出1个数字量Y。X高于H时进入高限,低于H-绝对值DB时解除;X低于L时进入低限,高于L+绝对值DB时解除。H或L可不接,两者都为空时Y为0;X为空时复位并输出0。主要在状态变化时更新Y,单独修改H、L或DB要等下一次X更新。 |
| 变化率监控 | 依次输入模拟量R、X,R单位为输入值单位/秒 | 输出1个数字量Y。第一个X只建立基准;以后按相邻X的绝对差值除以实际间隔秒数计算,达到绝对值R时Y为1,否则为0。R或X为空时复位并输出0;单独修改非空R要等下一次X更新。 |
| 冗余控制 | 输入N个数字量,N可设为2~6;激活个数M可设为1~N-1 | 输出1个数字量Y。真值数量达到M时Y为1,否则为0;空输入按假处理。默认3路输入、2路激活,行为等同于M/N表决。 |
高低限监视建议满足H>L,并根据现场噪声选择合理DB,避免上下限状态重叠。变化率监视使用真实更新间隔,因此上游采样周期不稳定会直接影响结果;R的单位是"输入值单位/秒"。
限幅、变化率限制和折线函数
| 组件 | 输入端口 | 输出规则 |
|---|---|---|
| 限幅器 | 依次输入模拟量X、H、L | 输出1个模拟量Y。X高于H时输出H,低于L时输出L,否则输出X。H或L可为空,表示该方向不限制;X为空时Y为空。只改变H或L不会立即重算,需等待下一次X更新。 |
| 斜率控制器 | 依次输入模拟量X、RI、RD,RI和RD单位为数值单位/秒 | 输出1个模拟量Y。第一个X直接输出并建立基准;以后若变化速度超限,Y按"速率上限×实际间隔"从上次输出逐步变化。空的RI或RD表示该方向不限制;X为空会清除基准,但不产生新的有效数值输出。 |
| 多段线控制 | 1个模拟量X;配置若干互不重复的坐标点 | 1个模拟量Y。无坐标点时原值通过;只有1个点时,仅X精确等于该点横坐标才输出其纵坐标,其他X原值通过;2个及以上点时,区间内线性插值,区间外保持最左或最右端点的Y。X为空时Y为空。 |
限幅器应配置H≥L;上下限顺序错误时不能得到符合通常含义的限幅结果。斜率控制器的RI、RD单位是"数值单位/秒",应使用非负值。多段线控制的实际用途是分段线性映射,不是多项式系数运算。坐标点的X应唯一并按横坐标从小到大配置,避免顺序错误或重复横坐标造成不明确结果。
PID组件
位置式PID和增量式PID都有5个模拟量输入、1个模拟量输出:
| 端口 | 含义 | 要求 |
|---|---|---|
| SP | 模拟量输入,设定值 | 必须非空,为第1个输入。 |
| PV | 模拟量输入,过程测量值 | 必须非空,为第2个输入;只有PV收到更新时才执行一次PID计算。 |
| Kp | 模拟量输入,比例系数 | 必须非空,为第3个输入。 |
| Ki | 模拟量输入,积分系数 | 必须非空,为第4个输入。 |
| Kd | 模拟量输入,微分系数 | 必须非空,为第5个输入。 |
| Y | 模拟量输出,控制结果 | 唯一输出,由误差及三个系数计算得到。 |
位置式PID按"比例项+累计误差项+本次与上次误差差值项"输出。增量式PID在当前PV基础上叠加同样的校正量后输出。SP或系数发生变化时只更新内部输入,不会立即产生新Y,必须等待下一次PV更新。
PV收到更新时,如果任一必需输入缺失,本轮不输出,并重置累计误差和上次误差;单独清空SP或系数不会立即产生清空输出,要到下一次PV更新才执行这项检查。组件没有显式采样周期换算、输出上下限、积分抗饱和、独立复位输入或无扰切换机制。实际闭环使用时,应保持PV更新周期稳定,在下游增加限幅和必要的变化率限制,并先在非危险对象或仿真环境中整定。
lua脚本组件
lua脚本组件用于多输入、多输出的自定义模拟量计算。默认提供8个模拟量数据输入和8个模拟量输出,可分别配置为1~32个。除数据输入外,还有1个数字量触发端T,因此实际输入端口顺序为T、X1、X2......,输出端口为Y1、Y2......。
| 工作方式 | 输入要求 | 执行时机 |
|---|---|---|
| 自动执行 | T为空或未连接 | 任一模拟量输入发生更新时执行。只要至少一个模拟量输入非空即可运行,其他空输入按0参与。 |
| 触发执行 | T已有非空值 | 模拟量输入只更新当前参数;T每收到一次非空更新就执行,不区分T为0还是1。 |
脚本计算结果数量必须与配置的输出端口数量一致。脚本装载失败、执行失败或结果数量不匹配时,不会产生一组可信的新输出。修改输入或输出数量会改变端口结构,可能使原有连线失效,应重新检查所有端口映射。公开或共享逻辑配置前,还应审查脚本的输入范围、异常值处理和运行耗时。
基础数学运算组件
二元运算组件要求A、B均为非空模拟量,输出1个模拟量R;任一输入为空时输出为空。一元运算组件要求X为非空模拟量,输出1个模拟量Y;X为空时输出为空。数学组件收到与该端口当前内容完全相同的重复值时不会重新计算或重复输出。取整组件切换取整方式后,也应让X再发生一次实际变化,才能可靠获得按新方式计算的结果。
| 组件 | 输入要求 | 输出规则与边界条件 |
|---|---|---|
| 数字和 | 依次输入2个非空模拟量A、B | 输出1个模拟量R,R=A+B。 |
| 数字差 | 依次输入2个非空模拟量A、B | 输出1个模拟量R,R=A-B。 |
| 数字积 | 依次输入2个非空模拟量A、B | 输出1个模拟量R,R=A×B。 |
| 数字商 | 依次输入2个非空模拟量A、B | 输出1个模拟量R,R=A÷B;B接近0时R为空。 |
| 取模(整形) | 依次输入2个非空模拟量A、B | 输出1个模拟量R。先按整数解释A和B,再计算整数余数;B转换后为0时R为空,小数输入会丢失小数部分。 |
| 取模(浮点) | 依次输入2个非空模拟量A、B | 输出1个模拟量R,按浮点数计算余数;B接近0时R为空。 |
| 绝对值 | 输入1个非空模拟量X | 输出1个模拟量Y,为X的绝对值。 |
| 取反 | 输入1个非空模拟量X | 输出1个模拟量Y,Y=-X。 |
| 取整 | 输入1个非空模拟量X | 输出1个模拟量Y,可选择向零截断、四舍五入、向下取整或向上取整。 |
| 平方根 | 输入1个非空模拟量X | 输出1个模拟量Y,为X的平方根;X应不小于0,负值可能产生非有限结果。 |
| 指数函数 | 依次输入2个非空模拟量A、B | 输出1个模拟量R,为A的B次幂;负底数与非整数指数、极大数等组合可能产生非有限结果。 |
| 对数函数 | 依次输入2个非空模拟量A、B | 输出1个模拟量R,为以A为底、B的对数;应满足A>0、A≠1、B>0。 |
| 对数函数(log10) | 输入1个非空模拟量X | 输出1个模拟量Y;X>0时为以10为底的对数,X不大于0时Y为空。 |
| 对数函数(ln) | 输入1个非空模拟量X | 输出1个模拟量Y;X>0时为自然对数,X不大于0时Y为空。 |
三角函数与角度组件
| 组件 | 输入单位和范围 | 输出 |
|---|---|---|
| 正弦函数 | 1个模拟量X,单位为弧度 | 1个模拟量Y,输出sin(X)。 |
| 余弦函数 | 1个模拟量X,单位为弧度 | 1个模拟量Y,输出cos(X)。 |
| 正切函数 | 1个模拟量X,单位为弧度 | 1个模拟量Y,输出tan(X);接近π/2的奇数倍时可能出现极大值或非有限结果。 |
| 余切函数 | 1个模拟量X,单位为弧度 | 1个模拟量Y,按1/tan(X)计算;tan(X)接近0时产生非有限结果。 |
| 反正弦函数 | 1个模拟量X,应在-1~1 | 1个模拟量Y,输出asin(X),单位为弧度;超出定义域可能产生非有限结果。 |
| 反余弦函数 | 1个模拟量X,应在-1~1 | 1个模拟量Y,输出acos(X),单位为弧度;超出定义域可能产生非有限结果。 |
| 反正切函数 | 1个模拟量X,可为任意实数 | 1个模拟量Y,输出atan(X),单位为弧度。 |
| 弧度转角度 | 1个模拟量X,单位为弧度 | 1个模拟量Y,输出对应角度值。 |
| 角度转弧度 | 1个模拟量X,单位为角度 | 1个模拟量Y,输出对应弧度值。 |
数学组件不统一替用户限制所有数学定义域。计算结果将用于设备写入或闭环控制时,应在上游验证输入范围,并在下游使用限幅、比较或有效性监视避免异常数值继续传播。
推荐连接示例
| 目标 | 连接方式 | 关键说明 |
|---|---|---|
| 每秒读取并显示一个模拟量 | 固定数值设置1000 → 定时器周期T;开关 → 定时器使能;定时器Y → 模拟量输入触发;模拟量输入Y → 数据标签 | 定时器每周期提供一次真值更新,模拟量输入组件把更新当读取事件。 |
| 上升沿只计一次 | 固定数值提供脉宽 → 上升沿脉冲T;数字状态 → 上升沿脉冲X;脉冲Y → 状态判断X;状态判断T → 事件计数器X | 状态判断过滤脉冲结束时的0更新,避免一次脉冲被计成两次。 |
| 带回读确认的设备写入 | 计算结果 → 限幅器 → 模拟量输出;定时器 → 模拟量输入触发;设备回读与命令值 → 比较器(=) | 写入组件无反馈,必须由独立回读判断设备是否真正接受。 |
| 稳定后再处理 | 数据 → 等待A;固定数据 → 等待T;等待A → 后续运算 | 等待期内多次更新只在到期时输出最新值,适合合并抖动数据。 |
| 条件成立才触发支路 | A、B → 比较组件;比较T → 下游触发入口 | 只连接真分支可避免条件不成立时触发下游。若下游需要持续0/1状态,需要补充完整状态逻辑。 |
常见问题
为什么连线后没有输出?
先检查端口类型是否匹配、所有必需输入是否非空,以及真正负责计算的端口是否收到了更新。例如PID只在PV更新时计算,脉冲发生器必须先具备S、N、HT、LT,再由X=1启动;中值选择器要求3个输入全部有效。
为什么数字量输入为0时仍然触发了动作?
部分端口采用"收到更新即触发"语义,而不是"值为1才触发"。模拟量输入、数字量输入、固定数值触发、随机数、触发脉冲以及事件计数器都属于这种情况。多路输出控制的D和A也都会在收到非空更新时直接写入。
为什么事件计数比预期多?
事件计数器会统计X端口收到的每一次非空更新,包括0和1。一个脉冲通常包含开始的1和结束的0,直接连接可能计两次。需要先通过状态判断的T分支只保留真值事件。
数据选择器为什么不能固定选择某一路?
多路数值选择器和多路事件选择器是四路更新合并,最后到达的非空更新成为输出。要按控制信号选择X1或X2,应使用模拟通道开关或数字通道开关。
比较组件的F端为什么输出0而不是1?
F端代表"假分支发生",有效值就是0;T端代表"真分支发生",有效值是1。未命中的分支为空。使用时应把它们理解为两个互斥事件出口。
条件切换后,旧分支为什么没有收到清空更新?
比较器和状态判断只更新当前命中的分支,不会同时向另一分支发送清空事件。旧分支如果连接了具有保持状态的组件,应由流程显式设计复位路径,不能依赖分支切换自动清除。
设备命令执行后如何知道是否成功?
命令组件本身没有结果输出。应周期读取目标点位,把回读值与期望值比较,并设置超时、重试或告警策略。涉及安全设备时还应保留设备侧联锁。
为什么只修改PID参数没有立即看到新输出?
PID以PV更新作为计算事件。SP、Kp、Ki或Kd更新后,要等下一次PV更新才会输出新结果。
为什么延时和等待得到的结果不同?
延时偏向按顺序保留更新,激活后由后续更新推动队列输出;等待偏向在一段时间内合并更新,到期只输出最新值。选择前应明确需要"保留顺序"还是"只取最终状态"。
注意事项
-
先在离线、仿真或非关键设备上验证流程,再连接实际执行机构。逻辑控制不能替代急停、安全继电器、硬件限位和设备本体保护。
-
空值与数字量0含义不同。空值可能表示未连接、读取失败或上游清空;0是有效的假值,也可能是一条真实的停机命令。
-
明确"电平"和"事件"的区别。定时器持续发出真值事件,触发脉冲按事件翻转,事件计数统计更新次数;仅观察界面显示的0或1,无法判断下游会执行几次。
-
写入类组件没有成功反馈。对重要命令使用回读比较、超时告警和权限控制,并限制命令频率,防止循环连线造成连续写入。
-
多路指令控制在自动发送模式下,任一参数更新都可能发送整组当前值。需要整组参数准备完成后再发送时,使用sw触发模式,并保证所有参数已准备完成。
-
动态端口组件包括组合、lua脚本、多路指令控制和冗余控制。修改端口数量、顺序或对象选择后,必须逐条检查原有连线和端口含义。
-
延时器、事件计数器、数据累加器、设置/重置优先、PID和变化率类组件具有运行状态。流程重载、输入清空、参数无效或长时间无更新可能使状态复位,不应把内存状态当作永久记录。
-
时间组件的实际精度受系统调度、计算负载和上游更新周期影响。毫秒参数不代表硬实时保证;对确定性控制应使用专用控制器完成关键闭环。
-
对除法、对数、平方根、幂、三角函数和PID结果做好定义域、非有限值和异常范围防护。推荐在设备命令前加入比较、限幅和变化率限制。
-
多段线控制使用分段线性插值,坐标点横坐标应唯一;取模(整形)使用整数语义;ADC使用零/非零语义。这些名称不等同于硬件转换器或通用数学软件的全部能力。
-
警告标识只负责画面提示,不会自动保存告警历史、确认状态或通知记录。需要正式告警管理时,应使用摩尔信使MThings的告警功能进行配置。
-
发布或复制逻辑配置后,应执行端口检查、空值测试、上下限测试、断线测试、重启恢复测试和设备回读测试,并记录软件版本、设备配置版本和验证结果。