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 12

センサー値リセットマスター

Last updated at Posted at 2024-12-23

1. はじめに

ロードセルなどの初期値をオフセットしたいときが往々にあると思います.
目視でざっくり調整して,後はデータ分析時に時間0sの瞬間をオフセット値にしてy軸方向に調整してもいいですが,0基準になると直感的ですよね.
そんなときのアルゴリズム集です.

2. 対象のSimulinkモデル

ADC信号電圧を単位変換した後,offsetブロックをsumで接続したモデルを想定しています.
sumの符号は注意してください.
スクリーンショット 2024-12-23 221813.png

3. アルゴリズム

(1) Python

既存のシステムに手を加えないお手軽な方法.
constantブロックのoffset値をControlDeskで変更するので,Simulinkを再コンパイルしなくても済みます.

ControlDeskのPythonに以下を記述して実行するだけです.
Pythonスクリプトでもいいですが,よくリセットするブロックがある場合,
Button系のInstrumentをEvent駆動させてリセットボタンを作成するのも便利です.

# -*- 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
# センサ値のScopeブロック
ScopeVar = MyPlatform.ActiveVariableDescription.Variables["Platform()://Model Root/Scope/In1"]
# オフセットConstantブロック
OffsetVar = MyPlatform.ActiveVariableDescription.Variables["Platform()://Model Root/Offset/Value"]

# Calculate average.
print ("[sys] Calculate average.")
n = 500         # 保存する点数
list = []       # センサ値格納
sum = 0.0
ave = 0.0

# WARNING: 点数が多すぎるとフリーズ時間が長くなりすぎるので注意
for i =  in range(0,n):
    sum = sum + ScopeVar.ValueConverted
ave = sum / n

# Update value of the Offset block.
OffsetVar.ValueConverted = OffsetVar.ValueConverted - * ave

print(ave)
print("[sys] Offset completed.")

(2) Event Subsystem

SimulinkのSubsystem系って最初よくわからなかったんですよね...
Subsystemまとめは別の記事でするとして,今回はEnabled Subsystemを使います.
SubsystemにEnableブロックを配置しても同じブロックになります.

スクリーンショット 2024-12-23 224046.png
このモデルを実行すると以下のような結果になります.
赤:2回リセットした想定のパルス
黄:ランプ入力(センサ代わり)
青:最終的な出力
スクリーンショット 2024-12-23 224447.png

  • Enabled Subsystem
    subsystem内のEnableの設定がriseの場合,Enable端子が0→1になったときの入力値uを保持して出力します.

実際はPulseブロックではなくてコンスタントブロックを使ってdSPACE側から数値を変更します.
Pythonプログラム同様,Button系のInstrumentを使うとリセットボタンになります.

(3) 積分器

入力端子input valueに対して,resetが1→0になった瞬間の値を用いて出力端子outputの値を0にするアルゴリズム
image.png

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?