パルス出力命令(PWM出力:チャンネル指定付)
この命令は、指定されたDUTの内容に従って、PWM出力を制御します。指定したチャンネルの制御中フラグがFALSEで、実行条件がTRUEのとき、指定したチャンネルからパルスが出力します。
入力
データテーブルが格納されているエリアの先頭アドレス
パルス出力チャンネル:
FP-XH C30 T/P: 0~3
FP-XH C60 T/P: 0~5
FPS: 0,2
FP-X、FP-XHリレー:0.1
FP-X、FP-XH 16kトランジスタ:0~2
FP0R、FP0H、FP-X、FP-XH 32トランジスタ:0~3
FP-XH 32kトランジスタ:0~5
以下のDUTを使用してください。 F173_PulseOutput_PWM_DUT
下記のパラメータをDUTに設定します:
周波数
デューティ比
長方形の波形のパルス幅とパルス周期の比。パルス幅が1msで、パルス周期が4msのパルス列の場合、デューティー比は0.25または25%となります。
デューティは、特に最小値または最大値付近では、負荷電圧、負荷電流によって、指定比率と異なる場合があります。
デューティ比は、スキャン毎に変更することができます。
ただし、命令実行中に周波数(定数 K)を変更することはできません。命令起動後に制御コードを変更した場合、デューティの分解能のみに影響し、周波数には影響しません。
命令が実行されているとき、デューティ比が指定可能範囲外の値に変更されると、デューティ比は最大値に補正されます。命令が起動されているときは、演算エラーにはなりません。
命令が実行されているとき、デューティ比が指定可能範囲外の値に変更されると、デューティ比は最大値100に補正されます。命令が起動されているときは、演算エラーにはなりません。
命令起動後にデューティを 100% 以上にした場合、指定分解能の最大値で動作 します。命令が起動されているときは、演算エラーにはなりません。
通常プログラムと割り込みプログラムの両方に、同じチャンネルについて記述する場合、同時に実行されないようにしてください。
FP-X, FP0R:パルス出力命令が実行され、パルスが出力されている間は、対応するチャンネルのパルス出力命令制御中フラグ(例: sys_bIsPulseChannel0Active)がTRUEになります。このフラグがTRUEのときは、他のパルス出力命令を実行することはできません。
FPS: 高速カウンタ制御中フラグ(例: sys_bIsHscChannel0ControlActive)とパルス出力制御中フラグ(例: sys_bIsPulseChannel0Active)は、同じ特殊内部フラグの番号に割り付けられています(例: R903A)。従って、高速カウンタ命令またはパルス出力命令が実行されているときは、使用しているチャンネルに対応する、高速カウンタ制御中フラグ(例: sys_bIsHscChannel0ControlActive)とパルス出力制御中フラグ(例: sys_bIsPulseChannel0Active)がTRUEになります。このフラグがTRUEの間は、同じチャンネルに対して、他の高速カウンタ命令、あるいはパルス出力命令を実行することはできません。
FPS: 円弧補間制御命令F176_PulseOutput_Centerが実行されている間、円弧補間制御フラグ(sys_bIsCircularInterpolationActive)がTRUEになり、目標値に達するまで保持されます(実行条件がTRUEではなくなった場合も)。この間、他のパルス出力命令を実行することはできません。
FPS: パルス出力に使用するチャンネルの高速カウンタは、システムレジスタで"未使用"を指定してください。
FP-X, FP0R: 使用するチャンネルに対応するシステムレジスタに"PWM 出力"を指定してください。
位置決めプログラムの作成にあたっては、強制停止ができるようにプログラミングすることをおすすめします。
高速カウンタ制御フラグとパルス出力制御フラグのステータスは、スキャンが実行されている間に変化します。例えば、受信バイト数が2回以上読み出された場合、1スキャン内で異なる状態が存在することがあります。
グローバル変数リストでは、プロジェクト内のすべてのPOUからアクセスできる変数を宣言します。
DUT F173_PulseOutput_PWM_DUTは、あらかじめFP Library内に定義されています。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR_EXTERNAL
X6_bEnablePWM: BOOL:=FALSE;
END_VAR
VAR
dutPWMControl: F173_PulseOutput_PWM_DUT:=iFrequencyValue := 1;
(*iFrequencyValue := 1: f=2.0 Hz, T=502.5 ms;
*)
iPulseWidthModulationDuty: INT:=500;
(*500 = 50% duty*)
@'': @'';
END_VAR
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,,X6_bEnablePWM,5,2,7,4,);
B(B_F,E_MOVE!,Instance,16,1,22,5,,?DEN?D?AENO?C);
B(B_VARIN,,iPulseWidthModulationDuty,14,3,16,5,);
B(B_VAROUT,,dutPWMControl.iPulseWidthModulationDuty,22,3,24,5,);
L(7,3,16,3);
L(1,3,5,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,F173_PulseOutput_PWM!,Instance,16,0,29,5,,?DEN?Ds_dutDataTable?Hn_iPulseOutputChannel?AENO);
B(B_VARIN,,dutPWMControl,14,2,16,4,);
B(B_VARIN,,2,14,3,16,5,);
B(B_CONTACT,,X6_bEnablePWM,5,1,7,3,);
L(7,2,16,2);
L(1,2,5,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (X6_bEnablePWM) then
dutPWMControl.iPulseWidthModulationDuty:=iPulseWidthModulationDuty;
END_IF;
IF (X6_bEnablePWM) then
F173_PulseOutput_PWM(s_dutDataTable := dutPWMControl,
n_iPulseOutputChannel := 2);
END_IF;