Rangeノードを使う(その2)
引き続きサンプルフローを見ていきます。Rangeノードシリーズ2回目にして最終回です。
入力値を制限する
最初のサンプルは「flows > node-red > function > range > 03 - Limit input value」です。入力値を指定した範囲内になるよう制限するようです。
「動作」の設定は前回紹介したRangeノードのサンプル01と同じく「入力値の範囲外の値を最小値/最大値とし拡大/縮小」です。違うのは入力値の範囲と出力値の範囲のみ。
実行結果は、以下の通りです。
- 入力0→出力0
- 入力10→出力9
- 入力100→出力90
「入力値の範囲を出力値の範囲にマッピングして按分計算(上下限を超えた値はサチる)」
ってことですね。これ以上の説明は不要かと思います。
入力値の範囲外の値を範囲幅で割った余りとし拡大/縮小
次のサンプルは「flows > node-red > function > range > 04 - Scale and wrap input value」です。挙動の一部はよくわからない上に、利用する場面もイマイチよくわかりませんでした。プロパティを見ていくと、「動作」の設定が「入力値の範囲外の値を範囲幅で割った余りとし(「て」が抜けてる?)拡大/縮小」となっている以外、Rangeノードサンプル03と同じです。
実行すると、以下のような結果になります。
- 入力0→出力0
- 入力10→出力10
- 入力100→出力10
「入力値の範囲外の値を範囲幅で割った余りとし拡大/縮小」の表現をそのまま素直に読み解くと、
- 入力値の範囲外の値:10
- (出力値の?)範囲幅:90
- 「入力値の範囲外の値」を「(出力値の?)範囲幅」で割った余りとし(て?)拡大/縮小:10÷90の余り:10
続いて、
- 入力値の範囲外の値:100
- (出力値の?)範囲幅:90
- 「入力値の範囲外の値」を「(出力値の?)範囲幅」で割った余りとし(て?)拡大/縮小:100÷90の余り:10
計算通りになっているようです。ところで、「入力値の範囲内」の値を入力したらどうなるんでしょう。
- 入力値:5
- (出力値の?)範囲幅:90
- 「入力値の範囲外の値」を「(出力値の?)範囲幅」で割った余りとし(て?)拡大/縮小:5÷90の余り:5
となるはずですが、実際に出力された値は「50」でした。画面上からは入力値の範囲内の値がどうなるか読み取れないので、どうにも判断ができませんでした。こういうときは「原文を当たれ」が鉄則なので英語表記に変更してみると「Scale and wrap within the target range」とありました。直訳すると「ターゲットレンジ内でスケールとラップ」となります。
続いて、Rangeノードのヘルプを見ると以下のように説明があります。入力値の範囲内の値を与えた場合の計算ルールは読み取れません。
Scale and wrap within the target range means that the result will be wrapped within the target range.
For example an input 0 - 10 mapped to 0 - 100.
mode input output
scale 12 120
limit 12 100
wrap 12 20
ということで、完全な理解は諦めました。詳しい人教えてください。
まとめ
今回の内容をまとめます。
- 「入力値の範囲外の値を最小値/最大値とし拡大/縮小」は挙動を完全に理解できなかった
中途半端な感じはしますが、Rangeノードシリーズはこれで終了です。
コメント
コメントを投稿