変数のビットアクセス
重要
プロセッサがメモリ上で直接ビットアクセスを実行できる場合にのみ、2つのタスクによる同時ビットアクセスを実装します。すべてのx86およびx64システムには、メモリ内のビットアクセス用のコマンドがあります。 ARMやPPCなどのシステムは、メモリ内のビットに直接アクセスできません。
プロセッサがメモリ内で直接ビットアクセスを実行できない場合でも、2つのタスクが同時にビットアクセスを実行する場合は、次の手順に従います。セマフォを使用する(SysSemEnter
)または競合するビットアクセスを防ぐための同様の手法。ただし、タスク内でビットアクセスを実行することをお勧めします。
インデックスアクセスを使用すると、個々のビットを整数変数でアドレス指定できます。構造体変数または関数ブロックインスタンスを使用して、個々のビットをシンボリックにアドレス指定できます。
ビット整数変数へのインデックスアクセス
整数変数の個々のビットをアドレス指定できます。これを行うには、変数にドットとアドレス指定されたビットのインデックスを追加します。ビットインデックスは、任意の定数で指定できます。インデックス付けは0ベースです。
構文
<integer variable name> . <index> <integer data typ> = BYTE | WORD | DWORD | LWORD | SINT | USINT | INT | UINT | DINT | UDINT | LINT | ULINT
プログラムでは、変数の3番目のビット wA
変数の値に設定されます xB
。定数 c_usiENABLE
変数の3番目のビットにアクセスするためのインデックスとして機能します iX
。
インデックスアクセス
PROGRAM PLC_PRG VAR wA : WORD := 16#FFFF; xB : BOOL := 0; END_VAR // Index access in an integer variable wA.2 := xB;
結果: wA = 2#1111_1111_1111_1011 = 16#FFFB
インデックスとしての定数
// GVL declaration VAR_GLOBAL CONSTANT gc_usiENABLE : USINT := 2; END_VAR PROGRAM PLC_PRG VAR iX : INT := 0; END_VAR // Constant as index iX.gc_usiENABLE := TRUE; // Third bit in iX is set TRUE
結果: iX = 4
構造体変数のシンボリックビットアクセス
とともに BIT
データ型の場合、個々のビットを1つの構造に組み合わせて、それらに個別にアクセスできます。次に、ビットはコンポーネント名でアドレス指定されます。
構造体の型宣言
TYPE S_CONTROLLER : STRUCT bitOperationEnabled : BIT; bitSwitchOnActive : BIT; bitEnableOperation : BIT; bitError : BIT; bitVoltageEnabled : BIT; bitQuickStop : BIT; bitSwitchOnLocked : BIT; bitWarning : BIT; END_STRUCT END_TYPE
宣言とビットへの書き込みアクセス
PROGRAM PLC_PRG VAR ControlDriveA : S_CONTROLLER; END_VAR // Symbolic bit access to bitEnableOperation ControlDriveA.bitEnableOperation := TRUE;
機能ブロックインスタンスでのシンボリックビットアクセス
関数ブロックでは、個々のビットの変数を宣言できます。
FUNCTION_BLOCK FB_Controller VAR_INPUT bitSwitchOnActive : BIT; bitEnableOperation : BIT; bitVoltageEnabled : BIT; bitQuickStop : BIT; bitSwitchOnLocked : BIT; END_VAR VAR_OUTPUT bitOperationEnabled : BIT; bitError : BIT; bitWarning : BIT; END_VAR VAR END_VAR ; PROGRAM PLC_PRG VAR fbController : FB_Controller; END_VAR // Symbolic bit access to bitSwitchOnActive fbController(bitSwitchOnActive := TRUE);