Ejemplo n.º 1
0
        /// <summary>
        /// 解码: Sensor -> PC
        /// </summary>
        /// <param name="rawData"></param>
        /// <returns></returns>
        public void ParseResult(ref SensorAcqResult rawData)
        {
            byte[] data = rawData.Response;
            rawData.ErrorCode = IsValid(data);
            if ((int)Errors.SUCCESS != rawData.ErrorCode)
            {
                return;
            }
            var module = ValueHelper.GetShort_BE(data, IDX_DevId);

            if (module != rawData.Sensor.ModuleNo)
            {
                rawData.ErrorCode = (int)Errors.ERR_INVALID_MODULE;
                return;
            }
            try
            {
                var hum  = (data[IDX_Humidity] << 8 | data[IDX_Humidity + 1]) / 100.0;
                var temp = ValueHelper.GetFloat_BE(data, IDX_Temp);
                var raws = new double[] { temp, hum };
                rawData.Data = new SensorData(raws, raws, raws)
                {
                    JsonResultData =
                        string.Format(
                            "{0}\"sensorId\":{1},\"data\":\"温度:{2} ℃,湿度:{3} %\"{4}",
                            '{',
                            rawData.Sensor.SensorID,
                            temp,
                            hum,
                            '}')
                };

                //rawData.Data = new TempHumidityData(temp, hum)
                //{
                //    JsonResultData =
                //        string.Format(
                //            "{0}\"sensorId\":{1},\"data\":\"温度:{2} ℃,湿度:{3} %\"{4}",
                //            '{',
                //            rawData.Sensor.SensorID,
                //            temp,
                //            hum,
                //            '}')
                //};
            }
            catch (Exception ex)
            {
                rawData.ErrorCode = (int)Errors.ERR_DATA_PARSEFAILED;
                _logger.ErrorFormat(
                    "temphumi sensor [id:{0},m:{1}] parsedfailed ,received bytes{3},ERROR : {2}",
                    rawData.Sensor.SensorID, rawData.Sensor.ModuleNo, ex.Message,
                    ValueHelper.BytesToHexStr(rawData.Response));
            }
        }
Ejemplo n.º 2
0
        public void ParseResult(ref SensorAcqResult rawData)
        {
            byte[] data = rawData.Response;
            rawData.ErrorCode = IsValid(data);
            if ((int)Errors.SUCCESS != rawData.ErrorCode)
            {
                return;
            }
            var module = ValueHelper.GetShort_BE(data, IDX_DevId);

            if (module != rawData.Sensor.ModuleNo)
            {
                rawData.ErrorCode = (int)Errors.ERR_INVALID_MODULE;
                return;
            }
            try
            {
                switch (data[IDX_CMD])
                {
                case 0x81:
                    var temp     = ValueHelper.GetFloat_BE(data, IDX_DataField);
                    var humidity = ValueHelper.GetFloat_BE(data, IDX_DataField + 4);

                    var raws = new double[] { temp, humidity };
                    rawData.Data = new SensorData(raws, raws, raws)
                    {
                        JsonResultData =
                            string.Format(
                                "{0}\"sensorId\":{1},\"data\":\"温度:{2} ℃,湿度:{3} %\"{4}",
                                '{',
                                rawData.Sensor.SensorID,
                                temp,
                                humidity,
                                '}')
                    };
                    return;

                case 0xc0:
                    rawData.ErrorCode = ModbusErrorCode.GetErrorCode(rawData.Response[IDX_CMD + 1]);
                    return;
                }
            }
            catch (Exception ex)
            {
                rawData.ErrorCode = (int)Errors.ERR_DATA_PARSEFAILED;
                _logger.ErrorFormat(
                    "ModBus temphumi sensor [id:{0},m:{1}] parsedfailed ,received bytes{3},ERROR : {2}",
                    rawData.Sensor.SensorID, rawData.Sensor.ModuleNo, ex.Message,
                    ValueHelper.BytesToHexStr(rawData.Response));
            }
        }
        public void ParseResult(ref SensorAcqResult rawData)
        {
            byte[] data = rawData.Response;
            rawData.ErrorCode = IsValid(data);
            if ((int)Errors.SUCCESS != rawData.ErrorCode)
            {
                return;
            }
            var module = ValueHelper.GetShort_BE(data, IDX_DevId);

            if (module != rawData.Sensor.ModuleNo)
            {
                rawData.ErrorCode = (int)Errors.ERR_INVALID_MODULE;
                return;
            }

            if (data[IDX_CMD] == 0xC0)
            {
                rawData.ErrorCode = ModbusErrorCode.GetErrorCode(data[IDX_CMD + 1]);
                return;
            }

            var channel = data[IDX_CMD + 1];

            if (channel == 0)
            {
                channel = 1;
            }
            if (channel != rawData.Sensor.ChannelNo)
            {
                rawData.ErrorCode = (int)Errors.ERR_RECEIVED_CH;
                return;
            }
            var freState  = data[IDX_DataField + 2] & 0x000f;
            var tempState = data[IDX_DataField + 2] & 0xfff0;

            if (freState != 0 || tempState != 0)
            {
                if (freState != 0 && tempState != 0)
                {
                    rawData.ErrorCode = (int)Errors.ERR_VIBRW_FREWIRE_TEMPWIRE;
                    return;
                }
                if (freState != 0)
                {
                    rawData.ErrorCode = (int)Errors.ERR_VIBRW_FREWIRE;
                    return;
                }
                rawData.ErrorCode = (int)Errors.ERR_VIBRW_TEMPWIRE;
                return;
            }
            try
            {
                // TODO 大字序 FLOAT
                var    frequency        = ValueHelper.GetFloat_BE(data, IDX_DataField + 3);
                var    am               = ValueHelper.GetFloat_BE(data, IDX_DataField + 7);
                var    temperature      = ValueHelper.GetFloat_BE(data, IDX_DataField + 11);
                double physicalQuantity = 0;
                double colphy           = 0;
                double k  = 0;
                double f0 = 0;
                double kt = 0;
                double t0 = 0;
                if (rawData.Sensor.Parameters.Count >= 4)
                {
                    k  = rawData.Sensor.Parameters[0].Value;
                    f0 = rawData.Sensor.Parameters[1].Value;
                    kt = rawData.Sensor.Parameters[2].Value;
                    t0 = rawData.Sensor.Parameters[3].Value;
                }
                switch (rawData.Sensor.FormulaID)
                {
                case 1:
                    colphy = physicalQuantity = (k * (Math.Pow(frequency, 2) - Math.Pow(f0, 2)) + kt * (temperature - t0));
                    break;

                case 7:
                    double H = rawData.Sensor.Parameters[4].Value;
                    colphy = (k * (Math.Pow(f0, 2) - Math.Pow(frequency, 2)) + kt * (temperature - t0));
                    var h = colphy * 1000 / 9.8f;
                    physicalQuantity = (H + h);
                    break;

                case 17:
                    physicalQuantity = (k * (Math.Pow(f0, 2) - Math.Pow(frequency, 2)) + kt * (temperature - t0));
                    colphy           = physicalQuantity;
                    break;

                default:
                    physicalQuantity = (k * (Math.Pow(frequency, 2) - Math.Pow(f0, 2)) + kt * (temperature - t0));
                    colphy           = physicalQuantity;
                    break;
                }

                var raws    = new double[] { frequency, temperature, am };
                var phys    = new double[] { physicalQuantity };
                var colphys = new double[] { colphy };
                rawData.Data = new SensorData(raws, phys, colphys)
                {
                    JsonResultData =
                        string.Format("{0}\"sensorId\":{1},\"data\":\"频率:{2} Hz,温度:{3} ℃\"{4}", '{', rawData.Sensor.SensorID,
                                      frequency, temperature, '}')
                };
            }
            catch (Exception ex)
            {
                rawData.ErrorCode = (int)Errors.ERR_DATA_PARSEFAILED;
                _logger.ErrorFormat("ModBus VibratingWire sensor [id:{0},m:{1},ch:{4}] parsedfailed ,received bytes{3},ERROR : {2}", rawData.Sensor.SensorID, rawData.Sensor.ModuleNo, ex.Message, ValueHelper.BytesToHexStr(rawData.Response), rawData.Sensor.ChannelNo);
            }
        }