【PyFMI】最小構成のMBD事例 第2章 その119【リアルタイム描画⑬】

【PyFMI】最小構成のMBD事例 第2章 その119【リアルタイム描画⑬】 事例
【PyFMI】最小構成のMBD事例 第2章 その119【リアルタイム描画⑬】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はtkinterのタイマ処理にmatplotlibへの描画を追加。

と言っても、コードを追加しただけで動作は見ていない。
よって、今回は実際の動作を確認してみる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

現状のソースコード

太郎くん
太郎くん

ここまで、いろいろコードを追加してきたと思うけど、
現状どういうことになってるんだろう?

フクさん
フクさん

前回のタイマ処理にsin波描画を追加した段階で以下になってるな。

import tkinter
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import time
import numpy as np

root = tkinter.Tk()
root.title("DC Motor Control")

w = root.winfo_screenwidth()
h = root.winfo_screenheight()

root.geometry(str(int(w/2))+"x"+str(int(h/2))+"+"+str(int(w/2))+"+0")


fig = plt.figure()
fig.set_size_inches(8.4, 4.5)
ax = plt.subplot(1,1,1)
ax.set_xlabel('Time')
ax.set_ylabel('Value')

# define plots
ax.plot([], [], label="target[rad/s]", color='Magenta',linewidth=3)
ax.plot([], [], label="voltage[V]", color='Red')
ax.plot([], [], label="speed[rad/s]", color='Blue',linewidth=0.9)
ax.plot([], [], label="loadTorqueStep.tau[N m]", color='Cyan')
ax.plot([], [], label="current[A]", color='Green',linestyle='--',linewidth=0.8)
ax.plot([], [], label="cpu_load[ms]", color='Black',linestyle='--',linewidth=1)

ax.legend(bbox_to_anchor=(1, 1), borderaxespad=0, fontsize=10)
ax.grid(which='both')

canvas = FigureCanvasTkAgg(fig, root)
canvas.get_tk_widget().pack(side = tkinter.RIGHT)

toolbar=NavigationToolbar2Tk(canvas, root)
toolbar.place(x=0, y=h/2-40)

scalbln = tkinter.BooleanVar()
scalbln.set(True)
chk = tkinter.Checkbutton(root, variable=scalbln, text="Enable Scale bar")
chk.place(x=0, y=10)

cpuloadbln = tkinter.BooleanVar()
cpuloadbln.set(False)
chk = tkinter.Checkbutton(root, variable=cpuloadbln, text="Enable Cpu Load")
chk.place(x=0, y=30)

pausebln = tkinter.BooleanVar()
pausebln.set(False)
chk = tkinter.Checkbutton(root, variable=pausebln, text="pause")
chk.place(x=0, y=50)

sinbln = tkinter.BooleanVar()
sinbln.set(False)
chk = tkinter.Checkbutton(root, variable=sinbln, text="sin wave")
chk.place(x=0, y=70)

sawtoothbln = tkinter.BooleanVar()
sawtoothbln.set(False)
chk = tkinter.Checkbutton(root, variable=sawtoothbln, text="Sawtooth wave")
chk.place(x=0, y=90)

def change(value):
    if scalbln.get():
        _ytmp = float(value)
        print(_ytmp)

scale = tkinter.Scale(
    root,
    label = "target Speed",
    orient=tkinter.VERTICAL,
    command=change,
    length = 300,
    from_ = 100,
    to = 0
    )
scale.pack(side = tkinter.LEFT)

def plot_handler():
        if pausebln.get() == False:
            times = np.linspace(time.perf_counter()-8, time.perf_counter(), 800)
            ax.lines[0].set_data( times, np.sin(times) )
            ax.relim()                  # recompute the data limits
            ax.set_xlim(times[0],times[-1])
            canvas.draw()
        
        root.after(200, plot_handler)

plot_handler()

root.mainloop()

動作確認

太郎くん
太郎くん

現状のコードが確認できたところで動作確認をしてみよう。

sin波形リアルタイム描画、Enable Scale bar、Enable Cpu Load、pause、sin wave、Sawtooth wave、target Speed、target[rad/s]、voltage[V]、speed[rad/s]、loadTorqueStep.tau[N m]、current[A]、cpu_load[ms]
太郎くん
太郎くん

お!
ちゃんとsin波が動いてる!

太郎くん
太郎くん

そして、pauseのチェックを入れるとちゃんと一時停止になってる。

フクさん
フクさん

これでtkinterのタイマでリアルタイム描画はできそうってのが確認できたわけだ。

まとめ

フクさん
フクさん

まとめだよ。

  • いままでごちゃごちゃと追加してきたコードを再確認。
  • tkinterによるリアルタイム描画の動作確認。
    • sin波が流れるように描画されていることを確認。
    • pauseで一時停止もできることを確認。
  • FMU関連処理はまだ未実装だが、tkinterによるリアルタイム描画はできそう。

バックナンバーはこちら。

コメント

  1. masterbet111 より:

    I enjoy what you guys are up too. This sort
    of clever work and reporting! Keep up the fantastic works guys I’ve
    added you guys to blogroll.

タイトルとURLをコピーしました