// 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;
     }
 }
Exemple #5
0
 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;
            }
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
 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);
                }
            }
        }
Exemple #13
0
        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;
            }
        }
Exemple #14
0
        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());
        }
Exemple #18
0
        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;
            }
        }
Exemple #19
0
        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);
        }
Exemple #20
0
        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;
            }
        }
Exemple #21
0
        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);
            }
        }
Exemple #24
0
         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);
             }
         }
Exemple #25
0
        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);
            }
        }
Exemple #28
0
 public void Request(ref SensorAcqResult sensorAcq)
 {
     if (sensorAcq != null)
     {
         sensorAcq.ErrorCode = (int)Errors.SUCCESS;
         sensorAcq.Request   = null;
     }
 }
Exemple #29
0
        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);
        }