FAMOS

シーケンス / 関数に関するFAQ

Q0を中心に±に振れる信号があります。正側を5倍、負側を3倍にしたい

FAQ ID:s068

A

以下のサンプルファイルを例にします。

この信号に対して0より大きい値を5倍、0より小さい値を3倍にします。
最初に必要なのでは、0より大きい信号を見つけることです。ある条件を設定し、値を抽出するためには関数SearchLevelを利用すると便利です。

resp = SearchLevel( Data, 2, 0, 0, 0, 0, 0, 0)

この関数を実行すると、0より大きい値を抽出します。

この信号を5倍して、元のデータに戻すことで目的を達成します。信号を5倍にするためには単純に5を掛ければよいです。元のデータに値を戻すには関数”Set”を利用します。
SearchLevelの結果はXY波形です。Set関数の第2引数にXデータ、第3引数にYデータを指定します。

Data = Set( Data, resp.X, resp.Y*5)

以上で結果は正側のみ5倍になります。

この後、負側も同様に行います。

以上です。

シーケンスは以下の通りです。

;***********************************************
;
; 正側を5倍、負側を3倍にします
;
;***********************************************
; 後でデータを比較するためにコピーします。
  Data = sintest1
; 正側のデータを抽出します
  resp = SearchLevel(Data, 2, 0, 0, 0, 0, 0, 0)
; 負側のデータを抽出します
  resm = SearchLevel(Data, 1, 0, 0, 0, 0, 0, 0)
; 元のデータに演算結果を戻します
  Data = Set(Data,resp.X, resp.Y*5)
  Data = Set(Data,resm.X, resm.Y*3)

回答を閉じる

Qパルス信号を回転数に変換したい

FAQ ID:s067

Q

パルス信号を回転数データに変換することはできますか?

A

可能です。
以下のデータを対象とします。"pulse"はパルス信号、"signal"は加速度信号です。

以下の図はパルス信号の拡大図です。

最初にこのパルス信号の各パルスの立ち上がりポイントを取得します。
この位置を取得するためには関数"SearchLevel"を利用します。

res = SearchLevel( pulse, 2, 1, 0, 2, 0, 0, 1)

関数のパラメータを簡単に設定するためにはSearchLevelと記述した後で、関数の上にカーソルを置いてSHIFT+F1を押してください。以下のダイアログが表示され、パラメータを簡単に設定できます。

上の設定は1V以上の立ち上がりの変化ポイントを検出します。
この結果は変数リストに以下のように表示されます。

注意:
下図のように表示されない場合、変数リストの上で右クリックして、”コンポーネント表示”を選択してください。

結果は以下のように条件が成立した点だけ取得しますので、等間隔データではなく、XY波形となります。

この"res.X"変数はパルスの立ち上がりポイントのX座標を示します。

この結果を利用して回転数を求めます。
各ポイントのX座標の間隔は前後のデータのX座標の差分です。データ数を合わせるために1つずらしたデータを作成します。

res1 = CutIndex( res.X, 1, leng?(res.X)-1)
res2 = CutIndex( res.X, 2, leng?(res.X))

これらの差分が各パルスの時間間隔です。

DiffTime = Res2-Res1

回転数(RPM)に変換するためには以下のようにします。

RPM = 1/DiffTime*60

以上よりRPM信号を取得できます。
例えば、この結果を利用して、加速度波形のRMSを求めてXYグラフを作成すると以下のようになります。

Acc = MvRMS(Signal,0.04,0.04)
Result = XYof(RPM,ACC)

シーケンスは以下の通りです。

;***********************************************
;
; パルス信号をRPMに変換
;
;   pulseという変数にパルス信号を入力してください
;***********************************************
;パルスの立ち上がりを検出します。
res = SearchLevel(pulse, 2, 1, 0, 2, 0, 0, 1)
;パルスの立ち上がり時間間隔からRPMを算出します
res1 = CutIndex( res.X, 1, leng?(res.X)-1)
res2 = CutIndex( res.X, 2, leng?(res.X))
DiffTime = Res2-Res1
RPM = 1/DiffTime*60
;この部分はおまけです。XY波形を作成します
Acc = MvRMS(Signal,0.04,0.04)
Result = XYof(RPM,ACC)

製品詳細はこちら

回答を閉じる

Q間欠的な振動波形を波形毎に切り出してFFTしたい

FAQ ID:s039

Q

下図のように間欠的に振動が発生します。このデータをFFTすると、振動の途中でウィンドウを切り出してしまい上手くデータ処理されません。 各振動波形を切り出してからFFTできますか?

A

以下のシーケンスでは各振動波形を切り出して、最後にFFT処理を行っています。

;ドリフト成分を除去します

_temp1 = FiltHP(data, 0, 0, 8, 1)
_temp2 = ExpoRMS(_temp1, 0.02, 0.02)
_temp3 = SearchLevel(_temp2, 2, 1, 0, 0, 0, 0, 1)

;ここではSearchLevelでどのような処理をするのでしょうか?
;----------------------------------------------------
;各振動波形を分離するための座標を取得しています。
;結果を確認したければ、_temp2を表示させ、その上に_temp3を重ね書きしてください
;その後で_temp3のスタイルを丸などに変更すると結果を確認できます。

_temp4 = Leng(0,1024)
show _temp4

; Leng(0,1024)では波形が”0”になっています。どういう事でしょうか?
;なぜShowにて表示するのでしょうか?
;----------------------------------------------------
;計算途中を表示するために長さ1024の空の波形を作っています。

_temp6 = Leng(0,0)

; Leng(0,0)では波形が”0”になっています。どういう事でしょうか?
;----------------------------------------------------
;後のループで値を代入するために_temp6というダミー波形を作成しました。

_i=1
while _i<Leng?(_temp3)
_temp5 = Cut(_temp1, _temp3[_i].X-0.1, _temp3[_i+1].X-0.1)
_temp4 = Leng(_temp5, 1024)

_temp6 = Join(_temp6, _temp4)

_i=_i+1
end

;これらの行でどのような処理をされているのでしょうか?
;----------------------------------------------------
;SearchLevelで検出した各振動波形毎にデータを切り出し、
;そのデータ長さを1024点に拡張して、再構成しています。

Result = AmpSpectrumRMS_1(_temp6, 1024, 0, 0, 1)

製品詳細はこちら

回答を閉じる

Qデータサイズが大きすぎてExcelに貼り付けられません

FAQ ID:s037

Q

通常、波形エディターに数値データを表示させて、Excelにコピーしています。
今回データサイズが大きすぎてExcelに貼り付けられません。対策はありますか?

A

波形をExcelで処理できるデータ数に分割してから貼り付ける必要があります。
これを自動化したシーケンスを以下に示しますので参考にしてください。

;------------------------------------
;サンプルデータの作成
;------------------------------------
    data = sin(Ramp(0,1,100000))
;------------------------------------
;定義
;------------------------------------
    ;Excelの最大行
    RowMax = 65000
    ;出力したい列番号
    Col    = 1
;------------------------------------
;データ転送
;------------------------------------
    ;区切り文字の指定
    DDESepar( "\r\n")
    ;シート数の算出
    _SheetNum = Floor( Leng?(data)/65000)+1
    _page=1
    while _page<=_SheetNum
        ;転送先アドレス
        _cellAdr = "R1C"+TForm(col,"F00")+":R"+TForm(RowMax,"F00")+
        "C"+TForm(col,"F00")
        ;波形を切り出し
        _temp    = CutIndex(data, (_page-1)*RowMax+1, _page*RowMax)
        ;データ転送
        _err     = DDESet("Excel", "Sheet"+TForm(_page,"F00"), _cellAdr,
       _temp, 1)
       _page=_page+1
    end

製品詳細はこちら

回答を閉じる

Qsmo関数のパラメータ指定方法について

FAQ ID:s036

Q

平滑する幅は奇数ポイントになるように指定しないといけないのでしょうか?
偶数ポイントになるような指定をするとどのような処理になるのでしょうか?

A

平滑化する幅が5点より大きいければ、重み関数は三角形の形状で、奇数ポイントとなります。
選択された間隔が5点ならば、関数"Smo5"と同じです。3点ならば関数"Smo3"と同じです。

偶数ポイントを指定した場合、指定した値に対して最も大きい奇数ポイントで計算します。
以下のサンプルでご確認ください。

a=ramp(0,1,20)
i=1
while i<=20
  if mod(i,2)=1
    a[i]=-a[i]
  end
  i=i+1
end

b1=smo(a,1)
b2=smo(a,2)
b3=smo(a,3)
b4=smo(a,4)
b5=smo(a,5)
b6=smo(a,6)
b7=smo(a,7)
b8=smo(a,8)
b9=smo(a,9)

製品詳細はこちら

回答を閉じる

Qコマンド・関数・キットで同じようなコマンドがありますが、何が違うのですか?

FAQ ID:s034

Q

例えば、ファイル関係に対して以下のようにコマンド・関数・キットとさまざまな方法があります。これらはどのように異なり、どのように使い分ければよいのでしょうか?

コマンド B> Load,Save
関数 13> ファイル関数
キット File-kit

A

FAMOSの歴史と関係します。概念として以下のような違いがあります。

コマンド 非常に簡単に使用できますが、細かなことはできません。 コマンドはFAMOSの古いバージョンで使用していた関数です。 以前のバージョンとの互換性を保つために残されています。
関数 信号処理ソフトウェアとして必要な機能を集約しています。通常はこの関数を利用してください。
キット関数 関数でも実現できますが、さらに専門的な処理を実現したものです。 キット関数はアプリケーション使用時のメモリー消費を抑えるために、メニューメニュー”エクストラ/オプション”の”機能拡張/キット関数の登録”で使用するか否か設定可能です。

製品詳細はこちら

回答を閉じる

Qパルス波形を分周するためにはどうすればよいですか?

FAQ ID:s030

A

パルス波形を分周する関数は存在しません。シーケンスで作成します。
下記サンプルを参考にしてください。

;************************************************************
; パルス波形を分周するサンプル
;************************************************************
;------------------------------------------------------------
; サンプルデータを作成します
;------------------------------------------------------------
_xdelta = 0.01
_xpoint = 1000
_temp1 = Ramp( 0, _xdelta, _xpoint)
_temp2 = Ramp( _xdelta, _xdelta*10, _xpoint/10)
Pulse = Set( _temp1*0, _temp2, _temp2*0+1)
Delete _*
Show Pulse
;////////////////////////////////////////////////////////////
; データ処理部
; パルス波形を1/10に分周します
;------------------------------------------------------------
;【引数】
; Pulse = 入力データ
;
;【戻値】
; Result = 結果
;
;【パラメータ】
  _Ratio = 10
;////////////////////////////////////////////////////////////
;各パルスを取得します。
; 本サンプルではパルス形状は台形ではなく、インパルス状ですが
; いずれにも対応します。
  _ckLevel   = SearchLevel(Pulse, 2, 0.5, 0, 2, 0, 0, 1)
  _ckLevel.Y = _ckLevel.Y*0+1
;分周するために各パルスにラベルをつけます
  _Counter  = Int( _ckLevel.Y)
  _Counter  = Leng( _Counter, Leng?(_Counter)-1)
  _Divider  = Mod( _Counter, _Ratio)
  _Divider  = XYof( _ckLevel.X, _Divider)
;指定(分周)されたパルスを取得します。
  _DivLevel = SearchLevel( _Divider, 3, 1, 1, 2, 0, 0, 1)
  Result    = Set( Pulse*0, _DivLevel.X, Leng(0,Leng?(_DivLevel))+1)
;////////////////////////////////////////////////////////////
;結果を表示します
CvYAxis( Pulse, Result, 0,0,0, 400, -2)
CvAttrib(Pulse, 1)

製品詳細はこちら

回答を閉じる

Qヒルベルト変換の関数はありますか?

FAQ ID:s029

A

Ver4.0の時点では存在しません。メーカーに問い合わせたところ、バージョンアップで対応するという回答をもらいました。
バージョンアップでサポートされるまで以下のシーケンスで代用してください。

;---------------------------------------------
; ヒルベルト変換
;---------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; サンプルデータの読み込み

  Famos
  Load C:\imc\dat\slope.dat __data

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 演算

  FftOption 0 0
  _fan = fft( __data )
  _fan.p = _fan.p - 90
  _t1 = ifft ( _fan )
  hilbert = Sqrt(Sqr(__data)+Sqr(_t1))       < 包落線


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 瞬間周波数

  angle = atan2(_t1, __data)
  angle1 = cutIndex(angle, 1, leng?(angle)-1)
  angle2 = cutIndex(angle, 2, leng?(angle))
  angle2=xoff(angle2,0)
  angle = angle2-angle1

  i=1
  while i<=leng?(angle)
    if angle[i]<-pi
      angle[i]=angle[i]+pi2
    end
    if angle[i]>pi
      angle[i]=angle[i]-pi2
    end
    i=i+1
  end 
  Freq = angle/pi2

    delete _t1
    delete _fan

製品詳細はこちら

回答を閉じる

Q変数名の命名方法

FAQ ID:s027

A

変数はその名前で認識されます。
大文字と小文字の区別はありません。
使用可能な変数名は、

  • 最大255文字以下
  • 数字で始まらない
  • 他の変数名と同じでない
  • シーケンス(マクロ)コマンドと同じでない
  • 定数の名前と同じでない
  • 演算シンボルと同じでない

以下のシンボルは変数名には使用できません。

  • + - ( ) * / ^ = { } [ ] < > |
  • スペース、セミコロン、クォーテーションマーク、カンマなども使用できません

注意

日本語、クエスチョンマーク(?)やイクスクラメーションマーク(!)などの特別な文字を名前に使用することは、できるだけ避けて下さい。
例えば、クエスチョンマークは、変数名に使うことを許可されていますが、場合によっては予想できない結果をもたらす場合があります。一般的に、変数名とファイル名は同じになりますが、クエスチョンマークはファイル名には使用できません。なぜなら、パラメータ付きでマクロシーケンスを呼び出す場合、ク エスチョンマークをワイルドカードとしてファイル名に使うからです。
関数の名前を変数名に使用することは可能ですが、混乱を避けるために使用しないでください。

製品詳細はこちら

回答を閉じる

Q関数"Smo"の係数の求め方

FAQ ID:s024

A

次のシーケンスから求めることができます。
例えば、7点の係数を求めます。

imp = Ramp( 0, 1, 100) * 0
imp = Set( imp, 50, 1)
Res = Smo( imp, 7 )

この結果より次の係数を取得することができます。

0.04 0.12 0.20 0.28 0.20 0.12 0.04

これらの係数は以下のように反映されます。

y[u] = 0.04 * u[k-3] + 0.12 * u[k-2] + 0.20 * u[k-1] + 0.28 * u[k] + 
0.20 * u[k+1] + 0.12 * u[k+2] + 0.04 * u[k+3]

製品詳細はこちら

回答を閉じる

Q単位の自動計算

FAQ ID:s023

A

FAMOSは演算を行う際に単位を考慮します。

Example1

例えば、I=3[A],V=12[V]であれば、Wat=36[W]となります。

I = 3 'A'		;シングルクォーテーションです
V = 12 'V'

Wat = I * V
Show Wat

Example2

単位系にはSI単位系が使用されます。

Weight=60 'kg'
g=9.80665 'm/s^2'

Force = Weight * g

Example3

ユーザー単位系を使用したい場合、ダブルクォーテーションを使用してください。

Weight=60 '"kg"'
g=9.80665 '"m/s^2"'

Force = Weight * g

製品詳細はこちら

回答を閉じる

Qエンジンの回転角度毎に取得したデータを平均化する

FAQ ID:s020

Q

エンジンの回転角度(1[deg])毎に1分間のデータを取得しました。
例えば1000[rpm]で回転していたとすると、1回転分360データ×1000=360000データを測定したことになります。

このデータを0-360[deg]毎に切り出して、1000回分の平均を求めるにはどのようにすればよいでしょうか?

A
_K_SegLeng = 100      ;切り出すセグメント長さを指定してください
SetSegLen( DATA, _K_SegLeng)
Temp = TransposeMatrix( DATA)
i=1
RESULT = Leng( 0, 0)
While i<=_K_SegLeng
   RESULT = Join( RESULT, Mean( temp[i]))
   i=i+1
End

グループ変数内の全ての変数に対して処理する場合のサンプルです。

;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;_/  長時間のデータを指定したセグメントに切り出して平均化する
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

;*******************************
;サンプルデータを作成します。
;データはグループ変数とします。
;*******************************
Del *

dat1 = Ramp(0,1,1000)
dat2 = Ramp(0,1,1000)

GROUP = GrNew()
GrChanAppend( GROUP, dat1)
GrChanAppend( GROUP, dat2)

Del dat*

;*******************************
;シーケンスを実行します。

_K_SegLeng = 100      ;切り出すセグメント長さを指定してください
;*******************************

;-------------------------------------
;変数リスト内の変数の総数を取得して
;全ての変数に対して実行します
;-------------------------------------
_K_VarTotal = VarGetInit(0)
_K_VarIdx   = 1
While _K_VarIdx<=_K_VarTotal
   ;各グループ変数のループ
   _K_VarName = VarGetName?( _K_VarIdx )	
   SetSegLen(<_K_VarName>, _K_SegLeng)

   ;---------------------------------------
   ;グループ内の変数全てに対して処理を行います
   ;---------------------------------------
   _K_GrTotal = GrChanNum?(<_K_VarName>)
   _K_GrIdx = 1
   While _K_GrIdx<=_K_GrTotal
      _K_GrName = GrChanName?( <_K_VarName>, _K_GrIdx)
      ;グループ変数名の生成 FAQ S015参照
      _K_GrName = TAdd(_K_VarName, TAdd(":", _K_GrName))		

      ;---------------------------------------
      ;各変数を平均化します
      ;---------------------------------------
      _K_SegTotal = Leng?(<_K_GrName>)/SegLen?(<_K_GrName>)
      _K_SegIdx = 1
      _K_Result = Leng(0,SegLen?(<_K_GrName>))
      While _K_SegIdx<=_K_SegTotal
         ;平均化
        _K_Result=_K_Result+<_K_GrName>[_K_SegIdx]

      	_K_SegIdx=_K_SegIdx+1
      End
      <_K_GrName>=_K_Result/_K_SegTotal
	
      _K_GrIdx=_K_GrIdx+1
   End

   _K_VarIdx=_K_VarIdx+1
End

Del _K_*

製品詳細はこちら

回答を閉じる

Q2組以上の並び替え

FAQ ID:s019

A

以下のデータについて並び替えを行います

;--------------------------
;サンプルデータの作成
;--------------------------
DataX = Leng(0,5)
    DataX[1] = 1
    DataX[2] = 4
    DataX[3] = 3
    DataX[4] = 9
    DataX[5] = 8

DataY = Leng(0,5)
    DataY[1] = 3
    DataY[2] = 8
    DataY[3] = 4
    DataY[4] = 9
    DataY[5] = 5

Xの昇順で並び替える

X_Mono = Sort( Data.X, 1)         ;X軸データを単調増加へ
Y_Sort = Value( Data.Y, Sort( Data.X, 3))
Res    = XYof( X_Mono, Y_Sort)

Yの昇順で並べ替える

Y_Mono = Sort( Data.Y, 1)         ;X軸データを単調増加へ
X_Sort = Value( Data.X, Sort( Data.Y, 3))
Res    = XYof( X_Sort, Y_Mono)

製品詳細はこちら

回答を閉じる

Qデータロガーのサンプリングタイムをインデックスで管理しています。 これをサンプリングタイムに変換するには?

FAQ ID:s017

A

データロガーのサンプリングレートが以下のようなインデックス番号で管理されています。
このインデックスからサンプリングタイムに変換するにはどうすればよいでしょうか?

Index ⊿X
0

10

μsec
1

20

μsec
2

50

μsec
3

100

μsec
4

200

μsec
5

500

μsec
6

1

msec
7

2

msec
8

5

msec
9

10

msec
10

20

msec
11

50

msec
12

100

msec
13

200

msec
14

500

msec
15

1

sec

サンプリングレートは1-2-5と繰り返されています。
関数”MOD”を利用します。
以下のシーケンスを参考にしてください。

IF MOD( Index, 3) = 0 ;1[usec], 10[umsec],...の場合
        temp = 1
END
IF MOD( Index, 3) = 1 ;2[usec], 20[umsec],...の場合
        temp = 2
END
IF MOD( Index, 3) = 2 ;5[usec], 50[umsec],...の場合
        temp = 5
END
RESULT = temp * 10^(-5 + Floor( Index/3 ))

製品詳細はこちら

回答を閉じる

Q3Dデータの作り方

FAQ ID:s013

A

以下のデータは、室内の平面座標位置XZで測定した温度などのデータです。データの値をYとします。
このデータをカラーマップで表現させたいのですが、どうすればいいのでしょうか?

  X
   
Z 48 50 51 52
49 52 53 54
51 53 54 55

方法1:3つのデータを作成

以下のように3つのデータを作成します。

Ch1 Ch2 Ch3
48 49 51
50 52 53
51 53 54
52 54 55

これらの3つの波形をまとめて表示させ、カラーマップで表示させます。

方法2:セグメント

(1)Yデータの作成
Yデータを以下のように定義します。

ydata
48
50
51
52
49
52
53
54
51
53
54
55

(2)データ形式の変換
カラーマップで表示するためにはデータの形式を標準波形からセグメント波形に定義しなおします。
関数”SetSegLen”を使ってセグメント波形にします。

SetSegLen( ydata, 4)             ;セグメント波形へ

(3)X・Z座標の定義
Xデータ(3・5・7・9)はサンプリングレート2、オフセット3です。

ydata = XDel( ydata, 2)                   ;Xサンプリング設定
ydata = XOff( ydata, 3)                    ;Xオフセット設定

Zデータ(1・5・9)はサンプリングレート4、オフセット1です。
SetZDel( zdata, 4)                ;Yオフセット設定
SetZoff( zdata, 1)          ;Yオフセット設定;   

(4)結果の表示
変数”ydata”をカーブウィンドウに表示させます。
カーブウィンドウメニュー<オプション/表示>でダイアログを表示させ、カラーマップを選択してください。

ここで、Z軸の値に注目してください。設定した値で表示されていません。これを希望の形式で表示させるためには、
カーブウィンドウメニュー<オプション/3D>でダイアログを表示させ、”データのZ座標を加える”を選択してください。



製品詳細はこちら

回答を閉じる

Q等級線を使ったレベル判定

FAQ ID:s014

A

データロガーやFFTアナライザーを使って測定したデータに対して、等級線を使用して良否判定する方法を紹介します。

上図において、波形Speedは測定データです。波形は等級線です。
等級線は以下のようなデータを設定しています。

Limit.X Limit.Y
0.5 5
2 3
3 3
3.5 4

例えば、測定波形が等級線を越えた場合、不良品であると仮定します。
設定したレベルを超えたかどうか判断するために関数Subを利用してください。

 Judge = Sub( Speed, Limit, 0

結果は以下のようになります。

  注意:
ここで、結果JudgeのX軸範囲に注目してください。
等級線で設定された範囲のみで計算します。

結果Judgeが0より大きい値を持つとき、不良であることを示します。
0より大きい値を持つかどうかは以下のように簡単に判定することができます。

  IF ?Max( Judge) > 0
Err = BoxMessage( "良否判定","この製品は規格を満たしていません", "!1")
End 

サンプル

測定波形は既に用意されているとします。

;***************************************
;等級線を作成します
;***************************************
    tempX = Leng( 0, 4)
    tempX[1] = 0.5
    tempX[2] = 2
    tempX[3] = 3
    tempX[4] = 3.5
    tempY = Leng( 0, 4)
    tempY[1] = 5
    tempY[2] = 3
    tempY[3] = 3
    tempY[4] = 4
    Limit=XYof( tempX, tempY)

;***************************************
;判定
;***************************************
    Judge = Sub( Speed, Limit,0)
    IFMax( Judge) > 0
        Err = BoxMessage( "良否判定","この製品は規格を満たしていません", "!1")
    End

サンプル

さらに数段階の等級を設定し、等級判定することもできます。
測定波形は既に用意されているとします。

;***************************************
;等級線を作成します
;***************************************
i=1
While i<=7
    tempX = Leng( 0, 4)
    tempX[1] = 0.5
    tempX[2] = 2
    tempX[3] = 3
    tempX[4] = 3.5
    tempY = Leng( 0, 4)
    tempY[1] = 2+i
    tempY[2] = 0+i
    tempY[3] = 0+i
    tempY[4] = 1+i
    FName = TAdd( "Level", TForm( i, "F00"))
     = XYof( tempX, tempY)
    GrChanAppend( Limit, )
    Del
    i=i+1
End

;***************************************
;判定
;***************************************
i=1
While i<=7
    FName = TAdd( "Level", TForm( i, "F00"))
    Judge = Sub( Speed, Limit:,0)
    IF Max( Judge) < 0
        Mes = TAdd( "この製品のレベルは", TForm( i, "F00"))
        Mes = TAdd( Mes, "です。")
        Err = BoxMessage( "レベル判定",Mes, "!1")
        i=7
    End
    i=i+1
End

製品詳細はこちら

回答を閉じる

Q変数がグループ変数かどうか調べる

FAQ ID:s015

A

変数リスト内の変数がグループ変数かどうか調べる方法を紹介します。
変数リストを見ればその変数がグループ変数かどうかは一目瞭然です。

しかし、シーケンスから変数を参照しているときにはどうでしょうか?
次のサンプルコードは変数リストの変数を取り出すコードです。

ListTotalNumber = VarGetInit(0)
While cnt<=ListTotalNumber
    DataName = VarGetName?(cnt)

    ret = BoxMessage("",DataName,"!1")
    cnt=cnt+1
End

このコードを実行させると以下のように変数リストの変数名を表示できます。しかし、この変数がグループ変数なのかどうかはわかりません。

例えば、この変数がグループ変数でその中に”Ch1”という変数が格納されていた場合、以下のようにアクセスする必要があります。

GroupData:Ch1

しかし、この変数がもしグループ変数でなければこのような表現はエラーとなってしまいます。このようにシーケンスで変数を扱う場合にはグループ変数かどうかを調べないといけません。
  グループ変数かどうかは関数”GrChanNum?”を使用すればわかります。
本来、グループ変数内のチャンネル数を求める関数ですが、指定した変数がグループ変数でなければエラー値が返ります。このエラーで判定すればグループ変数かどうか判断できます。
以下にサンプルコードを示します。サンプルでは上の例のようにメッセージボックスで変数名を表示させると大変なのでファイルに出力しています。

;********************************************************************
;
変数リスト内の変数名をファイルに書き出す
;
*********************************************************************

FileID = FileOpenASCII( "c:\test.txt",1)
cnt=1
;リスト内の変数の総数を取得
ListTotalNumber = VarGetInit(0)
While cnt<=ListTotalNumber
   
 DataName = VarGetName?(cnt)
    GrVarNum = GrChanNum?( <DataName>)
    if GrVarNum<>-1
        ;データがグループ変数の場合 
      
   gcnt=1
        While gcnt<=GrVarNum
            ;グループ内の変数名を取得

            GrVarName = GrChanName?( <DataName>, gcnt) 
    
           TEXT = TAdd( DataName, ":")
            TEXT = TAdd( TEXT, GrVarName)
            Ferr = FileLineWrite( FileID, TEXT, 0)
       
                gcnt=gcnt+1
        End
    Else
        ;通常の変数の場合、そのまま出力
        TEXT = DataName
        Ferr = FileLineWrite( FileID, TEXT, 0)
    End
    cnt=cnt+1
End
Ferr = FileClose(FileID)

製品詳細はこちら

回答を閉じる

Qデータ間が不等間隔のXY波形を等間隔データに変換するには?

FAQ ID:s010

A

下図はデータ間隔が不等間隔の例です。このようになるデータはエンジンなどの回転物の計測データで多く見られます。

関数”XYdt”を使用してください。

cutdata2 = XYdt ( ch1_Ord1.X, ch1_Ord1.Y, 50)

下段が等間隔に変換したデータです。
50回転毎にデータを取得します。

製品詳細はこちら

回答を閉じる

Q極大値を検出する方法

FAQ ID:s058

A

以下のような波形に対するピーク値を検出します。
検出方法は波形の極大値を検出します。
ピーク値の検出には、関数”xMax”が便利です。この関数は、スレッショルド以上の極大値のX値を返します。
サンプル波形に対して、スレッショルド0.9でこの関数を適用します。

  PkValue = xMax(arches, 0.9 )

結果は以下のようになります。

4.24e-005
0.0001848
0.0003112
0.0004368
0.0005624
0.0006872

この値をサンプル波形に重ねて表示する場合には、ここで求めたX値に対応したY値を求め、XY波形を作成しなければなりません。これは、先に説明した関数”Value”を利用します。

PK = XY( PkValue,Value( arches, PkValue ))

製品詳細はこちら

回答を閉じる

Qノイズが多い場合のピーク値の検出

FAQ ID:s059

A

以下の波形のようにノイズが多く含まれた信号のピーク値を求めます。
ピークとして、0.7[sec]付近の正側のピークと0.8[sec]付近の負側のピークを求めます。

最初にノイズ成分に影響されないようにオリジナル波形にローパスフィルターを適用した波形を適用します。

S_100 = Smo( ORIGINAL, 0.10)

次に信号が0を横切ったときを検出します。このとき関数”All0”をします。All0は0を横切ったときのX座標(Array)を返します。
さらに、この結果の何番目(index)が正側のピークを表しているか求めます。

    Array = All0( S_100)                ;0点を横切る全ての点を抽出
    max_x = Pos( S_100, Max(S_100))     ;最大値のX座標を取得
    index = Floor( Pos(Array, max_x))+1 ;この変数にピークに対応
                                              するインデックス番号が入力されます。
                                             ;X座標に相当するインデックス番号を取得

この変数にピークに対応 するインデックス番号が入力されます。 ;X座標に相当するインデックス番号を取得

この後、正側と負側のピークを検出する区間を切り出します。

    p_peak = cut( Original, ValueIndex(Array,index-1), 
                         ValueIndex(Array,index))
    m_peak = cut( Original, ValueIndex(Array,index  ),
                         ValueIndex(Array, index+1 ))

切り出された波形に対して、ピーク値を求めます。

    plus  = Max(p_peak)
    minus = Min(p_peak)

以上でピーク値を求めることができます。この結果をカーブウィンドウにプロットするには以下のコマンドを適用すると表示できます。

    plus_G  = XYof( Pos( p_peak , Max(p_peak)), Max(p_peak))
   minus_G = XYof( Pos( m_peak , Min(m_peak)), Min(m_peak))

製品詳細はこちら

回答を閉じる