FAMOS
Tipsに関するFAQ
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)
Q文字列の連結1
Q文字列の連結2
Q大文字を小文字に変換
Q小文字を大文字に変換
Q前にあるスペースを削除
Q後にあるスペースを削除
Q全てのスペースを削除
Q文字列の長さ
Q文字の検索
Q文字列の一部を取得
FAQ ID:s050
文字列"This is a pen"から"is"取得します。
Result = TPart( "This is a pen", 6, 2)
結果は"is"となります。
例えば、"is"以降の文字列を取得したい場合、TxWhereやTLeng関数を使用すると取得できます。
Str1 = "This is a pen" ;検索される文字列 Str2 = "is" ;検索したい文字列 Leng1 = TLeng( Str1) ;検索する文字の長さ=13 Leng2 = TLeng( Str2) ;検索する文字の長さ=2 Position = TxWhere( Str1, Str2) ;検索する文字の位置=6 Result = TPart( Str1, Position, Leng1-Leng2+1) ;"is a pen"