項目需求,又來搞一下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)