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