01. 项目总览
++ `StandardScene` 是 AGV/AMR 场景插件库,不是独立 EXE。它依赖宿主 `SimpleComposer.exe` 运行,能力覆盖搬运调度、环线任务、 + 交通互锁、区域流量控制、充电协同、门控联动,以及 HTTP / MQTT / Modbus 等外围接口。 +
+02. 运行架构
+| 层级 | +角色 | +典型文件 | +
|---|---|---|
| 宿主层 | +启动程序、装载插件、展示配置与 Mission | +build/SimpleComposer.exe |
+
| 场景逻辑层 | +任务调度、区域流控、充电、门禁等 | +Scheduler/、Chained/、Charge/ |
+
| 车辆协议层 | +各车型接入与状态同步 | +CarTypes/ |
+
| 基础能力层 | +路径规划、锁点、全局对象访问 | +SimpleCore、SimpleLib |
+
宿主装载流程
+-
+
- 编译得到
StandardScene.dll
+ - 构建事件将 DLL 复制到
build/plugins
+ - 宿主启动后扫描插件目录 +
- 通过特性反射识别
MissionType与CarType
+ - 用户或 API 启动对应场景逻辑 +
03. 模块地图
+| 目录 | +职责 | +建议起步文件 | +
|---|---|---|
Scheduler/ |
+ 心跳、安全信号、区域流控等轻量 Mission | +HeartBeatMission.cs |
+
Chained/ |
+ 搬运与环线任务主流程 | +TransportMission.cs |
+
Charge/ |
+ 充电站管理、策略控制、状态维护 | +StandardChargeMission.cs |
+
InterLock/ |
+ 区域互锁、交通控制 | +TrafficInterlockMission.cs |
+
CarTypes/ |
+ 车型与协议实现 | +VDA5050Car.cs |
+
ExtendDevice/Door/ |
+ 门禁联动 | +DoorMission.cs |
+
WebApi.cs |
+ 外部系统接入入口 | +/car/*、/map/*、/mission_reflection/* |
+
04. 构建与运行
+本机依赖路径
+D:\MDCS\Dependencies\Commons\CommonUsage.dll
+D:\MDCS\Dependencies\deps\LessokajiWeaverUtilities.dll
+D:\MDCS\Dependencies\Commons\MDCSToolBox.dll
+D:\MDCS\Dependencies\Simple\RefSimpleCore.dll
+D:\MDCS\Executables\Simple\SimpleComposer.exe
+
+ 构建步骤
+-
+
- 打开
StandardScene.sln
+ - 编译
Debug|Any CPU或Release|Any CPU
+ - 确认构建事件已将插件复制到
build/plugins
+ - 运行
build/SimpleComposer.exe
+
05. 快速开始案例
+ +案例 A:新增 HelloMission
++ 这是推荐的新手第一练。它直接沿用 `Scheduler/HeartBeatMission.cs` 的结构,只保留最小生命周期:`Create()`、`Execute()`、`Stop()`。 +
+using System.Threading;
+using Newtonsoft.Json;
+using SimpleComposer.RCS;
+using SimpleCore;
+
+namespace StandardScene.Scheduler
+{
+ [MissionType(Name = "Hello Mission", editor = typeof(HelloMission))]
+ [I18N.DocumentTranslation(Name = "Hello Mission", locale = "en")]
+ public class HelloMission : Mission
+ {
+ [JsonIgnore] private bool _started;
+ [JsonIgnore] private Thread _thread;
+
+ public static Mission Create()
+ {
+ return new HelloMission();
+ }
+
+ public override void Execute()
+ {
+ if (_started) return;
+ _started = true;
+ status.status = "已启动";
+
+ _thread = new Thread(() =>
+ {
+ int count = 0;
+ while (_started)
+ {
+ Thread.Sleep(1000);
+ count++;
+ status.status = $"tick:{count}";
+ }
+ });
+ _thread.Start();
+ }
+
+ public void Stop()
+ {
+ _started = false;
+ status.status = "已停止";
+ }
+ }
+}
+ -
+
- 新建
Scheduler/HelloMission.cs
+ - 确认它已被加入工程 +
- 编译并打开
build/SimpleComposer.exe
+ - 启动后观察
status.status是否按秒递增
+
案例 B:区域流控实验
+
+ 该案例对应 Scheduler/RegionalTrafficControlMission.cs。给同一区域的站点加字段 Region1=1,即可限制该区域最多同时只有 1 台车。
+
Region1 = 1
+ -
+
- 给目标区域内多个站点都加上相同的
Region1字段
+ - 启动“区域流量监控” Mission +
- 让两台车依次申请进入该区域 +
- 观察第二台车是否被阻止,日志和状态里会记录拦截次数 +
06. 配置文件
+| 文件 | +用途 | +
|---|---|
Config/traffic.json |
+ 交通互锁与区域控制 | +
Config/ChargeStations.json |
+ 充电桩定义 | +
Config/ChargeStrategyConfig.json |
+ 充电策略 | +
Config/AlarmConfigs.json |
+ 充电报警配置 | +
DoorConfig.json |
+ 门禁设备配置 | +
tasklist.json |
+ 环线任务列表 | +
simple.json |
+ 宿主基础配置 | +
+ 除了 JSON 文件,很多逻辑还大量依赖站点、车辆和轨道的 fields 与 tags。例如区域流控依赖以
+ Region 开头的字段,许多调度逻辑依赖 group、giveWay、standby 等字段。
+
07. API 入口
+WebApi.cs 是外部系统最重要的进入点,仓库中已可看到这些典型路由:
/car/createTask
+ 创建任务
+ /car/getAllCars
+ 查询车辆列表
+ /car/goSite
+ 指派车辆去站点
+ /map/getMap
+ 获取地图
+ /task/getTask
+ 查询任务
+ /mission_reflection/*
+ 反射调用 Mission 方法
+ 08. 开发工作流
+-
+
- 先定位功能属于哪个目录 +
- 找最接近的现有类作为模板 +
- 明确它依赖 JSON 配置还是 `fields` / `tags` +
- 补齐日志、状态和停止逻辑 +
- 确认新文件已加入工程 +
- 编译后在宿主中验证是否被识别 +
09. 常见排错
+| 现象 | +优先检查 | +
|---|---|
| 新增 Mission 在宿主里看不到 | +特性是否正确、`Create()` 是否存在、文件是否已加入 `.csproj`、插件是否复制到 `build/plugins` | +
| 区域流控不生效 | +站点字段名是否以 `Region` 开头、字段值是否为整数、Mission 是否已启动 | +
| 车不动或任务不走 | +车辆在线状态、路径是否可达、是否被锁点 / 互锁 / 门控拦截 | +
| API 调不通 | +路由是否正确、宿主端口是否打开、请求是否真的命中 `WebApi.cs` | +