FAMOS

シーケンス / 関数top

Tips

Q波形の位相ずれがないフィルターとは。

A

FiltLP()関数等で波形をフィルターするとフィルター次数に応じた位相ずれ(時間軸上での遅れ)が生じます。
Professional以上に含まれますFiltLPZ()関数等を使用すると位相ずれのないフィルターが可能です。

原理的には下記の処理を行っています。
1) 適用したいフィルター次数の半分の次数でFiltLP()関数を適用する。
2) Mirror()関数で波形をX軸反転する。
3) 適用したいフィルター次数の半分の次数でFiltLP()関数を適用する。
4) Mirror()関数で波形をX軸反転して元にもどす。

ただし上記の手順ではフィルターを2回行っているためカットオフ周波数での波形の減衰が-6dBになります。
FiltLPZ()関数等は上記と同じ手順でカットオフ周波数での波形の減衰が-3dBになるように処理しています。

製品詳細はこちら

回答を閉じる

Qゆっくりと変化するRPM波形をX軸にして温度や振動等のXY波形を描きたいが、RPM波形に高周波ノイズが乗っているためハイパスフィルターを掛けたところ、RPM波形が時間軸で少し遅れてしまった。

A

FiltHP()関数でRPM波形をフィルターすると、フィルター次数に応じた位相ずれ(時間軸での遅れ)が生じます。

対処法として下記2点が考えられます。

1) Y軸に使用する波形を同じ次数のフィルターに掛けて位相を合わせる。
2) 位相ずれのないハイパスフィルターFiltHPZ()関数を使用してRPM波形をフィルターする。
(注)FiltHPZ()関数はProfessional以上が必要です。

製品詳細はこちら

回答を閉じる

Q波形データに抜けがあるか確認したい。

A

波形データを読み込んだ際、[データ形式]が"標準データ"(時間軸が等間隔のデータ)である場合は基本的に(少なくとも読み込めている範囲には)データに抜けはありません。
[データ形式]が"XYデータ"となっている場合は時間軸が等間隔ではないためデータに抜けがあるかもしれません。
そのような場合には.X要素を微分して隣接するサンプリングポイント間の差(=時間差)を求め、その結果の最大値、最小値、平均値を比べることにより抜けがあるかどうか調べる事ができます。
時間差の最大値、最小値、平均値がほぼ一致する場合はデータに抜けはないと考えられます。最大値、最小値に大きな差がある場合は抜けがあることが考えられます。また平均値が最大値に近いほど抜けの間隔が大きいまたは抜けの数が多いと考えられます。

例)
_diff = Diff(XYData.X)
_max = Max(_diff)
_min = Min(_diff)
_mean = Mean(_diff)

製品詳細はこちら

回答を閉じる

Qシーケンスの処理時間を計測したい。

A

TimeSystem?()関数で現在時刻を取得することができます。処理前後の時間を取得し、TimeDiff()関数で差を求めることにより、処理にかかった時間を求めることができます。

例)
_t1 = TimeSystem?() ; 開始前の時間
; 時間が掛かる処理
; ...
_t2 = TimeSystem?() ; 終了後の時間
Time = TimeDiff(_t2, _t1) ; 処理に掛かった時間

製品詳細はこちら

回答を閉じる

Qプログレスバーのような、シーケンスの実行状況の進捗を表示したい。

A

プログレスバー機能は用意されていませんが、カーブウィンドウのバーメーター表示で進捗情報のような表示を行うことは可能です。

例)
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以降) 関数ボックスに関数一覧が表示されず、お気に入りだけが表示される。

A

関数ボックスのギア型のアイコンをクリックして、「お気に入りの表示」のチェックマークを外して下さい。

製品詳細はこちら

回答を閉じる

QFAMOSメイン画面のGUIを表示せずにシーケンスを実行したい。

A

コマンドプロンプトやバッチファイルで下記の様に実行することで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以降)

A

Ver.7.0以降ではTForm(,"g")関数により0付の番号のテキストを作成できます。

例)

_FolderName = "Folder" + TForm(56, "g4.0")

製品詳細はこちら

回答を閉じる

Q複数のグループ変数にある同じチャンネルをまとめたい

FAQ ID:s073

Q

例えば、以下のようにGrp1,Grp2,Grp3があります。この中にch1,ch2,ch3,ch4がそれぞれあります。

このとき、各グループのch2だけで新しいグループ変数を作成することはできますか?

A

結果を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

A

番号順にデータを保存したいと考えていますが、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

Q

例えば、下(左)のようなフォルダー構成になっていると仮定します。
Test1やTest2フォルダーを選択することで、フォルダー名をグループ変数として、それぞれのデータを下表(右)のように読み込むことができますか?

C:\TOYO
   ├ \Test1
   │    Sample1.dat
   │    Sample2.dat
   │    Sample3.dat
   │    Sample4.dat
   └ \Test1
         Sample1.dat
         Sample2.dat
         Sample3.dat
         Sample4.dat

A

以下のシーケンスで実現することができます。
ポイントは取得したグループ名を<>を使って変数として扱うことです。

;フォルダー選択
;  ダイアログボックスが表示されるので、処理したいフォルダーを選択します
;  
第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

A

フォルダー名が日付になっていると”その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)

製品詳細はこちら

回答を閉じる

Q文字列の連結1

FAQ ID:s041

A

TAdd関数を使用します。

Result = TAdd( "ABC", "DEF")

結果は"ABCDEF"となります。

製品詳細はこちら

回答を閉じる

Q文字列の連結2

FAQ ID:s042

A

+演算子を使用します。

Result = "ABC" + "DEF"

結果は"ABCDEF"となります。

製品詳細はこちら

回答を閉じる

Q大文字を小文字に変換

FAQ ID:s043

A

TConv関数を使用します。

Result = TConv( "Hello", 1)

結果は"hello"となります。

製品詳細はこちら

回答を閉じる

Q小文字を大文字に変換

FAQ ID:s044

A

TConv関数を使用します。

Result = TConv( "Hello", 2)

結果は"HELLO"となります。

製品詳細はこちら

回答を閉じる

Q前にあるスペースを削除

FAQ ID:s045

A

TConv関数を使用します。

Result = TConv( " This is a pen ", 4)

結果は"This is a pen"となります。

製品詳細はこちら

回答を閉じる

Q後にあるスペースを削除

FAQ ID:s046

A

TConv関数を使用します。

Result = TConv( " This is a pen ", 5)

結果は" This is a pen"となります。

製品詳細はこちら

回答を閉じる

Q全てのスペースを削除

FAQ ID:s047

A

TConv関数を使用します。

Result = TConv( " This is a pen ", 6)

結果は"This is a pen"となります。

製品詳細はこちら

回答を閉じる

Q文字列の長さ

FAQ ID:s048

A

TLeng関数を使用します。

Result = TLeng( "This is a pen")

結果は 13 となります。

製品詳細はこちら

回答を閉じる