コード例 #1
0
        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();
        }
コード例 #2
0
//        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
        }