2.0协议完善加简单交管配置

This commit is contained in:
ykkokluo
2026-08-14 09:49:23 +08:00
parent a28bc68e23
commit 1e780c2b65
51 changed files with 4013 additions and 393 deletions
@@ -2,7 +2,7 @@
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>MagFass2Car Guide</title>
<title>Mag2Car Guide</title>
<style>
@page { size: A4; margin: 18mm 16mm; }
body { font-family: "Microsoft YaHei", "Segoe UI", sans-serif; color: #222; line-height: 1.55; font-size: 11pt; }
@@ -25,10 +25,10 @@
</style>
</head>
<body>
<h1>MagFass2CarFASS 2.0)使用指南</h1>
<h1>Mag2CarFASS 2.0)使用指南</h1>
<blockquote><p>适用对象:第一次接触磁导航 + FASS 2.0 的调试/实施人员 </p></blockquote>
<blockquote><p>插件:`StandardScene.Magnetic.dll` </p></blockquote>
<blockquote><p>车型:`MagFass2Car` </p></blockquote>
<blockquote><p>车型:`Mag2Car` </p></blockquote>
<blockquote><p>最后更新:2026-07</p></blockquote>
<hr/>
<h2>目录</h2>
@@ -57,7 +57,7 @@
</ol>
<hr/>
<h2>1. 这套系统能做什么</h2>
<p><code>MagFass2Car</code> 是 StandardScene **磁导航平台插件**里的 FASS 2.0 车型,主要能力:</p>
<p><code>Mag2Car</code> 是 StandardScene **磁导航平台插件**里的 FASS 2.0 车型,主要能力:</p>
<table>
<thead><tr>
<th>能力</th>
@@ -96,12 +96,12 @@
<h3>步骤 1:加载插件</h3>
<p>确认场景已加载 <code>scene.mag</code><code>StandardScene.Magnetic.scene.json</code>),提供:</p>
<ul>
<li>车型:<code>MagCar</code><code>MagFass2Car</code></li>
<li>进程:<code>EventCarMission</code><code>MagFass2LoopMission</code></li>
<li>车型:<code>MagCar</code><code>Mag2Car</code></li>
<li>进程:<code>EventCarMission</code><code>Mag2LoopMission</code></li>
</ul>
<h3>步骤 2:添加一辆车</h3>
<ol>
<li>在场景中添加车型 **<code>MagFass2Car</code>**</li>
<li>在场景中添加车型 **<code>Mag2Car</code>**</li>
<li>填写基本参数(UDP 模式示例):</li>
</ol>
<table>
@@ -150,8 +150,8 @@
<p>**方式 A — 手动 Go(Web/调度下发)** </p>
<p>用系统自带的「去某站」功能,内部会编译脚本,例如:</p>
<pre><code>
agv.MagFass2Go(1, 2, 0.2);
agv.MagFass2Go(2, 5, 0.2);
agv.Mag2Go(1, 2, 0.2);
agv.Mag2Go(2, 5, 0.2);
</code></pre>
<p>**方式 B — LoopMission 环线** </p>
<ol>
@@ -165,11 +165,11 @@ agv.MagFass2Go(2, 5, 0.2);
<pre><code>
┌─────────────────────────────────────────────────────────┐
│ 业务层:LoopMission / 手动 Go / 脚本 │
│ (分配 goalSite 或编译多行 MagFass2Go
│ (分配 goalSite 或编译多行 Mag2Go
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ MagFass2Car 执行层 │
│ Mag2Car 执行层 │
&#183; 脚本拦截(Loop + goalSite)→ 一次全程任务 │
&#183; Fass2TaskBuilder:路径 + fields → 节点序列 │
&#183; Fass2TaskStateMachine:滑动窗口下发 + 动作闭环 │
@@ -186,7 +186,7 @@ agv.MagFass2Go(2, 5, 0.2);
<p>**关键理解:**</p>
<ul>
<li>**LoopMissionCore** 只负责「给谁分配哪个目标站」(写 <code>goalSite</code> 标签)</li>
<li>**MagFass2Car** 负责「怎么走过去」(拼包、下发、等到站)</li>
<li>**Mag2Car** 负责「怎么走过去」(拼包、下发、等到站)</li>
<li>**阶段 4** 后,Loop 不再逐行执行多段脚本,而是**拦截为一次全程任务**(可关)</li>
</ul>
<hr/>
@@ -195,8 +195,8 @@ agv.MagFass2Go(2, 5, 0.2);
<p>文件:<code>StandardScene.Magnetic.scene.json</code></p>
<pre><code>
{
&quot;carTypes&quot;: [ &quot;MagCar&quot;, &quot;MagFass2Car&quot; ],
&quot;missionTypes&quot;: [ &quot;EventCarMission&quot;, &quot;MagFass2LoopMission&quot; ]
&quot;carTypes&quot;: [ &quot;MagCar&quot;, &quot;Mag2Car&quot; ],
&quot;missionTypes&quot;: [ &quot;EventCarMission&quot;, &quot;Mag2LoopMission&quot; ]
}
</code></pre>
<h3>4.2 选哪个 Mission</h3>
@@ -210,21 +210,21 @@ agv.MagFass2Go(2, 5, 0.2);
<tbody><tr>
<td><code>LoopMission</code></td>
<td>Core</td>
<td>通用环线,MagFass2Car 同样可用</td>
<td>通用环线,Mag2Car 同样可用</td>
</tr>
<tr>
<td><code>磁导航FASS2环线</code><code>MagFass2LoopMission</code></td>
<td><code>磁导航FASS2环线</code><code>Mag2LoopMission</code></td>
<td>Magnetic 插件</td>
<td>逻辑与 LoopMission 相同,名称标识磁导航 FASS2 场景</td>
</tr>
<tr>
<td><code>FASS车辆事件进程</code><code>EventCarMission</code></td>
<td>Magnetic 插件</td>
<td>**仅 MagCarFASS 1.0**,不驱动 MagFass2Car</td>
<td>**仅 MagCarFASS 1.0**,不驱动 Mag2Car</td>
</tr>
</tbody>
</table>
<blockquote><p>新手建议:MagFass2Car 环线用 **`LoopMission`** 或 **`磁导航FASS2环线`** 均可。</p></blockquote>
<blockquote><p>新手建议:Mag2Car 环线用 **`LoopMission`** 或 **`磁导航FASS2环线`** 均可。</p></blockquote>
<h3>4.3 tasklist.json 最小示例</h3>
<pre><code>
{
@@ -253,7 +253,7 @@ agv.MagFass2Go(2, 5, 0.2);
<p>含义:车到站 1 → 自动分配目标站 2;到站 2 → 自动分配目标站 1,形成环线。</p>
<hr/>
<h2>5. 车辆参数说明</h2>
<p>在场景编辑器中选中 <code>MagFass2Car</code>,常用字段如下。</p>
<p>在场景编辑器中选中 <code>Mag2Car</code>,常用字段如下。</p>
<h3>5.1 通讯</h3>
<table>
<thead><tr>
@@ -426,8 +426,8 @@ agv.MagFass2Go(2, 5, 0.2);
<p>**流程**</p>
<pre><code>
FindRoute → Compile → 多行脚本:
agv.MagFass2Go(1,2,speed);
agv.MagFass2Go(2,3,speed);
agv.Mag2Go(1,2,speed);
agv.Mag2Go(2,3,speed);
...
→ SelfEvaluating 逐行执行
→ 每行:锁终点 → 发 0xB1 → 等到站 → 释放起点
@@ -435,7 +435,7 @@ FindRoute → Compile → 多行脚本:
<p>**特点**:每**条边**一段任务,多次 <code>taskId</code>,与交管「逐段锁点」一致。</p>
<hr/>
<h3>方式 2:Loop 全程任务(阶段 4,默认)</h3>
<p>**触发**<code>goalSite</code> 标签 + 编译脚本含 <code>MagFass2Go</code> + <code>EnableLoopTaskDrive=true</code></p>
<p>**触发**<code>goalSite</code> 标签 + 编译脚本含 <code>Mag2Go</code> + <code>EnableLoopTaskDrive=true</code></p>
<p>**流程**</p>
<pre><code>
LoopMission 写 goalSite
@@ -446,7 +446,7 @@ LoopMission 写 goalSite
</code></pre>
<p>**特点**:业务上一次任务,协议上仍遵守每帧 ≤10 站。</p>
<hr/>
<h3>方式 3:单段 MagFass2Go(脚本一行)</h3>
<h3>方式 3:单段 Mag2Go(脚本一行)</h3>
<p>**触发**:脚本里只有一行,或无 <code>goalSite</code> 的测试。</p>
<p>**流程**:与方式 1 的单行相同,状态机只跑 <code>src → dst</code> 一段。</p>
<hr/>
@@ -631,7 +631,7 @@ LoopMission 写 goalSite
</tr>
<tr>
<td>车辆开关</td>
<td><code>MagFass2Car.UseTagValueAsNode = true</code></td>
<td><code>Mag2Car.UseTagValueAsNode = true</code></td>
</tr>
<tr>
<td>示例</td>
@@ -1295,7 +1295,7 @@ LoopMission 写 goalSite
<td><code>Magnet</code></td>
<td>bool</td>
<td></td>
<td><code>true</code> 启用 <code>MagneticTrackCoder</code><code>agv.MagGo</code> 等),与 <code>MagFass2Go</code> 模板独立</td>
<td><code>true</code> 启用 <code>MagneticTrackCoder</code><code>agv.MagGo</code> 等),与 <code>Mag2Go</code> 模板独立</td>
</tr>
<tr>
<td><code>ReverseDst</code></td>
@@ -1433,7 +1433,7 @@ Fass2_Obstacle = 2
2. 匹配 tasklistcurrentStationId = N → 分配 targetStationId
3. 写 tagsgoalSite = 目标站 ID
4. LoopStartAction 调用 GoSite
5. MagFass2Car 拦截 → 全程任务到 goalSite
5. Mag2Car 拦截 → 全程任务到 goalSite
6. 到达后 GoSite 清理 goalSite / occupied / loopAssigned
7. 下一轮任务匹配
</code></pre>
@@ -1462,13 +1462,13 @@ Fass2_Obstacle = 2
<ul>
<li>**不需要改 Core**<code>LoopMission</code> 逻辑完全沿用</li>
<li><code>磁导航FASS2环线</code> 仅为场景标识,行为与 <code>LoopMission</code> 相同</li>
<li>真正区别在 **车型** 是否 <code>MagFass2Car</code><code>EnableLoopTaskDrive=true</code></li>
<li>真正区别在 **车型** 是否 <code>Mag2Car</code><code>EnableLoopTaskDrive=true</code></li>
</ul>
<h3>9.4 关闭 Loop 拦截(恢复多段脚本)</h3>
<pre><code>
EnableLoopTaskDrive = false
</code></pre>
<p>Loop 仍走 Compile 多行 <code>MagFass2Go</code>,每行一段边。</p>
<p>Loop 仍走 Compile 多行 <code>Mag2Go</code>,每行一段边。</p>
<hr/>
<h2>10. 任务状态机与协议下发</h2>
<h3>10.1 状态流转</h3>
@@ -1595,7 +1595,7 @@ Idle → Planning → Moving → AtStation → SegmentDone → … → Complete
</tr>
</tbody>
</table>
<p>日志前缀:<code>[MagFass2Car:车名(id)]</code>,任务状态机:<code>task-sm</code></p>
<p>日志前缀:<code>[Mag2Car:车名(id)]</code>,任务状态机:<code>task-sm</code></p>
<hr/>
<h2>12. 常见问题排查</h2>
<h3>Q1:车显示离线(UDP</h3>
@@ -1698,13 +1698,13 @@ Idle → Planning → Moving → AtStation → SegmentDone → … → Complete
<p>看日志:</p>
<ul>
<li><code>loop goal drive intercept</code> → 全程任务(阶段 4</li>
<li><code>script begin</code> + 多行 <code>MagFass2Go</code> → 多段脚本</li>
<li><code>script begin</code> + 多行 <code>Mag2Go</code> → 多段脚本</li>
</ul>
<h3>Q6:与 MagCar 混用注意事项</h3>
<ul>
<li><code>EventCarMission</code> **只控制 MagCar**</li>
<li>同场景两种车型时,tasklist 和车辆类型要对应</li>
<li>FASS 1.0 用 <code>MagCar</code>FASS 2.0 用 <code>MagFass2Car</code></li>
<li>FASS 1.0 用 <code>MagCar</code>FASS 2.0 用 <code>Mag2Car</code></li>
</ul>
<hr/>
<h2>13. 参数推荐与检查清单</h2>
@@ -1722,7 +1722,7 @@ MoveTimeoutSeconds = 120
<h3>13.2 上线前检查清单</h3>
<ul>
<li>[ ] 插件 <code>StandardScene.Magnetic.dll</code> 已加载</li>
<li>[ ] 车型为 <code>MagFass2Car</code>(不是 <code>MagCar</code></li>
<li>[ ] 车型为 <code>Mag2Car</code>(不是 <code>MagCar</code></li>
<li>[ ] <code>VehicleCode</code>、IP、端口与车体一致</li>
<li>[ ] UDP 能收到 100B,日志有 <code>0x10</code> 应答</li>
<li>[ ] 关键站点 <code>TagValue</code> / <code>Fass2_*</code> 已配置</li>
@@ -1785,7 +1785,7 @@ MoveTimeoutSeconds = 120
</thead>
<tbody><tr>
<td>车型</td>
<td><code>CarTypes/MagFass2Car.cs</code></td>
<td><code>CarTypes/Mag2Car.cs</code></td>
</tr>
<tr>
<td>协议</td>
@@ -1805,7 +1805,7 @@ MoveTimeoutSeconds = 120
</tr>
<tr>
<td>环线 Mission</td>
<td><code>Chained/MagFass2LoopMission.cs</code></td>
<td><code>Chained/Mag2LoopMission.cs</code></td>
</tr>
<tr>
<td>站点字段常量</td>
@@ -1,8 +1,8 @@
# MagFass2CarFASS 2.0)使用指南
# Mag2CarFASS 2.0)使用指南
> 适用对象:第一次接触磁导航 + FASS 2.0 的调试/实施人员
> 插件:`StandardScene.Magnetic.dll`
> 车型:`MagFass2Car`
> 车型:`Mag2Car`
> 最后更新:2026-07
---
@@ -33,7 +33,7 @@
## 1. 这套系统能做什么
`MagFass2Car` 是 StandardScene **磁导航平台插件**里的 FASS 2.0 车型,主要能力:
`Mag2Car` 是 StandardScene **磁导航平台插件**里的 FASS 2.0 车型,主要能力:
| 能力 | 说明 |
|------|------|
@@ -54,12 +54,12 @@
确认场景已加载 `scene.mag``StandardScene.Magnetic.scene.json`),提供:
- 车型:`MagCar``MagFass2Car`
- 进程:`EventCarMission``MagFass2LoopMission`
- 车型:`MagCar``Mag2Car`
- 进程:`EventCarMission``Mag2LoopMission`
### 步骤 2:添加一辆车
1. 在场景中添加车型 **`MagFass2Car`**
1. 在场景中添加车型 **`Mag2Car`**
2. 填写基本参数(UDP 模式示例):
| 参数 | 示例值 | 含义 |
@@ -86,8 +86,8 @@
用系统自带的「去某站」功能,内部会编译脚本,例如:
```text
agv.MagFass2Go(1, 2, 0.2);
agv.MagFass2Go(2, 5, 0.2);
agv.Mag2Go(1, 2, 0.2);
agv.Mag2Go(2, 5, 0.2);
```
**方式 B — LoopMission 环线**
@@ -103,11 +103,11 @@ agv.MagFass2Go(2, 5, 0.2);
```text
┌─────────────────────────────────────────────────────────┐
│ 业务层:LoopMission / 手动 Go / 脚本 │
│ (分配 goalSite 或编译多行 MagFass2Go
│ (分配 goalSite 或编译多行 Mag2Go
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ MagFass2Car 执行层 │
│ Mag2Car 执行层 │
│ · 脚本拦截(Loop + goalSite)→ 一次全程任务 │
│ · Fass2TaskBuilder:路径 + fields → 节点序列 │
│ · Fass2TaskStateMachine:滑动窗口下发 + 动作闭环 │
@@ -125,7 +125,7 @@ agv.MagFass2Go(2, 5, 0.2);
**关键理解:**
- **LoopMissionCore** 只负责「给谁分配哪个目标站」(写 `goalSite` 标签)
- **MagFass2Car** 负责「怎么走过去」(拼包、下发、等到站)
- **Mag2Car** 负责「怎么走过去」(拼包、下发、等到站)
- **阶段 4** 后,Loop 不再逐行执行多段脚本,而是**拦截为一次全程任务**(可关)
---
@@ -138,8 +138,8 @@ agv.MagFass2Go(2, 5, 0.2);
```json
{
"carTypes": [ "MagCar", "MagFass2Car" ],
"missionTypes": [ "EventCarMission", "MagFass2LoopMission" ]
"carTypes": [ "MagCar", "Mag2Car" ],
"missionTypes": [ "EventCarMission", "Mag2LoopMission" ]
}
```
@@ -147,11 +147,11 @@ agv.MagFass2Go(2, 5, 0.2);
| Mission | 来源 | 适用 |
|---------|------|------|
| `LoopMission` | Core | 通用环线,MagFass2Car 同样可用 |
| `磁导航FASS2环线``MagFass2LoopMission` | Magnetic 插件 | 逻辑与 LoopMission 相同,名称标识磁导航 FASS2 场景 |
| `FASS车辆事件进程``EventCarMission` | Magnetic 插件 | **仅 MagCarFASS 1.0**,不驱动 MagFass2Car |
| `LoopMission` | Core | 通用环线,Mag2Car 同样可用 |
| `磁导航FASS2环线``Mag2LoopMission` | Magnetic 插件 | 逻辑与 LoopMission 相同,名称标识磁导航 FASS2 场景 |
| `FASS车辆事件进程``EventCarMission` | Magnetic 插件 | **仅 MagCarFASS 1.0**,不驱动 Mag2Car |
> 新手建议:MagFass2Car 环线用 **`LoopMission`** 或 **`磁导航FASS2环线`** 均可。
> 新手建议:Mag2Car 环线用 **`LoopMission`** 或 **`磁导航FASS2环线`** 均可。
### 4.3 tasklist.json 最小示例
@@ -186,7 +186,7 @@ agv.MagFass2Go(2, 5, 0.2);
## 5. 车辆参数说明
在场景编辑器中选中 `MagFass2Car`,常用字段如下。
在场景编辑器中选中 `Mag2Car`,常用字段如下。
### 5.1 通讯
@@ -269,8 +269,8 @@ agv.MagFass2Go(2, 5, 0.2);
```text
FindRoute → Compile → 多行脚本:
agv.MagFass2Go(1,2,speed);
agv.MagFass2Go(2,3,speed);
agv.Mag2Go(1,2,speed);
agv.Mag2Go(2,3,speed);
...
→ SelfEvaluating 逐行执行
→ 每行:锁终点 → 发 0xB1 → 等到站 → 释放起点
@@ -282,7 +282,7 @@ FindRoute → Compile → 多行脚本:
### 方式 2:Loop 全程任务(阶段 4,默认)
**触发**`goalSite` 标签 + 编译脚本含 `MagFass2Go` + `EnableLoopTaskDrive=true`
**触发**`goalSite` 标签 + 编译脚本含 `Mag2Go` + `EnableLoopTaskDrive=true`
**流程**
@@ -298,7 +298,7 @@ LoopMission 写 goalSite
---
### 方式 3:单段 MagFass2Go(脚本一行)
### 方式 3:单段 Mag2Go(脚本一行)
**触发**:脚本里只有一行,或无 `goalSite` 的测试。
@@ -370,7 +370,7 @@ LoopMission 写 goalSite
|------|------|
| 映射协议字段 | `Node`(节点号) |
| 何时配置 | 磁导航地标号与地图 `site.id` **不一致**时必须配置 |
| 车辆开关 | `MagFass2Car.UseTagValueAsNode = true` |
| 车辆开关 | `Mag2Car.UseTagValueAsNode = true` |
| 示例 | `TagValue = 10086` |
| 注意 | 未配置且 `UseTagValueAsNode=false` 时,直接用 `site.id` 作为节点号 |
@@ -387,9 +387,9 @@ LoopMission 写 goalSite
| 项目 | 说明 |
|------|------|
| 映射协议字段 | 无(当前版本不直接写入节点块) |
| 映射协议字段 | 无(写入节点块) |
| 规划值 | `None` / `Button` / `Plc` / `Api` |
| 当前状态 | 字段已定义,**等待放行联动逻辑待扩展**;可通过修改 `Fass2_StartStop` 或外部改 fields 触发重发 |
| 当前状态 | 人工/外部放行源预留。**管控区按车放行**请用 `Fass2_StartStop=12` + `Fass2_ControlArea`(站点列表),不要靠改地图 `Fass2_StartStop` 放行 |
---
@@ -401,8 +401,8 @@ LoopMission 写 goalSite
|----|---------------------------|----------|
| `1` | 过站(不停) | 路径中间站、通道站 |
| `2` | 普通停车 | 工位、等待点、装卸点 |
| `11` | 管控启动 | 管控区入口,需授权后启动 |
| `12` | 管控停止 | 管控区停车等待 |
| `11` | 管控启动 | 本车放行后写入 **0xA1 / 后续 0xB1**(地图站点仍保持 12 |
| `12` | 管控停止 | 管控区停车,等调度按车放行 |
| `22` | 精准停止 | 装配、对接,精度要求高 |
**默认规则**(未显式配置 `Fass2_StartStop` 时,`Fass2TaskBuilder` 自动决定):
@@ -413,7 +413,17 @@ LoopMission 写 goalSite
| 末站(goalSite | `2`(停车) |
| 末站 + `Fass2_PrecisionStop=true` | `22`(精准停) |
**动作完成判定**若配置了非过站值,状态机要求上报 `Node.StartStop` 与期望值一致且车体非运行态`State≠1`),才推进下一段
**动作完成判定**`2`/`22` 要求上报 `StartStop` 一致且车体非运行态`12` **不会**因上报 12 就推进:必须等同区占用条件满足后,调度把本车期望值改为 `11`(或 `1`),车体回显后再离站
**管控停止按车放行(`12`**
- 地图 `Fass2_StartStop` **始终保持 12**,不要改成 1 来放行(否则下一辆车的 0xB1 也会变成过站)。
- `0xB1` 窗口截断在第一个尚未放行的 12,其后站点不会出现在同一帧里。
- 本车到站并停稳后,统计 `Fass2_ControlArea` **站点列表**上的他车占用(`holdingLocks` + Mag2 `siteID`)。他车数 **≥** `Fass2_ControlCapacity`(默认 1,即数量与容量相等)则不放行;本车不计入,避免停在列表内时永远走不了。
- 放行只改**本车**报文:`0xA1` 把当前节点 `12→11`(可用 `Fass2_ControlReleaseStartStop=1` 改为过站),并补发含后续站的 `0xB1`。下一辆车仍会收到 12。
- 等待放行期间不消耗移动超时。断线重连若仍停在该管控点,会重新判定占用;条件满足则再次发放行报文。
相关站点字段:`Fass2_ControlArea`(站点 ID 数组,如 `10,11,12`)、`Fass2_ControlCapacity``Fass2_ControlReleaseStartStop`。未配或解析不出站点时,只统计当前管控点本身。
**与 `Fass2_PrecisionStop` 关系**
@@ -614,6 +624,9 @@ LoopMission 写 goalSite
| `Fass2_Tray` | byte | `Tray` | 是(非 0 时) |
| `Fass2_Shutdown` | byte | `Shutdown` | 是(非 0 时) |
| `Fass2_WaitMode` | string | — | 预留 |
| `Fass2_ControlArea` | string | — | 管控站点列表,如 `10,11,12` |
| `Fass2_ControlCapacity` | int | — | 列表内他车数达到该值则不放行,默认 1 |
| `Fass2_ControlReleaseStartStop` | byte | 放行后的 `StartStop` | `11`(默认)或 `1` |
---
@@ -632,7 +645,7 @@ LoopMission 写 goalSite
| `magSelect` | byte | `Byroad` | 磁导航 coder 分叉序号;`Fass2_Byroad` 为空时作为 Byroad 备选 |
| `Fass2_Direction` | byte | `Direction` | 边级车头旋转;站点未覆盖时生效 |
| `Fass2_Orientation` | byte | `Orientation` | 边级朝向;站点未覆盖时生效 |
| `Magnet` | bool | — | `true` 启用 `MagneticTrackCoder``agv.MagGo` 等),与 `MagFass2Go` 模板独立 |
| `Magnet` | bool | — | `true` 启用 `MagneticTrackCoder``agv.MagGo` 等),与 `Mag2Go` 模板独立 |
| `ReverseDst` | int | — | 倒车目的地站 ID;磁 coder 跳过该边 |
**距离 `Distance`**:由地图坐标自动计算(上一站与本站欧氏距离,mm 取整),一般无需手配。
@@ -717,6 +730,21 @@ Fass2_Charge = 2 # 开始充电
---
#### 场景 E2:管控停止(按车放行)
在 12 站点填写要监控的站点列表;**地图 `Fass2_StartStop` 保持 12**。
```text
Fass2_StartStop = 12
Fass2_ControlArea = 10,11,12 # 这些站上有他车且数量达到容量则不放行
Fass2_ControlCapacity = 1
# Fass2_ControlReleaseStartStop = 11 # 默认;改 1 则放行后按过站离站
```
列表 `10,11,12` 上已有 1 辆他车时,本车停在 12 等待;他车离开列表后,调度只给本车发 `0xA1`(12→11)。下一辆车仍会先收到 12。
---
#### 场景 FY 型磁分叉口
**站点**(推荐在岔口站配):
@@ -792,7 +820,7 @@ Fass2_Obstacle = 2
2. 匹配 tasklistcurrentStationId = N → 分配 targetStationId
3. 写 tagsgoalSite = 目标站 ID
4. LoopStartAction 调用 GoSite
5. MagFass2Car 拦截 → 全程任务到 goalSite
5. Mag2Car 拦截 → 全程任务到 goalSite
6. 到达后 GoSite 清理 goalSite / occupied / loopAssigned
7. 下一轮任务匹配
```
@@ -809,7 +837,7 @@ Fass2_Obstacle = 2
- **不需要改 Core**`LoopMission` 逻辑完全沿用
- `磁导航FASS2环线` 仅为场景标识,行为与 `LoopMission` 相同
- 真正区别在 **车型** 是否 `MagFass2Car``EnableLoopTaskDrive=true`
- 真正区别在 **车型** 是否 `Mag2Car``EnableLoopTaskDrive=true`
### 9.4 关闭 Loop 拦截(恢复多段脚本)
@@ -817,7 +845,7 @@ Fass2_Obstacle = 2
EnableLoopTaskDrive = false
```
Loop 仍走 Compile 多行 `MagFass2Go`,每行一段边。
Loop 仍走 Compile 多行 `Mag2Go`,每行一段边。
---
@@ -890,7 +918,7 @@ Idle → Planning → Moving → AtStation → SegmentDone → … → Complete
| 重置UDP监听 | — | 重新注册 UDP 会话 |
| 重置TCP连接 | — | 关闭长连接(TCP 模式) |
日志前缀:`[MagFass2Car:车名(id)]`,任务状态机:`task-sm`
日志前缀:`[Mag2Car:车名(id)]`,任务状态机:`task-sm`
---
@@ -936,13 +964,13 @@ Idle → Planning → Moving → AtStation → SegmentDone → … → Complete
看日志:
- `loop goal drive intercept` → 全程任务(阶段 4
- `script begin` + 多行 `MagFass2Go` → 多段脚本
- `script begin` + 多行 `Mag2Go` → 多段脚本
### Q6:与 MagCar 混用注意事项
- `EventCarMission` **只控制 MagCar**
- 同场景两种车型时,tasklist 和车辆类型要对应
- FASS 1.0 用 `MagCar`FASS 2.0 用 `MagFass2Car`
- FASS 1.0 用 `MagCar`FASS 2.0 用 `Mag2Car`
---
@@ -964,7 +992,7 @@ MoveTimeoutSeconds = 120
### 13.2 上线前检查清单
- [ ] 插件 `StandardScene.Magnetic.dll` 已加载
- [ ] 车型为 `MagFass2Car`(不是 `MagCar`
- [ ] 车型为 `Mag2Car`(不是 `MagCar`
- [ ] `VehicleCode`、IP、端口与车体一致
- [ ] UDP 能收到 100B,日志有 `0x10` 应答
- [ ] 关键站点 `TagValue` / `Fass2_*` 已配置
@@ -993,12 +1021,12 @@ MoveTimeoutSeconds = 120
| 模块 | 路径 |
|------|------|
| 车型 | `CarTypes/MagFass2Car.cs` |
| 车型 | `CarTypes/Mag2Car.cs` |
| 协议 | `Protocol/Fass2Protocol.cs``Fass2UdpHub.cs` |
| 组包 | `Tasking/Fass2TaskBuilder.cs` |
| 状态机 | `Tasking/Fass2TaskStateMachine.cs` |
| 动作判定 | `Tasking/Fass2ActionResolver.cs` |
| 环线 Mission | `Chained/MagFass2LoopMission.cs` |
| 环线 Mission | `Chained/Mag2LoopMission.cs` |
| 站点字段常量 | `Tasking/Fass2SiteFields.cs` |
---
+4 -4
View File
@@ -1,7 +1,7 @@
# Export MagFass2Car guide Markdown to PDF (requires Chrome or Edge)
# Export Mag2Car guide Markdown to PDF (requires Chrome or Edge)
param(
[string]$InputMd = "$PSScriptRoot\MagFass2Car使用指南.md",
[string]$OutputPdf = "$PSScriptRoot\MagFass2Car使用指南.pdf"
[string]$InputMd = "$PSScriptRoot\Mag2Car使用指南.md",
[string]$OutputPdf = "$PSScriptRoot\Mag2Car使用指南.pdf"
)
$ErrorActionPreference = 'Stop'
@@ -147,7 +147,7 @@ $html = @"
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>MagFass2Car Guide</title>
<title>Mag2Car Guide</title>
<style>
@page { size: A4; margin: 18mm 16mm; }
body { font-family: "Microsoft YaHei", "Segoe UI", sans-serif; color: #222; line-height: 1.55; font-size: 11pt; }