所属产品: Mingcedar Studio DESIGNER
Input:草稿、变量、模板参数与提交校验 | Mingcedar Studio
分六组练习配置输入模式、模板复用、动态目标和页面参数,最后校验范围并提交。
<div class="manual-doc-article manual-doc-article-section"><h2 id="recipe-page-parameter-input">操作教程: Input:草稿、变量、模板参数与提交校验</h2>
分六组练习配置输入模式、模板复用、动态目标和页面参数,最后校验范围并提交。
<div class="doc-card-list doc-tutorial">
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-1">准备与操作顺序</h3>
<p>本教程要求已安装并授权插件,且能够在 Mingcedar 中打开导出的画面。第 1–3 节在同一页逐步修改;第 4、5 节各新建一页;第 6 节复制第 5 节页面。第 1–2 节无需 PLC,第 3 节起需准备可读写的数值 Tag。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="准备与操作顺序" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">使用场景</th><th scope="col">对应步骤</th><th scope="col">数据位置</th></tr></thead><tbody>
<tr><th scope="row">先填内容,点击按钮再读取</th><td>1 · Plain Input</td><td>这个输入框的草稿</td></tr>
<tr><th scope="row">通过页面变量更新文本</th><td>2 · Runtime Variable</td><td>当前页变量</td></tr>
<tr><th scope="row">一个输入框固定操作一台泵</th><td>3 · PLC Tag</td><td>指定设备 Tag</td></tr>
<tr><th scope="row">同一个输入组件复用给两台泵</th><td>4 · <PLC> / <PUMP></td><td>各实例的模板参数</td></tr>
<tr><th scope="row">在当前页切换绑定设备</th><td>5 · =selectedSetpointTag</td><td>运行时选择的目标</td></tr>
<tr><th scope="row">从别页带入设备,校验后再写值</th><td>6 · 页面参数 + External</td><td>目标页草稿与提交按钮</td></tr>
</tbody></table></div>
<ol>
<li>每次修改模板或行为后点击窗口中的 Save,并保存 PPT。</li>
<li>完成每节配置后,通过 MX Design → Export → Export HTML 更新画面包,在 Mingcedar 中重新打开对应页面,再执行结果验证。第 6 节需同时导出入口页和目标页。</li>
</ol>
<ul class="doc-related-links">
<li><a href="/ppt/manual/windows-install/">安装与授权</a></li>
<li><a href="/ppt/manual/export-and-publish-screen-package/">导出并发布画面包</a></li>
</ul>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-2">1A · Plain Input:创建两个独立输入框</h3>
<p>在 PowerPoint 新建空白幻灯片,放置两个 Input、两个显示文本框和一个按钮。后续步骤沿用本节的插入、命名和 Edit Instance 操作。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="1A · Plain Input:创建两个独立输入框" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">操作位置</th><th scope="col">Speed A</th><th scope="col">Speed B</th></tr></thead><tbody>
<tr><th scope="row">Edit Instance → Input mode</th><td>Plain Input</td><td>Plain Input</td></tr>
<tr><th scope="row">目标字段</th><td>Plain Input 下不显示</td><td>Plain Input 下不显示</td></tr>
<tr><th scope="row">运行页输入内容</th><td>1200</td><td>900</td></tr>
</tbody></table></div>
<ol>
<li>打开 MX Design → Templates → Library,选择 Input 卡片并点击 Insert template;重复一次,得到两份 Input。</li>
<li>打开 MX Design → Behaviors → Browse。在 Behavior Browser 组件树中分别右键两个 Input 根节点,选择 Rename Component,命名为 Speed A、Speed B;不要命名内部子形状。</li>
<li>通过 PowerPoint“插入 → 文本框”创建两个文本框,各填一个短横线作为初始文字;用 Rename Component 分别命名 Preview A、Preview B。再通过“插入 → 形状”绘制矩形,输入“查看输入”。</li>
<li>选中整个 Speed A 实例,点击 MX Design → Templates → Edit Instance,按下表配置并点击 Save;对 Speed B 重复此操作。</li>
</ol>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>组件名称须与脚本中的名称一致且在当前页唯一。Speed A、Speed B 是实例名,不是设备 Tag。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-3">1B · 点击按钮显示输入内容</h3>
<p>在 Behavior Browser 将 Click Script 拖到“查看输入”组件,双击行为,用下方代码替换编辑区并 Save。后续按钮沿用此步骤。导出后分别输入 1200、900,点击“查看输入”。</p>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Click Script → “查看输入”按钮</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Click Script → “查看输入”按钮">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">hqVisuDesigner.</span><span style="color:#6F42C1">setComponentText</span><span style="color:#24292E">(</span><span style="color:#032F62">"Preview A"</span><span style="color:#24292E">, template.</span><span style="color:#6F42C1">getValue</span><span style="color:#24292E">(</span><span style="color:#032F62">"Speed A"</span><span style="color:#24292E">));</span></span>
<span class="line"><span style="color:#24292E">hqVisuDesigner.</span><span style="color:#6F42C1">setComponentText</span><span style="color:#24292E">(</span><span style="color:#032F62">"Preview B"</span><span style="color:#24292E">, template.</span><span style="color:#6F42C1">getValue</span><span style="color:#24292E">(</span><span style="color:#032F62">"Speed B"</span><span style="color:#24292E">));</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> Preview A 显示 1200,Preview B 显示 900。修改 Speed A 后再次点击,只有 Preview A 随之改变。</p>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>找不到输入框时,核对实例根节点名称。template.getValue 读取当前文本,不提交数据,也不跨页保存。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-4">2A · Runtime Variable:绑定页面变量</h3>
<p>继续使用 Speed A、Speed B。打开 MX Design → Scripts → Page Script,点击 New,在 Name 填 input-data,将下方代码粘贴到 Code;勾选 Enabled 并点击 Save。分别打开两个 Input 的 Edit Instance,按下表配置并保存。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="2A · Runtime Variable:绑定页面变量" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">字段</th><th scope="col">Speed A</th><th scope="col">Speed B</th></tr></thead><tbody>
<tr><th scope="row">Input mode</th><td>Runtime Variable</td><td>Runtime Variable</td></tr>
<tr><th scope="row">Variable</th><td>speedDraftA</td><td>speedDraftB</td></tr>
<tr><th scope="row">Write trigger</th><td>Immediate</td><td>Immediate</td></tr>
</tbody></table></div>
<ul>
<li>Variable 填变量名,不加引号。Input 自动识别提交类型:1200 是整数;输入包含双引号的 "1200" 则提交为字符串。</li>
</ul>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Page Script → input-data</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Page Script → input-data">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> speedDraftA </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">;</span></span>
<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> speedDraftB </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">;</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> 重新导出后,两份 Input 初始显示 0。输入 1200 或 900,再按 Enter 或离开输入框,值写入对应页面变量。</p>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-5">2B · 显示页面变量</h3>
<p>删除“查看输入”按钮。为 Preview A 绑定 Script Text,清空 Setup Script,Display Text 填下方表达式,Condition 填 true,保存。为 Preview B 重复操作,Display Text 改为 String(speedDraftB)。</p>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Script Text → Preview A → Display Text</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Script Text → Preview A → Display Text">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#6F42C1">String</span><span style="color:#24292E">(speedDraftA)</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> 重新导出后,提交 Speed A 会更新 Preview A;Speed B 对应 Preview B。重新打开页面时,Page Script 将变量恢复为初始值 0。</p>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>必须清空默认 Setup Script 中的示例 Tag 读取。Immediate 在内容改变后按 Enter 或离开输入框时提交,不逐字符提交。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-6">3 · PLC Tag:绑定固定设备</h3>
<p>删除两个 Preview 文本框。准备下表两个可读写、支持小数的 Tag,确认质量为 good,并使两点具有不同当前值。分别打开 Speed A、Speed B 的 Edit Instance,按下表配置并保存;第 2 节的 input-data 变量可保留,但本节不再使用。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="3 · PLC Tag:绑定固定设备" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">字段</th><th scope="col">Speed A</th><th scope="col">Speed B</th></tr></thead><tbody>
<tr><th scope="row">Input mode</th><td>PLC Tag</td><td>PLC Tag</td></tr>
<tr><th scope="row">PLC Tag</th><td>PLC_LINE01.PUMP01.SPEED_SETPOINT</td><td>PLC_LINE01.PUMP02.SPEED_SETPOINT</td></tr>
<tr><th scope="row">Write trigger</th><td>Immediate</td><td>Immediate</td></tr>
</tbody></table></div>
<p class="doc-step-result"><strong>完成标志</strong> 导出后,两份 Input 显示各自 Tag 当前值。只修改 Speed A 并按 Enter,在 Mingcedar 核对 PUMP01 的 Tag 读回值;PUMP02 应保持原值。</p>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>PLC Tag 填完整地址,不填 ReadTag 或 WriteTag 调用。输入框不可用时检查地址、质量和权限;业务范围校验见第 6 节。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-7">4 · 模板参数:复用 Input</h3>
<p>本节继续使用第 3 节的两个 Tag,在新建页面制作可复用模板。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="4 · 模板参数:复用 Input" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">Template variables</th><th scope="col">实例一</th><th scope="col">实例二</th></tr></thead><tbody>
<tr><th scope="row">PLC</th><td>PLC_LINE01</td><td>PLC_LINE01</td></tr>
<tr><th scope="row">PUMP</th><td>PUMP01</td><td>PUMP02</td></tr>
<tr><th scope="row">最终绑定目标</th><td>PLC_LINE01.PUMP01.SPEED_SETPOINT</td><td>PLC_LINE01.PUMP02.SPEED_SETPOINT</td></tr>
</tbody></table></div>
<ol>
<li>新建空白页,从 Templates → Library 插入一份 Input。打开 Edit Instance,将 Input mode 设为 PLC Tag,PLC Tag 填 <PLC>.<PUMP>.SPEED_SETPOINT,Write trigger 设为 Immediate,点击 Save。</li>
<li>选中整个 Input,打开 Templates → Library → Save selection。在 Template name 填 Pump setpoint input,Group 保持默认;确认 Captured variables 包含 PLC、PUMP,点击 Save。名称已存在时使用其他唯一名称。</li>
<li>关闭模板库,删除页面上仍带占位符的原始 Input。重新打开 Library,选择保存的模板,点击 Insert template 两次。</li>
<li>分别选中新实例根组,打开 Edit Instance,按下表填写模板参数,不加引号或尖括号,每份配置后点击 Save。保存 PPT 并重新导出。</li>
</ol>
<p class="doc-step-result"><strong>完成标志</strong> 两份实例显示两台泵各自的值。只改实例二的 PUMP 不会改变实例一。</p>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>PLC、PUMP 是实例配置,不创建同名页面变量。未捕获参数时,检查原始 Input 的 PLC Tag 字段是否包含 <PLC> 和 <PUMP>。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-8">5A · 运行时目标:配置地址变量</h3>
<p>新建页,按第 1A 节插入 Input,将根节点命名为 Speed input。在 Page Script 新建 input-data,粘贴下方代码,勾选 Enabled 并保存。按下表配置 Edit Instance。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="5A · 运行时目标:配置地址变量" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">Template Edit 字段</th><th scope="col">填写内容</th></tr></thead><tbody>
<tr><th scope="row">Input mode</th><td>PLC Tag</td></tr>
<tr><th scope="row">PLC Tag</th><td>=selectedSetpointTag</td></tr>
<tr><th scope="row">Write trigger</th><td>Immediate</td></tr>
</tbody></table></div>
<ul>
<li>HQVISU_DECLARE_TAGS 声明该动态目标可能读写的两个 Tag;实际读写仍受宿主权限控制。</li>
</ul>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Page Script → 第 5 节页面 → input-data</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Page Script → 第 5 节页面 → input-data">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> selectedSetpointTag </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "PLC_LINE01.PUMP01.SPEED_SETPOINT"</span><span style="color:#24292E">;</span></span>
<span class="line"><span style="color:#6F42C1">HQVISU_DECLARE_TAGS</span><span style="color:#24292E">({</span></span>
<span class="line"><span style="color:#24292E"> expression: </span><span style="color:#032F62">"selectedSetpointTag"</span><span style="color:#24292E">,</span></span>
<span class="line"><span style="color:#24292E"> read: [</span><span style="color:#032F62">"PLC_LINE01.PUMP01.SPEED_SETPOINT"</span><span style="color:#24292E">, </span><span style="color:#032F62">"PLC_LINE01.PUMP02.SPEED_SETPOINT"</span><span style="color:#24292E">],</span></span>
<span class="line"><span style="color:#24292E"> write: [</span><span style="color:#032F62">"PLC_LINE01.PUMP01.SPEED_SETPOINT"</span><span style="color:#24292E">, </span><span style="color:#032F62">"PLC_LINE01.PUMP02.SPEED_SETPOINT"</span><span style="color:#24292E">]</span></span>
<span class="line"><span style="color:#24292E">});</span></span></code></pre></div>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>PLC Tag 中保留前缀 =,用于读取 selectedSetpointTag 变量中的地址。Page Script 中的变量声明不带该前缀。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-9">5B · 按钮切换目标设备</h3>
<p>为“选择泵 2”按钮添加下方 Click Script 并保存。复制为“选择泵 1”按钮,将副本脚本中的 PUMP02 改为 PUMP01。</p>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Click Script → “选择泵 2”按钮</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Click Script → “选择泵 2”按钮">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">hqVisuDesigner.</span><span style="color:#6F42C1">writeVariable</span><span style="color:#24292E">(</span><span style="color:#032F62">"selectedSetpointTag"</span><span style="color:#24292E">, </span><span style="color:#032F62">"PLC_LINE01.PUMP02.SPEED_SETPOINT"</span><span style="color:#24292E">);</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> 重新导出后,点击“选择泵 2”显示 PUMP02 当前值,点击“选择泵 1”显示 PUMP01 当前值。选择按钮本身不写入设备。</p>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>切换目标会清除未提交草稿,应先选择设备再输入。已发出的写入请求不受切换影响。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-10">6A · 页面参数:创建设备入口</h3>
<p>复制第 5 节页面。打开 MX Design → Page → Nav Path,将副本 Page Code 改为 pump_setpoint 并保存;保留 Speed input 和 input-data,删除两个选择按钮。另建入口页,绘制“打开 PUMP02”按钮,按第 1B 节添加下方 Click Script。复制为“打开 PUMP01”按钮,并将副本代码中的 PUMP02 改为 PUMP01。</p>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Click Script → 入口页 PUMP02 按钮</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Click Script → 入口页 PUMP02 按钮">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">return</span><span style="color:#24292E"> hqVisuDesigner.</span><span style="color:#6F42C1">openPage</span><span style="color:#24292E">(</span><span style="color:#032F62">"pump_setpoint"</span><span style="color:#24292E">, {</span></span>
<span class="line"><span style="color:#24292E"> parameters: [{ key: </span><span style="color:#032F62">"pump"</span><span style="color:#24292E">, value: </span><span style="color:#032F62">"PUMP02"</span><span style="color:#24292E"> }]</span></span>
<span class="line"><span style="color:#24292E">});</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> 两个入口按钮指向同一目标页,并分别传入 pump 参数。完成第 6B–6D 节后,再导出包含入口页和目标页的完整画面包。</p>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-11">6B · 校验页面参数</h3>
<p>在 pump_setpoint 的 Page Script 中,用下方代码完整替换 input-data 并保存;不要另建重复变量。GetPageParameter 返回文本,缺失或未知值会停止本段初始化。</p>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Page Script → pump_setpoint → input-data</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Page Script → pump_setpoint → input-data">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> pumpCode </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> GetPageParameter</span><span style="color:#24292E">(</span><span style="color:#032F62">"pump"</span><span style="color:#24292E">, </span><span style="color:#032F62">""</span><span style="color:#24292E">);</span></span>
<span class="line"><span style="color:#D73A49">if</span><span style="color:#24292E"> (pumpCode </span><span style="color:#D73A49">!==</span><span style="color:#032F62"> "PUMP01"</span><span style="color:#D73A49"> &&</span><span style="color:#24292E"> pumpCode </span><span style="color:#D73A49">!==</span><span style="color:#032F62"> "PUMP02"</span><span style="color:#24292E">) {</span></span>
<span class="line"><span style="color:#D73A49"> throw</span><span style="color:#D73A49"> new</span><span style="color:#6F42C1"> Error</span><span style="color:#24292E">(</span><span style="color:#032F62">"请从设备入口打开,pump 只支持 PUMP01 或 PUMP02"</span><span style="color:#24292E">);</span></span>
<span class="line"><span style="color:#24292E">}</span></span>
<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> selectedSetpointTag </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "PLC_LINE01."</span><span style="color:#D73A49"> +</span><span style="color:#24292E"> pumpCode </span><span style="color:#D73A49">+</span><span style="color:#032F62"> ".SPEED_SETPOINT"</span><span style="color:#24292E">;</span></span>
<span class="line"><span style="color:#6F42C1">HQVISU_DECLARE_TAGS</span><span style="color:#24292E">({</span></span>
<span class="line"><span style="color:#24292E"> expression: </span><span style="color:#032F62">"selectedSetpointTag"</span><span style="color:#24292E">,</span></span>
<span class="line"><span style="color:#24292E"> read: [</span><span style="color:#032F62">"PLC_LINE01.PUMP01.SPEED_SETPOINT"</span><span style="color:#24292E">, </span><span style="color:#032F62">"PLC_LINE01.PUMP02.SPEED_SETPOINT"</span><span style="color:#24292E">],</span></span>
<span class="line"><span style="color:#24292E"> write: [</span><span style="color:#032F62">"PLC_LINE01.PUMP01.SPEED_SETPOINT"</span><span style="color:#24292E">, </span><span style="color:#032F62">"PLC_LINE01.PUMP02.SPEED_SETPOINT"</span><span style="color:#24292E">]</span></span>
<span class="line"><span style="color:#24292E">});</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> 从 PUMP01、PUMP02 入口分别打开时,selectedSetpointTag 对应各自设备;传 PUMP99 或不传 pump 时不建立有效目标。</p>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-12">6C · External:关闭输入框自动提交</h3>
<p>在 pump_setpoint 选中 Speed input,打开 Edit Instance,将 Write trigger 改为 External;Input mode 保持 PLC Tag,PLC Tag 保持 =selectedSetpointTag,点击 Save。添加“提交”矩形按钮;再添加显示“等待输入”的文本框,通过 Rename Component 将其命名为 Input message。</p>
<p class="doc-table-hint">左右滑动查看完整表格</p>
<div class="doc-table-scroll" role="region" aria-label="6C · External:关闭输入框自动提交" tabindex="0"><table class="doc-reference-table">
<thead><tr><th scope="col">对象/字段</th><th scope="col">本课配置</th></tr></thead><tbody>
<tr><th scope="row">Input 实例名</th><td>Speed input</td></tr>
<tr><th scope="row">Input mode / PLC Tag</th><td>PLC Tag / =selectedSetpointTag</td></tr>
<tr><th scope="row">Write trigger</th><td>External</td></tr>
<tr><th scope="row">反馈文本框名</th><td>Input message</td></tr>
</tbody></table></div>
<p class="doc-step-result"><strong>完成标志</strong> 完成本节后,输入框显示设备当前值。编辑内容再按 Enter 或离开输入框时,不自动写入;提交由下一节按钮执行。</p>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-13">6D · 校验数值并提交</h3>
<p>给“提交”按钮配置下方 Click Script 并保存。示例允许 0–3000 的十进制数,项目须改为设备允许范围。用 Export HTML 整包导出,在 Mingcedar 从入口页选择设备。</p>
<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Click Script → “提交”按钮</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Click Script → “提交”按钮">复制代码</button><span class="manual-code-status" role="status"></span></span></div><pre tabindex="0" class="docs-code-block shiki github-light" style="background-color:#fff;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> raw </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> String</span><span style="color:#24292E">(template.</span><span style="color:#6F42C1">getValue</span><span style="color:#24292E">(</span><span style="color:#032F62">"Speed input"</span><span style="color:#24292E">)).</span><span style="color:#6F42C1">trim</span><span style="color:#24292E">();</span></span>
<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> value </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> Number</span><span style="color:#24292E">(raw);</span></span>
<span class="line"><span style="color:#D73A49">if</span><span style="color:#24292E"> (</span><span style="color:#D73A49">!</span><span style="color:#032F62">/</span><span style="color:#D73A49">^</span><span style="color:#005CC5">[+-]</span><span style="color:#D73A49">?</span><span style="color:#032F62">(?:</span><span style="color:#005CC5">\d</span><span style="color:#D73A49">+</span><span style="color:#032F62">(?:</span><span style="color:#22863A;font-weight:bold">\.</span><span style="color:#005CC5">\d</span><span style="color:#D73A49">*</span><span style="color:#032F62">)</span><span style="color:#D73A49">?|</span><span style="color:#22863A;font-weight:bold">\.</span><span style="color:#005CC5">\d</span><span style="color:#D73A49">+</span><span style="color:#032F62">)</span><span style="color:#D73A49">$</span><span style="color:#032F62">/</span><span style="color:#24292E">.</span><span style="color:#6F42C1">test</span><span style="color:#24292E">(raw) </span><span style="color:#D73A49">||</span></span>
<span class="line"><span style="color:#D73A49"> !</span><span style="color:#24292E">Number.</span><span style="color:#6F42C1">isFinite</span><span style="color:#24292E">(value) </span><span style="color:#D73A49">||</span><span style="color:#24292E"> value </span><span style="color:#D73A49"><</span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> ||</span><span style="color:#24292E"> value </span><span style="color:#D73A49">></span><span style="color:#005CC5"> 3000</span><span style="color:#24292E">) {</span></span>
<span class="line"><span style="color:#24292E"> hqVisuDesigner.</span><span style="color:#6F42C1">setComponentText</span><span style="color:#24292E">(</span><span style="color:#032F62">"Input message"</span><span style="color:#24292E">, </span><span style="color:#032F62">"请输入 0–3000 的有效数字"</span><span style="color:#24292E">);</span></span>
<span class="line"><span style="color:#D73A49"> return</span><span style="color:#005CC5"> false</span><span style="color:#24292E">;</span></span>
<span class="line"><span style="color:#24292E">}</span></span>
<span class="line"><span style="color:#24292E">hqVisuDesigner.</span><span style="color:#6F42C1">setComponentText</span><span style="color:#24292E">(</span><span style="color:#032F62">"Input message"</span><span style="color:#24292E">, </span><span style="color:#032F62">"校验通过,请核对设备写入结果"</span><span style="color:#24292E">);</span></span>
<span class="line"><span style="color:#D73A49">return</span><span style="color:#6F42C1"> WriteTagDouble</span><span style="color:#24292E">(selectedSetpointTag, value);</span></span></code></pre></div>
<p class="doc-step-result"><strong>完成标志</strong> 输入 1200.5 后点击“提交”,会向选定设备发起一次写入。空白、字母、-1、3001 仅显示提示,不写入;实际生效值以 Tag 读回为准。</p>
<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>
<li>template.getValue 返回文本;Number("") 等于 0,因此代码同时检查文本格式和数值范围。</li>
<li>范围校验由本按钮执行。Input 编辑器没有独立上下限设置;即使选择 External,Keypad 的 OK 仍会直接提交且不调用此脚本。本例不要为 Speed input 连接 Keypad。</li>
</ul></div>
</article>
<article class="doc-card">
<h3 id="recipe-page-parameter-input-item-14">结果验证</h3>
<p>可按 Esc 放弃尚未提交的输入。界面提示“校验通过”仅表示数值符合脚本规则,写入结果仍需核对。</p>
<ol>
<li>分别从 PUMP01、PUMP02 入口打开,核对 Input 显示值及提交后的 Tag 读回目标。</li>
<li>输入 1200.5,离开输入框后确认设备值未变;点击“提交”,再确认设备读回值。</li>
<li>依次输入空白、abc、-1、3001 并提交,确认显示提示且无写入;将入口参数临时改为 PUMP99,确认目标页不建立有效绑定,验证后恢复。</li>
<li>关闭并重新打开目标页,确认输入框再次显示设备当前值。</li>
</ol>
</article>
</div>
</div>