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); } }
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); }
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)); }
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); } }
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)); }
/// <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); }
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); }
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); } }
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; }
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; }
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); }
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); } }
/// <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); }
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); }