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; }
}