/// <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); }
/// <summary> /// 读命令(102)Sends a read command (C_RD_NA_1 typeID: 102). /// <para>召唤单个信息,单个遥测、遥信的当前值读取</para> /// </summary> /// /// This will send a read command C_RC_NA_1 (102) to the slave/outstation. The COT is always REQUEST (5). /// It is used to implement the cyclical polling of data application function. /// /// 传送原因: /// 控制方向 /// 5: 请求 /// 监视方向 /// 5: 被请求 /// 44 未知的类型标识 /// 45 未知的传送原因 /// 46 未知的应用服务数据单元公共地址 cot /// 47 未知的信息对象地址 /// <param name="ca">公共地址Common address</param> /// <param name="ioa">信息对象地址Information object address</param> /// <exception cref="ConnectionException">description</exception> public void SendReadCommand(int ca, int ioa) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_RD_NA_1, 1, CauseOfTransmission.REQUEST, ca); EncodeIOA(frame, ioa); if (debugOutput) { Console.WriteLine("Encoded C_RD_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }
/// <summary> /// Sends a delay acquisition command (C_CD_NA_1 typeID: 106). /// </summary> /// <param name="cot">Cause of transmission</param> /// <param name="ca">Common address</param> /// <param name="delay">delay for acquisition</param> /// <exception cref="ConnectionException">description</exception> public void SendDelayAcquisitionCommand(CauseOfTransmission cot, int ca, CP16Time2a delay) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_CD_NA_1, 1, cot, ca); EncodeIOA(frame, 0); frame.AppendBytes(delay.GetEncodedValue()); if (debugOutput) { Console.WriteLine("Encoded C_CD_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }
/// <summary> /// 复位进程命令Sends a reset process command (C_RP_NA_1 typeID: 105). /// <para>1. 必须慎重使用复位进程命令</para> /// <para>2. 需要通信双方技术人员交流并去人复位条件方可进行</para> /// </summary> /// <param name="cot"> /// 传送原因Cause of transmission /// <para>控制方向</para> /// <para> 6 激活</para> /// <para>监视方向</para> /// <para> 7 激活确认</para> /// <para> 10 激活终止</para> /// <para> 44 未知的类型标识</para> /// <para> 45 未知的传送原因</para> /// <para> 46 未知的应用服务数据单元公共地址 cot</para> /// <para> 47 未知的信息对象地址</para> /// </param> /// <param name="ca">公共地址Common address</param> /// <param name="qrp"> /// 复位进程命令限定词Qualifier of reset process command /// <para>0: 未用</para> /// <para>1: 进程的总复位</para> /// <para>2: 复位时间缓冲区等待处理的带时标信息</para> /// </param> /// <exception cref="ConnectionException">description</exception> public void SendResetProcessCommand(CauseOfTransmission cot, int ca, byte qrp) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_RP_NA_1, 1, cot, ca); EncodeIOA(frame, 0); frame.SetNextByte(qrp); if (debugOutput) { Console.WriteLine("Encoded C_RP_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }
/// <summary> /// 发送时钟同步命令(103)Sends a clock synchronization command (C_CS_NA_1 typeID: 103). /// <para>只用于站端没有GPS的情况</para> /// <para>使用104进行同步时,无须测量通道延时</para> /// </summary> /// 传送原因: /// 控制方向 /// 6: 激活 /// 监视方向 /// 7: 激活确认 /// 10 激活终止 /// 44 未知的类型标识 /// 45 未知的传送原因 /// 46 未知的应用服务数据单元公共地址 cot /// 47 未知的信息对象地址 /// <param name="ca">公共地址Common address</param> /// <param name="time">时间日期the new time to set</param> /// <exception cref="ConnectionException">description</exception> public void SendClockSyncCommand(int ca, CP56Time2a time) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_CS_NA_1, 1, CauseOfTransmission.ACTIVATION, ca); EncodeIOA(frame, 0); frame.AppendBytes(time.GetEncodedValue()); if (debugOutput) { Console.WriteLine("Encoded C_CS_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }
/// <summary> /// Sends a test command (C_TS_NA_1 typeID: 104). /// </summary> /// /// Not required and supported by IEC 60870-5-104. /// /// <param name="ca">Common address</param> /// <exception cref="ConnectionException">description</exception> public void SendTestCommand(int ca) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_TS_NA_1, 1, CauseOfTransmission.ACTIVATION, ca); EncodeIOA(frame, 0); frame.SetNextByte(0xcc); frame.SetNextByte(0x55); if (debugOutput) { Console.WriteLine("Encoded C_TS_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }
/// <summary> /// 发送累计量召唤命令,Sends the counter interrogation command (C_CI_NA_1 typeID: 101) /// </summary> /// <param name="cot">传送原因 Cause of transmission</param> /// <param name="ca">公共地址Common address</param> /// <param name="qcc"> /// 召唤限定词(应该跟站召一样,下面列出来参考下)Qualifier of counter interrogation command /// <para>0 未用</para> /// <para>1-19 未定义</para> /// <para>20 全站召唤</para> /// <para>21-28 分别为召唤第1-8组信息(遥信信息)</para> /// <para>29-34 分别为召唤第9-14组信息(遥测信息)</para> /// <para>35 召唤第15组信息(档位信息)</para> /// <para>36 召唤第16组信息(远动中断状态信息)</para> /// <para>37-255 未定义</para> /// </param> /// <exception cref="ConnectionException">description</exception> public void SendCounterInterrogationCommand(CauseOfTransmission cot, int ca, byte qcc) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_CI_NA_1, 1, cot, ca); EncodeIOA(frame, 0); /* encode QCC */ frame.SetNextByte(qcc); if (debugOutput) { Console.WriteLine("Encoded C_CI_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }
/// <summary> /// 发送站召唤(类型标识100),Sends the interrogation command. /// <para>站召唤和组召唤都行</para> /// <para>站端回答镜像报文确认或否定</para> /// </summary> /// <param name="cot"> /// 传送原因Cause of transmission /// <para>控制方向</para> /// <para> 6 激活</para> /// <para> 8 停止激活</para> /// <para>监视方向</para> /// <para> 7 激活确认</para> /// <para> 9 停止激活确认</para> /// <para> 10 激活终止</para> /// <para> 44 未知的类型标识</para> /// <para> 45 未知的传送原因</para> /// <para> 46 未知的应用服务数据单元公共地址 cot</para> /// <para> 47 未知的信息对象地址</para> /// </param> /// <param name="ca">公共地址Common address</param> /// <param name="qoi"> /// 召唤限定词(20全站召唤),Qualifier of interrogation (20 = station interrogation) /// <para>0 未用</para> /// <para>1-19 未定义</para> /// <para>20 全站召唤</para> /// <para>21-28 分别为召唤第1-8组信息(遥信信息)</para> /// <para>29-34 分别为召唤第9-14组信息(遥测信息)</para> /// <para>35 召唤第15组信息(档位信息)</para> /// <para>36 召唤第16组信息(远动中断状态信息)</para> /// <para>37-255 未定义</para> /// </param> /// <exception cref="ConnectionException">description</exception> public void SendInterrogationCommand(CauseOfTransmission cot, int ca, byte qoi) { Frame frame = new T104Frame(); EncodeIdentificationField(frame, TypeID.C_IC_NA_1, 1, cot, ca); EncodeIOA(frame, 0); /* encode COI (7.2.6.21) */ frame.SetNextByte(qoi); /* 20 = station interrogation */ if (debugOutput) { Console.WriteLine("Encoded C_IC_NA_1 with " + frame.GetMsgSize() + " bytes."); } sendIMessage(frame); }