/// <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); } }
/// <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); }
/// <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); }
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); }
/// <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); }