public static ReadDataServiceReply ReadLogixData(SessionInfo si, string tagAddress, ushort elementCount) { int requestSize = 0; ReadDataServiceRequest request = BuildLogixReadDataRequest(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); 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)); }
internal void GenerateRequests() { int rSize = 0; _readRequest = LogixServices.BuildLogixReadDataRequest(_address, _elements, out rSize); _writeRequest = LogixServices.BuildLogixWriteDataRequest(_address, _dataType, _elements, new byte[] { }); }
public static ReadDataServiceRequest BuildLogixReadDataRequest(string tagAddress, ushort number, out int requestSize) { byte[] newIOI = IOI.BuildIOI(tagAddress); int pathLen = newIOI.Length;// IOI.BuildIOI(null, tagAddress); ReadDataServiceRequest request = new ReadDataServiceRequest(); request.Service = (byte)ControlNetService.CIP_ReadData; request.PathSize = (byte)(pathLen / 2); byte[] path = new byte[pathLen]; Buffer.BlockCopy(newIOI, 0, path, 0, newIOI.Length); //IOI.BuildIOI(path, tagAddress); request.Path = path; request.Elements = number; requestSize = request.Size; return request; }
public static ReadDataServiceRequest BuildFragmentedReadDataRequest(string tagAddress, ushort number, uint offset, out int requestSize) { byte[] newIOI = IOI.BuildIOI(tagAddress); int pathLen = newIOI.Length;// IOI.BuildIOI(null, tagAddress); ReadDataServiceRequest request = new ReadDataServiceRequest(); request.Service = (byte)ControlNetService.CIP_ReadDataFragmented; request.PathSize = (byte)(pathLen / 2); request.IsFragmented = true; request.DataOffset = offset; byte[] path = new byte[pathLen]; Buffer.BlockCopy(newIOI, 0, path, 0, newIOI.Length); //IOI.BuildIOI(path, tagAddress); request.Path = path; request.Elements = number; requestSize = request.Size; return(request); }
public static ReadDataServiceRequest BuildShortReadDataRequest(uint tagInstance, ushort number, ushort size, out int requestSize) { byte[] newIOI = IOI.BuildIOI(tagInstance); int pathLen = newIOI.Length; ReadDataServiceRequest request = new ReadDataServiceRequest(); request.Service = 0x4E;// (byte)ControlNetService.CIP_ReadData; request.PathSize = 0x03; byte[] path = new byte[] { 0x20, 0xB2, 0x25, 0x00, 0x21, 0x00 }; request.Path = path; request.Elements = number; byte[] addData = new byte[10 + newIOI.Length]; addData[0] = 0x02; addData[1] = 0x00; addData[2] = 0x01; addData[3] = 0x01; addData[4] = 0x01; addData[5] = (byte)(size & 0xFF); addData[6] = (byte)((size & 0xFF00) >> 8); addData[7] = 0x03; addData[8] = 0x20; addData[9] = 0x6B; Buffer.BlockCopy(newIOI, 0, addData, 10, newIOI.Length); request.AddtlData = addData; requestSize = request.Size; return request; }
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); 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); 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); } }