private void DecodeWriteReply(int packetIdx, MultiServiceReply reply) { try { List <PacketMap> writeTags = GetTagsForWritePacket(packetIdx); for (int i = 0; i < writeTags.Count; i++) { PacketMap currentTag = writeTags[i]; int idx = currentTag.PacketIndex.IndexOf(packetIdx); int serviceNum = currentTag.ServiceIndex[idx]; //TODO: This should look at all the replies for a particular tag before //telling the tag to clear the pending write... if (reply.ServiceReplies.Count > serviceNum) { _tags[currentTag.TagIndex].SetTagError(reply.ServiceReplies[serviceNum].FullStatus); if (reply.ServiceReplies[serviceNum].Status == 0x00) { _tags[currentTag.TagIndex].ClearPendingWrite(); } } } } catch (Exception ex) { _logger.LogError("LogixTagGroup DecodeWriteReply: " + ex.Message + " " + ex.StackTrace); } }
private void DecodeReadPacket(int packetIdx, MultiServiceReply reply) { try { //Basically we need to find the tag(s) that this belongs to and add it to //a list of reply bytes at the specified offset. List <PacketMap> packetTags = GetTagsForPacket(packetIdx); for (int i = 0; i < packetTags.Count; i++) { PacketMap currentTag = packetTags[i]; //We have to figure out what service this tag is on int idx = currentTag.PacketIndex.IndexOf(packetIdx); int serviceNum = currentTag.ServiceIndex[idx]; //Now get the service data out and add it to the replies if (reply.ServiceReplies.Count > serviceNum) { _tags[currentTag.TagIndex].SetTagError(reply.ServiceReplies[serviceNum].FullStatus); if (!_byteReplies.ContainsKey(currentTag.TagIndex)) { _byteReplies[currentTag.TagIndex] = new List <byte[]>(); } _byteReplies[currentTag.TagIndex].Add(reply.ServiceReplies[serviceNum].ServiceData); } } } catch (Exception ex) { _logger.LogError("LogixTagGroup DecodeReadPacket: " + ex.Message + " " + ex.StackTrace); } }
private void WriteAll() { try { //First we are going to have to build the write requests... _writeMsrPackets = new List <MultiServiceRequest>(); BuildWriteRequests(); //Now we have to send them out... for (int i = 0; i < _writeMsrPackets.Count; i++) { CommonPacketItem addressItem = CommonPacketItem.GetConnectedAddressItem(_parent.SessionInfo.ConnectionParameters.O2T_CID); CommonPacketItem dataItem = CommonPacketItem.GetConnectedDataItem(_writeMsrPackets[i].Pack(), SequenceNumberGenerator.SequenceNumber(_parent.SyncRoot)); EncapsReply reply = _parent.SessionInfo.SendUnitData(addressItem, dataItem); if (reply != null) { MultiServiceReply msReply = new MultiServiceReply(reply); DecodeWriteReply(i, msReply); } } } catch (Exception ex) { _logger.LogError("LogixTagGroup WriteAll: " + ex.Message + " " + ex.StackTrace); } }
private void ReadAll() { try { //The lock object should already be held... //List<MultiServiceReply> replies = new List<MultiServiceReply>(); //List<LogixTag> updatedTags = new List<LogixTag>(); _byteReplies = new Dictionary <int, List <byte[]> >(); CommonPacketItem addressItem = CommonPacketItem.GetConnectedAddressItem(_parent.SessionInfo.ConnectionParameters.O2T_CID); for (int i = 0; i < _msrPackets.Count; i++) { CommonPacketItem dataItem = CommonPacketItem.GetConnectedDataItem(_msrPackets[i].Pack(), SequenceNumberGenerator.SequenceNumber(_parent.SyncRoot)); EncapsReply reply = _parent.SessionInfo.SendUnitData(addressItem, dataItem); if (reply != null) { //We need to suck all the replies out of the packet, and request more data if there is more MultiServiceReply msReply = new MultiServiceReply(reply); DecodeReadPacket(i, msReply); foreach (KeyValuePair <int, List <byte[]> > kvp in _byteReplies) { uint offset = 0; for (int i2 = 0; i2 < kvp.Value.Count; i2++) { if (_tags[kvp.Key].UpdateValue(kvp.Value[i2], offset)) { //updatedTags.Add(_tags[kvp.Key]); } offset += (uint)(kvp.Value[i2].Length + 6); } } //UpdateFinished?.Invoke(this, new UpdateFinishedEventArgs(updatedTags)); //updatedTags.Clear(); _byteReplies.Clear(); } } } catch (Exception ex) { _logger.LogError("LogixTagGroup ReadAll: " + ex.Message + " " + ex.StackTrace); } }