FAMOS

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

Q波形のサンプリング周波数を1/N倍にしたい。

A

Red()関数で補間することによりサンプリング周波数を1/N倍にできます。


例)
Data = Cos(Ramp(0, 0.001, 1000)*PI2*5) ; サンプルデータ。1kHzサンプリング
Result = Red(Data1, 10) ; サンプリング周波数1/10倍(100Hz)

製品詳細はこちら

回答を閉じる

Q波形のサンプリング周波数をN倍にしたい。

A

IPol()関数で補間することによりサンプリング周波数をN倍にできます。


例)
Data = Cos(Ramp(0, 0.001, 1000)*PI2*5) ; サンプルデータ。1kHzサンプリング
Result = Ipol(Data, 10) ; サンプリング周波数10倍(10kHz)

製品詳細はこちら

回答を閉じる

Qサンプリング周波数の違う波形のサンプリングを合わせたい。

A

RSamp()関数でリサンプリングをしてください。


例)
Data1 = Cos(Ramp(0, 0.001, 1000)*PI2*5) ; サンプルデータ。1kHzサンプリング
Data2 = Sin(Ramp(0, 0.01, 100)*PI2*5) ; サンプルデータ。100Hzサンプリング

Result1 = RSamp(Data1, Data2) ; Data2を基準にData1をリサンプリング=Data1を100Hzでリサンプリング
Result2 =RSamp(Data2, Data1) ; Data1を基準にData2をリサンプリング=Data2を1kHzでリサンプリング

製品詳細はこちら

回答を閉じる

Qサンプリング周波数1kHzの波形をFFTしたら500Hzまでしか表示されない。

A

サンプリング定理によりサンプリング周波数の半分までが有意でありそれ以上は無意味であるため、情報量を削減する点からサンプリング周波数の半分までの周波数解析結果がFFT()関数等のFFT処理関数の結果になります。

製品詳細はこちら

回答を閉じる

QCSVファイルなどから読み込んだ波形に波形の開始時間(絶対時間)を指定したい。

A

TimeJoin()関数で任意の時刻情報を作成することができ、SetTime()で波形の作成日時に適用することができます。

例)
_datetime = TimeJoin(5, 2, 2023, 14, 25, 36) ; 2023年2月5日 14時25分36秒
SetTime(Data, _datetime) ; 波形に適用

製品詳細はこちら

回答を閉じる

Q複数波形に同じ処理をしたい。

A

VarGetInit(1)関数で変数リストで選択した変数の一覧を取得することが、VarGetName? ()でそのリストから変数名を取得できます。

例)
_nnn = VarGetInit(1)
for _iii = 1 to _nnn
_name = VarGetName?(_iii) ; 選択した波形のうちの1つの変数名
_temp = (_name); 選択した波形のうちの1つの変数をコピー

; 実施したい処理
; ...
end

図) 変数リストでSintest2~4を選択した例

製品詳細はこちら

回答を閉じる

Qダブルクォーテーション、タブ、改行を含む文字列を作成したい。

A

SvToChar()にアスキーコードを指定することで改行等の文字列を作成することができます。

例)
_dq = SvToChar(0x22) ; "
_tab = SvToChar(0x09) ; TAB
_CRLF = SvToChar(0x0D) + SvToChar(0x0A) ; 改行 CRLF ¥r¥n
_path = _dq + "C:¥imc¥Dat¥sintest1.dat" + _dq ; "C:¥imc¥Dat¥sintest1.dat"

製品詳細はこちら

回答を閉じる

Qリサージュ波形のようなX軸データが単調増加ではない折り返しのあるXY波形を共通の時間で切り出したい。

A

XY波形を共通の時間で切り出す場合、XY波形の.X要素、.Y要素をCut()関数などで切り出してから、XYof()関数で再度XY波形を作成してください。

例)
_theta = ramp(0, 0.001, 1001)*PI2
Data = XYof(2*sin(3*_theta), 2*span class="color-blue">sin(4*_theta)) ; サンプル波形(周期1秒のリサージュ波形)
Data2 = XYof(Cut(Data.X, 0.2, 0.4), Cut(Data.Y, 0.2, 0.4)); 0.2~0.4秒間を切り出し

 

製品詳細はこちら

回答を閉じる

Qファイルのパスからファイル名を抜き出したい。

A
FsSplitPath(, 4)関数を使用して下さい。
例)
FileName = FsSplitPath(_path, 4) ; ファイル名
FolderName = FsSplitPath(_path, 8) ; ファイルを格納しているフォルダーのパス

 

製品詳細はこちら

回答を閉じる

Q変数が格納されていたファイルの保存先(パス)を知りたい。

A
FileName?()関数を使用して下さい。
計算結果などのシーケンスで作成した変数の場合は空の文字列が返されます。
 

 

製品詳細はこちら

回答を閉じる

Q変数をブール値として扱い反転させたい。

A
NOT()関数を使用して下さい。
例)
_bool = 0
_bool2 =NOT(_bool) ; 0→1, 1→0

 

製品詳細はこちら

回答を閉じる

Q秒としての数値(例100秒)をテキストで分:秒(1:40)の形式で表したい。

A
TimeToText()関数を使用してください。
例)
_sec = 200 ; 時間(秒)
_minsec = TimeToText(_sec, 2) ; 分:秒形式
switch _sec ; テキストの桁合わせ
case 0 to 600-1 ; 10分未満
_minsec = TPart(_minsec, 5, 8)
case 600 to 3600-1 ; 1時間未満
_minsec = TPart(_minsec, 4, 8)
case 3600 to 36000-1 ; 10時間未満
_minsec = TPart(_minsec, 2, 8)
end

製品詳細はこちら

回答を閉じる

Q値が一致するか確認する際、ある程度の範囲をもって一致するか判断したい。

A
if文で範囲内に入っているか判定することもできますが、この用途にはEqual()関数が便利です。
Equal()関数はimc FAMOS Ver 7.2以降のProfessional版が必要です。

例)
A = 2
B = sqrt(2)^2 ; ルート2は無理数。PC上では打ち切り誤差が発生するため2乗しても厳密には2になりません。
Precision15digit = Equal(A, B, 1e-15) ; 一致と判定され、結果は1
Precision16digit = Equal(A, B, 1e-16) ; 不一致と判定され、結果は0

 

製品詳細はこちら

回答を閉じる

Q加速度信号を変位にしたい。

A
Int()関数で積分して下さい。
例)
Velocity = Int(Acceleration) ; 加速度を積分して速度に
Displacement = Int(Velocity) ; 速度を積分して変位に
または
Displacement = Int( Int(Acceleration)) ; 加速度を2回積分して変位に

 

製品詳細はこちら

回答を閉じる

Q位相を0~360度で表示したい。

A
PhaseMod()関数で位相の表示範囲を変換することができます。
PhaseMod()関数はimc FAMOS Ver 7.3以降が必要です。
例)
_fft = FFT(Data)
_fft.P = PhaseMod(_fft.P, "360")
 

 

製品詳細はこちら

回答を閉じる

Q条件に合う名前の変数を抜き出したい。

A
VarGetInit2()関数を使用して下さい。

 

製品詳細はこちら

回答を閉じる

Q複数の条件に合う名前の変数を抜き出したい。

A
VarGetInit2()関数では複数の条件を指定することは出来ないため、複数の条件を1つずつ判定するシーケンスを作成して下さい。
または、この用途にはTxRegexMatch()関数が便利です。TxRegexMatch()関数は、Microsoft .NET Frameworkに実装されている正規表現用パッケージを使用します。正規表現の詳細については、Microsoft .NET Frameworkのドキュメントを参照して下さい。
TxRegexMatch()関数はimc FAMOS Ver 7.2以降が必要です。


例)
; 変数名のサンプル
float_GPS_Latitude = 35.681226
float_GPS_Longitude = 139.766839
Speed = 30
StressTestPoint1 = 10
StressTestPoint2 = 20
StressTestPoint3 = 30
Gear = 3
RPM = 2000

; 変数リストに登録されている変数名をテキスト配列に格納
_nnn = VarGetInit2("Tx*", 1) ; テキスト配列(Tx,Tx1,...)は除外
Tx = TxArrayCreate(0)
for _iii = 1 to _nnn step 1
    Tx = TxArrayInsert(Tx, VarGetName?(_iii), -1)
end

; 変数名に GPS または test を含む変数名
Tx1 = TxRegexMatch(Tx, ".*(GPS|test).*", "", 1)
; 空行を削除
for _iii = TxArrayGetSize(Tx1) to 1 step -1
    if 0 = TLeng(Tx1[_iii])
        Tx1 = TxArrayDelete(Tx1, _iii)
    end
end

; 変数名に GPS または test を含まない変数名
Tx2 = TxRegexMatch(Tx, ".*^(?!.*(GPS|test)).*", "", 1)
; 空行を削除
for _iii = TxArrayGetSize(Tx2) to 1 step -1
    if 0 = TLeng(Tx2[_iii])
        Tx2 = TxArrayDelete(Tx2, _iii)
    end
end

; 変数名に GPS と Latitude を2つとも含む変数名
Tx3 = TxRegexMatch(Tx1, "(?=.*GPS)(?=.*Latitude).*", "", 1)
; 空行を削除
for _iii = TxArrayGetSize(Tx3) to 1 step -1
    if 0 = TLeng(Tx3[_iii])
        Tx3 = TxArrayDelete(Tx3, _iii)
    end
end

; 変数名に GPS と Latitude を2つとも含まない変数名
Tx4 = TxRegexMatch(Tx, "^(?!.*(?=.*GPS)(?=.*Latitude)).*", "", 1)
; 空行を削除
for _iii = TxArrayGetSize(Tx4) to 1 step -1
    if 0 = TLeng(Tx4[_iii])
        Tx4 = TxArrayDelete(Tx4, _iii)
    end
end

; 変数名に GPS を含み Latitude を含まない変数名
Tx5 = TxRegexMatch(Tx, "^(?=.*GPS)(?!.*Latitude).*", "", 1)
; 空行を削除
for _iii = TxArrayGetSize(Tx5) to 1 step -1
    if 0 = TLeng(Tx5[_iii])
        Tx5 = TxArrayDelete(Tx5, _iii)
    end
end

del _*

 

製品詳細はこちら

回答を閉じる

Qテキストボックスやマーカーに複数行のテキストを表示したい。

A
テキスト変数に改行を含むテキストを格納して、テキストボックスやマーカーに適用してください。

例)
Data = Mod(ramp(0, 1, 500), 120) ; サンプルデータ
_x = 200 ; マーカーを表示する位置(時間)
_y = Value(Data, _x)

_CRLF = SvToChar(0x0D) + SvToChar(0x0A) ; 改行 CRLF \r\n
_text = "1行目: " + TForm(_x, "F1.1") + _CRLF + "2行目: " + TForm(_y, "F1.1") ; 複数行のテキスト

; カーブウィンドウで表示
CwNewWindow("Cv1", "show")
CwSelectWindow("Cv1")
CwAction("reset")
CwPosition(0,0,640,480)
CwNewChannel("append last axis", Data)
CwNewElement("marker")
CwSelectByIndex("marker", 1)
CwMarkerSet("x.type", 1)
CwMarkerSet("y.type", 1)
CwMarkerSet("x", _x)
CwMarkerSet("y", _y)
CwMarkerSet("text", _text) ; 複数行のテキストをマーカーに表示

del _*

 

製品詳細はこちら

回答を閉じる

Q変数から[測定]名を削除したい。

A

SetMeasurementName()関数で空文字をセットして下さい。

例)
SetMeasurementName(_data, "")

製品詳細はこちら

回答を閉じる

Q極大値、極小値を絶対値が大きい順にトップ10を求めたい。

A

直接求める関数は用意されてないため、下記の様なシーケンスで求めて下さい。

; 極大値、極小値の絶対値が大きい順にTOP10を求める
_sin = sin(ramp(0,0.01,500)*PI2)*ramp(0,0.01,500) ; サンプルデータ作成用
Data = Join(_sin, -Mirror(_sin)*0.8) ; サンプルデータ

_max = xMax( Data, -1e35) ; 極大値のX座標
_min = xMax(-Data, -1e35) ; 極小値のX座標
_x = Sort(Join(_max, _min), 1) ; 昇順で並べた極大値、極小値のX座標
_y = Value(Abs(Data), _x) ; 極大値、極小値の値の絶対値
_sort = Sort(XYof(_x, _y), 6) ; Y値(絶対値)の降順で並べ替え
_xy = XYof(_sort.x, Value(Data, _sort.x)) ; 元のY値でXY波形を作成
TOP10 = CutIndex(_xy, 1, 10) ; 上位10
TOP10Y = TOP10.Y ; 上位10のY値

; カーブウィンドウで表示
CwNewWindow("Cv1", "show")
CwSelectWindow("Cv1")
CwAction("reset")
CwPosition(0,0,640,480)
CwDisplaySet("title", "")
CwNewChannel("append last axis", Data)
CwNewChannel("append last axis", TOP10)
CwLineSet("type", 0)
CwLineSet("symbol", 8)
; マーカーで順位を表示
_th = Max(Data)-(Max(Data)-Min(Data))*0.1
for _iii = 1to 10 step 1
    CwNewElement("marker")
    CwSelectByIndex("marker", _iii)
    CwMarkerSet("x.type", 1)
    CwMarkerSet("y.type", 1)
    CwMarkerSet("x", TOP10[_iii].X)
    CwMarkerSet("y", TOP10[_iii].Y)
    CwMarkerSet("text", _iii)
    if _th < TOP10[_iii].Y
        CwMarkerSet("angle", -45)
    end
end
del _*

製品詳細はこちら

回答を閉じる