- 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")