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