Exemplo n.º 1
0
        public MultiServiceReply(EncapsReply reply)
        {
            EncapsRRData rrData = new EncapsRRData();
            CommonPacket cpf    = new CommonPacket();

            int temp = 0;

            rrData.Expand(reply.EncapsData, 0, out temp);
            cpf = rrData.CPF;

            MessageRouterResponse response = new MessageRouterResponse();

            response.Expand(cpf.DataItem.Data, 2, out temp);

            if (response.GeneralStatus == 0x1E)
            {
                IsPartial = true;
            }

            ReplyService = response.ReplyService;
            GenSTS       = response.GeneralStatus;

            ServiceReplies = new List <ServiceReply>();

            if (response.ResponseData != null)
            {
                Expand(response.ResponseData);
            }
        }
Exemplo n.º 2
0
        private static EncapsReply SendData(string data, EncapsCommand cmd = EncapsCommand.NOP)
        {
            byte[]       bytes = Encoding.Default.GetBytes(data);
            EncapsPacket request;

            switch (cmd)
            {
            case EncapsCommand.UnRegisterSession:
                request = EncapsPacketFactory.CreateUnRegisterSession(_si.SessionHandle, _si.SenderContext);
                break;

            default:
                request = EncapsPacketFactory.CreateNOP(bytes);
                break;
            }
            //var request = new EncapsPacket();
            //request.EncapsData = bytes;
            //request.Length = (ushort)data.Length;
            //request.Command = (ushort)cmd;
            var msg   = request.Pack();
            var ar    = _si.SendData_WaitReply(msg);
            var reply = new EncapsReply();
            int tmp;

            if (ar != null)
            {
                reply.Expand(ar, 0, out tmp);
            }
            return(reply);
        }
Exemplo n.º 3
0
        public static ReadDataServiceReply ReadLogixDataFragment(SessionInfo si, string tagAddress, ushort elementCount, object syncRoot) //ToDo syncRoot
        {
            int requestSize = 0;
            ReadDataServiceRequest request = BuildLogixReadDataRequestFragment(tagAddress, elementCount, out requestSize);

            EncapsRRData rrData = new EncapsRRData();

            rrData.CPF             = new CommonPacket();
            rrData.CPF.AddressItem = CommonPacketItem.GetConnectedAddressItem(si.ConnectionParameters.O2T_CID);
            rrData.CPF.DataItem    = CommonPacketItem.GetConnectedDataItem(request.Pack(), SequenceNumberGenerator.SequenceNumber(syncRoot));
            rrData.Timeout         = 2000;

            EncapsReply reply = si.SendUnitData(rrData.CPF.AddressItem, rrData.CPF.DataItem);

            if (reply == null)
            {
                return(null);
            }

            if (reply.Status != 0 && reply.Status != 0x06)
            {
                //si.LastSessionError = (int)reply.Status;
                return(null);
            }

            return(new ReadDataServiceReply(reply));
        }
Exemplo n.º 4
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);
            }
        }
Exemplo n.º 5
0
        public static WriteDataServiceReply WriteLogixData(SessionInfo si, string tagAddress, ushort dataType, ushort elementCount, byte[] data, object syncRoot, ushort structHandle = 0x0000) //ToDo syncRoot
#endif
        {
            WriteDataServiceRequest request = BuildLogixWriteDataRequest(tagAddress, dataType, elementCount, data, structHandle);

            EncapsRRData rrData = new EncapsRRData();

            rrData.CPF             = new CommonPacket();
            rrData.CPF.AddressItem = CommonPacketItem.GetConnectedAddressItem(si.ConnectionParameters.O2T_CID);
            rrData.CPF.DataItem    = CommonPacketItem.GetConnectedDataItem(request.Pack(), SequenceNumberGenerator.SequenceNumber(syncRoot));
            rrData.Timeout         = 2000;

            EncapsReply reply = si.SendUnitData(rrData.CPF.AddressItem, rrData.CPF.DataItem);

            if (reply == null)
            {
                return(null);
            }

            if (reply.Status != 0)
            {
                return(null);
            }

            return(new WriteDataServiceReply(reply));
        }
Exemplo n.º 6
0
        /// <summary>
        /// Closes a connection that was open with ForwardOpen or ConnectOverControlNet
        /// </summary>
        /// <param name="si">Session Info</param>
        /// <param name="Path">Path to the target</param>
        /// <returns>True if the request was successful, false otherwise</returns>
        public static bool ForwardClose(SessionInfo si, byte[] Path)
        {
            ForwardCloseRequest request = new ForwardCloseRequest();

            request.ConnectionSerialNumber = si.ConnectionParameters.ConnectionSerialNumber;
            request.VendorId = si.ConnectionParameters.VendorID;
            request.OriginatorSerialNumber = si.ConnectionParameters.OriginatorSerialNumber;
            byte[] tPath = new byte[Path.Length + CommonPaths.Router.Length];
            Buffer.BlockCopy(Path, 0, tPath, 0, Path.Length);
            Buffer.BlockCopy(CommonPaths.Router, 0, tPath, Path.Length, CommonPaths.Router.Length);
            request.Path = tPath;

            EncapsReply response = MessageRouter.SendMR_Request(si, (byte)ConnectionManagerService.ForwardClose, CommonPaths.ConnectionManager,
                                                                request.Pack());

            if (response == null)
            {
                return(false);
            }

            if (response.Status == 0)
            {
                return(true);
            }

            return(false);
        }
Exemplo n.º 7
0
        public static EncapsReply SendMR_Request(Eip.SessionInfo session, MessageRouterRequest request)
        {
            CommonPacketItem dataItem = CommonPacketItem.GetUnconnectedDataItem(request.Pack());

            EncapsReply response = session.SendRRData(CommonPacketItem.GetNullAddressItem(), dataItem);

            return(response);
        }
Exemplo n.º 8
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);
            }
        }
Exemplo n.º 9
0
        public ReadDataServiceReply(EncapsReply reply)
        {
            //First we have to get the data item...
            EncapsRRData rrData = new EncapsRRData();

            CommonPacket cpf  = new CommonPacket();
            int          temp = 0;

            rrData.Expand(reply.EncapsData, 0, out temp);
            cpf = rrData.CPF;

            //The data item contains the information in an MR_Response
            MR_Response response = new MR_Response();

            response.Expand(cpf.DataItem.Data, 2, out temp);

            Service = response.ReplyService;
            Status  = response.GeneralStatus;

            byte[] bbTemp = new byte[4];
            Buffer.BlockCopy(BitConverter.GetBytes(Status), 0, bbTemp, 0, 2);

            if (Status == 0xFF)
            {
                if (response.AdditionalStatus_Size > 0)
                {
                    Buffer.BlockCopy(response.AdditionalStatus, 0, bbTemp, 2, 2);
                }
            }

            ByteStatus = bbTemp;

            //Now check the response code...
            if (response.GeneralStatus != 0 && response.GeneralStatus != 0x06)
            {
                return;
            }

            if (response.ResponseData != null)
            {
                //Now we suck out the data type...
                DataType = BitConverter.ToUInt16(response.ResponseData, 0);
                byte[] tempB = new byte[response.ResponseData.Length - 2];
                Buffer.BlockCopy(response.ResponseData, 2, tempB, 0, tempB.Length);
                Data = tempB;
            }
            else
            {
                DataType = 0x0000;
            }
        }
        public ReadDataServiceReply(EncapsReply reply)
        {
            //First we have to get the data item...
            EncapsRRData rrData = new EncapsRRData();

            CommonPacket cpf = new CommonPacket();
            int temp = 0;
            rrData.Expand(reply.EncapsData, 0, out temp);
            cpf = rrData.CPF;

            //The data item contains the information in an MR_Response
            MR_Response response = new MR_Response();
            response.Expand(cpf.DataItem.Data, 2, out temp);

            Service = response.ReplyService;
            Status = response.GeneralStatus;

            byte[] bbTemp = new byte[4];
            Buffer.BlockCopy(BitConverter.GetBytes(Status), 0, bbTemp, 0, 2);

            if (Status == 0xFF)
            {
                if (response.AdditionalStatus_Size > 0)
                    Buffer.BlockCopy(response.AdditionalStatus, 0, bbTemp, 2, 2);
            }

            ByteStatus = bbTemp;

            //Now check the response code...
            if (response.GeneralStatus != 0 && response.GeneralStatus != 0x06)
                return;

            if (response.ResponseData != null)
            {
                //Now we suck out the data type...
                DataType = BitConverter.ToUInt16(response.ResponseData, 0);
                byte[] tempB = new byte[response.ResponseData.Length - 2];
                Buffer.BlockCopy(response.ResponseData, 2, tempB, 0, tempB.Length);
                Data = tempB;
            }
            else
            {
                DataType = 0x0000;
            }
        }
        public WriteDataServiceReply(EncapsReply reply)
        {
            EncapsRRData rrData = new EncapsRRData();

            CommonPacket cpf = new CommonPacket();
            int temp = 0;
            rrData.Expand(reply.EncapsData, 0, out temp);
            cpf = rrData.CPF;

            MR_Response response = new MR_Response();
            response.Expand(cpf.DataItem.Data, 2, out temp);

            if (response.GeneralStatus != 0)
                return;

            Service = response.ReplyService;
            Status = response.GeneralStatus;
        }
Exemplo n.º 12
0
        private void UpdateState()
        {
            EncapsRRData rrData = new EncapsRRData();

            rrData.CPF             = new CommonPacket();
            rrData.CPF.AddressItem = CommonPacketItem.GetNullAddressItem();

            UnconnectedSend ucmm = new UnconnectedSend();

            ucmm.RequestPath                 = CommonPaths.ConnectionManager;
            ucmm.RoutePath                   = _path;
            ucmm.Priority_TimeTick           = _session.ConnectionParameters.PriorityAndTick;
            ucmm.Timeout_Ticks               = _session.ConnectionParameters.ConnectionTimeoutTicks;
            ucmm.MessageRequest              = new MR_Request();
            ucmm.MessageRequest.Service      = 0x03;
            ucmm.MessageRequest.Request_Path = CommonPaths.IdentityObject;
            ucmm.MessageRequest.Request_Data = new byte[] { 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00 };
            rrData.CPF.DataItem              = CommonPacketItem.GetUnconnectedDataItem(ucmm.Pack());

            EncapsReply reply = _session.SendRRData(rrData.CPF.AddressItem, rrData.CPF.DataItem);

            if (reply == null)
            {
                return;
            }

            if (reply.Status == 0)
            {
                UnconnectedSendReply ucReply = reply;

                if (ucReply.GeneralStatus == 0x00)
                {
                    UnconnectedSendReply_Success succReply = ucReply as UnconnectedSendReply_Success;
                    DecodeAttributeReply(succReply.ServiceResponse);
                }
                else
                {
                    //Failed, for some reason...
                    //TODO: Decipher the code and add it to the error property
                }
            }
        }
        public WriteDataServiceReply(EncapsReply reply)
        {
            EncapsRRData rrData = new EncapsRRData();

            CommonPacket cpf  = new CommonPacket();
            int          temp = 0;

            rrData.Expand(reply.EncapsData, 0, out temp);
            cpf = rrData.CPF;

            MessageRouterResponse response = new MessageRouterResponse();

            response.Expand(cpf.DataItem.Data, 2, out temp);

            if (response.GeneralStatus != 0)
            {
                return;
            }

            Service = response.ReplyService;
            Status  = response.GeneralStatus;
        }
Exemplo n.º 14
0
        private void WriteAll()
        {
            //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);

                EncapsReply reply = _parent.SessionInfo.SendUnitData(addressItem, dataItem);

                if (reply != null)
                {
                    MultiServiceReply msReply = new MultiServiceReply(reply);

                    DecodeWriteReply(i, msReply);
                }
            }
        }
        public MultiServiceReply(EncapsReply reply)
        {
            EncapsRRData rrData = new EncapsRRData();
            CommonPacket cpf = new CommonPacket();

            int temp = 0;
            rrData.Expand(reply.EncapsData, 0, out temp);
            cpf = rrData.CPF;

            MR_Response response = new MR_Response();
            response.Expand(cpf.DataItem.Data, 2, out temp);

            if (response.GeneralStatus == 0x1E)
                IsPartial = true;

            ReplyService = response.ReplyService;
            GenSTS = response.GeneralStatus;

            ServiceReplies = new List<ServiceReply>();

            if (response.ResponseData != null)
                Expand(response.ResponseData);
        }
Exemplo n.º 16
0
        private void AddOrCreateReadPacket(LogixTag tag, int idx)
        {
            //First we create the request...
            int temp = 0;
            ReadDataServiceRequest request = LogixServices.BuildLogixReadDataRequest(
                tag.Address, tag.Elements, out temp);

            //Now we read it from the PLC to find out if it's fragmented...
            CommonPacketItem addressItem = CommonPacketItem.GetConnectedAddressItem(_parent.SessionInfo.ConnectionParameters.O2T_CID);
            CommonPacketItem dataItem    = CommonPacketItem.GetConnectedDataItem(request.Pack(), SequenceNumberGenerator.SequenceNumber(_parent.SyncRoot)); //ToDo _parent.SyncRoot

            EncapsReply reply = _parent.SessionInfo.SendUnitData(addressItem, dataItem);

            if (reply != null)
            {
                //It's a good tag, let's figure out if it's fragmented...
                ReadDataServiceReply rdReply = new ReadDataServiceReply(reply);

                PacketMap pm = new PacketMap()
                {
                    TagIndex = idx
                };
                pm.PacketIndex  = new List <int>();
                pm.ServiceIndex = new List <int>();
                pm.Offsets      = new List <uint>();
                pm.NumReplies   = 1;

                if (rdReply.Status == 0x06)
                {
                    //Partial read... We'll have to request more data, but first let's make this packet
                    request = LogixServices.BuildFragmentedReadDataRequest(tag.Address, tag.Elements,
                                                                           0, out temp);
                    int[] status = FindPacketOrCreate(request.Pack(), (ushort)(rdReply.Data.Length + 2));
                    uint  offset = (uint)rdReply.Data.Length;
                    pm.PacketIndex.Add(status[0]);
                    pm.ServiceIndex.Add(status[1]);
                    pm.Offsets.Add(0);

                    while (rdReply.Status == 0x06)
                    {
                        rdReply = LogixServices.ReadLogixDataFragmented(_parent.SessionInfo, tag.Address, tag.Elements,
                                                                        offset, _parent.SyncRoot); //ToDo _parent.SyncRoot
                        request = LogixServices.BuildFragmentedReadDataRequest(tag.Address, tag.Elements,
                                                                               offset, out temp);
                        status = FindPacketOrCreate(request.Pack(), (ushort)(rdReply.Data.Length + 2));
                        pm.PacketIndex.Add(status[0]);
                        pm.ServiceIndex.Add(status[1]);
                        offset += (uint)rdReply.Data.Length;
                        pm.Offsets.Add(offset);
                        pm.NumReplies++;
                    }
                }
                else if (rdReply.Status == 0x00 && rdReply.Data != null)
                {
                    //Full read, create the packet...
                    int[] status = FindPacketOrCreate(request.Pack(), (ushort)(rdReply.Data.Length + 2));
                    pm.PacketIndex.Add(status[0]);
                    pm.ServiceIndex.Add(status[1]);
                    pm.Offsets.Add(0);
                }

                _readPackets.Add(pm);
            }
        }
Exemplo n.º 17
0
        /// <summary>
        /// Forward Open Request
        /// </summary>
        /// <param name="si">Session Info</param>
        /// <param name="Path">Path to the target</param>
        /// <param name="O2T_Params">O2T_Params, leave as zero to automatically select</param>
        /// <returns>True if the ForwardOpen request was successful, false otherwise</returns>
        public static bool ForwardOpen(SessionInfo si, byte[] Path, short O2T_Params = 0)
        {
            ForwardOpenRequest fwdRequest = new ForwardOpenRequest(si.ConnectionParameters);

            fwdRequest.ConnectionTimeoutMultiplier = 0;

            if (O2T_Params == 0)
            {
                fwdRequest.O2T_ConnectionParameters = unchecked ((short)(NetworkConnectionParams.Owned |        //NA
                                                                         NetworkConnectionParams.Point2Point |  //Point2Point
                                                                         NetworkConnectionParams.HighPriority | //LowPriority
                                                                         NetworkConnectionParams.Variable |     //Variable
                                                                         508));                                 //508 uS
                fwdRequest.T2O_ConnectionParameters = fwdRequest.O2T_ConnectionParameters;
            }
            else
            {
                fwdRequest.O2T_ConnectionParameters = O2T_Params;
                fwdRequest.T2O_ConnectionParameters = O2T_Params;
            }

            //fwdRequest.O2T_RPI = 10000000;
            fwdRequest.O2T_RPI          = 2000;
            fwdRequest.T2O_RPI          = fwdRequest.O2T_RPI;
            fwdRequest.TransportTrigger = NetworkConnectionParams.CM_Transp_IsServer |      //CM_Transp_IsServer
                                          3 |
                                          NetworkConnectionParams.CM_Trig_App;
            fwdRequest.TransportTrigger = 0xA3;
            fwdRequest.Connection_Path  = Path;

            EncapsReply response = MessageRouter.SendMR_Request(si, (byte)ConnectionManagerService.ForwardOpen, CommonPaths.ConnectionManager,
                                                                fwdRequest.Pack());

            if (response == null)
            {
                return(false);
            }

            //Need to check the last codes...
            si.LastSessionError = (int)response.Status;

            //We actually need to find out if this is a success or failure...
            ForwardOpenReply fReply = response;

            if (fReply is ForwardOpenReply_Fail)
            {
                return(false);
            }

            //Need to copy some data into the connection parameters...
            ForwardOpenReply_Success fSucc = (ForwardOpenReply_Success)fReply;

            ConnectionParameters cParams = si.ConnectionParameters;

            cParams.O2T_CID         = fSucc.O2T_ConnectionId;
            cParams.T2O_CID         = fSucc.T2O_ConnectionId;
            cParams.O2T_API         = fSucc.O2T_API;
            cParams.T2O_API         = fSucc.T2O_API;
            si.ConnectionParameters = cParams;


            if (response.Status == 0)
            {
                return(true);
            }

            return(false);
        }
Exemplo n.º 18
0
        private List <LogixTagInfo> GetTagInfo()
        {
            CommonPacketItem addressItem = CommonPacketItem.GetNullAddressItem();

            UnconnectedSend ucmm = new UnconnectedSend();

            ucmm.RequestPath       = CommonPaths.ConnectionManager;
            ucmm.RoutePath         = _path;
            ucmm.Priority_TimeTick = _session.ConnectionParameters.PriorityAndTick;
            ucmm.Timeout_Ticks     = _session.ConnectionParameters.ConnectionTimeoutTicks;

            ucmm.MessageRequest              = new MR_Request();
            ucmm.MessageRequest.Service      = 0x55;
            ucmm.MessageRequest.Request_Path = new byte[] { 0x20, 0x6B, 0x25, 0x00, 0x00, 0x00 };       //Last 2 bytes are the offset...
            ucmm.MessageRequest.Request_Data = new byte[] { 0x04, 0x00, 0x02, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00 };

            CommonPacketItem dataItem = CommonPacketItem.GetUnconnectedDataItem(ucmm.Pack());

            EncapsReply reply = _session.SendRRData(addressItem, dataItem);

            List <LogixTagInfo> retVal = new List <LogixTagInfo>();

            if (reply.Status == 0)
            {
                UnconnectedSendReply ucReply = reply;

                if (ucReply.GeneralStatus == 0x00 || ucReply.GeneralStatus == 0x06)
                {
                    UnconnectedSendReply_Success succReply = ucReply as UnconnectedSendReply_Success;
                    List <byte> replyBytes = new List <byte>();
                    uint        lastOffset = 0x0000;

                    retVal.AddRange(DecodeTagInfo(succReply.ServiceResponse, out lastOffset));

                    while (ucReply.GeneralStatus == 0x06)
                    {
                        lastOffset += 1;
                        if (lastOffset <= 0xFFFF)
                        {
                            Buffer.BlockCopy(BitConverter.GetBytes((ushort)lastOffset), 0, ucmm.MessageRequest.Request_Path, 4, 2);
                        }
                        else
                        {
                            byte[] tempPath = new byte[8];
                            Buffer.BlockCopy(ucmm.MessageRequest.Request_Path, 0, tempPath, 0, 6);
                            Buffer.BlockCopy(BitConverter.GetBytes(lastOffset), 0, tempPath, 4, 4);
                            ucmm.MessageRequest.Request_Path = tempPath;
                        }

                        dataItem = CommonPacketItem.GetUnconnectedDataItem(ucmm.Pack());

                        reply = _session.SendRRData(addressItem, dataItem);

                        if (reply.Status == 0x00)
                        {
                            ucReply = reply;

                            if (ucReply.GeneralStatus == 0x00 || ucReply.GeneralStatus == 0x06)
                            {
                                succReply = ucReply as UnconnectedSendReply_Success;
                                retVal.AddRange(DecodeTagInfo(succReply.ServiceResponse, out lastOffset));
                            }
                        }
                    }
                }
            }

            return(retVal);
        }