public PumpSystem(Guid ppGuid) { Guid = ppGuid; Log.Inform(); Log.Inform($"--------- 开始构建机泵系统{Guid.ToFormatedString()} ---------"); Log.Inform(); #region 构建机泵部件 //部件部分 Pump = new Component(Guid, CompType.Pump) { NameRemark = "水泵" }; Motor = new Component(Guid, CompType.Motor) { NameRemark = "电机" }; Coupler = new Component(Guid, CompType.Coupler) { NameRemark = "联轴器" }; //振动传感器部分 var vibrasensors = Repo.SensorList.Where(s => GuidExt.IsSameGuid(s.PPGUID, Guid)).ToList(); foreach (var vibrasensor in vibrasensors) { var td = new VibraTransducer(vibrasensor.SSGUID) { Signal = vibrasensor.ITEMCODE, NameRemark = vibrasensor.SSNAME, Position = PubFuncs.FindTdPosFromSignal(vibrasensor.ITEMCODE) }; Transducers.Add(td); Log.Inform($"添加振动传感器({td.NameRemark}): 信号量:{td.Signal} 位置:{td.Position}"); } //非振动部分 foreach (var phydefnovibra in Repo.PhyDefNoVibra.Where(s => GuidExt.IsSameGuid(s.PPGUID, Guid))) { var type = PubFuncs.ParseSignalType(phydefnovibra.ITEMCODE); if (type.HasValue) { var td = new NonVibraTransducer(phydefnovibra.PPGUID, type.Value, phydefnovibra.ID) { Signal = phydefnovibra.ITEMCODE, NameRemark = phydefnovibra.PDNVNAME, Position = PubFuncs.FindTdPosFromSignal(phydefnovibra.ITEMCODE) }; Transducers.Add(td); Log.Inform($"添加非振动传感器({td.NameRemark}): 信号量:{td.Signal} 位置:{td.Position}"); } } //还有一枚单独的转速变送器 var speedTd = new SpeedTransducer(Guid); Transducers.Add(speedTd); Log.Inform($"添加转速传感器({speedTd.NameRemark}): 信号量:{speedTd.Signal} 位置:{speedTd.Position}"); // var ta = Repo.PhyDefNoVibra.Select(p => p.ITEMCODE).ToList(); Add(Pump); Add(Motor); Add(Coupler); AddRange(Transducers); #endregion #region 构建部件间接属性 foreach (DataRow row in PumpSysLib.TableIndirectProperty.Rows) { var prop = new Property { Name = row["PropertyName"].ToString(), Value = row["DefaultValue"].ToString(), Variable = row["Variable"].ToString() }; AllocateProperty(prop, row); } //连接点属性是间接属性的一部分,所以也加入 foreach (DataRow row in PumpSysLib.TableConnectorPointProperty.Rows) { var prop = new Property { Name = row["PropertyName"].ToString(), // Value = row["DefaultValue"].ToString(), Variable = row["Variable"].ToString() }; AllocateProperty(prop, row); } #endregion #region 绑定传感器的自带信号量 foreach (var transducer in Transducers) { transducer.BindSignal(); } #endregion #region 设置振动传感器的图谱的信号量 foreach (var tdv in Transducers.Where(t => t.Type == CompType.Td_V)) { foreach (var gType in Enum.GetNames(typeof(GraphType))) { var prop = tdv.Properties.Find(p => p.Variable == "@" + gType); prop.Value = PubFuncs.FormatGraphSignal(tdv.Code, (GraphType)Enum.Parse(typeof(GraphType), gType)); } } #endregion #region 根据引用属性,将间接属性的值绑定到信号量 foreach (DataRow row in PumpSysLib.TableRefProperty.Rows) { //找到要设置属性值的组件 BaseComponent comp = null; var cpType = Repo.Map.TypeToEnum[row["TypeName"].ToString()]; switch (cpType) { case CompType.Pump: comp = Pump; break; case CompType.Motor: comp = Motor; break; case CompType.Coupler: comp = Coupler; break; } //找到要设置的属性值 var prop = comp?.Properties.Find(p => p.Variable == row["IndirectVariable"].ToString()); if (prop != null) { //先找是哪个类型的传感器 var tdtype = Repo.Map.TypeToEnum[row["RefType"].ToString()]; //再根据位置找到该传感器 var tdpos = (TdPos)Enum.Parse(typeof(TdPos), row["Position"].ToString()); var td = Transducers.Find(t => t.Type == tdtype && t.Position == tdpos); //再找到传感器上的属性 var rp = td?.Properties.Find(p => p.Variable == row["RefVariable"].ToString()); if (rp != null) { prop.Value = rp.Value; } } } #endregion #region 根据水泵guid,设置水泵轴承和电机轴承的各自的4个缺陷频率 foreach (var pumpBrInfo in DataDetailsOp.GetPumpBearingInfos(Guid)) { Pump.Properties.First(p => p.Variable == pumpBrInfo.Key).Value = pumpBrInfo.Value.ToString(); } foreach (var motorBrInfo in DataDetailsOp.GetMotorBearingInfos(Guid)) { Motor.Properties.First(p => p.Variable == motorBrInfo.Key).Value = motorBrInfo.Value.ToString(); } #endregion #region 根据水泵guid,设置水泵叶片数 Pump.Properties.First(p => p.Variable == "@BladeNum").Value = DataDetailsOp.GetPumpFanCount(Guid).ToString(); #endregion Log.Inform(); Log.Inform($"--------- 机泵系统{ppGuid} 构建结束---------"); Log.Inform(); }
// public double Speed { get; set; } /// <summary> /// 根据机泵运行情况构建的要获取的实时数据的结构 /// </summary> public RtData() { #region 构建【单点数据】的结构,并设置如何映射到Redis中 foreach (var ppGuid in RuntimeRepo.RunningPumpGuids) { foreach (var phy in SysConstants.SENSORSETTING.Values) { var vibraSignal = $"${phy}_{ppGuid}"; SpData.Add(vibraSignal, default(double)); var sensor = Repo.SensorList.FirstOrDefault(p => SysConstants.SENSORSETTING[p.LOCATION + "_" + p.DIRECTION] == phy && ppGuid == p.PPGUID); if (sensor != null) { var keyVibra = $"{{{sensor.SSGUID}}}_{SysConstants.VIBRADICT.OverAll}".ToUpper(); RedisKeyMap.Add(keyVibra, vibraSignal); } else { Log.Warn($"实时数据构建:振动传感器未找到: {phy} ppguid: {ppGuid} (将导致相关判据无法解析)"); } } foreach (var phynv in SysConstants.PHYDEF_NONVIBRA) { var noVibraSignal = $"${phynv}_{ppGuid}"; SpData.Add(noVibraSignal, default(double)); var sensor = Repo.PhyDefNoVibra.FirstOrDefault(p => p.REMARK == phynv && ppGuid == p.PPGUID); if (sensor != null) { var keyNoVibra = $"{{{ppGuid}}}_{sensor.PDNVCODE}".ToUpper(); RedisKeyMap.Add(keyNoVibra, noVibraSignal); } else { Log.Warn($"实时数据构建:非振动传感器未找到: {phynv} ppguid: {ppGuid} (将导致相关判据无法解析)"); } } var speedSignal = SpeedTransducer.FormatTdSpeedSignal(ppGuid.ToString()); SpData.Add(speedSignal, default(double)); var keySpeed = $"{{{ppGuid}}}_{SysConstants.VIBRADICT.Speed}".ToUpper(); RedisKeyMap.Add(keySpeed, speedSignal); } #endregion #region 构建【振动图谱数据】的结构 int graphNumber = 1; foreach (var pumpGuid in RuntimeRepo.RunningPumpGuids) { foreach (var sensorSetting in SysConstants.SENSORSETTING) { var sensor = Repo.SensorList.FirstOrDefault( p => p.LOCATION + "_" + p.DIRECTION == sensorSetting.Key && pumpGuid == p.PPGUID); var pos = FindPosFromSignal(sensorSetting.Value); Debug.Assert(pos != null, "sensorSetting 传感器位置无法解析"); if (sensor == null) { continue; } Graphs.Add(new Graph { Signal = PubFuncs.FormatGraphSignal(sensor.SSGUID.ToString(), GraphType.Spectrum), Number = graphNumber++, Pos = pos.Value, Type = GraphType.Spectrum }); Graphs.Add(new Graph { Signal = PubFuncs.FormatGraphSignal(sensor.SSGUID.ToString(), GraphType.TimeWave), Number = graphNumber++, Pos = pos.Value, Type = GraphType.TimeWave }); } } #endregion }