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