FP0Rのカム制御
この命令は、DUTに設定されたパラメータに従って、カム制御を実行します。最大31点の目標値を指定することができます。経過値が目標位置に一致する度に、割り込みプログラムを実行することもできます。
入力
高速カウンタチャンネル: 0–5
データテーブルが格納されているエリアの先頭アドレス
サンプル:F165_HighSpeedCounter_Cam_8_Values_DUT
出力
出力のワードアドレスを含むエリアの先頭アドレス(WR) (例: BOOL32_OVERLAPPING_DUT)。diNumberOfTargetValuesAndOutputRelaysに設定した値に従って、目標位置の点数を示すサイズ(16または32ビット)を選択します。
以下のサンプルを参考として、DUTを作成してください:F165_HighSpeedCounter_Cam_8_Values_DUT
下記のパラメータをDUTに設定します:
制御コード
出力のワードアドレス
:目標位置の数
目標値1
...
目標値n
上限値
y |
高速カウンタの経過値 | 14000 |
上限値 |
(1) |
実行条件 | 10000 |
目標値4 |
(2) |
高速カウンタ制御中フラグ | 8000 |
目標値3 |
(3) |
出力0-4 |
4000 |
目標値2 |
2000 |
目標値1 |
経過値が目標位置n~n+1 (加算時)またはn+1~n (減算時)に到達する度に、対応する出力nがTRUEとなります。
上図の例では、上限値制御が有効な場合を示しています。経過値が上限値に達すると、経過値を0にリセットし、カウントを続けます。
重複した要素を持つDUTに出力のワードアドレスを指定し(例:BOOL32_OVERLAPPING_DUT)、このDUTを要素dutBitOutputsに割り付けます。
最大31点の目標位置を設定することができます。
目標位置は、昇順に割り付けてください。同じ値を二度使用することはできません。
命令が起動されると、出力0を除いて、割り付けられたすべての出力がFALSEになります。ただし、出力は、経過値が目標位置1よりも小さいときにTRUEになります。以下、目標位置に従って、対応する出力がTRUEとなります。例: 現在位置が目標値2 = -4000と目標値3 = +4000の間にあるとき、出力2がTRUEとなります。下図の例では、上限値制御が無効な場合を示しています。この場合は、経過値が最終目標位置に達しても、カウントを継続し、経過値を0にリセットしません。
y |
高速カウンタの経過値 | 8000 |
目標値4 |
(1) |
実行条件 | 4000 |
目標値3 |
(2) |
高速カウンタ制御中フラグ | -4000 |
目標値2 |
(3) |
出力0-4 |
-10000 |
目標値1 |
INT0 |
割り込みプログラム0 |
この命令は、上限目標値に達すると、上限目標値制御を使用して経過値を0にリセットすることができます。上限値制御は、F165_HighSpeedCounter_Cam_8_Values_DUTに制御コードを指定し、有効にすることができます。上限値制御の代わりに、リセット入力またはソフトリセットにより、経過値をリセットすることもできます。
上限値制御を行う場合は、目標位置データは、すべて正の整数に指定する必要があります。
上限値制御(加算および減算)
y |
高速カウンタの経過値 | 14000 |
上限値 |
(1) |
実行条件 | 10000 |
目標値4 |
(2) |
高速カウンタ制御中フラグ | 8000 |
目標値3 |
(3) |
出力0-4 |
4000 |
目標値2 |
2000 |
目標値1 |
上限値制御 |
有効 |
無効(注) |
---|---|---|
加算: データテーブルのポインタは、目標位置1から最終目標位置の向きに移動します。 |
経過値が上限値を超えたときの動作:
|
経過値が正の最大値を超えたときの動作:
|
減算: データテーブルのポインタは、最終目標位置から目標位置1の向きへ移動します。 |
経過値が-1に達したときの動作:
|
経過値が-1に達したときの動作:
|
リセット入力あるいはソフトリセットのいずれも使用しない場合を示しています。
チャンネル |
ハードリセット入力 |
---|---|
0 |
X2 |
1 |
|
2 |
X5 |
3 |
経過値が目標値に一致したとき、割り込みプログラムが実行されます。タスクリストの"Interrupt"に登録されると自動的に許可された状態になります。割り込みプログラム番号は、それぞれのチャンネルに割り付けられます。
チャンネル |
0 |
1 |
2 |
3 |
4 |
5 |
割り込みプログラム |
0 |
1 |
3 |
4 |
6 |
7 |
あらかじめ、使用するチャンネルの高速カウンタ入力の方法をシステムレジスタに指定してください。
高速カウンタ命令が実行されると、対応するチャンネルの高速カウンタ制御中フラグsys_bIsHscChannel0ControlActiveがTRUEになり、このフラグがTRUEの間は、同じチャンネルに対して他の高速カウンタ命令を実行することはできません。
命令の実行をキャンセルするには、高速カウンタ制御コード(sys_wHscOrPulseControlCode)を格納するデータレジスタのビット3をTRUEにセットします。高速カウンタ制御フラグがFALSEに変化します。高速カウンタ命令の実行を再び有効にするには、ビット3をFALSEに戻します。
命令実行中に制御中のチャンネルの経過値を上書きすると、予期せぬ動作になる場合があります。
隣接した目標値間の時間は、1ms 以上となるようにしてください。
主プログラムでこの命令を実行する場合は、各目標位置間の最小移動時間が、1スキャンタイム以上となるように目標位置を設定してください。
割り込みプログラムでこの命令を実行する場合は、隣接した目標値間の最小時間が、割り込みプログラムの最大実行時間より長くなるようにしてください。
この命令は同時に2チャンネル分しか起動することはできません。
ハードリセット、ソフトリセットを使用する場合は、目標位置1には、³1の整数値を指定してください。
上限目標値一致制御とリセット入力、ソフトウェアリセットを併用する場合は、同時に実行しないようにしてください。
高速カウンタ制御フラグとパルス出力制御フラグのステータスは、スキャンが実行されている間に変化します。例えば、受信バイト数が2回以上読み出された場合、1スキャン内で異なる状態が存在することがあります。
目標値>上限目標値のとき
目標値= 0のとき
目標値が、昇順に並んでいないとき
目標値>上限目標値のとき
目標値= 0のとき
目標値が、昇順に並んでいないとき
DUT F165_HighSpeedCounter_Cam_8_Values_DUTは、あらかじめFP Libraryに定義されており、サンプルとして使用することができます。
グローバル変数リストでは、プロジェクト内のすべてのPOUからアクセスできる変数を宣言します。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bStartCam: BOOL:=FALSE;
dut_F165_CAM_Example1: F165_Cam_Example1_4_Values_DUT;
END_VAR
VAR_EXTERNAL
WR0_bits_F165_CAM_Examples: BOOL16_OVERLAPPING_DUT;
END_VAR
変数bStartCamがTRUEになると、命令が実行されます。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsFirstScan,5,2,7,4,);
B(B_F,E_MOVE!,Instance,14,1,20,5,,?DEN?D?AENO?C);
B(B_VARIN,,0,12,3,14,5,);
B(B_VAROUT,,sys_diHscChannel0ElapsedValue,20,3,22,5,);
B(B_COMMENT,,Reset the elapsed value,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,F165_HighSpeedCounter_Cam!,Instance,14,1,28,6,,?DEN?HiHscChannel?Ds_dutDataTable?AENO?CdutBitOutputs);
B(B_VARIN,,0,12,3,14,5,);
B(B_VARIN,,dut_F165_CAM_Example1,12,4,14,6,);
B(B_VAROUT,,WR1_dut_CAM1,28,3,30,5,);
B(B_CONTACT,,bStartCam,5,2,7,4,R);
B(B_COMMENT,,Start the cam control,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (sys_bIsFirstScan) then
sys_diHscChannel0ElapsedValue:=0;
END_IF;
IF DF(bStartCam) then
F165_HighSpeedCounter_Cam(iHscChannel := 0,
s_dutDataTable := dut_F165_CAM_Example1,
dutBitOutputs => WR0_bits_F165_CAM_Examples);
END_IF;
DUT F165_HighSpeedCounter_Cam_8_Values_DUTは、あらかじめFP Libraryに定義されており、サンプルとして使用することができます。
VAR
bStartCam: BOOL:=FALSE;
dut_F165_CAM_Example2: F165_Cam_Example2_4_Values_DUT;
END_VAR
VAR_EXTERNAL
WR0_bits_F165_CAM_Examples: BOOL16_OVERLAPPING_DUT;
END_VAR
変数bStartCamがTRUEにセットされると、命令を実行します。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsFirstScan,5,2,7,4,);
B(B_F,E_MOVE!,Instance,14,1,20,5,,?DEN?D?AENO?C);
B(B_VARIN,,0,12,3,14,5,);
B(B_VAROUT,,sys_diHscChannel0ElapsedValue,20,3,22,5,);
B(B_COMMENT,,Reset the elapsed value,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,F165_HighSpeedCounter_Cam!,Instance,14,1,28,6,,?DEN?HiHscChannel?Ds_dutDataTable?AENO?CdutBitOutputs);
B(B_VARIN,,0,12,3,14,5,);
B(B_VARIN,,dut_F165_CAM_Example2,12,4,14,6,);
B(B_VAROUT,,WR0_bits_F165_CAM_Examples,28,3,30,5,);
B(B_CONTACT,,bStartCam,5,2,7,4,R);
B(B_COMMENT,,Start the cam control,1,0,21,1,);
L(7,3,14,3);
L(1,3,5,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (sys_bIsFirstScan) then
sys_diHscChannel0ElapsedValue:=0;
END_IF;
IF DF(bStartCam) then
F165_HighSpeedCounter_Cam(iHscChannel := 0,
s_dutDataTable := dut_F165_CAM_Example2,
dutBitOutputs => WR0_bits_F165_CAM_Examples);
END_IF;