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)); }
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); } }
/// <summary> /// Sets the processor to be in the PROGRAM mode /// </summary> /// <remarks>The keyswitch must be in the REM position for this to work.</remarks> public void SetProgramMode() { //lock (_lockObject) { CommonPacket cpf = new CommonPacket(); cpf.AddressItem = CommonPacketItem.GetConnectedAddressItem(_session.ConnectionParameters.O2T_CID); byte[] request = new byte[] { 0x07, 0x02, 0x20, 0x8E, 0x24, 0x01 }; cpf.DataItem = CommonPacketItem.GetConnectedDataItem(request, SequenceNumberGenerator.SequenceNumber); _session.SendUnitData(cpf.AddressItem, cpf.DataItem); } }
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 } } }
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); } } }
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); } }
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); }