Mingcedar

所属产品: Mingcedar Studio DESIGNER

画面复用与参数配置 | Mingcedar Studio

按目标在制作时确定还是运行时变化,选择 Tag、模板参数、页面变量或页面参数。

首次发布 最近更新

<div class="manual-doc-article manual-doc-article-section"><h2 id="design-reuse-guide">画面设计: 画面复用与参数配置</h2>

按目标在制作时确定还是运行时变化,选择 Tag、模板参数、页面变量或页面参数。

<div class="doc-card-list doc-tutorial">

<article class="doc-card">

<h3 id="design-reuse-guide-item-1">1. 选择复用方式</h3>

<p>模板的每次插入称为实例。模板参数在制作时填写,页面变量保存当前页状态,页面参数在打开另一页时传递。</p>

<p class="doc-table-hint">左右滑动查看完整表格</p>

<div class="doc-table-scroll" role="region" aria-label="1. 选择复用方式" 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">同一页并排放 PUMP01、PUMP02 的操作区</th><td>&lt;PLC&gt; / &lt;PUMP&gt; 模板参数</td><td>制作时给每个实例填值,再导出</td></tr>

<tr><th scope="row">一个输入框在两台设备间切换</th><td>保存 Tag 名称的页面变量</td><td>运行时点击按钮修改变量,页面保持打开</td></tr>

<tr><th scope="row">从不同水泵打开同一张详情页</th><td>页面参数 + GetPageParameter</td><td>打开详情页时传入设备编码</td></tr>

<tr><th scope="row">按钮切换表格的 A 区 / B 区</th><td>页面变量 + 返回行数组的函数</td><td>按钮改变量,函数返回对应的行</td></tr>

<tr><th scope="row">转速持续更新,而非只在打开页时读一次</th><td>在反复求值的函数内调用 ReadTagDouble</td><td>显示重新求值时再次读数据</td></tr>

</tbody></table></div>

<ul class="doc-related-links">

<li><a href="/ppt/manual/first-screen/">首次使用:制作与发布第一个画面</a></li>

<li><a href="/ppt/manual/recipe-page-parameter-input/">输入框:从本地草稿到设备传参</a></li>

<li><a href="/ppt/manual/recipe-parameterized-table/">表格:从固定数组到实时筛选</a></li>

<li><a href="/ppt/manual/recipe-template-bit-write/">位写入:从单按钮到设备复用</a></li>

</ul>

</article>

<article class="doc-card">

<h3 id="design-reuse-guide-item-2">2. 区分 Tag 名称与数值</h3>

<p>Tag 是 Mingcedar 数据点;speedTag 保存名称,ReadTagDouble 读取数值。将 PLC_LINE01.PUMP01.SPEED 替换为项目中可读取的数值 Tag。</p>

<p class="doc-table-hint">左右滑动查看完整表格</p>

<div class="doc-table-scroll" role="region" aria-label="2. 区分 Tag 名称与数值" tabindex="0"><table class="doc-reference-table">

<thead><tr><th scope="col">写法</th><th scope="col">含义</th></tr></thead><tbody>

<tr><th scope="row">&quot;PLC_LINE01.PUMP01.SPEED&quot;</th><td>完整 Tag 名称,是一个字符串</td></tr>

<tr><th scope="row">speedTag</th><td>JavaScript 变量,里面保存上述字符串</td></tr>

<tr><th scope="row">&lt;PUMP&gt;</th><td>模板占位符,每个实例在制作时分别填值</td></tr>

<tr><th scope="row">GetPageParameter(&quot;pump&quot;, &quot;PUMP01&quot;)</th><td>读取打开本页时带来的字符串;没传时使用 PUMP01</td></tr>

<tr><th scope="row">ReadTagDouble(speedTag, 0)</th><td>读取当前数值;0 是回退值,不代表设备已确认停机</td></tr>

</tbody></table></div>

<ol>

<li>新建一页,打开 MX Design → Scripts → Page Script,填写下方代码。</li>

<li>插入文本框,打开 MX Design → Behaviors → Browse,将 Text → Script Text 拖到该文本框的组件节点。双击新增行为,清空默认 Setup Script,Condition 填 true,Display Text 填 speedTag + &quot; = &quot; + String(speedNow),然后保存。</li>

<li>保存 PPT,通过 MX Design → Export → Export HTML 导出,在 Mingcedar 打开该页,核对显示的名称和数值。</li>

</ol>

<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Page Script:比较 Tag 名称与读取值</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Page Script:比较 Tag 名称与读取值">复制代码</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"> speedTag </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "PLC_LINE01.PUMP01.SPEED"</span><span style="color:#24292E">;</span></span>

<span class="line"><span style="color:#D73A49">var</span><span style="color:#24292E"> speedNow </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> ReadTagDouble</span><span style="color:#24292E">(speedTag, </span><span style="color:#005CC5">0</span><span style="color:#24292E">);</span></span></code></pre></div>

<p class="doc-step-result"><strong>完成标志</strong> 上面的 speedNow 只在这两行执行时采样一次。需要实时显示时,把读取放进每次会求值的行为表达式或表格函数;动态 Tag 的候选范围按后续教程声明。</p>

</article>

<article class="doc-card">

<h3 id="design-reuse-guide-item-3">3. 各字段的变量写法</h3>

<p>下表为独立示例。selectedTag 在 Page Script 中保存对应类型的完整 Tag 名;buildRows 是表格教程的行数组函数。各字段的表达式格式不同。</p>

<p class="doc-table-hint">左右滑动查看完整表格</p>

<div class="doc-table-scroll" role="region" aria-label="3. 各字段的变量写法" 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">Input → PLC Tag</th><td>&lt;PLC&gt;.&lt;PUMP&gt;.SPEED_SETPOINT</td><td>=selectedTag</td></tr>

<tr><th scope="row">Write Tag / Write Tag Bit → Target Tag</th><td>&lt;PLC&gt;.&lt;PUMP&gt;.CTRL_WORD</td><td>=selectedTag</td></tr>

<tr><th scope="row">Table → Rows</th><td>[[&quot;PUMP01&quot;, &quot;1200 rpm&quot;]]</td><td>=buildRows()</td></tr>

<tr><th scope="row">Click Script</th><td>WriteTagDouble(&quot;&lt;PLC&gt;.&lt;PUMP&gt;.SPEED_SETPOINT&quot;, 1200)</td><td>WriteTagDouble(selectedTag, 1200)</td></tr>

<tr><th scope="row">State Color → Condition</th><td>ReadTagBoolean(&quot;&lt;PLC&gt;.&lt;PUMP&gt;.RUN&quot;, false)</td><td>ReadTagBoolean(selectedTag, false)</td></tr>

<tr><th scope="row">Write Tag Bit → Bit Index</th><td>3</td><td>此字段只填固定整数;动态位号使用 Click Script 中的 WriteTagBit</td></tr>

</tbody></table></div>

<p class="doc-step-result"><strong>完成标志</strong> Input 的目标变量前写 =;函数参数中直接使用变量;JavaScript 里的模板占位符放在引号内。不是所有字段都能填模板变量或脚本。</p>

</article>

<article class="doc-card">

<h3 id="design-reuse-guide-item-4">4. 转换数字与布尔模板参数</h3>

<p>本例新建一页,不需要 PLC 数据。LIMIT 表示非负数值,ENABLED 表示 true 或 false。模板参数按文字替换,需要转换类型后使用。</p>

<p class="doc-table-hint">左右滑动查看完整表格</p>

<div class="doc-table-scroll" role="region" aria-label="4. 转换数字与布尔模板参数" tabindex="0"><table class="doc-reference-table">

<thead><tr><th scope="col">实例</th><th scope="col">LIMIT</th><th scope="col">ENABLED</th><th scope="col">转换结果</th></tr></thead><tbody>

<tr><th scope="row">A</th><td>1500</td><td>true</td><td>1500 / true</td></tr>

<tr><th scope="row">B</th><td>2200</td><td>false</td><td>2200 / false</td></tr>

</tbody></table></div>

<ol>

<li>插入文本框并添加 Text → Script Text。用下方完整代码替换默认 Setup Script,Condition 填 true,Display Text 填 String(limit) + &quot; / &quot; + String(enabled),然后保存。</li>

<li>选中文本框,打开 MX Design → Templates → Library,点击 Save selection。Template name 填 Parameter display,确认 Captured variables 包含 LIMIT、ENABLED,再点击 Save。</li>

<li>确认保存成功后,从当前页删除仍带占位符的原始文本框。Save selection 只保存到模板库,不会移除原稿;仅隐藏或移到同一 PPT 的其他页不能将其排除在整包导出之外。</li>

<li>双击 Parameter display 卡片两次。分别选中整个实例组合,点击 MX Design → Templates → Edit Instance,在 Template variables 中填写下表的 A、B 两组值并保存。导出后打开该页,A 应显示 1500 / true,B 应显示 2200 / false。</li>

</ol>

<div class="manual-code" data-code-language="javascript"><div class="manual-code-toolbar"><span>Script Text → Setup Script</span><span class="manual-code-tools"><small>JavaScript</small><button type="button" data-copy-code data-copied="已复制" data-failed="请选中代码后复制" aria-label="复制代码: Script Text → Setup 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"> limitText </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "&#x3C;LIMIT>"</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"> limit </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> Number</span><span style="color:#24292E">(limitText);</span></span>

<span class="line"><span style="color:#D73A49">if</span><span style="color:#24292E"> (</span><span style="color:#D73A49">!</span><span style="color:#24292E">limitText </span><span style="color:#D73A49">||</span><span style="color:#D73A49"> !</span><span style="color:#24292E">Number.</span><span style="color:#6F42C1">isFinite</span><span style="color:#24292E">(limit) </span><span style="color:#D73A49">||</span><span style="color:#24292E"> limit </span><span style="color:#D73A49">&#x3C;</span><span style="color:#005CC5"> 0</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">"LIMIT must be a non-negative number"</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"> enabledText </span><span style="color:#D73A49">=</span><span style="color:#032F62"> "&#x3C;ENABLED>"</span><span style="color:#24292E">.</span><span style="color:#6F42C1">trim</span><span style="color:#24292E">().</span><span style="color:#6F42C1">toLowerCase</span><span style="color:#24292E">();</span></span>

<span class="line"><span style="color:#D73A49">if</span><span style="color:#24292E"> (enabledText </span><span style="color:#D73A49">!==</span><span style="color:#032F62"> "true"</span><span style="color:#D73A49"> &#x26;&#x26;</span><span style="color:#24292E"> enabledText </span><span style="color:#D73A49">!==</span><span style="color:#032F62"> "false"</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">"ENABLED must be true or false"</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"> enabled </span><span style="color:#D73A49">=</span><span style="color:#24292E"> enabledText </span><span style="color:#D73A49">===</span><span style="color:#032F62"> "true"</span><span style="color:#24292E">;</span></span></code></pre></div>

<div class="doc-step-troubleshooting"><p><strong>如果结果不一致</strong></p><ul>

<li>Number(&quot;&lt;LIMIT&gt;&quot;) 的引号必须保留;直接写 var limit = &lt;LIMIT&gt; 不是可用的 JavaScript。</li>

<li>Boolean(&quot;false&quot;) 的结果是 true;本例用字符串比较得到正确布尔值。</li>

<li>只保存了组件模板时,当前页 Page Script 不会跟着复制到另一页。</li>

</ul></div>

</article>

<article class="doc-card">

<h3 id="design-reuse-guide-item-5">5. 排查数据显示问题</h3>

<ol>

<li>先用常量确认控件:Table 的 Rows 写 [[&quot;PUMP01&quot;, &quot;1200 rpm&quot;]];Input 先选 Plain Input;状态灯 Condition 先写 true / false。确认控件本身可见、可操作。</li>

<li>检查目标计算:新增 Script Text 时清空默认 Setup Script,Condition 填 true;Display Text 临时填 selectedTag 或 GetPageParameter(&quot;pump&quot;, &quot;未传&quot;)。显示 &lt;PUMP&gt; 原文说明模板值未替换;显示另一设备名则检查选择或传参。</li>

<li>连接真实 Tag 后,检查名称、类型、通信质量、用户权限及运行平台连接状态。写入后对照设备回读值确认结果。</li>

</ol>

<p class="doc-step-result"><strong>完成标志</strong> 依次定位控件配置、参数/变量计算和数据连接问题。</p>

</article>

</div>

</div>