F165_HighSpeedCounter_Cam

FP0Rのカム制御

この命令は、DUTに設定されたパラメータに従って、カム制御を実行します。最大31点の目標値を指定することができます。経過値が目標位置に一致する度に、割り込みプログラムを実行することもできます。

パラメータ

入力

iHscChannel* (INT)

高速カウンタチャンネル: 0–5

s_dutDataTable (ANY_DUT)

データテーブルが格納されているエリアの先頭アドレス

サンプル:F165_HighSpeedCounter_Cam_8_Values_DUT

出力

dutBitOutputs (ANY_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

  • 経過値が目標位置nn+1 (加算時)またはn+1n (減算時)に到達する度に、対応する出力nTRUEとなります。

  • 上図の例では、上限値制御が有効な場合を示しています。経過値が上限値に達すると、経過値を0にリセットし、カウントを続けます。

  • 重複した要素を持つDUTに出力のワードアドレスを指定し(例:BOOL32_OVERLAPPING_DUT)、このDUTを要素dutBitOutputsに割り付けます。

  • 最大31点の目標位置を設定することができます。

  • 目標位置は、昇順に割り付けてください。同じ値を二度使用することはできません。

  • 命令が起動されると、出力0を除いて、割り付けられたすべての出力がFALSEになります。ただし、出力は、経過値が目標位置1よりも小さいときにTRUEになります。以下、目標位置に従って、対応する出力がTRUEとなります。例: 現在位置が目標値2 = -4000と目標値3 = +4000の間にあるとき、出力2TRUEとなります。下図の例では、上限値制御が無効な場合を示しています。この場合は、経過値が最終目標位置に達しても、カウントを継続し、経過値を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に戻ります。

  • 出力0TRUEになります。

  • 経過値を0にリセットします。

経過値が正の最大値を超えたときの動作:

  • ポインタは、目標位置1に戻ります。

  • 出力0TRUEになります。

  • 経過値は加算が継続され、リングカウンタの最小値でカウントを再スタートします。

減算:

データテーブルのポインタは、最終目標位置から目標位置1の向きへ移動します。

経過値が-1に達したときの動作:

  • ポインタは、最終目標位置に戻ります。

  • 最終目標位置に対応する出力がTRUEになります。

  • 経過値が最大目標位置にセットされます。

経過値が-1に達したときの動作:

  • ポインタは、目標位置nに戻ります。

  • 最終目標位置に対応する出力リレーがTRUEになります。

  • 経過値は減算が継続され、リングカウンタの最大値でカウントを再スタートします。

注記

リセット入力あるいはソフトリセットのいずれも使用しない場合を示しています。

ハードリセット動作

チャンネル

ハードリセット入力

0

X2

1

2

X5

3

割り込み動作

経過値が目標値に一致したとき、割り込みプログラムが実行されます。タスクリストの"Interrupt"に登録されると自動的に許可された状態になります。割り込みプログラム番号は、それぞれのチャンネルに割り付けられます。

チャンネル

0

1

2

3

4

5

割り込みプログラム

0

1

3

4

6

7

プログラム上のご注意

  • あらかじめ、使用するチャンネルの高速カウンタ入力の方法をシステムレジスタに指定してください。

  • 高速カウンタ命令が実行されると、対応するチャンネルの高速カウンタ制御中フラグsys_bIsHscChannel0ControlActiveTRUEになり、このフラグがTRUEの間は、同じチャンネルに対して他の高速カウンタ命令を実行することはできません。

  • 命令の実行をキャンセルするには、高速カウンタ制御コード(sys_wHscOrPulseControlCode)を格納するデータレジスタのビット3TRUEにセットします。高速カウンタ制御フラグがFALSEに変化します。高速カウンタ命令の実行を再び有効にするには、ビット3FALSEに戻します。

  • 命令実行中に制御中のチャンネルの経過値を上書きすると、予期せぬ動作になる場合があります。

  • 隣接した目標値間の時間は、1ms 以上となるようにしてください。

  • 主プログラムでこの命令を実行する場合は、各目標位置間の最小移動時間が、1スキャンタイム以上となるように目標位置を設定してください。

  • 割り込みプログラムでこの命令を実行する場合は、隣接した目標値間の最小時間が、割り込みプログラムの最大実行時間より長くなるようにしてください。

  • この命令は同時に2チャンネル分しか起動することはできません。

  • ハードリセット、ソフトリセットを使用する場合は、目標位置1には、³1の整数値を指定してください。

  • 上限目標値一致制御とリセット入力、ソフトウェアリセットを併用する場合は、同時に実行しないようにしてください。

  • 高速カウンタ制御フラグとパルス出力制御フラグのステータスは、スキャンが実行されている間に変化します。例えば、受信バイト数が2回以上読み出された場合、1スキャン内で異なる状態が存在することがあります。

エラーフラグ

sys_bIsOperationErrorHold (TRUEになり、TRUEを保持)
  • チャンネルNo.やデータテーブルの設定値が、指定できる範囲外の値のとき
  • システムレジスタに高速カウンタの使用方法が指定されていないとき
  • 目標値>上限目標値のとき

  • 目標値= 0のとき

  • 目標値が、昇順に並んでいないとき

sys_bIsOperationErrorNonHold (1回のスキャンに対してTRUE)
  • チャンネルNo.やデータテーブルの設定値が、指定できる範囲外の値のとき
  • システムレジスタに高速カウンタの使用方法が指定されていないとき
  • 目標値>上限目標値のとき

  • 目標値= 0のとき

  • 目標値が、昇順に並んでいないとき

上限値制御を行う場合の例

DUT

DUT F165_HighSpeedCounter_Cam_8_Values_DUTは、あらかじめFP Libraryに定義されており、サンプルとして使用することができます。

グローバル変数リスト

グローバル変数リストでは、プロジェクト内のすべてのPOUからアクセスできる変数を宣言します。

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

POUボディ

変数bStartCamTRUEになると、命令が実行されます。

LDボディ

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

STボディ

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

DUT F165_HighSpeedCounter_Cam_8_Values_DUTは、あらかじめFP Libraryに定義されており、サンプルとして使用することができます。

POUヘッダ

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

POUボディ

変数bStartCamTRUEにセットされると、命令を実行します。

LDボディ

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

STボディ

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;

最終修正日: 2022-06-29このページに関するフィードバックお問い合わせ窓口