Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
            }
        }