前提・実現したいこと
ファンクションジェネレーターをPythonを用いて制御させるシステムを作成しています。
Excelの表から周波数と振幅の値を抜き出して、
その値でファンクションジェネレーターの各コマンドから制御しようと思っています。
下記表のNo1なら、周波数と振幅を10に設定する。
プログラミング苦手なうえにPython初めてでベースのものを参考に自分で書き換えていますが、Excelから値を抜き出してくる部分で手間取っています。
Excelの表から列を読み込むことはできてると思いますが、そこからがわからなくなっています。
現在考えているのは、No1までは手動でファンクションジェネレーターの設定をし、
Pythonを実行させたらNo2の設定にする。
またPythonを実行させたらNo3の設定にする。
というようなプログラムを作成したいです。
ファンクションジェネレーターのコマンドについては下記のサイト等を参考に作成しています。
https://teledynelecroy.com/japan/pdf/support/t3awg3kseries-afg-pm-jp.pdf
ファンクションジェネレーターの動作については、中心周波数と振幅のみの変更ができればとりあえずはいいと思っています。
Excelの表は下記のようになっています。
No | 周波数 | 振幅 |
---|---|---|
1 | 10 | 10 |
2 | 20 | 20 |
3 | 30 | 30 |
・ | ||
・ | ||
・ |
該当のソースコード
Python
#(FG_test1.py) import os import subprocess import re import time import numpy as np import openpyxl #import pymsteams from FUNCTIONGENERATOR import FUNCTIONGENERATOR #--------------------------------------------- # # 機能ON/OFF # #--------------------------------------------- GPIB_DEVICE_FUNCTIONGENERATOR_ON = True #--------------------------------------------- # # 初期設定 # #--------------------------------------------- ## 評価項目Excelの絶対パスを"path(str型)"に記入 path = './FG_test.xlsx' ## 評価項目Excelのシート名を"sheet_name(str型)"に記入 sheet_name = 'test' ## 読み込み始める行番号を指定。最初から処理する場合は5行目を指定すること。 start_row = 2 ## FUNCTIONGENERATORのインスタンス"FG"を生成 if GPIB_DEVICE_FUNCTIONGENERATOR_ON : FG = FG_test2() #--------------------------------------------- # シートデータ"sheet"、最大行"sheet.max_row"、 # 最大列"sheet.max_column"を取得する #--------------------------------------------- def OpenExcel(path): wb = openpyxl.load_workbook(path, data_only=True) sheet = wb[sheet_name] return sheet,sheet.max_row,sheet.max_column #--------------------------------------------- # Excelシートデータから取得波形設定を読み込み # No、中心周波数(freq)、振幅(ampl)をExcelから取得する #--------------------------------------------- def ReadWaveformSettings(sheet, i): No = int(sheet.cell(row=i, column=1).value) freq = int(sheet.cell(row=i, column=2).value) ampl = int(sheet.cell(row=i, column=3).value) return freq, ampl #--------------------------------------------- # main関数 # forループは評価項目Excelの最終行"max_row"まで実行される #--------------------------------------------- def main(): ## 評価項目エクセルを開く sheet, max_row, max_column = OpenExcel(path) Range = np.arange(start_row, max_row+1) ## No、中心周波数(freq)、振幅(ampl)をExcelから読み出す No, freq, ampl = ReadWaveformSettings(sheet, i) if GPIB_DEVICE_FUNCTIONGENERATOR_ON : #現在の設定の照会 #FG.inquiry() #設定の初期化 #FG.Initialize() ##周波数、振幅、位相、オフセットの設定 FG.setting( , ) if GPIB_DEVICE_FUNCTIONGENERATOR_ON : FG.close() print("") print("--- Finish All Processes ---") #--------------------------------------------- # # 実行部 # #--------------------------------------------- if __name__ == "__main__" : print("-----------------------------------------") print("--- Check FUNCTIONGENERATOR ON ---") print("-----------------------------------------") main() #(FG_test2.py) # -*- coding: utf-8 -*- import sys import time import pyvisa as visa VISA_LIB_PATH = 'C:\\Windows\\System32\\visa32.dll' TIMEOUT = 10000 class FUNCTIONGENERATOR : def __init__( self ) : self.RsrcMgr = visa.ResourceManager( VISA_LIB_PATH ) self.Inst = None def open( self, gpibId ) : address = 'GPIB0::' + str( gpibId ) + '::INSTR' self.Inst = self.RsrcMgr.open_resource( address ) self.Inst.timeout = TIMEOUT def close( self ) : ret = self.Inst.close() # print( ret ) def scan( self ) : self.RsrcMgr.list_resources() # 最初にScanしないとエラーが発生するので一回実行 def Initialize(self): seif.Inst.write("*RST") #設定の初期化 def inquiry(self): #現在の設定の照会 seif.Inst.read("FREQUENCY?") #周波数の照会 seif.Inst.read("VOLTAGE:AMPLITUDE?") #振幅の照会 def setting( self , fre , amp ) : #周波数、振幅、位相、オフセットの設定 seif.Inst.write("FREQUENCY freE3") #周波数の設定 seif.Inst.write("VOLTAGE:AMPLITUDE amp") #振幅の設定 seif.Inst.write("VOLTAGE:OFFSET 0.00") #オフセットの設定 seif.Inst.write("PHASE:ADJUST 0DEG") #位相の設定 def main() : argv = sys.argv argc = len( argv ) FG = FUNCTIONGENERATOR() if argc == 1 : print( FG.scan() ) sys.exit() devId = argv[1] argf = arga = FG.open( devId ) #FG.inquiry() #現在の設定の照会 #FG.Initialize() #設定の初期化 FG.setting( argf , arga ) #周波数、振幅、位相、オフセットの設定 FG.close() if __name__ == "__main__" : main()
まだ回答がついていません
会員登録して回答してみよう