예제 #1
0
        /// <summary>
        /// 保护定值选择
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DownloadProtectSetSelect_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var observale = (ObservableCollection <ProtectSetPoint>)protectSetPoint;
                if ((observale != null) && (observale.Count > 0))
                {
                    var qos            = new QualifyCommandSet(ActionDescrible.Select);
                    var protectsetAPDU = new APDU(appMessageManager.TransmitSequenceNumber, appMessageManager.RealReceiveSequenceNumber,
                                                  TypeIdentification.C_SE_NC_1, true, (byte)observale.Count,
                                                  CauseOfTransmissionList.Activation, appMessageManager.ASDUADdress, ProtectSetPoint.BasicAddress, qos);

                    foreach (var m in observale)
                    {
                        if (m.InternalID <= observale.Count)
                        {
                            var sf = new ShortFloating((float)m.ParameterValue);
                            protectsetAPDU.AddInformationObject(sf.GetDataArray(),
                                                                (byte)sf.GetDataArray().Length, (byte)(m.InternalID - 1));
                        }
                        else
                        {
                            throw new Exception("序号不在顺序范围之内,无法使用序列化方法,请检查InternalID是否连续");
                        }
                    }
                    //BeginInvokeUpdateHistory(fram.GetAPDUDataArray(), fram.FrameArray.Length, "测试");
                    SendTypeIMessage(TypeIdentification.P_ME_NC_1, protectsetAPDU);
                    MakeLogMessage(sender, "定值选择" + protectsetAPDU.ToString(), LogType.ProtectSetpoint);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "DownloadProtectSetSelect_Click");
            }
        }
예제 #2
0
        /// <summary>
        /// 更新电能脉冲参数
        /// </summary>
        private void UpdateElectricEnergy(APDU apdu)
        {
            try
            {
                var list = apdu.GetObjectListObject();


                string str = "";
                if (apdu.ASDU.IsSequence)
                {
                    var addr = ElementTool.CombinationByte(apdu.ASDU.InformationObject[0],
                                                           apdu.ASDU.InformationObject[1], apdu.ASDU.InformationObject[2]);
                    foreach (var m in list)
                    {
                        var sf = new ShortFloating(m);
                        var q  = new QualityDescription(m[5]);
                        str += "电能召唤:" + addr.ToString("X2") + " 品质描述:" + q.QDS.ToString("X2") + " 值:" + sf.ToString();
                    }
                }


                //txtTest.Text = "";
                //txtTest.Text = str;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, " UpdateElectricEnergy");
            }
        }
예제 #3
0
        /// <summary>
        /// 添加序列化的信息对象:短浮点数(byte4)+品质描述词(byte1)
        /// <summary>
        /// <param name="sf">浮点数</param>
        /// <param name="qds">品质描述词</param>
        /// <param name="position">添加的位置</param>
        public bool AddInformationObject(ShortFloating sf, QualityDescription qds, byte position)
        {
            var data = new byte[5];

            Array.Copy(sf.GetDataArray(), data, 4);
            data[4] = qds.QDS;
            ASDU.AddInformationObject(data, 5, position);

            return(true);
        }
예제 #4
0
        /// <summary>
        /// 针对遥测信息,序列化
        /// <summary>
        /// <param name="sf">浮点数</param>
        /// <param name="time">时间信标</param>
        public bool AddInformationObject(ShortFloating sf, CP56Time2a time)
        {
            bool state = false;

            if (ASDU.IsSequence == true)
            {
                return(state);
            }
            var data = new byte[sf.GetDataArray().Length + time.GetDataArray().Length];

            Array.Copy(sf.GetDataArray(), 0, data, 0, sf.GetDataArray().Length);
            Array.Copy(time.GetDataArray(), 0 + sf.GetDataArray().Length, data, sf.GetDataArray().Length, time.GetDataArray().Length);

            ASDU.AddInformationObject(data, (byte)data.Length);
            return(true);
        }
예제 #5
0
        /// <summary>
        /// 添加信息对象,非序列化,浮点数+地址+品质描述词
        /// </summary>
        /// <param name="Address">遥测地址</param>
        /// <param name="sf">浮点数</param>
        public bool AddInformationObject(UInt32 address, ShortFloating sf)
        {
            bool state = false;

            if (ASDU.IsSequence == true)
            {
                return(state);
            }
            var data = new byte[3 + sf.GetDataArray().Length];

            data[0] = ElementTool.GetBit7_0(address);
            data[1] = ElementTool.GetBit15_8(address);
            data[2] = ElementTool.GetBit23_16(address);
            Array.Copy(sf.GetDataArray(), 0, data, 3, sf.GetDataArray().Length);
            ASDU.AddInformationObject(data, (byte)data.Length);

            return(true);
        }
예제 #6
0
        /// <summary>
        /// 获取信息对象列表
        /// </summary>
        /// <returns>信息元素 元组中以此为序号,信息, 时标(可选)</returns>
        public List <Tuple <UInt32, object, object> > GetInformationList()
        {
            try
            {
                var list = new List <Tuple <UInt32, object, object> >();
                switch ((TypeIdentification)ASDU.TypeId)
                {
                //遥信信息
                case TypeIdentification.M_SP_NA_1:    //单点信息
                case TypeIdentification.M_DP_NA_1:    //双点信息
                {
                    if (ASDU.IsSequence)
                    {
                        // int len = 1;
                        var addr = ElementTool.CombinationByte(ASDU.InformationObject[0], ASDU.InformationObject[1], ASDU.InformationObject[2]);
                        for (int i = 0; i < ASDU.InformationObjectCount; i++)
                        {
                            var m = ASDU.InformationObject[3 + i];
                            list.Add(new Tuple <UInt32, object, object>((UInt32)(addr + i), m, null));
                        }
                    }
                    else
                    {
                        int len = 4;
                        for (int i = 0; i < ASDU.InformationObjectCount; i++)
                        {
                            var addr1 = ElementTool.CombinationByte(ASDU.InformationObject[0 + len * i],
                                                                    ASDU.InformationObject[1 + len * i], ASDU.InformationObject[2 + len * i]);
                            var m = ASDU.InformationObject[3 + len * i];

                            list.Add(new Tuple <UInt32, object, object>(addr1, m, null));
                        }
                    }
                    break;
                }

                case TypeIdentification.M_SP_TB_1:    //带CP56Time2a时标的单点信息
                case TypeIdentification.M_DP_TB_1:    //带CP56Time2a时标的双点信息
                {
                    if (ASDU.IsSequence)
                    {
                        int len  = 1 + 7;
                        var addr = ElementTool.CombinationByte(ASDU.InformationObject[0], ASDU.InformationObject[1], ASDU.InformationObject[2]);
                        for (int i = 0; i < ASDU.InformationObjectCount; i++)
                        {
                            var m    = ASDU.InformationObject[3 + i * len];
                            var data = new byte[7];
                            Array.Copy(ASDU.InformationObject, i * len + 4, data, 0, 7);
                            var t = new CP56Time2a(data);
                            list.Add(new Tuple <UInt32, object, object>((UInt32)(addr + i), m, t));
                        }
                    }
                    else
                    {
                        int len = 3 + 1 + 7;
                        for (int i = 0; i < ASDU.InformationObjectCount; i++)
                        {
                            var addr1 = ElementTool.CombinationByte(ASDU.InformationObject[0 + len * i],
                                                                    ASDU.InformationObject[1 + 8 * i], ASDU.InformationObject[2 + +len * i]);

                            var m    = ASDU.InformationObject[3 + len * i];
                            var data = new byte[7];
                            Array.Copy(ASDU.InformationObject, i * len + 4, data, 0, 7);
                            var t = new CP56Time2a(data);

                            list.Add(new Tuple <UInt32, object, object>(addr1, m, t));
                        }
                    }
                    break;
                }

                //遥测信息
                case TypeIdentification.M_ME_NA_1:    //测量值,归一化值
                {
                    break;
                }

                case TypeIdentification.M_ME_NC_1:    //测量值,短浮点数
                case TypeIdentification.M_IT_NA_1:    //累积量
                {
                    if (ASDU.IsSequence)
                    {
                        int len  = 4 + 1;
                        var addr = ElementTool.CombinationByte(ASDU.InformationObject[0], ASDU.InformationObject[1], ASDU.InformationObject[2]);
                        for (int i = 0; i < ASDU.InformationObjectCount; i++)
                        {
                            var data = new byte[5];
                            Array.Copy(ASDU.InformationObject, i * len + 3, data, 0, 5);
                            var m = new ShortFloating(data);
                            var q = new QualityDescription(data[4]);
                            list.Add(new Tuple <UInt32, object, object>((UInt32)(addr + i), m.Value, q));
                        }
                    }
                    else
                    {
                        int len = 12;        //4 + 1 + 7
                        for (int i = 0; i < ASDU.InformationObjectCount; i++)
                        {
                            var addr1 = ElementTool.CombinationByte(ASDU.InformationObject[0 + len * i],
                                                                    ASDU.InformationObject[1 + len * i], ASDU.InformationObject[2 + +len * i]);
                            var data = new byte[4];
                            Array.Copy(ASDU.InformationObject, i * len + 3, data, 0, 4);
                            var m = new ShortFloating(data);
                            list.Add(new Tuple <UInt32, object, object>(addr1, m, null));
                        }
                    }
                    break;
                }

                case TypeIdentification.M_ME_TD_1:    //带CP56Time2a时标的测量值,归一化值
                case TypeIdentification.M_ME_TF_1:    //带CP56Time2a时标的测量值,短浮点数
                {
                    break;
                }


                default:
                {
                    return(null);
                    //break;
                }
                }

                return(list);
            }
            catch (Exception)
            {
                return(null);
            }
        }