private static void BuildReadRecordApdu(CommandApdu command, RecordAddress address, byte idx) { command.CLA = 0; command.Instruction = InstructionCode.ReadRecord; command.P1 = idx; command.P2 = (byte)((address.SFI << 3) + 0x4); }
/// <summary> /// 初始化ASDU,使用一大堆参数(无类型标识的初始化) /// </summary> /// <param name="cot">传送原因</param> /// <param name="isTest">是否测试</param> /// <param name="isNegative">肯定/否定回答</param> /// <param name="ca"> 应用服务数据单元公共地址 </param> /// <param name="ra">记录地址</param> /// <param name="isSequence">是否连续单元(用于构造VSQ),数量根据添加来变</param> public ASDU(CauseOfTransmission cot, bool isTest, bool isNegative, int ca, RecordAddress ra, bool isSequence) : this(TypeID.M_SP_TA_2, cot, isTest, isNegative, ca, ra, isSequence) { //这里标志一下,没有类型标识,也就是说在初始化ASDU的时候不加类型标识 //当在增加信息对象的时候,类型标识根据信息对象的标识来确定。 this.hasTypeId = false; }
/// <summary> /// 使用buff初始化一个ASDU,相当于解析 /// </summary> /// <param name="parameters">链接参数</param> /// <param name="msg">接收到的消息内容(整个报文)里面自动跳掉头了。。</param> /// <param name="msgLength">消息长度(整个报文的长度,包括报文头)</param> public ASDU(ConnectionParameters parameters, byte[] msg, int msgLength) { //保存链接参数 this.parameters = parameters.clone(); //跳过报文头,68H+长度(2)+68H + 链路控制域(1) + 链路地址(2) int bufPos = 7; typeId = (TypeID)msg[bufPos++]; //类型标识 vsq = msg[bufPos++]; //可变结构限定词 this.hasTypeId = true; byte cotByte = msg[bufPos++]; //传送原因 //测试标志--0 未试验(false),1 试验(true) if ((cotByte & 0x80) != 0) { isTest = true; } else { isTest = false; } //确认标志,0 肯定确认(false) ,1 否定确认(true) if ((cotByte & 0x40) != 0) { isNegative = true; } else { isNegative = false; } //传送原因 cot = (CauseOfTransmission)(cotByte & 0x3f); //电能量数据终端设备地址(2字节) ca = msg[bufPos++]; if (parameters.SizeOfCA > 1) { ca += (msg[bufPos++] * 0x100); } //记录地址 ra = (RecordAddress)msg[bufPos++]; //类型标识 int payloadSize = msgLength - bufPos - 2; //把最后的和校验和结束符去掉 payload = new byte[payloadSize]; /* save payload */ Buffer.BlockCopy(msg, bufPos, payload, 0, payloadSize); }
private static List <RecordAddress> ParseAddresses(byte[] data) { List <RecordAddress> results = new List <RecordAddress>(); for (int idx = 0; idx < data.Length; idx += 4) { var newAddress = new RecordAddress() { SFI = data[idx + 0] >> 3, FromRecord = data[idx + 1], ToRecord = data[idx + 2], OfflineAddress = data[idx + 3], }; results.Add(newAddress); } return(results); }
/// <summary> /// 初始化ASDU,使用一大堆参数 /// </summary> /// <param name="typeId">类型标识</param> /// <param name="cot">传送原因</param> /// <param name="isTest">是否测试</param> /// <param name="isNegative">肯定/否定回答</param> /// <param name="ca"> 应用服务数据单元公共地址 </param> /// <param name="ra">记录地址</param> /// <param name="isSequence">是否连续单元(用于构造VSQ),数量根据添加来变</param> public ASDU(TypeID typeId, CauseOfTransmission cot, bool isTest, bool isNegative, int ca, RecordAddress ra, bool isSequence) { this.typeId = typeId; this.cot = cot; this.isTest = isTest; this.isNegative = isNegative; this.ra = ra; this.ca = ca; if (isSequence) { this.vsq = 0x80; } else { this.vsq = 0; } this.hasTypeId = true; }