質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

2316閲覧

リアルタイムでデータの前後比較を行いたい

sotooki

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2018/02/22 05:03

編集2018/02/22 09:55

前提・実現したいこと

シリアル通信によりリアルタイムに取得したデータを一つ前の取得データと比較して差が閾値を超えていた場合、新規のデータを前のデータに書き換えたい

発生している問題・エラーメッセージ

一番初めにjudgeの部分で取得したold_mDATAZ()の値よりも下の値が取得された際は前後のデータを比較し、閾値よりも差が大きければ前の値を補間することに成功しましたが、データの値が上昇に転じると上昇直前の値が常に出力されてしまいます。
イメージ説明

該当のソースコード

Dim judge as integer = 0//グローバル変数 Private Sub AddData(ByVal str As String) '///取得データ処理関数 STX = Asc(Strings.Mid(str, 2, 1)) 'STX ETX = Asc(Strings.Right(str, 1)) 'ETX 'データ入力 For i = 1 To chlength * 6 Step 1 rDATA(i) = Asc(Strings.Mid(str, i + 2, 1)) Next If STX = &H2 And ETX = &H3 Then TextBox1.Text = "Connect" Index = 1 'アスキーデータを数値に変換 For i = 1 To chlength * 6 Step 6 mDATAZ(Index) = (rDATA(i) - &H41) * 256 + (rDATA(i + 1) - &H41) * 16 + (rDATA(i + 2) - &H41) Index = Index + 1 Next If judge = 0 Then '///スタート時だけ別途取得の必要あり(初回のみ動作) For s = 1 To chlength Step 1 old_mDATAZ(s) = mDATAZ(s) Next judge = 1 End If For q = 1 To chlength Step 1 hikaku1(q) = mDATAZ(q) - old_mDATAZ(q) If hikaku1(q) > TrackBar1.Value Then//前後のデータを比較 mDATAZ(q) = old_mDATAZ(q)//閾値以上の差があれば前のデータを補間 End If old_mDATAZ(q) = mDATAZ(q) Next

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2018/02/22 05:43

正常に動作しないの部分を詳細に記述してください。
sotooki

2018/02/22 05:52

比較スタート時にold_mDATAZ()に値がないため比較する対象がなくなにも計測値として出力されません
unz.hori

2018/02/22 05:54

old_mDATAZ()に値が無い場合は、無条件に取得したデータを計測値として出力すれば良いのでは?
sotooki

2018/02/22 06:00

無条件に取得したデータとはどういったものなのでしょうか
unz.hori

2018/02/22 06:02

うーん。書き方が悪かったか。最初に取得されたデータをそのまま出力すればという意味です。
sotooki

2018/02/22 06:25

納得いたしました。もう少し検討したいと思います。
guest

回答2

0

ベストアンサー

そのグラフがmDATAZを表しているとしてですが
hikaku1が絶対値じゃないので、下降のところも補間(?)が出来ているような気がしません。
上昇に転じると、If文の中に入り、最小値のold_mDATAZがずっとmDATAZに入ってるようなふうに読めます。

違っていたらごめんなさい。

投稿2018/02/22 10:01

ooa

総合スコア213

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sotooki

2018/02/22 10:22

For q = 1 To chlength Step 1 hikaku(q) = System.Math.Abs(mDATAZ(q) - old_mDATAZ(q)) TextBox10.Text = hikaku(1) If hikaku(q) > TrackBar1.Value Then mDATAZ(q) = old_mDATAZ(q) mDATAf(q) = old_mDATAf(q) End If old_mDATAZ(q) = mDATAZ(q) old_mDATAf(q) = mDATAf(q) Next 絶対値をとり再計測したところ、下降方向の値も加工直前の値で固定されてしまいました、、、
episteme

2018/02/22 11:36

スパイクノイズなら前後あわせて3つの中間値を取るメジアンフィルタが効果あるんでね?
guest

0

差を摂って、マイナスだったら符号を変えたらよくね?
※ つまり差の絶対値

投稿2018/02/22 10:00

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sotooki

2018/02/22 10:20

For q = 1 To chlength Step 1 hikaku(q) = System.Math.Abs(mDATAZ(q) - old_mDATAZ(q)) TextBox10.Text = hikaku(1) If hikaku(q) > TrackBar1.Value Then mDATAZ(q) = old_mDATAZ(q) mDATAf(q) = old_mDATAf(q) End If old_mDATAZ(q) = mDATAZ(q) old_mDATAf(q) = mDATAf(q) Next 絶対値をとり再計測したところ、下降方向の値も加工直前の値で固定されてしまいました、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問