Python實現模擬Modbus Master遍歷測試Modbus Slave IP是否連通

項目需求,又來搞一下python。


需要模擬Modbus Master連接底層設備,測試所有配置的工廠的IP是否通,其實就是模擬Modbus Master和Modbus Slave之間的通信。因爲底層設備不穩定,需要每天測一遍所有IP,共差不多200個IP,當然要自動化腳本實現。突然很理解之前的Manager對自動化的熱衷。


# encoding: utf-8 

import sys
import struct
import modbus_tk.defines as cst
import modbus_tk.modbus
import modbus_tk.modbus_tcp
import string
import time
import threading
import logging
import logging.handlers
import socket

# 對logging級別的分類
# 默認的等級是WARNING,也就是說logging函數在沒有特別配置的前提下只追蹤比WARNING程度更嚴重的異常
# LEVELS={'notset':logging.DEBUG,  
  
#         'debug':logging.DEBUG,  
  
#         'info':logging.INFO,  
  
#         'warning':logging.WARNING,  
  
#         'error':logging.ERROR,  
  
#         'critical':logging.CRITICAL} 


# define the log file, file mode and logging level
logging.basicConfig(filename='testIP.log', filemode="w", level=logging.debug)

# 通過modbus_tk封裝的logger,控制檯和文本都會有輸出,而logging輸出只將log輸出到文本,控制檯不會有打印
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s'
logger = modbus_tk.utils.create_logger(name="console", record_format=fmt)

class MyThread1(threading.Thread):
    
    def __init__(self, name, counter, host):
        threading.Thread.__init__(self)
        self.name = name
        self.counter = counter
        self.host = host
    def run(self):
        #print "Starting " + self.name

        # 連接MODBUS TCP從機,host參數爲slave的IP地址
        master = modbus_tk.modbus_tcp.TcpMaster(host=self.host)
        master.set_timeout(3.0)
        try:
            # 讀保持寄存器
            # logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 26))
            # logger.info(self.host + " is connected")
            # 此處用logging,防止控制檯大面積打印,把所有內容都打印到log文件,只把exception打印到控制檯
            logging.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 26))
            logging.info(self.host + " is connected")
        except socket.timeout:   # connection timeout exception
            logger.info((self.host + " is not connected=========="))
        except Exception, e:   # 捕獲除了連接異常之外的其它異常
            print repr(e)
            logger.info(self.host + "===============Exception====================")
        finally:
            print "Exiting " + self.name


# 啓用多線程,可同時對for循環中的每個IP地址進行連接測試,而避免如果一個IP連接不通則整個for循環就中途停止
for i in range(100, 125):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()

for i in range(130, 150):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()

for i in range(10, 35):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()

for i in range(60, 72):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()

for i in range(40, 49):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()

for i in range(50, 56):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()

for i in range(75, 97):
    hostIP = "192.168.251." + str(i)
    thread1 = MyThread1("Thread-"+str(i), (i-99), hostIP)
    thread1.start()


註釋已經很詳細啦,現在忘性大~

再說明一點,和Modbus相關的代碼其實就下面這三行,其他都是用來實現遍歷,多進程和日誌打印。

master = modbus_tk.modbus_tcp.TcpMaster(host=self.host)
master.set_timeout(3.0)
master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 26)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章