新增信号交互进程插件
This commit is contained in:
@@ -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.已离开)
|
||||
|
||||
Reference in New Issue
Block a user