1. はじめに
ロードセルなどの初期値をオフセットしたいときが往々にあると思います.
目視でざっくり調整して,後はデータ分析時に時間0sの瞬間をオフセット値にしてy軸方向に調整してもいいですが,0基準になると直感的ですよね.
そんなときのアルゴリズム集です.
2. 対象のSimulinkモデル
ADC信号電圧を単位変換した後,offsetブロックをsumで接続したモデルを想定しています.
sumの符号は注意してください.
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ブロックを配置しても同じブロックになります.
このモデルを実行すると以下のような結果になります.
赤:2回リセットした想定のパルス
黄:ランプ入力(センサ代わり)
青:最終的な出力
- Enabled Subsystem
subsystem内のEnableの設定がriseの場合,Enable端子が0→1になったときの入力値uを保持して出力します.
実際はPulseブロックではなくてコンスタントブロックを使ってdSPACE側から数値を変更します.
Pythonプログラム同様,Button系のInstrumentを使うとリセットボタンになります.
(3) 積分器
入力端子input valueに対して,resetが1→0になった瞬間の値を用いて出力端子outputの値を0にするアルゴリズム