磁导航1.0内部交管和信号交互
This commit is contained in:
@@ -30,11 +30,12 @@ namespace StandardScene.Signal.Logic
|
||||
public static class JgControlHandler
|
||||
{
|
||||
/// <summary>停稳:可选限流 → RequestIn 或 Arrived。</summary>
|
||||
public static void OnStopped(Car car, SignalStopSpec spec, Func<string, PlcStationRuntime> find, IDictionary<string, int> rateFlowLog)
|
||||
public static void OnStopped(Car car, SignalStopSpec spec, Func<string, string, PlcStationRuntime> find, IDictionary<string, int> rateFlowLog)
|
||||
{
|
||||
var jgName = spec.Part(0).Trim();
|
||||
var action = spec.Part(1).Trim();
|
||||
var rateFlow = spec.Part(2).Trim();
|
||||
var jgName = spec.JgName;
|
||||
var action = spec.Action;
|
||||
var dockId = spec.DockId;
|
||||
var rateFlow = spec.ExtraParams;
|
||||
if (string.IsNullOrEmpty(jgName))
|
||||
{
|
||||
Diagnosis.Log($"AGV{car.id}停在地标{SignalCarAdapter.PositionId(car)},读取配置机构名称为空", "JGControl", true);
|
||||
@@ -48,29 +49,25 @@ namespace StandardScene.Signal.Logic
|
||||
}
|
||||
|
||||
if (string.Equals(action, "RequestIn", StringComparison.OrdinalIgnoreCase))
|
||||
RequestIn(jgName, car, find);
|
||||
RequestIn(jgName, dockId, car, find);
|
||||
else if (string.Equals(action, "Arrived", StringComparison.OrdinalIgnoreCase))
|
||||
Arrived(jgName, car, find);
|
||||
Arrived(jgName, dockId, car, find);
|
||||
}
|
||||
|
||||
/// <summary>行驶中只做 RequestIn 安全闸:未允许进入且不是本车占用请求槽则停车。</summary>
|
||||
public static void OnMoving(Car car, SignalStopSpec spec, Func<string, PlcStationRuntime> find)
|
||||
public static void OnMoving(Car car, SignalStopSpec spec, Func<string, string, PlcStationRuntime> find)
|
||||
{
|
||||
var jgName = spec.Part(0).Trim();
|
||||
var action = spec.Part(1).Trim();
|
||||
var jgName = spec.JgName;
|
||||
var action = spec.Action;
|
||||
if (string.IsNullOrEmpty(jgName))
|
||||
return;
|
||||
if (string.Equals(action, "RequestIn", StringComparison.OrdinalIgnoreCase))
|
||||
RequestInJudge(jgName, car, find);
|
||||
RequestInJudge(jgName, spec.DockId, car, find);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 请求进入。锁机构运行态,避免与 PLC Worker 同时改写字节 / 车号。
|
||||
/// 后半段与 <see cref="RequestInJudge"/> 相同,覆盖「刚放行后又被调度层启动」的竞态。
|
||||
/// </summary>
|
||||
private static void RequestIn(string jgName, Car car, Func<string, PlcStationRuntime> find)
|
||||
private static void RequestIn(string jgName, string dockId, Car car, Func<string, string, PlcStationRuntime> find)
|
||||
{
|
||||
var rt = find(jgName);
|
||||
var rt = find(jgName, dockId);
|
||||
if (rt == null)
|
||||
{
|
||||
Diagnosis.Log($"{jgName} 未能找到机构", "JGControl", true);
|
||||
@@ -83,19 +80,19 @@ namespace StandardScene.Signal.Logic
|
||||
rt.RequestInAgvNo == 0 &&
|
||||
rt.ReadWriteSignal == SignalWriteValue.无状态)
|
||||
{
|
||||
if (rt.Config.LineType is SignalLineType.单牵引下线机构 or SignalLineType.双牵引下线机构)
|
||||
if (rt.Station.LineType is SignalLineType.单牵引下线机构 or SignalLineType.双牵引下线机构)
|
||||
{
|
||||
var inside = SignalCarAdapter.CarsAt(rt.Config.JgPointId);
|
||||
var inside = SignalCarAdapter.CarsAt(rt.Dock.JgPointId);
|
||||
if (inside.Count > 0)
|
||||
{
|
||||
Diagnosis.Log(
|
||||
$"{jgName} 机构内有AGV【{string.Join(",", inside.Select(x => x.id))}】暂不放行AGV{car.id}",
|
||||
$"{rt.DisplayName} 机构内有AGV【{string.Join(",", inside.Select(x => x.id))}】暂不放行AGV{car.id}",
|
||||
"JGControl", true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Diagnosis.Log($"{jgName} 机构允许进入,通知AGV{car.id}启动,通知机构AGV进入中", "JGControl", true);
|
||||
Diagnosis.Log($"{rt.DisplayName} 机构允许进入,通知AGV{car.id}启动,通知机构AGV进入中", "JGControl", true);
|
||||
rt.WriteSignal = SignalWriteValue.进入中;
|
||||
rt.RequestInAgvNo = car.id;
|
||||
SignalCarAdapter.StopCharge(car);
|
||||
@@ -108,15 +105,14 @@ namespace StandardScene.Signal.Logic
|
||||
SignalCarAdapter.IsMoving(car))
|
||||
{
|
||||
SignalCarAdapter.Stop(car);
|
||||
Diagnosis.Log($"{jgName} 机构不允许进入,监控到AGV启动,暂停AGV{car.id}", "JGControl", true);
|
||||
Diagnosis.Log($"{rt.DisplayName} 机构不允许进入,监控到AGV启动,暂停AGV{car.id}", "JGControl", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>行驶中的 RequestIn 安全闸,条件与 RequestIn 后半段一致。</summary>
|
||||
private static void RequestInJudge(string jgName, Car car, Func<string, PlcStationRuntime> find)
|
||||
private static void RequestInJudge(string jgName, string dockId, Car car, Func<string, string, PlcStationRuntime> find)
|
||||
{
|
||||
var rt = find(jgName);
|
||||
var rt = find(jgName, dockId);
|
||||
if (rt == null)
|
||||
{
|
||||
Diagnosis.Log($"{jgName} 未能找到机构", "JGControl", true);
|
||||
@@ -130,17 +126,14 @@ namespace StandardScene.Signal.Logic
|
||||
SignalCarAdapter.IsMoving(car))
|
||||
{
|
||||
SignalCarAdapter.Stop(car);
|
||||
Diagnosis.Log($"{jgName} 机构不允许进入,监控到AGV启动,暂停AGV{car.id}", "JGControl", true);
|
||||
Diagnosis.Log($"{rt.DisplayName} 机构不允许进入,监控到AGV启动,暂停AGV{car.id}", "JGControl", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 到位。InAgvNo 已是本车则认为已报到,避免每秒重复写「到位」把 WriteSuccess 清掉。
|
||||
/// </summary>
|
||||
private static void Arrived(string jgName, Car car, Func<string, PlcStationRuntime> find)
|
||||
private static void Arrived(string jgName, string dockId, Car car, Func<string, string, PlcStationRuntime> find)
|
||||
{
|
||||
var rt = find(jgName);
|
||||
var rt = find(jgName, dockId);
|
||||
if (rt == null)
|
||||
{
|
||||
Diagnosis.Log($"{jgName} 未能找到机构", "JGControl", true);
|
||||
@@ -151,7 +144,7 @@ namespace StandardScene.Signal.Logic
|
||||
{
|
||||
if (rt.InAgvNo == car.id)
|
||||
return;
|
||||
Diagnosis.Log($"AGV{car.id}已到达机构{jgName}", "JGControl", true);
|
||||
Diagnosis.Log($"AGV{car.id}已到达机构{rt.DisplayName}", "JGControl", true);
|
||||
rt.WriteSignal = SignalWriteValue.到位;
|
||||
rt.InAgvNo = car.id;
|
||||
rt.RequestInAgvNo = 0;
|
||||
|
||||
Reference in New Issue
Block a user