0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

dSPACEAdvent Calendar 2024

Day 7

ControlDeskでPython実行

Last updated at Posted at 2024-12-23

1. はじめに

ControlDesk 4.3以降からPythonが標準で使えるようになっています.
アプリケーション内では以下の2通りの実行方法があります.

  • Pythonスクリプトを直接実行
  • Instrumentに紐づけたイベント駆動

今回は前者のPythonスクリプトを直接実行する方法を解説します.

2. 前提知識

3. 記述方法

(1) ファイル新規作成

新規で作成する場合の作成方法は2通りあります.
(1) Automationタブ > Insert Script
(2) Automationタブ > Script File > New

python_1.png

今回は(1)の手法を説明します.
Insert Scriptを押すとファイル名を入力する画面が出現します.
Insert infoでスクリプトをどこに格納するか選べますが,基本的にはデフォルトのExperimentで問題ないと思います.

画像2.png

適当な名前を入力し,OKボタンを押します.
Projectパネル > Project名 > Experiment名 > Pythonの中に項目が出現します.

画像3.png

(2) 編集

新規で作成するとそのままLayoutパネルに新しいタブで出現します.
Layoutと同じようにCtrl+sで保存します.

file.png

※タブとして存在しない場合
Projectパネル > Project名 > Experiment名 > Python Scriptsの対象のファイルをダブルクリックすれば開けます.

(3) 実行

Automation > Run Scriptで実行します.
ちなみにControlDeskプロジェクトフォルダ外のプログラムも動作しますが,紐づいていたほうが何かと便利なので上記の方法がおすすめです.

(4) 外部ファイル

例えば,他のプロジェクトで使用しているファイルや拾ってきたファイルを取り込みたい場合はAutomationタブ > Import Scriptでインポートできます.
※バージョン互換性とかあったような...(後ほど追記)

5. 具体例

センサ値を1秒ごとに5点計測し平均値を出力するプログラムで説明します.

※時間経過はOSのシステム時間に依存してしまうため,厳密に計測する必要がある場合はSimulink上でアルゴリズムを組みことをおすすめします.
エクスポートしたCSVのデータをマージするとき,時間幅が同一でON時の振幅(計測条件)を変えたデータ同士では視覚的には問題なく重なるのでご安心ください.

プログラム

# -*- coding:UTF-8 -*-
# ControlDeskのバージョンが古くPython2.X系列の場合,
# コメントに日本語を使うときは文字コードを明示しましょう.

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 数点の平均値を計算するプログラム
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Python modules
import time

# Platform object
MyPlatform = Application.ActiveExperiment.Platforms["Platform"]

# Check the state of application calibration (Go Online).
# 0: Offline, 1: Online
if Application.CalibrationManagement.State == 0:
    print("[error] Please Go Online!")
    exit()

# Define
ScopeVar = MyPlatform.ActiveVariableDescription.Variables["Platform()://Model Root/Scope/In1"]

# Wait for actuator response time.
time.sleep(2)

# Calculate average.
print ("[sys] Calculate average.")
n = 5
list = []
sum = 0.0
ave = 0.0
for i =  in range(0,n):
    sum = sum + ScopeVar.ValueConverted
    time.sleep(1)
ave = sum / n

print(ave)
print("[sys] Finished.")

解説

10秒弱time.sleep()によりControlDesk画面がフリーズしますが,仕様なので問題ありません.
この状態を回避するためのスレッドの使い方は次の記事にて紹介します.

  • よくある平均値を算出するアルゴリズム
  • Application.CalibrationManagement.State
    Online状態かOffline状態かを取得することができます.
  • MyPlatform.MeasurementDataManagement.Start() (Stop())
    呼び出すとStart(Stop) Measuringと同じ動作をします.

実行結果

Start Measuringを押している状態でプログラムを実行します.
フリーズしている間にボリュームをいじるなりセンサ値を変動させると,
フリーズが解けた瞬間,Time Plotterにその間のデータが一気に表示されます.

6. 注意事項

無限ループ

無限ループから抜け出せなくなったらタスクマネージャを開いてバックグラウンド プロセスの中のPythonを右クリックタスクの終了で終了しましょう.

Python自体の問題

Python自体がうまく動作しない場合,何かしらの原因でdSPACE用のPythonを構成するファイルが破損している可能性があります.
[1] dSPACE, "FAQ 094: Pythonの再インストール",
https://www.dspace.com/shared/support/faqpdf/faq094jp.pdf

パッケージをインストールしたのに未インストールエラーが出た場合は,pipインストールの対象のバージョンがdSPACEにリンクしているものと異なる可能性があります.(他のバージョンのPythonが共存している場合など)
その場合はPythonのバージョンを明示してpipを呼び出しましょう.

python3.x -m pip install <package_name>

※dSPACEで使用しているPythonにパッケージをインストールする方法はこちら(未)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?