初心者向けプログラミング講座
第9回: 計測器の自動化システム構築

講座の概要については以下からご覧ください。
目的
この回では、計測器操作を自動化する具体的な方法を学びます。一連のプロセス(測定→データの処理→保存→レポート生成)をプログラムでシームレスに動かせるようにし、自動測定やデータ解析の効率化を目指します。また、複数の測定器を連携させる方法や、自動化における一般的な設計のポイントも学びます。
学習内容
- 自動化システムの基本概念
- システム構築の設計ポイント
- 測定プロセスの自動実行(PyVISAを使用)
- データ処理と保存の自動化
- レポート生成の自動化
- 実践プログラム例
- 演習問題
1. 自動化システムの基本概念
自動化システムとは
自動化システムとは、次のような一連の操作をプログラムでまとめて実現する仕組みです:
操作 | 概要 |
計測器の制御 | 様々な計測器をGP-IB、USBなどのインターフェースを介してコントロールします。 |
測定値の取得 | 計測器により測定した結果をインターフェースから取得します |
データの処理 | 取得した測定結果に対して良否判定などの処理を行います |
保存や可視化 | 測定結果を表示したり、ハードディスク等に保存します |
レポート生成 | 様々な測定結果を表やグラフ化などによりレポートを生成します。 |
こういったシステムを導入することで、以下のメリットがあります:
- 人的操作の削減
- 一貫した結果の取得
- 計測精度や生産性の向上
2. システム構築の設計ポイント
自動化システムを構築する際は、次のようなポイントを考慮する必要があります。
(1) プロセスの分割
システムは以下のようにプロセスを分割して設計します。
プロセス | 概要 |
入力 | 必要なパラメータや初期設定を外部から入力 |
測定 | 計測器の接続とデータ取得 |
データ処理 | 取得データの加工、解析 |
出力 | 成果物(CSV保存、グラフ作成、レポート生成など)の出力 |
(2) エラー処理
自動化では、計測器との接続エラーや測定値の異常が発生する可能性があります。そのため、エラー時の処理(例:リトライや終了の通知)を設計する必要があります。
例:エラー処理
計測器未接続の場合の再接続機能
データ取得失敗時のログ記録
try:
# 計測器へのコマンド送信
data = instrument.query("MEAS:VOLT?")
except Exception as e:
print("エラー発生:", e)
# 必要に応じて再接続処理を実装
(3) ログ記録と監視
長時間の自動測定では、「何が起きたのか」を記録するログ機能が必要です。テキストファイルで簡単に出力できる仕組みを用意しておくと便利です。
3. 測定プロセスの自動実行
計測器の自動制御には、PyVISAを使用します。以下は、測定プロセスを自動化する際の基本コードです。
(1) 計測器操作のループ化
ある時間間隔で連続して測定を実行する例を示します。
import pyvisa
import time
# PyVISAで計測器に接続
rm = pyvisa.ResourceManager()
resource_list = rm.list_resources()
print("接続可能なリソース:", resource_list)
if resource_list:
instrument = rm.open_resource(resource_list[0]) # 最初の機器に接続
print("計測器に接続しました:", instrument.query("*IDN?"))
# 自動測定ループ
measurement_count = 10 # 測定回数
interval = 1 # 測定間隔(秒)
measurements = []
for i in range(measurement_count):
try:
data = float(instrument.query("MEAS:VOLT?")) # 測定値取得
measurements.append(data)
print(f"測定{i+1}: {data:.2f} V")
time.sleep(interval) # 次の測定まで待つ
except Exception as e:
print("測定エラー:", e)
break
instrument.close()
else:
print("計測器が見つかりません。")
4. データ処理と保存の自動化
取得したデータをすぐに保存できるよう、自動的にCSVまたはログに書き込みます。
(1) CSVでの自動保存
測定値を取得するたびに、CSVファイルに追記します。
import csv
# 測定値をCSVファイルに記録
filename = "auto_measurements.csv"
with open(filename, "w", newline="") as file:
writer = csv.writer(file)
writer.writerow(["Measurement", "Voltage (V)"]) # ヘッダー
for i, value in enumerate(measurements):
writer.writerow([i+1, value]) # 測定値を書き込む
print(f"測定結果を {filename} に保存しました。")
5. レポート生成の自動化
(1) 自動レポート生成のフロー
グラフを自動作成してファイルに保存
測定データとグラフをPDFレポートにまとめる
(2) 自動レポート作成コード
例として、測定された電圧データをPDFレポートとしてまとめます。
from fpdf import FPDF
import matplotlib.pyplot as plt
# 測定データ
time_data = [i * 2 for i in range(len(measurements))] # 時間データ(2秒間隔)
voltage_data = measurements
# グラフ作成
plt.plot(time_data, voltage_data, label="Voltage (V)", color="blue")
plt.title("Measurement Results")
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.legend()
plt.grid()
plt.savefig("measurement_plot.png") # グラフを保存
plt.close()
# PDFレポート作成
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=16)
pdf.cell(200, 10, txt="Measurement Report", ln=True, align="C")
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Summary:", ln=True)
pdf.cell(200, 10, txt=f"Number of Measurements: {len(measurements)}", ln=True)
pdf.cell(200, 10, txt=f"Average Voltage: {sum(voltage_data)/len(voltage_data):.2f} V", ln=True)
pdf.cell(200, 10, txt=" ", ln=True) # 空白
pdf.image("measurement_plot.png", x=50, y=50, w=100) # グラフ挿入
pdf.output("measurement_report.pdf")
print("レポートが measurement_report.pdf に保存されました。")
6. 実践プログラム例
以下は、計測器を自動操作し、測定データの収集、処理、保存、レポート生成を行う統合的なプログラムの例です。
import pyvisa
import time
import csv
from fpdf import FPDF
import matplotlib.pyplot as plt
# PyVISA接続
rm = pyvisa.ResourceManager()
resources = rm.list_resources()
print("接続可能なリソース:", resources)
if resources:
instrument = rm.open_resource(resources[0])
print("計測器情報:", instrument.query("*IDN?"))
# 測定ループ
measurements = []
time_intervals = []
measurement_count = 10
interval = 1
print("測定を開始します...")
for i in range(measurement_count):
time_intervals.append(i * interval)
voltage = float(instrument.query("MEAS:VOLT?"))
measurements.append(voltage)
print(f"測定値{i+1}: {voltage:.2f} V")
time.sleep(interval)
instrument.close()
# データ保存(CSV)
with open("measurement_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerow(["Time (s)", "Voltage (V)"])
writer.writerows(zip(time_intervals, measurements))
# データ可視化
plt.plot(time_intervals, measurements, label="Voltage (V)", color="blue")
plt.title("Voltage Measurement Result")
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.legend()
plt.grid()
plt.savefig("measurement_plot.png")
plt.close()
# PDFレポート生成
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=16)
pdf.cell(200, 10, txt="Measurement Report", ln=True, align="C")
pdf.set_font("Arial", size=12)
avg_voltage = sum(measurements) / len(measurements)
pdf.cell(200, 10, txt=f"Average Voltage: {avg_voltage:.2f} V", ln=True)
pdf.image("measurement_plot.png", x=50, y=50, w=100)
pdf.output("report.pdf")
print("測定結果とレポートが保存されました。")
else:
print("計測器が見つかりません。")
7. 演習問題
演習問題 1: 自動測定システムの完成
上記のプログラムを参考に、次の機能を追加してください。解答例はありません。AIに聞くなど、何をしても構いません。プログラミングは実際に動かして結果を見ることが大事なので色々試してみてください。
測定エラーのログ記録機能(テキストファイルでエラーを書き込む)。
測定終了後に最大値と最小値を表示する。
演習問題 2: 複数計測器の制御
複数の計測器に接続し、それぞれ独立したデータセットを自動収集し、個別のレポートを生成できるようにプログラムを拡張してください。
次回予告
次回(第10回)は、自動測定システムの応用例について学びます。実際のユースケースを基に、複雑な連携操作やロギングシステム、GUIでの操作方法について取り組みます!