namespace YZWater.Core.Models; /// /// 项目档案 - 定义一个项目的设备清单、PLC 地址映射和报警阈值 /// 从 projects/ 目录下的 JSON 文件加载 /// public class ProjectProfile { /// 项目名称(如 "扬杰二厂泵站") public string Name { get; set; } = ""; /// 项目描述 public string Description { get; set; } = ""; /// /// 视图模板名称(决定使用哪种 View 布局) /// 如 "PumpStation" = 泵站布局, "Default" = 默认4水箱布局 /// public string ViewTemplate { get; set; } = "Default"; /// 泵设备列表 public List Pumps { get; set; } = new(); /// 水箱/水池列表 public List Tanks { get; set; } = new(); /// 仪表列表(压力、流量等带刻度的模拟量) public List Gauges { get; set; } = new(); /// 通用传感器(日流量、温度等简单模拟量) public List Sensors { get; set; } = new(); /// 通用数字量输入(变频器故障等) public List DigitalInputs { get; set; } = new(); /// 通用数字量输出(复位按钮等) public List DigitalOutputs { get; set; } = new(); /// 报警阈值配置 public AlarmThresholds AlarmThresholds { get; set; } = new(); /// /// 全局中控/屏控切换地址(所有泵共用,0=中控 1=屏控) /// 如 M1.0 — 所有泵要么全中控,要么全屏控 /// public string? ModeSelectAddress { get; set; } /// 控制策略配置 — 决定上位机是否参与自动控制 public ControlConfig Control { get; set; } = new(); /// 页面布局配置 — 决定 ProjectView 的 UI 区域显隐和尺寸 public PageLayoutConfig Layout { get; set; } = new(); } /// /// 页面布局配置 — 控制 ProjectView 各区域显隐和尺寸 /// 缺失字段使用默认值,旧 JSON 无需改动即可兼容 /// public class PageLayoutConfig { /// 右侧数据面板宽度(像素),0 = 隐藏整个右列。默认 300 public int RightColumnWidth { get; set; } = 300; /// 隐藏的区块名称列表。 /// 可选值:"Tanks"(液位监控), "Gauges"(仪表), "Sensors"(累计), "Faults"(故障状态) /// 被隐藏的区块即使有数据也不显示 public List HiddenSections { get; set; } = new(); } /// /// 控制策略配置 — 决定上位机在该项目中的控制角色 /// EnableAutoControl=false 时上位机仅监控,自动逻辑由 PLC 处理 /// public class ControlConfig { /// 是否启用上位机自动控制(默认 false = PLC 自行处理) public bool EnableAutoControl { get; set; } = false; /// 控制模式描述(UI 显示用,如 "PLC自动" / "远程中控") public string ControlModeDescription { get; set; } = "PLC自动"; /// 是否允许上位机手动启停泵 public bool AllowManualControl { get; set; } = true; /// 是否允许参数同步写入 PLC public bool AllowParameterSync { get; set; } = true; } /// /// 泵设备配置 - 涵盖泵的读/写/状态点位 /// public class PumpConfig { /// 泵名称(如 "1#泵") public string Name { get; set; } = ""; // ─── 读取地址 ─── /// 运行状态地址 (DO 区,如 Q0.1) - 起停共用地址时与 StartAddress 相同 public string RunAddress { get; set; } = ""; /// 变频器故障地址 (DI 区,如 I0.1) public string FaultAddress { get; set; } = ""; /// 电流地址 (AI 区,如 AIW18 或对应的 VD 地址) public string CurrentAddress { get; set; } = ""; /// /// 额定电流(A,可选)。配置后泵卡电流条按「当前/额定」显示负荷比例, /// 超载(≥100%)变红提醒;未配置(0)时电流条退化为组内相对比例。 /// public float RatedCurrent { get; set; } /// 手自动状态地址 (读,如 M2.6, 1=自动 0=手动) public string AutoStateAddress { get; set; } = ""; /// 日台时-小时地址 (读,如 VD950) public string DailyHoursAddress { get; set; } = ""; /// 日台时-小时数据类型: "REAL" / "INT" / "DINT" (默认 REAL) public string DailyHoursDataType { get; set; } = "REAL"; /// 日台时-分钟地址 (读,如 VD10) public string DailyMinutesAddress { get; set; } = ""; /// 日台时-分钟数据类型: "REAL" / "INT" / "DINT" (默认 REAL) public string DailyMinutesDataType { get; set; } = "REAL"; // ─── 写入地址 ─── /// 手动启动地址 (写,如 M1.3, 点动) public string StartAddress { get; set; } = ""; /// 手动停止地址 (写,如 M1.4, 点动) public string StopAddress { get; set; } = ""; /// 自动命令地址 (写,如 M2.2, 点动) public string AutoCommandAddress { get; set; } = ""; /// 手动命令地址 (写,如 M2.1, 点动) public string ManualCommandAddress { get; set; } = ""; /// 日台时清零地址 (写,如 M19.4) public string DailyResetAddress { get; set; } = ""; } /// /// 水箱/水池配置 /// public class TankConfig { /// 名称(如 "集水池") public string Name { get; set; } = ""; /// 即时液位地址 (读,如 VD62) public string LevelAddress { get; set; } = ""; /// 启动 1 台泵的液位设定值 public float? StartPump1Level { get; set; } /// 启动 2 台泵的液位设定值 public float? StartPump2Level { get; set; } /// 启动 3 台泵的液位设定值 public float? StartPump3Level { get; set; } /// 停泵液位设定值 public float? StopLevel { get; set; } /// 保护液位设定值 public float? ProtectionLevel { get; set; } /// 池体满量程高度(米),用于 UI 液位归一化显示。未配置时自动取阈值中最大值 public float? MaxLevel { get; set; } /// 启动 1 台泵液位地址 (读写,如 VD500) public string StartPump1LevelAddress { get; set; } = ""; /// 启动 2 台泵液位地址 (读写,如 VD504) public string StartPump2LevelAddress { get; set; } = ""; /// 启动 3 台泵液位地址 (读写,如 VD508) public string StartPump3LevelAddress { get; set; } = ""; /// 停泵液位地址 (读写,如 VD528) public string StopLevelAddress { get; set; } = ""; /// 保护液位地址 (读写,如 VD962) public string ProtectionLevelAddress { get; set; } = ""; // ─── 按索引访问(动态泵数量支持,向后兼容旧字段)─── /// 获取第 N 台泵启泵液位地址(1-based,N=1/2/3 取旧字段,N≥4 取扩展列表) public string GetStartPumpLevelAddress(int pumpIndex) => pumpIndex switch { 1 => StartPump1LevelAddress, 2 => StartPump2LevelAddress, 3 => StartPump3LevelAddress, _ => pumpIndex - 1 < StartPumpLevelAddresses.Count ? StartPumpLevelAddresses[pumpIndex - 1] : "" }; /// 获取第 N 台泵启泵液位值(1-based) public float? GetStartPumpLevel(int pumpIndex) => pumpIndex switch { 1 => StartPump1Level, 2 => StartPump2Level, 3 => StartPump3Level, _ => pumpIndex - 1 < StartPumpLevels.Count ? StartPumpLevels[pumpIndex - 1] : null }; /// 设置第 N 台泵启泵液位值(1-based) public void SetStartPumpLevel(int pumpIndex, float value) { switch (pumpIndex) { case 1: StartPump1Level = value; break; case 2: StartPump2Level = value; break; case 3: StartPump3Level = value; break; default: while (StartPumpLevels.Count < pumpIndex) StartPumpLevels.Add(null); StartPumpLevels[pumpIndex - 1] = value; break; } } /// 扩展启泵液位地址列表(N≥4 时使用) public List StartPumpLevelAddresses { get; set; } = new(); /// 扩展启泵液位值列表(N≥4 时使用) public List StartPumpLevels { get; set; } = new(); } /// /// 仪表配置(压力、流量等带刻度/上下限的模拟量) /// public class GaugeConfig { /// 名称(如 "压力"、"流量") public string Name { get; set; } = ""; /// 单位(如 "MPa"、"m³/h") public string Unit { get; set; } = ""; /// 即时值地址 (读,如 VD6600) public string ValueAddress { get; set; } = ""; /// 高压/上限设置地址 (读写,如 VD6704) public string HighSetAddress { get; set; } = ""; /// 低压/下限设置地址 (读写,如 VD6700) public string LowSetAddress { get; set; } = ""; /// 高压报警设定值(同步到 HighSetAddress) public float? HighAlarmSet { get; set; } /// 低压报警设定值(同步到 LowSetAddress) public float? LowAlarmSet { get; set; } /// 仪表最小刻度值 public double MinValue { get; set; } /// 仪表最大刻度值 public double MaxValue { get; set; } = 100; } /// /// 通用传感器配置(简单模拟量,如日流量) /// public class SensorConfig { /// 名称(如 "日流量") public string Name { get; set; } = ""; /// 单位(如 "m³") public string Unit { get; set; } = ""; /// 数据地址(如 VD884) public string Address { get; set; } = ""; /// 数据类型: "REAL" / "INT" / "DWORD" public string DataType { get; set; } = "REAL"; /// 访问权限: "R" (只读) / "RW" (读写) public string Access { get; set; } = "R"; } /// /// 通用数字量输入配置 /// public class DigitalInputConfig { /// 名称(如 "泵1变频器故障") public string Name { get; set; } = ""; /// 地址(如 I0.1) public string Address { get; set; } = ""; /// 备注 public string Remark { get; set; } = ""; } /// /// 通用数字量输出配置 /// public class DigitalOutputConfig { /// 名称(如 "复位按钮") public string Name { get; set; } = ""; /// 地址(如 M30.0) public string Address { get; set; } = ""; /// 备注 public string Remark { get; set; } = ""; } /// /// 报警阈值 /// public class AlarmThresholds { /// /// 报警来源:PLC / Host / Both /// PLC = 只信任 PLC 的 DI 开关量报警,上位机不做模拟量阈值判断 /// Host = 只走上位机的模拟量阈值判断,忽略 PLC 的 DI 报警 /// Both = 两套都检查(可能产生重复报警) /// 默认 PLC /// public string AlarmSource { get; set; } = "PLC"; public float? LevelHigh { get; set; } public float? LevelLow { get; set; } public float? FlowHigh { get; set; } public float? FlowLow { get; set; } public float? PressureHigh { get; set; } public float? PressureLow { get; set; } }