// for SETUP private IList <SensorAcqResult> InitialDataAcqResult() { var result = new List <SensorAcqResult>(); var acq1 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 21 }, Data = new LaserData(0, 1.1) { // AcqTime = DateTime.Parse("2014-12-02 16:13:00") } }; var acq2 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 22 }, Data = new LaserData(0, 2.2) { // AcqTime = DateTime.Parse("2014-12-02 17:13:00") } }; result.Add(acq1); result.Add(acq2); return(result); }
// for SETUP private IList <SensorAcqResult> InitialDataAcqResult() { var result = new List <SensorAcqResult>(); var acq1 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 11 }, Data = new InclinationData(0, 0, 1.0, 1.1) }; var acq2 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 12 }, Data = new InclinationData(0, 0, 2.0, 2.1) }; var acq3 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 13 }, Data = new InclinationData(0, 0, 3.0, 3.1) }; result.Add(acq1); result.Add(acq2); result.Add(acq3); return(result); }
// miss base value private IList <SensorAcqResult> InitialDataAcqResultMissBasic() { var result = new List <SensorAcqResult>(); var acq2 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 2 }, Data = new PressureData(0, 1.2) }; var acq3 = new SensorAcqResult() { Sensor = new Sensor() { SensorID = 3 }, Data = new PressureData(0, 1.3) }; result.Add(acq2); result.Add(acq3); return(result); }
public void Request(ref SensorAcqResult sensorAcq) { try { if ((sensorAcq.Sensor.ModuleNo >= 10 && sensorAcq.Sensor.ModuleNo < 65) || (sensorAcq.Sensor.ModuleNo > 90 && sensorAcq.Sensor.ModuleNo < 97) || sensorAcq.Sensor.ModuleNo > 122) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } const string str = "#?OC;"; string moduleId = sensorAcq.Sensor.ModuleNo.ToString(); if (sensorAcq.Sensor.ModuleNo > 9) { moduleId = ((char)sensorAcq.Sensor.ModuleNo).ToString(); } var sendPressure = str.Replace("?", moduleId); var packet = Encoding.ASCII.GetBytes(sendPressure); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = packet; } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
public SensorAcqResult Parse(string data) { try { var json = JsonConvert.DeserializeObject <JsonData>(data); uint sensorId = json.S; Sensor sensor = new Sensor { SensorID = sensorId }; double[] rv = json.RV; double[] pv = json.PV; double[] lv = json.LV; double?[] tv = json.TV; if (pv != null) { tv = pv.Select(p => (double?)p).ToArray(); } SensorAcqResult rslt = new SensorAcqResult { ErrorCode = json.R, AcqNum = json.N, AcqTime = new DateTime(1970, 1, 1).AddMilliseconds(json.T), Request = json.Q, Response = json.A, Sensor = sensor, Data = new SensorData(rv, pv, lv, tv) }; return(rslt); } catch (Exception e) { throw new Exception("sensor acq result format error!\njson:" + data, e); } }
private const int IDX_FrameLength_Res = 7; // byte 应答包长度 public void Request(ref SensorAcqResult sensorAcq) { try { byte m; if (byte.TryParse(sensorAcq.Sensor.ModuleNo.ToString().Trim(), out m)) { var packet = new byte[8]; packet[IDX_Adrress] = Convert.ToByte(sensorAcq.Sensor.ModuleNo); packet[IDX_CMD] = 0x03; // 采集命令 = 0x03 packet[5] = 0x01; // 目的寄存器长度低8位 ValueHelper.CheckCRC16(packet, 0, 6, out packet[IDX_CRC16_Req + 1], out packet[IDX_CRC16_Req]); //start, end sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = packet; } else { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; } } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
/// <summary> /// 获取要分析的数据 /// </summary> /// <param name="sensorResult">传感器采集结果</param> /// <returns>数据列表</returns> public AnalyzingData GetAnalyzingData(SensorAcqResult sensorResult) { var data2Analyze = new AnalyzingData { SensorId = sensorResult.Sensor.SensorID }; var themeColums = sensorResult.Sensor.TableColums.Split(','); List <double?> data = new List <double?>(themeColums.Length); if (sensorResult.Data.ThemeValues.Count() >= themeColums.Length) { for (int i = 0; i < themeColums.Length; i++) { data.Add(sensorResult.Data.ThemeValues[i]); } } else { for (int i = 0; i < themeColums.Length; i++) { if (i > sensorResult.Data.ThemeValues.Count() - 1) { data.Add(0); } else { data.Add(sensorResult.Data.ThemeValues[i]); } } } data2Analyze.Data = data; return(data2Analyze); }
private const int IDX_CRC16_RESP = 5; // 2 byte 应答包校验 public void Request(ref SensorAcqResult sensorAcq) { try { byte m; if (byte.TryParse(sensorAcq.Sensor.ModuleNo.ToString().Trim(), out m)) { var packet = new byte[8]; packet[IDX_ADDRESS] = Convert.ToByte(sensorAcq.Sensor.ModuleNo); packet[IDX_CMD] = 0x04; //输入寄存器起始地址为 0x0004,寄存器数量为 2 packet[3] = 0x04; // 目的寄存器长度低8位 packet[5] = 0x02; ValueHelper.CheckCRC16(packet, 0, IDX_CRC16_REQ, out packet[IDX_CRC16_REQ + 1], out packet[IDX_CRC16_REQ]); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = packet; } else { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; } } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
/// <summary> /// 激光测拱顶沉降 /// </summary> private SensorAcqResult CalcLaserSettlement() { SensorAcqResult virtualsensor = null; double? calcvalue = null; try { var sensorAcqResult = (SensorAcqResult)this._sensorGroup.Items[0].Paramters["value"]; if (Math.Abs(this._sensorGroup.FormulaParams[0]) > 0.00000001 && sensorAcqResult.Data.ThemeValues[0].HasValue) { calcvalue = (this._sensorGroup.FormulaParams[0] * 1000 - Math.Abs(sensorAcqResult.Data.ThemeValues[0].Value)) * this._sensorGroup.FormulaParams[1] / this._sensorGroup.FormulaParams[0]; } // 构造虚拟传感器数据结果实例 virtualsensor = new SensorAcqResult { ErrorCode = 0, Sensor = this._sensorGroup.VirtualSensor, Data = new VirtualSensor(0, new[] { calcvalue }) //@TODO 0 or 1 { JsonResultData = string.Format("{0}\"sensorId\":{1},\"data\":\"拱顶沉降:{2} mm\"{3}", '{', this._sensorGroup.VirtualSensor.SensorID, calcvalue, '}') } }; } catch (Exception ex) { this._logger.WarnFormat("二次计算- 激光测拱顶沉降- {0}- 计算异常:{1}", this._sensorGroup.VirtualSensor.SensorID, ex.Message); virtualsensor = null; } return(virtualsensor); }
private bool JudgeDataStatusIsOk(SensorAcqResult sensorAcqResult) { if (!(sensorAcqResult.IsOK && sensorAcqResult.Data != null && sensorAcqResult.ErrorCode == 0)) { try { var msgStatus = this.warningHelper.GetSensorMsg(sensorAcqResult); if (msgStatus != null) { this.service.Push(msgStatus.Header.D, msgStatus); } var msgData = this.warningHelper.DataStatusMsg(sensorAcqResult); if (msgData != null) { this.service.Push(msgData.Header.D, msgData); } } catch (Exception ex) { Log.ErrorFormat("传感器采集超时告警推送失败 : {0}", ex.Message); } return(false); } return(true); }
public void AddOrUpdateSensorStatus(SensorAcqResult result) { try { if (!_senststusdic.ContainsKey(result.Sensor.StructId)) { _senststusdic.TryAdd(result.Sensor.StructId, new ConcurrentDictionary <uint, SensorStatus>()); } var senStatus = new SensorStatus { StructureId = result.Sensor.StructId, SensorId = result.Sensor.SensorID, DtuCode = result.Sensor.DtuCode, Location = result.Sensor.Name, DacErrcode = result.ErrorCode, ErrMsg = EnumHelper.GetDescription((Errors)result.ErrorCode), AcqTime = result.ResponseTime }; _senststusdic[senStatus.StructureId].AddOrUpdate(senStatus.SensorId, senStatus, (k, v) => senStatus); } catch (Exception ex) { Log.ErrorFormat("AddOrUpdateSensorStatus error : {0} ", ex.Message); } }
private bool IsModule(SensorAcqResult rawData, out int startIndex) { uint moduleNo; Encoding enc = new ASCIIEncoding(); var recstr = enc.GetString(rawData.Response); if (recstr.IndexOf("U") > 1) { uint.TryParse(recstr.Substring(0, 2), out moduleNo); startIndex = recstr.IndexOf("U") + 1; return(rawData.Sensor.ModuleNo == moduleNo ? true : false); } else { var d = Convert.ToUInt32(rawData.Response[0]); if (d >= 48 && d <= 57) { uint.TryParse(recstr.Substring(0, 1), out moduleNo); startIndex = recstr.IndexOf("U") + 1; return(rawData.Sensor.ModuleNo == moduleNo || (rawData.Sensor.ModuleNo == d?true:false)); } else { startIndex = recstr.IndexOf("U") + 1; return(rawData.Sensor.ModuleNo == d ? true : false); } } }
private const int IDX_YDATA = 11; // Y方向角度 public void Request(ref SensorAcqResult sensorAcq) { try { if (sensorAcq.Sensor.ModuleNo > ushort.MaxValue) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } var package = new byte[17]; package[IDX_FrameH] = 0xfe; package[IDX_FrameH + 1] = 0x43; package[IDX_FrameH + 2] = 0x58; package[IDX_FRAMEL] = 0xef; ValueHelper.WriteUShort_BE(package, IDX_DEST, (ushort)sensorAcq.Sensor.ModuleNo); package[IDX_CHSUM] = ValueHelper.CheckXor(package, 0, IDX_CHSUM); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = package; } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
public void TestParseResponse() { // 25 长度. string str = "fe 46 41 53 17 00 00 1b 76 01 01 0a 07 b4 00 00 00 00 00 00 00 00 19 69 ef"; ISensorAdapter sa = new VoltageSensorAdapter(); byte[] buff = ValueHelper.StrToToHexByte(str); SensorAcqResult r = new SensorAcqResult { Response = buff, Sensor = new Sensor() { ModuleNo = 7030, ChannelNo = 10, ProductCode = "FS-LF10" } }; sa.ParseResult(ref r); var data = r.Data; Assert.IsNotNull(data); Assert.AreEqual("2.41", data.RawValues[1].ToString("f2")); // 24长度 str = "fe 46 41 53 17 00 00 1b 76 01 01 0a 07 b4 00 00 00 00 00 00 00 00 69 ef"; r.Response = ValueHelper.StrToToHexByte(str); sa.ParseResult(ref r); data = r.Data; Assert.IsNotNull(data); Assert.AreEqual("2.41", data.RawValues[1].ToString("f2")); }
public void Request(ref SensorAcqResult sensorAcq) { try { if (sensorAcq.Sensor.ModuleNo > 99) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } var sendstr = new StringBuilder(); sendstr.Append(sensorAcq.Sensor.ModuleNo.ToString("00").Trim()); sendstr.Append("RP"); byte by = 0; var pp = new char[2]; sendstr.Append(sensorAcq.Sensor.ChannelNo.ToString().Trim()); foreach (var c in sendstr.ToString()) { by = (byte)((@by ^ c) & 0x000000ff); } pp[0] = ((@by & 0xf0) >> 4).ToString("X").ElementAt(0); pp[1] = (@by & 0x0f).ToString("X").ElementAt(0); sendstr.Insert(0, "$"); sendstr.Append(pp); sendstr.Append((char)0x0D); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = Encoding.ASCII.GetBytes(sendstr.ToString()); } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
private const int SensorType = 10; //振弦 public void Request(ref SensorAcqResult sensorAcq) { try { if (sensorAcq.Sensor.ModuleNo > ushort.MaxValue) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } var packet = new byte[9]; ValueHelper.WriteShort_BE(packet, IDX_DevType, (short)SensorType); ValueHelper.WriteUShort_BE(packet, IDX_DevId, (ushort)sensorAcq.Sensor.ModuleNo); packet[IDX_CMD] = 0x01; //采集命令 packet[IDX_DataField] = (byte)sensorAcq.Sensor.ChannelNo; packet[IDX_DataField + 1] = 0x67; // 默认采集 频率、温度、幅值 、发送激励信号、检测线状态 返回包长度为22 // 如果采集温度编号 0x6f 返回包长度为26 ValueHelper.CheckCRC16(packet, 0, IDX_DataField + 2, out packet[IDX_DataField + 2], out packet[IDX_DataField + 3]); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = packet; } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
public void TestParseResponse() { // 00 0a 0f a6 81 09 6f 00 44 e5 9d 5d 43 ba 10 47 41 cf 00 00 05 00 00 ec f1 f3 ISensorAdapter sa = new VibratingWireSensorAdapter(); string str = "00 0A 0F A6 81 09 6F 00 44 E5 9D 5D 43 BA 10 47 41 CF 00 00 96 59"; //string str = "00 0a 16 e8 81 01 67 00 44 86 07 ea 45 07 ff 96 41 b0 dc 5d 16 b1"; byte[] buff = ValueHelper.StrToToHexByte(str); SensorAcqResult r = new SensorAcqResult { Response = buff, Sensor = new Sensor() { ModuleNo = 4006,//? ChannelNo = 9, TableColums = "Frequency" } }; sa.ParseResult(ref r); var data = r.Data; Assert.IsNotNull(data); Assert.AreEqual(1836.9176f, data.RawValues[0]); Assert.AreEqual("25.875", data.RawValues[1].ToString()); }
private const int IDX_FRAMEL = 31; // 去:0xCF,回:0xDF /// <summary> /// 编码: PC -> Sensor /// </summary> /// <param name="sensor"></param> /// <returns></returns> public void Request(ref SensorAcqResult sensorAcq) { try { if (sensorAcq.Sensor.ModuleNo > ushort.MaxValue) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } byte[] buff = new byte[32]; buff[IDX_FrameH] = 0xFC; buff[IDX_DevType] = 0x01; ValueHelper.WriteUShort_BE(buff, IDX_DevId, (ushort)sensorAcq.Sensor.ModuleNo); buff[IDX_ORDER] = 0x01; buff[IDX_CRC8] = ValueHelper.CheckCRC8(buff, 1, 29); buff[IDX_FRAMEL] = 0xCF; sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = buff; } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
public bool LogErrorData(SensorAcqResult senacqreslt, string tablename = "") { SensorData data = senacqreslt.Data; var errdata = new StringBuilder(); errdata.AppendFormat("{0},{1}", senacqreslt.Sensor.SensorID, senacqreslt.AcqTime); foreach (var d in data.RawValues) { errdata.AppendFormat(",{0:0.######}", d); } if (!string.IsNullOrEmpty(tablename)) { errdata.AppendFormat(",{0}", tablename); } FileService.Write(_errorPath, errdata.ToString()); errdata.Clear(); errdata.AppendFormat("{0},{1},{2}", senacqreslt.Sensor.SensorID, senacqreslt.AcqTime, senacqreslt.Sensor.FactorType); foreach (var d in data.ThemeValues) { errdata.AppendFormat(",{0:0.######}", d); } if (!string.IsNullOrEmpty(tablename)) { errdata.AppendFormat(",{0}", tablename); } FileService.Write(_errorPath, errdata.ToString()); return(true); }
private const int SensorType = 1; //温度 public void Request(ref SensorAcqResult sensorAcq) { try { if (sensorAcq.Sensor.ModuleNo > ushort.MaxValue) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } var packet = new byte[8]; ValueHelper.WriteShort_BE(packet, IDX_DevType, (short)SensorType); ValueHelper.WriteUShort_BE(packet, IDX_DevId, (ushort)sensorAcq.Sensor.ModuleNo); packet[IDX_CMD] = 0x01; // 采集命令 ValueHelper.CheckCRC16(packet, 0, IDX_DataField + 1, out packet[IDX_DataField + 1], out packet[IDX_DataField + 2]); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = packet; } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
public string GetInsertSql(SensorAcqResult result) { var data = result.Data; var meta = GetMeta(data.GetType()); if (meta == null || data.GetType() != meta.DataType) { return(null); } var s = result.Sensor; StringBuilder columnStr = new StringBuilder(""), valueStr = new StringBuilder(""); double[] rawValues = result.Data.RawValues; if (rawValues.Length < meta.ThemeColums.Length) { Log.ErrorFormat("Data length not match! values[{0}] != columns[{1}]", rawValues.Length, meta.ThemeColums.Length); return(null); } // 写入主题数据. SQLite 都是主题数据(origCount); for (int i = 0; i < meta.ThemeColums.Length; i++) { columnStr.Append(", [").Append(meta.ThemeColums[i]).Append("]"); valueStr.Append(", ").Append(string.Format("{0:0.000000}", rawValues[i + meta.ThemesDataOffset])); } // MSSql [SENSOR_ID],[SAFETY_FACTOR_TYPE_ID // SQLite. string commColumn, commValue; GetCommColumnValue(result, out commColumn, out commValue); string sql = string.Format(@"insert into {0} ({1} {2}) values ({3} {4})", meta.TableName, commColumn, columnStr.ToString(), commValue, valueStr.ToString()); return(sql); }
public void Request(ref SensorAcqResult sensorAcq) { try { byte m; if (byte.TryParse(sensorAcq.Sensor.ModuleNo.ToString().Trim(), out m)) { var package = new byte[8]; package[IDX_ADRESS] = Convert.ToByte(sensorAcq.Sensor.ModuleNo); package[IDX_CMD] = 0x04; package[2] = 0x10; package[3] = 0x04; package[5] = 0x08; ValueHelper.CheckCRC16(package, 0, IDX_CRC16_REQ, out package[IDX_CRC16_REQ + 1], out package[IDX_CRC16_REQ]); sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = package; } else { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; } } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
public override void CalcData(IList <SensorAcqResult> sensordatas) { SensorAcqResult virtualsensor = null; switch (this._sensorGroup.FormulaId) { case 13: // 激光测距 拱顶沉降 virtualsensor = this.CalcLaserSettlement(); break; case 15: // 多个传感器数据作平均 virtualsensor = this.CalcVirtualAverage(); break; case 27: // TODO 公式ID ? 钢支撑轴力 virtualsensor = this.CalcSteelSupports(); break; case 31: // 多个传感器数据取最大值 yfh virtualsensor = CalcVirtualMax(); break; default: break; } if (virtualsensor != null) { sensordatas.Add(virtualsensor); } }
public void ParseResult(ref SensorAcqResult rawData) { rawData.ErrorCode = IsValid(rawData.Response); if ((int)Errors.SUCCESS != rawData.ErrorCode) return; int module = (int) ((rawData.Response[IDX_ADRESS] << 8) | (rawData.Response[1 + IDX_ADRESS])); if (module != rawData.Sensor.ModuleNo) { rawData.ErrorCode = (int)Errors.ERR_INVALID_MODULE; return; } int channel = Convert.ToInt16(rawData.Response[IDX_Req]); if (channel != rawData.Sensor.ChannelNo) { rawData.ErrorCode = (int)Errors.ERR_RECEIVED_CH; return; } try { var capvol = (rawData.Response[IDX_CAPVOL] << 8) | rawData.Response[IDX_CAPVOL + 1]; var voltage = ValueHelper.GetFloat(rawData.Response, IDX_VOLTAGE); var temp = ValueHelper.GetFloat(rawData.Response, IDX_TEMP); double force = 0; if (rawData.Sensor.FormulaID == 4 && rawData.Sensor.Parameters != null && rawData.Sensor.Parameters.Count == 7) { double kt = rawData.Sensor.Parameters[0].Value; double t0 = rawData.Sensor.Parameters[1].Value; double v0 = rawData.Sensor.Parameters[2].Value; double v0B = rawData.Sensor.Parameters[3].Value; double c0 = rawData.Sensor.Parameters[4].Value; double c1 = rawData.Sensor.Parameters[5].Value; double c2 = rawData.Sensor.Parameters[6].Value; double vol = voltage - kt*(temp - t0) - (v0 - v0B); double phy = c2*Math.Pow(vol, 2) + c1*vol + c0; force = phy; } var raws = new double[] { voltage, temp }; var phys = new double[] { force }; rawData.Data = new SensorData(raws, phys, phys) { JsonResultData = string.Format("{0}\"sensorId\":{1},\"data\":\"电压:{2} V, 温度:{3} ℃\"{4}", '{', rawData.Sensor.SensorID, voltage, temp, '}') }; //rawData.Data = new MagneticFluxData(voltage, temp, force) //{ // JsonResultData = // string.Format("{0}\"sensorId\":{1},\"data\":\"电压:{2} V, 温度:{3} ℃\"{4}", '{', // rawData.Sensor.SensorID, voltage, temp, '}') //}; } catch (Exception ex) { rawData.ErrorCode = (int)Errors.ERR_DATA_PARSEFAILED; _logger.ErrorFormat("ctl sensor [Id:{0} m: {1} ch:{2}] parsedfailed,received bytes{3}, ERROR: {4}", rawData.Sensor.SensorID, rawData.Sensor.ModuleNo, rawData.Sensor.ChannelNo, ValueHelper.BytesToHexStr(rawData.Response), ex.Message); } }
private const int IDX_FRAMETAIL_RESP = 27; // 帧尾=0xef #region Implementation of ISensorAdapter public void Request(ref SensorAcqResult sensorAcq) { try { if (sensorAcq.Sensor.ModuleNo > ushort.MaxValue) { sensorAcq.ErrorCode = (int)Errors.ERR_INVALID_MODULE; sensorAcq.Request = null; return; } byte[] package = new byte[19]; package[IDX_FrameH] = 0xfe; package[IDX_FrameH + 1] = 0x54; package[IDX_FrameH + 2] = 0x46; package[IDX_FrameH + 3] = 0x4c; package[IDX_FRAME_LEN] = 19; ValueHelper.WriteUShort_BE(package, IDX_DEST, (ushort)sensorAcq.Sensor.ModuleNo); package[IDX_CMD] = 0x03; package[IDX_CONTENT] = Convert.ToByte(sensorAcq.Sensor.ChannelNo); package[IDX_CHSUM_Req] = ValueHelper.CheckXor(package, 0, IDX_CHSUM_Req); package[IDX_FRAMETAIL_REQ] = 0xef; sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = package; } catch { sensorAcq.Request = null; sensorAcq.ErrorCode = (int)Errors.ERR_UNKNOW; } }
private void SendSensorCollectMsg(CollectState state, SensorAcqResult acqResult) { if (this._sensorCollectMsgHandler != null) { this._sensorCollectMsgHandler.Invoke(state, acqResult); } }
private void JudgeDataOverRange(SensorAcqResult sensorResult, IList <RationalRange> ranges) { if (ranges == null) { return; } try { var themeValues = sensorResult.Data.ThemeValues; for (int i = 0; i < sensorResult.Data.ThemeValues.Count; i++) { var range = ranges.FirstOrDefault(r => r.ItemId == i + 1); if (range != null && range.Enabled && themeValues[i] != null) { if (themeValues[i].Value <range.Lower || themeValues[i].Value> range.Upper) { Log.InfoFormat( "sensor:{0}-item:{3} over RATIONAL VALUE range[{1},{2}]", sensorResult.Sensor.SensorID, range.Lower, range.Upper, range.ItemId); sensorResult.Data.ThemeValues[i] = null; } } } } catch (Exception e) { Log.Error("judge over rational range error", e); } }
public void Request(ref SensorAcqResult sensorAcq) { if (sensorAcq != null) { sensorAcq.ErrorCode = (int)Errors.SUCCESS; sensorAcq.Request = null; } }
public void ParseResult(ref SensorAcqResult rawData) { rawData.ErrorCode = IsValid(rawData.Response); if (rawData.ErrorCode != (int)Errors.SUCCESS) { return; } short mno = ValueHelper.GetShort_BE(rawData.Response, 2); if (mno != rawData.Sensor.ModuleNo) { rawData.ErrorCode = (int)Errors.ERR_INVALID_MODULE; return; } switch (rawData.Response[IDX_CMD]) { case 0x81: // 采集命令回复 try { var surveyXAng = ValueHelper.GetInt_BE(rawData.Response, 13) / 1000000f; var surveyYAng = ValueHelper.GetInt_BE(rawData.Response, 17) / 1000000f; double changeX = 0; double changeY = 0; if (rawData.Sensor.Parameters != null && rawData.Sensor.Parameters.Count == 3) { double xinit = rawData.Sensor.Parameters[0].Value; double yinit = rawData.Sensor.Parameters[1].Value; double len = rawData.Sensor.Parameters[2].Value; var xvalue = (len * Math.Sin(surveyXAng * Math.PI / 180)) - (len * Math.Sin(xinit * Math.PI / 180)); var yvalue = (len * Math.Sin(surveyYAng * Math.PI / 180)) - (len * Math.Sin(yinit * Math.PI / 180)); changeX = xvalue; changeY = yvalue; } var raws = new double[] { surveyXAng, surveyYAng }; var phys = new double[] { changeX, changeY }; rawData.Data = new SensorData(raws, phys, raws) { JsonResultData = string.Format("{0}\"sensorId\":{1},\"data\":\"X方向角度:{2} °,Y方向角度:{3} °\"{4}", '{', rawData.Sensor.SensorID, surveyXAng, surveyYAng, '}') }; } catch (Exception ex) { rawData.ErrorCode = (int)Errors.ERR_DATA_PARSEFAILED; _logger.ErrorFormat( "rod Inclination sensor [Id:{0} m: {1}] parsedfailed,received bytes{2}, ERROR: {3}", rawData.Sensor.SensorID, rawData.Sensor.ModuleNo, ValueHelper.BytesToHexStr(rawData.Response), ex.Message); } break; case 0xC0: // 回复错误码 rawData.ErrorCode = ModbusErrorCode.GetErrorCode(rawData.Response[IDX_CMD + 1]); break; } }
private DACTaskResult ExcuteGprsDacTask(DACTask task, DacTaskContext context) { DtuNode dtu = context.Node; var r = new DACTaskResult { Task = task }; r.Task.Status = DACTaskStatus.RUNNING; r.ErrorMsg = "OK"; r.DtuCode = dtu.DtuCode; // 循环发送数据 long totalElapsed = 0; context.DtuConnection.Connect(); // Connect to Resource. r.Started = DateTime.Now; foreach (Sensor si in dtu.Sensors) { SensorAcqResult resp = null; if (!this.IsSensorRequired(context, task.Sensors, si)) { continue; } try { resp = this.RequestGprsSensor(si, context.DtuConnection, (int)dtu.DacTimeout); } catch (Exception ex) { log.ErrorFormat("[DACTaskExecutor] : unknown exceptions {0}", ex.Message); if (resp == null) { resp = this.CreateAcqResult(context.DtuConnection.DtuID, si, (int)Errors.ERR_UNKNOW, "unknown exceptions"); } } if (resp.Data == null) { resp.Data = new SensorErrorData(si.SensorID, resp.ErrorCode); } r.AddSensorResult(resp); totalElapsed += resp.Elapsed; if (!r.IsOK) { r.ErrorCode = resp.ErrorCode; r.ErrorMsg = resp.ErrorMsg; break; // ERROR. } Thread.Sleep(DELAY_BEFORE_NEW_COMMAND); //延迟. } r.Finished = DateTime.Now; r.Elapsed = totalElapsed; r.Task.Status = DACTaskStatus.DONE; context.DtuConnection.Disconnect(); return(r); }