<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://www.rwr.ink/</id>
  <title type="text">温暖小屋</title>
  <subtitle type="text">技术笔记</subtitle>
  <updated>2026-05-26T00:00:00.000Z</updated>
  <author><name>JMFANS</name></author>
  <link rel="alternate" href="https://www.rwr.ink/"/>
  <link rel="self" href="https://www.rwr.ink/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://www.rwr.ink/posts/2026/05/26/brooks-magnatran-leap-%E7%BC%96%E7%A8%8B%E6%89%8B%E5%86%8C/</id>
      <title type="text">Brooks MAGNATRAN® LEAP™ 编程手册</title>
      <published>2026-05-26T00:00:00.000Z</published>
      <updated>2026-05-26T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2026/05/26/brooks-magnatran-leap-%E7%BC%96%E7%A8%8B%E6%89%8B%E5%86%8C/"/>
      <summary type="text">Brooks MAGNATRAN® LEAP™ 编程手册 基于官方文档编写 《238485 Leap Manual REV G》— 硬件与用户手册（263页） 《278805 MAGNATRAN® LEAP™ Software Manual REV E》— 软件编程手册（278页） 文档版本 : 综合整理版 v1.0 | 适用固件 : V8.2.x 系列 |</summary>
      <content type="html"><![CDATA[<h1>Brooks MAGNATRAN® LEAP™ 编程手册</h1>
<blockquote>
<p><strong>基于官方文档编写</strong></p>
<ul>
<li>《238485 Leap Manual REV G》— 硬件与用户手册（263页）</li>
<li>《278805 MAGNATRAN® LEAP™ Software Manual REV E》— 软件编程手册（278页）</li>
</ul>
<p><strong>文档版本</strong>: 综合整理版 v1.0 | <strong>适用固件</strong>: V8.2.x 系列 | <strong>版权</strong>: Brooks Automation, Inc.</p>
</blockquote>
<hr />
<h2>目录</h2>
<ul>
<li><a href="#第一章-系统概述">第一章 系统概述</a>
<ul>
<li><a href="#11-产品简介">1.1 产品简介</a></li>
<li><a href="#12-机械臂类型">1.2 机械臂类型</a></li>
<li><a href="#13-坐标系统">1.3 坐标系统</a></li>
<li><a href="#14-控制器与软件架构">1.4 控制器与软件架构</a></li>
</ul></li>
<li><a href="#第二章-安全规范">第二章 安全规范</a>
<ul>
<li><a href="#21-安全警告等级">2.1 安全警告等级</a></li>
<li><a href="#22-通用安全注意事项">2.2 通用安全注意事项</a></li>
<li><a href="#23-安全联锁系统">2.3 安全联锁系统</a></li>
</ul></li>
<li><a href="#第三章-通信与连接">第三章 通信与连接</a>
<ul>
<li><a href="#31-rs-232-串口通信">3.1 RS-232 串口通信</a></li>
<li><a href="#32-以太网通信">3.2 以太网通信</a></li>
<li><a href="#33-通信模式配置">3.3 通信模式配置</a></li>
<li><a href="#34-数据存储命令">3.4 数据存储命令</a></li>
</ul></li>
<li><a href="#第四章-命令语法规范">第四章 命令语法规范</a>
<ul>
<li><a href="#41-命令格式约定">4.1 命令格式约定</a></li>
<li><a href="#42-命令响应格式">4.2 命令响应格式</a></li>
<li><a href="#43-兼容性模式">4.3 兼容性模式</a></li>
</ul></li>
<li><a href="#第五章-系统命令">第五章 系统命令</a>
<ul>
<li><a href="#51-系统查询命令">5.1 系统查询命令</a></li>
<li><a href="#52-配置命令">5.2 配置命令</a></li>
<li><a href="#53-系统复位">5.3 系统复位</a></li>
</ul></li>
<li><a href="#第六章-io-系统">第六章 I/O 系统</a>
<ul>
<li><a href="#61-标准-io-模式">6.1 标准 I/O 模式</a></li>
<li><a href="#62-扩展-io-模式">6.2 扩展 I/O 模式</a></li>
<li><a href="#63-dio-模式">6.3 DIO 模式</a></li>
<li><a href="#64-io-映射命令">6.4 I/O 映射命令</a></li>
<li><a href="#65-io-状态命令">6.5 I/O 状态命令</a></li>
<li><a href="#66-io-事件系统">6.6 I/O 事件系统</a></li>
</ul></li>
<li><a href="#第七章-归零与基本运动">第七章 归零与基本运动</a>
<ul>
<li><a href="#71-坐标系定义">7.1 坐标系定义</a></li>
<li><a href="#72-参考点建立-reference">7.2 参考点建立 (Reference)</a></li>
<li><a href="#73-伺服控制">7.3 伺服控制</a></li>
<li><a href="#74-归零命令-home">7.4 归零命令 (HOME)</a></li>
<li><a href="#75-释放与停止命令">7.5 释放与停止命令</a></li>
<li><a href="#76-位置查询">7.6 位置查询</a></li>
<li><a href="#77-载荷模式">7.7 载荷模式</a></li>
<li><a href="#78-运动命令-move">7.8 运动命令 (MOVE)</a></li>
<li><a href="#79-速度设置">7.9 速度设置</a></li>
<li><a href="#710-联锁设置">7.10 联锁设置</a></li>
<li><a href="#711-安装命令-mount">7.11 安装命令 (MOUNT)</a></li>
</ul></li>
<li><a href="#第八章-工位设置-station-setup">第八章 工位设置 (Station Setup)</a>
<ul>
<li><a href="#81-工位概述">8.1 工位概述</a></li>
<li><a href="#82-工位坐标设置">8.2 工位坐标设置</a></li>
<li><a href="#83-工位选项--曲线运动-curve-move">8.3 工位选项 — 曲线运动 (Curve Move)</a></li>
<li><a href="#84-工位选项--via-路径点">8.4 工位选项 — VIA 路径点</a></li>
<li><a href="#85-工位选项--z-轴">8.5 工位选项 — Z 轴</a></li>
<li><a href="#86-工位选项--io">8.6 工位选项 — I/O</a></li>
<li><a href="#87-工位面-facet-设置">8.7 工位面 (Facet) 设置</a></li>
<li><a href="#88-工位复制">8.8 工位复制</a></li>
</ul></li>
<li><a href="#第九章-goto-与晶圆传送命令">第九章 GOTO 与晶圆传送命令</a>
<ul>
<li><a href="#91-goto-命令">9.1 GOTO 命令</a></li>
<li><a href="#92-goto-偏移量">9.2 GOTO 偏移量</a></li>
<li><a href="#93-pick-取片命令">9.3 PICK 取片命令</a></li>
<li><a href="#94-place-放片命令">9.4 PLACE 放片命令</a></li>
<li><a href="#95-xfer-传送命令">9.5 XFER 传送命令</a></li>
</ul></li>
<li><a href="#第十章-active-wafer-centering-awc-主动晶圆对中">第十章 Active Wafer Centering (AWC) 主动晶圆对中</a>
<ul>
<li><a href="#101-awc-概述">10.1 AWC 概述</a></li>
<li><a href="#102-全局设置">10.2 全局设置</a></li>
<li><a href="#103-工位传感器设置">10.3 工位传感器设置</a></li>
<li><a href="#104-awc-工位参数">10.4 AWC 工位参数</a></li>
<li><a href="#105-awc-传感器校准">10.5 AWC 传感器校准</a></li>
<li><a href="#106-awc-操作与数据查询">10.6 AWC 操作与数据查询</a></li>
</ul></li>
<li><a href="#第十一章-工作空间-workspace">第十一章 工作空间 (Workspace)</a>
<ul>
<li><a href="#111-工作空间概述">11.1 工作空间概述</a></li>
<li><a href="#112-创建与删除工作空间">11.2 创建与删除工作空间</a></li>
<li><a href="#113-工作空间参数设置">11.3 工作空间参数设置</a></li>
<li><a href="#114-工作空间模式">11.4 工作空间模式</a></li>
</ul></li>
<li><a href="#第十二章-对准器-aligner-集成">第十二章 对准器 (Aligner) 集成</a>
<ul>
<li><a href="#121-对准器概述">12.1 对准器概述</a></li>
<li><a href="#122-通信链接配置">12.2 通信链接配置</a></li>
<li><a href="#123-对准器设置">12.3 对准器设置</a></li>
<li><a href="#124-对准器操作命令">12.4 对准器操作命令</a></li>
<li><a href="#125-集成命令pickplacexfer--algn">12.5 集成命令（PICK/PLACE/XFER + ALGN）</a></li>
</ul></li>
<li><a href="#第十三章-示教器操作-teach-pendant">第十三章 示教器操作 (Teach Pendant)</a>
<ul>
<li><a href="#131-liveman-示教器安全须知">13.1 Liveman 示教器安全须知</a></li>
<li><a href="#132-示教器基本操作">13.2 示教器基本操作</a></li>
<li><a href="#133-工位示教流程">13.3 工位示教流程</a></li>
</ul></li>
<li><a href="#第十四章-错误代码参考">第十四章 错误代码参考</a>
<ul>
<li><a href="#141-错误代码对照表">14.1 错误代码对照表</a></li>
<li><a href="#142-常见错误与排查">14.2 常见错误与排查</a></li>
</ul></li>
<li><a href="#第十五章-操作流程速查">第十五章 操作流程速查</a>
<ul>
<li><a href="#151-完整初始化设置流程">15.1 完整初始化设置流程</a></li>
<li><a href="#152-日常启动流程">15.2 日常启动流程</a></li>
<li><a href="#153-常用命令速查表">15.3 常用命令速查表</a></li>
</ul></li>
<li><a href="#附录">附录</a>
<ul>
<li><a href="#附录-a-wave-到-leap-迁移说明">附录 A: WAVE 到 LEAP 迁移说明</a></li>
<li><a href="#附录-b-双独立机器人注意事项">附录 B: 双独立机器人注意事项</a></li>
</ul></li>
</ul>
<hr />
<h2>第一章 系统概述</h2>
<h3>1.1 产品简介</h3>
<p><strong>MAGNATRAN® LEAP™</strong> 是 Brooks Automation 公司生产的高性能真空晶圆传送机器人，广泛应用于半导体制造设备中。该机器人通过单一同心轴肩轴机构，提供对单臂或双半独立臂的精确控制。</p>
<p><strong>核心特性：</strong></p>
<table>
<thead>
<tr>
<th>特性</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>运动类型</strong></td>
<td>旋转（Theta）、径向（Extend/Retract）、垂直（Z轴）</td>
</tr>
<tr>
<td><strong>驱动类型</strong></td>
<td>4轴 / 6轴（4T+Z 驱动）</td>
</tr>
<tr>
<td><strong>臂类型</strong></td>
<td>SCARA / Dual Pan SCARA / Frogleg / QuadraFly</td>
</tr>
<tr>
<td><strong>控制方式</strong></td>
<td>主机命令 / Liveman 示教器</td>
</tr>
<tr>
<td><strong>通信协议</strong></td>
<td>RS-232 串口 / 以太网（Ethernet）</td>
</tr>
<tr>
<td><strong>软件版本</strong></td>
<td>V8.2.x 系列（基于 Series 8 Controller）</td>
</tr>
<tr>
<td><strong>安全系统</strong></td>
<td>嵌入式安全控制器，冗余通道 A/B</td>
</tr>
</tbody>
</table>
<p><strong>主要文档编号：</strong></p>
<table>
<thead>
<tr>
<th>文档</th>
<th>编号</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>用户手册</td>
<td>238485 Rev. G</td>
<td>硬件安装、安全、规格、操作</td>
</tr>
<tr>
<td>软件手册</td>
<td>278805 Rev. E</td>
<td>编程命令、I/O、工位设置、AWC</td>
</tr>
</tbody>
</table>
<h3>1.2 机械臂类型</h3>
<p>MAGNATRAN LEAP 支持多种机械臂配置：</p>
<h4>SCARA 臂</h4>
<ul>
<li>提供旋转（Theta）、径向（Extend/Retract）和垂直（Z, Up/Down）三种运动</li>
<li>单末端执行器</li>
<li>适合标准真空传送应用</li>
</ul>
<h4>Dual Pan SCARA™ 臂</h4>
<ul>
<li>双半独立臂设计</li>
<li>两个末端执行器（Arm A / Arm B）</li>
<li>通过单一同心轴肩轴机构驱动</li>
<li>支持快速交换（swap）操作</li>
</ul>
<h4>Dual Independent Frogleg™ 臂</h4>
<ul>
<li>双独立蛙腿式臂</li>
<li>两个末端执行器独立运动</li>
<li>运动由内置 LEAP 控制器协调控制</li>
</ul>
<h4>Dual Arm SCARA 臂</h4>
<ul>
<li>通过三个 Theta 轴实现径向和旋转运动</li>
<li>两个末端执行器</li>
</ul>
<h4>QuadraFly™ 臂</h4>
<ul>
<li>四臂设计，适合重载应用</li>
<li>蝙蝠翼式腕板连接末端执行器</li>
<li>每个蝙蝠翼可容纳两个末端执行器（Pan L / Pan R）</li>
</ul>
<h3>1.3 坐标系统</h3>
<p>MAGNATRAN LEAP 使用<strong>极坐标系</strong>（Polar Coordinate System），以机器人驱动中心为坐标原点：</p>
<pre><code>    R (径向) — 末端执行器到中心的距离（微米/microns）
    T (旋转) — 旋转角度（毫度/millidegrees）
    Z (垂直) — 垂直高度位置（微米/microns）</code></pre>
<blockquote>
<p><strong>注意：</strong> R 和 T 确定末端执行器中心的目标位置；W（旋转腕）定义末端执行器的目标方向。</p>
</blockquote>
<p><strong>关键位置术语：</strong></p>
<table>
<thead>
<tr>
<th>术语</th>
<th>英文</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>基准传送偏移</td>
<td>BTO (Base Transfer Offset)</td>
<td>从机器人 Home 位置到系统晶圆传送平面（WTP）的垂直距离</td>
</tr>
<tr>
<td>晶圆传送平面</td>
<td>WTP (Wafer Transfer Plane)</td>
<td>晶圆底面所在的水平面</td>
</tr>
<tr>
<td>缩回位置</td>
<td>Retract (R1/R2)</td>
<td>臂缩回时的径向位置</td>
</tr>
<tr>
<td>伸出位置</td>
<td>Extend (EX)</td>
<td>臂完全伸出至工位时的径向位置</td>
</tr>
<tr>
<td>上位/下位</td>
<td>Z UP / Z DN</td>
<td>Z 轴的上方/下方传送位置</td>
</tr>
<tr>
<td>槽位</td>
<td>SLOT</td>
<td>卡匣或腔体内的具体晶圆位置编号</td>
</tr>
</tbody>
</table>
<h3>1.4 控制器与软件架构</h3>
<p>MAGNATRAN LEAP 采用 <strong>Series 8 Controller</strong>，内置嵌入式安全控制器：</p>
<pre><code>┌─────────────────────────────────────┐
│        主机系统 (Host)               │
│  (OEM 系统控制器 / PC / PLC)        │
└──────────┬──────────────────────────┘
           │  RS-232 / Ethernet
           ▼
┌─────────────────────────────────────┐
│     Series 8 Controller             │
│  ┌───────────────────────────────┐  │
│  │  运动控制引擎                  │  │
│  │  命令解析器                    │  │
│  │  I/O 管理                      │  │
│  │  安全控制器 (Channel A/B)      │  │
│  └───────────────────────────────┘  │
│  固件版本: V8.2.x                   │
└──────────┬──────────┬───────────────┘
           │          │
     ┌─────┘          └─────┐
     ▼                      ▼
┌──────────┐          ┌──────────┐
│ 电机驱动  │          │ I/O 面板  │
│ (R/T/Z)  │          │ 安全 I/O │
│          │          │ MISC I/O │
└──────────┘          └──────────┘</code></pre>
<p><strong>兼容性模式</strong>：LEAP 支持两种兼容性模式：</p>
<ul>
<li><strong>MAG6 模式</strong> — 与 MagnaTran 6 系列兼容</li>
<li><strong>VT5 模式</strong> — 与 MT5/VT5 系列兼容</li>
</ul>
<hr />
<h2>第二章 安全规范</h2>
<h3>2.1 安全警告等级</h3>
<table>
<thead>
<tr>
<th>信号词</th>
<th>颜色</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>DANGER（危险）</strong></td>
<td>白字红底</td>
<td>如不避免，<strong>将导致死亡或严重伤害</strong></td>
</tr>
<tr>
<td><strong>WARNING（警告）</strong></td>
<td>黑字橙底</td>
<td>如不避免，<strong>可能导致死亡或严重伤害</strong></td>
</tr>
<tr>
<td><strong>CAUTION（注意）</strong></td>
<td>黑字黄底</td>
<td>如不避免，<strong>可能导致轻度或中度伤害</strong></td>
</tr>
<tr>
<td><strong>NOTICE（提示）</strong></td>
<td>白字蓝底</td>
<td>不涉及人身伤害的重要操作信息</td>
</tr>
</tbody>
</table>
<blockquote>
<p>⚠️ <strong>安全图标遵循 ISO 3864 和 ANSI Z535 标准。</strong></p>
</blockquote>
<h3>2.2 通用安全注意事项</h3>
<pre><code>╔══════════════════════════════════════════════════════════════════╗
║  ⚠️  关键安全警告                                                ║
║                                                                  ║
║  • 软件不具备安全评级 — 只要电机通电，就可能发生非计划运动         ║
║  • 最大扭矩可能瞬间施加，导致死亡、严重伤害或设备损坏             ║
║  • 仅在机器人工作空间被封闭时，才能在自动模式下运行               ║
║  • 确保安全控制器功能已经到位并正确运行                           ║
║  • 拆卸机器人外罩将触发联锁，将速度限制至 250mm/sec               ║
║  • 重新安装外罩不会重置速度联锁 — 需联系 Brooks 技术支持          ║
╚══════════════════════════════════════════════════════════════════╝</code></pre>
<p><strong>软件安全警告：</strong></p>
<ul>
<li>仅在安装了外罩的情况下操作机器人</li>
<li>使用物理屏障防止人员进入机器人运动路径</li>
<li>在机器人工作空间内操作时，始终使用 Liveman 示教器</li>
<li>使用心脏节律管理设备的人员，需与电机保持至少 30cm 安全距离</li>
</ul>
<h3>2.3 安全联锁系统</h3>
<p><strong>安全 I/O 连接器</strong>：LEAP 配备专用安全 I/O 连接器，包含冗余通道 A 和 B。</p>
<table>
<thead>
<tr>
<th>联锁类型</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>保护停止 (Protective Stop)</strong></td>
<td>必须闭合才能接受运动命令</td>
</tr>
<tr>
<td><strong>紧急停止 (E-Stop)</strong></td>
<td>触发时切断电机电源</td>
</tr>
<tr>
<td><strong>心跳/状态信号</strong></td>
<td>验证安全控制器运行状态</td>
</tr>
<tr>
<td><strong>外罩联锁</strong></td>
<td>检测机器人外罩是否就位</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注意：</strong> 禁止绕过安全联锁。Muting（屏蔽）连接器仅用于特定改装或受控诊断场景。</p>
</blockquote>
<hr />
<h2>第三章 通信与连接</h2>
<h3>3.1 RS-232 串口通信</h3>
<p><strong>默认串口配置：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td>波特率 (Baud Rate)</td>
<td>9600</td>
</tr>
<tr>
<td>数据位 (Data Bits)</td>
<td>8</td>
</tr>
<tr>
<td>校验位 (Parity)</td>
<td>None</td>
</tr>
<tr>
<td>停止位 (Stop Bits)</td>
<td>1</td>
</tr>
</tbody>
</table>
<blockquote>
<p>⚠️ 如果示教器已连接并激活，机器人可能优先响应示教器输入而非主机串口命令。</p>
<p>⚠️ 在上电前，确保所有通信和电源连接已完成。</p>
</blockquote>
<h3>3.2 以太网通信</h3>
<p>LEAP 机器人可通过以太网连接外部控制器。I/O 面板提供以下以太网端口：</p>
<table>
<thead>
<tr>
<th>端口</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>HOST (IOIOI)</strong></td>
<td>主机通信端口</td>
</tr>
<tr>
<td><strong>Ethernet</strong></td>
<td>主以太网通信</td>
</tr>
<tr>
<td><strong>Diagnostics</strong></td>
<td>诊断用以太网</td>
</tr>
<tr>
<td><strong>Auxiliary</strong></td>
<td>辅助设备以太网</td>
</tr>
</tbody>
</table>
<p><strong>配置以太网命令：</strong></p>
<pre><code>CONFIG ETHERNET ADDRESS ip_address MASK subnet_mask</code></pre>
<blockquote>
<p><strong>注意：</strong> 此命令不需要 STORE，更改立即生效。如果通过以太网连接更改 IP 地址，连接将断开。</p>
</blockquote>
<p><strong>查询以太网配置：</strong></p>
<pre><code>RQ ETHERNET</code></pre>
<h3>3.3 通信模式配置</h3>
<p><strong>查询所有通信设置：</strong></p>
<pre><code>RQ COMM ALL</code></pre>
<p><strong>设置数据包模式 (Packet Mode)：</strong></p>
<pre><code>SET COMM M/B PKT</code></pre>
<p><strong>设置顺序模式 (Sequential Mode)：</strong></p>
<pre><code>SET COMM FLOW SEQ</code></pre>
<p><strong>设置终端回显：</strong></p>
<pre><code>SET IO ECHO Y          # 开启回显
SET IO ECHO N          # 关闭回显</code></pre>
<p><strong>换行符设置：</strong></p>
<pre><code>SET COMM LF Y          # 在响应末尾添加换行符
SET COMM LF N          # 不添加换行符</code></pre>
<p><strong>校验和模式：</strong></p>
<pre><code>SET COMM CHECKSUM offa6    # 关闭校验和（默认 OFF，区分大小写）</code></pre>
<p><strong>I/O 回显注释（ECHO）：</strong></p>
<pre><code>ECHO PROCESS NUMBER 7 HAS STARTED</code></pre>
<p>响应：</p>
<pre><code>PROCESS NUMBER 7 HAS STARTED</code></pre>
<blockquote>
<p>ECHO 命令不执行任何机器人操作，仅用作脚本和日志注释的诊断功能。</p>
</blockquote>
<h3>3.4 数据存储命令</h3>
<p>许多参数设置后需要使用 STORE 命令持久化保存。部分命令有独立的 STORE 子命令，部分设置自动保存。</p>
<p><strong>存储所有参数：</strong></p>
<pre><code>STORE ALL</code></pre>
<p>响应：</p>
<pre><code>_RDY</code></pre>
<blockquote>
<p><strong>重要：</strong> 每次修改参数后，务必使用对应的 STORE 命令保存。未保存的参数将在断电后丢失。</p>
</blockquote>
<hr />
<h2>第四章 命令语法规范</h2>
<h3>4.1 命令格式约定</h3>
<p>命令以等宽文本（MONOSPACE TEXT）形式在命令提示符下输入：</p>
<table>
<thead>
<tr>
<th>格式</th>
<th>含义</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>大写字母</strong></td>
<td>固定关键字，须精确输入</td>
<td><code>RQ VERSION</code></td>
</tr>
<tr>
<td><strong>小写斜体</strong></td>
<td>变量，须替换为实际值</td>
<td><code>station</code>, <code>value</code></td>
</tr>
<tr>
<td><code>[方括号]</code></td>
<td>可选参数</td>
<td><code>[ARM]</code>, <code>[SLOT slot]</code></td>
</tr>
<tr>
<td><code>(圆括号 \| 竖线)</code></td>
<td>从中选择一项</td>
<td><code>(A\|B)</code>, <code>(ON\|OFF)</code></td>
</tr>
<tr>
<td><code>&lt;尖括号&gt;</code></td>
<td>必需参数</td>
<td><code>&lt;ARM&gt;[(A\|B)]</code></td>
</tr>
</tbody>
</table>
<p><strong>命令示例解读：</strong></p>
<pre><code>SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; R rVal T tVal Z zVal</code></pre>
<p>解读：</p>
<ul>
<li><code>SET STN</code> — 固定关键字</li>
<li><code>station</code> — 工位编号（1-99）</li>
<li><code>ARM</code> — 固定关键字（在某些模式下为可选）</li>
<li><code>(A|B)</code> — 选择 Arm A 或 Arm B</li>
<li><code>R rVal T tVal Z zVal</code> — 设置径向、旋转、Z 轴坐标值</li>
</ul>
<p><strong>实际命令示例：</strong></p>
<pre><code>SET STN 1 ARM A R 350000 T 090000 Z 025000</code></pre>
<h3>4.2 命令响应格式</h3>
<p>机器人控制器的标准响应格式：</p>
<table>
<thead>
<tr>
<th>响应</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>_RDY</code></td>
<td>命令执行完成，就绪</td>
</tr>
<tr>
<td><code>_ACK nn</code></td>
<td>命令已确认（多设备模式，nn 为标识符）</td>
</tr>
<tr>
<td><code>_DONE nn</code></td>
<td>命令执行完成（多设备模式）</td>
</tr>
<tr>
<td><code>_ERR nn code</code></td>
<td>错误响应，code 为错误代码</td>
</tr>
<tr>
<td><code>_EVENT code</code></td>
<td>事件通知</td>
</tr>
</tbody>
</table>
<p><strong>Monitor 模式响应示例：</strong></p>
<pre><code>&gt; RQ WHO
WHO BROOKS AUTOMATION V8.2.0.11
_RDY</code></pre>
<p><strong>Packet 模式响应示例：</strong></p>
<pre><code>&gt; 01 RQ WHO
_ACK 01
WHO BROOKS AUTOMATION V8.2.0.11
_DONE 01</code></pre>
<h3>4.3 兼容性模式</h3>
<p>LEAP 支持 MAG6 和 VT5 两种兼容性模式，主要差异如下：</p>
<table>
<thead>
<tr>
<th>命令/行为</th>
<th>MAG6 模式</th>
<th>VT5 模式</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>GOTO</strong></td>
<td>ARM 可选</td>
<td>ARM 必须指定</td>
</tr>
<tr>
<td><strong>HALT</strong></td>
<td>受控停止，臂保持伺服</td>
<td>受控停止，臂伺服脱离</td>
</tr>
<tr>
<td><strong>HLLO</strong></td>
<td>返回 "HELLO"</td>
<td>返回 ready 字符串</td>
</tr>
<tr>
<td><strong>MOVE</strong></td>
<td>ARM 可选</td>
<td>ARM 必须指定</td>
</tr>
<tr>
<td><strong>SET STN</strong></td>
<td>ARM 可选</td>
<td>不支持 ARM</td>
</tr>
<tr>
<td><strong>RQ POS ABS</strong></td>
<td>ARM 可选，总是 RTZ 顺序</td>
<td>不支持 ARM</td>
</tr>
<tr>
<td><strong>Theta 坐标</strong></td>
<td>—</td>
<td>Arm A = 0° / Arm B = 180°</td>
</tr>
</tbody>
</table>
<p><strong>查询兼容性设置：</strong></p>
<pre><code>RQ COMPATIBILITY ALL</code></pre>
<p>响应：</p>
<pre><code>COMPATIBILITY COORDT (MAG6|VT5) ECHO (MAG6|VT5) HALT (MAG6|VT5) 
CPTR (MAG6|VT5) RESP (MAG6|VT5) SPEED (MAG6|VT5)</code></pre>
<p><strong>设置兼容性：</strong></p>
<pre><code>SET COMPATIBILITY COORDT VT5
SET COMPATIBILITY HALT VT5
STORE COMPATIBILITY COORDT
STORE COMPATIBILITY HALT</code></pre>
<blockquote>
<p>⚠️ <strong>更改兼容性模式会改变机器人行为。此命令在出厂时设置，通常不应更改。</strong></p>
</blockquote>
<hr />
<h2>第五章 系统命令</h2>
<h3>5.1 系统查询命令</h3>
<h4>RQ WHO — 查询机器人身份</h4>
<pre><code>RQ WHO</code></pre>
<p>响应：</p>
<pre><code>WHO BROOKS AUTOMATION V8.2.0.11
_RDY</code></pre>
<h4>RQ VERSION — 查询版本和日期</h4>
<pre><code>RQ VERSION</code></pre>
<p>响应：</p>
<pre><code>V8.2.0.19
10/29/2020
_RDY</code></pre>
<h4>RQ RVSN — 查询零件号和软件修订号</h4>
<pre><code>RQ RVSN</code></pre>
<p>响应：</p>
<pre><code>RVSN part_num revision</code></pre>
<h4>RQ DATE — 查询日期</h4>
<pre><code>RQ DATE            # 返回 MM/DD/YYYY 格式
RQ DATE YMD        # 返回 YYYY-MM-DD 格式
RQ DATE MDY        # 返回 YYYY-MM-DD 格式</code></pre>
<p>响应：</p>
<pre><code>DATE: 2020-02-06
_RDY</code></pre>
<h4>RQ TIME — 查询时间</h4>
<pre><code>RQ TIME</code></pre>
<blockquote>
<p><strong>注意：</strong> 日期和时间始终以标准 GMT 时间给出，不调整时区。</p>
</blockquote>
<h3>5.2 配置命令</h3>
<h4>CONFIG ROBOT — 机器人应用程序配置</h4>
<pre><code>RQ CONFIG                              # 查询当前应用程序编号
CONFIG ROBOT APLIC application_id      # 加载指定应用程序</code></pre>
<blockquote>
<p>应用程序编号需与质量记录（QR）文档中的编号一致。</p>
</blockquote>
<h4>RQ SYNC ZERO — 查询同步零点</h4>
<pre><code>RQ SYNC ZERO ALL     # 查询所有轴的同步零点</code></pre>
<h4>FIND ZERO — 建立新零点</h4>
<pre><code>FIND ZERO R          # 建立径向零点
FIND ZERO T          # 建立旋转零点
FIND ZERO ALL        # 建立所有轴零点</code></pre>
<h3>5.3 系统复位</h3>
<h4>RESET — 复位命令</h4>
<pre><code>RESET</code></pre>
<blockquote>
<p>复位后需要重新执行 HOME 命令。</p>
</blockquote>
<hr />
<h2>第六章 I/O 系统</h2>
<h3>6.1 标准 I/O 模式</h3>
<p>标准 I/O 模式提供 <strong>22 个输入信号</strong> 和 <strong>20 个输出信号</strong>，通过 D-Sub 50 针连接器实现。</p>
<p><strong>标准 I/O 引脚定义（部分）：</strong></p>
<table>
<thead>
<tr>
<th>引脚 #</th>
<th>信号名</th>
<th>描述</th>
<th>I/O Mask</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>IN_0</td>
<td>INPUT 1</td>
<td>0x01</td>
</tr>
<tr>
<td>2</td>
<td>IN_1</td>
<td>INPUT 2</td>
<td>0x02</td>
</tr>
<tr>
<td>3</td>
<td>IN_2</td>
<td>INPUT 3</td>
<td>0x04</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>23</td>
<td>INT_LCK 0</td>
<td>INTLCK 0</td>
<td>-</td>
</tr>
<tr>
<td>35</td>
<td>STN_0</td>
<td>STATION_0</td>
<td>-</td>
</tr>
<tr>
<td>36</td>
<td>STN_1</td>
<td>STATION_1</td>
<td>-</td>
</tr>
<tr>
<td>37</td>
<td>STN_2</td>
<td>STATION_2</td>
<td>-</td>
</tr>
<tr>
<td>38</td>
<td>STN_3</td>
<td>STATION_3</td>
<td>-</td>
</tr>
<tr>
<td>39</td>
<td>STN_4</td>
<td>STATION_4</td>
<td>-</td>
</tr>
<tr>
<td>40</td>
<td>AT_STN</td>
<td>AT STATION</td>
<td>-</td>
</tr>
<tr>
<td>41</td>
<td>ARM_IN_USE</td>
<td>ARM IN USE</td>
<td>-</td>
</tr>
<tr>
<td>42</td>
<td>NOT_MOVING</td>
<td>NOT MOVING</td>
<td>-</td>
</tr>
</tbody>
</table>
<h3>6.2 扩展 I/O 模式</h3>
<p>扩展 I/O 模式提供 <strong>32 个输入信号</strong> 和 <strong>10 个输出信号</strong>，仅 LEAP 机器人支持。</p>
<p><strong>配置扩展 I/O 模式：</strong></p>
<pre><code>CONFIG IO DRIVE HIGH_SIDE_EXT    # 设置为高边扩展 I/O 模式
CONFIG IO DRIVE LOW_SIDE_EXT     # 设置为低边扩展 I/O 模式</code></pre>
<h3>6.3 DIO 模式</h3>
<p>DIO (Discrete I/O) 模式使用 18 位表示机器人状态：</p>
<table>
<thead>
<tr>
<th>信号位</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>bit 18</td>
<td>SERVO ON（伺服开启）</td>
</tr>
<tr>
<td>bit 17</td>
<td>DISC CNTRL（始终为零）</td>
</tr>
<tr>
<td>STN_0 - STN_4</td>
<td>工位编号（二进制编码）</td>
</tr>
<tr>
<td>AT_STN</td>
<td>0 = NOT AT STATION, 1 = AT STATION</td>
</tr>
<tr>
<td>ARM_IN_USE</td>
<td>0 = ARM A IN USE, 1 = ARM B IN USE</td>
</tr>
<tr>
<td>NOT_MOVING</td>
<td>0 = MOVING, 1 = NOT MOVING</td>
</tr>
</tbody>
</table>
<p><strong>工位号二进制映射示例：</strong></p>
<table>
<thead>
<tr>
<th>STN_4</th>
<th>STN_3</th>
<th>STN_2</th>
<th>STN_1</th>
<th>STN_0</th>
<th>对应工位</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>Station #2</td>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>Station #3</td>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>Station #6</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>Station #9</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>Station #17</td>
</tr>
</tbody>
</table>
<p><strong>查询 DIO 输出状态：</strong></p>
<pre><code>RQ DIO OUTPUT</code></pre>
<p>响应：</p>
<pre><code>DIO OUTPUT [YES|NO]</code></pre>
<h3>6.4 I/O 映射命令</h3>
<h4>MAP — 映射 I/O</h4>
<p>将物理 I/O 分配逻辑名称和特性：</p>
<pre><code>MAP io_name io_type polarity io_direction io_mask</code></pre>
<p><strong>映射示例：</strong></p>
<pre><code>MAP P_GAUGE_1 DISCRETE_IN HI DIGITAL_IN 0x00000004
MAP STN_1_WFR WAF_SEN HI DIGITAL_IN 0x00000040
MAP STN_1_SLOT SBIT_SVLV_SEN DIGITAL_IN 0x00000003
MAP PRESSURE NUMERIC_IN DIGITAL_IN 0x00000F00</code></pre>
<p><strong>查询所有 I/O 映射：</strong></p>
<pre><code>RQ IO MAP ALL</code></pre>
<h4>REMOVE IO — 移除 I/O 映射</h4>
<pre><code>REMOVE IO P_GAUGE_1</code></pre>
<h4>MAP PASSTHROUGH — 直通映射</h4>
<pre><code>MAP DIG_1 PASSTHROUGH DIGITAL_IN 0X40 TO DIGITAL_OUT 0X40         # 同极性直通
MAP DIG_1 PASSTHROUGH NOT DIGITAL_IN 0X40 TO DIGITAL_OUT 0X40     # 反极性直通</code></pre>
<h3>6.5 I/O 状态命令</h3>
<h4>SET IO STATE — 设置 I/O 状态</h4>
<pre><code>SET IO STATE io_name io_state</code></pre>
<h4>RQ IO STATE — 查询 I/O 状态</h4>
<pre><code>RQ IO STATE io_name</code></pre>
<p>响应：</p>
<pre><code>IO STATE io_name io_state</code></pre>
<blockquote>
<p>此命令可用于故障排除或测试目的。</p>
</blockquote>
<h3>6.6 I/O 事件系统</h3>
<h4>SET EVENT IO — 设置 I/O 事件</h4>
<pre><code>SET EVENT IO name event_code (ENB|DIS)</code></pre>
<ul>
<li><strong>ENB</strong> — 启用事件（事件发生时生成 <code>_EVENT</code> 消息）</li>
<li><strong>DIS</strong> — 禁用事件</li>
</ul>
<h4>RQ EVENT IO — 查询事件状态</h4>
<pre><code>RQ EVENT IO TEST20 2000</code></pre>
<p>响应：</p>
<pre><code>IO TEST20 EVENT 2000 ENB</code></pre>
<h4>STORE EVENT IO — 存储事件设置</h4>
<pre><code>STORE EVENT IO name [eventNo|(ALL)]</code></pre>
<hr />
<h2>第七章 归零与基本运动</h2>
<h3>7.1 坐标系定义</h3>
<p>MAGNATRAN LEAP 使用<strong>极坐标系</strong>，以机器人驱动中心为原点：</p>
<pre><code>            T (Theta, 旋转轴)
            ↑
            |    · P(R,T)
            |   /
            |  / R (径向距离)
            | /
            |/
  ─────────O────────→ 0° 参考方向
            |
            |
            Z (垂直轴，纸面方向)</code></pre>
<ul>
<li><strong>R 轴</strong> — 径向位置，单位：微米 (microns)，7位数字</li>
<li><strong>T 轴</strong> — 旋转位置，单位：毫度 (millidegrees)，6位数字</li>
<li><strong>Z 轴</strong> — 垂直位置，单位：微米 (microns)</li>
</ul>
<h3>7.2 参考点建立 (Reference)</h3>
<p>Reference 功能在当前位置建立参考点并保持臂在该位置：</p>
<pre><code>REFERENCE R          # 建立 R 轴参考点
REFERENCE T          # 建立 T 轴参考点
REFERENCE Z          # 建立 Z 轴参考点
REFERENCE ALL        # 建立所有轴参考点</code></pre>
<p><strong>查询参考状态：</strong></p>
<pre><code>RQ REFERENCE</code></pre>
<h3>7.3 伺服控制</h3>
<h4>SET SERVOS — 设置伺服状态</h4>
<pre><code>SET SERVOS OFF       # 关闭伺服（允许手动定位臂以进行示教）</code></pre>
<blockquote>
<p><strong>注意：</strong> 关闭伺服后，需要执行 <code>HOME R</code> 或 <code>HOME ALL</code> 重新启用伺服。此命令不用于机器人的正常操作中。</p>
</blockquote>
<h4>RQ SERVOS — 查询伺服状态</h4>
<pre><code>RQ SERVOS</code></pre>
<h3>7.4 归零命令 (HOME)</h3>
<p>HOME 命令将机器人移动到已知的安全位置。</p>
<pre><code>HOME ALL             # 所有轴归零
HOME R               # R 轴归零
HOME T               # T 轴归零
HOME Z               # Z 轴归零</code></pre>
<p><strong>多轴归零执行顺序：</strong></p>
<ol>
<li><strong>R 轴</strong> — 归零至缩回位置</li>
<li><strong>Z 轴</strong> — 归零</li>
<li><strong>T 轴</strong> — 归零</li>
</ol>
<blockquote>
<p>⚠️ <strong>注意事项：</strong></p>
<ul>
<li>上电后或紧急停止后必须执行 HOME 命令</li>
<li>单轴 HOME（如 <code>HOME Z</code> 或 <code>HOME T</code>）不检查跨轴联锁</li>
<li>用户应在执行单轴 HOME 前确认臂已缩回</li>
<li>归零是大多数操作的先决条件</li>
</ul>
</blockquote>
<h3>7.5 释放与停止命令</h3>
<h4>RELEASE — 释放伺服</h4>
<p>执行受控停止，关闭伺服，但保持参考：</p>
<pre><code>RELEASE</code></pre>
<h4>HALT — 停止运动</h4>
<pre><code>HALT</code></pre>
<p><strong>MAG6 模式</strong>：受控停止，臂保持伺服控制
<strong>VT5 模式</strong>：受控停止，臂伺服脱离</p>
<p><strong>多设备模式使用：</strong></p>
<pre><code>02 HALT
_ACK 02
_DONE 02
_ERR 01 603 (command halted)</code></pre>
<blockquote>
<p>也可使用 <code>Ctrl+C</code> 发送停止命令（非打印字符，需在键盘上按下）。</p>
</blockquote>
<h3>7.6 位置查询</h3>
<h4>RQ POS ABS — 查询绝对位置</h4>
<pre><code>RQ POS ABS ALL           # 查询所有轴位置
RQ POS ABS R             # 查询 R 轴位置
RQ POS ABS T             # 查询 T 轴位置
RQ POS ABS Z             # 查询 Z 轴位置</code></pre>
<h4>RQ POS DEST — 查询目标位置</h4>
<pre><code>RQ POS DEST ALL</code></pre>
<h4>RQ POS TARGET — 查询目标位置</h4>
<pre><code>RQ POS TARGET ALL</code></pre>
<h4>RQ POS MIN/MAX — 查询轴最小/最大值</h4>
<pre><code>RQ POS MIN ALL
RQ POS MAX ALL</code></pre>
<h3>7.7 载荷模式</h3>
<p>载荷模式影响机器人的运动速度 — 当载荷为 ON（有晶圆）时，使用晶圆速度（较慢）；为 OFF 时使用空载速度。</p>
<h4>SET LOAD — 设置载荷状态</h4>
<pre><code>SET LOAD ON              # 设置有载（晶圆在末端执行器上）
SET LOAD OFF             # 设置空载</code></pre>
<h4>RQ LOAD — 查询载荷状态</h4>
<pre><code>RQ LOAD</code></pre>
<h4>SET/RQ/STORE LOAD MODE — 载荷模式</h4>
<pre><code>SET LOAD MODE (AUTO|MANUAL)
RQ LOAD MODE
STORE LOAD MODE</code></pre>
<h3>7.8 运动命令 (MOVE)</h3>
<p>MOVE 命令将机器人移动到指定的绝对坐标位置：</p>
<pre><code>MOVE &lt;&lt;(ARM)&gt;[(A|B)]&gt; [R rVal] [T tVal] [Z zVal]</code></pre>
<p><strong>示例：</strong></p>
<pre><code>MOVE ARM A R 350000 T 090000 Z 025000
MOVE R 250000
MOVE T 180000</code></pre>
<h3>7.9 速度设置</h3>
<h4>SET SPEEDS — 设置速度</h4>
<pre><code>SET SPEEDS speed_value</code></pre>
<h4>SET/RQ/STORE CDM SPEEDS — CDM 速度</h4>
<p>CDM (Coordinated Motion) 速度用于协调多轴运动：</p>
<pre><code>SET CDM SPEEDS value
RQ CDM SPEEDS
STORE CDM SPEEDS</code></pre>
<h4>SET/RQ/STORE RETRACT — 缩回值</h4>
<pre><code>SET RETRACT value            # 设置缩回位置 (R1)
RQ RETRACT
STORE RETRACT
</code><p><code>SET RETRACT2 value           # 设置第二缩回位置 (R2)
RQ RETRACT2
STORE RETRACT2</code></p></pre><p></p>
<h3>7.10 联锁设置</h3>
<pre><code>SET INTLCK parameter (ON|OFF|Y|N)
RQ INTLCK [ALL]
STORE INTLCK</code></pre>
<h3>7.11 安装命令 (MOUNT)</h3>
<p>MOUNT 命令将机器人移动到"安装新臂"位置（R 轴角度 90°）：</p>
<pre><code>FIND MOUNT               # 执行安装定位序列</code></pre>
<p>执行顺序：Home R → Home Z → Home T</p>
<p><strong>设置安装位置：</strong></p>
<pre><code>SET MOUNT R value        # 设置 R 轴安装位置
SET MOUNT B R value      # 设置 B 臂 R 轴安装位置</code></pre>
<p><strong>查询安装位置：</strong></p>
<pre><code>RQ MOUNT</code></pre>
<p><strong>运动事件控制：</strong></p>
<pre><code>SET EVENT MOTION 2600 ENB    # 启用运动暂停事件
SET EVENT MOTION 2601 ENB    # 启用运动恢复事件</code></pre>
<p><strong>查询累计行程：</strong></p>
<pre><code>RQ TOTAL TRAVEL ALL          # 查询所有轴累计行程
RQ TOTAL TRAVEL R            # 查询 R 轴累计行程
RQ TOTAL TRAVEL T            # 查询 T 轴累计行程
RQ TOTAL TRAVEL Z            # 查询 Z 轴累计行程</code></pre>
<hr />
<h2>第八章 工位设置 (Station Setup)</h2>
<h3>8.1 工位概述</h3>
<p><strong>工位 (Station)</strong> 是以编号标识的位置坐标，代表系统内各模块的位置。使用工位编号后，无需每次指定 R/T/Z 坐标值，只需告诉机器人"去 Station 1"即可。</p>
<pre><code>            ┌──────┐
   Stn 6 ──┤      ├── Stn 1 (VCE A)
            │      │
   Stn 5 ──┤ 传送 ├── Stn 2 (VCE B)
            │ 模块 │
   Stn 4 ──┤      ├── Stn 3 (Wafer Flipper)
            └──────┘</code></pre>
<ul>
<li>工位编号范围：<strong>1 ~ 99</strong></li>
<li>通常按顺时针方向围绕机器人编号</li>
<li>每个工位包含：R（径向）、T（旋转）、Z（BTO/上/下位）坐标</li>
</ul>
<h3>8.2 工位坐标设置</h3>
<h4>SET STN — 设置工位</h4>
<pre><code>SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; R rVal T tVal Z zVal
     [BTO btoVal] [LOWER lowerVal] [SLOT_SPC slot_spc]
     [SLOT_CNT slot_cnt]</code></pre>
<p><strong>参数说明：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>station</code></td>
<td>1-99</td>
<td>工位编号</td>
</tr>
<tr>
<td><code>ARM</code></td>
<td>A|B</td>
<td>臂描述符（默认 A）</td>
</tr>
<tr>
<td><code>R rVal</code></td>
<td>7位数字</td>
<td>径向伸出位置（微米）</td>
</tr>
<tr>
<td><code>T tVal</code></td>
<td>6位数字</td>
<td>旋转轴位置（毫度）</td>
</tr>
<tr>
<td><code>Z zVal</code></td>
<td>-</td>
<td>Z 轴 BTO 位置（微米）</td>
</tr>
<tr>
<td><code>BTO btoVal</code></td>
<td>-</td>
<td>基准传送偏移</td>
</tr>
<tr>
<td><code>LOWER lowerVal</code></td>
<td>-</td>
<td>下方清除距离</td>
</tr>
<tr>
<td><code>SLOT_SPC</code></td>
<td>-</td>
<td>槽位间距</td>
</tr>
<tr>
<td><code>SLOT_CNT</code></td>
<td>-</td>
<td>槽位数量</td>
</tr>
</tbody>
</table>
<p><strong>设置工位示例：</strong></p>
<pre><code>SET STN 1 ARM A R 350000 T 090000 Z 025000
SET STN 1 ARM A BTO 10000
SET STN 1 ARM A LOWER 5000
SET STN 1 ARM A SLOT_SPC 10000 SLOT_CNT 25</code></pre>
<h4>RQ STN — 查询工位</h4>
<pre><code>RQ STN 1 ARM A ALL           # 查询工位 1 Arm A 的所有参数
RQ STN 1 ALL                 # 查询工位 1 的所有参数
RQ STN 1 ARM B R             # 查询工位 1 Arm B 的 R 值</code></pre>
<h4>STORE STN — 存储工位</h4>
<pre><code>STORE STN 1 ARM A ALL        # 存储工位 1 Arm A 的所有参数
STORE STN 1 ALL              # 存储工位 1 的所有参数</code></pre>
<h4>REMOVE STN — 移除工位</h4>
<pre><code>REMOVE STN 3                 # 移除工位 3 的定义</code></pre>
<h4>COPY STN — 复制工位</h4>
<p>将已定义的工位参数复制到另一个工位：</p>
<pre><code>COPY STN source_stn TO dest_stn [ARM (A|B)]</code></pre>
<p><strong>示例：</strong></p>
<pre><code>COPY STN 1 TO 2 ARM B</code></pre>
<blockquote>
<p>常用于从 A 臂工位初始化 B 臂工位参数，然后微调 B 臂参数。</p>
</blockquote>
<h3>8.3 工位选项 — 曲线运动 (Curve Move)</h3>
<pre><code>SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION CURVE (Y|N)
RQ STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION CURVE
STORE STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION CURVE</code></pre>
<h3>8.4 工位选项 — VIA 路径点</h3>
<p>VIA 路径点允许机器人在运动过程中经过指定的中间点：</p>
<pre><code>SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION VIA 
     [(DIST|POSR|POST|POSW|PATH_OVER_CENTER)] value</code></pre>
<p><strong>参数说明：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DIST</code></td>
<td>VIA 点到目标的距离</td>
</tr>
<tr>
<td><code>POSR</code></td>
<td>VIA 点的 R 轴位置</td>
</tr>
<tr>
<td><code>POST</code></td>
<td>VIA 点的 T 轴位置</td>
</tr>
<tr>
<td><code>POSW</code></td>
<td>VIA 点的 W 轴位置</td>
</tr>
<tr>
<td><code>PATH_OVER_CENTER</code></td>
<td>允许路径经过中心</td>
</tr>
</tbody>
</table>
<p><strong>查询/存储 VIA 设置：</strong></p>
<pre><code>RQ STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION VIA [ALL]
STORE STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION VIA [(DIST|POSR|POST|POSW|PATH_OVER_CENTER)]</code></pre>
<h3>8.5 工位选项 — Z 轴</h3>
<pre><code>SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION Z_DOWN_SLOW (Y|N)
SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION Z_UP_SLOW (Y|N)
SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION 3_ZPOS_STN</code></pre>
<table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Z_DOWN_SLOW Y</code></td>
<td>PLACE 时 Z 下移使用慢速</td>
</tr>
<tr>
<td><code>Z_DOWN_SLOW N</code></td>
<td>PLACE 时 Z 下移使用正常速度</td>
</tr>
<tr>
<td><code>Z_UP_SLOW Y</code></td>
<td>PICK 时 Z 上移使用慢速</td>
</tr>
<tr>
<td><code>Z_UP_SLOW N</code></td>
<td>PICK 时 Z 上移使用正常速度</td>
</tr>
<tr>
<td><code>3_ZPOS_STN</code></td>
<td>三段 Z 轴位置工位</td>
</tr>
</tbody>
</table>
<p><strong>存储 Z 轴选项：</strong></p>
<pre><code>STORE STN 1 ARM A OPTION Z_DOWN_SLOW
STORE STN 1 ARM A OPTION 3_ZPOS_STN</code></pre>
<h3>8.6 工位选项 — I/O</h3>
<p>为工位关联 I/O 信号（闸阀传感器、缩回传感器、伸出使能等）：</p>
<pre><code>SET STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION 
     [SVLV_SEN name]          # 闸阀传感器
     [RETRACT_SEN name]       # 缩回传感器
     [EX_ENABLE name]         # 伸出使能</code></pre>
<p><strong>查询工位 I/O 选项：</strong></p>
<pre><code>RQ STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION [SVLV_SEN|RETRACT_SEN|EX_ENABLE]</code></pre>
<p><strong>存储工位 I/O 选项：</strong></p>
<pre><code>STORE STN station &lt;&lt;(ARM)&gt;[(A|B)]&gt; OPTION [SVLV_SEN|RETRACT_SEN|EX_ENABLE]</code></pre>
<h3>8.7 工位面 (Facet) 设置</h3>
<p>Facet 是传送模块上连接工艺模块的区域。一个传送或工艺模块通常有 2 到 8 个 Facet。</p>
<h4>SET/RQ/STORE STN FACET</h4>
<pre><code>SET STN station [&lt;ARM&gt; (A|B)] FACET facet_number
RQ STN station [&lt;ARM&gt; (A|B)] FACET
STORE STN station [&lt;ARM&gt; (A|B)] FACET</code></pre>
<p><strong>示例：</strong></p>
<pre><code>SET STN 1 ARM A FACET 3
STORE STN 1 ARM A FACET</code></pre>
<h4>Facet 延迟设置</h4>
<pre><code>SET FACET DELAY value
RQ FACET DELAY
STORE FACET DELAY</code></pre>
<h3>8.8 工位复制</h3>
<pre><code>COPY STN source TO destination [ARM (A|B)]</code></pre>
<hr />
<h2>第九章 GOTO 与晶圆传送命令</h2>
<h3>9.1 GOTO 命令</h3>
<p>GOTO 命令移动到指定工位参考位置。此命令执行所有必要的联锁检查以确保安全的晶圆处理。</p>
<p><strong>命令语法：</strong></p>
<pre><code>GOTO[N station] &lt;&lt;(ARM)&gt;[(A|B)]&gt; &lt;CW|CCW&gt; [R (EX|R1|R2)] [Z (UP|DN)] 
     [SLOT slot] [MAP N]</code></pre>
<p><strong>参数说明：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>N station</code></td>
<td>目标工位编号</td>
</tr>
<tr>
<td><code>ARM (A\|B)</code></td>
<td>臂描述符</td>
</tr>
<tr>
<td><code>CW\|CCW</code></td>
<td>顺时针/逆时针旋转方向</td>
</tr>
<tr>
<td><code>R EX</code></td>
<td>移动至伸出位置</td>
</tr>
<tr>
<td><code>R R1</code></td>
<td>移动至缩回位置 1</td>
</tr>
<tr>
<td><code>R R2</code></td>
<td>移动至缩回位置 2</td>
</tr>
<tr>
<td><code>Z UP</code></td>
<td>移动至 Z 上位</td>
</tr>
<tr>
<td><code>Z DN</code></td>
<td>移动至 Z 下位</td>
</tr>
<tr>
<td><code>SLOT slot</code></td>
<td>指定槽位（用于 Z 轴驱动）</td>
</tr>
<tr>
<td><code>MAP N</code></td>
<td>使用晶圆检测传感器</td>
</tr>
</tbody>
</table>
<p><strong>GOTO 执行序列示例（带 Z 轴和旋转腕）：</strong></p>
<p>起始位置：Station 1, 缩回, Z下, W未翻转
目标：Station 2（翻转工位），命令 <code>GOTO N 2</code></p>
<pre><code>执行步骤：
1. 如果 Load 状态为 ON，先移动到 R2 位置
2. T 轴和 Z 轴同步移动到 Station 2 的 Z UP 位置（仍在缩回位置）
3. 执行 W 轴翻转动作
4. 移动到 R EX（伸出）位置</code></pre>
<p><strong>GOTO 行为汇总表：</strong></p>
<table>
<thead>
<tr>
<th>命令</th>
<th>R 位置</th>
<th>Z 位置</th>
<th>行为</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GOTO N 1 R EX Z UP</code></td>
<td>伸出</td>
<td>上位</td>
<td>旋转到工位，伸出，Z上</td>
</tr>
<tr>
<td><code>GOTO N 1 R EX Z DN</code></td>
<td>伸出</td>
<td>下位</td>
<td>旋转到工位，伸出，Z下</td>
</tr>
<tr>
<td><code>GOTO N 1 R R1</code></td>
<td>缩回 R1</td>
<td>—</td>
<td>旋转到工位，保持缩回</td>
</tr>
<tr>
<td><code>GOTO N 1</code></td>
<td>默认</td>
<td>默认</td>
<td>旋转到工位，使用默认位置</td>
</tr>
</tbody>
</table>
<h3>9.2 GOTO 偏移量</h3>
<p>Offset 值表示相对于目标工位位置的绝对坐标偏移，可为正或负：</p>
<p><strong>命令语法：</strong></p>
<pre><code># 机器人不在工位时：
GOTO[N station] &lt;&lt;(ARM)&gt;[(A|B)]&gt; R EX [Z(UP|DN)]
     [[RO roffset][TO toffset][ZO zoffset]
     [WO woffset][WAO waoffset][WBO wboffset]]
     [(XO xoffset)(YO yoffset)]
</code><section><code><h1>机器人已在工位时：<a href="#机器人已在工位时"><span>#</span></a></h1></code><p><code>GOTO R EX [Z(UP|DN)]
[[RO roffset][TO toffset][ZO zoffset]
[WO woffset]]
[(XO xoffset)(YO yoffset)]</code></p></section></pre><p></p><p><strong>偏移量参数：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>RO roffset</code></td>
<td>R 轴偏移（从伸出/缩回位置）</td>
</tr>
<tr>
<td><code>TO toffset</code></td>
<td>T 轴偏移</td>
</tr>
<tr>
<td><code>ZO zoffset</code></td>
<td>Z 轴偏移（正值相加，负值相减）</td>
</tr>
<tr>
<td><code>WO woffset</code></td>
<td>W 轴偏移</td>
</tr>
<tr>
<td><code>XO xoffset</code></td>
<td>X 方向偏移（笛卡尔）</td>
</tr>
<tr>
<td><code>YO yoffset</code></td>
<td>Y 方向偏移（笛卡尔）</td>
</tr>
</tbody>
</table>
<p><strong>偏移量示例：</strong></p>
<pre><code># 从其他位置移动到工位 3，带偏移
GOTO N 3 R EX RO 500 TO -200 ZO 1000
</code><section><code><h1>已在工位时微调位置<a href="#已在工位时微调位置"><span>#</span></a></h1></code><p><code>GOTO R EX RO 500 TO -200 ZO 1000</code></p></section></pre><p></p><blockquote>
<p><strong>注意：</strong> 如果 Z 轴偏移为负值，将从总值中减去；如果为正值，将添加到总值中。</p>
</blockquote>
<h3>9.3 PICK 取片命令</h3>
<p>PICK 命令从指定工位和槽位取出晶圆。运动速度取决于载荷状态 — 有晶圆时使用晶圆速度（慢速）。</p>
<p><strong>命令语法：</strong></p>
<pre><code>PICK station [SLOT slot] &lt;&lt;(ARM)&gt;[(A|B|AB)]&gt; &lt;PAN L|R&gt; &lt;CW|CCW&gt;
     [[RO r_offset] [TO t_offset] [ZO z_offset]]
     [ALTWAFSPD (Y|N)]
     [EX NO_VIA|RE NO_VIA]
     [STRT (NR|R1|R2|VIA)]
     [ENRT [(NR|R1|R2|VIA)]</code></pre>
<p><strong>参数说明：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>station</code></td>
<td>工位编号</td>
</tr>
<tr>
<td><code>SLOT slot</code></td>
<td>槽位编号</td>
</tr>
<tr>
<td><code>ARM (A\|B\|AB)</code></td>
<td>臂描述符</td>
</tr>
<tr>
<td><code>PAN (L\|R)</code></td>
<td>仅 QuadraFly 使用，左/右末端执行器</td>
</tr>
<tr>
<td><code>CW\|CCW</code></td>
<td>旋转方向</td>
</tr>
<tr>
<td><code>RO/TO/ZO offset</code></td>
<td>位置偏移</td>
</tr>
<tr>
<td><code>ALTWAFSPD (Y\|N)</code></td>
<td>替代晶圆速度</td>
</tr>
<tr>
<td><code>STRT (NR\|R1\|R2\|VIA)</code></td>
<td>起始路径选择</td>
</tr>
<tr>
<td><code>ENRT (NR\|R1\|R2\|VIA)</code></td>
<td>结束路径选择</td>
</tr>
</tbody>
</table>
<p><strong>PICK 执行序列：</strong></p>
<pre><code>1. 旋转到工位 T 位置
2. 移动到 Z DOWN（下位）
3. 伸出末端执行器到 R EX
4. 上升到 Z UP（提起晶圆）
5. 缩回末端执行器</code></pre>
<p><strong>PICK 示例：</strong></p>
<pre><code>PICK 3                       # 从工位 3 取片
PICK 3 SLOT 5               # 从工位 3 第 5 槽取片
PICK 3 ARM B                # 用 B 臂从工位 3 取片
PICK 3 SLOT 5 ARM A CW      # 用 A 臂顺时针从工位 3 第 5 槽取片</code></pre>
<p><strong>PICK 行为表（Load = ON 时）：</strong></p>
<table>
<thead>
<tr>
<th>条件</th>
<th>命令 <code>PICK 2</code> 行为</th>
</tr>
</thead>
<tbody>
<tr>
<td>Load ON, 晶圆在末端执行器</td>
<td>执行 PICK，成功后 Load 保持 ON</td>
</tr>
</tbody>
</table>
<h3>9.4 PLACE 放片命令</h3>
<p>PLACE 命令将晶圆放置到指定工位和槽位。</p>
<p><strong>命令语法：</strong></p>
<pre><code>PLACE station [SLOT slot] &lt;&lt;(ARM)&gt;[(A|B|AB)]&gt; &lt;PAN L|R&gt; &lt;CW|CCW&gt;
      [[RO r_offset] [TO t_offset] [ZO z_offset]]
      [ALTWAFSPD (Y|N)]
      [EX NO_VIA|RE NO_VIA]
      [STRT (NR|R1|R2|VIA)]
      [ENRT [(NR|R1|R2|VIA)]</code></pre>
<p><strong>PLACE 执行序列：</strong></p>
<pre><code>1. 旋转到工位 T 位置
2. 移动到 Z UP（上位，晶圆在末端执行器上）
3. 伸出末端执行器到 R EX
4. 下降到 Z DOWN（放置晶圆）
5. 缩回末端执行器</code></pre>
<p><strong>PLACE 示例：</strong></p>
<pre><code>PLACE 5                      # 放片到工位 5
PLACE 5 SLOT 3              # 放片到工位 5 第 3 槽
PLACE 5 ARM B               # 用 B 臂放片到工位 5</code></pre>
<p><strong>PLACE 行为表（Load = OFF 时）：</strong></p>
<table>
<thead>
<tr>
<th>条件</th>
<th>命令 <code>PLACE 2</code> 行为</th>
</tr>
</thead>
<tbody>
<tr>
<td>Load OFF, 无晶圆</td>
<td>执行 PLACE，成功后 Load 保持 OFF</td>
</tr>
</tbody>
</table>
<h3>9.5 XFER 传送命令</h3>
<p>XFER 命令执行完整的取片-放片传送序列：</p>
<pre><code>XFER source_stn TO dest_stn [ARM (A|B)] [SLOT source_slot TO dest_slot]</code></pre>
<p><strong>结合对准器的传送：</strong></p>
<pre><code>XFER 1 TO 3 ARM A ALGN       # 取片 → 对准 → 放片</code></pre>
<hr />
<h2>第十章 Active Wafer Centering (AWC) 主动晶圆对中</h2>
<h3>10.1 AWC 概述</h3>
<p>AWC (Active Wafer Centering) 是 MAGNATRAN LEAP 的主动晶圆对中功能。通过传感器在传送过程中实时检测晶圆位置偏差，并自动校正。</p>
<h3>10.2 全局设置</h3>
<h4>SET/RQ/STORE WAF_CEN MODE — 设置 AWC 模式</h4>
<pre><code>SET WAF_CEN MODE (ON|OFF)
RQ WAF_CEN MODE
STORE WAF_CEN MODE</code></pre>
<h3>10.3 工位传感器设置</h3>
<h4>RQ/STORE STN WAF_CEN SENS ALL — 查询/存储所有传感器参数</h4>
<pre><code>RQ STN 1 ARM B WAF_CEN SENS ALL</code></pre>
<p>响应示例：</p>
<pre><code>STN 1 B WAF_CEN LEFT_SENS 02 497120 001823 000356 000784 000517
001011 RIGHT_SENS 05 505634 002118 000409 000809 000498 000961</code></pre>
<h4>SET/CLEAR STN WAF_CEN SENSOR — 设置/清除工位传感器</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN 
     [LEFT_SENS|RIGHT_SENS] io_name pos_r pos_t</code></pre>
<h3>10.4 AWC 工位参数</h3>
<h4>SET/RQ/STORE ENABLE — 启用/禁用 AWC</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN ENABLE (Y|N)
RQ STN station [ARM (A|B)] WAF_CEN ENABLE
STORE STN station [ARM (A|B)] WAF_CEN ENABLE</code></pre>
<h4>SET/RQ/STORE WAFER SIZE — 晶圆尺寸</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN WAFER_SIZE size
RQ STN station [ARM (A|B)] WAF_CEN WAFER_SIZE
STORE STN station [ARM (A|B)] WAF_CEN WAFER_SIZE</code></pre>
<h4>SET/RQ/STORE MAX DEVIATION — 最大偏差</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN MAX_DEV value
RQ STN station [ARM (A|B)] WAF_CEN MAX_DEV
STORE STN station [ARM (A|B)] WAF_CEN MAX_DEV</code></pre>
<h4>SET/RQ/STORE CHECK ON PICK — 取片时检查</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN CHK_ON_PICK (Y|N)
RQ STN station [ARM (A|B)] WAF_CEN CHK_ON_PICK
STORE STN station [ARM (A|B)] WAF_CEN CHK_ON_PICK</code></pre>
<h4>SET/RQ/STORE CHECK ON PICK MAX DEVIATION — 取片最大偏差</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN CHK_ON_PICK MAX_DEV value</code></pre>
<h4>SET/RQ/STORE BREAKAGE THRESHOLD — 破碎阈值</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN BREAKAGE_THRESHOLD value</code></pre>
<h4>FIND/SET/RQ/STORE NOTCH THRESHOLD — 缺口阈值</h4>
<pre><code>FIND STN station [ARM (A|B)] WAF_CEN NOTCH_THRESHOLD
SET STN station [ARM (A|B)] WAF_CEN NOTCH_THRESHOLD value</code></pre>
<h4>SET/RQ/STORE OPEN EXTENSION — 开放延伸参数</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN OPEN_EXT value</code></pre>
<h4>SET/RQ/STORE CAL_WITH_PICK — 取片校准</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN CAL_WITH_PICK (Y|N)
RQ STN station [ARM (A|B)] WAF_CEN CAL_WITH_PICK
STORE STN station [ARM (A|B)] WAF_CEN CAL_WITH_PICK</code></pre>
<h4>SET/RQ/STORE OFFSET CORRECTION — 偏移校正</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN OFFSET_CORR (Y|N)
SET STN station [ARM (A|B)] WAF_CEN OFFSET_CORR_THRESHOLD value</code></pre>
<h4>SET/RQ/STORE SS_OFFSET — 传感器偏移</h4>
<pre><code>SET STN station [ARM (A|B)] WAF_CEN SS_OFFSET xVal yVal
STORE STN station [ARM (A|B)] WAF_CEN SS_OFFSET xVal yVal</code></pre>
<h3>10.5 AWC 传感器校准</h3>
<h4>FIND STN WAF_CEN ALL — 自动校准</h4>
<p>自动校准传感器位置和缺口阈值：</p>
<pre><code>FIND STN station [ARM (A|B)] WAF_CEN ALL</code></pre>
<blockquote>
<p>此命令执行自动校准程序，确定传感器位置并估算系统延迟。</p>
</blockquote>
<h3>10.6 AWC 操作与数据查询</h3>
<h4>RQ STN WAF_CEN DATA — 查询 AWC 数据</h4>
<p>查询上次 WAF_CEN 操作的偏移计算结果：</p>
<pre><code>RQ STN station [ARM (A|B)] WAF_CEN DATA</code></pre>
<blockquote>
<p>如果没有有效数据，将报告错误。</p>
</blockquote>
<hr />
<h2>第十一章 工作空间 (Workspace)</h2>
<h3>11.1 工作空间概述</h3>
<p>工作空间 (Workspace) 定义了机器人允许运动的三维区域。如果用户尝试将末端执行器移动到任何活动工作空间之外，将报告运动错误。</p>
<p><strong>工作空间参数：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Name</strong></td>
<td>工作空间名称（最多 20 字符）</td>
</tr>
<tr>
<td><strong>State</strong></td>
<td>活动(ACTIVE)或非活动(INACTIVE)</td>
</tr>
<tr>
<td><strong>Arm</strong></td>
<td>关联的臂（A, B 或 BOTH）</td>
</tr>
<tr>
<td><strong>Slot Valve Interlock</strong></td>
<td>闸阀联锁名称</td>
</tr>
<tr>
<td><strong>RMIN / RMAX</strong></td>
<td>R 轴最小/最大范围</td>
</tr>
<tr>
<td><strong>TMIN / TMAX</strong></td>
<td>T 轴最小/最大范围</td>
</tr>
<tr>
<td><strong>ZMIN / ZMAX</strong></td>
<td>Z 轴最小/最大范围</td>
</tr>
</tbody>
</table>
<p><strong>HOME 工作空间：</strong> 预定义的 HOME 区域工作空间，限制延伸长度等于缩回值。</p>
<h3>11.2 创建与删除工作空间</h3>
<h4>CREATE WSPACE — 创建工作空间</h4>
<pre><code>CREATE WSPACE name</code></pre>
<h4>REMOVE WSPACE — 删除工作空间</h4>
<pre><code>REMOVE WSPACE name</code></pre>
<h3>11.3 工作空间参数设置</h3>
<h4>SET WSPACE — 设置工作空间参数</h4>
<pre><code>SET WSPACE name
     [MIN (R rMinVal|T tMinVal|Z zMinVal)]
     [MAX (R rMaxVal|T tMaxVal|Z zMaxVal)]
     [ARM (A|B|BOTH)]
     [STN station]
     [STATE (ACTIVE|INACTIVE)]
     [INTLCK svlv_name]</code></pre>
<p><strong>设置示例：</strong></p>
<pre><code>CREATE WSPACE PM_AREA
SET WSPACE PM_AREA MIN R 100000 MIN T 045000 MIN Z 0
SET WSPACE PM_AREA MAX R 500000 MAX T 135000 MAX Z 100000
SET WSPACE PM_AREA ARM BOTH
SET WSPACE PM_AREA STATE ACTIVE
STORE WSPACE PM_AREA ALL</code></pre>
<h4>RQ WSPACE — 查询工作空间</h4>
<pre><code>RQ WSPACE name ALL</code></pre>
<p>响应：</p>
<pre><code>WSPACE
NAME --------------- name
STATE -------------- (ACTIVE|INACTIVE)
INTLCK ------------- svlv_name
ARM(s) ------------- (A|B|BOTH)
RMIN --------------- rMinVal
RMAX --------------- rMaxVal
TMIN --------------- tMinVal
TMAX --------------- tMaxVal
ZMIN --------------- zMinVal
ZMAX --------------- zMaxVal</code></pre>
<h4>STORE WSPACE — 存储工作空间</h4>
<pre><code>STORE WSPACE name ALL</code></pre>
<h3>11.4 工作空间模式</h3>
<h4>SET/RQ/STORE WSPACE MODE — 工作空间模式</h4>
<pre><code>SET WSPACE MODE (ON|OFF)           # 开启/关闭工作空间检查
SET WSPACE MODE JOG (ON|OFF)       # JOG 模式下是否检查工作空间
SET WSPACE MODE LOAD_DEPENDENT (Y|N)  # 载荷相关模式</code></pre>
<pre><code>RQ WSPACE MODE [JOG] [LOAD_DEPENDENT]</code></pre>
<p>响应：</p>
<pre><code>WSPACE MODE ON|OFF</code></pre>
<pre><code>STORE WSPACE MODE [JOG] [LOAD_DEPENDENT]</code></pre>
<p><strong>TMIN/TMAX 定义规则：</strong></p>
<blockquote>
<p>TMIN 可设置为小于、等于或大于 TMAX。机器人将从 TMIN 顺时针旋转到 TMAX 的区域视为有效的 Theta 工作空间。</p>
</blockquote>
<hr />
<h2>第十二章 对准器 (Aligner) 集成</h2>
<h3>12.1 对准器概述</h3>
<p>MAGNATRAN LEAP 支持集成 Brooks Automation 的对准器（如 InLigner™ 真空环境对准器），用于晶圆的对中和缺口/平边查找。</p>
<p><strong>支持配置：</strong></p>
<table>
<thead>
<tr>
<th>连接方式</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>本地连接</strong></td>
<td>对准器直接通过辅助串口（COM 2）连接到机器人</td>
</tr>
<tr>
<td><strong>远程连接</strong></td>
<td>对准器通过链接设备连接</td>
</tr>
</tbody>
</table>
<h3>12.2 通信链接配置</h3>
<h4>CONFIG LINK — 配置链接</h4>
<pre><code>CONFIG LINK link_number TYPE (RAW_TEXT|USER_CMD|USER_DEV|HOST_DEV|FIXLOAD) 
       PORT SERIAL BAUD baud PARITY parity DATA dataBits STOP stopBits</code></pre>
<p>或以太网链接：</p>
<pre><code>CONFIG LINK link_number TYPE ... PORT ENET ADDRESS ip_address PORT port_number</code></pre>
<p><strong>参数说明：</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>范围</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>link_number</code></td>
<td>1-19</td>
<td>链接编号（1-5 保留给内部使用）</td>
</tr>
</tbody>
</table>
<blockquote>
<p>⚠️ 链接 1-5 保留供 Series 8 Controller 串口内部使用。配置链接 1-5 可能导致机器人停止响应。</p>
</blockquote>
<h4>SET/RQ/STORE DEVICE — 设备表</h4>
<pre><code>SET DEV device_id LINK link_number
RQ DEV device_id
STORE DEV device_id</code></pre>
<h3>12.3 对准器设置</h3>
<p><strong>1 个对准器 + 1 个机器人的设置流程：</strong></p>
<pre><code># Step 1: 配置通信链接（COM 2 串口）
CONFIG LINK 6 TYPE USER_DEV PORT SERIAL BAUD 9600 PARITY NONE DATA 8 STOP 1
<section><h1>Step 2: 设置设备 ID<a href="#step-2-设置设备-id"><span>#</span></a></h1><p>SET DEV 04 LINK 6</p></section>
<section><h1>Step 3: 设置对准器工位和设备<a href="#step-3-设置对准器工位和设备"><span>#</span></a></h1><p>SET ALIGNER 1 STN 3 DEV 04
STORE ALIGNER 1 STN</p></section>
<section><h1>Step 4: 设置对准器类型<a href="#step-4-设置对准器类型"><span>#</span></a></h1><p>SET ALIGNER 1 STN TYPE DEV
STORE ALIGNER 1 STN TYPE DEV</p></section>
<section><h1>Step 5: 验证设置<a href="#step-5-验证设置"><span>#</span></a></h1><p>RQ ALIGNER 1 STN</p></section>
<section><h1>Step 6: 设置晶圆参数<a href="#step-6-设置晶圆参数"><span>#</span></a></h1><p>SET ALIGNER 1 WAFERID RO-300-NT-O-01
STORE ALIGNER 1 WAFERID</p></section>
<section><h1>Step 7: 设置 CCD 位置<a href="#step-7-设置-ccd-位置"><span>#</span></a></h1><p>SET ALIGNER 1 CCDPOS 98000
STORE ALIGNER 1 CCDPOS</p></section>
<section><h1>Step 8: 设置后处理位置<a href="#step-8-设置后处理位置"><span>#</span></a></h1><p>SET ALIGNER 1 POSTPOS 1 POS 82000
STORE ALIGNER 1 POSTPOS</p></section>
</code><section><code><h1>Step 9: 验证所有设置<a href="#step-9-验证所有设置"><span>#</span></a></h1></code><p><code>RQ ALIGNER 1 ALL</code></p></section></pre><p></p><p><strong>晶圆标识符格式 (WAFERID)：</strong></p>
<table>
<thead>
<tr>
<th>字段</th>
<th>值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>形状</td>
<td>RO / RT</td>
<td>RO=圆形, RT=矩形</td>
</tr>
<tr>
<td>尺寸</td>
<td>300/200/150</td>
<td>晶圆直径(mm)</td>
</tr>
<tr>
<td>基准标记</td>
<td>NT/SF/FS/FL/UN</td>
<td>NT=缺口, SF=单平边, FS=无特征, FL=平边, UN=未知</td>
</tr>
<tr>
<td>类型</td>
<td>O/T</td>
<td>O=不透明, T=透明</td>
</tr>
<tr>
<td>其他</td>
<td>01/02...</td>
<td>品种编号</td>
</tr>
</tbody>
</table>
<p><strong>示例：</strong></p>
<pre><code>RO-300-NT-O-01     # 圆形, 300mm, 缺口, 不透明, 品种 1
RO-200-FL-O-01     # 圆形, 200mm, 平边, 不透明, 品种 1</code></pre>
<h3>12.4 对准器操作命令</h3>
<h4>SET/RQ/STORE ALIGNER — 对准器参数</h4>
<pre><code>SET ALIGNER identifier STN station
     [TYPE (DEFAULT|EDGE_ALGN)]
     [DEV deviceId]
     [XFER (EX|RE)]
     [CCDNUM ccdNum] [CCDPOS ccdAngle]
     [WAFERID waferId]
     [POSTPOS (1|2|3|4) POS ppAngle] [POSTPOS INDEX (1|2|3|4)]
     [MAXANGLE maxAngle]
     [HANDOFF INDEX handOffIndex] [HANDOFF POS (1|2|3|4)]
     [CCD_CORR (ON|OFF)]</code></pre>
<h4>ALIGNER 操作命令</h4>
<pre><code>ALIGNER HOME          # 对准器归零
ALIGNER SCAN          # 对准器扫描
ALIGNER ALGN          # 执行对准</code><p><code>RQ ALIGNER RQID       # 查询对准器 ID</code></p></pre><p></p><h4>SET/RQ/STORE ALIGNER MODE — 对准器模式</h4>
<pre><code>SET ALIGNER identifier MODE (SINGLE_ROBOT|MULTI_ROBOT)
RQ ALIGNER identifier MODE
STORE ALIGNER identifier MODE</code></pre>
<ul>
<li><strong>SINGLE_ROBOT</strong> — 系统中只有一个对准器（WAVE 模式）</li>
<li><strong>MULTI_ROBOT</strong> — 系统中有多个对准器（WAVE II 模式）</li>
</ul>
<h4>RQ ALIGN OFFSETS — 查询对准偏移</h4>
<pre><code>RQ ALIGN OFFSETS</code></pre>
<h4>HALT ALIGNER — 停止对准器</h4>
<pre><code>HALT ALIGNER</code></pre>
<h3>12.5 集成命令（PICK/PLACE/XFER + ALGN）</h3>
<p>对准器可与 PICK、PLACE、XFER 命令集成使用：</p>
<pre><code># PICK 后执行对准
PICK 1 ARM A ALGN
<section><h1>PLACE 前执行对准<a href="#place-前执行对准"><span>#</span></a></h1><p>PLACE 3 ARM A ALGN</p></section>
</code><section><code><h1>完整传送 + 对准<a href="#完整传送--对准"><span>#</span></a></h1></code><p><code>XFER 1 TO 3 ARM A ALGN</code></p></section></pre><p></p><p><strong>集成命令行为：</strong></p>
<ul>
<li><strong>XFER + ALGN</strong>：PICK 后，放至对准器对准，再 PLACE 到目标工位</li>
<li>对准器错误以 <code>ALGN_ERR</code> 前缀报告</li>
</ul>
<p><strong>对准器错误报告格式：</strong></p>
<pre><code>ALGN_ERR 0041     # 对准器报告错误代码 41</code></pre>
<hr />
<h2>第十三章 示教器操作 (Teach Pendant)</h2>
<h3>13.1 Liveman 示教器安全须知</h3>
<pre><code>╔══════════════════════════════════════════════════════════════════╗
║  ⚠️  示教器安全警告                                              ║
║                                                                  ║
║  • 在机器人工作空间内操作时，始终使用 Liveman 示教器               ║
║  • Liveman 开关必须持续握紧才能允许机器人运动                     ║
║  • 释放 Liveman 开关将立即停止机器人运动                          ║
║  • 示教模式下没有减速安全联锁                                     ║
║  • 确认示教器上的 E-Stop 按钮已释放再开始操作                     ║
╚══════════════════════════════════════════════════════════════════╝</code></pre>
<h3>13.2 示教器基本操作</h3>
<p><strong>开机与连接：</strong></p>
<ol>
<li>将示教器电缆连接到机器人</li>
<li>确认 E-Stop 按钮已释放</li>
<li>打开示教器 → 显示功能屏幕 (Function Screen)</li>
</ol>
<p><strong>获取控制权：</strong></p>
<pre><code>步骤 1: 完全释放 Liveman 开关
步骤 2: 按 Home 按钮 → 显示 Home Axis 屏幕
步骤 3: 按 All 按钮 → 显示 Get Control 屏幕
步骤 4: 按 CR YES → 示教器获取机器人控制权
步骤 5: 按 Quit 返回功能屏幕</code></pre>
<p><strong>归零操作：</strong></p>
<pre><code>步骤 1: 按 Home 按钮 → 显示 Home Axis 屏幕
步骤 2: 握紧 Liveman 开关（状态变为 "Engaged"）
步骤 3: 按 All 按钮 → 机器人开始归零
步骤 4: 归零完成后示教器发出蜂鸣声
步骤 5: 释放 Liveman 开关</code></pre>
<blockquote>
<p>⚠️ 归零过程中必须始终握紧 Liveman 开关，否则机器人将停止运动。</p>
</blockquote>
<h3>13.3 工位示教流程</h3>
<p>以下是通过 Liveman 示教器使用 Jog 方式示教工位的完整流程：</p>
<h4>步骤一：进入工位设置</h4>
<pre><code>1. 按 F3 (Setup Robot) → 显示 Setup 屏幕
2. 按 2 (Stations) → 显示 Arm Selection 屏幕
3. 选择要示教的臂（如 Arm A）→ 显示 Station 屏幕
4. 输入工位编号（如 Station 1）
5. 按 CR YES 确认</code></pre>
<h4>步骤二：示教 R/T 位置（Learn R, T, BTO）</h4>
<pre><code>1. 从 Teach Selection 屏幕选择 (2) Learn R,T,BTO
2. 从 Teach Options 屏幕选择 (2) Jog
3. 握紧 Liveman 开关
4. 使用键盘 Jog 按钮移动末端执行器到工位位置：
   - 调整 R 轴（径向伸出/缩回）
   - 调整 T 轴（旋转角度）
   - 确认末端执行器中心对准工位中心
5. 末端执行器到位后释放 Liveman 开关
6. 按 Escape 返回</code></pre>
<h4>步骤三：存储位置</h4>
<pre><code>1. 选择 (1) Store → 显示 Store 屏幕
2. 选择要存储的轴（或按 CR YES 存储所有轴）
3. 存储后显示 "STORED"</code></pre>
<h4>步骤四：示教 Z 轴下位（Learn Lower）</h4>
<pre><code>1. 从 Teach Selection 屏幕选择 (3) Learn Lower
2. 选择 (2) Jog → 显示 Jog Z Status 屏幕
3. 握紧 Liveman 开关
4. 将末端执行器下移到下位（末端执行器缩回时能完全避开晶圆的位置）
5. 释放 Liveman 开关
6. 存储 Z 轴下位</code></pre>
<h4>步骤五：验证工位</h4>
<pre><code>1. 按 F2 (Move Arm / Transfer Wafer)
2. 选择 (3) Transfer Wafer with Arm A
3. 选择 (2) Place → 设置从哪个工位取片
4. 选择目标工位 → 机器人执行传送
5. 确认晶圆放置位置正确</code></pre>
<h4>步骤六：归还控制权</h4>
<pre><code>完成示教后，按 QUIT 返回功能屏幕，
将控制权归还给主机控制器。</code></pre>
<blockquote>
<p><strong>坐标键盘示教器</strong>的流程类似，但使用坐标式 Jog 按钮（R+/R-/T+/T-/Z+/Z-）。</p>
</blockquote>
<hr />
<h2>第十四章 错误代码参考</h2>
<h3>14.1 错误代码对照表</h3>
<h4>MT5/VT5 与 MagnaTran 7 错误代码对比</h4>
<table>
<thead>
<tr>
<th>MT5/VT5 错误号</th>
<th>MT5/VT5 错误描述</th>
<th>MAG7 错误号</th>
<th>MAG7 错误描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>411</td>
<td>Interlock Calc Overflow</td>
<td>408</td>
<td>Bad R Position</td>
</tr>
<tr>
<td>412</td>
<td>Invalid Arm Locate</td>
<td>—</td>
<td>无对应</td>
</tr>
<tr>
<td>413</td>
<td>Invalid Wafer Size</td>
<td>—</td>
<td>无对应</td>
</tr>
<tr>
<td>501</td>
<td>Internal Error</td>
<td>—</td>
<td>无对应</td>
</tr>
<tr>
<td>502</td>
<td>ESC CDM Error</td>
<td>—</td>
<td>无对应</td>
</tr>
<tr>
<td>503</td>
<td>Void Error</td>
<td>—</td>
<td>无对应</td>
</tr>
<tr>
<td>708</td>
<td>Pick Failed</td>
<td>721</td>
<td>Pick Failed</td>
</tr>
<tr>
<td>709</td>
<td>Place Failed</td>
<td>722</td>
<td>Place Failed</td>
</tr>
</tbody>
</table>
<h4>常见错误代码</h4>
<table>
<thead>
<tr>
<th>错误号</th>
<th>描述</th>
<th>可能原因</th>
</tr>
</thead>
<tbody>
<tr>
<td>603</td>
<td>Command Halted</td>
<td>HALT 命令被执行</td>
</tr>
<tr>
<td>408</td>
<td>Bad R Position</td>
<td>R 轴位置无效</td>
</tr>
<tr>
<td>721</td>
<td>Pick Failed</td>
<td>取片失败（传感器未检测到晶圆）</td>
</tr>
<tr>
<td>722</td>
<td>Place Failed</td>
<td>放片失败（传感器检测到晶圆仍在）</td>
</tr>
<tr>
<td>-3014</td>
<td>Homing Parameters Error</td>
<td>归零参数未正确设置</td>
</tr>
<tr>
<td>-3015</td>
<td>Encoder Calibration Data Missing</td>
<td>编码器校准数据缺失</td>
</tr>
</tbody>
</table>
<h3>14.2 常见错误与排查</h3>
<h4>伺服相关错误（-3000 ~ -3015）</h4>
<table>
<thead>
<tr>
<th>症状</th>
<th>可能原因</th>
<th>排查方法</th>
</tr>
</thead>
<tbody>
<tr>
<td>归零失败</td>
<td>电机初始化问题</td>
<td>检查电源连接，<code>RQ SERVOS</code> 查看状态</td>
</tr>
<tr>
<td>校准数据错误</td>
<td>编码器数据损坏</td>
<td>联系 Brooks 技术支持</td>
</tr>
<tr>
<td>安全速度违规</td>
<td>超出安全速度限制</td>
<td>检查外罩联锁状态</td>
</tr>
</tbody>
</table>
<h4>通信相关错误</h4>
<table>
<thead>
<tr>
<th>症状</th>
<th>可能原因</th>
<th>排查方法</th>
</tr>
</thead>
<tbody>
<tr>
<td>无响应</td>
<td>通信设置不匹配</td>
<td>检查波特率、数据位等设置</td>
</tr>
<tr>
<td>超时</td>
<td>连接问题</td>
<td>检查电缆连接，<code>RQ COMM ALL</code></td>
</tr>
<tr>
<td>校验和错误</td>
<td>数据传输错误</td>
<td><code>SET COMM CHECKSUM offa6</code> 关闭校验和</td>
</tr>
</tbody>
</table>
<h4>运动相关错误</h4>
<table>
<thead>
<tr>
<th>症状</th>
<th>可能原因</th>
<th>排查方法</th>
</tr>
</thead>
<tbody>
<tr>
<td>工位位置不准</td>
<td>工位未正确示教</td>
<td>重新示教工位，<code>RQ STN n ALL</code></td>
</tr>
<tr>
<td>取片/放片失败</td>
<td>传感器故障</td>
<td><code>RQ IO STATE</code> 检查传感器状态</td>
</tr>
<tr>
<td>工作空间违规</td>
<td>目标位置超出工作空间</td>
<td><code>RQ WSPACE name ALL</code> 检查范围</td>
</tr>
</tbody>
</table>
<hr />
<h2>第十五章 操作流程速查</h2>
<h3>15.1 完整初始化设置流程</h3>
<pre><code>┌────────────────────────────────────────────────────────┐
│              MAGNATRAN LEAP 完整初始化流程               │
├────────────────────────────────────────────────────────┤
│                                                        │
│  1. 确认物理连接                                        │
│     ├── Ethernet/串口 → HOST 端口                       │
│     ├── HD-Sub 26Pin → Safety I/O                      │
│     ├── D-Sub 50Pin → MISC I/O                         │
│     └── 电源连接                                        │
│                                                        │
│  2. 上电                                                │
│     └── 确认电源指示灯正常                               │
│                                                        │
│  3. 建立通信                                            │
│     ├── RQ WHO                    (验证连接)            │
│     └── RQ COMM ALL               (查看通信设置)        │
│                                                        │
│  4. 加载应用程序                                        │
│     ├── RQ CONFIG                  (查询当前应用)       │
│     └── CONFIG ROBOT APLIC id      (加载正确应用)       │
│                                                        │
│  5. 建立零点（如需要）                                   │
│     ├── RQ SYNC ZERO ALL           (查询零点)           │
│     ├── SET SERVOS OFF             (关闭伺服)           │
│     ├── 安装校零夹具                                     │
│     └── FIND ZERO ALL              (建立零点)           │
│                                                        │
│  6. 归零                                                │
│     └── HOME ALL                                        │
│                                                        │
│  7. 示教工位                                            │
│     ├── SET STN n ARM A R x T y Z z                     │
│     ├── STORE STN n ARM A ALL                           │
│     └── 重复每个工位                                     │
│                                                        │
│  8. 配置 I/O                                            │
│     ├── MAP 命令定义 I/O 映射                            │
│     └── STORE ALL                                       │
│                                                        │
│  9. 测试传送                                            │
│     ├── PICK n                     (取片测试)            │
│     └── PLACE m                    (放片测试)            │
│                                                        │
│  10. 存储所有配置                                        │
│      └── STORE ALL                                      │
│                                                        │
└────────────────────────────────────────────────────────┘</code></pre>
<h3>15.2 日常启动流程</h3>
<pre><code>步骤 1: 上电
步骤 2: RQ WHO                  → 确认通信正常
步骤 3: HOME ALL                → 机器人归零
步骤 4: RQ STN n ALL            → 确认工位参数
步骤 5: 开始正常运行</code></pre>
<h3>15.3 常用命令速查表</h3>
<h4>系统信息类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>RQ WHO</code></td>
<td>查询机器人身份和版本</td>
</tr>
<tr>
<td><code>RQ VERSION</code></td>
<td>查询固件版本和日期</td>
</tr>
<tr>
<td><code>RQ RVSN</code></td>
<td>查询零件号和修订号</td>
</tr>
<tr>
<td><code>RQ CONFIG</code></td>
<td>查询应用程序编号</td>
</tr>
<tr>
<td><code>RQ DATE</code></td>
<td>查询日期</td>
</tr>
<tr>
<td><code>RQ TIME</code></td>
<td>查询时间</td>
</tr>
<tr>
<td><code>RQ COMM ALL</code></td>
<td>查询所有通信设置</td>
</tr>
<tr>
<td><code>RQ ETHERNET</code></td>
<td>查询以太网配置</td>
</tr>
<tr>
<td><code>RQ COMPATIBILITY ALL</code></td>
<td>查询兼容性设置</td>
</tr>
</tbody>
</table>
<h4>运动控制类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>HOME ALL</code></td>
<td>所有轴归零</td>
</tr>
<tr>
<td><code>HOME R\|T\|Z</code></td>
<td>单轴归零</td>
</tr>
<tr>
<td><code>HALT</code></td>
<td>停止所有运动</td>
</tr>
<tr>
<td><code>RELEASE</code></td>
<td>释放伺服（受控停止）</td>
</tr>
<tr>
<td><code>MOVE ARM A R x T y Z z</code></td>
<td>移动到绝对坐标</td>
</tr>
<tr>
<td><code>SET SERVOS OFF</code></td>
<td>关闭伺服</td>
</tr>
<tr>
<td><code>RQ SERVOS</code></td>
<td>查询伺服状态</td>
</tr>
<tr>
<td><code>RQ POS ABS ALL</code></td>
<td>查询当前绝对位置</td>
</tr>
<tr>
<td><code>RQ TOTAL TRAVEL ALL</code></td>
<td>查询累计行程</td>
</tr>
</tbody>
</table>
<h4>工位操作类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SET STN n ARM A R x T y Z z</code></td>
<td>设置工位坐标</td>
</tr>
<tr>
<td><code>RQ STN n ALL</code></td>
<td>查询工位所有参数</td>
</tr>
<tr>
<td><code>RQ STN n ARM A ALL</code></td>
<td>查询指定臂的工位参数</td>
</tr>
<tr>
<td><code>STORE STN n ALL</code></td>
<td>存储工位参数</td>
</tr>
<tr>
<td><code>REMOVE STN n</code></td>
<td>删除工位</td>
</tr>
<tr>
<td><code>COPY STN n TO m</code></td>
<td>复制工位</td>
</tr>
</tbody>
</table>
<h4>晶圆传送类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GOTO N n R EX Z UP</code></td>
<td>移动到工位 n，伸出，Z上</td>
</tr>
<tr>
<td><code>GOTO N n R R1</code></td>
<td>移动到工位 n，缩回</td>
</tr>
<tr>
<td><code>PICK n</code></td>
<td>从工位 n 取片</td>
</tr>
<tr>
<td><code>PICK n SLOT s ARM A</code></td>
<td>从工位 n 第 s 槽用 A 臂取片</td>
</tr>
<tr>
<td><code>PLACE n</code></td>
<td>放片到工位 n</td>
</tr>
<tr>
<td><code>PLACE n SLOT s ARM B</code></td>
<td>用 B 臂放片到工位 n 第 s 槽</td>
</tr>
<tr>
<td><code>XFER n TO m ARM A</code></td>
<td>从工位 n 传送到工位 m</td>
</tr>
<tr>
<td><code>SET LOAD ON\|OFF</code></td>
<td>设置载荷状态</td>
</tr>
<tr>
<td><code>RQ LOAD</code></td>
<td>查询载荷状态</td>
</tr>
</tbody>
</table>
<h4>I/O 操作类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>MAP name type polarity dir mask</code></td>
<td>映射 I/O</td>
</tr>
<tr>
<td><code>RQ IO MAP ALL</code></td>
<td>查询所有 I/O 映射</td>
</tr>
<tr>
<td><code>REMOVE IO name</code></td>
<td>移除 I/O 映射</td>
</tr>
<tr>
<td><code>SET IO STATE name state</code></td>
<td>设置 I/O 状态</td>
</tr>
<tr>
<td><code>RQ IO STATE name</code></td>
<td>查询 I/O 状态</td>
</tr>
<tr>
<td><code>SET EVENT IO name code ENB</code></td>
<td>启用 I/O 事件</td>
</tr>
<tr>
<td><code>CONFIG IO DRIVE option</code></td>
<td>配置 I/O 模式</td>
</tr>
</tbody>
</table>
<h4>对准器类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ALIGNER HOME</code></td>
<td>对准器归零</td>
</tr>
<tr>
<td><code>ALIGNER SCAN</code></td>
<td>对准器扫描</td>
</tr>
<tr>
<td><code>ALIGNER ALGN</code></td>
<td>执行对准</td>
</tr>
<tr>
<td><code>SET ALIGNER n STN s DEV d</code></td>
<td>设置对准器</td>
</tr>
<tr>
<td><code>RQ ALIGNER n ALL</code></td>
<td>查询对准器参数</td>
</tr>
<tr>
<td><code>SET ALIGNER n WAFERID id</code></td>
<td>设置晶圆标识</td>
</tr>
</tbody>
</table>
<h4>AWC 类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SET WAF_CEN MODE ON\|OFF</code></td>
<td>设置 AWC 模式</td>
</tr>
<tr>
<td><code>SET STN n WAF_CEN ENABLE Y</code></td>
<td>启用工位 AWC</td>
</tr>
<tr>
<td><code>SET STN n WAF_CEN CAL_WITH_PICK Y</code></td>
<td>启用取片校准</td>
</tr>
<tr>
<td><code>FIND STN n WAF_CEN ALL</code></td>
<td>自动校准 AWC</td>
</tr>
<tr>
<td><code>RQ STN n WAF_CEN DATA</code></td>
<td>查询 AWC 数据</td>
</tr>
</tbody>
</table>
<h4>工作空间类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE WSPACE name</code></td>
<td>创建工作空间</td>
</tr>
<tr>
<td><code>SET WSPACE name STATE ACTIVE</code></td>
<td>激活工作空间</td>
</tr>
<tr>
<td><code>SET WSPACE MODE ON</code></td>
<td>开启工作空间模式</td>
</tr>
<tr>
<td><code>RQ WSPACE name ALL</code></td>
<td>查询工作空间参数</td>
</tr>
<tr>
<td><code>REMOVE WSPACE name</code></td>
<td>删除工作空间</td>
</tr>
</tbody>
</table>
<h4>存储类</h4>
<table>
<thead>
<tr>
<th>命令</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>STORE ALL</code></td>
<td>存储所有参数</td>
</tr>
<tr>
<td><code>STORE STN n ALL</code></td>
<td>存储指定工位</td>
</tr>
<tr>
<td><code>STORE COMM ALL</code></td>
<td>存储通信设置</td>
</tr>
<tr>
<td><code>STORE WSPACE name ALL</code></td>
<td>存储工作空间</td>
</tr>
</tbody>
</table>
<hr />
<h2>附录</h2>
<h3>附录 A: WAVE 到 LEAP 迁移说明</h3>
<p>从 WAVE/MAG7 软件迁移到 LEAP 时的主要注意事项：</p>
<p><strong>不再支持的命令：</strong></p>
<table>
<thead>
<tr>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>INIT ALIGNER</code></td>
<td>使用 <code>CONFIG LINK</code> + <code>SET DEV</code> 替代</td>
</tr>
</tbody>
</table>
<p><strong>主要改进：</strong></p>
<ul>
<li>WAVE II 模式支持多对准器系统</li>
<li>增强的错误报告（<code>ALGN_ERR</code> 格式）</li>
<li>支持通过集成命令操作对准器（PICK/PLACE/XFER + ALGN）</li>
<li>改进的晶圆检测功能</li>
</ul>
<h3>附录 B: 双独立机器人注意事项</h3>
<p>使用双独立机器人配置时：</p>
<ol>
<li>每个臂需要独立的工位坐标（ARM A / ARM B）</li>
<li>示教时需分别为两个臂示教每个工位</li>
<li>可使用 <code>COPY STN</code> 命令从 A 臂复制到 B 臂，然后微调</li>
<li>载荷状态需分别管理</li>
<li>注意双臂运动的干涉避免</li>
</ol>
<hr />
<blockquote>
<p><strong>技术支持联系方式</strong></p>
<p>Brooks Automation Technical Support</p>
<ul>
<li>PreciseFlex 系统: support_preciseflex@brooksautomation.com</li>
<li>技术资源中心: <a href="https://www.brooks.com">https://www.brooks.com</a></li>
<li>联系当地 Brooks 代表获取针对您设备序列号的具体文档</li>
</ul>
<p><strong>文档来源</strong></p>
<ul>
<li>238485 Leap Manual REV G (©2019 Brooks Automation)</li>
<li>278805 MAGNATRAN® LEAP™ Software Manual REV E (©2020 Brooks Automation)</li>
</ul>
</blockquote>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2025/11/14/debian-13-%E6%96%B0%E8%A3%85/</id>
      <title type="text">Debian 13 新装</title>
      <published>2025-11-14T00:00:00.000Z</published>
      <updated>2025-11-14T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2025/11/14/debian-13-%E6%96%B0%E8%A3%85/"/>
      <summary type="text">Debian 13 (Trixie) 完整自动化配置文档 文档说明 本文档汇总了 Debian 13 系统的完整配置流程，包含系统更新、网络加速、安全防护、开发环境和 Shell 美化等所有功能。 执行顺序 : 从上到下依次执行各代码块 一、系统更新与基础优化 #!/bin/bash # Debian 13 系统全面更新与基础配置 # 1.1 更新软件源并升</summary>
      <content type="html"><![CDATA[<h1>Debian 13 (Trixie) 完整自动化配置文档</h1>
<h2>文档说明</h2>
<p>本文档汇总了 Debian 13 系统的完整配置流程，包含系统更新、网络加速、安全防护、开发环境和 Shell 美化等所有功能。
<strong>执行顺序</strong>: 从上到下依次执行各代码块</p>
<hr />
<h2>一、系统更新与基础优化</h2>
<pre><code>#!/bin/bash
# Debian 13 系统全面更新与基础配置
<section><h1>1.1 更新软件源并升级系统<a href="#11-更新软件源并升级系统"><span>#</span></a></h1><p>echo “【步骤1】更新系统软件包…”
sudo apt update &amp;&amp; sudo apt upgrade -y</p></section>
<section><h1>1.2 安装基础工具<a href="#12-安装基础工具"><span>#</span></a></h1><p>echo “【步骤2】安装基础工具…”
sudo apt install -y <br />
curl wget git vim htop net-tools lsof <br />
apt-transport-https ca-certificates <br />
gnupg lsb-release software-properties-common</p></section>
<section><h1>1.3 清理旧版本软件包<a href="#13-清理旧版本软件包"><span>#</span></a></h1><p>echo “【步骤3】清理系统…”
sudo apt autoremove -y
sudo apt autoclean</p></section>
<section><h1>1.4 修复已知Bug（如主机名解析问题）<a href="#14-修复已知bug如主机名解析问题"><span>#</span></a></h1><p>echo “【步骤4】修复sudo主机名解析问题…”
CURRENT_HOSTNAME=<span>(hostname)
if ! grep -q &amp;quot;</span>CURRENT_HOSTNAME” /etc/hosts; then
echo “127.0.1.1 $CURRENT_HOSTNAME” | sudo tee -a /etc/hosts
echo ”✅ 已添加主机名映射”
else
echo ”✅ 主机名映射已存在”
fi</p></section>
<section><h1>1.5 系统参数优化<a href="#15-系统参数优化"><span>#</span></a></h1><p>echo “【步骤5】系统性能优化…”
sudo sysctl -w vm.swappiness=10
sudo bash -c ‘cat &gt; /etc/sysctl.d/99-system-optimize.conf &lt;&lt; EOF</p></section>
<section><h1>系统性能优化参数<a href="#系统性能优化参数"><span>#</span></a></h1><p>vm.swappiness = 10
fs.file-max = 1000000
fs.inotify.max_user_instances = 8192
EOF’
sudo sysctl -p /etc/sysctl.d/99-system-optimize.conf</p></section>
</code><section><code><h1>1.6 更新GRUB（如需要）<a href="#16-更新grub如需要"><span>#</span></a></h1><p>echo “【步骤6】更新GRUB引导…”
sudo update-grub
sudo update-initramfs -u</p></code><p><code>echo ”✅ 系统更新与优化完成！建议重启系统使部分更改生效”</code></p></section></pre><p></p><hr />
<h2>二、网络加速配置（BBR3启用）</h2>
<pre><code>#!/bin/bash
# Debian 13 BBR3 网络加速配置
# 注意：Debian 13内核6.12+已内置BBR v3，无需升级内核<p>echo “【BBR3配置】启用TCP BBR v3拥塞控制算法…”</p>
<section><h1>2.1 检查内核版本<a href="#21-检查内核版本"><span>#</span></a></h1><p>KERNEL_VERSION=<span>(uname -r | cut -d. -f1-2)
echo &amp;quot;当前内核版本: </span>KERNEL_VERSION”
if (( <span>(echo &amp;quot;</span>KERNEL_VERSION &gt;= 6.3” | bc -l) )); then
echo ”✅ 内核版本支持BBR v3”
else
echo “⚠️  内核版本过低，建议升级至6.3+”
fi</p></section>
<section><h1>2.2 创建BBR3配置文件<a href="#22-创建bbr3配置文件"><span>#</span></a></h1><p>sudo bash -c ‘cat &gt; /etc/sysctl.d/10-bbr.conf &lt;&lt; EOF</p></section>
<section><h1>TCP BBR v3 网络加速配置<a href="#tcp-bbr-v3-网络加速配置"><span>#</span></a></h1><p>net.core.default_qdisc = fq_pie
net.ipv4.tcp_congestion_control = bbr</p></section>
<section><h1>额外优化参数<a href="#额外优化参数"><span>#</span></a></h1><p>net.ipv4.tcp_notsent_lowat = 16384
net.ipv4.tcp_ecn = 1
EOF’</p></section>
<section><h1>2.3 应用配置<a href="#23-应用配置"><span>#</span></a></h1><p>sudo sysctl -p /etc/sysctl.d/10-bbr.conf</p></section>
<section><h1>2.4 验证BBR3是否生效<a href="#24-验证bbr3是否生效"><span>#</span></a></h1><p>echo “【验证】检查BBR3状态…”
sleep 1
if sysctl net.ipv4.tcp_congestion_control | grep -q “bbr”; then
echo ”✅ BBR已启用”
else
echo ”❌ BBR启用失败”
fi</p></section>
<section><h1>2.5 检查BBR版本<a href="#25-检查bbr版本"><span>#</span></a></h1><p>echo “【验证】检查BBR模块版本…”
if modinfo tcp_bbr 2&gt;/dev/null | grep -q “version:        3”; then
echo ”✅ BBR v3 已成功加载”
modinfo tcp_bbr | grep version
else
echo “⚠️  当前为BBR v1/v2，但功能已启用”
fi</p></section>
<section><h1>2.6 TCP窗口优化（可选）<a href="#26-tcp窗口优化可选"><span>#</span></a></h1><p>echo “【优化】调整TCP窗口参数…”
sudo bash -c ‘cat &gt;&gt; /etc/sysctl.d/10-bbr.conf &lt;&lt; EOF</p></section>
</code><section><code><h1>TCP窗口优化<a href="#tcp窗口优化"><span>#</span></a></h1><p>net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
EOF’
sudo sysctl -p /etc/sysctl.d/10-bbr.conf</p></code><p><code>echo ”✅ BBR3网络加速配置完成！建议重启使所有参数生效”</code></p></section></pre><p></p><hr />
<h2>三、SSH安全防护配置</h2>
<pre><code>#!/bin/bash
# Debian 13 SSH安全加固与防护软件安装<p>echo “【SSH安全】配置Fail2ban和基础SSH加固…”</p>
<section><h1>3.1 修改SSH默认端口（推荐）<a href="#31-修改ssh默认端口推荐"><span>#</span></a></h1><p>echo “【步骤1】修改SSH端口…”
read -p “请输入新的SSH端口 (默认2222): ” NEW_SSH_PORT
NEW_SSH_PORT=<span>{NEW_SSH_PORT:-2222}
sudo sed -i &amp;quot;s/#Port 22/Port </span>NEW_SSH_PORT/” /etc/ssh/sshd_config
sudo sed -i “s/Port 22/Port <span>NEW_SSH_PORT/&amp;quot; /etc/ssh/sshd_config
echo &amp;quot;✅ SSH端口已修改为: </span>NEW_SSH_PORT”</p></section>
<section><h1>3.2 禁止root登录SSH<a href="#32-禁止root登录ssh"><span>#</span></a></h1><p>sudo sed -i ‘s/#PermitRootLogin yes/PermitRootLogin no/’ /etc/ssh/sshd_config
sudo sed -i ‘s/PermitRootLogin yes/PermitRootLogin no/’ /etc/ssh/sshd_config
echo ”✅ 已禁止root登录”</p></section>
<section><h1>3.3 安装Fail2ban<a href="#33-安装fail2ban"><span>#</span></a></h1><p>echo “【步骤2】安装Fail2ban…”
sudo apt install -y fail2ban</p></section>
<section><h1>3.4 配置Fail2ban<a href="#34-配置fail2ban"><span>#</span></a></h1><p>sudo bash -c ‘cat &gt; /etc/fail2ban/jail.local &lt;&lt; EOF
[sshd]
enabled = true
port = ‘$NEW_SSH_PORT’
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 ::1
EOF’</p></section>
<section><h1>3.5 启动Fail2ban服务<a href="#35-启动fail2ban服务"><span>#</span></a></h1><p>sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
echo ”✅ Fail2ban已启动并配置完成”</p></section>
<section><h1>3.6 配置UFW防火墙<a href="#36-配置ufw防火墙"><span>#</span></a></h1><p>echo “【步骤3】配置防火墙…”
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow $NEW_SSH_PORT/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw —force enable
sudo ufw status verbose
echo ”✅ 防火墙配置完成”</p></section>
</code><section><code><h1>3.7 提示重启SSH服务<a href="#37-提示重启ssh服务"><span>#</span></a></h1><p>echo “⚠️  需要重启SSH服务以应用端口更改”
read -p “是否立即重启SSH服务? (y/n): ” RESTART_SSH
if [[ <span>RESTART_SSH == &amp;quot;y&amp;quot; ]]; then
  sudo systemctl restart sshd
  echo &amp;quot;✅ SSH服务已重启，请使用新端口 </span>NEW_SSH_PORT 重新连接”
else
echo “⚠️  请稍后手动重启SSH服务: sudo systemctl restart sshd”
fi</p></code><p><code>echo ”✅ SSH安全防护配置完成！”</code></p></section></pre><p></p><hr />
<h2>四、系统安全与防病毒</h2>
<pre><code>#!/bin/bash
# Debian 13 系统安全加固与ClamAV安装<p>echo “【系统安全】安装ClamAV防病毒软件…”</p>
<section><h1>4.1 安装ClamAV<a href="#41-安装clamav"><span>#</span></a></h1><p>sudo apt install -y clamav clamav-daemon clamav-freshclam</p></section>
<section><h1>4.2 更新病毒库<a href="#42-更新病毒库"><span>#</span></a></h1><p>sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam</p></section>
<section><h1>4.3 启用ClamAV服务<a href="#43-启用clamav服务"><span>#</span></a></h1><p>sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
echo ”✅ ClamAV防病毒系统已安装”</p></section>
<section><h1>4.4 设置每周定时扫描<a href="#44-设置每周定时扫描"><span>#</span></a></h1><p>sudo bash -c ‘cat &gt; /etc/cron.weekly/clamav-scan &lt;&lt; EOF
#!/bin/bash
LOGFILE=“/var/log/clamav/weekly-scan-$(date +%Y%m%d).log”
clamscan -r -i /home —log=$LOGFILE
EOF’
sudo chmod +x /etc/cron.weekly/clamav-scan
echo ”✅ 已配置每周自动扫描”</p></section>
<section><h1>4.5 安全审计工具（可选）<a href="#45-安全审计工具可选"><span>#</span></a></h1><p>echo “【可选】安装安全审计工具…”
sudo apt install -y lynis chkrootkit rkhunter
echo ”✅ 安全审计工具已安装”</p></section>
</code><section><code><h1>4.6 系统日志监控<a href="#46-系统日志监控"><span>#</span></a></h1></code><p><code>sudo apt install -y logwatch
sudo bash -c ‘cat &gt; /etc/logwatch/conf/logwatch.conf &lt;&lt; EOF
MailTo = root
Detail = Med
Range = yesterday
EOF’
echo ”✅ 日志监控已配置”</code></p></section></pre><p></p><hr />
<h2>五、Node.js开发环境安装</h2>
<pre><code>#!/bin/bash
# Debian 13 Node.js 开发环境配置<p>echo “【开发环境】安装Node.js和npm…”</p>
<section><h1>5.1 安装Node.js 20.x LTS（推荐）<a href="#51-安装nodejs-20x-lts推荐"><span>#</span></a></h1><p>curl -fsSL <a href="https://deb.nodesource.com/setup_20.x" target="_blank">https://deb.nodesource.com/setup_20.x</a> | sudo -E bash -
sudo apt install -y nodejs</p></section>
<section><h1>5.2 验证安装<a href="#52-验证安装"><span>#</span></a></h1><p>node —version
npm —version</p></section>
<section><h1>5.3 更新npm到最新版<a href="#53-更新npm到最新版"><span>#</span></a></h1><p>sudo npm install -g npm@latest</p></section>
<section><h1>5.4 配置npm全局安装路径（避免权限问题）<a href="#54-配置npm全局安装路径避免权限问题"><span>#</span></a></h1><p>mkdir -p /.npm-global
npm config set prefix ‘/.npm-global’
echo ‘export PATH=~/.npm-global/bin:<span>PATH&amp;#039; &amp;gt;&amp;gt; ~/.bashrc
echo &amp;#039;export PATH=~/.npm-global/bin:</span>PATH’ &gt;&gt; ~/.zshrc</p></section>
</code><section><code><h1>5.5 安装常用全局工具<a href="#55-安装常用全局工具"><span>#</span></a></h1><p>npm install -g <br />
pm2 <br />
yarn <br />
pnpm <br />
@vue/cli <br />
create-react-app</p></code><p><code>echo ”✅ Node.js开发环境配置完成”</code></p></section></pre><p></p><hr />
<h2>六、Shell环境自动化配置（Zsh）</h2>
<pre><code>#!/bin/bash
# Debian 13 Zsh + Powerlevel10k 完美配置<p>echo “【Shell配置】卸载Powerline并安装Zsh…”</p>
<section><h1>6.1 卸载Powerline（如果存在）<a href="#61-卸载powerline如果存在"><span>#</span></a></h1><p>sudo apt remove -y powerline fonts-powerline
sudo rm -rf /usr/share/powerline
sed -i ‘/powerline/d’ ~/.bashrc
sed -i ‘/POWERLINE/d’ ~/.bashrc
fc-cache -f -v
echo ”✅ Powerline已卸载”</p></section>
<section><h1>6.2 安装Zsh和基础工具<a href="#62-安装zsh和基础工具"><span>#</span></a></h1><p>sudo apt install -y zsh git wget curl fonts-firacode</p></section>
<section><h1>6.3 安装Oh My Zsh（无交互模式）<a href="#63-安装oh-my-zsh无交互模式"><span>#</span></a></h1><p>sh -c ”$(wget -O- <a href="https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh" target="_blank">https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh</a>)” "" —unattended</p></section>
<section><h1>6.4 安装Powerlevel10k主题<a href="#64-安装powerlevel10k主题"><span>#</span></a></h1><p>git clone —depth=1 <a href="https://github.com/romkatv/powerlevel10k.git" target="_blank">https://github.com/romkatv/powerlevel10k.git</a> <span>{ZSH_CUSTOM:-</span>HOME/.oh-my-zsh/custom}/themes/powerlevel10k</p></section>
<section><h1>6.5 安装Nerd Font字体<a href="#65-安装nerd-font字体"><span>#</span></a></h1><p>mkdir -p ~/.local/share/fonts
wget -O ~/.local/share/fonts/FiraCodeNerdFont-Regular.ttf <br />
<a href="https://github.com/ryanoasis/nerd-fonts/raw/master/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf" target="_blank">https://github.com/ryanoasis/nerd-fonts/raw/master/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf</a>
fc-cache -fv</p></section>
<section><h1>6.6 安装Oh My Zsh插件<a href="#66-安装oh-my-zsh插件"><span>#</span></a></h1><p>git clone —depth=1 <a href="https://github.com/zsh-users/zsh-autosuggestions" target="_blank">https://github.com/zsh-users/zsh-autosuggestions</a> <span>{ZSH_CUSTOM:-</span>HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone —depth=1 <a href="https://github.com/zsh-users/zsh-syntax-highlighting.git" target="_blank">https://github.com/zsh-users/zsh-syntax-highlighting.git</a> <span>{ZSH_CUSTOM:-</span>HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
sudo apt install -y autojump command-not-found</p></section>
<section><h1>6.7 生成完整.zshrc配置<a href="#67-生成完整zshrc配置"><span>#</span></a></h1><p>cat &gt; ~/.zshrc &lt;&lt; ‘EOF’</p></section>
<section><h1>Enable Powerlevel10k instant prompt<a href="#enable-powerlevel10k-instant-prompt"><span>#</span></a></h1><p>if [[ -r “<span>{XDG_CACHE_HOME:-</span>HOME/.cache}/p10k-instant-prompt-<span>{(%):-%n}.zsh&amp;quot; ]]; then
  source &amp;quot;</span>{XDG_CACHE_HOME:-<span>HOME/.cache}/p10k-instant-prompt-</span>{(%):-%n}.zsh”
fi</p></section>
<section><h1>Path to Oh My Zsh<a href="#path-to-oh-my-zsh"><span>#</span></a></h1><p>export ZSH=“$HOME/.oh-my-zsh”</p></section>
<section><h1>Theme configuration<a href="#theme-configuration"><span>#</span></a></h1><p>ZSH_THEME=“powerlevel10k/powerlevel10k”</p></section>
<section><h1>Plugin configuration<a href="#plugin-configuration"><span>#</span></a></h1><p>plugins=(
git
docker
docker-compose
kubectl
zsh-autosuggestions
zsh-syntax-highlighting
autojump
command-not-found
colored-man-pages
extract
history-substring-search
)</p><p>source $ZSH/oh-my-zsh.sh</p></section>
<section><h1>History configuration<a href="#history-configuration"><span>#</span></a></h1><p>export HISTSIZE=100000
export HISTFILESIZE=100000
export HISTCONTROL=ignoredups
export HISTTIMEFORMAT=“%F %T ”
setopt SHARE_HISTORY</p></section>
<section><h1>Completion configuration<a href="#completion-configuration"><span>#</span></a></h1><p>autoload -U compinit &amp;&amp; compinit
zstyle ‘:completion:<em>’ menu select
zstyle ‘:completion:</em>’ list-colors ”${(@s.:.)LS_COLORS}”</p></section>
<section><h1>Aliases<a href="#aliases"><span>#</span></a></h1><p>alias ll=‘ls -alhF —color=auto’
alias la=‘ls -A’
alias l=‘ls -CF’
alias grep=‘grep —color=auto’
alias df=‘df -h’
alias du=‘du -sh’
alias ..=‘cd ..’
alias …=‘cd ../..’
alias zshconfig=‘nano ~/.zshrc’
alias reloadzsh=‘source ~/.zshrc’</p></section>
<section><h1>kubectl &amp; Docker completion<a href="#kubectl--docker-completion"><span>#</span></a></h1><p>[[ <span>commands[kubectl] ]] &amp;amp;&amp;amp; source &amp;lt;(kubectl completion zsh)
[[ </span>commands[docker] ]] &amp;&amp; source &lt;(docker completion zsh)</p></section>
<section><h1>autojump<a href="#autojump"><span>#</span></a></h1><p><a href="/posts/-s%20/usr/share/autojump/autojump.sh/">-s /usr/share/autojump/autojump.sh</a> &amp;&amp; source /usr/share/autojump/autojump.sh</p></section>
<section><h1>Powerlevel10k configuration<a href="#powerlevel10k-configuration"><span>#</span></a></h1><p><a href="/posts/!%20-f%20~/.p10k.zsh/">! -f ~/.p10k.zsh</a> || source ~/.p10k.zsh
EOF</p></section>
<section><h1>6.8 设置Zsh为默认Shell<a href="#68-设置zsh为默认shell"><span>#</span></a></h1><p>chsh -s $(which zsh)</p><p>echo ”✅ Zsh基础配置完成！”</p></section>
</code><section><code><h1>6.9 提示用户手动配置Powerlevel10k<a href="#69-提示用户手动配置powerlevel10k"><span>#</span></a></h1></code><p><code>echo “⚠️  接下来需要手动启动Zsh完成Powerlevel10k配置”
echo “请执行: zsh”
echo “然后按照Powerlevel10k配置向导的提示进行选择”
echo “推荐选择: Rainbow主题, Unicode字符集, 24小时制时间”</code></p></section></pre><p></p><hr />
<h2>七、系统验证与测试</h2>
<pre><code>#!/bash/bash
# Debian 13 配置完整性验证脚本<p>echo “【系统验证】检查所有配置是否生效…”</p>
<section><h1>7.1 系统版本验证<a href="#71-系统版本验证"><span>#</span></a></h1><p>echo ”=== 系统版本 ===”
cat /etc/os-release
uname -r</p></section>
<section><h1>7.2 BBR3验证<a href="#72-bbr3验证"><span>#</span></a></h1><p>echo -e “\n=== BBR3状态 ===”
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
lsmod | grep bbr</p></section>
<section><h1>7.3 SSH安全验证<a href="#73-ssh安全验证"><span>#</span></a></h1><p>echo -e “\n=== SSH安全 ===”
sudo fail2ban-client status sshd
sudo ufw status verbose
sudo grep “Port” /etc/ssh/sshd_config | grep -v ”^#”</p></section>
<section><h1>7.4 防病毒验证<a href="#74-防病毒验证"><span>#</span></a></h1><p>echo -e “\n=== ClamAV状态 ===”
sudo systemctl is-active clamav-daemon
sudo systemctl is-enabled clamav-daemon
clamscan —version</p></section>
<section><h1>7.5 Node.js验证<a href="#75-nodejs验证"><span>#</span></a></h1><p>echo -e “\n=== Node.js环境 ===”
node —version
npm —version
echo “npm全局路径: $(npm config get prefix)”</p></section>
</code><section><code><h1>7.6 Zsh验证<a href="#76-zsh验证"><span>#</span></a></h1><p>echo -e “\n=== Zsh环境 ===”
zsh —version
echo “当前Shell: $SHELL”
if [ -f ~/.oh-my-zsh/oh-my-zsh.sh ]; then
echo ”✅ Oh My Zsh已安装”
else
echo ”❌ Oh My Zsh未安装”
fi</p></code><p><code>echo -e “\n=== 验证脚本执行完成 ===”
echo “如果所有检查项都显示正常，说明配置成功！”
echo “建议执行 ‘sudo reboot’ 重启系统使所有更改完全生效”</code></p></section></pre><p></p><hr />
<h2>八、一键执行所有配置（主脚本）</h2>
<pre><code>#!/bin/bash
# Debian 13 完整自动化配置主脚本
# 执行时间：约15-30分钟（取决于网络速度）<p>set -e  # 遇到错误立即退出</p><p>echo ”==========================================”
echo “Debian 13 完整自动化配置脚本”
echo “执行时间: $(date)”
echo ”==========================================”</p>
<section><h1>步骤1: 系统更新与优化<a href="#步骤1-系统更新与优化"><span>#</span></a></h1><p>echo “【阶段1/7】系统更新与优化…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/01-system-update.sh" target="_blank">https://your-domain.com/config/01-system-update.sh</a>)</p></section>
<section><h1>步骤2: BBR3网络加速<a href="#步骤2-bbr3网络加速"><span>#</span></a></h1><p>echo “【阶段2/7】配置BBR3网络加速…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/02-bbr3.sh" target="_blank">https://your-domain.com/config/02-bbr3.sh</a>)</p></section>
<section><h1>步骤3: SSH安全防护<a href="#步骤3-ssh安全防护"><span>#</span></a></h1><p>echo “【阶段3/7】配置SSH安全防护…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/03-ssh-security.sh" target="_blank">https://your-domain.com/config/03-ssh-security.sh</a>)</p></section>
<section><h1>步骤4: 防病毒系统<a href="#步骤4-防病毒系统"><span>#</span></a></h1><p>echo “【阶段4/7】安装防病毒软件…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/04-antivirus.sh" target="_blank">https://your-domain.com/config/04-antivirus.sh</a>)</p></section>
<section><h1>步骤5: Node.js环境<a href="#步骤5-nodejs环境"><span>#</span></a></h1><p>echo “【阶段5/7】安装Node.js开发环境…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/05-nodejs.sh" target="_blank">https://your-domain.com/config/05-nodejs.sh</a>)</p></section>
<section><h1>步骤6: Zsh配置<a href="#步骤6-zsh配置"><span>#</span></a></h1><p>echo “【阶段6/7】配置Zsh Shell环境…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/06-zsh.sh" target="_blank">https://your-domain.com/config/06-zsh.sh</a>)</p></section>
</code><section><code><h1>步骤7: 系统验证<a href="#步骤7-系统验证"><span>#</span></a></h1><p>echo “【阶段7/7】验证所有配置…”
/bin/bash &lt;(curl -s <a href="https://your-domain.com/config/07-validation.sh" target="_blank">https://your-domain.com/config/07-validation.sh</a>)</p></code><p><code>echo ”==========================================”
echo ”✅ 所有配置已完成！”
echo “请执行 ‘sudo reboot’ 重启系统”
echo “重启后执行 ‘zsh’ 完成Powerlevel10k配置”
echo ”==========================================”</code></p></section></pre><p></p><hr />
<h2>附录：常用维护命令</h2>
<pre><code># 系统更新
sudo apt update &amp;&amp; sudo apt upgrade -y &amp;&amp; sudo apt autoremove -y
<section><h1>BBR3状态检查<a href="#bbr3状态检查"><span>#</span></a></h1><p>sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc</p></section>
<section><h1>Fail2ban管理<a href="#fail2ban管理"><span>#</span></a></h1><p>sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip &lt;IP&gt;</p></section>
<section><h1>ClamAV手动扫描<a href="#clamav手动扫描"><span>#</span></a></h1><p>sudo clamscan -r -i /home</p></section>
<section><h1>Node.js版本切换（如使用nvm）<a href="#nodejs版本切换如使用nvm"><span>#</span></a></h1></section>
<section><h1>nvm install —lts &amp;&amp; nvm use —lts<a href="#nvm-install-lts--nvm-use-lts"><span>#</span></a></h1></section>
<section><h1>Zsh重新配置<a href="#zsh重新配置"><span>#</span></a></h1><p>p10k configure</p></section>
</code><section><code><h1>查看系统日志<a href="#查看系统日志"><span>#</span></a></h1></code><p><code>sudo journalctl -xe
cat /var/log/fail2ban.log</code></p></section></pre><p></p><hr />
<p><strong>文档版本</strong>: 1.0<br />
<strong>适用系统</strong>: Debian 13 (Trixie)<br />
<strong>最后更新</strong>: 2025年11月<br />
<strong>注意事项</strong>: 生产环境建议在测试服务器验证后再执行</p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/10/12/%E6%A8%A1%E7%B3%8Apid%E6%8E%A7%E5%88%B6%E5%8A%A0%E7%83%AD%E5%99%A8%E7%B3%BB%E7%BB%9F%E4%BB%BF%E7%9C%9F/</id>
      <title type="text">模糊PID控制加热器系统仿真</title>
      <published>2024-10-12T00:00:00.000Z</published>
      <updated>2025-11-14T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/10/12/%E6%A8%A1%E7%B3%8Apid%E6%8E%A7%E5%88%B6%E5%8A%A0%E7%83%AD%E5%99%A8%E7%B3%BB%E7%BB%9F%E4%BB%BF%E7%9C%9F/"/>
      <summary type="text">模糊PID控制加热器系统仿真 目录 模糊PID控制加热器系统仿真 目录 引言 系统概述 数学模型 隶属度函数 S形函数 Z形函数 三角形函数 模糊PID控制器 模糊化 规则库 解模糊 PID控制器 加热器系统动力学 Smith预估器 仿真流程 性能指标 用户界面 结论 附件 引言 本文提供了由自适应模糊PID控制器和Smith预估器控制的加热器系统仿真模型的</summary>
      <content type="html"><![CDATA[<h1>模糊PID控制加热器系统仿真</h1>
<h2>目录</h2>
<ul>
<li><a href="#模糊pid控制加热器系统仿真">模糊PID控制加热器系统仿真</a>
<ul>
<li><a href="#目录">目录</a></li>
<li><a href="#引言">引言</a></li>
<li><a href="#系统概述">系统概述</a></li>
<li><a href="#数学模型">数学模型</a></li>
<li><a href="#隶属度函数">隶属度函数</a>
<ul>
<li><a href="#s形函数">S形函数</a></li>
<li><a href="#z形函数">Z形函数</a></li>
<li><a href="#三角形函数">三角形函数</a></li>
</ul></li>
<li><a href="#模糊pid控制器">模糊PID控制器</a>
<ul>
<li><a href="#模糊化">模糊化</a></li>
<li><a href="#规则库">规则库</a></li>
<li><a href="#解模糊">解模糊</a></li>
</ul></li>
<li><a href="#pid控制器">PID控制器</a></li>
<li><a href="#加热器系统动力学">加热器系统动力学</a></li>
<li><a href="#smith预估器">Smith预估器</a></li>
<li><a href="#仿真流程">仿真流程</a></li>
<li><a href="#性能指标">性能指标</a></li>
<li><a href="#用户界面">用户界面</a></li>
<li><a href="#结论">结论</a></li>
<li>
<h2><a href="#附件">附件</a></h2>
</li>
</ul></li>
</ul>
<h2>引言</h2>
<p>本文提供了由自适应模糊PID控制器和Smith预估器控制的加热器系统仿真模型的完整算法仿真。该系统旨在通过根据设定值变化调整加热器的功率输出，最小化超调量、稳态误差和稳定时间来调节加热器的温度。</p>
<hr />
<h2>系统概述</h2>
<p>该仿真包含几个相互连接的组件：</p>
<ol>
<li><strong>加热器系统</strong>: 模拟加热器的热力学特性，包括热输入、环境热损失和功率限制。</li>
<li><strong>PID控制器</strong>: 传统的比例-积分-微分控制器，根据误差反馈计算控制信号。</li>
<li><strong>模糊PID控制器</strong>: 通过使用模糊逻辑根据当前误差和误差率自适应调整PID参数（Kp、Ki、Kd）来增强PID控制器。</li>
<li><strong>Smith预估器</strong>: 补偿系统延迟，并在存在死区时间的情况下提高控制器的性能。</li>
<li><strong>仿真框架</strong>: 协调这些组件之间的交互，应用设定值更改并记录系统性能指标。</li>
<li><strong>用户界面</strong>: 可视化系统响应、控制信号、PID参数和性能指标，并允许通过交互式滑块进行实时调整。</li>
</ol>
<hr />
<h2>数学模型</h2>
<h3>隶属度函数</h3>
<p>隶属度函数（MFs）是模糊逻辑的基础，定义了每个输入在每个模糊集中的隶属程度。该仿真使用三种类型的隶属度函数：S形、Z形和三角形。</p>
<h4>S形函数</h4>
<p><strong>定义:</strong></p>
<p>S形函数用于模拟从低隶属度值逐渐增加到高隶属度值的模糊集。</p>
<p>对于给定的输入 [latex]x[/latex]，参数 [latex]a[/latex] 和 [latex]b[/latex] 定义了过渡：</p>
<p>[latex]\displaystyle
\text{s_shaped}(x, a, b) =\begin{cases} 0 &amp; \text{if } x \leq a \
2 \left( \frac{x - a}{b - a} \right)^2 &amp; \text{if } a &lt; x \leq \frac{a + b}{2} \1 - 2 \left( \frac{b - x}{b - a} \right)^2 &amp; \text{if } \frac{a + b}{2} &lt; x &lt; b \1 &amp; \text{if } x \geq b
\end{cases}
[/latex]</p>
<h4>Z形函数</h4>
<p><strong>定义:</strong></p>
<p>Z形函数模拟从高隶属度值平滑递减到低隶属度值的模糊集。</p>
<p>对于给定的输入 [latex]x[/latex]，参数 [latex]a[/latex] 和 [latex]b[/latex] 定义了过渡：</p>
<p>[latex]\displaystyle
\text{z_shaped}(x, a, b) =
\begin{cases}
1 &amp; \text{if } x \leq a \
1 - 2 \left( \frac{x - a}{b - a} \right)^2 &amp; \text{if } a &lt; x \leq \frac{a + b}{2} \
2 \left( \frac{b - x}{b - a} \right)^2 &amp; \text{if } \frac{a + b}{2} &lt; x &lt; b \
0 &amp; \text{if } x \geq b
\end{cases}
[/latex]</p>
<h4>三角形函数</h4>
<p><strong>定义:</strong></p>
<p>三角形函数创建一个简单的、对称的模糊集，在中心点达到峰值。</p>
<p>对于给定的输入 [latex]x[/latex]，参数 [latex]a[/latex], [latex]b[/latex], 和 [latex]c[/latex] 定义了三角形：</p>
<p>[latex]\displaystyle
\text{tri}(x, a, b, c) =
\begin{cases}
0 &amp; \text{if } x \leq a \text{ or } x \geq c \
\frac{x - a}{b - a} &amp; \text{if } a &lt; x \leq b \
\frac{c - x}{c - b} &amp; \text{if } b &lt; x &lt; c \
0 &amp; \text{otherwise}
\end{cases}
[/latex]</p>
<h3>模糊PID控制器</h3>
<p>模糊PID控制器使用模糊逻辑根据当前误差 ([latex]E[/latex]) 和误差导数 ([latex]dE[/latex]) 自适应地调整PID参数。</p>
<h4>模糊化</h4>
<p><strong>过程:</strong></p>
<ol>
<li>
<p><strong>输入变量</strong>:</p>
<ul>
<li><strong>误差 ([latex]E[/latex])</strong>: 设定值与过程变量之间的偏差。</li>
<li><strong>误差导数 ([latex]dE[/latex])</strong>: 误差的变化率。</li>
</ul>
</li>
<li>
<p><strong>模糊化</strong>:</p>
<ul>
<li>每个输入变量都被分配到七个模糊集的隶属度：NB（负大）、NM（负中）、NS（负小）、ZE（零）、PS（正小）、PM（正中）、PB（正大）。</li>
<li>使用上面定义的隶属度函数计算隶属度。</li>
</ul>
</li>
</ol>
<p><strong>数学表示:</strong></p>
<p>[latex]\displaystyle
\mu<em>E(\text{Label}) = \text{MembershipFunction}(E, \text{parameters})
[/latex]
[latex]\displaystyle
\mu</em>{dE}(\text{Label}) = \text{MembershipFunction}(dE, \text{parameters})
[/latex]</p>
<h4>规则库</h4>
<p><strong>结构:</strong></p>
<p>一个 7x7 规则矩阵定义了 [latex]E[/latex] 和 [latex]dE[/latex] 的组合如何映射到 PID 参数的调整 ([latex]\Delta K_p[/latex], [latex]\Delta K_i[/latex], [latex]\Delta K_d[/latex])。</p>
<p><strong>规则示例:</strong></p>
<p>如果 [latex]E[/latex] 为 NB 且 [latex]dE[/latex] 为 PB，则：</p>
<p>[latex]\displaystyle
\begin{aligned}
\Delta K_p &amp;= \text{output_map_Kp}['PB'] \
&amp;= 0.5
\end{aligned}
[/latex]
[latex]\displaystyle
\begin{aligned}
\Delta K_i &amp;= \text{output_map_Ki}['ZE'] \
&amp;= 0.0
\end{aligned}
[/latex]
[latex]\displaystyle
\begin{aligned}
\Delta K_d &amp;= \text{output_map_Kd}['NS'] \
&amp;= -0.05
\end{aligned}
[/latex]
<strong>规则应用:</strong></p>
<p>对于 [latex]E[/latex] 和 [latex]dE[/latex] 的每个组合：</p>
<ol>
<li>确定隶属度 [latex]\mu<em>E[\text{Label}][/latex] 和 [latex]\mu</em>{dE}[\text{Label}][/latex]。</li>
<li>应用最小运算符计算触发强度</li>
</ol>
<p>[latex]\displaystyle
\begin{aligned}
\alpha &amp;= \min\Bigl(\mu_E[\text{Label}<em>E], \
&amp;\quad \mu</em>{dE}[\text{Label}_{dE}]\Bigr)
\end{aligned}
[/latex]</p>
<ol>
<li>将对 [latex]\Delta K_p[/latex], [latex]\Delta K_i[/latex], 和 [latex]\Delta K_d[/latex] 的贡献加权 [latex]\alpha[/latex] 并聚合。</li>
</ol>
<h4>解模糊</h4>
<p><strong>方法: 加权平均</strong></p>
<p>对于每个 PID 参数调整：</p>
<p>[latex]\displaystyle
\Delta K_p = \frac{\sum (\Delta K_p^{(i)} \cdot \alpha_i)}{\sum \alpha_i}
[/latex]
[latex]\displaystyle
\Delta K_i = \frac{\sum (\Delta K_i^{(i)} \cdot \alpha_i)}{\sum \alpha_i}
[/latex]
[latex]\displaystyle
\Delta K_d = \frac{\sum (\Delta K_d^{(i)} \cdot \alpha_i)}{\sum \alpha_i}
[/latex]
如果分母为零（没有触发规则），则调整默认为零。</p>
<h3>PID控制器</h3>
<p>传统的PID控制器根据误差反馈计算控制信号。</p>
<p><strong>控制律:</strong></p>
<p>[latex]\displaystyle
u(t) = K_p \cdot e(t) + K<em>i \cdot \int</em>{0}^{t} e(\tau) d\tau + K_d \cdot \frac{de(t)}{dt}
[/latex]
<strong>离散实现:</strong></p>
<p>给定采样时间为 [latex]\Delta t[/latex] 的离散时间步长：</p>
<p>[latex]\displaystyle
\text{积分项} += e(t) \cdot \Delta t
[/latex]
[latex]\displaystyle
\text{微分项} = \frac{e(t) - e(t-1)}{\Delta t}
[/latex]
[latex]\displaystyle
u(t) = K_p \cdot e(t) + K_i \cdot \text{积分项} + K_d \cdot \text{微分项}
[/latex]
<strong>参数约束:</strong></p>
<p>每个 PID 参数都被限制在指定的最小和最大边界内，以确保稳定性。</p>
<p>[latex]\displaystyle
K<em>p \in [Kp</em>{\text{min}}, Kp_{\text{max}}]
[/latex]
[latex]\displaystyle
K<em>i \in [Ki</em>{\text{min}}, Ki_{\text{max}}]
[/latex]
[latex]\displaystyle
K<em>d \in [Kd</em>{\text{min}}, Kd_{\text{max}}]
[/latex]</p>
<h3>加热器系统动力学</h3>
<p>模拟加热器的热行为，考虑热输入、环境损失和系统约束。</p>
<p><strong>参数:</strong></p>
<ul>
<li>
</li>
<li>
</li>
<li>
</li>
<li>
</li>
<li>
</li>
<li>
</li>
<li>
</li>
<li>
</li>
</ul>
<p><strong>状态变量:</strong></p>
<ul>
<li>
</li>
<li>
</li>
<li>[latex]\text{delay_buffer}[/latex]: FIFO 缓冲区，用于模拟死区时间。</li>
</ul>
<p><strong>动态方程 (欧拉离散化):</strong></p>
<p>[latex]\displaystyle
\frac{dy}{dt} = \frac{K \cdot u_{\text{delayed}}(t) - y(t)}{\tau} - h \cdot (y(t) - T<em>a)
[/latex]
[latex]\displaystyle
y(t+1) = y(t) + \left( \frac{K \cdot u</em>{\text{delayed}}(t) - y(t)}{\tau} - h \cdot (y(t) - T_a) \right) \cdot T_s
[/latex]
<strong>控制信号处理:</strong></p>
<ol>
<li><strong>限幅</strong>: 确保 [latex]u(t)[/latex] 位于 [latex][P<em>{\text{min}}, P</em>{\text{max}}][/latex] 内。</li>
<li><strong>速率限制</strong>: 限制功率变化：</li>
</ol>
<p>[latex]\displaystyle
\begin{aligned}
u(t) = \text{clip}\Bigl(&amp;u(t), \
&amp;u(t-1) - \Delta P<em>{\text{max}}, \
&amp;u(t-1) + \Delta P</em>{\text{max}}\Bigr)
\end{aligned}
[/latex]</p>
<ol>
<li><strong>死区时间</strong>: 将 [latex]u(t)[/latex] 插入延迟缓冲区并检索 [latex]u_{\text{delayed}}(t)[/latex]。</li>
</ol>
<h3>Smith预估器</h3>
<p>Smith预估器通过使用无死区时间的系统模型来预测未来状态并相应地调整控制信号，从而预测系统延迟。</p>
<p><strong>参数:</strong></p>
<ul>
<li>与加热器系统共享相同的参数，除了 [latex]T_d = 0[/latex]（无死区时间）。</li>
</ul>
<p><strong>预测方程:</strong></p>
<p>[latex]\displaystyle
\frac{dy<em>{\text{model}}}{dt} = \frac{K \cdot u(t) - y</em>{\text{model}}(t)}{\tau} - h \cdot (y_{\text{model}}(t) - T<em>a)
[/latex]
[latex]\displaystyle
y</em>{\text{model}}(t+1) = y<em>{\text{model}}(t) + \left( \frac{K \cdot u(t) - y</em>{\text{model}}(t)}{\tau} - h \cdot (y_{\text{model}}(t) - T_a) \right) \cdot T_s
[/latex]
<strong>补偿机制:</strong></p>
<p>[latex]\displaystyle
u<em>{\text{compensated}}(t) = u</em>{\text{PID}}(t) + (SV(t) - y<em>{\text{model}}(t))
[/latex]
其中 [latex]SV(t)[/latex] 是当前设定值，[latex]y</em>{\text{model}}(t)[/latex] 是预测温度。</p>
<hr />
<h2>仿真流程</h2>
<p>仿真程序协调加热器系统、模糊PID控制器和Smith预估器在离散时间步长上的交互。</p>
<p><strong>步骤:</strong></p>
<ol>
<li>
<p><strong>初始化</strong>:</p>
<ul>
<li>设置初始 PID 参数 ([latex]K<em>{p0}, K</em>{i0}, K_{d0}[/latex])。</li>
<li>定义设定值曲线，以固定间隔更改。</li>
<li>初始化加热器系统、Smith 预估器、模糊 PID 控制器和 PID 控制器。</li>
<li>初始化性能指标。</li>
</ul>
</li>
<li>
<p><strong>时间步进循环</strong> ([latex]t = 0[/latex] 到 [latex]t = \text{TIME_STEPS} - 1[/latex]):</p>
<ul>
<li><strong>设定值分配</strong>: 分配当前设定值 [latex]SV(t)[/latex]。</li>
<li><strong>过程变量 (PV)</strong>: 检索当前温度 [latex]y(t)[/latex]。</li>
<li><strong>误差计算</strong>:
[latex]\displaystyle
e(t) = SV(t) - PV(t)
[/latex]
[latex]\displaystyle
dE(t) = e(t) - e(t-1) \quad \text{(如果 } t &gt; 0 \text{)}
[/latex]</li>
<li><strong>性能指标更新</strong>: 在设定值更改间隔，计算超调量、稳态误差和稳定时间。</li>
<li><strong>模糊化</strong>: 使用隶属度函数计算 [latex]\mu<em>E[/latex] 和 [latex]\mu</em>{dE}[/latex]。</li>
<li><strong>推理</strong>: 应用模糊规则确定 [latex]\Delta K_p, \Delta K_i, \Delta K_d[/latex]。</li>
<li><strong>自适应 PID 调整</strong>: 更新 PID 参数：
[latex]\displaystyle
\begin{aligned}
K_p(t) &amp;= \text{clip}\bigl(K_p(t-1) + \Delta K<em>p, \
&amp;\quad Kp</em>{\text{min}}, Kp_{\text{max}}\bigr)
\end{aligned}
[/latex]
[latex]\displaystyle
\begin{aligned}
K_i(t) &amp;= \text{clip}\bigl(K_i(t-1) + \Delta K<em>i, \
&amp;\quad Ki</em>{\text{min}}, Ki_{\text{max}}\bigr)
\end{aligned}
[/latex]
[latex]\displaystyle
\begin{aligned}
K_d(t) &amp;= \text{clip}\bigl(K_d(t-1) + \Delta K<em>d, \
&amp;\quad Kd</em>{\text{min}}, Kd_{\text{max}}\bigr)
\end{aligned}
[/latex]</li>
<li><strong>PID 控制输出</strong>:
[latex]\displaystyle
\begin{aligned}
u_{\text{PID}}(t) &amp;= K_p(t) \cdot e(t) \
&amp;\quad + K_i(t) \cdot \text{Integral}_e \
&amp;\quad + K_d(t) \cdot dE(t)
\end{aligned}
[/latex]</li>
<li><strong>Smith 预估器</strong>: 预测无延迟的 PV [latex]\hat{y}(t)[/latex]。</li>
<li><strong>控制补偿</strong>:
[latex]\displaystyle
\begin{aligned}
u<em>{\text{compensated}}(t) &amp;= u</em>{\text{PID}}(t) \
&amp;\quad + \bigl(SV(t) - \hat{y}(t)\bigr)
\end{aligned}
[/latex]</li>
<li><strong>加热器更新</strong>: 将 [latex]u_{\text{compensated}}(t)[/latex] 应用于加热器系统以获得 [latex]y(t+1)[/latex] 和 [latex]u(t+1)[/latex]。</li>
<li><strong>数据记录</strong>: 存储 PV、SV、控制输出、PID 参数和性能指标。</li>
</ul>
</li>
<li>
<p><strong>最终性能指标</strong>: 循环结束后，计算最后一个设定值周期的指标。</p>
</li>
</ol>
<hr />
<h2>性能指标</h2>
<p>为了评估控制器的有效性，仿真跟踪每次设定值更改的以下指标：</p>
<ol>
<li>
<p><strong>超调量 (%)</strong>:
[latex]\displaystyle
\begin{aligned}
\text{超调量} &amp;= \left( \frac{\max(PV(t)) - SV}{SV} \right) \
&amp;\times 100
\end{aligned}
[/latex]
测量 PV 超过设定值的程度。</p>
</li>
<li>
<p><strong>稳态误差</strong>:
[latex]\displaystyle
\begin{aligned}
\text{稳态误差} &amp;= \frac{1}{N} \sum_{t=T-N}^{T} (SV(t) - PV(t))
\end{aligned}
[/latex]
响应最后 [latex]N[/latex] 步的平均误差。</p>
</li>
<li>
<p><strong>稳定时间 (步长)</strong>:
PV 保持在设定值的 [latex]\pm2\%[/latex] 以内且之后不再超出此范围所需的步数。</p>
</li>
</ol>
<hr />
<h2>用户界面</h2>
<p>交互式图形界面，具有以下功能：</p>
<ol>
<li>
<p><strong>图表</strong>:</p>
<ul>
<li><strong>系统响应</strong>: 显示 PV 和 SV 随时间的变化。</li>
<li><strong>控制信号</strong>: 显示控制输出 [latex]u(t)[/latex]。</li>
<li><strong>加热器功率</strong>: 可视化应用于加热器的实际功率。</li>
<li><strong>自适应 PID 参数</strong>: 跟踪 [latex]K_p, K_i, K_d[/latex] 随时间的变化。</li>
<li><strong>性能指标</strong>: 绘制每次设定值更改的超调量、稳态误差和稳定时间。</li>
</ul>
</li>
<li>
<p><strong>滑块</strong>:</p>
<ul>
<li><strong>初始 PID 参数</strong>:
<ul>
<li><strong>Kp0</strong>: 初始比例增益 (0 到 50)。</li>
<li><strong>Ki0</strong>: 初始积分增益 (0 到 10)。</li>
<li><strong>Kd0</strong>: 初始微分增益 (0 到 10)。</li>
</ul></li>
<li><strong>最大功率</strong>: 调整最大加热功率 (50 到 12,000)。</li>
</ul>
</li>
<li>
<p><strong>交互性</strong>:</p>
<ul>
<li>调整滑块会触发仿真程序使用更新的参数重新运行。</li>
<li>图表动态更新以反映新的仿真结果。</li>
</ul>
</li>
</ol>
<hr />
<h2>结论</h2>
<p>本文概述了与 Smith 预估器集成的模糊 PID 控制加热器系统仿真的算法结构和数学基础。该系统利用模糊逻辑进行自适应 PID 参数整定，在存在系统延迟和设定值变化的情况下增强控制性能。交互式仿真促进了控制动力学和性能指标的实时实验和可视化。</p>
<p>TODO：</p>
<ul>
<li><strong>其他性能指标</strong>: 例如绝对误差积分 (IAE) 或平方误差积分 (ISE)。</li>
<li><strong>高级隶属度函数</strong>: 结合高斯或样条基隶属度函数以实现更平滑的过渡。</li>
<li><strong>优化算法</strong>: 使用优化算法来微调模糊规则库或 PID 参数范围。</li>
<li><strong>添加更多环境参数</strong>: 例如真空值、氩气/氟利昂等气体流量</li>
</ul>
<hr />
<h2>附件</h2>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import matplotlib.gridspec as gridspec
<section><h1>定义会员函数<a href="#定义会员函数"><span>#</span></a></h1><p>def s_shaped(x, a, b):
if x &lt;= a:
return 0
elif a &lt; x &lt;= (a + b) / 2:
return 2 * ((x - a) / (b - a)) ** 2
elif (a + b) / 2 &lt; x &lt; b:
return 1 - 2 * ((b - x) / (b - a)) ** 2
else:
return 1</p><p>def z_shaped(x, a, b):
if x &lt;= a:
return 1
elif a &lt; x &lt;= (a + b) / 2:
return 1 - 2 * ((x - a) / (b - a)) ** 2
elif (a + b) / 2 &lt; x &lt; b:
return 2 * ((b - x) / (b - a)) ** 2
else:
return 0</p><p>def tri(x, a, b, c):
if x &lt;= a or x &gt;= c:
return 0
elif a &lt; x &lt;= b:
return (x - a) / (b - a)
elif b &lt; x &lt; c:
return (c - x) / (c - b)
else:
return 0</p></section>
<section><h1>定义模糊控制器<a href="#定义模糊控制器"><span>#</span></a></h1><p>class FuzzyPIDController:
def <strong>init</strong>(self, E_max=100, dE_max=50):
self.E_max = E_max
self.dE_max = dE_max
# 定义输出的独立映射数值
self.output_map_Kp = {
‘NB’: -0.5,
‘NM’: -0.25,
‘NS’: -0.1,
‘ZE’: 0.0,
‘PS’: 0.1,
‘PM’: 0.25,
‘PB’: 0.5
}
self.output_map_Ki = {
‘NB’: -0.3,
‘NM’: -0.15,
‘NS’: -0.05,
‘ZE’: 0.0,
‘PS’: 0.05,
‘PM’: 0.15,
‘PB’: 0.3
}
self.output_map_Kd = {
‘NB’: -0.2,
‘NM’: -0.1,
‘NS’: -0.05,
‘ZE’: 0.0,
‘PS’: 0.05,
‘PM’: 0.1,
‘PB’: 0.2
}
# 定义规则表
self.rules = [
# NB row
[(‘PB’, ‘ZE’, ‘NS’), (‘PM’, ‘PS’, ‘ZE’), (‘PM’, ‘PS’, ‘PS’),
(‘PM’, ‘PM’, ‘PS’), (‘PS’, ‘PM’, ‘PS’), (‘ZE’, ‘PM’, ‘PM’),
(‘ZE’, ‘PS’, ‘PM’)],
# NM row
[(‘PM’, ‘PS’, ‘NS’), (‘PM’, ‘PS’, ‘PS’), (‘PM’, ‘PM’, ‘PS’),
(‘PS’, ‘PM’, ‘PS’), (‘ZE’, ‘PM’, ‘PM’), (‘ZE’, ‘PS’, ‘PM’),
(‘NS’, ‘ZE’, ‘PM’)],
# NS row
[(‘PM’, ‘PS’, ‘PS’), (‘PM’, ‘PM’, ‘PS’), (‘PS’, ‘PM’, ‘PS’),
(‘ZE’, ‘PM’, ‘PM’), (‘ZE’, ‘PS’, ‘PM’), (‘NS’, ‘ZE’, ‘PM’),
(‘NM’, ‘NS’, ‘PB’)],
# ZE row
[(‘PM’, ‘PM’, ‘PS’), (‘PS’, ‘PM’, ‘PS’), (‘ZE’, ‘PM’, ‘PM’),
(‘ZE’, ‘ZE’, ‘ZE’), (‘ZE’, ‘NS’, ‘PM’), (‘NM’, ‘NS’, ‘PB’),
(‘NM’, ‘NM’, ‘PB’)],
# PS row
[(‘PS’, ‘PM’, ‘PS’), (‘ZE’, ‘PM’, ‘PM’), (‘ZE’, ‘PS’, ‘PM’),
(‘NS’, ‘ZE’, ‘PM’), (‘NM’, ‘NS’, ‘PB’), (‘NM’, ‘NM’, ‘PB’),
(‘NB’, ‘NB’, ‘PB’)],
# PM row
[(‘ZE’, ‘PM’, ‘PM’), (‘ZE’, ‘PS’, ‘PM’), (‘NS’, ‘ZE’, ‘PM’),
(‘NM’, ‘NS’, ‘PB’), (‘NM’, ‘NM’, ‘PB’), (‘NB’, ‘NB’, ‘PB’),
(‘NB’, ‘NB’, ‘PB’)],
# PB row
[(‘ZE’, ‘PS’, ‘PM’), (‘NS’, ‘ZE’, ‘PM’), (‘NM’, ‘NS’, ‘PB’),
(‘NM’, ‘NM’, ‘PB’), (‘NB’, ‘NB’, ‘PB’), (‘NB’, ‘NB’, ‘PB’),
(‘NB’, ‘NB’, ‘PB’)]
]
self.E_labels = [‘NB’, ‘NM’, ‘NS’, ‘ZE’, ‘PS’, ‘PM’, ‘PB’]
self.dE_labels = [‘NB’, ‘NM’, ‘NS’, ‘ZE’, ‘PS’, ‘PM’, ‘PB’]</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def fuzzify(self, E, dE):</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>mu_E = {}</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>mu_dE = {}</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span># Fuzzify E</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;NB&amp;#039;] = z_shaped(E, -self.E_max, -self.E_max / 2)</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;NM&amp;#039;] = tri(E, -self.E_max, -self.E_max / 2, 0)</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;NS&amp;#039;] = tri(E, -self.E_max / 2, 0, self.E_max / 4)</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;ZE&amp;#039;] = tri(E, -self.E_max / 4, 0, self.E_max / 4)</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;PS&amp;#039;] = tri(E, 0, self.E_max / 4, self.E_max / 2)</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;PM&amp;#039;] = tri(E, self.E_max / 3, self.E_max / 2, 2 * self.E_max / 3)</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>mu_E[&amp;#039;PB&amp;#039;] = s_shaped(E, self.E_max / 2, self.E_max)</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span># Fuzzify dE</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;NB&amp;#039;] = z_shaped(dE, -self.dE_max, -self.dE_max / 2)</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;NM&amp;#039;] = tri(dE, -self.dE_max, -self.dE_max / 2, 0)</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;NS&amp;#039;] = tri(dE, -self.dE_max / 2, 0, self.dE_max / 2)</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;ZE&amp;#039;] = tri(dE, -self.dE_max / 4, 0, self.dE_max / 4)</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;PS&amp;#039;] = tri(dE, 0, self.dE_max / 4, self.dE_max / 2)</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;PM&amp;#039;] = tri(dE, self.dE_max / 3, self.dE_max / 2, 2 * self.dE_max / 3)</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>mu_dE[&amp;#039;PB&amp;#039;] = s_shaped(dE, self.dE_max / 2, self.dE_max)</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>return mu_E, mu_dE</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>def infer(self, mu_E, mu_dE):</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span># 初始化输出会员度列表</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>delta_Kp = []</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>delta_Ki = []</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>delta_Kd = []</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>    </span></span><span># 遍历所有规则</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>for i, E_label in enumerate(self.E_labels):</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>for j, dE_label in enumerate(self.dE_labels):</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>alpha = min(mu_E[E_label], mu_dE[dE_label])  # 取最小</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>if alpha &amp;gt; 0:</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>rule = self.rules[i][j]</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>delta_Kp.append((self.output_map_Kp[rule[0]], alpha))</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>delta_Ki.append((self.output_map_Ki[rule[1]], alpha))</span></div></div><div><div><div>36</div></div><div><span><span>                </span></span><span>delta_Kd.append((self.output_map_Kd[rule[2]], alpha))</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span><span>    </span></span><span># 聚合: 对每个输出变量取加权平均</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>def weighted_average(output):</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>numerator = sum([val * alpha for val, alpha in output])</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>denominator = sum([alpha for _, alpha in output])</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>if denominator == 0:</span></div></div><div><div><div>43</div></div><div><span><span>            </span></span><span>return 0</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>return numerator / denominator</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>delta_Kp_value = weighted_average(delta_Kp)</span></div></div><div><div><div>47</div></div><div><span><span>    </span></span><span>delta_Ki_value = weighted_average(delta_Ki)</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>delta_Kd_value = weighted_average(delta_Kd)</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span><span>    </span></span><span>return delta_Kp_value, delta_Ki_value, delta_Kd_value</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h1>定义PID控制器<a href="#定义pid控制器"><span>#</span></a></h1><p>class PIDController:
def <strong>init</strong>(self, Kp=2.0, Ki=0.5, Kd=0.1,
Kp_min=0, Kp_max=10,
Ki_min=0, Ki_max=10,
Kd_min=0, Kd_max=10):
self.Kp = Kp
self.Ki = Ki
self.Kd = Kd
self.Kp_min = Kp_min
self.Kp_max = Kp_max
self.Ki_min = Ki_min
self.Ki_max = Ki_max
self.Kd_min = Kd_min
self.Kd_max = Kd_max
self.integral = 0
self.prev_error = 0</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def update_parameters(self, delta_Kp, delta_Ki, delta_Kd):</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>self.Kp = np.clip(self.Kp + delta_Kp, self.Kp_min, self.Kp_max)</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>self.Ki = np.clip(self.Ki + delta_Ki, self.Ki_min, self.Ki_max)</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>self.Kd = np.clip(self.Kd + delta_Kd, self.Kd_min, self.Kd_max)</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>def compute(self, error, dt=1):</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span># 积分</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>self.integral += error * dt</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span># 微分</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>derivative = (error - self.prev_error) / dt</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>self.prev_error = error</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>return self.Kp * error + self.Ki * self.integral + self.Kd * derivative</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h1>定义加热器系统模型，包含环境热量散失、加热功率限制和加热功率变化率限制<a href="#定义加热器系统模型包含环境热量散失加热功率限制和加热功率变化率限制"><span>#</span></a></h1><p>class HeaterSystem:
def <strong>init</strong>(self, K=1.0, tau=10.0, Td=5, Ts=0.05, ambient_temperature=20.0, heat_loss_coefficient=0.1,
max_power=100.0, min_power=0.0, power_rate_limit=10.0):
self.K = K
self.tau = tau
self.Td = Td  # 滞后时间（延迟步数）
self.Ts = Ts    # 采样时间
self.ambient_temperature = ambient_temperature  # 环境温度
self.heat_loss_coefficient = heat_loss_coefficient  # 热量散失系数
self.delay_buffer = [0] * Td  # 滞后缓冲区
self.y = ambient_temperature  # 初始温度
self.max_power = max_power  # 最大加热功率
self.min_power = min_power  # 最小加热功率
self.power_rate_limit = power_rate_limit  # 加热功率变化率限制
self.prev_delayed_u = 0.0  # 记录上一个延迟的加热功率</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def update(self, u):</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span># 限制控制信号在加热功率范围内</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>u = np.clip(u, self.min_power, self.max_power)</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span># 限制加热功率变化率</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>delta_u = u - self.prev_delayed_u</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>delta_u = np.clip(delta_u, -self.power_rate_limit, self.power_rate_limit)</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>u = self.prev_delayed_u + delta_u</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span><span>    </span></span><span># 添加控制输入到延迟缓冲区</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>self.delay_buffer.append(u)</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>delayed_u = self.delay_buffer.pop(0)</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>self.prev_delayed_u = delayed_u  # 更新上一个延迟的加热功率</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span># 欧拉法离散化一阶惯性环节，加上环境热量散失</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>dy = (self.K * delayed_u - self.y) * self.Ts / self.tau</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span># 环境热量散失</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>dy -= (self.y - self.ambient_temperature) * self.heat_loss_coefficient * self.Ts</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>self.y += dy</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>return self.y, delayed_u  # 返回延迟后的加热功率</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h1>定义史密斯预测器<a href="#定义史密斯预测器"><span>#</span></a></h1><p>class SmithPredictor:
def <strong>init</strong>(self, model: HeaterSystem, Td=5):
self.model = model
self.Td = Td
self.model_delay_buffer = [0] * Td
self.model_output = self.model.ambient_temperature  # 初始预测输出</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def predict(self, u):</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span># 限制控制信号在加热功率范围内</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>u = np.clip(u, self.model.min_power, self.model.max_power)</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span># 预测模型不含滞后</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>dy = (self.model.K * u - self.model_output) * self.model.Ts / self.model.tau</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span># 环境热量散失</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>dy -= (self.model_output - self.model.ambient_temperature) * self.model.heat_loss_coefficient * self.model.Ts</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>self.model_output += dy</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>return self.model_output</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h1>定义仿真函数<a href="#定义仿真函数"><span>#</span></a></h1><p>def simulate(Kp0, Ki0, Kd0, E_max=100, dE_max=50, TIME_STEPS=2000,
SETPOINT_CHANGE_INTERVAL=500, max_power=12000.0,
min_power=0.0, power_rate_limit=100.0, heater_power=0):
# 设定点配置：每SETPOINT_CHANGE_INTERVAL步改变一次设定点
SETPOINT_VALUES = [200, 400, 300, 600]
num_changes = TIME_STEPS // SETPOINT_CHANGE_INTERVAL
SETPOINT_PROFILE = np.concatenate([np.ones(SETPOINT_CHANGE_INTERVAL) * SETPOINT_VALUES[i % len(SETPOINT_VALUES)] for i in range(num_changes)])
if len(SETPOINT_PROFILE) &lt; TIME_STEPS:
SETPOINT_PROFILE = np.concatenate([SETPOINT_PROFILE, np.ones(TIME_STEPS - len(SETPOINT_PROFILE)) * SETPOINT_VALUES[-1]])</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 初始化模块</span></div></div><div><div><div>2</div></div><div><span>heater = HeaterSystem(K=1, tau=10.0, Td=1, Ts=0.1, ambient_temperature=20.0,</span></div></div><div><div><div>3</div></div><div><span><span>                      </span></span><span>heat_loss_coefficient=0.1, max_power=max_power, min_power=min_power,</span></div></div><div><div><div>4</div></div><div><span><span>                      </span></span><span>power_rate_limit=power_rate_limit)</span></div></div><div><div><div>5</div></div><div><span>smith_model = HeaterSystem(K=1, tau=10.0, Td=0, Ts=0.1, ambient_temperature=20.0,</span></div></div><div><div><div>6</div></div><div><span><span>                           </span></span><span>heat_loss_coefficient=0.1, max_power=max_power, min_power=min_power,</span></div></div><div><div><div>7</div></div><div><span><span>                           </span></span><span>power_rate_limit=power_rate_limit)  # 模型不含滞后</span></div></div><div><div><div>8</div></div><div><span>smith = SmithPredictor(model=smith_model, Td=1)</span></div></div><div><div><div>9</div></div><div><span>fuzzy_controller = FuzzyPIDController(E_max=E_max, dE_max=dE_max)</span></div></div><div><div><div>10</div></div><div><span>pid = PIDController(Kp=Kp0, Ki=Ki0, Kd=Kd0,</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>Kp_min=0, Kp_max=50,</span></div></div><div><div><div>12</div></div><div><span><span>                    </span></span><span>Ki_min=0, Ki_max=10,</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>Kd_min=0, Kd_max=10)</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 初始化记录变量</span></div></div><div><div><div>16</div></div><div><span>PV_history = []</span></div></div><div><div><div>17</div></div><div><span>SV_history = []</span></div></div><div><div><div>18</div></div><div><span>error_history = []</span></div></div><div><div><div>19</div></div><div><span>control_history = []</span></div></div><div><div><div>20</div></div><div><span>heater_power_history = []</span></div></div><div><div><div>21</div></div><div><span>Kp_history = []</span></div></div><div><div><div>22</div></div><div><span>Ki_history = []</span></div></div><div><div><div>23</div></div><div><span>Kd_history = []</span></div></div><div><div><div>24</div></div><div><span>overshoot_history = []</span></div></div><div><div><div>25</div></div><div><span>steady_state_error_history = []</span></div></div><div><div><div>26</div></div><div><span>settling_time_history = []</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span># 初始化性能指标</span></div></div><div><div><div>29</div></div><div><span>current_setpoint = SETPOINT_PROFILE[0]</span></div></div><div><div><div>30</div></div><div><span>response_start_index = 0</span></div></div><div><div><div>31</div></div><div><span>overshoot = 0</span></div></div><div><div><div>32</div></div><div><span>steady_state_error = 0</span></div></div><div><div><div>33</div></div><div><span>settling_time = 0</span></div></div><div><div><div>34</div></div><div><span>settling_time_threshold = 0.02  # 2%</span></div></div><div><div><div>35</div></div><div><span>within_settle = False</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span># 仿真循环</span></div></div><div><div><div>38</div></div><div><span>for t in range(TIME_STEPS):</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>SV = SETPOINT_PROFILE[t]</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>PV = heater.y</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>error = SV - PV</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>dE = error - (error_history[-1] if t &amp;gt; 0 else 0)</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span><span>    </span></span><span># 检测设定点变化</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>if t % SETPOINT_CHANGE_INTERVAL == 0 and t != 0:</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span># 计算并记录性能指标</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span># 超调量</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>max_PV = max(PV_history[response_start_index:t]) if t &amp;gt; response_start_index else PV</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>overshoot = ((max_PV - current_setpoint) / current_setpoint) * 100 if current_setpoint != 0 else 0</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>overshoot_history.append(overshoot)</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span><span>        </span></span><span># 稳态误差 (取最后50步的平均误差)</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>steady_state_error = np.mean(error_history[max(t-50, response_start_index):t]) if t &amp;gt; response_start_index else error</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>steady_state_error_history.append(steady_state_error)</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span><span>        </span></span><span># 调节时间 (找到第一次进入并保持在±2%范围内的时间步)</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>target_min = current_setpoint * (1 - settling_time_threshold)</span></div></div><div><div><div>58</div></div><div><span><span>        </span></span><span>target_max = current_setpoint * (1 + settling_time_threshold)</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>settling_time = 0</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>for i in range(response_start_index, t):</span></div></div><div><div><div>61</div></div><div><span><span>            </span></span><span>if target_min &amp;lt;= PV_history[i] &amp;lt;= target_max:</span></div></div><div><div><div>62</div></div><div><span><span>                </span></span><span># Check if it stays within the range for the remaining steps</span></div></div><div><div><div>63</div></div><div><span><span>                </span></span><span>if all(target_min &amp;lt;= pv &amp;lt;= target_max for pv in PV_history[i:t]):</span></div></div><div><div><div>64</div></div><div><span><span>                    </span></span><span>settling_time = i - response_start_index</span></div></div><div><div><div>65</div></div><div><span><span>                    </span></span><span>break</span></div></div><div><div><div>66</div></div><div><span><span>        </span></span><span>settling_time_history.append(settling_time)</span></div></div><div><div><div>67</div></div><div>
</div></div><div><div><div>68</div></div><div><span><span>        </span></span><span># 更新当前设定点和响应起始索引</span></div></div><div><div><div>69</div></div><div><span><span>        </span></span><span>current_setpoint = SV</span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span>response_start_index = t</span></div></div><div><div><div>71</div></div><div>
</div></div><div><div><div>72</div></div><div><span><span>    </span></span><span># 模糊控制器调整PID参数</span></div></div><div><div><div>73</div></div><div><span><span>    </span></span><span>mu_E, mu_dE = fuzzy_controller.fuzzify(error, dE)</span></div></div><div><div><div>74</div></div><div><span><span>    </span></span><span>delta_Kp, delta_Ki, delta_Kd = fuzzy_controller.infer(mu_E, mu_dE)</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span><span>    </span></span><span>if heater_power != 0:</span></div></div><div><div><div>77</div></div><div><span><span>        </span></span><span>delta_Kp *= (heater_power / max_power) # 根据加热功率调整PID参数</span></div></div><div><div><div>78</div></div><div>
</div></div><div><div><div>79</div></div><div><span><span>    </span></span><span>pid.update_parameters(delta_Kp, delta_Ki, delta_Kd)</span></div></div><div><div><div>80</div></div><div>
</div></div><div><div><div>81</div></div><div><span><span>    </span></span><span># PID计算控制输出</span></div></div><div><div><div>82</div></div><div><span><span>    </span></span><span>u_pid = pid.compute(error, dt=heater.Ts)</span></div></div><div><div><div>83</div></div><div>
</div></div><div><div><div>84</div></div><div><span><span>    </span></span><span># 史密斯预测器预测PV</span></div></div><div><div><div>85</div></div><div><span><span>    </span></span><span>predicted_PV = smith.predict(u_pid)</span></div></div><div><div><div>86</div></div><div>
</div></div><div><div><div>87</div></div><div><span><span>    </span></span><span># 控制输出补偿</span></div></div><div><div><div>88</div></div><div><span><span>    </span></span><span>u_compensated = u_pid + (SV - predicted_PV)</span></div></div><div><div><div>89</div></div><div>
</div></div><div><div><div>90</div></div><div><span><span>    </span></span><span># 更新加热器系统，并获取延迟后的加热功率</span></div></div><div><div><div>91</div></div><div><span><span>    </span></span><span>y, heater_power = heater.update(u_compensated)</span></div></div><div><div><div>92</div></div><div>
</div></div><div><div><div>93</div></div><div><span><span>    </span></span><span># 记录数据</span></div></div><div><div><div>94</div></div><div><span><span>    </span></span><span>PV_history.append(y)</span></div></div><div><div><div>95</div></div><div><span><span>    </span></span><span>SV_history.append(SV)</span></div></div><div><div><div>96</div></div><div><span><span>    </span></span><span>error_history.append(error)</span></div></div><div><div><div>97</div></div><div><span><span>    </span></span><span>control_history.append(u_compensated)</span></div></div><div><div><div>98</div></div><div><span><span>    </span></span><span>heater_power_history.append(heater_power)</span></div></div><div><div><div>99</div></div><div><span><span>    </span></span><span>Kp_history.append(pid.Kp)</span></div></div><div><div><div>100</div></div><div><span><span>    </span></span><span>Ki_history.append(pid.Ki)</span></div></div><div><div><div>101</div></div><div><span><span>    </span></span><span>Kd_history.append(pid.Kd)</span></div></div><div><div><div>102</div></div><div>
</div></div><div><div><div>103</div></div><div><span># 最后一个设定点的性能指标</span></div></div><div><div><div>104</div></div><div><span>max_PV = max(PV_history[response_start_index:]) if TIME_STEPS &amp;gt; response_start_index else PV_history[-1]</span></div></div><div><div><div>105</div></div><div><span>overshoot = ((max_PV - current_setpoint) / current_setpoint) * 100 if current_setpoint != 0 else 0</span></div></div><div><div><div>106</div></div><div><span>overshoot_history.append(overshoot)</span></div></div><div><div><div>107</div></div><div><span>steady_state_error = np.mean(error_history[response_start_index:]) if TIME_STEPS &amp;gt; response_start_index else error_history[-1]</span></div></div><div><div><div>108</div></div><div><span>steady_state_error_history.append(steady_state_error)</span></div></div><div><div><div>109</div></div><div><span>settling_time = 0</span></div></div><div><div><div>110</div></div><div><span>target_min = current_setpoint * (1 - settling_time_threshold)</span></div></div><div><div><div>111</div></div><div><span>target_max = current_setpoint * (1 + settling_time_threshold)</span></div></div><div><div><div>112</div></div><div><span>for i in range(response_start_index, TIME_STEPS):</span></div></div><div><div><div>113</div></div><div><span><span>    </span></span><span>if target_min &amp;lt;= PV_history[i] &amp;lt;= target_max:</span></div></div><div><div><div>114</div></div><div><span><span>        </span></span><span>if all(target_min &amp;lt;= pv &amp;lt;= target_max for pv in PV_history[i:]):</span></div></div><div><div><div>115</div></div><div><span><span>            </span></span><span>settling_time = i - response_start_index</span></div></div><div><div><div>116</div></div><div><span><span>            </span></span><span>break</span></div></div><div><div><div>117</div></div><div><span>settling_time_history.append(settling_time)</span></div></div><div><div><div>118</div></div><div>
</div></div><div><div><div>119</div></div><div><span>return (PV_history, SV_history, control_history, heater_power_history,</span></div></div><div><div><div>120</div></div><div><span><span>        </span></span><span>Kp_history, Ki_history, Kd_history,</span></div></div><div><div><div>121</div></div><div><span><span>        </span></span><span>overshoot_history, steady_state_error_history, settling_time_history)</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h1>初始化仿真参数<a href="#初始化仿真参数"><span>#</span></a></h1><p>INITIAL_Kp = 2.0
INITIAL_Ki = 0.5
INITIAL_Kd = 0.1</p></section>
<section><h1>运行初始仿真<a href="#运行初始仿真"><span>#</span></a></h1><p>SETPOINT_CHANGE_INTERVAL=500
results = simulate(INITIAL_Kp, INITIAL_Ki, INITIAL_Kd, TIME_STEPS=2000,
SETPOINT_CHANGE_INTERVAL=SETPOINT_CHANGE_INTERVAL,
max_power=12000, min_power=0, power_rate_limit=10)
PV_history, SV_history, control_history, heater_power_history, Kp_history, Ki_history, Kd_history, <br />
overshoot_history, steady_state_error_history, settling_time_history = results</p></section>
<section><h1>创建图形和子图，增加一个子图用于展示加热功率和性能指标<a href="#创建图形和子图增加一个子图用于展示加热功率和性能指标"><span>#</span></a></h1><p>fig = plt.figure(figsize=(15, 20))
gs = gridspec.GridSpec(5, 1, height_ratios=[2, 1, 1, 1, 1], hspace=0.4)</p></section>
<section><h1>子图1：系统响应<a href="#子图1系统响应"><span>#</span></a></h1><p>ax1 = plt.subplot(gs[0])
line1_PV, = ax1.plot(PV_history, label=‘Process Variable (PV)’, color=‘b’)
line1_SV, = ax1.plot(SV_history, label=‘Setpoint (SV)’, linestyle=’—’, color=‘r’)
ax1.set_ylabel(‘Temperature’)
ax1.set_title(‘System Response’)
ax1.legend()
ax1.grid(True)</p></section>
<section><h1>子图2：控制输出<a href="#子图2控制输出"><span>#</span></a></h1><p>ax2 = plt.subplot(gs[1], sharex=ax1)
line2, = ax2.plot(control_history, label=‘Control Output (u)’, color=‘g’)
ax2.set_ylabel(‘Control Output’)
ax2.set_title(‘Control Signal’)
ax2.legend()
ax2.grid(True)</p></section>
<section><h1>子图3：加热功率<a href="#子图3加热功率"><span>#</span></a></h1><p>ax3 = plt.subplot(gs[2], sharex=ax1)
line3, = ax3.plot(heater_power_history, label=‘Heater Power (u)’, color=‘orange’)
ax3.set_ylabel(‘Heater Power’)
ax3.set_title(‘Heater Power’)
ax3.legend()
ax3.grid(True)</p></section>
<section><h1>子图4：PID参数<a href="#子图4pid参数"><span>#</span></a></h1><p>ax4 = plt.subplot(gs[3], sharex=ax1)
line4_Kp, = ax4.plot(Kp_history, label=‘Kp’, color=‘m’)
line4_Ki, = ax4.plot(Ki_history, label=‘Ki’, color=‘c’)
line4_Kd, = ax4.plot(Kd_history, label=‘Kd’, color=‘y’)
ax4.set_ylabel(‘PID Parameters’)
ax4.set_title(‘Adaptive PID Parameters’)
ax4.legend()
ax4.grid(True)</p></section>
<section><h1>子图5：性能指标<a href="#子图5性能指标"><span>#</span></a></h1><p>ax5 = plt.subplot(gs[4])
steps = [SETPOINT_CHANGE_INTERVAL * i for i in range(len(overshoot_history))]
ax5.plot(steps, overshoot_history, label=‘Overshoot (%)’, marker=‘o’, color=‘purple’)
ax5.plot(steps, steady_state_error_history, label=‘Steady-State Error’, marker=‘x’, color=‘brown’)
ax5.plot(steps, settling_time_history, label=‘Settling Time (steps)’, marker=’^’, color=‘black’)
ax5.set_xlabel(‘Time Step’)
ax5.set_ylabel(‘Performance Metrics’)
ax5.set_title(‘Performance Metrics per Setpoint Change’)
ax5.legend()
ax5.grid(True)</p></section>
<section><h1>调整子图间距以留出滑块空间<a href="#调整子图间距以留出滑块空间"><span>#</span></a></h1><p>plt.subplots_adjust(bottom=0.35)</p></section>
<section><h1>添加滑块<a href="#添加滑块"><span>#</span></a></h1><p>axcolor = ‘lightgoldenrodyellow’
ax_Kp = plt.axes([0.15, 0.25, 0.65, 0.03], facecolor=axcolor)
ax_Ki = plt.axes([0.15, 0.18, 0.65, 0.03], facecolor=axcolor)
ax_Kd = plt.axes([0.15, 0.11, 0.65, 0.03], facecolor=axcolor)
ax_max_power = plt.axes([0.15, 0.04, 0.65, 0.03], facecolor=axcolor)</p><p>slider_Kp = Slider(ax_Kp, ‘Kp0’, 0.0, 50.0, valinit=INITIAL_Kp, valstep=0.1)
slider_Ki = Slider(ax_Ki, ‘Ki0’, 0.0, 10.0, valinit=INITIAL_Ki, valstep=0.1)
slider_Kd = Slider(ax_Kd, ‘Kd0’, 0.0, 10.0, valinit=INITIAL_Kd, valstep=0.1)
slider_max_power = Slider(ax_max_power, ‘Max Power’, 50.0, 12000.0, valinit=2000.0, valstep=1.0)</p></section>
<section><h1>定义更新函数<a href="#定义更新函数"><span>#</span></a></h1><p>def update(val):
Kp0 = slider_Kp.val
Ki0 = slider_Ki.val
Kd0 = slider_Kd.val
max_power = slider_max_power.val
min_power = 0.0  # 可以根据需要调整最小加热功率
power_rate_limit = 500.0  # 固定变化率限制，可扩展为可调</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 重新运行仿真</span></div></div><div><div><div>2</div></div><div><span>results = simulate(Kp0, Ki0, Kd0, TIME_STEPS=2000,</span></div></div><div><div><div>3</div></div><div><span><span>                  </span></span><span>SETPOINT_CHANGE_INTERVAL=SETPOINT_CHANGE_INTERVAL,</span></div></div><div><div><div>4</div></div><div><span><span>                  </span></span><span>max_power=max_power, min_power=min_power,</span></div></div><div><div><div>5</div></div><div><span><span>                  </span></span><span>power_rate_limit=power_rate_limit)</span></div></div><div><div><div>6</div></div><div><span>PV, SV, u, heater_power, Kp, Ki, Kd, overshoot, steady_state_error, settling_time = results</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 更新系统响应图</span></div></div><div><div><div>9</div></div><div><span>line1_PV.set_ydata(PV)</span></div></div><div><div><div>10</div></div><div><span>line1_SV.set_ydata(SV)</span></div></div><div><div><div>11</div></div><div><span>ax1.relim()</span></div></div><div><div><div>12</div></div><div><span>ax1.autoscale_view()</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 更新控制输出图</span></div></div><div><div><div>15</div></div><div><span>line2.set_ydata(u)</span></div></div><div><div><div>16</div></div><div><span>ax2.relim()</span></div></div><div><div><div>17</div></div><div><span>ax2.autoscale_view()</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 更新加热功率图</span></div></div><div><div><div>20</div></div><div><span>line3.set_ydata(heater_power)</span></div></div><div><div><div>21</div></div><div><span>ax3.relim()</span></div></div><div><div><div>22</div></div><div><span>ax3.autoscale_view()</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span># 更新PID参数图</span></div></div><div><div><div>25</div></div><div><span>line4_Kp.set_ydata(Kp)</span></div></div><div><div><div>26</div></div><div><span>line4_Ki.set_ydata(Ki)</span></div></div><div><div><div>27</div></div><div><span>line4_Kd.set_ydata(Kd)</span></div></div><div><div><div>28</div></div><div><span>ax4.relim()</span></div></div><div><div><div>29</div></div><div><span>ax4.autoscale_view()</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span># 更新性能指标图</span></div></div><div><div><div>32</div></div><div><span>steps = [500 * i for i in range(len(overshoot))]</span></div></div><div><div><div>33</div></div><div><span>ax5.clear()</span></div></div><div><div><div>34</div></div><div><span>ax5.plot(steps, overshoot, label=&amp;#039;Overshoot (%)&amp;#039;, marker=&amp;#039;o&amp;#039;, color=&amp;#039;purple&amp;#039;)</span></div></div><div><div><div>35</div></div><div><span>ax5.plot(steps, steady_state_error, label=&amp;#039;Steady-State Error&amp;#039;, marker=&amp;#039;x&amp;#039;, color=&amp;#039;brown&amp;#039;)</span></div></div><div><div><div>36</div></div><div><span>ax5.plot(steps, settling_time, label=&amp;#039;Settling Time (steps)&amp;#039;, marker=&amp;#039;^&amp;#039;, color=&amp;#039;black&amp;#039;)</span></div></div><div><div><div>37</div></div><div><span>ax5.set_xlabel(&amp;#039;Time Step&amp;#039;)</span></div></div><div><div><div>38</div></div><div><span>ax5.set_ylabel(&amp;#039;Performance Metrics&amp;#039;)</span></div></div><div><div><div>39</div></div><div><span>ax5.set_title(&amp;#039;Performance Metrics per Setpoint Change&amp;#039;)</span></div></div><div><div><div>40</div></div><div><span>ax5.legend()</span></div></div><div><div><div>41</div></div><div><span>ax5.grid(True)</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>fig.canvas.draw_idle()</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
</code><section><code><h1>注册滑块更新事件<a href="#注册滑块更新事件"><span>#</span></a></h1><p>slider_Kp.on_changed(update)
slider_Ki.on_changed(update)
slider_Kd.on_changed(update)
slider_max_power.on_changed(update)</p></code><p><code>plt.show()</code></p></section></pre><p></p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/09/03/ce%E8%AE%A4%E8%AF%81%E6%A0%87%E5%87%86-%E7%94%B5%E6%B0%94%E9%83%A8%E5%88%86/</id>
      <title type="text">CE认证标准-电气部分</title>
      <published>2024-09-03T00:00:00.000Z</published>
      <updated>2024-09-03T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/09/03/ce%E8%AE%A4%E8%AF%81%E6%A0%87%E5%87%86-%E7%94%B5%E6%B0%94%E9%83%A8%E5%88%86/"/>
      <summary type="text">EN 60204 标准概述 4 适用范围 EN 60204 的本部分适用于机械（包括协同工作的一组机械）的电气、电子和可编程电子设备及系统，不适用于手提工作式机械。 本标准适用于额定电压不超过交流1000V，直流1500V，电源频率不超过200Hz的电子设备、电气设备或工业机器系统。 本标准所论及的设备是从机械电气设备的电源引入处开始的。 本标准不包括用于危</summary>
      <content type="html"><![CDATA[<h1>EN 60204 标准概述</h1>
<h2>4 适用范围</h2>
<p>EN 60204 的本部分适用于机械（包括协同工作的一组机械）的电气、电子和可编程电子设备及系统，不适用于手提工作式机械。</p>
<ul>
<li>本标准适用于额定电压不超过交流1000V，直流1500V，电源频率不超过200Hz的电子设备、电气设备或工业机器系统。</li>
<li>本标准所论及的设备是从机械电气设备的电源引入处开始的。</li>
<li>本标准不包括用于危险区域机器的额外要求。</li>
</ul>
<h3>4.1 一般原则</h3>
<ul>
<li><strong>本质安全设计</strong> --&gt; 减少风险</li>
<li><strong>防护罩</strong> --&gt; 减少风险</li>
<li><strong>警示</strong> --&gt; 减少风险</li>
</ul>
<h3>4.2 部件的选取</h3>
<ul>
<li>适合其预期用途</li>
<li>符合相关的IEC标准</li>
<li>根据供应商的指示使用</li>
</ul>
<h3>4.3 供电电源</h3>
<h4>交流供电</h4>
<ul>
<li>稳态电压值为0.9-1.1倍标称电压</li>
<li>0.99-1.01倍标称频率（连续的），0.98-1.02倍标称频率（短时工作）</li>
<li>2～30次的畸变谐波总和不超过线电压方均根值的12%</li>
<li>三相电源电压负序和零序成分都不应超过正序成分的2%</li>
<li>在电源周期的任意时间，电源中断或零电压持续时间不超过3ms，相继中断间隔时间应大于1s</li>
<li>电压降不应超过大于1周期电源峰值电压的20%，相继降落间隔时间应大于1s</li>
</ul>
<h4>直流供电</h4>
<ul>
<li><strong>电池供电</strong> ：0.85-1.15倍标称电压；0.7-1.2倍标称电压（在用电池组供电的运输工具情况下）；电池的直流电源电压中断的时间间隔不超过5ms</li>
<li><strong>转换装置</strong> ：0.9-1.1倍标称电压；电压中断：不超过20ms，相继中断间隔时间应大于1s；纹波电压（峰峰值）：不超过标称电压的0.05倍</li>
</ul>
<h3>4.4 实际环境和运行条件</h3>
<ul>
<li><strong>EMC</strong>: 电气设备产生的电磁干扰不应超过其预期使用场合所允许的水平。电气设备应具有足够的抗电磁干扰能力，以确保可以在其预期的环境中运行。电气设备需要测试其抗干扰能力和辐射能力，除非满足以下的要求：
<ul>
<li>在相关产品标准或通用标准(无产品标准)规定的预期EMC环境中，对于采用的装置或者元件符合EMC要求</li>
<li>电气安装和布线应符合设备和部件供应商提供的关于相互影响(布线、屏蔽、接地等)的说明，如果供应商没有提供此类说明，则与附录H中的信息一致</li>
</ul></li>
<li><strong>安装环境温度</strong> : (5-40°C)</li>
<li><strong>湿度</strong> : (最高40°C、相对湿度不超过50%)，必要时采取适当附加措施（如加热器、空调、排水孔）</li>
<li><strong>海拔</strong> : &lt;1000m：电气设备能够在海拔1000m以下能正常操作
<ul>
<li>设备在较高的海拔地区使用，则需要考虑以下的因素的降低：</li>
<li>介质强度；设备的整流能力；空气的冷却作用</li>
<li>如果产品数据中没有指定校正因子，建议向制造商咨询校正因子</li>
</ul></li>
<li><strong>防护等级，辐射，冲击减小电磁影响的措施</strong>
<ul>
<li>增加浪涌保护装置/滤波器</li>
<li>电缆可导电护套（如铠装、屏蔽）接地</li>
<li>动力电缆和信号数据电缆保持隔离距离，确有必要相互交叉时，保持直角交叉</li>
<li>为减少感应电流进入保护导体，使用同轴电缆</li>
<li>必要时增加旁路导体</li>
<li>布线宜尽可能短</li>
</ul></li>
</ul>
<h3>4.5 运输和储存</h3>
<ul>
<li>运输和储存温度：-25°C ~ 55°C</li>
<li>短时间(不超过24 h) 最高+70°C</li>
</ul>
<h3>4.6 设备搬运</h3>
<ul>
<li>如果设备过重，应提供合适的手段，以供起重机或类似设备操作</li>
</ul>
<h2>5 电源安全</h2>
<h3>5.1 电源连接</h3>
<ul>
<li>如果可行，机器的电气设备尽量连接到单一电源上。</li>
<li>推荐电源线直接连接至主电源断开装置端子上</li>
<li>主进线连接端子应标识L1、L2、L3、N并与电气原理图一致</li>
<li>PE 和N 要分开</li>
</ul>
<h3>5.2 连接到外部保护接地系统的端子</h3>
<ul>
<li>应位于电源进线附近, 接地线端子应以大写PE 标识</li>
<li>其他接地点用接地符号</li>
<li>黄绿导线</li>
<li>接地线径要符合Table1的要求</li>
</ul>
<h4>Table 1 - Minimum cross-sectional area of copper protective conductors</h4>
<table>
<thead>
<tr>
<th>Cross-sectional area of line conductors $ S $ (mm²)</th>
<th>Minimum cross-sectional area of the corresponding protective conductor (PE) $ S_p $ (mm²)</th>
</tr>
</thead>
<tbody>
<tr>
<td>$S \leq 16$</td>
<td>S</td>
</tr>
<tr>
<td>$16 &lt; S \leq 35$</td>
<td>$\frac{S}{2}$</td>
</tr>
<tr>
<td>$S &gt; 35$</td>
<td>$\frac{S}{2}$</td>
</tr>
</tbody>
</table>
<h3>5.3 电源切断（隔离）装置</h3>
<ul>
<li>机械的每个引入电源处需安装电源切断开关；</li>
<li>电源切断开关应是下列形式之一：
<ul>
<li>符合IEC 60947-3 的隔离开关，使用类别AC-23B或DC-23B</li>
<li>符合IEC 60947-6-2 的用于隔离的控制与保护开关装置（控制与保护开关装置集成了断路器(过流、过载)，接触器，隔离器等功能）</li>
<li>符合IEC 60947-2 的断路器</li>
<li>符合IEC产品标准的任何其他开关设备，并满足该设备的隔离要求、适当的使用类别和/或产品标准中规定的耐久性要求</li>
<li>通过软电缆供电的插头/插座组合</li>
</ul></li>
</ul>
<h4>电源切断（隔离）装置要求</h4>
<ul>
<li>断开/接通指示 O / I</li>
<li>所有触头断开前, 不应当指示“断开”位置</li>
<li>有一个操作装置</li>
<li>提供一个锁定在OFF的装置</li>
<li>切断电源电路的所有带电导线。但对于TN电源系统，中线可以切断也可以不切断
<ul>
<li>对于法国、挪威和意大利，中性线必须断开。</li>
</ul></li>
<li>有足以切断最大电动机堵转电流及所有其他电动机和负载的正常运行电流总和的分断能力</li>
<li>当电源断开装置为插头/插座组合时，应符合13.4.5的要求并应具有分断能力，或与具有分断能力的开关装置联锁，足以切断最大电动机堵转电流及所有其他电动机和负载的正常运行电流总和的分断能力
<ul>
<li>推荐使用符合IEC 60309-1标准的插头/插座</li>
</ul></li>
</ul>
<h4>电源切断开关的操作装置</h4>
<ul>
<li>电源切断装置的操作装置(如手柄)应位于电气设备外壳的外部</li>
<li>电源切断开关的操作装置应容易接近，应安装在维修站台以上0.6m~1.9m间。上限值宜为1.7m</li>
<li>如果不用于急停操作的外部操作装置:
<ul>
<li>推荐使用黑或灰色；</li>
<li>可以提供一种不使用钥匙或工具就可轻易打开的补充盖或门，例如用于防止环境条件或机械损坏。这种盖子/门应清楚地表明它提供了进入操作装置的通道</li>
</ul></li>
</ul>
<h4>例外电路</h4>
<p>以下电路不必由电源断开装置断开：</p>
<ul>
<li>安装和修理时用的照明电路；</li>
<li>连接外部使用的插头、插座；</li>
<li>欠压保护电路；</li>
<li>供机器正常工作的辅助电路</li>
<li>联锁控制电路</li>
</ul>
<p>例外电路应该有自己的断开装置，并且：</p>
<ul>
<li>电源隔离装置附近应有永久性警告标志；</li>
<li>相应的陈述应写入说明书，并满足以下要求：
<ul>
<li>采用橙色线缆；</li>
<li>与其他电路进行电路隔离；</li>
<li>此类线路附近应有警告标识；</li>
</ul></li>
</ul>
<h3>5.4 电气设备应具备下列情况下保护人们免受电击的能力</h3>
<ul>
<li>基本防护</li>
<li>故障防护</li>
</ul>
<h4>基本防护</h4>
<p>无故障条件下的电击防护（直接接触）</p>
<h4>故障防护</h4>
<p>单一故障条件下的电击防护（间接接触）</p>
<h4>防护等级 IPXX</h4>
<table>
<thead>
<tr>
<th>等级</th>
<th>防护含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>无防护</td>
</tr>
<tr>
<td>1</td>
<td>$\leq 50$ mm 直径</td>
</tr>
<tr>
<td>2</td>
<td>无防护</td>
</tr>
<tr>
<td>3</td>
<td>手背，拳头 $\leq 12.5$ mm 直径</td>
</tr>
<tr>
<td>4</td>
<td>手指 $\leq 2.5$ mm 直径</td>
</tr>
<tr>
<td>5</td>
<td>工具 $\leq 1.0$ mm 直径</td>
</tr>
<tr>
<td>6</td>
<td>防尘</td>
</tr>
<tr>
<td>7</td>
<td>密尘</td>
</tr>
</tbody>
</table>
<h4>防止液体异物进入</h4>
<table>
<thead>
<tr>
<th>等级</th>
<th>防护含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>无防护</td>
</tr>
<tr>
<td>1</td>
<td>垂直滴水</td>
</tr>
<tr>
<td>2</td>
<td>滴水(倾斜15度角)</td>
</tr>
<tr>
<td>3</td>
<td>淋水(倾斜60度角)</td>
</tr>
<tr>
<td>4</td>
<td>溅水(360度)</td>
</tr>
<tr>
<td>5</td>
<td>喷水</td>
</tr>
<tr>
<td>6</td>
<td>强烈喷水</td>
</tr>
<tr>
<td>7</td>
<td>短时间浸水</td>
</tr>
<tr>
<td>8</td>
<td>连续浸水</td>
</tr>
<tr>
<td>9</td>
<td>高温高压强烈喷水</td>
</tr>
</tbody>
</table>
<h3>6.2 基本防护</h3>
<ul>
<li>
<p><strong>用外壳作防护</strong></p>
<ul>
<li>带电部件应安装在外壳内，接触带电部分的最低的防护等级IP2X或IPXXB</li>
<li>如果壳体上表面易于接近，接触带电部分的最低的防护等级IP4X或IPXXD</li>
<li>只有在下列的一种条件下才允许开打开外壳(柜门，盖板等)：</li>
<li>通过工具或钥匙打开外壳。需要带电调整时，可触及带电体的防护等级至少IP2X或IPXXB</li>
<li>断电开门。可以采用联锁保证门只有在断电时打开，并且在门关闭后合闸</li>
<li>不需要工具或钥匙就可以打开。所有带电体防护至少IP2X或IPXXB</li>
</ul>
</li>
<li>
<p><strong>用绝缘物防护</strong></p>
<ul>
<li>带电体使用绝缘物完全覆盖，只有用破坏性办法才能去掉绝缘层。绝缘材料应抵抗机械、化学、电和热的损坏。油漆？</li>
</ul>
</li>
<li>
<p><strong>残余电压的保护</strong></p>
<ul>
<li>切断电源后，任何残余电压高于60V的带电部分，应在5s内放电到低于60V；</li>
<li>插头在拔出后，1s内插头两端电压低于60V；</li>
</ul>
</li>
</ul>
<h3>6.3 故障防护</h3>
<ul>
<li>对电气设备的每个电路或者部件，至少采用以下规定的措施之一：
<ul>
<li>防止出现危险触摸电压</li>
<li>触及触摸电压可能造成危险之前自动切断电源</li>
</ul></li>
</ul>
<h4>防止出现危险触摸电压</h4>
<ul>
<li>采用Ⅱ类设备或者等效绝缘</li>
<li>电气隔离</li>
</ul>
<h4>基本绝缘</h4>
<p>对带电部件进行绝缘，以提供基本的防触电保护</p>
<h4>附加绝缘</h4>
<p>除了基本绝缘之外，还应用了独立的附加绝缘，以便在基本绝缘失效时提供电击保护</p>
<h4>双重绝缘</h4>
<p>包括基本绝缘和附加绝缘的绝缘。基本绝缘 + 附加绝缘 = 双重绝缘</p>
<h4>加强绝缘</h4>
<p>增强了绝缘性能和机械强度的具有与双重绝缘同等防触电能力的单一绝缘</p>
<h4>设备分类</h4>
<ul>
<li><strong>0类设备</strong>：仅靠基本绝缘作为防触电保护的设备，当设备有能触及的可导电部分时，该部分不与设施固定布线中的保护（接地）线相连接，一旦基本绝缘失效，则安全性完全取决于使用环境。</li>
<li><strong>Ⅰ类设备</strong>：设备的防触电保护不仅靠基本绝缘，还包括一种附加的安全措施，即将能触及的可导电部分与设施固定布线中的保护（接地）线相连接。</li>
<li><strong>Ⅱ类设备</strong>：设备的防触电保护不仅靠基本绝缘还具备双重绝缘或加强绝缘这样的附加安全措施。这种设备不采用保护接地的措施，也不依赖于安装条件。</li>
<li><strong>Ⅲ类设备</strong>：设备的防触电保护依靠安全特低电压（SELV）供电，且设备内可能出现的电压不会高于安全特低电压。</li>
</ul>
<h4>造成危险之前自动切断电源</h4>
<ul>
<li>这种措施包括以下两方面要求：
<ul>
<li>外露可导电部分的保护联结(见8.2.3)</li>
<li>下列任一种方法：</li>
<li>在TN系统中，可以使用以下保护装置：
<ul>
<li>过流保护器件；</li>
<li>剩余电流保护装置(RCDs)和相关的过流保护装置；</li>
</ul></li>
<li>在TT系统中：
<ul>
<li>RCDs和相关的过流保护装置在检测绝缘故障时，能够自动断开电源；</li>
<li>若故障回路阻抗Zs的值适当偏低，且永久可靠，则可采用过流保护装置进行故障保护;</li>
</ul></li>
<li>在IT系统中应满足IEC 60364-4-41的相关要求。绝缘故障时，应保持声光信号。报警声光信号可以被手动屏蔽，这需要供应商和用户就提供绝缘监测设备和/或绝缘故障定位系统达成协议。</li>
</ul></li>
</ul>
<h3>6.4 采用PLEV保护（保护特低电压）</h3>
<ul>
<li>
<p>PELV电路应满足下列所有条件:</p>
<ul>
<li>当设备在干燥环境正常使用，带电部分与人体无大面积接触时，不超过25当然，以下是继续排版的内容：</li>
<li>当设备在干燥环境正常使用，带电部分与人体无大面积接触时，不超过25V AC方均根值或60V DC无纹波；其他情况，6V AC方均根值或15V DC无纹波；</li>
<li>电路的一端或该电路电源的一点应连接到保护联结点路上；</li>
<li>PELV电路的带电体应与其他带电回路电气隔离，电气隔离不应低于安全隔离变压器初级和次级电路之间的技术要求；</li>
<li>PELV电路用插头/插座应遵循以下规定：</li>
<li>插头应不能插入其他电压系统的插座；</li>
<li>插座应不接受其他电压系统的插头；</li>
</ul>
</li>
<li>
<p>PELV电源应为下列的一种：</p>
<ul>
<li>符合IEC 61558-1 和IEC 61558-2-6 的安全隔离变压器；</li>
<li>安全等级等效于安全隔离变压器的电流源；</li>
<li>电化学电源（如电池）或其他独立的较高电压电路电源；</li>
<li>符合适用标准的电子电源，该标准规定要采取措施以保证即使出现内部故障，输出端子的电压也不超过规定值。</li>
</ul>
</li>
</ul>
<h2>7. 设备保护</h2>
<h3>7.1 电气设备的保护措施</h3>
<ul>
<li>由于短路而引起的过流</li>
<li>过载和电机冷却缺失</li>
<li>异常温度</li>
<li>失压或欠压</li>
<li>机器或者机器上元件的超速</li>
<li>接地故障</li>
<li>相序错误</li>
<li>闪电和开关浪涌引起的过电压</li>
</ul>
<h3>7.2 过流保护</h3>
<ul>
<li>电气设备电路中的电流如果会超过元件的额定值或导线的载流能力，需要提供过流保护器件。</li>
<li><strong>电源线</strong>
<ul>
<li>电气设备供应商应在安装图文件中说明导线尺寸（包括可连接电气设备端子的供电导线的最大截面积）和过流保护装置选择所需的数据。</li>
</ul></li>
<li><strong>动力回路</strong>
<ul>
<li>每根带电导线包括控制电路变压器的供电电路应装设过电流检测和过电流断开器件；</li>
<li>当中性导体的截面积至少等于或等效于线路导体的截面积时，中性导体可以不提供过流检测或断开器件。</li>
</ul></li>
<li><strong>控制回路</strong>
<ul>
<li>由控制电路变压器或直流电源供电的控制电路导线应提供防止过电流保护措施：</li>
<li>控制电路连接到保护联接回路，在有开关的导线上插接过流保护器件；</li>
<li>控制电路未连接到保护联接回路：
<ul>
<li>当所有的控制回路具有相同的载流能力时，在有开关的导线上插接过流保护器件；</li>
<li>当不同的分支控制电路采用不用的载流能力时，在有开关的导线和各个分支电路的公共导线都要有过流保护器件。</li>
</ul></li>
</ul></li>
<li><strong>插座及其导线</strong>
<ul>
<li>主要用来给维修设备供电的通用插座，其供电回路应有过电流保护。这些插座的每个供电回路的未接地带电导线上均应设置过电流保护器件。</li>
</ul></li>
<li><strong>照明电路</strong>
<ul>
<li>供给照明电路的所有未接地导线，应使用单独的过电流保护器件防护短路。</li>
</ul></li>
<li><strong>变压器</strong>
<ul>
<li>变压器应安装过流保护装置，其类型和保护值应符合变压器制造商的说明。</li>
</ul></li>
<li><strong>过流保护装置的位置</strong>
<ul>
<li>过流保护装置应安装在导线截面积的减少或导线载流能力降低的位置，满足以下所有条件的除外：</li>
<li>导线的载流能力至少等于负载的容量；</li>
<li>导线载流能力减小处与连接过流保护器件处之间导线长度不大于3m；</li>
<li>采用减小短路可能性的方法安装导线，例如：导线用外壳或者管道进行保护。</li>
</ul></li>
<li><strong>过流保护器件的额定电流或其他过电流保护器件的整定电流应选择得尽可能小，但要满足预期的过电流通过，注意和导线线径的匹配。</strong></li>
</ul>
<h3>7.3 电动机的过热保护</h3>
<ul>
<li>额定功率大于0.5 kW 以上的电动机应提供电动机过热保护。</li>
<li>电动机的过热保护可由下列来实现:
<ul>
<li>过载保护</li>
<li>超温度保护</li>
</ul></li>
</ul>
<h3>7.4 异常温度的保护</h3>
<ul>
<li>设备应防止可能导致危险情况的异常温度。</li>
</ul>
<h3>7.5 对电源中断或电压跌落随后恢复的防护</h3>
<ul>
<li>如果电压跌落或中断会引起危险状况、损坏机械或工件，则应在预定的电压值下提供欠压保护。</li>
<li>应防止电压恢复或引入电源接通后机械自动气动，以免引起危险情况。</li>
</ul>
<h3>7.6 电机超速保护</h3>
<ul>
<li>如果超速能引起危险情况，则应考虑措施办法提供超速保护。超速保护应激发适当的控制响应，并应防止自行重新起动。</li>
</ul>
<h3>7.7 附加接地故障/残余电流保护</h3>
<ul>
<li>保护用于降低由于接地故障电流小于过电流保护检测水平而对电气设备造成的危险。</li>
<li>保护器件的整定值只要满足电气设备正确运行，应尽可能小。</li>
<li>如果可能有直流元件的故障电流，则需要选用符合IEC TR 60755的B型RCD。</li>
</ul>
<h3>7.8 相序保护</h3>
<ul>
<li>电源电压的相序错误会引起危险情况或损坏机械，应提供相序保护。</li>
</ul>
<h3>7.9 浪涌保护</h3>
<ul>
<li>由闪电或开关浪涌引起的过电压效应可用浪涌保护器件（SPD）防护：
<ul>
<li>用于抑制闪电过电压的SPD，应连接在电源断开装置的进线端子上；</li>
<li>用于抑制开关浪涌过电压的SPD，应连接到所有要求这种保护设备的端子。</li>
</ul></li>
</ul>
<p>当然，我们继续对剩余的内容进行Markdown排版和LaTeX公式处理。</p>
<h3>7.10 短路额定电流</h3>
<ul>
<li>应确定电气设备的短路额定电流。这可以通过应用设计原则或计算或试验来确定。</li>
<li><strong>注</strong>：短路额定电流值应该在铭牌或者安装手册中描述。</li>
</ul>
<h2>8. 等电位联结</h2>
<h3>8.1 机械电气设备等电位联结</h3>
<ul>
<li>保护联结电路:
<ol>
<li>保护导线（体）和PE端子的互联</li>
<li>外露可导电部分的连接</li>
<li>连接至用作保护导线（体）的电气设备安装板的保护导线（体）</li>
<li>电气设备可导电结构部分的连接</li>
<li>机械的可导电结构部分</li>
</ol></li>
<li>连接至保护联结电路的部件，该部件不用作保护导体:
<ol>
<li>柔性或刚性结构的金属管道</li>
<li>金属电缆护套或铠甲</li>
<li>含有可燃材料的金属管</li>
<li>外部可导电部分（独立于机械的电源接地、易引入电位，通常是地电位）［见17.2d）］例如:金属管、栅栏、梯子、扶手</li>
<li>柔性的或易弯的金属导线管</li>
<li>线撑架，电缆托架和电缆梯架的保护联结</li>
</ol></li>
<li>由于功能原因而连接到保护联结电路:
<ol>
<li>功能联结</li>
</ol></li>
</ul>
<h3>8.2 保护联结电路</h3>
<ul>
<li>每根保护导体不是构成电缆的一部分或与线路导体不在同一外壳内，其横截面积应不小于：
<ul>
<li>2.5 mm² 铜 或 16 mm² 铝，如果提供了防止机械损伤的保护；</li>
<li>4 mm² 铜 或 16 mm² 铝，如果没有提供防止机械损伤的保护。</li>
</ul></li>
<li>安装在管道、线槽或类似方式中的保护导体被认为是有机械防护的。</li>
<li><strong>保护导线</strong>
<ul>
<li>保护导线颜色黄绿色。</li>
<li>保护导线的材质推荐是铜。</li>
</ul></li>
<li><strong>保护接地电路的连续性</strong>
<ul>
<li>无论什么原因拆移部件时，不能使余留部件的保护联结回路的连续性中断。</li>
<li>门、防护罩、上盖，应确保其保护联结回路的连续性。</li>
<li>保护联结回路中不应包含开关电器，过流保护装置(开关，熔断器)或其他中断装置。</li>
<li>保护联结回路中若使用插头/插座组合时，保护联结回路应该先接通，后中断。</li>
</ul></li>
</ul>
<h2>9. 控制回路</h2>
<h3>9.1 控制回路</h3>
<ul>
<li><strong>交流回路的控制电压不得超过</strong>：
<ul>
<li>230V，标称频率50Hz；</li>
<li>277V，标称频率60Hz。</li>
</ul></li>
<li><strong>直流控制回路的标称电压不超过</strong> 220V。</li>
<li><strong>保护</strong>：应提供过流保护。</li>
<li><strong>隔离</strong>。</li>
</ul>
<h3>9.2 控制功能</h3>
<h4>9.2.1 起动</h4>
<ul>
<li>起动功能应通过激活相关电路来实现。</li>
<li>只有当所有相关的安全功能和/或保护措施就位后，才允许进行起动操作。</li>
<li>在起动危险机器操作之前，应考虑提供声音和/或视觉警告信号。</li>
</ul>
<h4>9.2.2 停止</h4>
<ul>
<li>根据机器的风险评估和机器的功能要求，提供0类和/或1类和/或2类停止功能：
<ul>
<li><strong>0类</strong>：立即切除机械致动机构的动力实现停止，不可控停止。</li>
<li><strong>1类</strong>：给机械致动机构施加动力实现停止，并在停止后切除动力，可控停止。</li>
<li><strong>2类</strong>：机械致动机构仍保留动力的情况下实现的可控停止。</li>
</ul></li>
<li>停止功能应覆盖相关的起动功能。</li>
<li>当有多个控制站时，依据机器的风险评估，任何控制站的停止命令均应生效。</li>
</ul>
<h4>9.2.3 操作</h4>
<ul>
<li>当一台机器有多个控制站时，应采取措施确保不同控制站发出的指令不会导致危险情况的发生。</li>
</ul>
<h4>9.2.4 紧急操作</h4>
<h5>9.2.4.1 紧急停止(EMS)</h5>
<ul>
<li>满足ISO 13850中的要求。</li>
<li>0类和1类停止功能。</li>
<li>它应覆盖所有模式下的所有其他功能和操作。</li>
<li>在不造成其他危险的情况下，应尽快停止危险运动。</li>
<li>复位不应引起重新启动。</li>
</ul>
<h5>9.2.4.2 紧急断开(EMO)</h5>
<ul>
<li>下列场合应该提供紧急断开：
<ul>
<li>基本防护只是通过置于手臂以外的防护或用障碍物防护来达到防护目的，或；</li>
<li>可能由电引起的伤害或危险操作模式。</li>
</ul></li>
</ul>
<h4>9.2.5 操作模式</h4>
<ul>
<li>每台机器可以有一种或多种操作模式（例如手动模式、自动模式、设置模式、维护模式），这取决于机器的类型及其应用。</li>
<li>机器的设计和构造允许其在若干控制或操作模式下使用，模式的选择应该配备一个选择器，选择器需要在每个位置有锁定功能。选择器的每个位置应清晰可辨，并应对应于单一操作或控制模式。</li>
<li>选择器可以由另一种选择方法代替，该方法可限制某类操作者使用机器的某些功能。（访问密码）</li>
<li>模式的选择不应引起机器的运行。</li>
</ul>
<h4>9.2.6 指令动作的监控</h4>
<ul>
<li>机械或者机器部件的运动或动作可能导致危险情况时，应对运动或动作进行监控，如超行程限制器，电机超速检测，机械过载检测或者防碰撞器件等装置。</li>
</ul>
<h4>9.2.7 Hold to run控制（点动控制）</h4>
<ul>
<li>持续激励直至工作完成。</li>
<li>结合风险分析，点动控制有可能需要进入安全回路而执行安全点动控制。</li>
</ul>
<h4>9.2.8 双手控制</h4>
<ul>
<li>参考ISO 13851。</li>
<li>三种模式：
<ul>
<li><strong>I型</strong>：双手联合引发的两个控制引发器件；危险情况下持续操作；危险存在时，释放任何一个控制引发器件或者两个都释放，均应该立即终止机械运行。（不适合引发危险操作）</li>
<li><strong>II型</strong>：I型的另一种控制，当要求机器重新启动运行时，需要先释放两个控制引发器件。</li>
<li><strong>III型</strong>：II型的另一种控制，联合引发需要满足：</li>
<li>在一定时限内启动两个控制引发器件，彼此之间启动时间差不超过0.5秒；</li>
<li>如果超过时限，应先释放两个控制引发器件，然后再重新操作才能引起机械运动。</li>
</ul></li>
<li>对于危险运动控制，通常适用III型。结合风险分析，双手控制有可能需要进入安全回路而执行安全双手控制。</li>
</ul>
<h4>9.2.9 使能控制</h4>
<ul>
<li>是一个具有联锁功能的手动激励控制：
<ul>
<li>被激励时，允许机械运行由独立的启动控制引发；</li>
<li>去除激励时：</li>
<li>引发停止功能，而且</li>
<li>防止机器再次运行。</li>
</ul></li>
<li>结合风险分析，使能控制有可能需要进入安全回路而执行安全使能控制。</li>
</ul>
<h3>9.3 联锁保护</h3>
<h4>9.3.1 联锁保护装置的重新闭合或复位</h4>
<ul>
<li>安全联锁装置的重新闭合或者复位不应引起危险的机械运转，以免发生危险。</li>
</ul>
<h4>9.3.2 超出工作限值</h4>
<ul>
<li>如果可能超过操作限值（例如速度、压力、位置）而导致危险情况则应提供检测方法，并启动适当的控制行动。</li>
</ul>
<h4>9.3.3 辅助功能的操作</h4>
<ul>
<li>如果辅助功能的器件不工作可导致危险状况或者损坏机械，应提供合适的联锁（压力/温度传感器）对这些器件进行检测。</li>
</ul>
<h4>9.3.4 不同工作和相反运动间的联锁</h4>
<ul>
<li>控制电机换向的接触器（控制电机旋转方向），使得在正常使用切换时不会发生短路。</li>
</ul>
<h4>9.3.5 反向电流制动</h4>
<ul>
<li>如果电机采用反向电流制动，应采取有效措施防止制动结束时电机反转，这种反转可能会造成危险状况或者损坏机器。不应只按时间作用原则进行控制。</li>
</ul>
<h4>9.3.6 安全功能和安全防护措施的暂停</h4>
<ul>
<li>如果需要暂停安全功能和/或保护措施（例如用于设置或维护），控制或操作模式选择器应同时：
<ul>
<li>禁止所有其他操作模式；</li>
<li>允许仅通过使用Hold to run控制装置或通过类似的控制装置进行操作，以便能够看到危险元素；</li>
<li>允许危险的操作仅在降低风险的条件下（例如降低速度，降低功率/力，逐步操作，例如使用有限的运动控制装置）；</li>
<li>在设备的传感器上，防止由任何随意或非随意动作导致危险功能的操作。</li>
</ul></li>
<li>如果不能同时满足这四个条件，控制或操作模式选择器应激活其他设计和构造的保护措施，以确保安全的干预区域。此外，操作员应能够从调整点控制他正在进行的部件的操作。</li>
</ul>
<h3>9.4 失效情况的控制功能</h3>
<h4>9.4.1 失效情况下减低风险的措施</h4>
<ul>
<li>采用成熟的电路技术和元件；</li>
<li>采用部分或者完整的冗余技术；</li>
<li>提供相异技术；</li>
<li>提供功能试验。</li>
</ul>
<h4>9.4.2 电气控制电路的性能等级</h4>
<ul>
<li>电气控制电路应有适当的性能等级，这个应该由风险评估而确定。</li>
<li>参考标准：ISO 13849-1, -2/ IEC 62061。</li>
</ul>
<h2>10. 操作面板和控制器件</h2>
<h4>10.1.2 位置和安装</h4>
<ul>
<li>容易接近</li>
<li>不易损坏</li>
<li>操作器不低于维修站台0.6m</li>
<li>进行操作时不会处于危险位置</li>
<li>意外操作的可能性最小</li>
</ul>
<h4>10.1.3 防护等级</h4>
<ul>
<li>IP4X或IPXXD</li>
</ul>
<h4>10.1.4 位置传感器</h4>
<ul>
<li>位置传感器(例如位置开关、接近开关)的布置应确保在超程时不会损坏</li>
</ul>
<h3>10.2 操动器</h3>
<h4>颜色</h4>
<ul>
<li>
<p><strong>ON</strong>：白色，灰色，绿色或黑色，优先使用白色，红色禁止</p>
</li>
<li>
<p><strong>OFF</strong>：黑色，灰色，红色（但不能置于急停件附近）或白色，优先使用黑色，绿色禁止</p>
</li>
<li>
<p><strong>红色</strong> 用于急停</p>
</li>
<li>
<p><strong>ON/OFF</strong>：白色，灰色或黑色。红色，黄色和绿色禁止</p>
</li>
<li>
<p><strong>点动</strong> ：白色，灰色或黑色。红色，黄色和绿色禁止</p>
</li>
<li>
<p><strong>RESET</strong>：蓝色，白色，灰色或黑色</p>
</li>
<li>
<p>黄色按钮应用于异常条件使用，如：自动循环中断事件</p>
</li>
<li>
<p>标志应在操动器附近，最好置于操动器上方</p>
</li>
</ul>
<h3>10.3 指示灯</h3>
<h4>指示灯使用的颜色</h4>
<table>
<thead>
<tr>
<th>颜色</th>
<th>含义</th>
<th>说明操作者的动作</th>
</tr>
</thead>
<tbody>
<tr>
<td>红</td>
<td>紧急危险情况</td>
<td>立即动作去处理维修情况（如断开机械电源，发出危险状态报警并保持机械的清楚状态）</td>
</tr>
<tr>
<td>黄</td>
<td>异常</td>
<td>异常情况，紧急临界情况，监视和(或)干预</td>
</tr>
<tr>
<td>绿</td>
<td>正常</td>
<td>正常情况，任选</td>
</tr>
<tr>
<td>蓝</td>
<td>强制性指示</td>
<td>操作者需要动作，强制性动作</td>
</tr>
<tr>
<td>白</td>
<td>无确定性质</td>
<td>其他情况，可用红，黄，绿，蓝的应用有疑问时，监视</td>
</tr>
</tbody>
</table>
<ul>
<li>机器上指示灯塔适用的颜色自顶向下依次为红、黄、蓝、绿和白色</li>
</ul>
<h3>10.4 带灯光的按钮</h3>
<ul>
<li>颜色符合按钮要求</li>
</ul>
<h3>10.5 旋转控制装置</h3>
<ul>
<li>不应只靠摩擦力固定，应有位置锁定</li>
</ul>
<h3>10.6 启动装置</h3>
<ul>
<li>尽量减少意外启动的可能</li>
</ul>
<h3>10.7 紧急停止装置</h3>
<h4>位置</h4>
<ul>
<li>应易于接近</li>
<li>设置于要求引发急停功能的各个位置</li>
</ul>
<h4>型式</h4>
<ul>
<li>
<p>包括但不限于下列型式：</p>
<ul>
<li>蘑菇头型式的按钮装置</li>
<li>拉线开关</li>
<li>无机械防护罩的脚踏开关</li>
</ul>
</li>
<li>
<p>急停器件应符合IEC 60947-5-5</p>
</li>
</ul>
<h3>10.8 紧急断开装置</h3>
<h4>位置</h4>
<ul>
<li>应根据给定应用的需要设置紧急断开装置</li>
<li>通常，紧急断开装置与操作员控制站分开放置，防止与急停器件混淆（如使用安全玻璃外壳）</li>
</ul>
<h4>型式</h4>
<ul>
<li>
<p>包括但不限于下列型式：</p>
<ul>
<li>蘑菇头型式的按钮开关</li>
<li>拉线开关</li>
</ul>
</li>
<li>
<p>紧急断开器件应符合IEC 60947-5-1</p>
</li>
<li>
<p>电源开关作为紧急断开装置</p>
<ul>
<li>用电源切断开关本身操作实现紧急断开，它应易于触及并应满足10.2.1 的颜色要求</li>
</ul>
</li>
</ul>
<h2>11. 位置和安装</h2>
<h3>11.2 易接近性和维护</h3>
<ul>
<li>
<p>易于从正面操作和维修</p>
</li>
<li>
<p>常规需要维修的零部件：0.4m-2m</p>
</li>
<li>
<p>端子：高于0.2m</p>
</li>
<li>
<p>当控制装置通过插件(如重载插头)方式连接时，它们的关联应通过类型（形状）、标记或参考名称明确说明</p>
</li>
</ul>
<h3>11.2 实际隔离或分组</h3>
<ul>
<li>与电气设备无直接联系的非电气部件和器件(电磁阀)不应安装在有控制器件的外壳中</li>
<li>单独分组：供电电路、控制电路、其他电路</li>
<li>热效应：限制在许可的温度内</li>
<li>电气设备外壳内的温升不得超过部件制造商规定的环境温度；发热元件（例如散热器、功率电阻器）的位置应使附近每个元件的温度保持在允许的范围内。</li>
</ul>
<h3>11.3 防护等级</h3>
<ul>
<li>不低于IP22</li>
<li>根据实际情况考虑：
<ul>
<li>电机启动电阻或者大型通风电柜： IP10</li>
<li>装有其他设备的通风电柜： IP32</li>
<li>一般工业用电柜： IP32, IP43, IP54</li>
<li>低压喷水清洗区域电柜： IP55</li>
<li>防细粉尘的电柜： IP65</li>
<li>含汇流环装置的电柜： IP2X</li>
</ul></li>
</ul>
<h3>11.4 电柜，门，开孔</h3>
<ul>
<li><strong>电柜</strong> ：材料应承受机械、电气和热应力以及正常工作可能遇到的环境影响</li>
<li><strong>门</strong> ：不大于0.9m宽度，并且最小95度开口</li>
<li><strong>开口</strong> ：不破坏电气箱的IP等级</li>
</ul>
<h3>11.5 电气设备通道</h3>
<ul>
<li>0.7m 宽；2m 高</li>
<li>向外开门</li>
<li>应允许从里面开门，不能使用钥匙或者工具</li>
</ul>
<h2>12. 导线和电缆</h2>
<h3>导线</h3>
<ul>
<li>PVC线要满足IEC 60227，橡胶线满足IEC 60245的要求</li>
</ul>
<h3>绝缘</h3>
<ul>
<li>2000V/500V(PELV) 5min不击穿</li>
</ul>
<h3>电压降</h3>
<ul>
<li>从电源端到负载的压降不应超过额定电压的&lt;5%</li>
</ul>
<h3>最小线径</h3>
<table>
<thead>
<tr>
<th>位置用途</th>
<th>电芯多芯软线 Class 5/6</th>
<th>硬线 Class 1</th>
<th>绞线 Class 2</th>
<th>双芯屏蔽</th>
<th>双芯非屏蔽</th>
<th>三芯或三芯以上屏蔽或非屏蔽</th>
</tr>
</thead>
<tbody>
<tr>
<td>保护外壳外部布线</td>
<td>1.0</td>
<td>1.5</td>
<td>0.75</td>
<td>0.75</td>
<td>0.75</td>
</tr>
<tr>
<td>动力电路，频繁运动</td>
<td>1.0</td>
<td>-</td>
<td>0.75</td>
<td>0.75</td>
<td>0.75</td>
</tr>
<tr>
<td>控制电路</td>
<td>1.0</td>
<td>1.0</td>
<td>0.2</td>
<td>0.5</td>
<td>0.2</td>
</tr>
<tr>
<td>数据通讯</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>0.08</td>
</tr>
<tr>
<td>外壳内部布线</td>
<td>0.75</td>
<td>0.75</td>
<td>0.75</td>
<td>0.75</td>
<td>0.75</td>
</tr>
<tr>
<td>控制电路</td>
<td>0.2</td>
<td>0.2</td>
<td>0.2</td>
<td>0.2</td>
<td>0.2</td>
</tr>
<tr>
<td>数据通讯</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>0.08</td>
</tr>
</tbody>
</table>
<h2>13. 连接和走线</h2>
<h3>13.1 连接和走线</h3>
<ul>
<li>保护接地线防松</li>
<li>只有专门设计的端子才允许一个端子连接两根或者多根导线。保护接地端子只允许一个端子接一根线</li>
<li>使用接线端子（标识）、防止电化学腐蚀</li>
<li>走线方式：端子-端子</li>
<li>不同线路的导线：不同电压要隔离</li>
</ul>
<h3>13.2 导线标识</h3>
<ul>
<li>布线需要用颜色或线号标识</li>
<li>当使用颜色时需满足：
<ul>
<li>动力线：黑色</li>
<li>零线：浅蓝色</li>
<li>保护接地线：黄绿色</li>
<li>例外电路：橙色</li>
<li>交流控制线：红色</li>
<li>直流控制线：蓝色</li>
</ul></li>
<li>为防止混淆，绿色、黄色线不允许使用</li>
</ul>
<h3>13.3 柜内导线</h3>
<ul>
<li>通过线槽，管道或其他方式固定支撑</li>
<li>不要阻碍接近任何部件或器件</li>
<li>容易辨识</li>
<li>动力和控制线路分离</li>
<li>接至柜门的线路注意保护以免损伤</li>
<li>无法由主开关切断的带电导线需加警告标识</li>
<li>槽满率不超过50%</li>
</ul>
<h3>13.4 柜外导线</h3>
<ul>
<li>和机器运动部件的连接时采用柔性连接</li>
<li>避免碰到锐边锐角否则需保护</li>
<li>外部通道：防止机械冲击</li>
<li>机器上部件的连接尽量采用插头插座的方式连接，以便运输的拆卸</li>
</ul>
<h2>15. 插座和照明</h2>
<h3>15.1 插座</h3>
<ul>
<li>
<p>当机器或其附属设备安装有插座时，满足下列要求：</p>
<ul>
<li>
<p>插座满足IEC60309-1，要标注电压和电流的额定值</p>
</li>
<li>
<p>确保插座保护接地回路的连续性</p>
</li>
<li>
<p>超过30A的插座需要与其开关进行互锁</p>
</li>
<li>
<p>提供合适的过电流保护和(必要时的)过载保护，并与其他电路的保护导线分开</p>
</li>
<li>
<p>供应额定电流不超过20A的插</p>
</li>
<li>
<p>供应额定电流不超过20A的插座的电路，应提供额定工作电流不超过30mA的剩余电流保护(RCDs)</p>
</li>
</ul>
</li>
</ul>
<h3>15.2 机器和电气设备的局部照明</h3>
<ul>
<li>开关不应装在灯座或悬挂在软线上</li>
<li>照明线路两导线间电压不应超过250V，宜小于50V</li>
<li>独立的过流保护</li>
<li>灯座符合IEC标准</li>
</ul>
<h2>16. 标记、警告标志和编号</h2>
<ul>
<li>ISO 3864 黄底黑字；</li>
<li>功能符号：IEC60417 和ISO7000</li>
<li>控制设备铭牌内容：
<ul>
<li>制造商名称、商标</li>
<li>产品型号</li>
<li>序列号</li>
<li>主文件号</li>
<li>额定电压，相数、满载电流值</li>
</ul></li>
<li>推荐将这些信息放在主开关附近。</li>
<li>请注意每个电柜均应有自己的铭牌，有和图纸对应的唯一编号</li>
</ul>
<h2>17. 技术文件（目的地国家官方语言）</h2>
<h3>技术文挡要求</h3>
<ul>
<li>基本信息(电气设备正常的运行条件、搬运、运输和存放的条件及不合适的使用等)</li>
<li>安装图(指导设备的现场安装)</li>
<li>方框图和功能图（反应各部分之间的功能关系）</li>
<li>电路图</li>
<li>操作手册（安装和使用）</li>
<li>维修手册（调整、维护、预防性检查及修理）</li>
<li>零部件清单</li>
</ul>
<h2>18. 测试</h2>
<h3>接地电阻连续性测试</h3>
<ul>
<li>要求10A测试电流</li>
<li>接地电阻小于0.1Ω</li>
</ul>
<h3>绝缘电阻测试</h3>
<ul>
<li>要求：绝缘电阻大于1MΩ</li>
</ul>
<h3>耐压测试</h3>
<ul>
<li>要求：1000V, 至少1s, 无电压跌落，无异常</li>
</ul>
<h3>残余电压测试</h3>
<ul>
<li>60V</li>
</ul>
<h3>功能性测试</h3>
<ul>
<li>相关的功能需要被测试</li>
</ul>
<h3>电缆载流能力</h3>
<table>
<thead>
<tr>
<th></th>
<th>敷设方法（参见 D.2.2）</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>B1</td>
<td>B2</td>
<td>C</td>
<td>E</td>
</tr>
<tr>
<td>截面积 (mm²)</td>
<td>三相电路用载流量 $I_z$ A</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>0.75</td>
<td>8.6</td>
<td>8.5</td>
<td>9.8</td>
<td>10.4</td>
</tr>
<tr>
<td>1.0</td>
<td>10.3</td>
<td>10.1</td>
<td>11.7</td>
<td>12.4</td>
</tr>
<tr>
<td>1.5</td>
<td>13.5</td>
<td>13.1</td>
<td>15.2</td>
<td>16.1</td>
</tr>
<tr>
<td>2.5</td>
<td>18.3</td>
<td>17.4</td>
<td>21</td>
<td>22</td>
</tr>
<tr>
<td>4</td>
<td>24</td>
<td>23</td>
<td>28</td>
<td>30</td>
</tr>
<tr>
<td>6</td>
<td>31</td>
<td>30</td>
<td>36</td>
<td>37</td>
</tr>
<tr>
<td>10</td>
<td>44</td>
<td>40</td>
<td>50</td>
<td>52</td>
</tr>
<tr>
<td>16</td>
<td>59</td>
<td>54</td>
<td>66</td>
<td>70</td>
</tr>
<tr>
<td>25</td>
<td>77</td>
<td>70</td>
<td>84</td>
<td>88</td>
</tr>
<tr>
<td>35</td>
<td>96</td>
<td>86</td>
<td>104</td>
<td>110</td>
</tr>
<tr>
<td>50</td>
<td>117</td>
<td>103</td>
<td>125</td>
<td>133</td>
</tr>
<tr>
<td>70</td>
<td>149</td>
<td>130</td>
<td>160</td>
<td>171</td>
</tr>
<tr>
<td>95</td>
<td>180</td>
<td>156</td>
<td>194</td>
<td>207</td>
</tr>
<tr>
<td>120</td>
<td>208</td>
<td>179</td>
<td>225</td>
<td>240</td>
</tr>
<tr>
<td>控制电路线对</td>
<td>控制电路线对</td>
<td>控制电路线对</td>
<td>控制电路线对</td>
<td>控制电路线对</td>
</tr>
<tr>
<td>--------------</td>
<td>------------------------</td>
<td>------------</td>
<td>------------</td>
<td>------------</td>
</tr>
<tr>
<td>0.2</td>
<td>4.5</td>
<td>4.3</td>
<td>4.4</td>
<td>4.4</td>
</tr>
<tr>
<td>0.5</td>
<td>7.9</td>
<td>7.5</td>
<td>7.5</td>
<td>7.8</td>
</tr>
<tr>
<td>0.75</td>
<td>9.5</td>
<td>9.0</td>
<td>9.5</td>
<td>10</td>
</tr>
</tbody>
</table>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/09/03/%E7%94%B5%E6%B0%94%E5%B8%B8%E7%94%A8%E5%85%83%E5%99%A8%E4%BB%B6%E6%A6%82%E8%BF%B0/</id>
      <title type="text">电气常用元器件概述</title>
      <published>2024-09-03T00:00:00.000Z</published>
      <updated>2025-02-24T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/09/03/%E7%94%B5%E6%B0%94%E5%B8%B8%E7%94%A8%E5%85%83%E5%99%A8%E4%BB%B6%E6%A6%82%E8%BF%B0/"/>
      <summary type="text">系统组件说明 1513-1 功能：CPU-单晶炉部分逻辑程序的设计，存储及控制。 主要参数：处理器速度、内存容量、I/O通道数量。 通讯接口：以太网、RS485、Profibus等。 分布式IO模块 功能：与1513-1通讯，为各数字量/模拟量的输入及输出提供接口，并实现信号采集和输出。 开关电源 功能：主要使用DC开关电源，即AC/DC电源。主要以DC24</summary>
      <content type="html"><![CDATA[<h2>系统组件说明</h2>
<ol>
<li>
<p><strong>1513-1</strong></p>
<ul>
<li>功能：CPU-单晶炉部分逻辑程序的设计，存储及控制。</li>
<li>主要参数：处理器速度、内存容量、I/O通道数量。</li>
<li>通讯接口：以太网、RS485、Profibus等。</li>
</ul>
</li>
<li>
<p><strong>分布式IO模块</strong></p>
<ul>
<li>功能：与1513-1通讯，为各数字量/模拟量的输入及输出提供接口，并实现信号采集和输出。</li>
</ul>
</li>
<li>
<p><strong>开关电源</strong></p>
<ul>
<li>功能：主要使用DC开关电源，即AC/DC电源。主要以DC24V最为常见，电子行业还有DC5V和DC12V等。</li>
<li>作用：提供稳定的直流24V，多用于传感器、电磁阀、继电器、PLC模块供电、按钮指示灯等所有供电电源是DC24V的设备。</li>
<li>主要参数：单相交流供电、三相交流供电。</li>
<li>安装方式：导轨安装。</li>
</ul>
</li>
<li>
<p><strong>继电器端子台</strong></p>
<ul>
<li>功能：为PLC输出控制负载的转接使用。</li>
<li>主要参数：额定电压、额定电流、触点形式（如常开、常闭）。</li>
</ul>
</li>
<li>
<p><strong>时继</strong></p>
<ul>
<li>功能：为需要延时控制的负载提供逻辑及接口（延时导通）。</li>
<li>类型：通电延时型、断电延时型、星三角启动延时型等。</li>
</ul>
</li>
<li>
<p><strong>小型继电器</strong></p>
<ul>
<li>功能：为PLC输出控制负载的转接使用。</li>
<li>主要参数：线圈电压、触点容量、触点形式、响应时间。</li>
</ul>
</li>
<li>
<p><strong>1214C CPU</strong></p>
<ul>
<li>功能：用于各伺服轴的接口控制。</li>
</ul>
</li>
<li>
<p><strong>差分转换板</strong></p>
<ul>
<li>功能：为获取伺服脉冲位置信号的转接板（差分转集电极）。</li>
<li>主要参数：输入/输出电压范围、最大频率响应。</li>
</ul>
</li>
<li>
<p><strong>行程开关</strong></p>
<ul>
<li>功能：控制柜内照明灯。</li>
<li>类型：滚轮式、柱塞式、摆杆式等。</li>
<li>主要参数：额定电压、额定电流、触点形式。</li>
</ul>
</li>
<li>
<p><strong>重载航插</strong></p>
<ul>
<li>功能：信号接入接出。</li>
</ul>
</li>
<li>
<p><strong>电源/网络面板</strong></p>
<ul>
<li>功能：提供AC220V电源及以太网插口。</li>
<li>主要参数：插座数量、网络端口速率（如100Mbps、1Gbps）。</li>
</ul>
</li>
<li>
<p><strong>小型断路器</strong></p>
<ul>
<li>功能：控制交直流负载的开/关，及为其提供短路和过载保护。</li>
<li>注意事项：大于电机额定电流，通常为电机额定电流1.2倍；</li>
</ul>
</li>
<li>
<p><strong>伺服驱动器</strong></p>
<ul>
<li>功能：用来实现伺服电机的精确闭环控制。</li>
<li>主要参数：额定功率、输入电压、通讯接口（如CAN、EtherCAT）、控制模式（速度模式、位置模式、力矩模式）。</li>
</ul>
</li>
<li>
<p><strong>步进驱动器</strong></p>
<ul>
<li>功能：用来实现步进电机的精确开环控制。</li>
<li>主要参数：额定电流、细分数、输入电压、控制信号类型（脉冲/方向）。</li>
</ul>
</li>
<li>
<p><strong>电源滤波器</strong></p>
<ul>
<li>功能：为PLC、伺服驱动器、IO模块等提供纯净电源，滤除因整流、变频等设备导致的高频电磁噪声和电源谐波，减少对AC220V电源带来的污染和干扰。</li>
</ul>
</li>
<li>
<p><strong>相序保护器</strong></p>
<ul>
<li>功能：为液压站电机提供错相、缺相、三相不平衡保护。</li>
<li>安装方式：35mm导轨安装。</li>
<li>使用要点：注意主回路接线牢固，辅助控制触点常开常闭点位的接法。</li>
<li>主要参数：额定电压、工作频率、响应时间。</li>
</ul>
</li>
<li>
<p><strong>接触器+热继</strong></p>
<ul>
<li>功能：为控制液压站电机的频繁通断及过载保护。</li>
<li>安装方式：配合接触器安装。</li>
<li>工作原理：由流入热元件的电流产生热量，使有不同膨胀系数的双金属片发生形变，当形变达到一定距离时，就推动连杆动作，使控制电路断开。</li>
<li>使用要点：选型适当、调节适当；保证电机短时过载和启动瞬间热继电器不受影响，但又不失保护作用。通常选择0.95~1.05倍电机额定电流。</li>
<li>交流接触器的选择：持续运行的设备：接触器按67-75%选型。间断运行的设备：接触器按80%选型。短时工作的设备：接触器按116-120%选型。</li>
</ul>
</li>
<li>
<p><strong>豪托变送器</strong></p>
<ul>
<li>功能：连接豪托传感器，并采样和计算获得对应的压力值。</li>
<li>主要参数：输入信号类型、输出信号类型（如4-20mA、0-10V）、精度等级。</li>
</ul>
</li>
<li>
<p><strong>塑壳断路器</strong></p>
<ul>
<li>功能：主要用于电路的过载保护、短路保护和欠电压保护；主要用于不频繁接通和断开的电路。</li>
<li>安装方式：以螺钉打孔安装为主。</li>
</ul>
</li>
<li>
<p><strong>微型断路器</strong></p>
<ul>
<li>功能：主要用于电路的过载保护、短路保护和欠电压保护；规格型号主要为63A以下，相比塑壳断路器小很多；主要用于不频繁接通和断开的电路。</li>
<li>安装方式：35mm导轨安装。</li>
<li>选型要点：容量合适、脱扣特性匹配。</li>
<li><strong>脱扣曲线</strong>：
<ul>
<li><strong>A型</strong>：磁脱扣电流为（2-3）In，适用于保护半导体电子线路，带小功率电源变压器的测量回路或线路长且电流小的系统。</li>
<li><strong>B型</strong>：磁脱扣电流为（3-5）In，适用于保护住户配电系统，家用电器的保护和人身安全保护。</li>
<li><strong>C型</strong>：磁脱扣电流为（5-10）In，适用于保护配电线路以及具有较高接通电流的照明线路。</li>
<li><strong>D型</strong>：磁脱扣电流为（10-14）In，适用于保护具有很高冲击电流的设备，如变压器，电磁阀，电机等。</li>
</ul></li>
<li>其中In指断路器的额定电流。</li>
</ul>
</li>
<li>
<p><strong>交流接触器</strong></p>
<ul>
<li>功能：主要用于远距离、频繁接通与断开，并可与适当的热继电器组合使用以保护可能过载的电路。</li>
<li>安装方式：主要以35mm导轨安装，容量较大的可能以螺钉安装。</li>
</ul>
</li>
<li>
<p><strong>中间继电器</strong></p>
<ul>
<li>功能：主要用于控制回路传递信号、继电保护，也用于小电流的负载回路接通与断开。</li>
<li>工作原理：通过线圈的得电建立磁性，吸引衔铁，再带动弹片使常开触点导通，同时使常闭触点断开；失电时在复位弹簧作用力下，常开触点断开，常闭触点导通。</li>
<li>参数：线圈电压、触点容量、触点对数。</li>
<li>安装方式：导轨安装。</li>
</ul>
</li>
<li>
<p><strong>时间继电器</strong></p>
<ul>
<li>功能：指加入（或去掉）输入信号，经过设定的时间后触头动作，实现延时控制的电器。</li>
<li>类型：主要分为通电延时型和断电延时型。</li>
<li>安装方式：主要为导轨式。</li>
</ul>
</li>
<li>
<p><strong>伺服系统</strong></p>
<ul>
<li>功能：使物体的位置、速度、加减速和状态等能够跟随输入目标而变化的自动控制系统。一般包含伺服驱动器（控制器）和伺服电机（执行器）。</li>
<li>伺服主要靠脉冲来定位：
<ul>
<li>伺服电机接收到1个脉冲，就会旋转1个脉冲对应的角度，从而实现位移。</li>
<li>定位脉冲数量 → 电机的转数 → 定位步的位移。</li>
<li>定位脉冲频率 → 电机的转速。</li>
</ul></li>
<li>伺服系统的常用参数：
<ul>
<li><strong>分辨率（F）</strong>：伺服电机编码器每转一圈的脉冲数。</li>
<li><strong>脉冲频率（f）</strong>：驱动器每秒发出的脉冲数。</li>
<li><strong>导程（d）</strong>：电机转一圈负载的位移量。</li>
</ul></li>
<li>参数关系式：
<ul>
<li>脉冲数（s）与负载位移（l）之间的关系：$l=s\times d/F$。</li>
<li>脉冲频率（f）与电机转速（n）之间的关系：$n=60\times f/F$。</li>
</ul></li>
<li>伺服电机的闭环控制系统包括：
<ul>
<li><strong>电流环</strong>：输入是速度环PID的输出，反馈是驱动器内的霍尔元件。</li>
<li><strong>速度环</strong>：输入是位置环PID的输出，反馈是编码器值换算后得到的实际速度。</li>
<li><strong>位置环</strong>：输入是上位机设定的目标值，反馈是编码器值。</li>
</ul></li>
<li>三环示意图：
<ul>
<li>位置环 → 速度环 → 电流环（从内到外顺序）。</li>
</ul></li>
</ul>
</li>
<li>
<p><strong>磁性开关</strong></p>
<ul>
<li>功能：利用磁场信号来控制的线路开关器件。</li>
<li>类型：气缸用磁性开关和安全门用磁性开关。
<ul>
<li><strong>气缸用磁性开关</strong>
<ul>
<li><strong>类型</strong>：有触点式（机械舌簧）和无触点式（电子式）。
<ul>
<li><strong>有触点式（机械舌簧）</strong>：寿命短、无漏电电流。</li>
<li><strong>无触点式（电子式）</strong>：寿命半永久、有漏电流。</li>
</ul></li>
<li><strong>出线方式</strong>：二线式和三线式。</li>
</ul></li>
<li><strong>安全门用磁性开关</strong>
<ul>
<li>用于保证安全门的开关状态，确保操作人员的安全。</li>
</ul></li>
</ul></li>
</ul>
</li>
<li>
<p><strong>光电开关</strong></p>
<ul>
<li>功能：光电传感器一般由光源、光学通路和光电元件三部分组成，通过把光强度的变化转换成电信号的变化来实现控制目的。</li>
<li>分类：
<ul>
<li><strong>按光的发收模式分类</strong>：
<ul>
<li><strong>漫反射型</strong>：光源发出的光被物体反射回来，检测反射光的强度变化。</li>
<li><strong>反射板型（镜面反射）</strong>：光源发出的光被反射板反射回来，检测反射光的强度变化。</li>
<li><strong>对射型</strong>：光源和接收器分开安装，物体通过时遮挡光束，检测遮挡的光强度变化。</li>
</ul></li>
<li><strong>按光源类型分类</strong>：
<ul>
<li><strong>红外光源</strong>：常用于工业自动化中，检测距离较远。</li>
<li><strong>可见光源</strong>：适用于短距离检测。</li>
<li><strong>激光光源</strong>：用于高精度和长距离检测。</li>
</ul></li>
</ul></li>
<li>优点：
<ul>
<li>响应快</li>
<li>检测距离长（相对接近开关）</li>
<li>检测物体范围广（相对电感式接近开关）</li>
<li>非接触式检测（相对行程开关）</li>
</ul></li>
<li>检测距离比较：
<ul>
<li>对射型 &gt; 回归反射（反射板） &gt; 漫反射</li>
</ul></li>
</ul>
</li>
<li>
<p><strong>相电压与相电流</strong></p>
<ul>
<li>
<p><strong>相电压</strong></p>
<ul>
<li>含义：相电压是指在三相交流电系统中，每一相线与中性线之间的电压。</li>
<li>计算方法：
<ul>
<li><strong>对称三相系统</strong>：对于对称负载，三相电压的幅值相等，相位相差120度。
$$
V<em>{A} = V</em>{B} = V_{C}
$$</li>
<li><strong>不对称三相系统</strong>：对于不对称负载，三相电压的幅值和相位可能不等，需要通过具体的负载情况和电路分析来计算。</li>
</ul></li>
<li>应用：
<ul>
<li>用于电力系统的分析和故障检测。</li>
<li>用于电动机、发电机等三相设备的运行监测。</li>
</ul></li>
<li>特点：
<ul>
<li>反映了三相系统中单一相的电压情况。</li>
<li>在对称系统中，三相电压的幅值相等，相位差120度。</li>
</ul></li>
</ul>
</li>
<li>
<p><strong>相电流</strong></p>
<ul>
<li>含义：相电流是指在三相交流电系统中，每一相绕组通过的电流。三相系统包括三条相线，每条相线上的电流即为相电流。</li>
<li>计算方法：
<ul>
<li><strong>对称三相系统</strong>：对于对称负载，三相电流的幅值相等，相位相差120度。
$$
I<em>{A} = I</em>{B} = I_{C}
$$</li>
<li><strong>不对称三相系统</strong>：对于不对称负载，三相电流的幅值和相位可能不等，需要通过具体的负载情况和电路分析来计算。</li>
</ul></li>
<li>应用：
<ul>
<li>用于电力系统的分析和故障检测。</li>
<li>用于电动机、发电机等三相设备的运行监测。</li>
</ul></li>
<li>特点：
<ul>
<li>反映了三相系统中单一相的电流情况。</li>
<li>在对称系统中，三相电流的幅值相等，相位差120度。</li>
</ul></li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>线电压与线电流</strong></p>
<ul>
<li>
<p><strong>线电压</strong></p>
<ul>
<li>含义：线电压是指在三相交流电系统中，相线之间的电压。三相系统包括三条相线，线电压是任意两条相线之间的电压。</li>
<li>计算方法：
<ul>
<li><strong>对称三相系统</strong>：在对称负载的情况下，相电压与线电压的关系为：
$$
V<em>{L} = \sqrt{3} \cdot V</em>{P}
$$
其中，$V<em>{L}$ 是线电压，$V</em>{P}$ 是相电压。</li>
<li><strong>不对称三相系统</strong>：在不对称负载的情况下，线电压和相电压的关系较为复杂，需通过对具体电路的详细分析来计算。</li>
</ul></li>
<li>应用：
<ul>
<li>用于电力系统的设计和分析。</li>
<li>用于电动机、变压器等三相设备的故障诊断。</li>
</ul></li>
<li>特点：
<ul>
<li>反映了三相系统中相线之间的电压情况。</li>
<li>在对称系统中，线电压与相电压相差一个(\sqrt{3})倍数。</li>
</ul></li>
</ul>
</li>
<li>
<p><strong>线电流</strong></p>
<ul>
<li>含义：线电流是指在三相交流电系统中，流过每条电缆（或导线）的电流。三相系统包括三条相线和一条中性线，线电流是流过相线的电流。</li>
<li>计算方法：
<ul>
<li><strong>对称三相系统</strong>：在对称负载的情况下，线电流与相电流的关系为：
$$
I<em>{L} = \sqrt{3} \cdot I</em>{P}
$$
其中，$I<em>{L}$ 是线电流，$I</em>{P}$ 是相电流。</li>
<li><strong>不对称三相系统</strong>：在不对称负载的情况下，线电流和相电流的关系较为复杂，需通过对具体电路的详细分析来计算。</li>
</ul></li>
<li>应用：
<ul>
<li>用于电力系统的设计和分析。</li>
<li>用于电动机、变压器等三相设备的故障诊断。</li>
</ul></li>
<li>特点：
<ul>
<li>反映了三相系统中流过每条导线的电流情况。</li>
<li>在对称系统中，线电流与相电流相差一个$\sqrt{3}$倍数。</li>
</ul></li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>电缆标识符</strong></p>
<ul>
<li>
<p>含义：电缆标识符用于标识电缆的类型、结构、用途和规格，通过这些标识符，可以快速了解电缆的具体参数和用途。</p>
</li>
<li>
<p>判断方法：</p>
<ul>
<li><strong>单芯线</strong>：
<ul>
<li><strong>结构</strong>：只有一根导体，通常用于简单的电气连接。</li>
<li><strong>标识</strong>：一般用单个数字或字母表示，例如1x0.5，表示一根导体，截面积为0.5平方毫米。</li>
</ul></li>
<li><strong>双芯线</strong>：
<ul>
<li><strong>结构</strong>：有两根导体，适用于需要两条线路的电气连接。</li>
<li><strong>标识</strong>：通常用两个数字表示，例如2x0.5，表示两根导体，每根导体的截面积为0.5平方毫米。</li>
</ul></li>
<li><strong>多芯线</strong>：
<ul>
<li><strong>结构</strong>：包含多根导体，适用于复杂的电气连接。</li>
<li><strong>标识</strong>：用多个数字表示，例如3x1.5，表示三根导体，每根导体的截面积为1.5平方毫米。</li>
</ul></li>
<li><strong>双绞线</strong>：
<ul>
<li><strong>结构</strong>：两根导体绞合在一起，常用于数据传输和网络布线。</li>
<li><strong>标识</strong>：通常会标明对数，例如1x2x0.5，表示一对双绞线，每根导体的截面积为0.5平方毫米。</li>
</ul></li>
<li><strong>屏蔽线</strong>：
<ul>
<li><strong>结构</strong>：导体外有一层屏蔽层，用于减少电磁干扰。</li>
<li><strong>标识</strong>：通常在标识中加上“S”或“屏蔽”字样，例如RVVP，表示多芯铜芯聚氯乙烯绝缘聚氯乙烯护套带屏蔽软电缆。</li>
</ul></li>
<li><strong>护套线</strong>：
<ul>
<li><strong>结构</strong>：导体外有一层或多层保护套，用于增强电缆的机械强度和耐环境性。</li>
<li><strong>标识</strong>：通常在标识中加上“V”或“护套”字样，例如RVV，表示多芯铜芯聚氯乙烯绝缘聚氯乙烯护套软电缆。</li>
</ul></li>
</ul>
</li>
<li>
<p>特点：</p>
<ul>
<li><strong>单芯线</strong>：结构简单，易于安装和维护。</li>
<li><strong>双芯线</strong>：适用范围广，便于双线路连接。</li>
<li><strong>多芯线</strong>：适用于复杂系统，减少布线数量。</li>
<li><strong>双绞线</strong>：抗干扰能力强，适用于数据传输。</li>
<li><strong>屏蔽线</strong>：抗电磁干扰能力强，信号传输稳定。</li>
<li><strong>护套线</strong>：机械强度高，耐环境性强。</li>
</ul>
</li>
<li>
<p>注意事项：</p>
<ul>
<li>在选用电缆时，根据具体应用场合和电气要求选择合适的电缆类型和规格。</li>
<li>确保电缆标识符清晰、准确，以避免误操作。</li>
<li>定期检查电缆状况，确保其在使用过程中的安全和可靠性。</li>
</ul>
</li>
</ul>
</li>
</ol>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/08/30/modbus-tcp%E5%B8%A7%E7%BB%93%E6%9E%84%E8%AF%A6%E8%A7%A3/</id>
      <title type="text">Modbus TCP帧结构详解</title>
      <published>2024-08-30T00:00:00.000Z</published>
      <updated>2024-08-30T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/08/30/modbus-tcp%E5%B8%A7%E7%BB%93%E6%9E%84%E8%AF%A6%E8%A7%A3/"/>
      <summary type="text">Modbus TCP是基于TCP/IP协议的Modbus变体，常用于以太网网络中。与Modbus RTU和Modbus ASCII不同，Modbus TCP没有起始和结束静默时间，而是使用TCP/IP协议进行数据传输。以下是Modbus TCP帧结构的详细解释： Modbus TCP帧结构 Modbus TCP帧由以下几个部分组成： MBAP头（Modbus</summary>
      <content type="html"><![CDATA[<p>Modbus TCP是基于TCP/IP协议的Modbus变体，常用于以太网网络中。与Modbus RTU和Modbus ASCII不同，Modbus TCP没有起始和结束静默时间，而是使用TCP/IP协议进行数据传输。以下是Modbus TCP帧结构的详细解释：</p>
<h3>Modbus TCP帧结构</h3>
<p>Modbus TCP帧由以下几个部分组成：</p>
<ol>
<li><strong>MBAP头（Modbus Application Protocol Header）</strong></li>
<li><strong>PDU（Protocol Data Unit）</strong></li>
</ol>
<h4>1. MBAP头</h4>
<p>MBAP头包含7个字节，具体结构如下：</p>
<ul>
<li><strong>事务标识符（Transaction Identifier）</strong>: 2字节
<ul>
<li>用于匹配请求和响应。</li>
</ul></li>
<li><strong>协议标识符（Protocol Identifier）</strong>: 2字节
<ul>
<li>固定为0，表示Modbus协议。</li>
</ul></li>
<li><strong>长度（Length）</strong>: 2字节
<ul>
<li>表示后续数据的长度，包括单元标识符和PDU。</li>
</ul></li>
<li><strong>单元标识符（Unit Identifier）</strong>: 1字节
<ul>
<li>用于标识从设备，在Modbus TCP中通常用于网关场景。</li>
</ul></li>
</ul>
<h4>2. PDU（Protocol Data Unit）</h4>
<p>PDU包含以下部分：</p>
<ul>
<li><strong>功能码（Function Code）</strong>: 1字节
<ul>
<li>指定请求的操作类型（如读写寄存器）。</li>
</ul></li>
<li><strong>数据域（Data）</strong>: 可变长度
<ul>
<li>包含与功能码相关的数据（如寄存器地址和数量）。</li>
</ul></li>
</ul>
<h3>完整的Modbus TCP帧结构</h3>
<pre><code>+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| Transaction ID   | Protocol ID      | Length           | Unit ID          | Function Code    | Data             |
| (2 bytes)        | (2 bytes)        | (2 bytes)        | (1 byte)         | (1 byte)         | (N bytes)        |
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+</code></pre>
<h3>示例</h3>
<p>假设我们有一个读取保持寄存器（功能码0x03）的请求，其事务标识符为0x0001，协议标识符为0x0000，单元标识符为0x01，读取的寄存器地址为0x0010，数量为2。帧结构如下：</p>
<ul>
<li><strong>事务标识符</strong>: 0x0001</li>
<li><strong>协议标识符</strong>: 0x0000</li>
<li><strong>长度</strong>: 0x0006（1字节Unit ID + 1字节Function Code + 4字节Data）</li>
<li><strong>单元标识符</strong>: 0x01</li>
<li><strong>功能码</strong>: 0x03</li>
<li><strong>数据</strong>: 0x0010（起始地址） + 0x0002（寄存器数量）</li>
</ul>
<pre><code>+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| 0x00             | 0x01             | 0x00             | 0x00             | 0x00             | 0x06             | 0x01             | 0x03             | 0x00             | 0x10             | 0x00             | 0x02             |
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+</code></pre>
<h3>响应帧结构</h3>
<p>如果从设备响应读取请求，返回的帧结构如下：</p>
<ul>
<li><strong>事务标识符</strong>: 0x0001（与请求一致）</li>
<li><strong>协议标识符</strong>: 0x0000</li>
<li><strong>长度</strong>: 0x0005（1字节Unit ID + 1字节Function Code + 1字节Byte Count + N字节Data）</li>
<li><strong>单元标识符</strong>: 0x01</li>
<li><strong>功能码</strong>: 0x03</li>
<li><strong>字节计数</strong>: 0x04（读取2个寄存器，每个寄存器2字节）</li>
<li><strong>数据</strong>: 寄存器值（每个寄存器2字节）</li>
</ul>
<p>假设读取的寄存器值为0x1234和0x5678：</p>
<pre><code>+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| 0x00             | 0x01             | 0x00             | 0x00             | 0x00             | 0x07             | 0x01             | 0x03             | 0x04             | 0x12             | 0x34             | 0x56             | 0x78             |
+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+</code></pre>
<p><strong>更多通讯协议请访问--</strong><a href="https://www.rwr.ink/index.php/2024/08/30/%e5%b8%b8%e7%94%a8%e7%9a%84%e5%b7%a5%e4%b8%9a%e9%80%9a%e8%ae%af%e5%8d%8f%e8%ae%ae/">点击跳转</a></p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/08/30/st%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%9E%8B/</id>
      <title type="text">ST基础学习</title>
      <published>2024-08-30T00:00:00.000Z</published>
      <updated>2024-08-30T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/08/30/st%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%9E%8B/"/>
      <summary type="text">ST简单使用 程序功能分解 控制一个风扇的开关基于温度传感器的输入。 使用不同的模式来控制马达。 实现一个简单的计数器。 处理上升沿和下降沿触发事件。 实现一个基本的运动控制。 处理异常情况（如除0保护、数组越界等）。 实战程序 PROGRAM MainProgram VAR temperature: REAL := 0.0; // 温度传感器输入 fan:</summary>
      <content type="html"><![CDATA[<h4>ST简单使用</h4>
<h3>程序功能分解</h3>
<ol>
<li>控制一个风扇的开关基于温度传感器的输入。</li>
<li>使用不同的模式来控制马达。</li>
<li>实现一个简单的计数器。</li>
<li>处理上升沿和下降沿触发事件。</li>
<li>实现一个基本的运动控制。</li>
<li>处理异常情况（如除0保护、数组越界等）。</li>
</ol>
<h3>实战程序</h3>
<pre><code>PROGRAM MainProgram
VAR
    temperature: REAL := 0.0; // 温度传感器输入
    fan: BOOL := FALSE; // 风扇状态
    mode: INT := 0; // 模式选择
    motor: BOOL := FALSE; // 马达状态
    i, j, k, m: INT := 0; // 计数器
    signal: BOOL := FALSE; // 输入信号
    rising_edge, falling_edge: BOOL := FALSE; // 上升沿和下降沿
    r_trig_ins: R_TRIG; // 上升沿触发实例
    f_trig_ins: F_TRIG; // 下降沿触发实例
    array: ARRAY[1..10] OF INT := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; // 数组
    index: INT := 0; // 数组下标
    result: REAL; // 计算结果
END_VAR
<p>// 控制风扇的开关
IF temperature &gt; 100 THEN
fan := TRUE;
ELSIF temperature &gt; 80 THEN
fan := TRUE;
alarm := TRUE;
ELSE
fan := FALSE;
alarm := FALSE;
END_IF;</p>
<p>// 根据模式控制马达
CASE mode OF
1: motor := TRUE;
2: motor := FALSE;
3, 4, 5: motor := TRUE;
ELSE
motor := FALSE;
END_CASE;</p>
<p>// 简单计数器
WHILE i &lt; 10 DO
i := i + 1;
END_WHILE;</p>
<p>REPEAT
j := j + 1;
UNTIL j &gt;= 10
END_REPEAT;</p>
<p>// 使用EXIT指令
WHILE TRUE DO
k := k + 1;
IF k &gt;= 5 THEN
EXIT;
END_IF;
END_WHILE;</p>
<p>// FOR循环
FOR m := 1 TO 10 DO
x := x + m;
END_FOR;</p>
<p>// 上升沿和下降沿触发
r_trig_ins(CLK := signal, Q =&gt; rising_edge);
f_trig_ins(CLK := signal, Q =&gt; falling_edge);</p>
<p>// 异常处理示例
// 除0保护
IF denominator = 0 THEN
denominator := 1;
END_IF;
result := numerator / denominator;</p>
<p>// 数组越界处理
index := 11; // 故意设置一个越界的下标
IF index &gt; 10 THEN
index := 10;
END_IF;
value := array[index];</p>
<p>// 死循环检测
WHILE TRUE DO
// 模拟死循环
EXIT; // 提前退出以避免实际死循环
END_WHILE;</p>
</code><p><code>END_PROGRAM</code></p></pre><p></p>
<h3>解释</h3>
<ol>
<li>
<p><strong>风扇控制</strong>：根据温度传感器的输入来控制风扇的开关。如果温度超过100度，风扇开启；如果温度在80到100度之间，风扇和报警都开启；否则，风扇和报警都关闭。</p>
</li>
<li>
<p><strong>马达控制</strong>：根据模式选择来控制马达的状态。如果模式为1或3、4、5，马达开启；否则，马达关闭。</p>
</li>
<li>
<p><strong>计数器</strong>：使用WHILE和REPEAT循环来实现简单的计数器。</p>
</li>
<li>
<p><strong>EXIT指令</strong>：在一个无限循环中使用EXIT指令来提前退出。</p>
</li>
<li>
<p><strong>FOR循环</strong>：通过FOR循环来实现累加操作。</p>
</li>
<li>
<p><strong>上升沿和下降沿触发</strong>：使用R_TRIG和F_TRIG功能块来检测信号的上升沿和下降沿。</p>
</li>
<li>
<p><strong>异常处理</strong>：包括除0保护和数组越界处理。并且模拟了一个死循环的检测。</p>
</li>
</ol>
<h2>轴控等其他程序</h2>
<h3>实战程序</h3>
<pre><code>PROGRAM MainProgram
VAR
    // 基本轴控变量
    Axis: AXIS_REF; // 轴引用
    PowerStatus: BOOL;
    AxisError: BOOL;
    CurrentPosition: REAL;
    CurrentVelocity: REAL;
    CurrentTorque: REAL;
    MoveComplete: BOOL;
    ErrorID: INT;
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 编码器变量</span></div></div><div><div><div>2</div></div><div><span>EncoderStatus: BOOL;</span></div></div><div><div><div>3</div></div><div><span>EncoderPosition: REAL;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>// 定时器变量</span></div></div><div><div><div>6</div></div><div><span>Timer: TONR;</span></div></div><div><div><div>7</div></div><div><span>TimerElapsed: BOOL;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>// 中断变量</span></div></div><div><div><div>10</div></div><div><span>InterruptEnabled: BOOL;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>// 字符串变量</span></div></div><div><div><div>13</div></div><div><span>SourceString: STRING[20] := &amp;#039;Hello World&amp;#039;;</span></div></div><div><div><div>14</div></div><div><span>TargetString: STRING[20];</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>// 其他变量</span></div></div><div><div><div>17</div></div><div><span>RealResult: REAL;</span></div></div><div><div><div>18</div></div><div><span>MemoryBlock: ARRAY[1..10] OF BYTE;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<p>END_VAR</p>
<p>// 基本轴控指令
// 使能轴
MC_Power(Axis := Axis, Enable := TRUE, Status =&gt; PowerStatus, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 读取轴状态
MC_ReadStatus(Axis := Axis, Status =&gt; PowerStatus, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 读取轴故障
MC_ReadAxisError(Axis := Axis, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 读取当前位置信息
MC_ReadActualPosition(Axis := Axis, Position =&gt; CurrentPosition);</p>
<p>// 读取当前速度信息
MC_ReadActualVelocity(Axis := Axis, Velocity =&gt; CurrentVelocity);</p>
<p>// 读取当前力矩信息
MC_ReadActualTorque(Axis := Axis, Torque =&gt; CurrentTorque);</p>
<p>// 设置当前位置
MC_SetPosition(Axis := Axis, Position := 0.0, Execute := TRUE, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 相对定位
MC_MoveRelative(Axis := Axis, Distance := 100.0, Velocity := 10.0, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 绝对定位
MC_MoveAbsolute(Axis := Axis, Position := 50.0, Velocity := 10.0, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 速度指令
MC_MoveVelocity(Axis := Axis, Velocity := 10.0, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 点动
MC_Jog(Axis := Axis, JogForward := TRUE, Velocity := 5.0, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 力矩控制指令
MC_TorqueControl(Axis := Axis, Torque := 5.0, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 原点回归指令
MC_Home(Axis := Axis, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 停止指令
MC_Stop(Axis := Axis, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 急停指令
MC_ImmediateStop(Axis := Axis, Done =&gt; MoveComplete, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 编码器指令
// 使能编码器
ENC_Counter(Encoder := EncoderStatus, Enable := TRUE, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 读取编码器状态
ENC_ReadStatus(Encoder := EncoderStatus, Status =&gt; EncoderStatus, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 读取编码器位置
ENC_SetUnit(Encoder := EncoderStatus, Position := EncoderPosition, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 通讯指令
// 读取从站参数
ETC_ReadParameter_CoE(Slave := 1, Index := 0x2000, SubIndex := 1, Data := CurrentPosition, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 写入从站参数
ETC_WriteParameter_CoE(Slave := 1, Index := 0x2000, SubIndex := 1, Data := 100, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 重启主站
ETC_RestartMaster(Master := 1, Error =&gt; AxisError, ErrorID =&gt; ErrorID);</p>
<p>// 定时器指令
// 接通延时定时器
TONR(IN := TRUE, PT := T#5S, Q =&gt; TimerElapsed, ET =&gt; Timer.ET);</p>
<p>// 中断指令
// 开启中断
EI();</p>
<p>// 关闭中断
DI();</p>
<p>// 字符串指令
// 移动字符串
STRMOV(Source := SourceString, Dest := TargetString);</p>
<p>// 其他指令
// 实数取余
RealResult := ModReal(10.5, 3.2);</p>
<p>// 内存设置
MSET(DstAddr := ADR(MemoryBlock), SrcAddr := ADR(SourceString), Size := SIZEOF(SourceString));</p>
<p>// 内存复位
MCPY(DstAddr := ADR(MemoryBlock), SrcAddr := ADR(SourceString), Size := SIZEOF(SourceString));</p>
</code><p><code>END_PROGRAM
</code></p></pre><p></p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/08/30/%E5%B8%B8%E7%94%A8%E7%9A%84%E5%B7%A5%E4%B8%9A%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE/</id>
      <title type="text">常用的工业通讯协议</title>
      <published>2024-08-30T00:00:00.000Z</published>
      <updated>2024-08-30T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/08/30/%E5%B8%B8%E7%94%A8%E7%9A%84%E5%B7%A5%E4%B8%9A%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE/"/>
      <summary type="text">Modbus、RS232、RS485、Ethernet/IP、CAN和EtherCAT 对比表格 特性 Modbus RS232 RS485 Ethernet/IP CAN EtherCAT 类型 通信协议 硬件接口标准 硬件接口标准 工业以太网协议 通信协议 工业以太网协议 应用领域 工业自动化 数据通信 工业控制、数据采集 工业自动化 汽车电子、工业自动</summary>
      <content type="html"><![CDATA[<p><strong>Modbus、RS232、RS485、Ethernet/IP、CAN和EtherCAT</strong></p>
<h3>对比表格</h3>
<table>
<thead>
<tr>
<th>特性</th>
<th>Modbus</th>
<th>RS232</th>
<th>RS485</th>
<th>Ethernet/IP</th>
<th>CAN</th>
<th>EtherCAT</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>类型</strong></td>
<td>通信协议</td>
<td>硬件接口标准</td>
<td>硬件接口标准</td>
<td>工业以太网协议</td>
<td>通信协议</td>
<td>工业以太网协议</td>
</tr>
<tr>
<td><strong>应用领域</strong></td>
<td>工业自动化</td>
<td>数据通信</td>
<td>工业控制、数据采集</td>
<td>工业自动化</td>
<td>汽车电子、工业自动化</td>
<td>工业自动化</td>
</tr>
<tr>
<td><strong>传输介质</strong></td>
<td>串行（RS232, RS485）或以太网</td>
<td>串行电缆</td>
<td>双绞线</td>
<td>以太网</td>
<td>双绞线</td>
<td>以太网</td>
</tr>
<tr>
<td><strong>拓扑结构</strong></td>
<td>主从</td>
<td>点对点</td>
<td>多点</td>
<td>星形、树形等</td>
<td>总线型</td>
<td>菊花链、星形、树形</td>
</tr>
<tr>
<td><strong>通信速率</strong></td>
<td>9600 bps 到 115200 bps（串行）</td>
<td>最多1 Mbps，但通常为9600 bps到115200 bps</td>
<td>最多可达10 Mbps</td>
<td>10 Mbps, 100 Mbps, 1 Gbps</td>
<td>最多1 Mbps</td>
<td>100 Mbps</td>
</tr>
<tr>
<td><strong>传输距离</strong></td>
<td>取决于传输介质</td>
<td>最多15米</td>
<td>最长1200米</td>
<td>取决于网络设备</td>
<td>最长40米（1 Mbps），最长1公里（5 Kbps）</td>
<td>取决于网络设备</td>
</tr>
<tr>
<td><strong>抗干扰能力</strong></td>
<td>中等</td>
<td>低</td>
<td>高</td>
<td>高</td>
<td>高</td>
<td>高</td>
</tr>
<tr>
<td><strong>实时性</strong></td>
<td>低</td>
<td>低</td>
<td>中等</td>
<td>高</td>
<td>高</td>
<td>非常高</td>
</tr>
<tr>
<td><strong>同步性</strong></td>
<td>低</td>
<td>低</td>
<td>中等</td>
<td>高</td>
<td>高</td>
<td>非常高</td>
</tr>
<tr>
<td><strong>节点数</strong></td>
<td>通常最多247个（RS485）</td>
<td>2个（点对点）</td>
<td>最多32个节点（标准），扩展可达256个</td>
<td>理论上无限制</td>
<td>最多110个节点（标准），扩展可达2048个</td>
<td>理论上无限制</td>
</tr>
<tr>
<td><strong>错误检测</strong></td>
<td>CRC</td>
<td>奇偶校验、校验和</td>
<td>CRC</td>
<td>CRC、帧校验</td>
<td>CRC、位填充</td>
<td>CRC、帧校验</td>
</tr>
<tr>
<td><strong>优点</strong></td>
<td>简单、开放、易于实现</td>
<td>简单、成本低、广泛使用</td>
<td>抗干扰能力强、传输距离远</td>
<td>高速、支持实时通信</td>
<td>高可靠性、实时性强、抗干扰能力强</td>
<td>实时性强、低延迟、高精度同步</td>
</tr>
<tr>
<td><strong>缺点</strong></td>
<td>数据传输速率较低，不适合实时性要求高的应用</td>
<td>传输距离和速率有限，抗干扰能力差</td>
<td>实现复杂度较高，需要终端电阻匹配</td>
<td>实现成本较高，需要专业网络设备</td>
<td>传输速率较低，适用于中小规模数据传输</td>
<td>实现成本较高，网络配置复杂</td>
</tr>
<tr>
<td><strong>常见应用</strong></td>
<td>PLC、传感器、HMI</td>
<td>计算机串口、调制解调器</td>
<td>工业自动化、楼宇控制</td>
<td>工业控制、机器人</td>
<td>汽车电子、工业自动化</td>
<td>高精度运动控制、机器人</td>
</tr>
<tr>
<td><strong>标准/规范</strong></td>
<td>Modbus RTU, Modbus ASCII, Modbus TCP</td>
<td>EIA/TIA-232</td>
<td>EIA-485</td>
<td>ODVA (Open DeviceNet Vendors Association)</td>
<td>ISO 11898-1, ISO 11898-2</td>
<td>EtherCAT Technology Group (ETG)</td>
</tr>
</tbody>
</table>
<h3>更多技术细节</h3>
<ol>
<li>
<p><strong>Modbus</strong>:</p>
<ul>
<li><strong>帧结构</strong>: 起始位、地址域、功能码、数据域、校验码、结束位。</li>
<li><strong>数据类型</strong>: 支持离散输入、线圈、输入寄存器、保持寄存器。</li>
<li><strong>功能码</strong>: 常用功能码包括读输入状态（0x02）、读保持寄存器（0x03）、写单个线圈（0x05）、写单个寄存器（0x06）。</li>
</ul>
</li>
<li>
<p><strong>RS232</strong>:</p>
<ul>
<li><strong>信号电平</strong>: 正负电压，通常+12V和-12V。</li>
<li><strong>连接器类型</strong>: 常用DB9和DB25。</li>
<li><strong>通信模式</strong>: 全双工。</li>
</ul>
</li>
<li>
<p><strong>RS485</strong>:</p>
<ul>
<li><strong>信号电平</strong>: 差分信号，通常+5V和0V。</li>
<li><strong>连接器类型</strong>: 通常使用螺丝接线端子或RJ45。</li>
<li><strong>通信模式</strong>: 半双工或全双工。</li>
</ul>
</li>
<li>
<p><strong>Ethernet/IP</strong>:</p>
<ul>
<li><strong>协议栈</strong>: 基于TCP/IP和UDP/IP。</li>
<li><strong>实时性</strong>: 支持CIP Sync和CIP Motion用于时间同步和运动控制。</li>
<li><strong>服务</strong>: 支持Explicit Messaging和Implicit Messaging。</li>
</ul>
</li>
<li>
<p><strong>CAN</strong>:</p>
<ul>
<li><strong>帧结构</strong>: 起始位、仲裁域、控制域、数据域、CRC域、ACK域、结束位。</li>
<li><strong>错误处理</strong>: 具有错误检测和自动重传机制。</li>
<li><strong>优先级</strong>: 通过仲裁机制实现消息优先级。</li>
</ul>
</li>
<li>
<p><strong>EtherCAT</strong>:</p>
<ul>
<li><strong>帧结构</strong>: 基于以太网帧，包含EtherCAT数据包。</li>
<li><strong>实时性</strong>: 支持分布时钟机制，实现微秒级同步。</li>
<li><strong>拓扑结构</strong>: 支持灵活的拓扑结构，包括菊花链、星形和树形。</li>
</ul>
</li>
</ol>
<h3>帧协议内容</h3>
<p>当然，以下是对Modbus、RS232、RS485、Ethernet/IP、CAN和EtherCAT的帧结构的更详细解释：</p>
<h3>Modbus</h3>
<p>Modbus有多种变体，包括Modbus RTU、Modbus ASCII和Modbus TCP。以下是Modbus RTU的帧结构：</p>
<ul>
<li><strong>起始位</strong>: 通常是一个静默时间间隔（3.5个字符时间）。</li>
<li><strong>地址域</strong>: 1字节，标识从设备地址。</li>
<li><strong>功能码</strong>: 1字节，指定请求的操作类型（如读写寄存器）。</li>
<li><strong>数据域</strong>: 可变长度，包含与功能码相关的数据（如寄存器地址和数量）。</li>
<li><strong>校验码</strong>: 2字节，CRC校验码，用于错误检测。</li>
<li><strong>结束位</strong>: 通常是一个静默时间间隔（3.5个字符时间）。</li>
</ul>
<p><strong>关于Modbus TCP可点击--</strong><a href="https://www.rwr.ink/index.php/2024/08/30/modbus-tcp%e5%b8%a7%e7%bb%93%e6%9e%84%e8%af%a6%e8%a7%a3/">点我跳转</a></p>
<h3>RS232</h3>
<p>RS232是一个硬件接口标准，没有特定的帧结构，但常用的帧格式如下：</p>
<ul>
<li><strong>起始位</strong>: 1位，表示帧的开始，低电平。</li>
<li><strong>数据位</strong>: 5到8位，表示实际的数据。</li>
<li><strong>奇偶校验位</strong>: 1位，可选，用于错误检测。</li>
<li><strong>停止位</strong>: 1到2位，高电平，表示帧的结束。</li>
</ul>
<h3>RS485</h3>
<p>RS485也是一个硬件接口标准，常用于实现Modbus RTU等协议。其帧结构取决于上层协议，如Modbus RTU的帧结构：</p>
<ul>
<li><strong>起始位</strong>: 通常是一个静默时间间隔（3.5个字符时间）。</li>
<li><strong>地址域</strong>: 1字节，标识从设备地址。</li>
<li><strong>功能码</strong>: 1字节，指定请求的操作类型（如读写寄存器）。</li>
<li><strong>数据域</strong>: 可变长度，包含与功能码相关的数据（如寄存器地址和数量）。</li>
<li><strong>校验码</strong>: 2字节，CRC校验码，用于错误检测。</li>
<li><strong>结束位</strong>: 通常是一个静默时间间隔（3.5个字符时间）。</li>
</ul>
<h3>Ethernet/IP</h3>
<p>Ethernet/IP基于标准以太网帧，以下是其帧结构：</p>
<ul>
<li><strong>以太网帧头</strong>:
<ul>
<li><strong>目的MAC地址</strong>: 6字节。</li>
<li><strong>源MAC地址</strong>: 6字节。</li>
<li><strong>以太网类型</strong>: 2字节，通常为0x0800表示IPv4。</li>
</ul></li>
<li><strong>IP头</strong>:
<ul>
<li><strong>版本和头部长度</strong>: 1字节。</li>
<li><strong>服务类型</strong>: 1字节。</li>
<li><strong>总长度</strong>: 2字节。</li>
<li><strong>标识符</strong>: 2字节。</li>
<li><strong>标志和片偏移</strong>: 2字节。</li>
<li><strong>生存时间</strong>: 1字节。</li>
<li><strong>协议</strong>: 1字节，通常为0x11表示UDP或0x06表示TCP。</li>
<li><strong>头部校验和</strong>: 2字节。</li>
<li><strong>源IP地址</strong>: 4字节。</li>
<li><strong>目的IP地址</strong>: 4字节。</li>
</ul></li>
<li><strong>TCP/UDP头</strong>:
<ul>
<li><strong>源端口</strong>: 2字节。</li>
<li><strong>目的端口</strong>: 2字节。</li>
<li><strong>长度</strong>: 2字节（仅UDP）。</li>
<li><strong>校验和</strong>: 2字节。</li>
</ul></li>
<li><strong>CIP消息</strong>:
<ul>
<li><strong>命令</strong>: 1字节。</li>
<li><strong>路径</strong>: 可变长度。</li>
<li><strong>数据</strong>: 可变长度。</li>
</ul></li>
</ul>
<h3>CAN</h3>
<p>CAN帧结构分为标准帧和扩展帧，以下是标准帧的结构：</p>
<ul>
<li><strong>起始位</strong>: 1位，表示帧的开始。</li>
<li><strong>仲裁域</strong>: 11位，标识符，用于仲裁优先级。</li>
<li><strong>控制域</strong>: 6位，包含数据长度码（DLC），表示数据字段的字节数。</li>
<li><strong>数据域</strong>: 0到8字节，实际传输的数据。</li>
<li><strong>CRC域</strong>: 15位，CRC校验码，用于错误检测。</li>
<li><strong>ACK域</strong>: 2位，确认位。</li>
<li><strong>结束位</strong>: 7位，表示帧的结束。</li>
</ul>
<h3>EtherCAT</h3>
<p>EtherCAT帧结构基于以太网帧，以下是其结构：</p>
<ul>
<li><strong>以太网帧头</strong>:
<ul>
<li><strong>目的MAC地址</strong>: 6字节。</li>
<li><strong>源MAC地址</strong>: 6字节。</li>
<li><strong>以太网类型</strong>: 2字节，通常为0x88A4表示EtherCAT。</li>
</ul></li>
<li><strong>EtherCAT数据包</strong>:
<ul>
<li><strong>EtherCAT命令</strong>: 1字节，表示EtherCAT命令类型。</li>
<li><strong>长度</strong>: 2字节，表示数据长度。</li>
<li><strong>循环计数</strong>: 1字节，表示帧的循环次数。</li>
<li><strong>数据</strong>: 可变长度，实际传输的数据。</li>
<li><strong>工作计数</strong>: 2字节，表示处理节点数。</li>
</ul></li>
<li><strong>帧校验序列（FCS）</strong>: 4字节，标准以太网帧的CRC校验码。</li>
</ul>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/08/30/%E6%99%BA%E8%B0%B1ai%E5%85%B3%E4%BA%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%E7%9A%84%E5%90%AF%E5%8F%91/</id>
      <title type="text">智谱AI关于情感分析的启发</title>
      <published>2024-08-30T00:00:00.000Z</published>
      <updated>2024-08-30T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/08/30/%E6%99%BA%E8%B0%B1ai%E5%85%B3%E4%BA%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%E7%9A%84%E5%90%AF%E5%8F%91/"/>
      <summary type="text">Prompt # Role: 情感分类助手 ## Goals: 准确识别并分类文本中的情感倾向 ## Constrains 保持中立，不添加个人情感色彩 ## Skills 熟悉情感词汇和语境分析 ## Output format 情感标签（如积极、消极、中性）+ 置信度评分 ## Workflow: 1、 读取文本 &amp;quot;&amp;quot;&amp;quot;客服</summary>
      <content type="html"><![CDATA[<p>Prompt</p>
<pre><code>#  Role: 情感分类助手
<section><h2>Goals:<a href="#goals"><span>#</span></a></h2><p>准确识别并分类文本中的情感倾向</p></section>
<section><h2>Constrains<a href="#constrains"><span>#</span></a></h2><p>保持中立，不添加个人情感色彩</p></section>
<section><h2>Skills<a href="#skills"><span>#</span></a></h2><p>熟悉情感词汇和语境分析</p></section>
<section><h2>Output format<a href="#output-format"><span>#</span></a></h2><p>情感标签（如积极、消极、中性）+ 置信度评分</p></section>
</code><section><code><h2>Workflow:<a href="#workflow"><span>#</span></a></h2></code><p><code>1、 读取文本
"""客服很耐心，解决问题很快，感谢！"""
2、分析情感词汇和语境
3、判定情感类别
4、输出情感类别结果+置信度评分
5、如果为消极，给出合理建议</code></p></section></pre><p></p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2024/08/30/%E7%94%B5%E6%B0%94%E5%88%B6%E5%9B%BE%E8%A7%84%E8%8C%83%E6%95%B4%E7%90%86/</id>
      <title type="text">电气制图规范整理</title>
      <published>2024-08-30T00:00:00.000Z</published>
      <updated>2024-08-30T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2024/08/30/%E7%94%B5%E6%B0%94%E5%88%B6%E5%9B%BE%E8%A7%84%E8%8C%83%E6%95%B4%E7%90%86/"/>
      <summary type="text">电气制图规范 1. 编号规则 1.1 产线分区 产线分区编号按照以下规定： 序号 名称 1 料盒上料单元 2 电芯取出单元 3 电芯分选单元 4 电芯入壳单元 5 模块打码单元 6 载流片单元 7 支架上料单元 8 机器人搬运单元 9 模块焊接单元 10 模块终检单元 1.2 设备编号 1.2.1 盘箱编号 盘箱编号格式为：+①②③④ + ：表示盘箱 ① ：</summary>
      <content type="html"><![CDATA[<h3>电气制图规范</h3>
<h4>1. 编号规则</h4>
<h4>1.1 产线分区</h4>
<p>产线分区编号按照以下规定：</p>
<table>
<thead>
<tr>
<th>序号</th>
<th>名称</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>料盒上料单元</td>
</tr>
<tr>
<td>2</td>
<td>电芯取出单元</td>
</tr>
<tr>
<td>3</td>
<td>电芯分选单元</td>
</tr>
<tr>
<td>4</td>
<td>电芯入壳单元</td>
</tr>
<tr>
<td>5</td>
<td>模块打码单元</td>
</tr>
<tr>
<td>6</td>
<td>载流片单元</td>
</tr>
<tr>
<td>7</td>
<td>支架上料单元</td>
</tr>
<tr>
<td>8</td>
<td>机器人搬运单元</td>
</tr>
<tr>
<td>9</td>
<td>模块焊接单元</td>
</tr>
<tr>
<td>10</td>
<td>模块终检单元</td>
</tr>
</tbody>
</table>
<h4>1.2 设备编号</h4>
<h5>1.2.1 盘箱编号</h5>
<p>盘箱编号格式为：+①②③④</p>
<ul>
<li><code>+</code>：表示盘箱</li>
<li><code>①</code>：产线分区号，范围1~9，单机设备省略该号，前置0省略。</li>
<li><code>②</code>：一位字母，表示盘箱类型：
<ul>
<li>C – 控制柜、安装板</li>
<li>P – 操作箱</li>
<li>B – 端子箱</li>
</ul></li>
<li><code>③</code>：设备分区号，范围1~9，指一个工位内部的分区。</li>
<li><code>④</code>：流水号，两位数字，从01开始，最大99。</li>
</ul>
<p><strong>举例：料盒上料工位</strong></p>
<ul>
<li>+2P101：上料按钮盒</li>
<li>+2P401：悬臂操作箱</li>
<li>+2B101：1#气动阀台中转端子箱（盒）</li>
</ul>
<h5>1.2.2 盘箱内元件编号</h5>
<p>盘箱内元件编号格式为：–①②③④</p>
<ul>
<li><code>①</code>：产线分区号，范围1~9，单机设备省略该号，前置0省略。</li>
<li><code>②</code>：两位字母，表示元件类型：
<ul>
<li>XT – 端子排</li>
<li>QF – 断路器</li>
<li>TT – 变压器</li>
<li>PW – 电源</li>
<li>PS – 压力开关</li>
<li>FU – 保险丝</li>
<li>PF – 滤波器、电抗器、电容器等</li>
<li>TA – 电流互感器</li>
<li>TV – 电压互感器</li>
<li>AL – 电流表</li>
<li>VL – 电压表</li>
<li>R – 电阻</li>
<li>DS – 门控开关</li>
<li>LS – 液位传感器</li>
<li>EL – 盘内照明灯</li>
<li>KA – 中间继电器（继电器模块时，每个继电器单独编号）</li>
<li>KT – 时间继电器</li>
<li>KS – 安全继电器</li>
<li>FR – 热继电器</li>
<li>KM – 接触器</li>
<li>SA – 转换开关（包括钥匙开关）</li>
<li>SB – 按钮（不带灯）</li>
<li>SH – 带灯按钮</li>
<li>SE – 急停按钮</li>
<li>HL – 按钮指示灯</li>
<li>BP – 蜂鸣器</li>
<li>TS – 温度开关</li>
<li>E – 加热器、加热管</li>
<li>HL – 声光一体灯</li>
<li>FS – 流量开关</li>
<li>B – 光电、接近、磁性、超声波传感器</li>
<li>RK – PLC机架</li>
<li>CU – PLC处理器模板</li>
<li>IM – PLC通讯接口模板</li>
<li>DI – PLC数字量输入模板</li>
<li>DO – PLC数字量输出模板</li>
<li>DX – PLC数字量输入/输出模板</li>
<li>AI – PLC模拟量输入模板</li>
<li>AO – PLC模拟量输出模板</li>
<li>AX – PLC模拟量输入/输出模板</li>
<li>CP – PLC其他功能模板</li>
<li>CZ – 电源插座</li>
<li>A – 所有第三方设备（如各种黑盒类）</li>
</ul></li>
<li><code>③</code>：设备分区号，一位数字，每个盘箱从1开始（PLC按网络层次连续编号）。</li>
<li><code>④</code>：流水号，两位数字，每个盘箱从01开始，最大99。</li>
</ul>
<p><strong>举例：电芯取出工位</strong></p>
<ul>
<li>-1QF101：电源总开关</li>
<li>-1QF105：24V电源进线开关</li>
<li>-1DI201：PLC第二机架（副）的第一个数字量输入模块</li>
<li>-1DI102：PLC主机架的第二个数字量输入模块</li>
</ul>
<h5>1.2.3 传感器编号</h5>
<p>传感器编号格式为：–①②③④</p>
<ul>
<li><code>①</code>：产线分区号，范围1~9，单机设备省略该号，前置0省略。</li>
<li><code>②</code>：一位字母，表示传感器类型：
<ul>
<li>B – 接近开关、光电开关、行程开关、热电偶、热电阻等</li>
<li>PS – 压力开关</li>
<li>LS – 液位传感器</li>
<li>FS – 流量传感器</li>
</ul></li>
<li><code>③</code>：设备分区号，范围1~9</li>
<li><code>④</code>：流水号，两位数字，01~99。</li>
</ul>
<p><strong>举例：电芯入壳工位</strong></p>
<ul>
<li>-4B211：1#机器人夹爪夹紧到位</li>
<li>-4B212：1#机器人夹爪松开到位</li>
<li>-4B221：2#机器人夹爪夹紧到位</li>
<li>-4B222：2#机器人夹爪松开到位</li>
</ul>
<h5>1.2.4 执行机构编号</h5>
<p>执行机构编号格式为：–①②③④</p>
<ul>
<li><code>①</code>：产线分区号，范围1~9，单机设备省略该号，前置0省略。</li>
<li><code>②</code>：一位字母，表示执行机构类型：
<ul>
<li>M – 电机</li>
<li>V – 电磁阀</li>
<li>Z – 其他执行机构</li>
</ul></li>
<li><code>③</code>：设备分区号，范围1~9</li>
<li><code>④</code>：流水号，两位数字，01~99</li>
</ul>
<p><strong>举例：模块焊接单元</strong></p>
<ul>
<li>-9M101：A侧X轴横移电机</li>
<li>-9M102：A侧Y轴升降电机</li>
<li>-9M103：A侧Z轴升降电机</li>
<li>-9M104：A侧xx电机</li>
<li>-9M201：B侧X轴横移电机</li>
<li>-9M202：B侧Y轴升降电机</li>
<li>-9M203：B侧Z轴升降电机</li>
<li>-9M204：B侧xx电机</li>
</ul>
<h4>1.3 图纸编号（图号格式）</h4>
<p>图纸编号在Eplan图纸中即是高层代号。原理图和各种特殊图纸编号确定后，填写到高层代号，然后在各自高层代号下绘制详细图纸。</p>
<h4>1.4 电缆编号</h4>
<p>电缆编号格式为：–①②③④</p>
<ul>
<li><code>①</code>：产线分区号，范围1~9，单机设备省略该号，前置0省略。</li>
<li><code>②</code>：W表示电缆编号</li>
<li><code>③</code>：设备分区号，范围1~9。</li>
<li><code>④</code>：流水号，两位数字，00~99。</li>
</ul>
<p><strong>举例：模块焊接单元</strong></p>
<ul>
<li>-9W101：悬臂按钮指示灯信号电缆</li>
<li>-9W102：设备柱状灯电缆</li>
</ul>
<h4>1.5 端子编号</h4>
<p>每排端子排的端子从1开始编号，不带前导零，如1、2、35、122。</p>
<h4>1.6 线号</h4>
<h5>1.6.1 电源线</h5>
<ul>
<li>
<p><strong>三相电源L1、L2、L3</strong></p>
<ol>
<li>三相电源经过一级开关后，线号变为L11、L21、L31；格式为数字1-9，共9级。</li>
<li>同级并排的其他三相电源为L12、L22、L32，……L1Z、L2Z、L3Z；格式为1-9、A-Z。</li>
<li>实际使用时还需加上产线的工位号（或单机设备的分区号），如1L1、1L2、1L3；格式为数字1-9，最多9个。</li>
<li>经过一级开关时，无论三相线中有几相经过，三相线号都要统一增加。</li>
</ol>
</li>
<li>
<p><strong>保护地线号为PE。</strong></p>
</li>
<li>
<p><strong>单相电源L、N</strong></p>
<ol>
<li>经过一级开关后，线号变为L1、N1；格式为数字1-9，共9级。</li>
<li>同级并排的其他单相电源为L12、L22、L32，……L1Z、L2Z、L3Z；格式为1-9、A-Z。</li>
<li>单相电源如何与三相电源中区分？</li>
</ol>
</li>
<li>
<p><strong>直流电源</strong></p>
<ol>
<li>直流电源，线号为L+、M，根据用途分为L1+（急停不断电源）、L2+（急停断开电源）、L3+（相机光源电源）等；用途格式为数字1-9。</li>
<li>经过一级开关后，线号变为L11+、L21+、L31+；格式为数字1-9，共9级。</li>
<li>同级并排的格式为L12+、L22+、L32+；格式为1-9、A-Z。</li>
<li>若有多个规格直流电源（24V、12V、5V等），则用1L+、2L+、3L+区分；格式为数字1-9。</li>
<li>一般同一规格直流电源仅用单级开关对L+进行分配，M共用，经过一级开关后，线号变为L1+，M不变（M不要过断路器）。</li>
<li>如果系统中有多个规格，如24V（1L+、1M）和12V（2L+、2M），M也需要区分。24V（1L+和1M）再细分则1M可以不变。</li>
</ol>
</li>
<li>
<p><strong>负载电源</strong>
经过变频器、伺服或热继后，电机电源线的线号为U、V、W，若有多台电机，字母后可加上电机编号，如U401、V401、W401。</p>
</li>
<li>
<p><strong>其他规范</strong></p>
<ol>
<li>经过隔离变压器，电源出线的线号变为R、S、T。</li>
<li>经过端子，线号不变。</li>
</ol>
</li>
</ul>
<h5>1.6.2 信号线</h5>
<ul>
<li>与PLC输入输出端子连接的信号线，其线号根据PLC内部地址确定，如X100、Y12F、XW001。</li>
<li>其他信号线根据情况编制，如连接继电器的信号线，可以编制为KA301:5、KA301:9（继电器KA301常开触点线号）。</li>
<li>经过端子，线号不变。</li>
</ul>
<h5>1.6.3 线缆颜色定义</h5>
<ul>
<li><strong>三相380V线缆</strong>：黄/绿/红对应A/B/C三相，零线N使用蓝色，地线使用黄绿色。</li>
<li><strong>三相220V线缆</strong>：黄/绿/红对应变压器的出线端R/S/T。</li>
<li><strong>PLC输入信号线</strong>：黄色。</li>
<li><strong>PLC输出信号线</strong>：白色。</li>
<li><strong>电源24V+</strong>：棕色，电源0V使用浅蓝色。</li>
</ul>
<h4>1.7 线号格式</h4>
<p>线号的完整格式包括以下几部分：</p>
<ul>
<li>线号（线缆套管上需要打印的内容）</li>
<li>颜色/编号（中文，如红、黄、蓝、棕等）</li>
<li>线径（单位mm²要显示）</li>
</ul>
<p>公司标准显示属性排列模板已制作，存放路径如下：
<code>Z:\xxxx\连接定义点-显示】</code></p>
<p>导入过程如下：</p>
<ol>
<li>导入模板文件。</li>
<li>导入成功后，属性排列下拉框中会列出刚刚导入的模板。</li>
<li>每次选择使用即可。</li>
</ol>
<h4>1.8 设备号</h4>
<h5>1.8.1 常规设备</h5>
<p>设备编号格式，例如电源断路器的显示效果如下：</p>
<p>设备编号内容输入窗口：</p>
<p>由于常规设备种类繁多，无法做成一个属性模板文件，以下是统一的格式要求：</p>
<ul>
<li>
<p><strong>设备标示符</strong></p>
<ul>
<li>字号、颜色、位置等要求如下。</li>
</ul>
</li>
<li>
<p><strong>功能文本</strong></p>
<ul>
<li>字号、颜色、位置等要求如下。</li>
</ul>
</li>
<li>
<p><strong>铭牌文本</strong></p>
<ul>
<li>字号、颜色、位置等要求如下。</li>
</ul>
</li>
<li>
<p><strong>技术参数</strong></p>
<ul>
<li>字号、颜色、位置等要求如下。</li>
</ul>
</li>
<li>
<p><strong>关联参考（主功能或辅助功能）</strong></p>
<ul>
<li>显示要求如下。</li>
</ul>
</li>
</ul>
<h5>1.8.2 黑盒设备</h5>
<p>公司常用黑盒设备模板文件路径：
<code>Z:\xxxx</code></p>
<p>黑盒设备名称显示属性文件路径：
<code>Z:\xxxx\黑盒-显示】</code></p>
<h5>1.8.3 设备引脚名</h5>
<p>设备引脚名必须准确与实物一致。如果实物上已经刻印有名称，必须使用该名称；如果没有刻印，则查找设备手册，使用引脚号或者引脚描述。</p>
<p>以015的机器人XIO Blox接线图为例：</p>
<ul>
<li>该项目中使用了两个IO接头，一个位于控制器顶部，叫IO blox #1（8路DI和8路DO），另一个位于设备底部，叫XIO connector（12路DI和8路DO）。</li>
<li>这两个插头都是用多芯电缆连接到特定的转换模块（Breakout block）进行外界接线。</li>
</ul>
<p>在图纸中绘制这个IO黑盒时，应使用【24】、【I1】、【I2】、【I3】等作为黑盒引脚名称。注意在一个黑盒中不能出现两个或多个名称一样的引脚。仔细观察模块，同时还刻印了【Bank1】、【Bank2】两个信号组名，所以最好的做法是将黑盒的引脚名称定义为【24】、【Bank1:I1】、【Bank1:I2】……【Bank1:O1】。</p>
<h4>1.9 电位</h4>
<h5>1.9.1 电位连接点</h5>
<p>电位连接点常用于设备主进线电源，可以指定每个电位的颜色。显示模板文件路径：
<code>Z:\xxxx\电位连接点-显示</code></p>
<h5>1.9.2 电位定义点</h5>
<p>电位定义点常用于直流电源，可以指定电位的颜色。显示模板文件路径：
<code>Z:\xxxx\电位定义点</code></p>
<h3>2 制图规范</h3>
<h4>2.1 图纸内容</h4>
<p>图纸用AutoCAD或EPLAN绘制，内容包括封面、目录、盘箱布置图、接线原理图、电缆表、部件列表、端子图表。涉及的图框和表格模板请使用公司统一格式，具体位置在：
<code>Z:\xxxx\图框与报表模板</code>
分为智能装备和科技公司两种，请设计师对照使用。</p>
<p>完整的图纸输出打印顺序为：</p>
<ol>
<li>封面页</li>
<li>修订记录</li>
<li>目录</li>
<li>安装板总览</li>
<li>C10X柜布局图</li>
<li>C10X柜装箱清单</li>
<li>C10X柜原理图</li>
<li>C10X柜端子排列图</li>
<li>C10X柜端子图表</li>
<li>全部柜子完成后</li>
<li>部件汇总表</li>
<li>部件列表</li>
<li>电缆总览</li>
<li>电缆图表</li>
</ol>
<p>EPLAN目录树的效果如下：</p>
<ul>
<li>高层代号（图号如：A018-99-00-001-M0-A0）
<ol>
<li>封面页</li>
<li>目录</li>
<li>安装版总览
<ul>
<li>位置代号（如C101）</li>
</ul></li>
<li>布局图</li>
<li>装箱清单</li>
<li>原理图</li>
<li>端子排列图</li>
<li>端子图表
<ul>
<li>位置代号（如C102）</li>
</ul></li>
<li>布局图</li>
<li>装箱清单</li>
<li>原理图
<ul>
<li>报表</li>
</ul></li>
<li>部件汇总表</li>
<li>部件列表</li>
<li>电缆总览</li>
<li>电缆图表</li>
</ol></li>
</ul>
<h4>2.2 新建项目</h4>
<p>新建一个项目图纸的步骤：</p>
<ol>
<li>项目 → 新建</li>
<li>输入项目名称（封面的项目名称）和创建者（图框中的设计）</li>
</ol>
<p>注意：项目模板选择【IEC_tpl001.ept】</p>
<p>项目属性打开过程：</p>
<ol>
<li>在页导航器中选中项目</li>
<li>菜单【项目】→【属性】即可打开项目属性设置窗口</li>
</ol>
<p>项目属性设置窗口中使用到的属性名列表如下：</p>
<table>
<thead>
<tr>
<th>属性名</th>
<th>具体含义</th>
<th>使用位置</th>
</tr>
</thead>
<tbody>
<tr>
<td>项目名称</td>
<td>项目代号（如：A018）</td>
<td>在封面页中使用</td>
</tr>
<tr>
<td>项目编号</td>
<td>图号（如：A018-99-001...）</td>
<td>在封面页中使用</td>
</tr>
<tr>
<td>项目描述</td>
<td>如：A018电气图纸</td>
<td>图框中使用</td>
</tr>
<tr>
<td>创建者</td>
<td>设计人</td>
<td>图框中使用</td>
</tr>
<tr>
<td>用户</td>
<td>校对人</td>
<td>图框中使用</td>
</tr>
<tr>
<td>审核人</td>
<td>审核人</td>
<td>图框中使用</td>
</tr>
<tr>
<td>批准人</td>
<td>批准人</td>
<td>图框中使用</td>
</tr>
</tbody>
</table>
<h4>1.10 图框</h4>
<p>除封面外，其余图纸均有图框，图框内容包括公司名称、项目描述（015、018、019等只写项目代号）、图纸名称（页描述）、图号、盘箱号、页号、总页数、签名栏（设计、校对、审核、批准）。</p>
<h4>1.11 封面</h4>
<p>封面包括公司名称、地址、邮编、电话、创建日期（年/月/日）、编辑日期（年/月/日）、四级签字。</p>
<h4>1.12 目录</h4>
<p>目录内容包括图纸页、图纸页描述、增补页字段、日期、编辑者。</p>
<h4>1.13 安装板总览</h4>
<h4>1.14 安装板布局图</h4>
<h4>1.15 箱柜设备清单</h4>
<h4>1.16 原理图（多线）</h4>
<h4>1.17 端子排列图</h4>
<h4>1.18 端子图表</h4>
<h4>1.19 部件汇总表</h4>
<p>包括盘箱、盘内元件、盘外元件等，表格内容包括订货编号、数量、名称、部件型号、厂家、备注、安装位置等。</p>
<h4>1.20 部件列表</h4>
<h4>1.21 电缆总览</h4>
<p>包括盘箱间的电源电缆和信号电缆，以及各盘箱到外部设备的电源电缆和信号电缆。表格内容包含电缆名称、来源、去向、电缆型号、规格、长度、功能文本等。设备自带电缆也需进行编号，列入电缆表。</p>
<h4>1.22 电缆图表</h4>
<h3>2 图纸绘制</h3>
<h4>2.1 图形符号</h4>
<p>图形符号应符合相关国家或行业标准，公司内部标准详见路径：
<code>Z:\电气公共文件夹\常用文档\电气制图模板\电气元件符号与设备黑盒模板中的符号</code></p>
<h4>2.2 比例</h4>
<p>在盘箱布置图中，需按统一的比例绘制各部件。</p>
<h4>2.3 字体</h4>
<p>所有图纸的字体样式、高度、宽度要保持一致，既不能太大，又不能打印出来看不清楚。</p>
<h4>2.4 尺寸标注</h4>
<p>标注尺寸以mm为单位，按绘图比例自动生成文字。文字与尺寸线的间距要合适，文字大小要适中。</p>
<h4>2.5 部件编号</h4>
<p>盘箱编号前面加“+”号，其他部件前面加“-”号，电缆号、线号前面无前缀符号。端子编号如与端子排号一起使用时，中间以冒号隔开，如-XT101:22。</p>
<h4>2.6 部件位置（关联参考）</h4>
<p>每张图纸横向分为A-G七格，纵向分为1-10格，为每张图纸上的部件定位。继电器等带有辅助触点的部件，需在部件附件绘制触点使用位置图，指明各触点的使用位置。关联参考位置按如下格式注明：
/①/②.③：④</p>
<ul>
<li>① 对应于图纸中的盘箱号如“C101”，如果继电器触点是在本盘箱中使用时省略；</li>
<li>② 对应于盘箱中图纸的页码（第几页）；</li>
<li>③ 指明使用位置，由一位数字（列1~10）和一位字母（行A~G）组成；</li>
</ul>
<h4>2.7 盘外元件</h4>
<p>盘外设备、元件需用位置盒围起来。</p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2023/11/07/hello-cactus/</id>
      <title type="text">Hello, Cactus!</title>
      <published>2023-11-07T00:00:00.000Z</published>
      <updated>2023-11-08T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2023/11/07/hello-cactus/"/>
      <summary type="text">Node.Js安装与配置 Linux Windows Hexo安装与配置 安装Hexo Hexo配置 Cactus安装与配置 安装Cactus Cactus配置 Node.Js安装与配置 Linux Nvm安装 # 以下操作基于Debian或Ubuntu等发行版 $ sudo apt install curl #安装curl $ curl -o- https</summary>
      <content type="html"><![CDATA[<ul>
<li><a href="#Node.Js安装与配置">Node.Js安装与配置</a>
<ul>
<li><a href="#Linux">Linux</a></li>
<li><a href="#Windows">Windows</a></li>
</ul></li>
<li><a href="#安装Hexo">Hexo安装与配置</a>
<ul>
<li><a href="#安装Hexo">安装Hexo</a></li>
<li><a href="#Hexo配置">Hexo配置</a></li>
</ul></li>
<li><a href="#Cactus安装与配置">Cactus安装与配置</a>
<ul>
<li><a href="#安装Cactus">安装Cactus</a></li>
<li><a href="#Cactus配置">Cactus配置</a></li>
</ul></li>
</ul>
<hr />
<h2>Node.Js安装与配置</h2>
<h3>Linux</h3>
<h5>Nvm安装</h5>
<pre><code># 以下操作基于Debian或Ubuntu等发行版
$ sudo apt install curl #安装curl
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash  #nvm安装脚本
<p>$ nvm -v #查看版本号</p>
<section><h1>若nvm无响应，执行以下操作<a href="#若nvm无响应执行以下操作"><span>#</span></a></h1><p>$ sudo vim ~/.bashrc</p></section>
<section><h1>添加变量<a href="#添加变量"><span>#</span></a></h1><p>export NVM_DIR=“<span>HOME/.nvm&amp;quot;
[ -s &amp;quot;</span>NVM_DIR/nvm.sh” ] &amp;&amp; . “<span>NVM_DIR/nvm.sh&amp;quot;  # This loads nvm
[ -s &amp;quot;</span>NVM_DIR/bash_completion” ] &amp;&amp; . “$NVM_DIR/bash_completion”  # This loads nvm bash_completion</p></section>
</code><section><code><h1>退出并应用<a href="#退出并应用"><span>#</span></a></h1></code><p><code>$ source ~/.bashrc </code></p></section></pre><p></p><h5>Node安装</h5>
<pre><code>$ nvm install 18.18.2   #指定版本v18.18.2
$ nvm use 18.18.2
$ npm -v    #查看是否安装成功
$ npm config set registry https://registry.npm.taobao.org   #指定国内源
<section><h1>若有需要，使用以下命令恢复官方源<a href="#若有需要使用以下命令恢复官方源"><span>#</span></a></h1><p>$ npm config set registry <a href="https://registry.npmjs.org" target="_blank">https://registry.npmjs.org</a></p></section>
</code><section><code><h1>或使用nrm管理源<a href="#或使用nrm管理源"><span>#</span></a></h1><p><span>npm install -g nrm    #安装nrm</span> nrm ls    #查看所有源
npm ---------- <a href="https://registry.npmjs.org/" target="_blank">https://registry.npmjs.org/</a>
yarn --------- <a href="https://registry.yarnpkg.com/" target="_blank">https://registry.yarnpkg.com/</a>
tencent ------ <a href="https://mirrors.cloud.tencent.com/npm/" target="_blank">https://mirrors.cloud.tencent.com/npm/</a>
cnpm --------- <a href="https://r.cnpmjs.org/" target="_blank">https://r.cnpmjs.org/</a></p><ul>
<li>taobao ------- <a href="https://registry.npm.taobao.org" target="_blank">https://registry.npm.taobao.org</a>
npmMirror ---- <a href="https://registry.npmmirror.com/" target="_blank">https://registry.npmmirror.com/</a></li>
</ul></code><p><code>$ nrm use xxx   #切换源，例：nrm use taobao</code></p></section></pre><p></p><h3>Windows</h3>
<pre><code>待补充 To be added.</code></pre>
<h2>Hexo安装与配置</h2>
<h3>安装Hexo</h3>
<pre><code>$ npm install -g hexo-cli   #安装脚手架
$ hexo -v
<section><h1>如果使用的是宝塔面板的node管理器，需要软链接出来<a href="#如果使用的是宝塔面板的node管理器需要软链接出来"><span>#</span></a></h1><p>$ ln -s /www/server/nodejs/{version}/lib/node_modules/hexo-cli/bin/hexo /usr/local/bin</p></section>
<section><h1>新建博客<a href="#新建博客"><span>#</span></a></h1><p><span>hexo init &amp;lt;项目名&amp;gt;</span> cd &lt;项目名&gt;</p></section>
<section><h1>安装<a href="#安装"><span>#</span></a></h1><p>$ npm install</p></section>
<section><h1>编译、启动<a href="#编译启动"><span>#</span></a></h1><p><span><span>hexogeneratehexo generate</span><span><span><span></span><span>h</span><span>e</span><span>x</span><span>o</span><span>g</span><span>e</span><span>n</span><span>er</span><span>a</span><span>t</span><span>e</span></span></span></span> hexo server</p></section>
<section><h1>检查端口占用情况<a href="#检查端口占用情况"><span>#</span></a></h1><p>$ sudo lsof -i &lt;4000&gt;</p></section>
</code><section><code><h1>清除编译内容<a href="#清除编译内容"><span>#</span></a></h1></code><p><code><span><span>hexocleanhexo clean</span><span><span><span></span><span>h</span><span>e</span><span>x</span><span>oc</span><span>l</span><span>e</span><span>an</span></span></span></span> hexo new page &lt;页面名称&gt;
$ hexo new post “文章名”</code></p></section></pre><p></p><h3>Hexo配置</h3>
<h5>目录结构</h5>
<pre><code>.
├── _config.yml
├── package.json
├── scaffolds
├── source
|   ├── _drafts
|   └── _posts
└── themes</code></pre>
<h5>配置文件</h5>
<pre><code>title       网站标题
subtitle    网站副标题
description 网站描述
keywords    网站的关键词。支持多个关键词。
author  您的名字
language    网站使用的语言。对于简体中文用户来说，使用不同的主题可能需要设置成不同的值，请参考你的主题的文档自行设置，
            常见的有 zh-Hans和 zh-CN。
timezone    网站时区。Hexo 默认使用您电脑的时区。请参考 时区列表 进行设置，如 America/New_York, Japan, 和 UTC 。
            一般的，对于中国大陆地区可以使用 Asia/Shanghai。<p>url         网址, 必须以 http开头<br />
root        网站根目录
permalink   文章的 永久链接 格式 ////
permalink_defaults          永久链接中各部分的默认值<br />
pretty_urls 改写 permalink   的值来美化 URL<br />
pretty_urls.trailing_index  是否在永久链接中保留尾部的 index.html，设置为 false 时去除  true
pretty_urls.trailing_html   是否在永久链接中保留尾部的 .html, 设置为 false 时去除 (对尾部的 index.html无效)  true</p></code><p><code>highlight:  高亮配置替换如下
enable: true
auto_detect: false
line_number: true
line_threshold: 0
tab_replace: ”
exclude_languages:
- example
wrap: true
hljs: false
prismjs:
enable: false
preprocess: true
line_number: true
line_threshold: 0
tab_replace: ”</code></p></pre><p></p><h2>Cactus安装与配置</h2>
<h3>安装Cactus</h3>
<pre><code># 确保当前目录为博客的主目录
$ git clone https://github.com/probberechts/hexo-theme-cactus.git themes/cactus
<section><h1>在_config.yml中按下述修改<a href="#在_configyml中按下述修改"><span>#</span></a></h1></section>
</code><section><code><h1>theme: landscape<a href="#theme-landscape"><span>#</span></a></h1></code><p><code>theme: cactus</code></p></section></pre><p></p><h3>Cactus配置</h3>
<pre><code># themes/cactus/_config.yml
<section><h1>配色 dark, light, white and classic<a href="#配色-dark-light-white-and-classic"><span>#</span></a></h1><p>colorscheme: dark</p></section>
<section><h1>导航栏<a href="#导航栏"><span>#</span></a></h1><p>nav:
home: /
about: /about/
articles: /archives/
projects: <a href="http://github.com/probberechts" target="_blank">http://github.com/probberechts</a>
LINK_NAME: URL</p></section>
<section><h1>博客文章列表<a href="#博客文章列表"><span>#</span></a></h1><p>posts_overview:
show_all_posts: false
post_count: 5</p></section>
<section><h1>创建项目列表 /source/_data/projects.json<a href="#创建项目列表-source_dataprojectsjson"><span>#</span></a></h1><p>[
{
“name”:“Hexo”,
“url”:“<a href="https://hexo.io/" target="_blank">https://hexo.io/</a>”,
“desc”:“A fast, simple &amp; powerful blog framework”
},
{
“name”:“Font Awesome”,
“url”:“<a href="http://fontawesome.io/" target="_blank">http://fontawesome.io/</a>”,
“desc”:“The iconic font and CSS toolkit”
}
]</p></section>
<section><h1>社交链接<a href="#社交链接"><span>#</span></a></h1><section><h2>social_links:<a href="#social_links"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>icon: github</span></div></div><div><div><div>2</div></div><div><span>link: your-github-url</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>-
icon: twitter
label: “@your-twitter-handle”
link: your-twitter-url<a href="#-icon-twitterlabel-your-twitter-handlelink-your-twitter-url"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>icon: NAME</span></div></div><div><div><div>2</div></div><div><span>label: LABEL</span></div></div><div><div><div>3</div></div><div><span>link: your-NAME-url</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>版权年份<a href="#版权年份"><span>#</span></a></h1><p>copyright:
start_year: 2016
end_year:</p></section>
<section><h1>访问分析<a href="#访问分析"><span>#</span></a></h1><p>google_analytics:
enabled: true
id: ‘UA-49627206-1’</p><p>baidu_analytics:
enabled: true
id: 2e6da3c375c8a87f5b664cea6d4cb29c</p><p>cloudflare_analytics:
enabled: true
id: 0dabb6e21848405483a237e6a7b6ed04</p><p>umami_analytics:
enabled: false
id: e77e68be-f6e4-4br3-9365-2b76b57cd571
host: <a href="https://analytics.domain.com" target="_blank">https://analytics.domain.com</a>
script_name: umami.js</p></section>
<section><h1>cdn<a href="#cdn"><span>#</span></a></h1><p>cdn:
enable: true
jquery: ‘url’
clipboard: ‘url’
font_awesome: ‘url’
justified_gallery_css: ‘url’
justified_gallery_js: ‘url’</p></section>
<section><h1>评论<a href="#评论"><span>#</span></a></h1><p>disqus:
enabled: true
shortname: SITENAME
utterances:
enabled: true
repo: owner/githubrepo
issue_term: pathname
label: utteranc
theme: themename</p><p>highlight: theme</p></section>
</code><section><code><h1>启用MathJax<a href="#启用mathjax"><span>#</span></a></h1></code><p><code>mathjax:
enabled: true</code></p></section></pre><p></p><h5>可选配置</h5>
<pre><code># 添加标签和类别
hexo new page tags
hexo new page categories
<section><h1>themes/cactus/_config.yml<a href="#themescactus_configyml"><span>#</span></a></h1></section>
<section><h1>导航栏添加<a href="#导航栏添加"><span>#</span></a></h1><p>nav:
tag: /tags/
category: /categories/</p></section>
<section><h1>添加搜索页面<a href="#添加搜索页面"><span>#</span></a></h1><p>npm install hexo-generator-search —save
hexo new page search</p></section>
<section><h1>在search中index.md添加<a href="#在search中indexmd添加"><span>#</span></a></h1><section><h2>title: Search
type: search<a href="#title-searchtype-search"><span>#</span></a></h2></section></section>
</code><section><code><h1>导航栏添加<a href="#导航栏添加-1"><span>#</span></a></h1></code><p><code>nav:
search: /search/</code></p></section></pre><p></p><h5>进阶配置</h5>
<pre><code># 下列配置有可能损坏文件！
<section><h1>页尾添加访问人数<a href="#页尾添加访问人数"><span>#</span></a></h1></section>
<section><h1>themes/cactus/_config.yml<a href="#themescactus_configyml-1"><span>#</span></a></h1><p>busuanzi:
enable: true</p></section>
<section><h1>修改/themes/cactus/layout/_partial<a href="#修改themescactuslayout_partial"><span>#</span></a></h1><p>&lt;footer id=“footer”&gt;</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&amp;lt;div class=&amp;quot;footer-left&amp;quot;&amp;gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&amp;lt;%= __(&amp;#039;footer.copyright&amp;#039;) %&amp;gt; ©</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&amp;lt;% var endYear = (theme.copyright &amp;amp;&amp;amp; theme.copyright.end_year) ? theme.copyright.end_year : new Date().getFullYear() %&amp;gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&amp;lt;% var startYear = (theme.copyright &amp;amp;&amp;amp; theme.copyright.start_year) ? theme.copyright.start_year : new Date().getFullYear() %&amp;gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&amp;lt;%= startYear &amp;gt;= endYear ? endYear : startYear + &amp;quot;-&amp;quot; + endYear %&amp;gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&amp;lt;%= config.author || config.title %&amp;gt;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>&amp;lt;br&amp;gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&amp;lt;a href=&amp;quot;https://beian.miit.gov.cn/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;xICP备xxxxxxxx号-x&amp;lt;/a&amp;gt;</span></div></div><div><div><div>9</div></div><div><span>#如果在中国需要添加备案信息</span></div></div><div><div><div>10</div></div><div><span>&amp;lt;/div&amp;gt;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>&amp;lt;div class=&amp;quot;footer-right&amp;quot;&amp;gt;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>&amp;lt;nav&amp;gt;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>      </span></span><span>&amp;lt;ul&amp;gt;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>&amp;lt;% for (var i in theme.nav) { %&amp;gt;&amp;lt;!--</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>--&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;lt;%- url_for(theme.nav[i]) %&amp;gt;&amp;quot;&amp;gt;&amp;lt;%= __(&amp;#039;nav.&amp;#039;+i).replace(&amp;quot;nav.&amp;quot;, &amp;quot;&amp;quot;) %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;!--</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>--&amp;gt;&amp;lt;% } %&amp;gt;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>      </span></span><span>&amp;lt;/ul&amp;gt;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span><span>      </span></span><span>&amp;lt;ul&amp;gt;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>&amp;lt;% if (theme.busuanzi &amp;amp;&amp;amp; theme.busuanzi.enable){ %&amp;gt;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span><span>          </span></span><span>&amp;lt;!-- 不蒜子统计 --&amp;gt;</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span><span>          </span></span><span>&amp;lt;span id=&amp;quot;busuanzi_container_site_pv&amp;quot;&amp;gt;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span><span>              </span></span><span>本站总访问量&amp;lt;span id=&amp;quot;busuanzi_value_site_pv&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;次</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span><span>          </span></span><span>&amp;lt;/span&amp;gt;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span><span>          </span></span><span>&amp;lt;span class=&amp;quot;post-meta-divider&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span><span>          </span></span><span>&amp;lt;span id=&amp;quot;busuanzi_container_site_uv&amp;quot; style=&amp;#039;display:none&amp;#039;&amp;gt;</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span><span>                  </span></span><span>本站访客数&amp;lt;span id=&amp;quot;busuanzi_value_site_uv&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;人</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span><span>          </span></span><span>&amp;lt;/span&amp;gt;</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>&amp;lt;script async src=&amp;quot;//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>&amp;lt;% } %&amp;gt;</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span><span>      </span></span><span>&amp;lt;/ul&amp;gt;</span></div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>&amp;lt;/nav&amp;gt;</span></div></div><div><div><div>52</div></div><div><span><span>  </span></span><span>&amp;lt;/div&amp;gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>&lt;/footer&gt;</p></section>
<section><h1>添加复制版权提示<a href="#添加复制版权提示"><span>#</span></a></h1></section>
<section><h1>修改themes/cactus/layout/post.ejs<a href="#修改themescactuslayoutpostejs"><span>#</span></a></h1></section>
</code><section><code><h1>末尾添加<a href="#末尾添加"><span>#</span></a></h1><p>&lt;% if (page.copyright) { %&gt;
&lt;script&gt;
function setClipboardText(event){
// clipboardData 对象是为通过编辑菜单、快捷菜单和快捷键执行的编辑操作所保留的，也就是你复制或者剪切内容
let clipboardData = event.clipboardData || window.clipboardData;
// 如果未复制或者未剪切，则return出去
if (!clipboardData) { return; }
event.preventDefault();
// Selection 对象，表示用户选择的文本范围或光标的当前位置。
//     声明一个变量接收 — 用户输入的剪切或者复制的文本转化为字符串
let text = window.getSelection().toString();</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>          </span></span><span>if (text) {</span></div></div><div><div><div>2</div></div><div><span><span>            </span></span><span>// 如果文本存在则先取消文本默认事件</span></div></div><div><div><div>3</div></div><div><span><span>            </span></span><span>event.preventDefault();</span></div></div><div><div><div>4</div></div><div><span><span>            </span></span><span>// 通过调用常clipboardData对象的 setData(format, data) 方法；来设置相关文本</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>// format: 一个DOMString 表示要添加到 drag object的拖动数据的类型。</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>// data: 一个 DOMString表示要添加到 drag object的数据。</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>var copyright = &amp;#039;\n --------------- \n&amp;#039;</span></div></div><div><div><div>8</div></div><div><span><span>                            </span></span><span>+ &amp;#039;\n著作权归作者所有。&amp;#039;</span></div></div><div><div><div>9</div></div><div><span><span>                            </span></span><span>+ &amp;#039;\n商业转载请联系作者获得授权，非商业转载请注明出处。&amp;#039;</span></div></div><div><div><div>10</div></div><div><span><span>                            </span></span><span>+ &amp;#039;\n作者: &amp;#039;</span></div></div><div><div><div>11</div></div><div><span><span>                            </span></span><span>+ &amp;#039;\n邮箱:&amp;#039;</span></div></div><div><div><div>12</div></div><div><span><span>                            </span></span><span>+ &amp;#039;\n原文地址: &amp;lt;%= page.permalink %&amp;gt;&amp;#039;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>clipboardData.setData(&amp;#039;text/plain&amp;#039;, text + copyright);</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>          </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>};</span></div></div><div><div><div>18</div></div><div><span><span>      </span></span><span>var contents = document.getElementsByClassName(&amp;quot;content&amp;quot;);</span></div></div><div><div><div>19</div></div><div><span><span>      </span></span><span>// 监听文章内容的copy事件</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>contents[0].addEventListener(&amp;#039;copy&amp;#039;,function(e){</span></div></div><div><div><div>21</div></div><div><span><span>          </span></span><span>setClipboardText(e);</span></div></div><div><div><div>22</div></div><div><span><span>      </span></span><span>});</span></div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>&amp;lt;/script&amp;gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></code><p><code>&lt;% } %&gt;</code></p></section></pre><p></p>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2023/11/07/opencv-with-cuda%E7%BC%96%E8%AF%91%E5%AE%9E%E6%88%98/</id>
      <title type="text">OpenCV with CUDA编译实战</title>
      <published>2023-11-07T00:00:00.000Z</published>
      <updated>2023-11-08T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2023/11/07/opencv-with-cuda%E7%BC%96%E8%AF%91%E5%AE%9E%E6%88%98/"/>
      <summary type="text">环境要求 Windows 11 22H2 cuda 12.2.0 cuDNN 8.9.5 vs 2022 以及 c++桌面开发环境 python 3.9 opencv 4.8.0 安装conda环境 # 安装包 https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Windows-x86_64.exe #</summary>
      <content type="html"><![CDATA[<h4>环境要求</h4>
<pre><code>Windows 11 22H2
cuda 12.2.0
cuDNN 8.9.5
vs 2022 以及 c++桌面开发环境
python 3.9
opencv 4.8.0</code></pre>
<h4>安装conda环境</h4>
<pre><code># 安装包
https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Windows-x86_64.exe
<section><h1>安装地址（可选）<a href="#安装地址可选"><span>#</span></a></h1><p>D:\Program\anaconda3</p></section>
<section><h1>安装配置（勾选）<a href="#安装配置勾选"><span>#</span></a></h1><p>1.Create start menu shortcuts (supported packages only).
2.Register Anaconda3 as my default Python 3.X
3.Clear the package cache upon completion</p></section>
</code><section><code><h1>注册conda（可选）<a href="#注册conda可选"><span>#</span></a></h1></code><p><code>conda init powershell</code></p></section></pre><p></p><h5>常用conda命令</h5>
<pre><code># 创建名为opencv的Python版本为3.9的环境
conda create -n op python=3.9
<section><h1>查看Anaconda下管理的所有Python环境<a href="#查看anaconda下管理的所有python环境"><span>#</span></a></h1><p>conda info -e</p></section>
<section><h1>激活pytorch<a href="#激活pytorch"><span>#</span></a></h1><p>conda activate op</p></section>
<section><h1>退出虚拟环境<a href="#退出虚拟环境"><span>#</span></a></h1><p>conda deactivate</p></section>
</code><section><code><h1>删除opencv环境：<a href="#删除opencv环境"><span>#</span></a></h1></code><p><code>conda remove —name op —all</code></p></section></pre><p></p><h4>配置Cmake环境</h4>
<pre><code># https://cmake.org/
<section><h1>下载gui版&amp;安装<a href="#下载gui版安装"><span>#</span></a></h1><p><a href="https://github.com/Kitware/CMake/releases/download/v3.28.0-rc3/cmake-3.28.0-rc3-windows-x86_64.msi" target="_blank">https://github.com/Kitware/CMake/releases/download/v3.28.0-rc3/cmake-3.28.0-rc3-windows-x86_64.msi</a></p></section>
<section><h1>新建文件夹<a href="#新建文件夹"><span>#</span></a></h1><p>mkdir opencv
cd opencv
mkdir build</p></section>
<section><h1>下载opencv<a href="#下载opencv"><span>#</span></a></h1><p><a href="https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip" target="_blank">https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip</a></p></section>
<section><h1>解压至当前目录后clone opencv-contrib<a href="#解压至当前目录后clone-opencv-contrib"><span>#</span></a></h1><p>git clone <a href="https://github.com/opencv/opencv_contrib.git" target="_blank">https://github.com/opencv/opencv_contrib.git</a></p></section>
<section><h1>完成后的目录结构<a href="#完成后的目录结构"><span>#</span></a></h1><p>|—opencv<br />
|—opencv\build
|—opencv\opencv-4.8.0
|—opencv\opencv_contrib-4.8.0</p></section>
<section><h1>打开camke<a href="#打开camke"><span>#</span></a></h1><p>source_path = ..\opencv\opencv-4.8.0
build_path = ..\opencv\opencv_contrib-4.8.0</p></section>
</code><section><code><h1>Add Entry 添加Python环境<a href="#add-entry-添加python环境"><span>#</span></a></h1><p>PYTHON3_EXECUTABLE<br />
FILEPATH<br />
”PATH TO YOUR PYTHON.EXE WHERE IN ANACONDA ENVIREMENT”</p><p>第一次点击configure后，如果没有error报错，则
0.弹出的VS配置选项-VS17-x64
1.勾选BUILD_opencv_world、WITH_CUDA、OPENCV_DNN_CUDA
2.设置OPENCV_EXTRA_MODULES_PATH为\opencv\opencv_contrib-4.8.0\modules</p><p>第二次点击configure，如果没有报错，则
1.勾选FAST_MATH字样选项，去除所有TEST、Java字样选项
2.按需求勾选ENABLE-NOFREE、DNN-PERF、BUILD-XX等
3.检查是否勾选opencv-python3</p></code><p><code>第三次点击configure，如果没有报错，则点击Generate
若没有报错，进入编译阶段</code></p></section></pre><p></p><h4>VS编译</h4>
<pre><code>1.点击Open Project
2.设置编译平台（Release/Debug均可）和 x64, 右键ALL_BUILD-生成，生成时间较长
3.生成成功后，右键INSTALL-仅用于项目-仅生成INSTALL</code></pre>
<h4>配置modules</h4>
<pre><code>在编译输出文件夹lib\python3\Release下的
\cv2.cp39-win_amd64.pyd复制到anaconda3\envs\op\Lib\site-packages\cv2\python-3.9
\bin\Release目录下所有文件复制到anaconda3\envs\op\Lib\site-packages</code></pre>
<h4>测试程序</h4>
<pre><code>import cv2
cv2.cuda.printCudaDeviceInfo(0)</code></pre>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2023/11/07/vite-ts-electron-%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</id>
      <title type="text">Vite + TS + Electron 环境部署</title>
      <published>2023-11-07T00:00:00.000Z</published>
      <updated>2023-11-08T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2023/11/07/vite-ts-electron-%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/"/>
      <summary type="text">安装环境 npm create vite@latest my-vue-app -- --template vue-ts npm install npm install electron -D npm install electron-builder -D npm install electron-devtools-installer -D npm insta</summary>
      <content type="html"><![CDATA[<h4>安装环境</h4>
<pre><code>npm create vite@latest my-vue-app -- --template vue-ts
npm install
npm install electron -D
npm install electron-builder -D
npm install electron-devtools-installer -D
npm install vite-plugin-electron -D
npm install rimraf -D
npm install
npm audit fix --force</code></pre>
<h4>初始化electron</h4>
<h5>初始化electron主程序</h5>
<pre><code>// electron-main/index.ts
import { app, BrowserWindow } from "electron";
import path from "path";
<p>const createWindow = () =&gt; {
const win = new BrowserWindow({
webPreferences: {
contextIsolation: false, // 是否开启隔离上下文
nodeIntegration: true, // 渲染进程使用Node API
preload: path.join(__dirname, ”../electron-preload/index.js”), // 需要引用js文件
},
});</p>
<p>// 如果打包了，渲染index.html
if (app.isPackaged) {
win.loadFile(path.join(__dirname, ”../index.html”));
} else {
let url = “<a href="http://localhost:3000" target="_blank">http://localhost:3000</a>”; // 本地启动的vue项目路径
win.loadURL(url);
}
};</p>
<p>app.whenReady().then(() =&gt; {
createWindow(); // 创建窗口
app.on(“activate”, () =&gt; {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});</p>
</code><p><code>// 关闭窗口
app.on(“window-all-closed”, () =&gt; {
if (process.platform !== “darwin”) {
app.quit();
}
});</code></p></pre><p></p>
<h5>初始化electron前置加载程序</h5>
<pre><code>//electron-preload/index.ts
import os from "os";
console.log("platform", os.platform());</code></pre>
<h5>修改ts监听程序</h5>
<pre><code>"include": [
  "src/**/*.ts",
  "src/**/*.d.ts",
  "src/**/*.tsx",
  "src/**/*.vue",
  "electron-main/**/*.ts",
  "electron-preload/**/*.ts"
],</code></pre>
<h5>修改vits配置文件</h5>
<pre><code>import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
<p>import * as path from “path”;
import electron from “vite-plugin-electron”;
import electronRenderer from “vite-plugin-electron/renderer”;
import polyfillExports from “vite-plugin-electron/polyfill-exports”;</p>
</code><p><code>export default defineConfig({
plugins: [
vue(),
electron({
main: {
entry: “electron-main/index.ts”, // 主进程文件
},
preload: {
input: path.join(__dirname, ”./electron-preload/index.ts”), // 预加载文件
},
}),
electronRenderer(),
polyfillExports(),
],
build: {
emptyOutDir: false, // 默认情况下，若 outDir 在 root 目录下，则 Vite 会在构建时清空该目录
},
});
</code></p></pre><p></p>
<h5>修改package信息</h5>
<pre><code>{
  "name": "my-vue-app",
  "private": true,
  "version": "0.0.0",
  "main": "dist/electron-main/index.js",
  "scripts": {
    "dev": "vite",
    "build": "rimraf dist &amp;&amp; vite build &amp;&amp; electron-builder",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.2.25"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^2.3.3",
    "electron": "^19.0.0",
    "electron-builder": "^23.0.3",
    "electron-devtools-installer": "^3.2.0",
    "rimraf": "^3.0.2",
    "typescript": "^4.5.4",
    "vite": "^2.9.9",
    "vite-plugin-electron": "^0.4.5",
    "vue-tsc": "^0.34.7"
  }
}</code></pre>
<h5>打包需要添加的package信息</h5>
<pre><code>{
  ......
  "build": {
    "appId": "com.smallpig.desktop",
    "productName": "smallpig",
    "asar": true,
    "copyright": "Copyright © 2022 smallpig",
    "directories": {
      "output": "release/${version}"
    },
    "files": [
      "dist"
    ],
    "mac": {
      "artifactName": "${productName}_${version}.${ext}",
      "target": [
        "dmg"
      ]
    },
    "win": {
      "target": [
        {
          "target": "nsis",
          "arch": [
            "x64"
          ]
        }
      ],
      "artifactName": "${productName}_${version}.${ext}"
    },
    "nsis": {
      "oneClick": false,
      "perMachine": false,
      "allowToChangeInstallationDirectory": true,
      "deleteAppDataOnUninstall": false
    },
    "publish": [
      {
        "provider": "generic",
        "url": "http://127.0.0.1:8080"
      }
    ],
    "releaseInfo": {
      "releaseNotes": "版本更新的具体内容"
    }
  }
}</code></pre>
<h5>执行打包</h5>
<pre><code>npm run build</code></pre>]]></content>
    </entry>
    <entry>
      <id>https://www.rwr.ink/posts/2023/11/07/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/</id>
      <title type="text">网络技术笔记</title>
      <published>2023-11-07T00:00:00.000Z</published>
      <updated>2023-11-08T00:00:00.000Z</updated>
      <author><name>JMFANS</name></author>
      <link rel="alternate" href="https://www.rwr.ink/posts/2023/11/07/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
      <summary type="text">防火墙访问模式 非特权模式 特权模式 配置模式：系统镜像更新、口令恢复 监视模式 入侵防护系统 基于主机的防护系统：安装在主机内 基于网络的防护系统：安装在网络出口处 应用入侵防护系统：安装在应用服务器前端 可信计算机评估准则 C级：自主保护类型--用户能定义访问控制要求 网络攻击 SYN Flooding：利用TCP三次握手 网络信息查询 ipconfig</summary>
      <content type="html"><![CDATA[<p>防火墙访问模式</p>
<ul>
<li>非特权模式</li>
<li>特权模式</li>
<li>配置模式：系统镜像更新、口令恢复</li>
<li>监视模式</li>
</ul>
<p>入侵防护系统</p>
<ul>
<li>基于主机的防护系统：安装在主机内</li>
<li>基于网络的防护系统：安装在网络出口处</li>
<li>应用入侵防护系统：安装在应用服务器前端</li>
</ul>
<p>可信计算机评估准则</p>
<ul>
<li>C级：自主保护类型--用户能定义访问控制要求</li>
</ul>
<p>网络攻击</p>
<ul>
<li>SYN Flooding：利用TCP三次握手</li>
</ul>
<p>网络信息查询</p>
<ul>
<li>ipconfig: TCP/IP配置查询</li>
<li>nbtstat：NetBIOS统计和连接信息</li>
<li>pathping：查询所有路由跳数（DNS可用性</li>
<li>route：本地IP路由表条目</li>
</ul>
<p>DHCP
discover/requests</p>
<ul>
<li>源地址：0.0.0.0</li>
<li>目的地址：255.255.255.255
offer/ack：</li>
<li>源地址：DHCP服务器地址</li>
<li>目的地址：255.255.255.255</li>
</ul>
<p>Destination
广播地址的MAC地址：ffffffffffff</p>
<p>UDP端口：68   67</p>
<p>三次握手之后：ACK++
邮件传输协议号  SEQ ：6</p>
<p>数据包分析</p>
<ol>
<li>5~8行为域名解析</li>
</ol>
<ul>
<li>发送方：客户机</li>
<li>接收方：DHCP服务器</li>
</ul>
<ol>
<li>9~14行为ICMP报文</li>
</ol>
<ul>
<li>time-to-alive：存活时间  tracert</li>
<li>第一个路由地址：ICMP中发给客户机的地址</li>
<li>第二个路由地址：ICMP中结束DNS查询后第一次查询地址
执行命令为：<code>tracert</code> {<code>domain</code>}</li>
</ul>
<p>监听流量：使用TAP设备</p>]]></content>
    </entry>
</feed>
