Esempio n. 1
0
        /// <summary>
        /// 发送ASDU
        /// </summary>
        /// <param name="asdu"></param>
        public void SendASDU(ASDU asdu)
        {
            Frame frame = new T104Frame();

            asdu.Encode(frame, parameters);

            //发送I帧
            sendIMessage(frame);
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
        /// <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);
        }