引数
|
チャンネル番号 |
整数部が0〜15の値です。小数点以下は切捨てられます。
0〜7は本体のアナログ入力チャンネルです。
8〜15は、アナログ入力増設用拡張インターフェースの入力チャンネルです。
|
オフセット電圧 | 変換値が0となる電圧(単位ボルト)です。 |
スケール値 | 1Vあたりの数値です。 |
等価式
| 信号の値 =( 入力電圧 − オフセット電圧 ) × スケール値 |
例1
| v = Ain( 2, 0, 1 );
信号vはチャンネル2の電圧値になります。単位は[V]です。
|
例2
|
acc = Ain( 1, 2.5, 9.8 );
2.5Vを0 m/s2とし、1Vあたり9.8m/s2の感度(の逆数)がある加速度センサを
チャンネル1に接続した場合、信号accは[m/s2]を単位とする加速度になります。
|
例3
|
temp = Ain( 3, 5, 10 ) + 20;
5Vのとき20℃で、10度あたり1Vの感度がある温度センサをチャンネル3に接続した場合、
信号tempは[℃]を単位とする温度になります。
|
例4
|
proc | |
{ | |
| Input = Ain( 3, 0, 1 ); | |
// チャンネル3から入力 |
| FilterOut = bqLpf( Input, 100, 0.5 ); | |
// 2次ローパスフィルタ |
| Aout( 5, 0, 1, FilterOut ); | |
// チャンネル5へ出力 |
} | |
アナログ入力第3チャンネルから入力した信号を、固有周波数100rad/s、ダンピングファクタ0.5の2次ローパスフィルタに通し、アナログ出力第5チャンネルへ出力します。 |
参考
|
アナログ入力には、CRフィルタとA/D変換機内蔵の帯域10KHzのアンチエリアスフィルタがあります。
→アナログ入出力コネクタのピン番号、ケーブル番号
→信号線の接続手順
→アナログ入力の保護
|
注意
| 同じチャンネルに対して複数回の入力文を記述しても、実際のアナログ入力は1周期について1回だけしか実行されません。
関数 Ain は変換されたデータをユーザに渡すだけなので、スケール値とオフセット値が同じなら全て同じ値になります。
→入出力タイミング
|
(3)アナログ信号の出力
説明
| 信号の値を電圧に変換し、アナログ出力コネクタの指定チャンネルへ出力します。 |
書式
| Aout( チャンネル番号,オフセット値,スケール値,信号名 ); |
引数
|
チャンネル番号 | 整数部が0〜15の値です。小数点以下は切捨てられます。
0〜7は本体のアナログ出力チャンネルです。
8〜15は、アナログ出力増設用拡張インターフェースの出力チャンネルです。 |
オフセット電圧 | 信号の値が0のとき出力される電圧です。 |
スケール値 | 出力が1V変化するために必要な信号の変化量です。 |
信号名 | 出力させる信号の名前です。 |
|
等価式
| 出力電圧=信号値/スケール値 + オフセット電圧 |
例1
| Aout( 2,0, 1,v );
信号vの値を電圧値(単位V)でチャンネル2へ出力します。
|
例2
| Aout( 3,2.5, 0.2,mon );
信号monの値を0.2/Vのスケールで電圧へ変換し、2.5Vのオフセット電圧を加えてチャンネル3へ出力します。
例えばmon=0.5なら、チャンネル3の出力電圧は0.5/0.2+2.5=5.0Vになります。
|
例3
|
proc
{
ch = 0; // 0chから7chまで
while ch<8 // 8回くり返す
{
Aout( ch, 0, 1, cmd ); // cmd の値を電圧で出力
ch = ch + 1; // 次のチャンネルを指定する
}
}
0〜7チャンネルへパラメータ cmd の電圧を出力します。値はオペレーションウィンドウから与えます。 |
参考
| 出力電流の8チャンネル合計はおよそ±50mAに制限されます。
→アナログ信号の出力
→アナログ入出力コネクタのピン番号、ケーブル番号
→信号線の接続手順
|
注意
| 同じチャンネルへ複数回のアナログ電圧出力を記述した場合、最後の記述だけが有効です。
→入出力タイミング
|
(4)デジタル信号の入力
説明 | デジタル入力端子の状態をビット単位で入力します。 |
書式 | Din( 端子番号, ハイ値, ロー値 ) |
引数
|
端子番号 | 0〜7の値で入力端子を表します。小数点以下は切捨てられます。 |
ハイ値 | 入力がHigh のとき返す値です。 |
ロー値 | 入力がLowのとき返す値です。 |
|
例1
| sign = Din( 0, 10, -10 );
信号signの値は、デジタル入力端子Din0の電位がHigh のとき+10、Lowのとき-10になります。
|
参考
| 入力の論理は入力電圧が 約2.0V以上でHigh、約0.8V以下でLowです。
その中間の電圧値では不定(HighまたはLow)となります。入力に何も接続されていない場合はLowになります。
→デジタル入出力コネクタのピン番号、ケーブル番号
|
注意
|
デジタル入力はLVTTL(0〜3.3V)です。負電圧や5V以上の電圧が加わりますと破損する恐れがあります。
同じチャンネルについて複数回のデジタル入力を記述しても、実際の入力は1回しか行われませんので、同じ値になります。
→入出力タイミング |
(5)デジタル信号の出力
説明
| デジタル出力ポートにビット単位で出力します。 |
書式
| Dout( チャンネル番号,しきい値,信号名 ); |
引数
|
チャンネル番号 | 0〜7の値で入力端子D0〜D7を表します。
小数点以下は切捨てられます。 |
しきい値 | 信号の値がこの値より大きい場合Highを出力し、それ以外のときLowを出力します。 |
信号名 | 出力する信号の名前です。 |
|
等価式
| if var > threshold then Dout[ch]=High else Dout[ch]=Low |
例1
| Dout( 1,0.5,err );
デジタル出力端子 Dout1 の論理は、err の値が0.5より大きい場合 High、0.5より小さい場合 Low となります。
|
参考
| デジタル出力電圧は出力電流に依存し、Low出力時電圧は吸込み最大電流8mA未満で0.4V以下、
High 出力時電圧は吐き出し電流4mA未満で2.9V以上になります。電流が少ないほどHigh電圧は3.3Vに、Low電圧は0Vに近づきます。
→デジタル入出力コネクタのピン番号、ケーブル番号
|
注意
|
同じチャンネルへ複数回のデジタル出力を記述した場合、最後の記述だけが有効になります。
→入出力タイミング |
(6)デジタル信号のバイナリ入力
説明 | デジタル入力ポートから8ビットのバイナリデータを入力します。 |
書式 | Bin( ) |
引数 | なし |
真理表
|
入 力 論 理 | 入力結果 |
Din7 |
Din6 |
Din5 |
Din4 |
Din0 |
Din2 |
Din1 |
Din0 |
Low | Low | Low | Low |
Low | Low | Low | Low | 0 |
Low | Low | Low | Low |
Low | Low | Low | High | 1 |
Low | Low | Low | Low |
Low | Low | High | Low | 2 |
Low | Low | Low | Low | Low | Low |
High | High | 3 |
Low | Low | Low | Low | Low |
High | Low | Low | 4 |
Low | Low | Low | Low | Low |
High | Low | High | 5 |
Low | Low | Low | Low | Low |
High |
High | Low | 6 |
Low | Low | Low | Low | Low |
High |
High |
High | 7 |
Low | Low | Low | Low |
High |
Low | Low | Low | 8 |
・・・・・・・・・・・・・ |
High | High |
High | High |
High | High |
Low |
Low |
252 |
High | High |
High | High |
High | High |
Low |
High |
253 |
High | High |
High | High |
High | High |
High | Low |
254 |
High |
High |
High |
High |
High |
High |
High |
High |
255 |
|
例1 | level = Bin( );
信号 level の値は、デジタル入力端子Din0〜Din7の入力論理に応じて、0〜255 の整数値になります。
|
例2 | if Bin( ) & 4 { x=10; } else { x = -10; }
信号 x の値は、デジタル入力端子 Din2 がHighのとき10に、Lowのとき-10になります。
|
参考
| 入力の論理は入力電圧が 約2.0V以上でHigh、約0.8V以下でLowです。その中間の電圧値では不定(HighまたはLow)となります。
入力に何も接続されていない場合はLowと判断されます。 |
注意
| ディジタル入力範囲は0〜3.3Vです。負電圧や5.0V以上の電圧が加わりますと破損する恐れがあります。 |
(7)デジタル信号のバイナリ出力
説明
| デジタル出力ポートに8ビットのバイナリデータを出力します。 |
書式
| Bout( 信号名 ); |
引数 | 信号名 : 出力する信号です。 |
真理表 |
信号の値 |
出力 |
Dout7 |
Dout6 |
Dout5 |
Dout4 |
Dout3 |
Dout2 |
Dout1 |
Dout0 |
1未満 | Low | Low | Low |
Low | Low |
Low | Low | Low |
1以上2未満 |
Low | Low |
Low | Low |
Low | Low |
Low | High |
2以上3未満 |
Low | Low |
Low | Low |
Low | Low |
High | Low |
3以上4未満 |
Low | Low |
Low | Low |
Low | Low |
High |
High |
4以上5未満 |
Low | Low |
Low | Low |
Low | High |
Low | Low |
5以上6未満 |
Low | Low |
Low | Low |
Low | High |
Low | High |
6以上7未満 |
Low | Low |
Low | Low |
Low |
High |
High |
Low |
7以上8未満 |
Low | Low |
Low | Low |
Low | High |
High |
High |
8以上9未満 |
Low | Low |
Low | Low |
High | Low |
Low | Low |
・・・・・・・・・・・・・ |
251以上252未満 |
High | High |
High | High |
High | Low |
High | High |
252以上253未満 |
High | High |
High | High |
High | High |
Low | Low |
253以上254未満 |
High | High |
High | High |
High | High | Low |
High |
254以上255未満 |
High | High |
High | High |
High | High |
High | Low |
255以上 |
High | High |
High | High |
High | High |
High | High |
|
例1
| Bout( err );
err の値に対応して出力端子D0〜D7 へ真理表の論理を出力します。
|
例2
|
proc | | |
{ | |
| count = count + 1; | | // 前回値を1増やす |
| if count>255 { count=0; } | | // 折り返し |
| Bout( count ); | | // 出力 |
} | |
毎サイクル1ずつ増加する値をデジタル出力端子へ出力し、255を超えると0に戻ります。 |
参考
| デジタル出力電圧は出力電流に依存し、Low出力時電圧は吸込み最大電流8mA未満で0.4V以下、
High 出力時電圧は吐き出し電流4mA未満で2.9V以上になります。
電流が少ないほどHigh電圧は3.3Vに、Low電圧は0Vに近づきます。
|
注意
| バイナリ出力とディジタル出力を混在させた場合、後の記述が前の記述に上書きされます。
例えば、バイナリ出力した後でDx(xは0〜7の任意の数)の出力をディジタル出力で指定すると、
Dx以外にはバイナリ出力の結果が、Dxにはディジタル出力の結果が現れます。
バイナリ出力を後に記述すると、それ以前のディジタル出力は無効になります。
|
(8)拡張インターフェースより入力 ( Aproc-1 Plus 専用 )
説明
| Aproc-1 Plus に接続した拡張インターフェースから入力します。 |
書式
| 信号名 = Xin(チャンネル番号,スケール ); |
引数
|
チャンネル番号 |
0〜N-1 の整数値で、複数ある入力からひとつを選択します。
Nは、宣言文で in=a*b と記述した場合の b の数値です。 |
スケール |
入力データ1ビットに相当する数値です。
|
|
注意
| この命令を使用する場合は拡張宣言が必要です。
Aproc-1 用の拡張インターフェースについては、そのデータシートを参照してください。 |
(9)拡張インターフェースへ出力 ( Aproc-1 Plus 専用 )
説明
| Aproc-1 Plus に接続した拡張インターフェースへ信号の値を出力します。 |
書式
| Xout( チャンネル番号,スケール,信号名 ); |
引数
|
チャンネル番号 |
0〜N-1 の整数値で、複数ある入力からひとつを選択します。
Nは、宣言文で out=c*d と記述した場合の d の数値です。 |
スケール |
出力データ1ビットに相当する信号の値です。 |
信号名 | 出力する信号の名前です |
|
注意
| この命令を使用する場合は拡張宣言が必要です。
Aproc-1 用の拡張インターフェースについては、そのデータシートを参照してください。 |
(10)2相エンコーダの積算値を入力 ( Aproc-1 Plus 専用 )
説明
| Aproc-1 Plusが積算したカウンタパルスの値を読み出します。
入力パルス1周期毎の積算量は4です。 |
書式
| 信号名 = Cin(チャンネル番号,スケール ); |
引数
|
チャンネル番号 |
0 〜 3 の整数値で4チャンネルのうちひとつを選択します。 |
スケール |
入力パルス1/4周期の角度増分を与えます。 スケール=0 のときカウンタは0にリセットされます。
|
|
使用例
| 1回転1000パルス(分解能1/4000回転)のエンコーダを使用していると仮定します。
x = Cin( 1, 360/4000 ); // 信号xの単位は[deg]
x = Cin( 1, 6.2832/4000 ); // 信号xの単位は[rad]
x = Cin( 1, nrst ); // nrst=0のときカウントリセット
|
注意
|
(1) パルス入力の電気仕様は3.3V(5Vまで許容)LVTTLです。RS422など差動信号のエンコーダ
では変換回路が必要です。オープンコレクタの場合は3.3Vへのプルアップ抵抗が必要です。
(2) パルスカウントは、プログラム運転中だけでなく待機時にも行っています。しかし、
データレコーダとして使用した場合は、その前後でカウント値の内容は保証されません。
(3) エンコーダ入力とデジタル入力は共通のコネクタピンを使用していますので、エンコーダ
を接続したピンからのデジタル入力は無意味です。
|
(11)パルス入力 ( 2019年4月以降出荷の Aproc-1 Plus 専用、AprocS 2.3以降 )
説明
| Aproc-1 Plusのデジタル入力信号の周期とオン/オフ時間の計測値を読み出します。 |
書式
| 信号名 = Pin( mode ); |
引数
|
mode = 0 の場合 | 入力信号の周期をミリ秒単位で返します。 |
mode > 0 の場合 | 1周期中で入力信号が High である時間をミリ秒単位で返します。 |
mode < 0 の場合 | 1周期中で入力信号が Low である時間をミリ秒単位で返します。 |
|
使用例
|
duty = Pin(1) / Pin(0); // 信号 duty は入力のデューティー比になります
|
補足
| デジタル入力はコネクタ番号10(Din7) になります。
84MHzのクロックで時間を計測します。
カウンタの桁数は32ビットなので周期約50秒まで計測可能ですが、浮動小数点(仮数部23ビット)に
変換されるため、周期が0.1秒を超えると分解能は徐々に劣化します。
|
(12)PWM信号を出力 ( Aproc-1 Plus 専用 )
説明
| Aproc-1 Plus から、指定した周期とデューティー比のデジタル信号を出力します。
|
書式
| Pout(チャンネル番号,デューティー比 ); |
引数
|
チャンネル番号 |
0 〜 7 の整数値で8チャンネルのうちひとつを選択します。 |
デューティー比 |
出力波の High時間とLow時間の比を0〜1の数値で与えます。
0の場合は常時Low、1の場合は常時High となります。
|
PWM波の周期は、パラメータ periodPWM を定数宣言で指定します(単位ミリ秒)。
デフォルト値(宣言なき場合の値)は、周期 0.1ms(10 KHz)です。 |
使用例
|
periodPWM = 0.2; // PWM周期を0.2ミリ秒(5KHz)に設定
proc
{
mod = w_sin( 1, 0, 0.3 ); // 周期1秒、振幅0.3の正弦波
Pout( 3, mod+0.5 ); // デューティー比が 0.2〜0.8 で変化するPWM波を出力
}
|
注意
| PWM出力コネクタはデジタル出力と兼用なので、両者の合計は常に8チャンネルです。
周期は8チャンネル共通なので、チャンネル毎に設定することはできません。
プログラム停止時の出力は、全チャンネルデジタル(Low)になります。
|
(13)ファイルから信号を入力 ( シミュレーション専用 1.80 以降 )
説明
| CSV形式の数値データファイルから任意の列の数値を制御周期毎に入力します。
ディスプレイウィンドウを記録したファイルをそのまま使うことができますし、
それ以外のデータも、同じ形式のテキストファイルであれば信号処理可能です。 |
書式
| 信号名 = Fin(チャンネル番号,パラメータ名 ) |
引数
|
チャンネル番号 |
データファイルをエクセルで開いたときのA,B,C,・・・・列に対応して 0,1,2,・・・・とつけられた番号です。
0 〜 99 の範囲の数値で与えます。 信号名で与えることはできません。 |
パラメータ名 | 宣言部においてファイル名が定義されたパラメータの名前です。
直接ファイル名を与えることはできません |
|
データ形式
| エクセルで表示できるデータをCSVファイルとして保存したものを対象とします。
その第1行はタイトル行として無視されますので、第2行以降が入力可能な数値となります。
データの行数は、オペレーションウィンドウの設定で、記録時間÷演算周期 で計算される数以上が必要です。また、
読み出しできる最大の列数は100です。(101以上の列があるデータでもそれを読まないなら入力ファイルとして使用できます)
|
使用例
|
file = "data.csv"; // 入力ファイル名
proc
{
x = Fin( 1, file ); // ファイルの第1列(B列)から入力
y = Fin( 3, file ); // ファイルの第3列(D列)から入力
z = bqLpf( x+y, frq, dmp ); // 上記の和をローパスフィルタ処理
}
ファイル data.csv の0から数えた第1列と第3列(エクセルで開いたときのB列とD列)を信号 x と y へ入力し、
これらの和を2次ローパスフィルタで平滑化して信号 z を得ます。
ただし、data.csv はプロジェクトファイルと同じフォルダにあるものとします。
【参考】サンプルプログラム「表計算データの信号入力とその処理」 |
注意
|
- Fin はシミュレーション専用の関数なので、Aproc-1で実行することはできません。
Fin を含むプログラムをコード変換すると、オペレーションウィンドウの運転開始ボタンは使用禁止になります。
- 指定できるデータファイルはプロジェクトについて1つだけです。複数の Fin 関数を使って異なるファイルから
信号を入力することはできません。
- ディスプレイウィンドウを保存したデータでは第0列(エクセルで開いたときのA列)は時刻になっていますが、
この関数では時刻と他のデータを区別しません。
- データは、先頭のタイトル行を除いて、第2行から各サイクル毎に1行づつ読まれていきます。したがって、
記録したときの演算周期と異なる周期でシミュレーションすると、記録信号とは時間スケールの異なる信号になります。
記録時の記録周期比が1でなかった場合も同様です。
|
(14)周期信号の発生
説明 |
(1)矩形波(方形波)を発生します。
(2)正弦波を発生します。
(3)三角波を発生します。
(4)ノコギリ波を発生します。
(5)PWM波を発生します。
|
書式
|
(1)矩形波 | w_sqr ( 周期,位相, 振幅 ) |
(2)正弦波 | w_sin ( 周期,位相, 振幅 ) |
(3)三角波 | w_tri ( 周期,位相, 振幅 ) |
(4)ノコギリ波 | w_saw ( 周期,位相, 振幅 ) |
(5)PWM波 | w_pwm ( デューティー比,周期,位相, 振幅 ) |
|
引数
|
デューティ比 | PWM波で1周期中にHIGHとなる比率です。
1以上のとき100%(常時HIGH)、負のとき0%(常時0)になります |
振幅 | 振幅値を与えます。 |
周期 | 周期を秒単位で与えます。 |
位相 | 位相角度を回転数で与えます。1回転 = 360度です。 |
|
例1
|
proc | |
{ | |
| U = w_sin( 0.1, 0, 2.5 ); |
// 振幅2.5、周期0.1秒(10Hz)の正弦波 |
| V = w_sin( 0.1, 1/3, 2.5 ); |
// 位相が120度(1/3回転)進んだ正弦波 |
| W = w_sin( 0.1, -1/3, 2.5 ); |
// 位相が120度(1/3回転)遅れた正弦波 |
| Aout( 0, 0, 1, U ); |
// Uをアナログ0チャンネルへ出力 |
| Aout( 1, 0, 1, V ); |
// Vをアナログ1チャンネルへ出力 |
| Aout( 2, 0, 1, W ); |
// Wをアナログ2チャンネルへ出力 |
} | |
振幅2.5、周期0.1秒の3相交流波形U, V, Wを生成し、アナログ電圧として出力します。
|
例2
|
デューティの異なるPWM波を三角波との比較で示します。演算周期=1[ms]、period=0.2[s]です。
proc |
{ |
| Ref = w_tri( period, 0, 2 ); |
| PWM2 = w_pwm( 0.2, period, 0, 1 ); |
// デューティ 20% |
| PWM4 = w_pwm( 0.4, period, 0, 1 ); |
// デューティ 40% |
| PWM6 = w_pwm( 0.6, period, 0, 1 ); |
// デューティ 60% |
| PWM8 = w_pwm( 0.8, period, 0, 1 ); |
// デューティ 80% |
} |
|
例3
| 三角波を変調します。演算周期=1[ms]、period=20[s]です。なお、PWMはduty≦0のとき出力=0になります。
proc |
{ |
| duty = w_tri( period, 0, 0.9 ); |
// 三角波 |
| PWM = w_pwm( duty, 0.5, 0, 0.5 ); |
// 変調波 |
} |
|
(15)白色正規雑音発生
説明
| 平均値0の白色正規雑音(白色ガウス雑音)を発生します。 |
書式
| gauss( 標準偏差 ) |
引数
| 標準偏差 : 雑音の標準偏差を与えます。 |
使用例
|
振幅1の矩形波に標準偏差0.4の白色正規雑音を加算した信号 in を発生させ、
それを2つのフィルタ(1次フィルタと2次フィルタ)に通しました。period=2[ms]、演算周期=1[ms]です。
proc |
{ |
| in = w_sqr( period, 0, 1 ) + |
gauss( 0.4 ); |
| f1 = lag1( in, 0.01 ); | |
// 1次フィルタ 時定数10ms |
| f2 = bqLpf( in, 100, 0.8 ); | |
// 2次フィルタ 固有周波数100rad/s |
} |
|
---|
参考
| gauss( )は、15ビットの一様乱数を12回加算することによって、近似的な正規分布の乱数としています。
|
注意
| ノイズを初期化する機能はありません。したがって同じノイズを再現させることはできません。 |
(16)ランダム関数
説明
| 指定された範囲の一様乱数を発生します。 |
書式 | random( 範囲 ) |
引数 | 範囲 : 発生乱数の上限値 |
---|
出力 | [0〜範囲)の間で一様な発生確率密度をもつ乱数を発生します。 |
注意 | 0〜32767の整数値で発生させた一様乱数を、
指定された範囲の浮動小数点表現に変換しています。
したがって、発生する数値も32768通りしかありません。
乱数発生を初期化する機能はありませんので、同じ乱数を再現させることはできません。 |
(17)ユーザ定義信号の発生
説明 | ユーザが定義した波形を周期的に発生させます。 |
書式 | w_udef ( 更新間隔,点数,ファイル名 ) |
引数 |
更新間隔 | (この数値+1)回毎に数値が更新されます。
例えば、更新間隔=0の場合は毎回更新されますが、更新間隔=1の場合は1回おきに更新されますので、
発生周期は2倍になります。同様に更新間隔=2の場合発生周期は3倍になります。
この数はパラメータ名や信号名で代用できません。 |
点数 | 1周期のデータ数です。整数で与え、
パラメータ名や信号名で代用できません。 |
ファイル名 |
定義したデータを格納したテキストファイル名です。
直接ファイル名を書くことはできないので、例のようにファイル名を定義した定数を与えます。
ファイルはプロジェクトファイルと同じディレクトリに置き、ファイル名にパスは含みません。 |
|
使用例 |
uFile = "udef.csv"; | |
// ファイル名の定義 |
proc |
{ | |
| x0 = w_udef( 0, 64, uFile ); | |
// ユーザ定義波の発生 |
| x1 = w_udef( 1, 64, uFile ); | |
// 間引き1回 |
| x2 = w_udef( 2, 64, uFile ); | |
// 間引き2回 |
| Aout ( 0, 0, 1, x0 ); | |
// 0ch へアナログ出力 |
} |
ファイル udef.csv に定義された64個の数値を毎回更新で信号 x0 へ代入し、それをアナログ電圧として出力します。
x1、x2 はそれぞれ更新間隔を1回と2回に設定しましたので、発生周期が x0 の2倍、3倍になります。
|
| データファイルは1行に1つのデータが記載された(上記使用例では64行の)テキストファイルです。
エクセルなどを使って作成し、CSV形式で保存します。例に使ったファイルudef.csvのデータを示します。
|
注意
|
生成される信号の周期は演算周期によって変化することに留意してください。
上の例は演算周期2msで実行させた場合のモニタ画面です。周期は2ms×64=128msになります。
|
---|
(18)折線関数と階段関数の発生
説明
| 時刻を指定して定義した関数を発生させます。
折線関数は、与えた(時刻、数値)の座標を直線で結ぶ信号を発生します。
階段関数は、与えた時刻の数値を次の時刻まで維持する信号を発生します。
時刻=0のデータを含む場合、その前の時刻に達すると信号発生が繰り返されます。 |
書式
|
折線関数 : polyLine ( 点数,ファイル名 )
階段関数 : stepLine ( 点数,ファイル名 ) |
引数
|
点数 | 時刻[秒]と数値のペアの数です。折れ点の数になります。 |
ファイル名 | データファイルを示すパラメータ名です。
直接ファイル名は書けませんので、例のようにファイル名を定数宣言して使います。
ファイル名にパスは含めません。ファイルはプロジェクトファイルと同じディレクトリに置きます。 |
|
例
|
line | =“poly.csv”; |
// 折点データ |
repeat | =“poly_r.csv”; |
// くり返しデータ |
proc | | |
{ | | |
| poly = polyLine( 17, line ); |
// 折線 |
| step = stepLine( 17, line ); |
// 階段 |
| rPoly = polyLine( 8, repeat ); |
// 折線のくり返し |
| rStep = stepLine( 8, repeat ); |
// 階段のくり返し |
} | | |
この例ではファイルpoly.csv に定義された17組の(時刻,データ)を直線で結ぶ信号 poly(青)と
階段で結ぶ信号 step(赤)を発生させています。
ファイルpoly_r.csv は、同じデータの 8行目の時刻を 0 としたものです。rPoly(青)とrStep(赤)は
周期10秒でくり返す信号になります。
|
---|
注意
|
生成される信号の時刻は演算周期に依存しませんが、指定可能な時刻は(232×演算周期)までです。
この例では演算周期10msなので、最大時刻は約11930時(497日)になります。
ただし、時間分解能については、演算周期と同等なのは(223×演算周期)までです。
それを超えると時間分解能は徐々に劣化し、最終的には(28×演算周期)程度にまで広がります。
したがって、この例で精度を保ったまま連続使用できるのは約23時間となります。
これは32ビットの整数値を仮数部が23ビットの浮動小数点値へ変換しているために生じます。 |
テキストファイルで指定した時刻とデータはパラメータ用のメモリにコピーして使われますので、
そのぶんユーザが作成できるパラメータの数は少なくなります。
そしてその合計が4096ワードを超えるとエラーになります。
大きいサイズのデータを与える場合は、メモリの使用量に留意してください。
|
(18)パルス発生、トリガ発生
説明
| 関数 pulse は、指定時刻に任意時間幅のパルス信号を発生します。
関数 trigger は、引数の値が変化したとき、任意時間幅のパルス信号を発生します。
これらの関数の値はパルス発生中のみ真(1)、それ以外では偽(0)です。
|
書式
|
パルス関数 : pulse ( 時刻,時間幅 )
トリガ関数 : trigger ( トリガモード、ソース、時間幅、しきい値 ) |
引数
|
時刻 | 起動時を0とするパルス発生時刻を[秒]単位で与えます |
時間幅 | 発生パルスの時間幅を[秒]単位で与えます。
ただし、実際に発生するパルスの時間幅は、演算時間の整数倍で、指定時間を越えない最大の長さです。
指定時間をT、演算周期をΔtとすると、 パルス時間幅は (T/Δtの整数部)×Δt となります。
|
ソース | トリガ要因となる信号名またはパラメータ名です |
しきい値 | ソースの値と比較される値です |
トリガモード | 0〜5の数値で発生するトリガ条件を与えます
|
トリガモード | トリガ条件 |
0 | ソースの値が変化(増加または減少)した時にパルスが発生します |
しきい値は無視されます |
1 | ソースの値が増加した時にパルスが発生します |
2 | ソースの値が減少した時にパルスが発生します |
3 | ソースの値がしきい値を超えて増加または減少した時にパルスが発生します |
4 | ソースの値がしきい値を超えて増加した時にパルスが発生します |
5 | ソースの値がしきい値を超えて減少した時にパルスが発生します |
上記以外 | パルスは発生しません |
|
使用例1
|
proc | | |
{ | | |
| ref = pulse( 0.4, 0.2 ); |
// 0.4秒後にパルス発生 |
| Up = ! trigger( 4, ref, 0.01, level ); |
// ref>level で反転トリガ発生 |
| Down = trigger( 5, ref, 0.01, level ); |
// ref<level でトリガ発生 |
} | | |
0.4秒後に時間幅0.2秒のパルスを発生させ、それをソースとして、モード4 とモード5 で時間幅10ミリ秒のトリガパルスを発生させています。グラフが重ならないように、信号 Up は否定演算子「 ! 」を使って論理を反転させました。
しきい値は level=0.5 としました。
|
---|
使用例2
|
proc | | |
{ | | |
| A = w_sqr( period, 0, 1 ); | // エンコーダA相信号を発生 |
| B = w_sqr( period, 0.25, 1 ); | // エンコーダB相信号を発生 |
// パラメータ ref の値を操作パネルから変更し、パルス発生 |
| Z = ! trigger( 0, ref, 0.01, 0 ); |
// ref>level で負論理のZ相信号を発生 |
// デジタル出力 |
| Dout( 0, 0, A ); |
// Dout0:A>=0でHigh、A<0でLow |
| Dout( 1, 0, B ); |
// Dout1:B>=0でHigh、B<0でLow |
| Dout( 2, 0.5, Z ); |
// Dout2:Z>=0.5でHigh、Z<0.5でLow |
} | | |
モータの回転角度などを計測するロータリ・エンコーダの信号A相、B相、Z相を発生させます。
A相、B相は位相が0.25(90度)異なる矩形波を発生し、それをデジタル出力端子 Dout0、Dout1 へ出力します。
Z相の信号は、操作パネルから パラメータ ref の値を変化させると、
信号Zに時間幅0.01秒のパルスが発生するので、それをデジタル出力端子 Dout2 へ出力します。
|
注意
|
設定可能な時刻の範囲や分解能については、polyLine の注意事項を参照してください。
ソースとしてパラメータではなく信号を使う場合、信号に含まれる微小な変化に過敏となることがあります。
その場合、信号をヒステリシス関数へ通してから与えることをお勧めします。 |
(20)積分フィルタ
説明
|
伝達関数で(1/τs )と記述されるフィルタです。ただし、τは時定数、sはラプラスの演算子です。
また、出力が上下限を超えないよう飽和させます。
|
書式
|
integral( 入力信号,出力信号,時定数,上限値,下限値)
|
引数
|
出力信号 | フィルタの出力が格納されます。 |
入力信号 | フィルタの入力となる信号を与えます。 |
時定数 |
秒単位で与えます。 τ=0のとき、出力は入力の符号により上限値または下限値になります。 |
上限値 | 積分を飽和させ、これ以上に増加させません。 |
下限値 | 積分を飽和させ、これ以下に減少させません。 |
|
ブロック図
| |
使用例
|
var y = 1; | // 初期値は1.0 |
proc |
{ |
| x = w_sqr( 1, 0, 1 ); | // 周期1秒の矩形波を発生 |
| y = integral( x, y, td, 1.5, -1.5 ); | // 積分 |
} |
周期1秒の矩形波x(青)を td=0.1 で積分し結果をy(赤)とします。出力は±1.5で飽和させます。
|
(21)1次遅れフィルタ
説明
| 1次のローパスフィルタです。 |
書式
| lag1( 入力信号,時定数 ) |
引数
|
入力信号 | フィルタの入力となる信号を与えます。 |
時定数 | 遅れ時定数[秒]です。
τが制御周期より小さい場合、出力=入力とします。 |
|
ブロック図
|
ただし、τは時定数、sはラプラスの演算子です。
|
使用例
|
proc |
{ |
| x = w_sqr( 1, 0, 2 ); |
// 周期1秒振幅2の矩形波(青) |
| y1 = lag1( x, 0.10 ); |
// 時定数0.10秒の1次遅れフィルタ(赤) |
| y2 = lag1( x, 0.05 ); |
// 時定数0.05秒の1次遅れフィルタ(黄) |
| y3 = lag1( x, 0.01 ); |
// 時定数0.01秒の1次遅れフィルタ(緑) | } |
周波数1秒の矩形波x(青)を3種類の1次遅れフィルタに通し、時定数0.1秒の出力をy1(赤)、0.05秒をy2(黄)、0.1秒をy3(緑)とした場合の結果です。
|
注意 |
時定数τは演算周期よりも十分大きい値とする必要があります。
上記の例では演算周期を1ms(0.001秒)として演算しています。
時定数<演算周期のとき、このフィルタの出力は入力と同じ(素通し)になります。
よって負の時定数を設定しても無意味です。 |
(22)微分フィルタ
説明
| 1次のハイパスフィルタです。1/τ[rad/s]よりも低い周波数帯域で近似的な微分になります。 |
書式
| deriv( 入力信号,時定数 ) |
引数
|
入力信号 | フィルタの入力となる信号を与えます。 |
時定数 | 遅れ時定数[秒]です。
τが制御周期より短い場合、出力=(入力−前回値)/制御周期 とします。 |
|
ブロック図
|
ただし、τは時定数、sはラプラスの演算子です。
|
使用例
|
proc | { |
| x = w_tri( 4, 0, 2 ); |
// 周期4秒振幅2の三角波(青) |
| y1 = deriv( x, 0.1 ); |
// 時定数0.1秒の微分フィルタ(赤) |
| y2 = deriv( x, 0.2 ); |
// 時定数0.2秒の微分フィルタ(黄) |
} |
周期4秒の三角波x(青)を時定数0.1秒と0.2秒の微分フィルタに通し、それぞれの出力をy1(赤)、y2(黄)とします。この例では演算周期を1ms(0.001秒)としています。
|
注意
| 時定数τを小さくすると理想的な微分に近づきますがノイズに敏感になります。逆に大きくすると高周波数領域で有効な微分になりません。したがって、時定数は入力信号のS/Nと必要とされる帯域との兼ね合いで設定します。通常は、時定数τは演算周期よりも十分大きい値に設定します。よって、できるだけ演算周期を短くすることが肝要です。
|
(23)位相進みフィルタ
説明
| 1次の位相可変フィルタです。 2つの時定数の大小関係で、入出力間の位相が進んだり遅れたりします。 |
書式
| leadlag( 入力信号,遅れ時定数,進み時定数 ) |
引数
|
入力信号 | フィルタの入力となる信号を与えます。 |
遅れ時定数 | τ1を秒単位で与えます。 |
進み時定数 | τ2を秒単位で与えます。 |
|
伝達関数
|
ただし、τ1、τ2は時定数、sはラプラスの演算子です。
0<τ1<τ2 の場合位相進み、
τ1>τ2>0 の場合位相遅れになります。
|
使用例
|
proc |
{ |
| In = w_sin( 1, 0, 1 ); |
// 周期1秒、振幅1の正弦波(青) |
| Lead = leadlag( In, 0.2, 0.4 ); |
// 位相進みフィルタ(赤) |
| Lag = leadlag( In, 0.4, 0.2 ); |
// 位相遅れフィルタ(黄) |
} |
周期1秒の正弦波In(青)を時定数の異なる2つの位相進み遅れフィルタに通し、それぞれの出力をLead(赤)、Lag(黄)とします。
τ1<τ2の場合位相が進み、
τ1>τ2の場合位相が遅れています。
演算周期は1ms(0.001秒)です。
|
参考
| このフィルタのゲインは、低周波数では約1、高周波数では約(τ2/τ1 )となり、
中間の周波数 √(τ1τ2)-1 [rad/s] 近傍で位相変化が最大になります。
|
注意
| 他の1次フィルタと同様に、τ1は演算周期よりも十分大きく設定します。
τ1は正の値でなければなりませんが、τ2は負の値も可能です(非最小位相)。 |
(24)2次(バイクォッド)フィルタ
説明
| 2次のフィルタとして、以下の5種類があります。
(1) ローパスフィルタ | : |
高周波で減衰が大きいフィルタです。 |
(2) ハイパスフィルタ | : |
低周波で減衰が大きいフィルタです。 |
(3) バンドパスフィルタ | : |
特定の周波数近傍以外で減衰の大きいフィルタです。 |
(4) ノッチフィルタ | : |
特定の周波数近傍で減衰の大きいフィルタです。 |
(5) オールパスフィルタ | : |
特定の周波数近傍で位相が反転するフィルタです。
|
|
書式
|
(1) bqLpf( 入力信号,固有周波数,ダンピングファクタ ); |
(2) bqHpf( 入力信号,固有周波数,ダンピングファクタ ); |
(3) bqBpf( 入力信号,固有周波数,ダンピングファクタ ); |
(4) bqBef( 入力信号,固有周波数,ダンピングファクタ ); |
(5) bqApf( 入力信号,固有周波数,ダンピングファクタ ); |
|
引数
|
入力信号 | フィルタの入力となる信号名です。 |
固有周波数 |
正の値で記号はωn[rad/s]です。 この値は演算周期の逆数よりも十分小さく設定する必要があります。 |
単独のパラメータ、または数値として与えます。それ以外の式や信号で与えることはできません。 |
ダンピングファクタ |
振動の減衰を指定する正の数で記号はζです。この値が1以上になると(固有値が実数になり)振動しなくなります。
|
|
伝達関数 |
| フィルタ種別 | 伝達関数 |
(1) | 2次ローパスフィルタ |
, |
(2) | 2次ハイパスフィルタ |
, |
(3) | 2次バンドパスフィルタ |
, |
(4) | 2次ノッチフィルタ |
, |
(5) | 2次オールパスフィルタ |
, |
(sはラプラスの演算子です) |
参考
|
ζ>1のとき、特性根は実数となり、1次フィルタが2段になったのと等価になります。
ζ<1のとき振動的になり、応答性は高まりますが、あまり小さくすると安定が悪くなります。
ζ=0.5のとき、そのフィルタの特性は「2次のバターワース」と呼ばれます。
(1)〜(5)のフィルタの特性を比較した例を
サンプルプログラムのページに掲載しています。
次数が2よりも大きい高次フィルタは、複数の2次フィルタを直列に接続するか、
またはIIRフィルタとして作成します。
ただし、IIRフィルタではパラメータを運転中に変更することはできません。
|
使用例
|
proc |
{ |
| In = w_sqr( 1, 0, 10 ); |
// 周期1秒の矩形波(青) |
| Lpf1 = bqLpf( In, 50, 0.25 ); |
// ζ=0.25(赤) |
| Lpf2 = bqLpf( In, 50, 0.5 ); |
// ζ=0.5(黄) |
| Lpf3 = bqLpf( In, 50, 1 ); |
// ζ=1.0(緑) |
} |
周期1秒の矩形波 In(青)を3種類の2次ローパスフィルタに通します。
信号Lpf1(赤)はζ=0.25のフィルタ出力、
信号Lpf2(黄)はζ=0.50のフィルタ出力、
信号Lpf3(緑)はζ=1.00のフィルタ出力です。
以下は演算周期は1ms(0.001秒)の例です。
ζが小さいと立ち上がりは速いですが振動的で落ち着きが悪くなります。
逆に、ζが大きいと安定ですが応答が遅くなります。
|
|