(1) 一般関数の概要と一覧

予約されている関数は大きく以下のように分類されます。

入出力関数アナログ信号、デジタル信号の入出力を行います。
信号発生関数周期信号や雑音信号などを発生させます。 制御系やフィルタの応答を試験するために使います。 テキストファイルに定義した信号を発生させることもできます。
フィルタ関数 1次、2次の伝達関数で記述される(見かけ上)アナログ的なフィルタや、 FIR(Finite Impulse Response)、IIR(Infinite Impulse Response)などのデジタルフィルタ、 PID制御用フィルタなどがあります。
算術関数C言語などで標準の初等関数を使うことができます。

 

関数一覧(内部変数のある関数には*を付けています)

分類関数名記号説明時間[μs]
入出力 アナログ入出力Ain アナログ信号を入力します2
Aoutアナログ信号を出力します2
デジタルバイト入出力Bin 8ビットのバイナリデジタル信号を入力します2
Bout 8ビットのバイナリデジタル信号を出力します2
デジタル入出力Din ビット単位でデジタル信号を入力します2
Dout ビット単位でデジタル信号を出力します2
拡張入出力Xin 拡張インターフェースから信号を入力します
Xout 拡張インターフェースへ信号を出力します
エンコーダ入力Cin 2相エンコーダ信号の積算値を入力します
パルス入力NEWPin デジタル入力の周期とパルス幅時間を計測します
PWM出力Pout PWM信号を出力します
ファイルデータ入力Fin エクセル等で作成した表計算データを入力します(シミュレーション専用)
信号生成 周期関数の発生 w_sqr*矩形波(方形波)を発生させます3
w_saw*ノコギリ波を発生させます4
w_tri*三角波を発生させます3
w_sin*正弦波を発生させます19
PWM波発生w_pwm* ソフトウェアによりPWM波を発生させます3
ユーザ定義波w_udef* 演算周期毎に指定した値を発生させます2
白色正規雑音gauss 正規分布した乱数を発生させます9
一様乱数発生random 0以上1未満の一様乱数を発生させます2
折関数線/階段
関数の発生
polyLine* 時刻と値を指定した折線信号を発生させます。繰り返しもできます2
stepLine* 時刻と値を指定した階段信号を発生させます。繰り返しもできます2
パルス発生pulse* 指定した時刻に任意幅のパルスを発生させます2
trigger* 引数の数値が変化したとき、任意幅のパルスを発生させます2
現在時刻currTime 運転開始からの経過時間を秒単位で得ます1
フィルタ 1次フィルタ integral*飽和機能つき積分フィルタです3
lag1*1次遅れフィルタです2
deriv*微分フィルタです2
leadlag*位相を進めたり遅らせたりするフィルタです 6
2次フィルタbqLpf* 2次ローパスフィルタです2
bqHpf*2次ハイパスフィルタです2
bqBpf*2次バンドパスフィルタです2
baBef**2次ノッチフィルタです2
bqApf*2次オールパスフィルタです2
制御フィルタpi*PI(比例+積分)制御指令を生成します 3
pid*PID(比例+積分+微分)制御指令を生成します 7
FIRフィルタfir*任意段数のFIRフィルタです サイズに
依存
IIRフィルタiir*任意段数の2次カスケード型IIRフィルタです
移動平均フィルタaverage*任意時間の移動平均フィルタです
時間遅延フィルタdelay*演算周期の整数倍の時間だけ信号を遅らせます2
ヒステリシスhystere*入力信号にヒステリシスを与えます2
算術関数 平方根sqrt平方根を演算します6
指数関数expexを演算します17
べき乗:xYpowx>0としてxYを演算します32
対数関数log自然対数を演算します16
log10常用対数を演算します18
三角関数sin三角関数の正弦値sinを演算します18
cos三角関数の余弦値cosを演算します18
tan三角関数の正接値tanを演算します18
逆三角関数 asin三角関数の逆正弦値sin‐1を演算します24
acos三角関数の逆余弦値cos‐1を演算します24
atan三角関数の逆正接値tan‐1を演算します17
atan2三角関数の逆正接値tan‐1(y/x)を4象限で演算します18
双曲線関数 sinh双曲線関数sinhを演算します20
cosh双曲線関数coshを演算します20
tanh双曲線関数tanhを演算します20
その他 ユーザ補助関数 auxfuncユーザ関数の内部信号を返します 1

 

(2)アナログ信号の入力

説明 アナログ入力コネクタの指定チャンネルに加えられた電圧を数値化します。
書式 Ain(チャンネル番号,オフセット電圧,スケール値 )
引数
チャンネル番号 整数部が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
LowLowLowLow LowLowLowLow0
LowLowLowLow LowLowLowHigh1
LowLowLowLow LowLowHighLow2
LowLowLowLowLowLow HighHigh3
LowLowLowLowLow HighLowLow4
LowLowLowLowLow HighLowHigh5
LowLowLowLowLow High HighLow6
LowLowLowLowLow High High High7
LowLowLowLow High LowLowLow8
・・・・・・・・・・・・・
HighHigh HighHigh HighHigh Low Low 252
HighHigh HighHigh HighHigh Low High 253
HighHigh HighHigh HighHigh HighLow 254
High High High High High High High High 255
例1level = Bin( );

信号 level の値は、デジタル入力端子Din0〜Din7の入力論理に応じて、0〜255 の整数値になります。

例2if 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未満LowLowLow LowLow LowLowLow
1以上2未満 LowLow LowLow LowLow LowHigh
2以上3未満 LowLow LowLow LowLow HighLow
3以上4未満 LowLow LowLow LowLow High High
4以上5未満 LowLow LowLow LowHigh LowLow
5以上6未満 LowLow LowLow LowHigh LowHigh
6以上7未満 LowLow LowLow Low High High Low
7以上8未満 LowLow LowLow LowHigh High High
8以上9未満 LowLow LowLow HighLow LowLow
・・・・・・・・・・・・・
251以上252未満 HighHigh HighHigh HighLow HighHigh
252以上253未満 HighHigh HighHigh HighHigh LowLow
253以上254未満 HighHigh HighHigh HighHighLow High
254以上255未満 HighHigh HighHigh HighHigh HighLow
255以上 HighHigh HighHigh HighHigh HighHigh

例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 はプロジェクトファイルと同じフォルダにあるものとします。

【参考】サンプルプログラム「表計算データの信号入力とその処理

注意
  1. Fin はシミュレーション専用の関数なので、Aproc-1で実行することはできません。 Fin を含むプログラムをコード変換すると、オペレーションウィンドウの運転開始ボタンは使用禁止になります。
  2. 指定できるデータファイルはプロジェクトについて1つだけです。複数の Fin 関数を使って異なるファイルから 信号を入力することはできません。
  3. ディスプレイウィンドウを保存したデータでは第0列(エクセルで開いたときのA列)は時刻になっていますが、 この関数では時刻と他のデータを区別しません。
  4. データは、先頭のタイトル行を除いて、第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( 入力信号,遅れ時定数,進み時定数 )
引数
入力信号フィルタの入力となる信号を与えます。
遅れ時定数τを秒単位で与えます。
進み時定数τを秒単位で与えます。
伝達関数

ただし、τ、τは時定数、sはラプラスの演算子です。
0<τ<τ の場合位相進み、 τ>τ>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、高周波数では約(τ1 )となり、
中間の周波数 √(ττ)-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( 入力信号,固有周波数,ダンピングファクタ );
引数
入力信号フィルタの入力となる信号名です。
固有周波数 正の値で記号はω[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秒)の例です。
ζが小さいと立ち上がりは速いですが振動的で落ち着きが悪くなります。
逆に、ζが大きいと安定ですが応答が遅くなります。

 

(25)PI制御フィルタ

説明 比例(P)+積分(I)要素からなる制御用フィルタです。
書式 pi ( 入力信号,比例ゲイン,積分時定数,積分上限,積分下限 )
引数
入力信号

入力となる信号名です。

比例ゲイン

フィルタ全体のゲインです。ブロック図のKに相当します。

積分時定数積分時定数[秒]です。ブロック図のτに相当します。
積分上限積分器出力の最大値をこの値で飽和させます。
積分下限積分器出力の最小値をこの値で飽和させます。
ブロック図
使用例

モータドライバの速度制御機能を使って、モータの角度を制御するシミュレーションです。
三角波から台形波をつくり、指令値 Pcmd とします。

このプログラムはシミュレーション用ですが、 実機運転する場合は、数学モデルは不要になり、 Vcmdのアナログ出力がモータドライバへの速度指令となります。

var Pos;// Posは信号(注@)
proc {
Pcmd = w_tri( period, 0, 3 ); // 三角波の
if Pcmd> 1 { Pcmd = 1; } // 頭をつぶして
elsif Pcmd<-1 { Pcmd = -1; } // 台形波の指令とする
Err = Pcmd - Pos;// 誤差(注@)
Vcmd = pi( Err, Gain, Ti, max, min );// PI制御フィルタ
Aout ( 0, 0, 1, Vcmd );// 指令をアナログ出力(注A)
Pos = integral( Vcmd, Pos, 1, 10, -10 ); // 数学モデル(注B)
}

注@:誤差演算で、Posという単語がパラメータではなく信号であることを明記するため、 先頭行でPosを信号として宣言しています。
注A:出力関数 Aout は、シミュレーションでは無視されます。
注B:指令速度が実際の速度に等しいと仮定すると、 モータの数学モデルは単純な積分特性となります。

シミュレーション結果を以下に示します。上段青が指令、赤が実現値、下段は制御量です。

 

(26)PID制御フィルタ

説明 比例(P)+積分(I)+微分(D)要素からなる制御用フィルタです。
書式 pid ( 入力信号,比例ゲイン,時定数3,時定数2,時定数1,積分上限,積分下限 )
ブロック図
引数
入力信号入力となる信号名です。
比例ゲインフィルタ全体のゲインです。ブロック図のKに相当します。
時定数3遅れ時定数[秒]です。ブロック図のτ3に相当します。
時定数2微分時定数[秒]です。ブロック図のτ2に相当します。
時定数1積分時定数[秒]です。ブロック図のτ1に相当します。
積分上限積分器出力の最大値をこの値で飽和させます。
積分下限積分器出力の最小値をこの値で飽和させます。
使用例

磁気浮上制御のプログラム例です

 

 

(27)FIRフィルタ

説明 FIR(Finite Impulse Response)フィルタです。フィルタの係数はテキストファイルで与えます。
書式

 fir ( 入力信号,係数の数,ファイル )

引数
入力信号フィルタの入力信号名です。
係数の数係数の数Nを整数で与えます。遅延数+1になります。
ファイル係数値を格納したテキストファイルを示すパラメータ名です。
ファイル名は宣言部で定義します。
ファイルは、係数を C 0 から順番に記載したN行のデータです。
等価式

ただし、x(t)は時刻tの入力値、Δtは演算周期、Ckは係数、Nは係数の数。

ブロック図

使用例

矩形波(青)を入力したときの応答(黄)を2次ローパスフィルタ(赤)と比較します。 演算周期は10ms(0.010秒)です。

coeFir = "fir.csv"; // FIRフィルタ係数ファイル
proc
{
Input = w_sqr( period, 0, 1 ); // 入力は矩形波
FIR = fir( Input, 21, coeFir ); // 遅延数20のFIRフィルタ
biQuad = bqLpf( Input, 50, 0.5 ); // 2次ローパスフィルタ
Aout( 0, 0, 1, FIR ); // チャンネル0にFIRを出力
Aout( 1, 0, 1, biQuad ); // チャンネル1にbiQuadを出力
}

この例に使用した係数ファイルのデータです。

注意 FIRフィルタは、次数を大きくすることにより理想に近い振幅特性を得ることができますが、その反面、遅延要素が多くなり時間遅れが長くなります。フィードバック制御にFIRを使う場合は、遅れによる安定性の劣化に留意する必要があります。

参考 本ソフトにはFIRフィルタの係数を作成する機能はありません。フリーのフィルタ設計用ツールとして、 株式会社テクノクリエートの Filter、 石川工専山田洋士研究室の Digital Filter Design Services 、CQ出版社の広告「はじめて学ぶディジタル・フィルタと高速フーリエ変換」からダウンロードできるものなどがあります。

このリンクは、上記ツールを使った例のひとつです。

 

(28)IIRフィルタ

説明 IIR(Infinite Impulse Response)フィルタです。任意段数の2次IIRフィルタを直列に接続した特性になります。 フィルタの係数はテキストファイルで与えます。
書式 iir ( 入力信号,段数,ファイル名 )
引数
入力信号フィルタの入力信号名です。
段数 Nフィルタの段数を整数値で与えます。定数名や信号名で与えることはできません。
ファイル名定義したデータを格納したテキストファイル名です。直接ファイル名を書くのではなく、ファイル名を定義した定数を与えます。 ファイルは、1行に各段の5つの係数をコンマで区切った N 行のデータです。

伝達関数

ただし、Nは段数、z は遅延演算子、C i 1〜Ci 5 (i=1,2,…,N)は係数です。
1次のフィルタを含める場合は、その要素についてC i 2 = C i 5 = 0 とします。

ブロック図

使用例 同一の係数の2次IIRフィルタを1段(赤)、2段(黄)、3段(緑)としたIIRフィルタに矩形波信号(青)を通したプログラム例とその結果です。

coefIIR = "iir.csv"; // IIRフィルタ係数
proc
{
Input = w_sqr( period, 0, 1 ); // 入力は矩形波
IIR1 = iir( Input, 1, coefIIR ); // IIRフィルタ1段
IIR2 = iir( Input, 2, coefIIR ); // IIRフィルタ2段
IIR3 = iir( Input, 3, coefIIR ); // IIRフィルタ3段
Aout( 0, 0, 1, IIR3 ); // チャンネル0にIIR3を出力
}

係数ファイルは、1段について5つの係数を1行にコンマで区切って与えます。例に使ったデータを以下に示します。 エクセルで作成し、CSV形式で保存しました。

全く同一のデータを3列並べています。フィルタIIR1はこの1列目だけを使用し、IIR2 は2列まで、IIR3 は3列までを使います。

注意 FIRフィルタやIIRフィルタの特性は、演算周期に依存しますので、 演算周期を変更した場合は、ファイルのデータも作り直す必要があります。 ファイルを読むのは運転開始時ですので、係数値を変更しても実行コードを生成し直す必要はありません。 しかし、次数を変更した場合は(要するにソースを変更した場合は)実行コードの生成からやり直さなければなりません。

また、係数ファイルを開いたまま実行するとデータを正しく読めないことがあります。 運転またはシミュレーションする前に修正したファイルを閉じてください。


参考

本ソフトにはIIRフィルタの係数を作成する機能はありません。フリーのフィルタ設計用ツールとして、 石川工専山田洋士研究室の Digital Filter Design Services や、 CQ出版社の広告 「はじめて学ぶディジタル・フィルタと高速フーリエ変換」からダウンロードできるものなどがあります。 ただし、係数の定義がやや異なります。

例えば前者の場合、フィルタの条件を与えると、各段の2次フィルタについて 係数 k、a 0、a 1、a 2、b 1、b 2 を 計算してくれますので、下記のように換算します。

C i 1 = -b 1
C i 2 = -b 2
C i 3 = k * a 0
C i 4 = k * a 1
C i 5 = k * a 2
このリンクは、このツールを使った例です。

 

(29)移動平均フィルタ

説明 過去のサンプル値を算術平均した値を返します。
書式 average( 入力信号,平均個数 )
引数
入力信号入力となる信号名です。
平均個数平均する個数Nです。
(N×演算周期)の過去から現在までのサンプル値を平均します。
proc
{
Input = w_tri( period, 0, 1 ); // 三角波を生成しフィルタ入力とする
Ave = average( Input, 100 ); // 過去100回のサンプルを平均する
Aout( 0, 0, 1, Ave ); // チャンネル0に Ave を出力
}

演算周期2ミリ秒のシミュレーション結果です。

過去0.2秒間(100×0.002秒)のデータを平均しています。

   

 

(30)時間遅延フィルタ

説明 メモリを使って信号を遅延させます。
書式 delay( 入力信号,遅延段数 );
引数
入力信号入力となる信号名です。
遅延段数遅延させるサイクル数Nです。遅延時間は(N×演算周期)になります。
例1

三角波(青)を2つの遅延フィルタへ入力します。

ひとつは100段の遅延、もうひとつは200段の遅延です。演算周期が1ms(0.001秒)なので、それぞれ0.1秒(赤)と0.2秒(黄)の遅延信号が得られます。

proc
{
Input = w_tri( period, 0, 1 );  // 入力は三角波(青)
dly1 = delay( Input, 100 );  // 100段の遅延(赤)
dly2 = delay( Input, 200 );  // 200段の遅延(黄)
Aout( 0, 0, 1, dly2 );  // チャンネル0にdly2を出力
}

注意 長時間遅延させるには多くの内部メモリを必要とします。許容範囲に収まっているかをコンパイル時のメッセージで確認してください。必要メモリのワード数は(遅延時間/演算周期)で計算されます。

 

(31)時刻関数

説明 運転開始してからの経過時間を返します
書式currTime()
引数なし
出力 現在時刻を秒単位で与えます。
使用例 この関数をif文に使って階段関数を発生させます。

proc
{
if currTime() < 4 { x = 1; } //4秒後までは1
elsif currTime() < 8 { x = -2; } //それ以降8秒後までは-2
elsif currTime() < 10 { x = 3; } //それ以降10秒後までは3
elsif currTime() < 15 { x = -1; } //それ以降15秒後までは-1
else { x = 2; }//それ以降は2
Lpf = bqLpf( x, 10, 0.25 );
}

xは、時刻が4秒までは1、時刻が8秒までは-2、時刻が10秒までは3、時刻が15秒までは-1、それ以降は2となるような信号(赤)になります。この信号を2次ローパス信号に通したのが(青)です。演算周期は10ms(0.01秒)です。

注意

時刻の最大値は(232×演算周期)までです。
また、時間分解能は、(223×演算周期)を超えると徐々に劣化し、 最終的には(28×演算周期)程度にまで広がります。

 

(32)ヒステリシス要素

説明入力からしきい値で与えられるヒステリシス特性を与えます。
書式 hysteresis( 入力信号,しきい値L,しきい値H,設定値 )
引数
入力信号入力とする信号名です。
しきい値L 出力を0にする入力値です。しきい値Hよりも小さい値にします。
しきい値H 出力を設定値にする入力値です。しきい値Lよりも大きい値にします。
設定値 入力が敷居値Hの値以上になったときの出力値です。
出力

しきい値L<しきい値H とし、図のような特性を与えます。

出力は、入力≦しきい値Lのとき0、入力≧しきい値Hのとき設定値となり、
それ以外( しきい値L<入力<しきい値H )のときには変化しません。

proc
{
Input = w_tri( period, 0, amp );
Output0 = hysteresis( Input, -0.5, 0.5, 0.7 );
Output1 = hysteresis( Input, -0.6, 0.6, 0.8 );
Output2 = hysteresis( Input, -0.7, 0.7, 0.9 );
}

 

(33)リミッタ  AprocS バージョン1.22 以降で使用可能です

説明入力値を上下限値で制限します。
書式 limit(下限値,上限値,入力 )
引数
下限値出力がこの値以下とならないように制限します。
上限値出力がこの値以上とならないように制限します。
入力値入力信号名です。
出力

入力≦下限値のとき出力=下限値、入力≧上限値のと出力=上限値、それ以外のとき出力=入力となります。 output = limit( min, max, input ); という記述は、下記コードと同じです。


	if    input>max { output=max; }
	elsif input<min { output=min; }
	else	       { output=input; }

図のような特性を与えます。

var vcmd;		// フィードバック量を信号として宣言
proc 
{ 
  cmd = w_sin( 10, 0, 0.25 );			// 周期10秒、振幅0.25の正弦波
  verr = limit( -0.1, 0.1, cmd-vcmd );	// フィードバックの入力制限
  vcmd = integral( verr, vcmd, 1, 0.15, -0.15 );	// 出力制限つき積分器
}

 

(34)算術関数

名称記号書式備考
平方根√xsqrt(x)x > 0 のみ有効です。
指数関数exexp(x) 
べき乗pow(x,y)演算子 ** を用いて x ** y と書くこともできます。
y が整数でない場合は、x > 0 のみ有効です。
対数ln x log(x)x > 0 のみ有効です。
log10x log10(x)
三角関数 sin xsin(x)x の単位は radian です。
cos xcos(x)
tan xtan(x)
逆三角関数 sin‐1xasin(x) 出力範囲:‐1/2π〜1/2π
cos‐1xacos(x)
tan‐1xatan(x)
tan‐1y/xatan2(y,x) 出力範囲:‐π〜π
双曲線関数 sinh xsinh(x) 
cosh xcosh(x) 
tanh xtanh(x) 
整数化 int(x) x よりも小さい最大の整数値を与えます。
負数に注意してください。
絶対値|x|abs(x) AprocS V1.22以降で使用可能です。

 


更新 : 2019年4月14日