示例#1
0
        private AutoMeasuredValue GetAutoMeasuredValue(byte[] data)
        {
            if (data.Length == 28)
            {
                return(null);
            }

            AutoMeasuredValue amv = new AutoMeasuredValue();
            int nYear             = 0;
            int nMonth            = 0;
            int nDay    = 0;
            int nHour   = 0;
            int nMinute = 0;
            int nSecond = 0;

            try
            {
                amv.areaId            = BitConverter.ToInt32(data, 0);
                amv.machineId         = BitConverter.ToInt32(data, 4);
                amv.monitorId         = BitConverter.ToInt32(data, 8);
                amv.position_HVA      = BitConverter.ToInt32(data, 12);
                amv.channeld          = BitConverter.ToInt32(data, 16);
                amv.monitorPeriodTime = BitConverter.ToInt32(data, 20);
                amv.typeSensor        = BitConverter.ToInt32(data, 24);

                if (amv.areaId == 0)//数据无效 返回空
                {
                    return(null);
                }


                amv.MeasuredList = new List <MeasuredValue>();
                //获取运行次数 =(总长度-数据头)/ 结构体大小
                int runNum = (data.Length - 28) / 84;
                for (int i = 0; i < runNum; i++)
                {
                    MeasuredValue mv = new MeasuredValue();
                    mv    = (MeasuredValue)MarshalHelper.ByteToStruct(data, i * 84 + 28, mv.GetType(), 84);
                    nYear = mv.year; nMonth = mv.month; nDay = mv.day; nHour = mv.hour; nMinute = mv.minute; nSecond = mv.second;
                    DateTime dateTime = new DateTime(mv.year, mv.month, mv.day, mv.hour, mv.minute, mv.second);
                    //PrintHelper.Info("CH-{0:D2} 数据{1} -- {2} ", channeld, i + 1, dateTime.ToString("yyyy-MM-dd HH:mm:ss"));
                    bool IsExists = amv.MeasuredList.Exists(x => x.year == mv.year && x.month == mv.month &&
                                                            x.day == mv.day && x.hour == mv.hour && x.minute == mv.minute && x.second == mv.second);
                    if (!IsExists)
                    {
                        amv.MeasuredList.Add(mv);
                    }
                }
            }
            catch (Exception ex)
            {
                //LogHelper.Error(System.Reflection.MethodBase.GetCurrentMethod(), ex.Message);
                return(null);
            }
            return(amv);
        }
示例#2
0
        public void GetDataOa(SiteModel site, SocketMiddleware socket)
        {
            Console.WriteLine("开始采集总值数据!");
            _machineStopList = _machineStopService.Query(ms => ms.AreaId == site.AearId);

            try
            {
                //通道OA的数据集合
                List <AutoMeasuredValue> amvList = new List <AutoMeasuredValue>();
                //工况集合
                List <int> workStatuesList = null;
                //获取接收的数据缓存
                byte[] sendData = null;
                #region 准备获取总值

                //PrintHelper.Info("【{0}】发送OA采集命令成功!{1}", _site.GetSN(), sendData);

                /********************************************************************************************************************************
                 * 【1 |	0x??】
                 * 【2,3,4,5 |	P,P,O,K  ASCII码等于(80,80,79,75)】
                 * 【6,7 | 仪器序列号(1~65536)(0填充)】
                 * 【8,9,10,11 |	仪器报警状态100:正常;1~17:不同报警】
                 * 【12,13,14,15 |	(int数据)振动总值参数检测的次数AutoRun_Num(用于在结构体里面提取有效振动总值参数的个数)】
                 * 【16,17,18,19 |	(int数据)一个测点的振动总值参数占用字节的位数84*AutoRun_Num(运行的次数) + 20】
                 * 【20,21,22,23 |	(int数据)当前运行的测点组号Num为0:准备好非0:等待Num*10后再发此命令查询】
                 * 【24 | 校验】
                 *******************************************************************************************************************************/
                #endregion

                #region 总值获取

                //循环获取每个通道下的数据
                foreach (ChannelStruct channel in site.ChannelStructList)
                {
                    workStatuesList = channel.StateStatus.Where(s => s != -1).ToList();
                    sendData        = OrderHelper.GetDataOaByChannelNum(channel.ChannelID, false);
                    if (socket.Send(sendData))
                    {
                        byte[] dataTemp = new byte[13];
                        if (socket.Receive(dataTemp))
                        {
                            int count = BitConverter.ToInt32(dataTemp, 5);
                            if (count > 0)
                            {
                                if (socket.Send(OrderHelper.GetDataOaByChannelNum(channel.ChannelID, true)))
                                {
                                    int    length  = 28 + count * 84;
                                    byte[] revData = new byte[length];
                                    if (socket.Receive(revData))
                                    {
                                        //获取数据进行结构化转换
                                        AutoMeasuredValue amv = GetAutoMeasuredValue(revData);
                                        //工况筛选
                                        IEnumerable <MeasuredValue> measuredValueList = amv.MeasuredList.Where(m => workStatuesList.Exists(w => w == m.WorkStatus));
                                        amv.MeasuredList = measuredValueList == null ? new List <MeasuredValue>() : measuredValueList.ToList();
                                        amvList.Add(amv);
                                    }
                                }
                            }
                        }
                    }
                }
                //通道采集完成后,告诉下位机继续自动运行
                sendData = OrderHelper.GetDataOaByChannelNum(-1, false);
                if (socket.Send(sendData))
                {
                    byte[] revData = new byte[13];
                    if (socket.Receive(revData))
                    {
                        if (OrderHelper.CheckCode(revData, 0) == revData[revData.Length - 1] &&
                            revData[1] == (byte)'P' && revData[2] == (byte)'P')
                        {
                            if (revData[3] == (byte)'O' && revData[4] == (byte)'K')
                            {
                                //PrintHelper.Info("将站点置为自动运行模式!");
                            }
                        }
                    }
                }
                #endregion

                #region 总值存储  同时修改报警状态
                //存储总值
                if (amvList.Count > 0)
                {
                    foreach (AutoMeasuredValue amv in amvList)
                    {
                        if (amv == null)
                        {
                            continue;
                        }
                        Console.WriteLine("【区域:{0},机器:{1},测点:{2},方向:{3}一共有{4}笔数据】", amv.areaId, amv.machineId, amv.monitorId, amv.position_HVA, amv.MeasuredList.Count);
                        InserDataOaList(amv);
                    }
                }
                #endregion

                Console.WriteLine("采集总值数据完成!");
            }
            catch (Exception ex)
            {
                Program.LoggerHelper.Error(typeof(DataOaModule), ex.Message, ex);
                Console.WriteLine(string.Format("采集总值数据出现异常!{0}", ex));
            }
        }
示例#3
0
        /// <summary>
        /// 插入总值
        /// </summary>
        /// <param name="amv"></param>
        private void InserDataOaList(AutoMeasuredValue amv)
        {
            List <DataOa> list     = new List <DataOa>();
            Meterage      meterage = _meterageService.Query(m => m.AreaId == amv.areaId && m.McId == amv.machineId && m.ParId == amv.monitorId && m.DirId == amv.position_HVA).FirstOrDefault();

            foreach (var measuredValue in amv.MeasuredList)
            {
                DataOa oAData = new DataOa()
                {
                    AreaId = amv.areaId,
                    McId   = amv.machineId,
                    ParId  = amv.monitorId,
                    DirId  = amv.position_HVA
                };
                //获取采集时间
                oAData.OaTime = new DateTime(measuredValue.year, measuredValue.month, measuredValue.day,
                                             measuredValue.hour, measuredValue.minute, measuredValue.second);
                if (!float.IsNaN(measuredValue.rms_Acc_F))
                {
                    oAData.OaAcc = measuredValue.rms_Acc_F;
                }
                if (!float.IsNaN(measuredValue.Disp))
                {
                    oAData.OaDisp = measuredValue.Disp;
                }
                if (!float.IsNaN(measuredValue.CF_Acc))
                {
                    oAData.OaCF = measuredValue.CF_Acc;
                }
                if (!float.IsNaN(measuredValue.Kurtosis_Acc))
                {
                    oAData.OaKurt = measuredValue.Kurtosis_Acc;
                }
                if (!float.IsNaN(measuredValue.rms_Vel_BP))
                {
                    oAData.OaVel = measuredValue.rms_Vel_BP;
                }
                if (!float.IsNaN(measuredValue.rms_Bg_HP))
                {
                    oAData.OaBg = measuredValue.rms_Bg_HP;
                }
                if (!float.IsNaN(measuredValue.rms_Bv_HP))
                {
                    oAData.OaBv = measuredValue.rms_Bv_HP;
                }
                if (!float.IsNaN(measuredValue.rms_Env))
                {
                    oAData.OaEnv = measuredValue.rms_Env;
                }
                oAData.OaTacho = measuredValue.Speed;
                if (!float.IsNaN(measuredValue.SensorStaticValue))
                {
                    oAData.OaTemp = measuredValue.SensorStaticValue;
                }
                oAData.OaWorkStatus = measuredValue.WorkStatus;
                oAData.OaAccType    = "rms";
                oAData.OaBgType     = "rms";
                oAData.OaBvType     = "rms";
                oAData.OaDispType   = "rms";
                oAData.OaEnvType    = "rms";
                oAData.OaVelType    = "rms";
                oAData.OaTempType   = "gz1";

                list.Add(oAData);
                Console.WriteLine(string.Format("总值数据BG:{0}, BV:{1}, ENV:{2}, DISP:{3}, VEL:{4}, ACC:{5}, CF:{6},KURT:{7},Temp:{8} ", oAData.OaBg, oAData.OaBv, oAData.OaEnv, oAData.OaDisp, oAData.OaVel, oAData.OaAcc, oAData.OaCF, oAData.OaKurt, oAData.OaTemp));
            }

            //验证是否停机状态 报警验证及添加数据
            if (!_stopModule.ValidateStop(list, meterage, _machineStopList))
            {
                _dataOaService.InsertEntityList(list);
                _oaAlarmModule.ValidateAlarm(list, meterage);
                _oaAlarmModule.SaveCache();
            }
        }