新增信号交互进程插件

This commit is contained in:
ykkokluo
2026-08-17 15:20:27 +08:00
parent 12c7c1d518
commit cacc5fea5c
25 changed files with 937 additions and 369 deletions
+34 -1
View File
@@ -5,9 +5,17 @@ using StandardScene.Signal.Model;
namespace StandardScene.Signal.Plc
{
/// <summary>读写字节转换与四套自动离站,对齐反编译 PLCManager。</summary>
/// <summary>
/// PLC 字节含义转换,以及按机构类型自动推进离站状态机。对齐反编译 <c>PLCManager</c>。
/// </summary>
/// <remarks>
/// 由 <see cref="PlcStationWorker"/> 每 200ms 在已持有 <see cref="PlcStationRuntime.Sync"/> 时调用。
/// 写字节含义见 <see cref="SignalWriteValue"/>:无状态 → 进入中 → 到位 → 离开中 → 已离开 → 清零。
/// 「已离开」可由本侧写成功,或 PLC 回读写值变成已离开(对方清过)触发清空。
/// </remarks>
public static class PlcStationLogic
{
/// <summary>PLC 读字节 → 调度侧枚举。仅 1=允许进入、2=允许离开,其余当无状态。</summary>
public static SignalReadValue ConvertRead(byte val) => val switch
{
1 => SignalReadValue.,
@@ -15,6 +23,7 @@ namespace StandardScene.Signal.Plc
_ => SignalReadValue.
};
/// <summary>PLC 写地址回读字节 → 调度侧枚举。1~4 对应进入中/到位/离开中/已离开。</summary>
public static SignalWriteValue ConvertWrite(byte val) => val switch
{
1 => SignalWriteValue.,
@@ -24,6 +33,10 @@ namespace StandardScene.Signal.Plc
_ => SignalWriteValue.
};
/// <summary>
/// 判断站点是否落在机构配置的包含列表里。
/// 列表支持逗号、分号、空格分隔,与 JSON 里 <c>JgInContains</c> / <c>JgContains</c> 一致。
/// </summary>
public static bool ContainsSite(string csv, int siteId)
{
if (string.IsNullOrWhiteSpace(csv) || siteId <= 0)
@@ -32,6 +45,7 @@ namespace StandardScene.Signal.Plc
.Any(s => int.TryParse(s.Trim(), out var n) && n == siteId);
}
/// <summary>按 <see cref="PlcStationModel.LineType"/> 分发四套离站逻辑;未知类型不处理。</summary>
public static void AutoLeave(PlcStationRuntime rt)
{
if (rt?.Config == null) return;
@@ -52,6 +66,10 @@ namespace StandardScene.Signal.Plc
}
}
/// <summary>
/// 离站完成:写字节清无状态、清空机构内车号。
/// 若仍挂着 RequestInAgvNo(上线途中 PLC 已报已离开),一并清掉以免卡死下一辆。
/// </summary>
private static void ClearLeft(PlcStationRuntime rt, bool fromReadback)
{
rt.WriteSignal = SignalWriteValue.;
@@ -67,6 +85,12 @@ namespace StandardScene.Signal.Plc
Diagnosis.Log($"{rt.Config.JgName} 已离开,清空信号", "JGControl", true);
}
/// <summary>
/// 上线机构:进站过程由扫车 RequestIn/Arrived 启动,离站由本方法跟车位推进。
/// 进入中且车已离开 JgInContains → 视为到位;
/// 到位且车在跑 → 离开中;
/// 离开中且车已不在 JgContains → 已离开。
/// </summary>
private static void AutoLeaveUpLine(PlcStationRuntime rt)
{
if (rt.WriteSuccess && rt.WriteSignal == SignalWriteValue.)
@@ -100,6 +124,11 @@ namespace StandardScene.Signal.Plc
}
}
/// <summary>
/// 下线机构:车已在机构内(InAgvNo),等允许离开后升销钉、停充、启动,写离开中;
/// 车离开 JgContains 后写已离开。
/// <paramref name="pin2"/> 为 true 时双牵引,需销钉1+2都到位。
/// </summary>
private static void AutoLeaveDownLine(PlcStationRuntime rt, bool pin2)
{
if (rt.WriteSuccess && rt.WriteSignal == SignalWriteValue.)
@@ -144,6 +173,10 @@ namespace StandardScene.Signal.Plc
}
}
/// <summary>
/// 等待通行机构:无销钉,允许离开且停在 JgPointId 时停充并启动,写离开中;
/// 离开包含地标后写已离开。
/// </summary>
private static void AutoLeaveWaitSit(PlcStationRuntime rt)
{
if (rt.WriteSuccess && rt.WriteSignal == SignalWriteValue.)