152 lines
4.6 KiB
Markdown
152 lines
4.6 KiB
Markdown
# StandardScene 快速参考
|
|
|
|
## 1. 一眼看懂这个仓库
|
|
|
|
| 项目项 | 说明 |
|
|
| --- | --- |
|
|
| 工程类型 | `StandardScene.dll` 插件库 |
|
|
| 运行方式 | 由 `build\SimpleComposer.exe` 加载 |
|
|
| 目标框架 | `.NET Framework 4.8` |
|
|
| 核心入口 | `MissionType`、`CarType`、`WebApi.cs` |
|
|
| 新手起步文件 | `Scheduler\HeartBeatMission.cs` |
|
|
| 进阶起步文件 | `Scheduler\RegionalTrafficControlMission.cs` |
|
|
|
|
## 2. 关键目录速记
|
|
|
|
| 路径 | 你通常在这里做什么 |
|
|
| --- | --- |
|
|
| `CarTypes\` | 新车型、协议接入、状态同步 |
|
|
| `Chained\` | 搬运任务、环线任务、调度逻辑 |
|
|
| `Charge\` | 充电策略、充电桩管理 |
|
|
| `InterLock\` | 互锁与交通控制 |
|
|
| `Scheduler\` | 心跳、安全、区域流控等后台 Mission |
|
|
| `ExtendDevice\Door\` | 门控联动 |
|
|
| `Model\` | 配置与数据模型 |
|
|
| `WebApi.cs` | HTTP API |
|
|
| `Commons.cs` | 标签、字段、选车、路径辅助 |
|
|
|
|
## 3. 构建运行速记
|
|
|
|
1. 打开 `StandardScene.sln`
|
|
2. 确保本机依赖路径存在
|
|
3. 编译解决方案
|
|
4. 打开 `build\SimpleComposer.exe`
|
|
5. 确认插件已从 `build\plugins` 加载
|
|
|
|
### 注意
|
|
|
|
当前工程是旧式 `.csproj`。新增 `.cs` 文件后,如果没有通过 VS 正确加入工程,可能需要手工补:
|
|
|
|
```xml
|
|
<Compile Include="Scheduler\HelloMission.cs" />
|
|
```
|
|
|
|
## 4. 新增功能时先看谁
|
|
|
|
| 目标 | 优先参考 |
|
|
| --- | --- |
|
|
| 新增最小 Mission | `Scheduler\HeartBeatMission.cs` |
|
|
| 做区域限流 | `Scheduler\RegionalTrafficControlMission.cs` |
|
|
| 做运输调度 | `Chained\TransportMission.cs` |
|
|
| 做环线 | `Chained\AbstractLoopMission.cs` |
|
|
| 做充电 | `Charge\StandardChargeMission.cs` |
|
|
| 做充电桩管理 | `Charge\ChargeStationManagementExample.cs` |
|
|
| 做 Web 接口 | `WebApi.cs` |
|
|
|
|
## 5. 高频代码片段
|
|
|
|
### 获取车辆与站点
|
|
|
|
```csharp
|
|
var car = SimpleLib.GetCar(carId);
|
|
var allCars = SimpleLib.GetAllCars();
|
|
var site = SimpleLib.GetSite(siteId);
|
|
var allSites = SimpleLib.GetAllSites();
|
|
var currentSiteId = car.GetLastSite();
|
|
```
|
|
|
|
### 更新标签与字段
|
|
|
|
```csharp
|
|
Commons.AddOrUpdateTag(car.tags, "occupied", "yes");
|
|
Commons.AddOrUpdateCarField(car, "group", "A");
|
|
Commons.AddOrUpdateSiteField(site, "giveWay", "true");
|
|
```
|
|
|
|
### 规划并执行路径
|
|
|
|
```csharp
|
|
var plan = new SegmentPlan { usingCar = car };
|
|
plan.fields["action"] = "move";
|
|
plan.fields["allow_destination_on_route"] = "true";
|
|
plan.FindRoute(SimpleLib.GetSite(srcId), SimpleLib.GetSite(dstId));
|
|
await plan.Compile("move").Queue();
|
|
```
|
|
|
|
### 输出日志
|
|
|
|
```csharp
|
|
Diagnosis.Post("任务已启动", "demo", true);
|
|
Diagnosis.Log("详细调试信息", "demo", true);
|
|
car.AppendDebug("车辆状态变化");
|
|
```
|
|
|
|
## 6. 常见配置文件
|
|
|
|
| 文件 | 用途 |
|
|
| --- | --- |
|
|
| `Config\traffic.json` | 交通 / 互锁配置 |
|
|
| `Config\ChargeStations.json` | 充电桩数据 |
|
|
| `Config\ChargeStrategyConfig.json` | 充电策略 |
|
|
| `Config\AlarmConfigs.json` | 充电报警 |
|
|
| `DoorConfig.json` | 门控配置 |
|
|
| `tasklist.json` | 环线任务列表 |
|
|
| `simple.json` | 宿主基础配置 |
|
|
|
|
## 7. 常见 API 路由
|
|
|
|
| 路由 | 作用 |
|
|
| --- | --- |
|
|
| `/car/createTask` | 创建任务 |
|
|
| `/car/getAllCars` | 获取车辆列表 |
|
|
| `/car/goSite` | 让车辆前往站点 |
|
|
| `/map/getMap` | 获取地图 |
|
|
| `/task/getTask` | 查询任务 |
|
|
| `/mission_reflection/get_mission_list` | 获取 Mission 列表 |
|
|
| `/mission_reflection/execute/{id}/{method}` | 反射执行 Mission 方法 |
|
|
|
|
## 8. 调试优先级
|
|
|
|
出现问题时,建议按这个顺序排查:
|
|
|
|
1. 插件是否被宿主加载
|
|
2. Mission / CarType 是否被识别
|
|
3. 配置文件和 `fields` 是否正确
|
|
4. 车辆是否在线、是否被标签占用
|
|
5. 路径规划是否成功
|
|
6. 是否被交通控制或区域流控拦截
|
|
7. 外部接口是否真的打到了 `WebApi.cs`
|
|
|
|
## 9. 常见故障速查
|
|
|
|
| 现象 | 优先检查 |
|
|
| --- | --- |
|
|
| 新增 Mission 看不到 | 特性、`Create()`、`.csproj` 引用、插件复制 |
|
|
| 任务一直不执行 | 车辆在线状态、路径、标签占用、前置条件 |
|
|
| 区域限流无效 | 站点字段是否以 `Region` 开头,值是否为整数 |
|
|
| API 调不通 | 路由路径、宿主端口、Nancy 是否已启动 |
|
|
| 车辆不动 | 路径失败、程序未下发、协议未连通 |
|
|
|
|
## 10. 推荐上手案例
|
|
|
|
### HelloMission
|
|
|
|
- 目标:理解最小插件生命周期
|
|
- 参考:`Scheduler\HeartBeatMission.cs`
|
|
- 验证:启动后 `status.status` 每秒递增
|
|
|
|
### 区域流控
|
|
|
|
- 目标:理解字段驱动 + 事件订阅
|
|
- 参考:`Scheduler\RegionalTrafficControlMission.cs`
|
|
- 验证:给站点添加 `Region1=1` 后,第二台车进入同区域会被阻止 |