Пример #1
0
        /// <summary>
        /// Adds an information object to the ASDU.
        /// </summary>
        /// This function add an information object (InformationObject) to the ASDU. NOTE: that all information objects
        /// have to be of the same type. Otherwise an ArgumentException will be thrown.
        /// The function returns true when the information object has been added to the ASDU. The function returns false if
        /// there is no space left in the ASDU to add the information object, or when object cannot be added to a sequence
        /// because the IOA does not match.
        /// <returns><c>true</c>, if information object was added, <c>false</c> otherwise.</returns>
        /// <param name="io">The information object to add</param>
        public bool AddInformationObject(InformationObject io)
        {
            if (informationObjects == null)
            {
                informationObjects = new List <InformationObject> ();
            }

            if (hasTypeId)
            {
                if (io.Type != typeId)
                {
                    throw new ArgumentException("Invalid information object type: expected " + typeId.ToString() + " was " + io.Type.ToString());
                }
            }
            else
            {
                typeId    = io.Type;
                hasTypeId = true;
            }

            if (informationObjects.Count >= 0x7f)
            {
                return(false);
            }

            int objectSize = io.GetEncodedSize();

            if (IsSequence == false)
            {
                objectSize += parameters.SizeOfIOA;
            }
            else
            {
                if (informationObjects.Count == 0)                 // is first object?
                {
                    objectSize += parameters.SizeOfIOA;
                }
                else
                {
                    if (io.ObjectAddress != (informationObjects[0].ObjectAddress + informationObjects.Count))
                    {
                        return(false);
                    }
                }
            }

            if (objectSize <= spaceLeft)
            {
                spaceLeft -= objectSize;
                informationObjects.Add(io);

                vsq = (byte)((vsq & 0x80) | informationObjects.Count);

                return(true);
            }
            else
            {
                return(false);
            }
        }
Пример #2
0
        /// <summary>
        /// 添加一个信息体
        /// </summary>
        /// <param name="io">信息体对象</param>
        public void AddInformationObject(InformationObject io)
        {
            if (informationObjects == null)
            {
                informationObjects = new List <InformationObject>();
            }

            if (hasTypeId)
            {
                //类型标识不同的,直接异常,不予以添加
                if (io.Type != typeId)
                {
                    throw new ArgumentException("Invalid information object type: expected " + typeId.ToString() + " was " + io.Type.ToString());
                }
            }
            else
            {
                //初始化的时候没有设置类型标识,则在赋值的时候确认类型标识
                typeId    = io.Type;
                hasTypeId = true;
            }

            //增加对象
            informationObjects.Add(io);

            //修改数量
            vsq = (byte)((vsq & 0x80) | informationObjects.Count);
        }
Пример #3
0
        /// <summary>
        /// Sends the control command.
        /// </summary>
        ///
        /// The type ID has to match the type of the InformationObject!
        ///
        /// C_SC_NA_1 -> SingleCommand
        /// C_DC_NA_1 -> DoubleCommand
        /// C_RC_NA_1 -> StepCommand
        /// C_SC_TA_1 -> SingleCommandWithCP56Time2a
        /// C_SE_NA_1 -> SetpointCommandNormalized
        /// C_SE_NB_1 -> SetpointCommandScaled
        /// C_SE_NC_1 -> SetpointCommandShort
        /// C_BO_NA_1 -> Bitstring32Command
        ///
        /// <param name="cot">Cause of transmission (use ACTIVATION to start a control sequence)</param>
        /// <param name="ca">Common address</param>
        /// <param name="sc">Information object of the command</param>
        /// <exception cref="ConnectionException">description</exception>
        public void SendControlCommand(CauseOfTransmission cot, int ca, InformationObject sc)
        {
            ASDU controlCommand = new ASDU(parameters, cot, false, false, (byte)parameters.OriginatorAddress, ca, false);

            controlCommand.AddInformationObject(sc);

            SendASDUInternal(controlCommand);
        }
Пример #4
0
        public InformationObject GetElement(int index)
        {
            InformationObject retVal = null;

            int elementSize;

            switch (typeId)
            {
            case TypeID.M_SP_NA_1:             /* 1 */

                elementSize = 1;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new SinglePointInformation(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new SinglePointInformation(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_SP_TA_1:             /* 2 */

                elementSize = 4;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new SinglePointWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new SinglePointWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_DP_NA_1:             /* 3 */

                elementSize = 1;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new DoublePointInformation(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new DoublePointInformation(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_DP_TA_1:             /* 4 */

                elementSize = 4;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new DoublePointWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new DoublePointWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ST_NA_1:             /* 5 */

                elementSize = 2;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new StepPositionInformation(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new StepPositionInformation(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ST_TA_1:             /* 6 */

                elementSize = 5;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new StepPositionWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new StepPositionWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_BO_NA_1:             /* 7 */

                elementSize = 5;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new Bitstring32(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new Bitstring32(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_BO_TA_1:             /* 8 */

                elementSize = 8;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new Bitstring32WithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new Bitstring32WithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_NA_1:             /* 9 */

                elementSize = 3;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueNormalized(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueNormalized(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_TA_1:             /* 10 */

                elementSize = 6;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueNormalizedWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueNormalizedWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_NB_1:             /* 11 */

                elementSize = 3;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueScaled(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueScaled(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_TB_1:             /* 12 */

                elementSize = 6;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueScaledWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueScaledWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;


            case TypeID.M_ME_NC_1:             /* 13 */

                elementSize = 5;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueShort(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueShort(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_TC_1:             /* 14 */

                elementSize = 8;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueShortWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueShortWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_IT_NA_1:             /* 15 */

                elementSize = 5;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new IntegratedTotals(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new IntegratedTotals(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_IT_TA_1:             /* 16 */

                elementSize = 8;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new IntegratedTotalsWithCP24Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new IntegratedTotalsWithCP24Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_EP_TA_1:             /* 17 */

                elementSize = 3;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new EventOfProtectionEquipment(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new EventOfProtectionEquipment(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_EP_TB_1:             /* 18 */

                elementSize = 7;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new PackedStartEventsOfProtectionEquipment(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new PackedStartEventsOfProtectionEquipment(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_EP_TC_1:             /* 19 */

                elementSize = 7;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new PackedOutputCircuitInfo(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new PackedOutputCircuitInfo(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_PS_NA_1:             /* 20 */

                elementSize = 5;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new PackedSinglePointWithSCD(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new PackedSinglePointWithSCD(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }


                break;

            case TypeID.M_ME_ND_1:             /* 21 */

                elementSize = 2;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueNormalizedWithoutQuality(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueNormalizedWithoutQuality(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            /* 22 - 29 reserved */

            case TypeID.M_SP_TB_1:             /* 30 */

                elementSize = 8;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new SinglePointWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new SinglePointWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_DP_TB_1:             /* 31 */

                elementSize = 8;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new DoublePointWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new DoublePointWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ST_TB_1:             /* 32 */

                elementSize = 9;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new StepPositionWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new StepPositionWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_BO_TB_1:             /* 33 */

                elementSize = 12;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new Bitstring32WithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new Bitstring32WithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_TD_1:             /* 34 */

                elementSize = 10;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueNormalizedWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueNormalizedWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_TE_1:             /* 35 */

                elementSize = 10;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueScaledWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueScaledWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_ME_TF_1:             /* 36 */

                elementSize = 12;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new MeasuredValueShortWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new MeasuredValueShortWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_IT_TB_1:             /* 37 */

                elementSize = 12;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new IntegratedTotalsWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new IntegratedTotalsWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_EP_TD_1:             /* 38 */

                elementSize = 10;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new EventOfProtectionEquipmentWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new EventOfProtectionEquipmentWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_EP_TE_1:             /* 39 */

                elementSize = 11;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new PackedStartEventsOfProtectionEquipmentWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new PackedStartEventsOfProtectionEquipmentWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            case TypeID.M_EP_TF_1:             /* 40 */

                elementSize = 11;

                if (IsSquence)
                {
                    int ioa = InformationObject.ParseInformationObjectAddress(parameters, payload, 0);

                    retVal = new PackedOutputCircuitInfoWithCP56Time2a(parameters, payload, parameters.SizeOfIOA + (index * elementSize), true);

                    retVal.ObjectAddress = ioa + index;
                }
                else
                {
                    retVal = new PackedOutputCircuitInfoWithCP56Time2a(parameters, payload, index * (parameters.SizeOfIOA + elementSize), false);
                }

                break;

            /* 41 - 44 reserved */

            case TypeID.C_SC_NA_1:             /* 45 */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new SingleCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_DC_NA_1:             /* 46 */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new DoubleCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_RC_NA_1:             /* 47 */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new StepCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_SE_NA_1:             /* 48 - Set-point command, normalized value */

                elementSize = parameters.SizeOfIOA + 3;

                retVal = new SetpointCommandNormalized(parameters, payload, index * elementSize);

                break;

            case TypeID.C_SE_NB_1:             /* 49 - Set-point command, scaled value */

                elementSize = parameters.SizeOfIOA + 3;

                retVal = new SetpointCommandScaled(parameters, payload, index * elementSize);

                break;

            case TypeID.C_SE_NC_1:             /* 50 - Set-point command, short floating point number */

                elementSize = parameters.SizeOfIOA + 5;

                retVal = new SetpointCommandShort(parameters, payload, index * elementSize);

                break;

            case TypeID.C_BO_NA_1:             /* 51 - Bitstring command */

                elementSize = parameters.SizeOfIOA + 4;

                retVal = new Bitstring32Command(parameters, payload, index * elementSize);

                break;

            /* 52 - 57 reserved */

            case TypeID.C_SC_TA_1:             /* 58 - Single command with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 8;

                retVal = new SingleCommandWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            case TypeID.C_DC_TA_1:             /* 59 - Double command with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 8;

                retVal = new DoubleCommandWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            case TypeID.C_RC_TA_1:             /* 60 - Step command with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 8;

                retVal = new StepCommandWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            case TypeID.C_SE_TA_1:             /* 61 - Setpoint command, normalized value with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 10;

                retVal = new SetpointCommandNormalizedWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            case TypeID.C_SE_TB_1:             /* 62 - Setpoint command, scaled value with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 10;

                retVal = new SetpointCommandScaledWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            case TypeID.C_SE_TC_1:             /* 63 - Setpoint command, short value with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 12;

                retVal = new SetpointCommandShortWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            case TypeID.C_BO_TA_1:             /* 64 - Bitstring command with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 11;

                retVal = new Bitstring32CommandWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            /* 65 - 69 reserved */

            case TypeID.M_EI_NA_1: /* 70 - End of initialization */
                elementSize = parameters.SizeOfCA + 1;

                retVal = new EndOfInitialization(parameters, payload, index * elementSize);

                break;

            case TypeID.C_IC_NA_1:             /* 100 - Interrogation command */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new InterrogationCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_CI_NA_1:             /* 101 - Counter interrogation command */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new CounterInterrogationCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_RD_NA_1:             /* 102 - Read command */

                elementSize = parameters.SizeOfIOA;

                retVal = new ReadCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_CS_NA_1:             /* 103 - Clock synchronization command */

                elementSize = parameters.SizeOfIOA + 7;

                retVal = new ClockSynchronizationCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_TS_NA_1: /* 104 - Test command */

                elementSize = parameters.SizeOfIOA + 2;

                retVal = new TestCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_RP_NA_1: /* 105 - Reset process command */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new ResetProcessCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_CD_NA_1:             /* 106 - Delay acquisition command */

                elementSize = parameters.SizeOfIOA + 2;

                retVal = new DelayAcquisitionCommand(parameters, payload, index * elementSize);

                break;

            case TypeID.C_TS_TA_1: /* 107 - Test command with CP56Time2a */

                elementSize = parameters.SizeOfIOA + 9;

                retVal = new TestCommandWithCP56Time2a(parameters, payload, index * elementSize);

                break;

            /* C_TS_TA_1 (107) is handled by the stack automatically */

            case TypeID.P_ME_NA_1:             /* 110 - Parameter of measured values, normalized value */

                elementSize = parameters.SizeOfIOA + 3;

                retVal = new ParameterNormalizedValue(parameters, payload, index * elementSize);

                break;

            case TypeID.P_ME_NB_1:             /* 111 - Parameter of measured values, scaled value */

                elementSize = parameters.SizeOfIOA + 3;

                retVal = new ParameterScaledValue(parameters, payload, index * elementSize);

                break;

            case TypeID.P_ME_NC_1:             /* 112 - Parameter of measured values, short floating point number */

                elementSize = parameters.SizeOfIOA + 5;

                retVal = new ParameterFloatValue(parameters, payload, index * elementSize);

                break;

            case TypeID.P_AC_NA_1:             /* 113 - Parameter for activation */

                elementSize = parameters.SizeOfIOA + 1;

                retVal = new ParameterActivation(parameters, payload, index * elementSize);

                break;

            /* 114 - 119 reserved */

            default:
                throw new ASDUParsingException("Unknown ASDU type id:" + typeId);
            }

            return(retVal);
        }
Пример #5
0
        /// <summary>
        /// 发送控制命令Sends the control command.
        /// </summary>
        ///
        /// The type ID has to match the type of the InformationObject!
        ///
        /// C_SC_NA_1 -> SingleCommand                  单位遥控命令
        /// C_DC_NA_1 -> DoubleCommand                  双位遥控命令
        /// C_RC_NA_1 -> StepCommand                    档位调节命令
        /// C_SC_TA_1 -> SingleCommandWithCP56Time2a
        /// C_SE_NA_1 -> SetpointCommandNormalized      归一化设定值
        /// C_SE_NB_1 -> SetpointCommandScaled          标度化设定值
        /// C_SE_NC_1 -> SetpointCommandShort           短浮点设定值
        /// C_BO_NA_1 -> Bitstring32Command
        ///
        ///
        /// <param name="typeId">类型标识Type ID of the control command</param>
        /// <param name="cot">传送原因Cause of transmission (use ACTIVATION to start a control sequence)</param>
        /// <param name="ca">公共地址Common address</param>
        /// <param name="sc">信息体对象Information object of the command</param>
        /// <exception cref="ConnectionException">description</exception>
        public void SendControlCommand(TypeID typeId, CauseOfTransmission cot, int ca, InformationObject sc)
        {
            Frame frame = new T104Frame();

            EncodeIdentificationField(frame, typeId, 1 /* SQ:false; NumIX:1 */, cot, ca);

            sc.Encode(frame, parameters, false);

            if (debugOutput)
            {
                Console.WriteLine("Encoded " + typeId.ToString() + " with " + frame.GetMsgSize() + " bytes.");
            }

            sendIMessage(frame);
        }