FAMOS
シーケンス / 関数top
└ Tips
Q波形の位相ずれがないフィルターとは。
FiltLP()関数等で波形をフィルターするとフィルター次数に応じた位相ずれ(時間軸上での遅れ)が生じます。
Professional以上に含まれますFiltLPZ()関数等を使用すると位相ずれのないフィルターが可能です。
原理的には下記の処理を行っています。
1) 適用したいフィルター次数の半分の次数でFiltLP()関数を適用する。
2) Mirror()関数で波形をX軸反転する。
3) 適用したいフィルター次数の半分の次数でFiltLP()関数を適用する。
4) Mirror()関数で波形をX軸反転して元にもどす。
ただし上記の手順ではフィルターを2回行っているためカットオフ周波数での波形の減衰が-6dBになります。
FiltLPZ()関数等は上記と同じ手順でカットオフ周波数での波形の減衰が-3dBになるように処理しています。
Qゆっくりと変化するRPM波形をX軸にして温度や振動等のXY波形を描きたいが、RPM波形に高周波ノイズが乗っているためハイパスフィルターを掛けたところ、RPM波形が時間軸で少し遅れてしまった。
Q波形データに抜けがあるか確認したい。
波形データを読み込んだ際、[データ形式]が"標準データ"(時間軸が等間隔のデータ)である場合は基本的に(少なくとも読み込めている範囲には)データに抜けはありません。
[データ形式]が"XYデータ"となっている場合は時間軸が等間隔ではないためデータに抜けがあるかもしれません。
そのような場合には.X要素を微分して隣接するサンプリングポイント間の差(=時間差)を求め、その結果の最大値、最小値、平均値を比べることにより抜けがあるかどうか調べる事ができます。
時間差の最大値、最小値、平均値がほぼ一致する場合はデータに抜けはないと考えられます。最大値、最小値に大きな差がある場合は抜けがあることが考えられます。また平均値が最大値に近いほど抜けの間隔が大きいまたは抜けの数が多いと考えられます。
例)
_diff = Diff(XYData.X)
_max = Max(_diff)
_min = Min(_diff)
_mean = Mean(_diff)
Qシーケンスの処理時間を計測したい。
Qプログレスバーのような、シーケンスの実行状況の進捗を表示したい。
プログレスバー機能は用意されていませんが、カーブウィンドウのバーメーター表示で進捗情報のような表示を行うことは可能です。
例)
Progress = 0 '%' ; 進捗
CwNewWindow("Cv1", "show")
CwSelectWindow("Cv1")
CwAction("reset")
CwPosition(0, 0, 240, 480)
CwNewChannel("append last axis", Progress)
CwDisplaySet("displaymode", 6) ; バーメーター表示
CwSelectByIndex("y-axis", 1)
CwAxisSet("range", 4)
CwAxisSet("min", 0)
CwAxisSet("max", 100)
_loop = 500 ; 繰り返し処理したい回数
for _iii = 1 to _loop step 1
Progress = _iii / _loop * 100 '%' ; 進捗表示を更新
; 処理
end
繰り返し数が大きい場合は下記の様に一定数ごとに表示すると表示の更新による負荷を軽くできます。
例)
_loop = 123456 ; 繰り返し処理したい回数
_nnn = _loop / 100 ; _nnn回(1%)ごとに進捗表示を更新
for _iii = 1 to _loop step 1
if Mod(_iii, _nnn) = 0 ; _nnn回(1%)ごとに
Progress = _iii / _loop * 100 '%' ; 進捗表示を更新
end
; 処理
end
Progress = 100 '%' ; 進捗を更新
Q(Ver 7.2以降) 関数ボックスに関数一覧が表示されず、お気に入りだけが表示される。
QFAMOSメイン画面のGUIを表示せずにシーケンスを実行したい。
コマンドプロンプトやバッチファイルで下記の様に実行することでFAMOSメイン画面のGUIを表示することなくシーケンスを実行することができます。ただし、起動時のimc社のロゴは表示されます。
Load.seqを実行する例)
> start /min Load.seq
注1) FAMOS.exeにPATHが通っていることと、.seqファイルがFAMOS.exeに関連付けされていることが必要です。通常これらはFAMOSインストール時に設定されていますが、エラーが発生する場合はご確認下さい。
注2) シーケンス実行完了後にコマンドプロンプトやバッチファイルで何らかの操作(出力ファイルのコピーなど)を行う場合はstartコマンドの代わりにcallコマンドを使用して下さい。詳しくはコマンドプロンプトで helpコマンドを実行してご確認下さい。
Q0056のように0付の番号でファイル名・フォルダ名を生成したい。(Ver.7.0以降)
Q複数のグループ変数にある同じチャンネルをまとめたい
FAQ ID:s073
例えば、以下のようにGrp1,Grp2,Grp3があります。この中にch1,ch2,ch3,ch4がそれぞれあります。
このとき、各グループのch2だけで新しいグループ変数を作成することはできますか?
結果をResultとすれば、以下で実現可能です。
Result:grp1_ch2=Grp1:ch2 Result:grp2_ch2=Grp2:ch2 Result:grp3_ch2=Grp3:ch2
尚、自動処理したい場合には以下のようになります。
i=1 while i<=3 grpname = "Grp"+TForm(i,"F00") resultch = grpname+"_ch2" Result:<resultch>=<grpname>:ch2 i=i+1 end
Q0056のように0付の番号でファイル名・フォルダ名を生成したい。
FAQ ID:s071
番号順にデータを保存したいと考えていますが、1,2,3..のように並べると、エクスプローラで見たときに1,10,11...のように順番が異なってしまいます。
0056のように0をつけると順番に並ぶのでそのように出力したいです。
回答以下のシーケンスで対応可能です。
以下のシーケンスはサブシーケンスとして作成しています。
Sequence CreateNumberString "56", 4, result
と呼び出すと、"0056"がresultに出力されます。
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;
; 0付の番号ファイル名 [0046] を生成します
;
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
; 引数
;----------------------------------------------------------------
_k2_numstr = PA1 ;数字の文字列を指定します
_k2_digit = PA2 ;桁数
; Example
; _k2_numstr = "56"
; _k2_digit = 4
_k2_number = TtoSv(_k2_numstr, "F")
_k2_temp=""
_k2_cnt=1
while _k2_cnt<=_k2_digit
if _k2_number <= 10^(_k2_digit-_k2_cnt)-1
_k2_temp = _k2_temp+"0"
end
_k2_cnt=_k2_cnt+1
end
_k2_result = _k2_temp+TForm( _k2_number, "F00")
;戻り値
;----------------------------------------------------------------
PA3 = k2_result ;文字列
;変数のクリーンナップ
;----------------------------------------------------------------
Delete _k2_*
Qフォルダー名をグループ名とし、フォルダー内のデータをそのグループのデータとして読み込む
FAQ ID:s032
例えば、下(左)のようなフォルダー構成になっていると仮定します。
Test1やTest2フォルダーを選択することで、フォルダー名をグループ変数として、それぞれのデータを下表(右)のように読み込むことができますか?
C:\TOYO ├ \Test1 │ Sample1.dat │ Sample2.dat │ Sample3.dat │ Sample4.dat └ \Test1 Sample1.dat Sample2.dat Sample3.dat Sample4.dat
以下のシーケンスで実現することができます。
ポイントは取得したグループ名を<>を使って変数として扱うことです。
;フォルダー選択 ; ダイアログボックスが表示されるので、処理したいフォルダーを選択します ; 第2引数の”C:\”はデフォルトで開くフォルダーを指定します。 ; 都合のよい場所を指定してください。 _dir = FsDlgSelectDirectory( "フォルダー選択", "C:\", 0) IF TLeng(_dir) > 0 ;フォルダー名のグループ変数を作成 _grName = FsSplitPath( _dir, 2) <_grname> = GrNew() ;フォルダー内にあるファイルのリストを作成 _FileListID = FsFileListNew (_dir, "*.*", 0, 0, 0) _n = FsFileListGetCount( _FileListID) _i=1 WHILE _i <= _n ;各ファイルに対して処理を実行 _fname = FsFileListGetName( _FileListID, _i) ;データファイル読み込み _fid = FileOpenDSF( _fname, 0) ;読み取り専用 _varname = FileObjName?( _fid, 1) <_grname>:<_varname> = FileObjRead( _fid, 1) _err = FileClose(_fid) _i = _i+1 END FsFileListClose(_FileListID) END ;中間変数を削除 Delete _*
Q日付フォルダー内のデータをループで結合する方法
FAQ ID:s066
フォルダー名が日付になっていると”その1”の方法ではエラーが表示されてしまいます。どのように対応すればよいですか?
; C:\imc\dat\Experim\ ; | ; |__ 2003-01-23 10-31-22 (1)\ ; | Channel1.DAT ; | Channel3.DAT ; |__ 2003-01-23 10-31-32 (2)\ ; | Channel1.DAT ; | Channel3.DAT ; |__ 2003-01-23 10-31-42 (3)\ ; | Channel1.DAT ; | Channel3.DAT
上記のようにフォルダー名にスペースや括弧が含まれている場合、関数"LOAD"はパスを認識できません。
このような場合、ファイル関数を使用してください。
Example
;;;;ダミーデータの作成 Channel1 = Leng(0,0) Channel3 = Leng(0,0) ;;;;Main Loop FID = FsFileListNew("c:\imc", "*.*", 1, 0, 0) i=1 While i<=FsFileListGetCount(FID) ;;;;ファイル名の作成 dir = FsFileListGetName(FID,i) Name1 = dir + "\Channel01.RAW" Name2 = dir + "\Channel03.RAW" ;;;;データの読み込み DID = FileOpenDSF(Name1,0) data1 = FileObjRead(DID,1) Err = FileClose(DID) DID = FileOpenDSF(Name2,0) data2 = FileObjRead(DID,1) Err = FileClose(DID) ;;;;データの結合 Channel1 = Join( Channel1, data1) Channel3 = Join( Channel3, data1) i=i+1 End FsFileListClose(FID)