From d57314a258c28183566460b5d9d4b3b90e58c81e Mon Sep 17 00:00:00 2001 From: Aldo Ansel Date: Mon, 22 Apr 2019 18:18:32 -0700 Subject: [PATCH] extended forward open is working --- pylogix/eip.py | 118 +++++++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 43 deletions(-) diff --git a/pylogix/eip.py b/pylogix/eip.py index 3cde008..d8617df 100644 --- a/pylogix/eip.py +++ b/pylogix/eip.py @@ -26,6 +26,7 @@ import sys import time +MAX_SOCKET_SIZE = 8192 programNames = [] class PLC: @@ -49,6 +50,7 @@ def __init__(self): self.SerialNumber = 0 self.OriginatorSerialNumber = 42 self.SequenceCounter = 1 + self.ConnectionSize = 500 self.Offset = 0 self.KnownTags = {} self.TagList = [] @@ -182,14 +184,14 @@ def Close(self): class LgxTag: def __init__(self): - self.TagName = '' - self.InstanceID = 0x00 - self.SymbolType = 0x00 - self.DataTypeValue = 0x00 - self.DataType = '' - self.Array = 0x00 - self.Struct = 0x00 - self.Size = 0x00 + self.TagName = '' + self.InstanceID = 0x00 + self.SymbolType = 0x00 + self.DataTypeValue = 0x00 + self.DataType = '' + self.Array = 0x00 + self.Struct = 0x00 + self.Size = 0x00 def _readTag(self, tag, elements, dt): ''' @@ -687,7 +689,7 @@ def _discover(): s.sendto(request, ('255.255.255.255', 44818)) try: while(1): - ret = s.recv(1024) + ret = s.recv(MAX_SOCKET_SIZE) context = unpack_from(' 4002: + self.ConnectionSize = 4002 + #per standard over 504 bytes is an extended (large) forward open + exForwardOpen = (self.ConnectionSize > 504) + CIPService = 0x54 if not exForwardOpen else 0x5B #forward open + CIPPathSize = 0x02 + CIPClassType = 0x20 + + CIPClass = 0x06 + CIPInstanceType = 0x24 + + CIPInstance = 0x01 + CIPPriority = 0x0A + CIPTimeoutTicks = 0x0E + CIPOTConnectionID = 0x20000002 + CIPTOConnectionID = 0x20000001 + self.SerialNumber = randrange(65000) + CIPConnectionSerialNumber = self.SerialNumber + CIPVendorID = self.VendorID + CIPOriginatorSerialNumber = self.OriginatorSerialNumber + CIPMultiplier = 0x03 + CIPOTRPI = 0x00201234 + #3-5.5.1.1 Network Connection Parameters + #default to 500,True,0,2,True 0x43f4 0b0100001111110100 + self.VariableConnectionSize = True #allow for variable connection size + self.Priority = 0 #low priority by default. 00 = Low Priority, 01 = High Priority, 10 = Scheduled, 11 = Urgent + self.ConnectionType = 2 #point to point by default 00 = Null (may be used to reconfigure a connection), 01 = Multicast, 10 = Point to Point, 11 = Reserved + self.RedundantOwner = False #multiple connections allowed + + netParams = ((self.VariableConnectionSize << 9) | + (self.Priority << 10) | + (self.ConnectionType << 13) | + (self.RedundantOwner << 15)) + + #if using the extended forward open we need more bits for the connection size + #so add another word + if exForwardOpen: + netParams = ((self.ConnectionSize & 0xFFFF) | netParams << 16) + print 'Using extended forward open of size %d bytes' % self.ConnectionSize + else: + netParams = ((self.ConnectionSize & 0x01FF) | netParams) + self.NetworkConnectionParameters = netParams + #self.NetworkConnectionParameters = 0x43f4 + #print hex(self.NetworkConnectionParameters) + CIPOTNetworkConnectionParameters = self.NetworkConnectionParameters + CIPTORPI = 0x00204001 - CIPTONetworkConnectionParameters = 0x43f4 + CIPTONetworkConnectionParameters = self.NetworkConnectionParameters CIPTransportTrigger = 0xA3 - - ForwardOpen = pack('