using System.ComponentModel; namespace StandardScene.Signal.Model { /// /// PLC 机构静态配置,对应反编译 PLCModel 可存档字段。 /// 读写运行态(当前字节、机构内车号)在 ,不进本类、不进 JSON。 /// 机构名称不能重复,列表编辑器用 JgName 做主键。 /// [Category("PLC数据管理")] [DisplayName("PLC配置列表(机构名称不能重复)")] public class PlcStationModel { /// 逻辑名,握手点 SignalParams 第一段、Worker 线程名都用它。不能空、不能重复。 [DisplayName("机构名称")] public string JgName { get; set; } = ""; /// 西门子 PLC IP。 [DisplayName("机构IP")] public string Ip { get; set; } = "127.0.0.1"; /// S7 端口。填 0 则用进程字段 PlcPort(默认 102)。 [DisplayName("端口")] public int Port { get; set; } = 102; /// /// 读字节地址(PLC→调度:允许进入/离开)。 /// 支持 DB1.DBB0 或 Hsl 风格 DB1.0。空则跳过读取。 /// [DisplayName("读地址")] public string ReadDb { get; set; } = ""; /// /// 写字节地址(调度→PLC:进入中/到位/离开中/已离开)。 /// Worker 会先回读再按需写入。空则跳过写和回读。 /// [DisplayName("写地址")] public string WriteDb { get; set; } = ""; /// /// 心跳位地址,如 DB1.DBX2.0。 /// Worker 每拍读当前值再写反码,让 PLC 判断调度进程存活。空则不做心跳。 /// [DisplayName("写心跳地址")] public string HeartDb { get; set; } = ""; /// 机构进入地标(预留,与老 PLCModel 字段对齐;上线跟车主要用 JgInContains)。 [DisplayName("机构进入地标")] public int JgInPointId { get; set; } /// /// 进入过程包含的站点列表(逗号/分号/空格分隔)。 /// 上线:写字节=进入中 且车已不在此列表 → 视为到位。 /// [DisplayName("机构进入包含地标")] public string JgInContains { get; set; } = ""; /// /// 机构工作地标。下线 RequestIn 用它查「机构内是否已有车」; /// 下线/等待通行离站时,车必须停在此点才响应允许离开。 /// [DisplayName("机构地标")] public int JgPointId { get; set; } /// /// 机构占用包含的站点列表。车已不在此列表且写字节还不是已离开 → 写已离开。 /// [DisplayName("机构包含地标")] public string JgContains { get; set; } = ""; /// 上线 / 单牵引下线 / 双牵引下线 / 等待通行,决定 AutoLeave 分支。 [DisplayName("上下机构")] public SignalLineType LineType { get; set; } = SignalLineType.未知; } }