-
Notifications
You must be signed in to change notification settings - Fork 5
/
register_scanner.py
151 lines (130 loc) · 5.66 KB
/
register_scanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
from pyModbusTCP.client import ModbusClient
from xlwt import Workbook
import sys
import argparse
from tqdm import tqdm
#Function to write single Holding Register
def write_single_hold_regiser(ip_addr,port,valid_list,permission_list):
write_confirm_list=[]
write_confirm_data=[]
client=ModbusClient(host=ip_addr,port=port,auto_open=True,auto_close=True,timeout=10)
for i in tqdm(valid_list):
data=client.write_single_register(i,43981) # HEX(ABCD) == int(43981)
data=client.read_holding_registers(i,1)
#print("Regiser: "+str(i)+" => Value: "+str(data))
if data[0]:
if 43981==data[0]:
write_confirm_list.append(i)
write_confirm_data.append(data[0])
permission_list[i-1]="Read/Write"
client.close()
return write_confirm_list,write_confirm_data,permission_list
#Function to write single coil
def write_single_coil_regiser(ip_addr,port,coil_valid_list):
write_coil_confirm_list=[]
write_coil_confirm_data=[]
client=ModbusClient(host=ip_addr,port=port,auto_open=True,auto_close=True,timeout=10)
for i in hold_valid_list:
data=client.write_single_register(i,43981) # HEX(ABCD) == int(43981)
data=client.read_holding_registers(i,1)
#print("Regiser: "+str(i)+" => Value: "+str(data))
if data[0]:
if 43981==data[0]:
write_coil_confirm_list.append(i)
write_coil_confirm_data.append(data[0])
client.close()
return write_coil_confirm_list,write_coil_confirm_data
#Function to read all the registers based on the parameter received
def read_valid_registers(ip_addr,port,reg):
valid_list=[]
data_list=[]
permission_list=[]
client=ModbusClient(host=ip_addr,port=port,auto_open=True,auto_close=True,timeout=10)
for i in tqdm(range(1,500)):
if reg == "hold":
data=client.read_holding_registers(i,1)
if reg == "input":
data=client.read_input_registers(i,1)
if reg == "discrete":
data=client.read_discrete_inputs(i,1)
if reg == "coil":
data=client.read_coils(i,1)
if data:
valid_list.append(i)
data_list.append(data[0])
permission_list.append("Read")
client.close()
return valid_list,data_list,permission_list
#Write the result to Excel File
def write_to_excel(wb,register,valid_list,data_list,permission_list,reg_value):
sheet=wb.add_sheet(register)
sheet.write(0,0,"Register")
sheet.write(0,1,"Permission")
sheet.write(0,2,"Data")
for i in range(len(valid_list)):
sheet.write(i+1,0,valid_list[i]+reg_value)
sheet.write(i+1,1,permission_list[i])
sheet.write(i+1,2,data_list[i])
wb.save("Modbus_Output.xls")
return wb
#
def print_details(valid_list,data_list,operation):
if valid_list:
print("******************************")
print(operation+" - Valid Registers: \n"+str(valid_list))
print("******************************")
print(operation+" - Valid Registers with Non-Zero Values")
print("******************************")
for i in range(len(valid_list)):
if data_list[i]:
print("Register :"+str(valid_list[i])+" => Value: "+str(data_list[i]))
print("******************************")
else:
print("******************************")
print("No Valid Register Found")
print("******************************")
#Parse the input parameters
my_parser = argparse.ArgumentParser(description='Pass the input IP Address')
my_parser.add_argument('-i','--ipaddress', action='store', type=str,required=True, help='Input IP Address')
my_parser.add_argument('-p','--port', action='store', type=int,required=True, help='Port Number')
args = my_parser.parse_args()
ip_addr=args.ipaddress
port=args.port
#Create workbook to save the result
wb=Workbook()
#Coils - valid and Data [Read and Write]
print("******************************")
print("Reading Coils Status - 0x01")
coil_valid_list,coil_data_list,coil_permission_list=read_valid_registers(ip_addr,port,"coil") #Function Code - 0x01
if coil_data_list:
print("Writing Coil Status - 0x05")
write_coil_valid_list,write_coil_data_list,coil_permission_list=write_single_coil_regiser(ip_addr,port,coil_valid_list) #Function Code - 0x05
else:
print("No valid Register Found to do Write Operation")
#print_details(coil_valid_list,coil_data_list,"Read")
wb=write_to_excel(wb,"Coil",coil_valid_list,coil_data_list,coil_permission_list,0)
#Holding Registers - valid and Data [Read and Write]
print("******************************")
print("Reading Holding Registers - 0x03")
hold_valid_list,hold_data_list,hold_permission_list=read_valid_registers(ip_addr,port,"hold") #Function Code - 0x03
#print_details(hold_valid_list,hold_data_list,"Read")
if hold_data_list:
print("Writing Holding Status - 0x06")
write_hold_valid_list,write_hold_data_list,hold_permission_list=write_single_hold_regiser(ip_addr,port,hold_valid_list,hold_permission_list) #Function Code - 0x06
else:
print("No valid Register Found to do Write Operation")
wb=write_to_excel(wb,"Holding_Register",hold_valid_list,hold_data_list,hold_permission_list,40000)
#Discrete Input - valid and Data [Read Only]
print("******************************")
print("Reading Discrete Input - 0x02")
discrete_valid_list,discrete_data_list,discrete_permission_list=read_valid_registers(ip_addr,port,"discrete") #Function Code - 0x02
#print_details(discrete_valid_list,discrete_data_list,"Read")
wb=write_to_excel(wb,"Discrete",discrete_valid_list,discrete_data_list,discrete_permission_list,10000)
#Read Input Registers - valid and Data [Read Only]
print("******************************")
print("Reading Input Registers - 0x04")
input_valid_list,input_data_list,input_permission_list=read_valid_registers(ip_addr,port,"input")
#print_details(input_valid_list,input_data_list,"Read")
wb=write_to_excel(wb,"Input_Register",input_valid_list,input_data_list,input_permission_list,30000)
print("******************************")
print("Check the output Excel File - Modbus_Output.xls")