新增信号交互进程插件

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
@@ -4,16 +4,37 @@ namespace StandardScene.Signal.Model
{
/// <summary>
/// 握手点配置。对应老地图点上的 <c>SignalStop</c>SignalType + SignalParams)。
/// 站点 fields 若已填写同名键,优先用站点字段。
/// </summary>
/// <remarks>
/// 站点 fields 若已填写同名键,扫车优先用站点字段,本表该站点不再生效。
/// SignalParams 按分号切分,各类型格式见 <see cref="StandardScene.Signal.Logic.SignalStopSpec"/>。
/// 列表主键展示为「站点号 + 类型」,同一站点建议只配一条。
/// </remarks>
[Category("握手点数据管理")]
[DisplayName("握手点配置列表")]
public class HandshakePointModel
{
/// <summary>地图站点号,与车 PositionIdsiteID / GetLastSite)对应。</summary>
[DisplayName("站点")]
public int Sit { get; set; }
/// <summary>
/// 握手类型:<c>JGControl</c> 机构进出、
/// <c>PointControl</c> 销钉升降、
/// <c>TimedCharging</c> 定时充电、
/// <c>RateFlowControl</c> 区域限流。
/// 其它字符串会每 10s 打一次「未找到业务模块」日志。
/// </summary>
[DisplayName("信号类型")]
public string SignalType { get; set; } = "JGControl";
/// <summary>
/// 类型参数。示例:
/// JGControl <c>上线机构1;RequestIn</c> / <c>上线机构1;Arrived</c> / 第三段限流 <c>缓存区-A-2-60,61</c>
/// PointControl <c>UP1;下线机构1</c>
/// TimedCharging <c>300;95;20</c>
/// RateFlowControl <c>缓存区;A;2;60,61,62</c>。
/// </summary>
[DisplayName("信号参数")]
public string SignalParams { get; set; } = "";
}
+33 -1
View File
@@ -3,40 +3,72 @@ using System.ComponentModel;
namespace StandardScene.Signal.Model
{
/// <summary>
/// PLC 机构配置对应反编译 <c>PLCModel</c> 可存档字段;读写运行态不进本类
/// PLC 机构静态配置对应反编译 <c>PLCModel</c> 可存档字段。
/// 读写运行态(当前字节、机构内车号)在 <see cref="StandardScene.Signal.Plc.PlcStationRuntime"/>,不进本类、不进 JSON。
/// 机构名称不能重复,列表编辑器用 JgName 做主键。
/// </summary>
[Category("PLC数据管理")]
[DisplayName("PLC配置列表(机构名称不能重复)")]
public class PlcStationModel
{
/// <summary>逻辑名,握手点 SignalParams 第一段、Worker 线程名都用它。不能空、不能重复。</summary>
[DisplayName("机构名称")]
public string JgName { get; set; } = "";
/// <summary>西门子 PLC IP。</summary>
[DisplayName("机构IP")]
public string Ip { get; set; } = "127.0.0.1";
/// <summary>S7 端口。填 0 则用进程字段 PlcPort(默认 102)。</summary>
[DisplayName("端口")]
public int Port { get; set; } = 102;
/// <summary>
/// 读字节地址(PLC→调度:允许进入/离开)。
/// 支持 <c>DB1.DBB0</c> 或 Hsl 风格 <c>DB1.0</c>。空则跳过读取。
/// </summary>
[DisplayName("读地址")]
public string ReadDb { get; set; } = "";
/// <summary>
/// 写字节地址(调度→PLC:进入中/到位/离开中/已离开)。
/// Worker 会先回读再按需写入。空则跳过写和回读。
/// </summary>
[DisplayName("写地址")]
public string WriteDb { get; set; } = "";
/// <summary>
/// 心跳位地址,如 <c>DB1.DBX2.0</c>。
/// Worker 每拍读当前值再写反码,让 PLC 判断调度进程存活。空则不做心跳。
/// </summary>
[DisplayName("写心跳地址")]
public string HeartDb { get; set; } = "";
/// <summary>机构进入地标(预留,与老 PLCModel 字段对齐;上线跟车主要用 JgInContains)。</summary>
[DisplayName("机构进入地标")]
public int JgInPointId { get; set; }
/// <summary>
/// 进入过程包含的站点列表(逗号/分号/空格分隔)。
/// 上线:写字节=进入中 且车已不在此列表 → 视为到位。
/// </summary>
[DisplayName("机构进入包含地标")]
public string JgInContains { get; set; } = "";
/// <summary>
/// 机构工作地标。下线 RequestIn 用它查「机构内是否已有车」;
/// 下线/等待通行离站时,车必须停在此点才响应允许离开。
/// </summary>
[DisplayName("机构地标")]
public int JgPointId { get; set; }
/// <summary>
/// 机构占用包含的站点列表。车已不在此列表且写字节还不是已离开 → 写已离开。
/// </summary>
[DisplayName("机构包含地标")]
public string JgContains { get; set; } = "";
/// <summary>上线 / 单牵引下线 / 双牵引下线 / 等待通行,决定 AutoLeave 分支。</summary>
[DisplayName("上下机构")]
public SignalLineType LineType { get; set; } = SignalLineType.;
}
@@ -2,18 +2,40 @@ using System.ComponentModel;
namespace StandardScene.Signal.Model
{
/// <summary>单个机构运行态快照,供 MissionStatus / 监视面板展示。</summary>
/// <summary>
/// 单个机构运行态快照,供 MissionStatus / 监视面板展示。
/// 由 <see cref="StandardScene.Signal.Plc.PlcStationRuntime.ToSnapshot"/> 拷贝,UI 不要直接绑 Runtime。
/// </summary>
public class PlcStationSnapshot
{
/// <summary>机构逻辑名。</summary>
[DisplayName("机构")] public string JgName { get; set; } = "";
/// <summary>最近一拍 PLC 读写是否成功。</summary>
[DisplayName("连接")] public bool IsConnected { get; set; }
/// <summary>PLC→调度读字节的枚举名(允许进入 / 允许离开 / 无状态)。</summary>
[DisplayName("读信号")] public string ReadSignal { get; set; } = "";
/// <summary>调度目标写字节的枚举名。</summary>
[DisplayName("写信号")] public string WriteSignal { get; set; } = "";
/// <summary>从写地址回读到的枚举名,用于确认 PLC 是否已吃进目标值。</summary>
[DisplayName("回读写值")] public string ReadWriteSignal { get; set; } = "";
/// <summary>已报到在机构内的 AGV 号,0 表示没有。</summary>
[DisplayName("机构内车")] public int InAgvNo { get; set; }
/// <summary>已获准进入、正在往机构开的 AGV 号,0 表示没有。</summary>
[DisplayName("请求进入车")] public int RequestInAgvNo { get; set; }
/// <summary>目标写字节是否已与回读一致。</summary>
[DisplayName("写入成功")] public bool WriteSuccess { get; set; }
/// <summary>Worker 内存心跳翻转,表示线程在跑。</summary>
[DisplayName("心跳")] public bool Heart { get; set; }
/// <summary>最近一次断线或周期异常原因。</summary>
[DisplayName("最近错误")] public string LastError { get; set; } = "";
}
}
@@ -2,12 +2,23 @@ using System.ComponentModel;
namespace StandardScene.Signal.Model
{
/// <summary>放行点配置。对应反编译 <c>StartSignModel</c>。</summary>
/// <summary>
/// 放行点配置。对应反编译 <c>StartSignModel</c>。
/// </summary>
/// <remarks>
/// 车停在 <see cref="Sit"/> 且 <see cref="IsUse"/> 为 true 时,进程停充并启动,不读 PLC。
/// 同一站点不要同时配握手点:扫车先握手再放行,可能把还在等允许进入的车开走。
/// 站点号不能重复,列表编辑器用 Sit 做主键。
/// </remarks>
[Category("放行点数据管理")]
[DisplayName("放行点配置列表")]
public class ReleasePointModel
{
/// <summary>要自动放行的地图站点号。</summary>
[DisplayName("放行站点")]
public int Sit { get; set; }
/// <summary>false 时该条保留在 JSON 里但不生效,方便现场临时关掉某个点。</summary>
[DisplayName("启用")]
public bool IsUse { get; set; } = true;
}
+35 -3
View File
@@ -1,30 +1,62 @@
namespace StandardScene.Signal.Model
{
/// <summary>PLC → 调度:读字节含义(与反编译 ENUM_READ_SIGNAL 对齐)。</summary>
/// <summary>
/// PLC → 调度:读字节含义。对齐反编译 <c>ENUM_READ_SIGNAL</c>。
/// 机构用这一个字节告诉 AGV 现在能不能进、能不能出。
/// </summary>
public enum SignalReadValue : byte
{
/// <summary>0:空闲 / 未允许。RequestIn 必须看到写字节也是无状态才放行。</summary>
= 0,
/// <summary>1:允许进入机构。扫车 RequestIn 的放行条件之一。</summary>
= 1,
/// <summary>2:允许离开机构。下线升销钉、等待通行机构、PointControl 等会等这个值。</summary>
= 2
}
/// <summary>调度 → PLC:写字节含义(与反编译 ENUM_WRITE_SIGNAL 对齐)。</summary>
/// <summary>
/// 调度 → PLC:写字节含义。对齐反编译 <c>ENUM_WRITE_SIGNAL</c>。
/// AGV 用这一个字节向机构汇报当前处于进站流程的哪一步。
/// </summary>
public enum SignalWriteValue : byte
{
/// <summary>0:空闲。离站清空后回到此值,下一辆才能 RequestIn。</summary>
= 0,
/// <summary>1:已获准进入、正在往机构开。RequestIn 成功时写入。</summary>
= 1,
/// <summary>2:已到达机构内地标。Arrived 或上线 AutoLeave 检测到离开进入包含区时写入。</summary>
= 2,
/// <summary>3:正在离开机构。上线看到车在跑、下线/等待通行启动后写入。</summary>
= 3,
/// <summary>4:已离开包含地标。PLC 确认后调度清零写字节和车号。</summary>
= 4
}
/// <summary>机构类型(与反编译 ENUM_JGTYPE 对齐)。</summary>
/// <summary>
/// 机构类型。对齐反编译 <c>ENUM_JGTYPE</c>。
/// 决定 <see cref="StandardScene.Signal.Plc.PlcStationLogic.AutoLeave"/> 走哪套离站,以及 RequestIn 要不要查机构内是否有车。
/// </summary>
public enum SignalLineType : byte
{
/// <summary>0:未配置,AutoLeave 不处理。</summary>
= 0,
/// <summary>1:上线。进站靠扫车 RequestIn/Arrived,离站跟车位自动推进到位/离开中/已离开。</summary>
线 = 1,
/// <summary>2:单牵引下线。RequestIn 时若 JgPointId 上已有车则不放行;离站要升销钉1。</summary>
线 = 2,
/// <summary>3:双牵引下线。同单牵引,离站还需销钉2到位。</summary>
线 = 3,
/// <summary>4:等待通行。无销钉,允许离开后停充启动即可。</summary>
= 4
}
}