/// <summary> /// 更新调理版设置组 /// </summary> private void UpdateMeterageSample() { //设置每块调理版的参数组 byte[] recData = new byte[13]; Console.WriteLine("更新调理版参数组!"); for (int i = 1; i <= 4; i++) { byte[] cmd = OrderHelper.UpdateMeterageSample(_site.MeterageLibList.Where(item => item.GorupId == i).ToList(), i); if (cmd != null) { _sokect.Send(cmd); if (!_sokect.Receive(recData)) { ; } //LogHelper.Info(MethodBase.GetCurrentMethod(), string.Format("{0}站点更新调理{1}号参数组失败!", _site.Sn, i)); } } //设置对应每块调理版的参数组是否采集 for (int i = 1; i <= 4; i++) { List <MeterageLibModel> meterageLibList = _site.MeterageLibList.Where(item => item.GorupId == i).ToList(); if (meterageLibList.Count == 0) { continue; } for (int j = 1; j <= 8; j++) { int channelId = j + (i - 1) * 8; IEnumerable <ChannelStruct> channelStructList = _site.ChannelStructList.Where(c => c.ChannelID == channelId); if (channelStructList.Count() == 0) { continue; } ChannelStruct channelStruct = channelStructList.FirstOrDefault(); List <MeterageSamplerate> meterageSampleList = _meterageSamplerateService.Query(s => s.AreaId == channelStruct.AreaID && s.McId == channelStruct.MachineID && s.ParId == channelStruct.MonitorID && s.DirId == channelStruct.Position_HVA && s.IsSamplerate == 1); byte[] cmd = OrderHelper.UpdateMeterageChannelBind(meterageLibList, meterageSampleList, channelId); if (cmd != null) { if (_sokect.Send(cmd)) { if (_sokect.Receive(recData)) { continue; } //LogHelper.Info(MethodBase.GetCurrentMethod(), string.Format("{0}站点{1}通道号参数组是否采集配置失败!", _site.Sn, channelId)); } } } } Console.WriteLine("更新调理版参数组完成!"); }
/// <summary> /// 站点配置更新 /// </summary> public static byte[] UpdateChannelInfo(ChannelStruct channelStruct) { /********************************************下载测点结构:******************************************* * 【 1 | $】 * 【 2 | P(point)】 * 【 3~264| struct ChannelInfo 】 262字节 * 【265校验 】 **************************************************************************************************************/ channelStruct.AreaName = new char[30]; channelStruct.MachineName = new char[30]; channelStruct.MonitorIDName = new char[30]; byte[] structData = MarshalHelper.StructToBytes(channelStruct, 266); byte[] cmd = new byte[266 + 3]; cmd[0] = (byte)'$'; cmd[1] = (byte)'P'; Array.Copy(structData, 0, cmd, 2, 266); cmd[268] = (byte)'$'; return(cmd); }
protected internal override void Read() { serverId = ReadD(); string serverName = ReadS(); string serverAddr = ReadS(); bool useAkey = (ReadC() == 1) ? true : false; ServerStruct server = new ServerStruct(serverId, serverName, serverAddr, useAkey); int channel_count = ReadD(); for (int i = 0; i < channel_count; i++) { int id = ReadH(); string name = ReadS(); int port = ReadH(); int type = ReadC(); int max = ReadD(); int curr = ReadD(); ChannelStruct channel = new ChannelStruct(id, name, port, type, max, curr); server.Channels.Add(channel.Id, channel); } LoginServer.ServerList.Add(server.Id, server); }
public ResponseSelectServer(int sid, int cid) { server = LoginServer.ServerList[sid]; channel = server.Channels[cid]; }
public void GetSiteDetails(ref SiteModel site) { int sn = site.Sn; Site siteInfo = _siteService.Query(s => s.SiteSN == sn).FirstOrDefault(); site.IsUpdate = siteInfo.SiteUpdateTag; site.RunState = siteInfo.SiteRunState; site.AearId = siteInfo.AreaId; List <ConfigBindModel> configBindModelList = _configBindService.GetChannelStructInfo(site.Sn); List <ChannelStruct> channelStructList = new List <ChannelStruct>(); foreach (ConfigBindModel item in configBindModelList) { ChannelStruct channel = _mapper.Map <ChannelStruct>(item); channel.SensorSensitivity = 100; channel.Bias_limit_low = 0; channel.Bias_limit_high = 0; channel.SensorStableTime = -1; channel.SpeedRPM = 0; channel.SpeedChannelNo = 0; channel.RpmRatio = 0; channel.Speed_limit_low = -1; channel.Speed_limit_high = -1; channel.Fmax = -1; channel.Lines = 1; channel.AverageTime = 1; channel.AveragePercent = 1; channel.Amplification = 1; channel.value4 = -40.0f; channel.value20 = 100.0f; channel.MeaValueUnit = GetAttrName(""); switch (channel.TypeSensor) { case 0: //加速度 SensorAcc accSensor = _sensorAccService.QueryById(item.SensorId); if (accSensor != null) { channel.SensorSensitivity = (float)accSensor.AccSensibility; channel.Bias_limit_low = (float)accSensor.AccBiasLow; channel.Bias_limit_high = (float)accSensor.AccBiasHigh; channel.SensorStableTime = accSensor.AccSettlingTime; } break; case 3: //范围 SensorRange rangeSensor = _sensorRangeService.QueryById(item.SensorId); if (rangeSensor != null) { channel.value4 = rangeSensor.RangeValue1; channel.value20 = rangeSensor.RangeValue2; } break; } List <WorkStatus> workStatuesList = _workStatusService.GetWorkStatusByDirId(channel.AreaID, item.ChannelID); int[] workStatues = new int[5]; for (int i = 0; i < 5; i++) { workStatues[i] = workStatuesList.Count > i ? workStatuesList[i].WorkStatusValue : -1; } channel.StateStatus = workStatues; channel.SpeedSatus = new int[5]; channelStructList.Add(channel); } site.ChannelStructList = channelStructList; site.MeterageLibList = _meterageLibService.GetMeterageLibListBySn(site.Sn); site.WorkStatusList = _workStatusService.Query(w => w.AreaId == siteInfo.AreaId && w.IsUse == 1); }
/// <summary> /// 从下位机获取波形或频谱数据,波形数据直接存储,频谱数据返回供提取转速 /// </summary> /// <param name="meterageSamplerate">获取波形或频谱参数</param> /// <returns></returns> private DataTwModel GetTwFFTData(MeterageSamplerate ms) { //是否停机状态 string key = $"A{ms.AreaId}M{ms.McId}"; if (_stopMachineOa.GetValueOrDefault(key)) { return(null); } byte[] recData = new byte[20]; int line = ms.MsrLine; int frequency = ms.MsrRateMax; int type = ms.MsrParameter.ToLower().Contains("env") ? 2 : 0; char typeName = ms.MsrName.ToUpper()[0]; //类型的首字母 如:Disp 'D' ChannelStruct channelStruct = _site.ChannelStructList.FirstOrDefault(cs => cs.AreaID == ms.AreaId && cs.MachineID == ms.McId && cs.MonitorID == ms.ParId && cs.Position_HVA == ms.DirId); //获取通道号 List <int> workStatuesList = channelStruct.StateStatus.Where(w => w != -1).ToList(); byte[] cmd = OrderHelper.TwDataByChannel(channelStruct.ChannelID, typeName, frequency, line, 0); //获取每个通道取数据命令 if (_socket.Send(cmd)) { if (!_socket.Receive(recData)) //接收失败 { return(null); } int len = BitConverter.ToInt32(recData, 15); //获取要接收的数据长度 if (len <= 0) //是否有数据 { return(null); } //获取波形数据 cmd = OrderHelper.TwDataByChannel(channelStruct.ChannelID, typeName, frequency, line, 1); if (!_socket.Send(cmd)) { return(null); } byte[] data = new byte[len]; if (!_socket.Receive(data)) //接收波形数据,最后4个字节是工况 { Console.WriteLine(string.Format("{0}站点{1}通道号接收波形异常!", _site.Sn, channelStruct.ChannelID)); return(null); } DataTw tw = new DataTw() //数据转化波形对象 { AreaId = ms.AreaId, McId = ms.McId, ParId = ms.ParId, DirId = ms.DirId, DataLines = GetLineByType(ms.MsrLine, type), DataPoints = (int)(GetLineByType(ms.MsrLine, type) * 2.56), DataHz = (int)(GetFrequencyByType(ms.MsrRateMax, type) * 2.56), DataIsFFT = 0, DataType = type + 1, DataFormat = 2, Data = new byte[len - 7 * 4], DataWorkStatus = Convert.ToInt32(BitConverter.ToSingle(data, 24)), Time = ConvertTime(data) }; //是否是要取的工况 if (!workStatuesList.Exists(w => w == tw.DataWorkStatus)) { return(null); } Array.Copy(data, 7 * 4, tw.Data, 0, len - 7 * 4); //把波形数据copy到 tw.data中 if (ms.MsrParameter.ToLower().Contains("env")) //包络,直接存 { tw.DataIsFFT = 1; tw.Data = SplitMinFFT(tw.Data, ms); //截取最小Fmin _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); //存入数据库 } else if (ms.MsrParameter.ToLower().Contains("acc")) { //存储波形 _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); //频谱存储 float[] accSpectrum = GetAccSpectrum(ToFloatArray(tw.Data), tw.DataLines); for (int z = 0; z < accSpectrum.Length; z++) { accSpectrum[z] = accSpectrum[z] / 1.414f;//峰值转有效值 } tw.Data = ToByteArray(accSpectrum); tw.DataIsFFT = 1; tw.Data = SplitMinFFT(tw.Data, ms); //截取最小Fmin _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); } else if (ms.MsrParameter.ToLower().Contains("disp")) { float[] accSpectrum = GetAccSpectrum(ToFloatArray(tw.Data) /*原始波形*/, tw.DataLines); //位移频谱 float[] dispSpectrum = GetDispSpectrum(accSpectrum, tw.DataHz, tw.DataPoints); for (int k = 0; k < dispSpectrum.Length; k++) { //位移有效值 dispSpectrum[k] = dispSpectrum[k] * 9800 * 1000 / 1.414f; } //位移波形 float[] dispTw = new float[tw.DataPoints]; FFTHelper.IntegrateFromSpectrum(ToFloatArray(tw.Data) /*原始波形*/, tw.DataHz, tw.DataPoints, ms.MsrRateMin, GetFrequencyByType(ms.MsrRateMax, type), 2, ref dispTw); for (int k = 0; k < dispTw.Length; k++) { dispTw[k] = dispTw[k] * 9800 * 1000; } //存储波形 //tw.data = ToByteArray(dispTw); _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); //频谱存储 tw.DataIsFFT = 1; tw.Data = ToByteArray(dispSpectrum); tw.Data = SplitMinFFT(tw.Data, ms); //截取最小Fmin _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); } else if (ms.MsrParameter.ToLower().Contains("vel")) { float[] accSpectrum = GetAccSpectrum(ToFloatArray(tw.Data) /*原始波形*/, tw.DataLines); //速度波形 float[] velTw = new float[tw.DataPoints]; FFTHelper.IntegrateFromSpectrum(ToFloatArray(tw.Data) /*原始波形*/, tw.DataHz, tw.DataPoints, ms.MsrRateMin, GetFrequencyByType(ms.MsrRateMax, type), 1, ref velTw); for (int k = 0; k < velTw.Length; k++) { velTw[k] = velTw[k] * 9800; } //速度频谱 float[] velSpectrum = GetVelSpectrum(accSpectrum, tw.DataHz, tw.DataPoints); for (int k = 0; k < velSpectrum.Length; k++) { velSpectrum[k] = velSpectrum[k] * 9800 / 1.414f; } //波形存储 //tw.data = ToByteArray(velTw); _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); //频谱存储 tw.DataIsFFT = 1; tw.Data = ToByteArray(velSpectrum); //获取频谱 tw.Data = SplitMinFFT(tw.Data, ms); //截取最小Fmin _dataTwService.InsertDataTw(tw, string.Format("tb_data_tw_{0}", ms.MsrName)); } return(_mapper.Map <DataTwModel>(tw)); } return(null); }