/// <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> /// 写文件激活确认数据包 /// </summary> /// <param name="data">数据包</param> /// <param name="offset">偏移</param> /// <param name="len">数据长度</param> public FileWriteActivityAckPacket(byte[] data, byte offset, byte len) { try { int definelen = data[offset + 2] + 11; if (definelen != len) { throw new ArgumentException("写文件激活,定义长度与实际长度不一致"); } pakcketData = new byte[len]; Array.Copy(data, offset, pakcketData, 0, len); OperationSign = (OperatSign)data[offset++]; Result = (WriteFileResultDescription)data[offset++]; int strLen = data[offset++]; Name = UnicodeEncoding.ASCII.GetString(data, offset, strLen); offset += NameLen; FileID = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); Size = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); } catch (Exception ex) { throw ex; } }
/// <summary> /// 将数据局数组转换成对应元素属性 /// </summary> private void AttributeDataToElement() { Name = UnicodeEncoding.ASCII.GetString(attributeData, 1, attributeData[0]); Size = ElementTool.CombinationByte(attributeData[NameLen + 1], attributeData[NameLen + 2], attributeData[NameLen + 3], attributeData[NameLen + 4]); Property = attributeData[NameLen + 5]; Time = new CP56Time2a(attributeData, NameLen + 6); }
/// <summary> /// 录波数据初始化 /// </summary> /// <param name="rawframe">字节数组</param> public RecordWaveform(byte[] rawframe) { Channel = rawframe[7]; WaveformNum = rawframe[8]; GroupNum = rawframe[9]; byte[] data = new byte[7]; Array.Copy(rawframe, 10, data, 0, 7); TimeStamp = new CP56Time2a(data); int len = rawframe[1] - 7 - 3 - 3; RawByteArray = new byte[len]; Array.Copy(rawframe, 17, RawByteArray, 0, len); RawAdcArray = new ushort[len / 2]; int count = len / 2; for (int i = 0; i < count; i++) { RawAdcArray[count++] = ElementTool.CombinationByte(rawframe[2 * i], rawframe[2 * i + 1]); } }
/// <summary> /// 数据包转换为属性值 /// </summary> /// <param name="data">数据包</param> /// <param name="offset">便宜</param> /// <param name="len">数据长度</param> public void PacketDataToElement(byte[] data, byte offset, byte len) { OperationSign = (OperatSign)data[offset++]; ResultSign = (FileResultSign)data[offset++]; DirectoryID = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); Fllow = (FllowingFlag)data[offset++]; Count = data[offset++]; if (Count > 0) { for (int i = 0; i < Count; i++) { byte attributeLen = (byte)(data[offset] + 13); var attribute = new FileAttribute(data, offset, attributeLen); FileAttributeList.Add(attribute); offset += attributeLen; } } }
/// <summary> /// 文件数据传输包初始化 /// </summary> /// <param name="data">数据包</param> /// <param name="offset">偏移</param> /// <param name="len">长度</param> public FileDataThransmitPacket(byte[] data, byte offset, byte len) { try { packetData = new byte[len]; Array.Copy(data, offset, packetData, 0, len); OperationSign = (OperatSign)data[offset++]; FileID = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); FragmentNum = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); Fllow = (FllowingFlag)data[offset++]; FileData = new byte[len - 11]; Array.Copy(packetData, 10, FileData, 0, len - 11); Check = packetData[packetData.Length - 1]; } catch (Exception ex) { throw ex; } }
/// <summary> /// 读数据文件激活确认 /// </summary> /// <param name="data">数据包</param> /// <param name="offset">偏移</param> /// <param name="len">数据长度</param> public FileReadActivityAckPacket(byte[] data, byte offset, byte len) { try { int definelen = data[offset + 2] + 11; if (definelen != len) { throw new ArgumentException("读文件激活确认,定义长度与实际长度不一致"); } OperationSign = (OperatSign)data[offset++]; ResultSign = (FileResultSign)data[offset++]; int strLen = data[offset++]; Name = UnicodeEncoding.ASCII.GetString(data, offset, strLen); offset += NameLen; FileID = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); Size = ElementTool.CombinationByte(data[offset++], data[offset++], data[offset++], data[offset++]); } catch (Exception ex) { throw ex; } }
/// <summary> /// 更新遥控状态,更新相应的按钮状态。 /// Todo:地址更新需要同步,这限制了灵活性 /// </summary> /// <param name="apdu">APDU帧</param> private void UpdateTelecontrolState(APDU apdu) { try { UInt32 objectAddr = ElementTool.CombinationByte(apdu.ASDU.InformationObject[0], apdu.ASDU.InformationObject[1], apdu.ASDU.InformationObject[2]); var dc = new DoubleCommand(apdu.ASDU.InformationObject[3]); switch (objectAddr) { //开关控制 case Telecontrol.BasicAddress: { if ((dc.DCS == DCOState.On) && (dc.SE == SelectExecuteOption.Select)) { //合闸 选择 controlReayActionState.ActionCloseEnabled = true; controlReayActionState.ReadyCloseEnabled = false; MakeLogMessage(apdu, "", "合闸预制-确认", LogType.Telecontrol); } else if ((dc.DCS == DCOState.On) && (dc.SE == SelectExecuteOption.Execute)) { //合闸 执行 controlReayActionState.ActionCloseEnabled = false; controlReayActionState.ReadyCloseEnabled = true; MakeLogMessage(apdu, "", "合闸执行-确认", LogType.Telecontrol); } if ((dc.DCS == DCOState.Off) && (dc.SE == SelectExecuteOption.Select)) { //分闸 选择 controlReayActionState.ActionOpenEnabled = true; controlReayActionState.ReadyOpenEnabled = false; MakeLogMessage(apdu, "", "分闸预制-确认", LogType.Telecontrol); } else if ((dc.DCS == DCOState.Off) && (dc.SE == SelectExecuteOption.Execute)) { //分闸 执行 controlReayActionState.ActionOpenEnabled = false; controlReayActionState.ReadyOpenEnabled = true; MakeLogMessage(apdu, "", "分闸执行-确认", LogType.Telecontrol); } break; } //电池活化 case (Telecontrol.BasicAddress + 1): { break; } //复归 case (Telecontrol.BasicAddress + 2): { break; } default: { break; } } } catch (Exception ex) { MessageBox.Show(ex.Message, "更新遥控状态"); } }