コード例 #1
0
 /// <summary>
 /// Returns the basic Meta data to the parameter.
 /// </summary>
 /// <param name="address">Device Address. Use null to use the DefaultDeviceAddress defined on MeComQuerySet.</param>
 /// <param name="parameterId">Device Parameter ID.</param>
 /// <param name="instance">Parameter Instance. (usually 1)</param>
 /// <param name="min">Minimal value. Is always a double value.</param>
 /// <param name="max">Maximal value. Is always a double value.</param>
 /// <exception cref="ComCommandException">when the command fails. Check the inner exception for details.</exception>
 public void GetLimits(byte?address, ushort parameterId, byte instance, out double min, out double max)
 {
     try
     {
         MeComPacket txFrame = new MeComPacket('#', address);
         MeComVarConvert.AddString(txFrame.Payload, "?VL");
         MeComVarConvert.AddUint16(txFrame.Payload, parameterId);
         MeComVarConvert.AddUint8(txFrame.Payload, instance);
         MeComPacket rxFrame = meQuerySet.Query(txFrame);
         if (MeComVarConvert.ReadUint8(rxFrame.Payload) == 0)
         {
             //This is a float Value
             min = MeComVarConvert.ReadFloat32(rxFrame.Payload);
             max = MeComVarConvert.ReadFloat32(rxFrame.Payload);
         }
         else
         {
             //This is a INT32 Value
             min = MeComVarConvert.ReadInt32(rxFrame.Payload);
             max = MeComVarConvert.ReadInt32(rxFrame.Payload);
         }
     }
     catch (Exception Ex)
     {
         throw new ComCommandException(String.Format("Get Limit Values failed: Address: {0}; ID: {1}; Inst: {2}; Detail: {3}", address, parameterId, instance, Ex.Message), Ex);
     }
 }
コード例 #2
0
ファイル: MeComG2Cmd.cs プロジェクト: intvenlab/AutoDefrost
        /// <summary>
        /// Returns Meta data of the parameter.
        /// </summary>
        /// <param name="address">Device Address. Use null to use the DefaultDeviceAddress defined on MeComQuerySet.</param>
        /// <param name="parameterId">Device Parameter ID.</param>
        /// <param name="instance">Parameter Instance. (usually 1)</param>
        /// <returns>Returned meta data object.</returns>
        /// <exception cref="ComCommandException">when the command fails. Check the inner exception for details.</exception>
        public ParMetaData GetMetaData(byte?address, UInt16 parameterId, byte instance)
        {
            ParMetaData parMetaData = new ParMetaData();

            try
            {
                MeComPacket txFrame = new MeComPacket('#', address);
                MeComVarConvert.AddString(txFrame.Payload, "?VM");
                MeComVarConvert.AddUint16(txFrame.Payload, parameterId);
                MeComVarConvert.AddUint8(txFrame.Payload, instance);
                MeComPacket rxFrame = meQuerySet.Query(txFrame);

                parMetaData.Type            = (MeParType)MeComVarConvert.ReadUint8(rxFrame.Payload);
                parMetaData.Flags           = (MeParFlags)MeComVarConvert.ReadUint8(rxFrame.Payload);
                parMetaData.NrOfInst        = MeComVarConvert.ReadUint8(rxFrame.Payload);
                parMetaData.MaxNrOfElements = MeComVarConvert.ReadUint32(rxFrame.Payload);

                switch (parMetaData.Type)
                {
                case MeParType.FLOAT32:
                    parMetaData.Min   = MeComVarConvert.ReadFloat32(rxFrame.Payload);
                    parMetaData.Max   = MeComVarConvert.ReadFloat32(rxFrame.Payload);
                    parMetaData.Value = MeComVarConvert.ReadFloat32(rxFrame.Payload);
                    break;

                case MeParType.INT32:
                    parMetaData.Min   = MeComVarConvert.ReadInt32(rxFrame.Payload);
                    parMetaData.Max   = MeComVarConvert.ReadInt32(rxFrame.Payload);
                    parMetaData.Value = MeComVarConvert.ReadInt32(rxFrame.Payload);
                    break;

                case MeParType.DOUBLE64:
                    parMetaData.Min   = MeComVarConvert.ReadDouble64(rxFrame.Payload);
                    parMetaData.Max   = MeComVarConvert.ReadDouble64(rxFrame.Payload);
                    parMetaData.Value = MeComVarConvert.ReadDouble64(rxFrame.Payload);
                    break;

                case MeParType.LATIN1:
                case MeParType.BYTE:
                    parMetaData.Min   = MeComVarConvert.ReadUint8(rxFrame.Payload);
                    parMetaData.Max   = MeComVarConvert.ReadUint8(rxFrame.Payload);
                    parMetaData.Value = null;
                    break;

                default:
                    throw new ArgumentOutOfRangeException("Unknown Type received. Received value: " + parMetaData.Type);
                }
                return(parMetaData);
            }
            catch (Exception Ex)
            {
                throw new ComCommandException(String.Format("Get Meta Data failed: Address: {0}; ID: {1}; Inst: {2}; Detail: {3}", address, parameterId, instance, Ex.Message), Ex);
            }
        }
コード例 #3
0
        MeComPacket LocalSet(MeComPacket txFrame)
        {
            if (txFrame.Address == null)
            {
                txFrame.Address = DefaultDeviceAddress;
            }

            sequenceNr++;
            int         trialsLeft = 3;
            MeComPacket rxFrame    = new MeComPacket();

            while (trialsLeft > 0)
            {
                trialsLeft--;
                txFrame.SeqNr = sequenceNr;

                try
                {
                    meFrame.SendFrame(txFrame);
                    if (txFrame.Address == 255)
                    {
                        return(rxFrame);                        //On the address 255, no answer is expected
                    }
                    rxFrame = meFrame.ReceiveFrameOrTimeout();

                    if (rxFrame.SeqNr == sequenceNr && rxFrame.Address == txFrame.Address)
                    {
                        //Corresponding Frame received
                        if (rxFrame.RcvType == ERcvType.Data)
                        {
                            //Data Frame received --> Check for error code
                            if (rxFrame.Payload.ReadByte() == '+')
                            {
                                SetServerErrorException(MeComVarConvert.ReadUint8(rxFrame.Payload));
                            }
                            else
                            {
                                rxFrame.Payload.Position = 0; //Set stream position to 0 for the user
                                return(rxFrame);
                            }
                        }
                        else if (rxFrame.RcvType == ERcvType.ACK)
                        {
                            return(rxFrame);
                        }
                    }
                }
                catch (MeComPhyTimeoutException Ex)
                {
                    //Ignore Timeout on this level if some trials are left
                    if (trialsLeft == 0)
                    {
                        throw new GeneralException("Set failed: Timeout!", Ex);
                    }
                    TraceLog.Info("Thread '{0}': Package re-send. NrOfTrails {1}", Thread.CurrentThread.Name, trialsLeft);
                }
                catch (ServerException)
                {
                    throw;
                }
                catch (Exception Ex)
                {
                    throw new GeneralException("Set failed: " + Ex.Message, Ex);
                }
            }

            //Communication failed, check last error
            if (rxFrame.SeqNr != sequenceNr)
            {
                throw new GeneralException("Set failed: Wrong Sequence Number received. Received " + rxFrame.SeqNr + "; Expected " + sequenceNr);
            }
            if (rxFrame.Address != txFrame.Address)
            {
                throw new GeneralException("Set failed: Wrong Address received. Received " + rxFrame.Address + "; Expected " + txFrame.Address);
            }

            throw new GeneralException("Set failed: Unknown error");
        }
コード例 #4
0
ファイル: MeComG2Cmd.cs プロジェクト: intvenlab/AutoDefrost
        /// <summary>
        /// Reads an array of FLOAT32, INT32, DOUBLE64 or ASCII (char) values form the device.
        /// The data length is given by the device.
        /// This method does only return when the device tells the host, that all data is read.
        /// The data is read in an loop with several sub queries.
        /// During this command is working, it is possible to use other commands with an different thread.
        /// </summary>
        /// <param name="address">Device Address. Use null to use the DefaultDeviceAddress defined on MeComQuerySet.</param>
        /// <param name="parameterId">Device Parameter ID.</param>
        /// <param name="instance">Parameter Instance. (usually 1)</param>
        /// <param name="type">Specifies the type of the value to be read.</param>
        /// <param name="callback">Is called every time when the progress has changed.</param>
        /// <param name="expectedNrOfElements">Defines the expected number of elements to calculate the progress for the callback function.</param>
        /// <returns>Returned value.</returns>
        /// <exception cref="ComCommandException">when the command fails. Check the inner exception for details.</exception>
        public dynamic GetBigData(byte?address, UInt16 parameterId, byte instance, MeParType type, ProgressUpdateCallback callback = null, int expectedNrOfElements = 0)
        {
            dynamic value;

            try
            {
                ushort       rcvElements;
                bool         hasMoreData;
                uint         totalReadElements = 0;
                MemoryStream totalStream       = new MemoryStream();

                do
                {
                    MeComPacket txFrame = new MeComPacket('#', address);
                    MeComVarConvert.AddString(txFrame.Payload, "?VB");
                    MeComVarConvert.AddUint16(txFrame.Payload, parameterId);
                    MeComVarConvert.AddUint8(txFrame.Payload, instance);
                    MeComVarConvert.AddUint32(txFrame.Payload, totalReadElements); //Read start position
                    MeComVarConvert.AddUint16(txFrame.Payload, UInt16.MaxValue);   //Maximum Elements to read per call.

                    MeComPacket rxFrame = meQuerySet.Query(txFrame);
                    rcvElements        = MeComVarConvert.ReadUint16(rxFrame.Payload);
                    hasMoreData        = MeComVarConvert.ReadUint8(rxFrame.Payload) == 1;
                    totalReadElements += rcvElements;
                    if (rcvElements > 0)
                    {
                        rxFrame.Payload.CopyTo(totalStream);
                    }

                    callback?.Invoke(100.0 / expectedNrOfElements * totalReadElements);
                } while (hasMoreData);

                totalStream.Position = 0;

                callback?.Invoke(100);

                switch (type)
                {
                case MeParType.FLOAT32:
                    value = new float[totalReadElements];
                    break;

                case MeParType.INT32:
                    value = new int[totalReadElements];
                    break;

                case MeParType.DOUBLE64:
                    value = new double[totalReadElements];
                    break;

                case MeParType.LATIN1:
                    value = "";
                    break;

                case MeParType.BYTE:
                    value = new byte[totalReadElements];
                    break;

                default:
                    throw new ArgumentOutOfRangeException("Unknown EParType: " + type);
                }

                for (int i = 0; i < totalReadElements; i++)
                {
                    switch (type)
                    {
                    case MeParType.FLOAT32:
                        value[i] = MeComVarConvert.ReadFloat32(totalStream);
                        break;

                    case MeParType.INT32:
                        value[i] = MeComVarConvert.ReadInt32(totalStream);
                        break;

                    case MeParType.DOUBLE64:
                        value[i] = MeComVarConvert.ReadDouble64(totalStream);
                        break;

                    case MeParType.LATIN1:
                        value = MeComVarConvert.ReadEncodedString(totalStream, (int)totalReadElements);
                        return(value);

                    case MeParType.BYTE:
                        value[i] = MeComVarConvert.ReadUint8(totalStream);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException("Unknown EParType: " + type);
                    }
                }
                return(value);
            }
            catch (Exception Ex)
            {
                throw new ComCommandException(String.Format("Get Value failed: Address: {0}; ID: {1}; Inst: {2}; Detail: {3}", address, parameterId, instance, Ex.Message), Ex);
            }
        }
コード例 #5
0
ファイル: MeComFrame.cs プロジェクト: JulienKluge/pyMeComTEC
        private void DecodeFrame(ref MeComPacket RxFrame, byte c, ref MemoryStream LocalRxBuf)
        {
            try
            {
                if (c == Convert.ToByte('!'))
                {
                    //Start indicator
                    LocalRxBuf = new MemoryStream();
                    LocalRxBuf.WriteByte(c);
                }
                else
                {
                    if (c == 0x0D && (LocalRxBuf?.Length >= 11))
                    {
                        //End of Frame received
                        if (LocalRxBuf.Length == 11)
                        {
                            //ACK Received
                            LocalRxBuf.Position = 7;
                            ushort rcvCRC = MeComVarConvert.ReadUint16(LocalRxBuf);
                            if (rcvCRC == LastCRC)
                            {
                                //Valid Ack received --> Extract Data
                                LocalRxBuf.Position = 1;
                                RxFrame.Address     = MeComVarConvert.ReadUint8(LocalRxBuf);
                                RxFrame.SeqNr       = MeComVarConvert.ReadUint16(LocalRxBuf);
                                RxFrame.RcvType     = ERcvType.ACK;
                                statistics.IncRxFrames();
                            }
                        }
                        else
                        {
                            //Data Frame received
                            LocalRxBuf.Position = LocalRxBuf.Length - 4;
                            ushort rcvCRC = MeComVarConvert.ReadUint16(LocalRxBuf);

                            //Cut received CRC form stream and recalc CRC
                            LocalRxBuf.SetLength(LocalRxBuf.Length - 4);
                            ushort calcCRC = CalcCRC_CITT(LocalRxBuf);

                            if (calcCRC == rcvCRC)
                            {
                                LocalRxBuf.Position = 1;
                                RxFrame.Address     = MeComVarConvert.ReadUint8(LocalRxBuf);
                                RxFrame.SeqNr       = MeComVarConvert.ReadUint16(LocalRxBuf);
                                RxFrame.Payload     = new MemoryStream();
                                LocalRxBuf.CopyTo(RxFrame.Payload);
                                RxFrame.Payload.Position = 0; //Reset position for the user
                                RxFrame.RcvType          = ERcvType.Data;
                                statistics.IncRxFrames();
                            }
                            else
                            {
                                statistics.IncCrcErrors();
                            }
                        }
                    }
                    else
                    {
                        LocalRxBuf?.WriteByte(c);
                    }
                }
            }
            catch (ArgumentOutOfRangeException)
            {
                //Just ignore. They are thrown from MeComVarConvert
            }
        }