第 4 章 チュートリアル 20
4.4 割り込み処理
ここでは、割り込み処理の方法に関し記載します。フォアグラウンドでプログラムが実行中、バ ックグランドにて非同期に常時割り込み入力を監視し、割り込みを検知するとフォアグラウンド のプログラムを停止し(割り込み)ユーザーに知らせる方法を記載しています。
ここでは、ボードの入力接点番号1(IN1)より入力(HighÆLow)があった場合、それを割込み信号と して取得するプログラムの作成を行います。非同期処理の実現にはWin32 APIを使用しています。
割り込み監視処理の構築は、以下のシーケンスで行います。
非同期に実行されるオブジェクトを作成する。
↓
割り込み要因の論理を定義する。
↓
不要な割り込み入力をマスクする。
↓
バックグランドで割り込み監視処理を開始する。
↓
バックグランドの処理を監視し、処理が終了した
場合(割り込み信号の入力があった場合)、作成し
たイベントを解放する。
- 67 - Interface Corporation
Step1. 基本フォーム作成
ここでは、これから作成するプログラムの画面作成を行います。 (詳しくは『21ページ 4.1 デジ タル入力』でのStep1〜Step3を参考にしてください。)
1. Visual Basicを起動し新しい標準EXEプロジェクトを作成します。
2. プロジェクト名を Interrupt に変更します。
3. 既定のフォームの名前を formInterrupt に変更し、フォームのタイトルを“割り込み入力”に変 更します。
4. プロジェクトに標準モジュールを追加します。
5. 標準モジュールに 標準モジュールのプロシージャ宣言のコード ( 『28ページ Step2. DLLプ ロシージャ宣言』 )を追加します。
Step2. フォアグラウンド処理の作成
ここでは、バックグランドでの割り込み入力監視処理の確認のため、フォアグラウンドで実行さ せるプログラムの作成を行います。
1. フォームにタイマー(Timer)コントロールを描画し、オブジェクト名をtimForegroundにします。
2. timForegroundのIntervalプロパティを10に設定します。
3. 作成したタイマーコントロール(timForeground)をダブルクリックし編集ウィンドウを開き タ イマーコントロール(timForeground)のコード (『58ページ Step2. フォアグラウンド処理の作 成』)を追加します。
Step3. 割り込み検知処理の作成
ここでは、バックグランドで割り込み信号の検知を行うプログラムの作成を行います。
1. フォーム上にコマンドボタン(CommandButton)コントロールを描画し、 cmdIrqWaitと名付けコマ ンドボタンコントロールのタイトルを“割り込み待機”に変更します。
2. 作成したコマンドボタン(cmdIrqWait)をダブルクリックし編集ウィンドウを開き次ページのコ
ードを記述します。
(
コマンドボタン
(cmdIrqWait)のクリックイベントのコード
) Private Sub cmdIrqWait̲Click()
Dim lpszName As String Dim nRet As Long
Dim lpOverlapped As OVERLAPPED Dim lpEventAttributes As Long ‘初期化処理
lpszName = “FBIDIO1” & Chr(0)
hDeviceHandle = DioOpen(lpszName, FBIDIO̲FLAG̲SHARE) If hDeviceHandle = ‑1 Then
MsgBox “デバイスのオープンに失敗しました”
Exit Sub End If
‘イベントオブジェクト(割り込み監視)の作成を行います
lpOverlapped.hEvent = CreateEvent(lpEventAttributes, True, False, 0) ‘割り込み発生論理の設定を行います
nRet = DioSetIrqConfig(hDeviceHandle, &H0) If nRet <> 0 Then
MsgBox “割り込み要因の割り当てに失敗しました”
Exit Sub End If
‘割り込みのマスク設定を行います
nRet = DioSetIrqMask(hDeviceHandle, &H1) If nRet <> 0 Then
MsgBox “マスク設定に失敗しました”
Exit Sub End If
‘ボードのイベント要求を待ちます
nRet = DioEventRequestPending(hDeviceHandle, &HF, pEventBuf, lpOverlapped)
cmdIrqWait.Enabled = False ‘待機ボタン使用禁止 ‘割り込みがあるまで待機する
Do Until WaitForSingleObject(lpOverlapped.hEvent, 0) = 0 DoEvents
Loop
MsgBox “割り込みを検知しました”
cmdIrqWait.Enabled = True ‘待機ボタン使用許可 ‘作成したイベントを終了します
CloseHandle (lpOverlapped.hEvent) nRet = DioClose(hDeviceHandle) If nRet <> 0 Then
MsgBox (“デバイスのクローズに失敗しました”) End If
End Sub
では、プログラムを実行してみてください。
フォーム上で点(ドット)が移動しています。このとき、「割り込み待機」ボタンをクリックして下 さい。フォアグラウンドではフォーム上への点(ドット)の描画プログラムが実行され、バックグラ ンドでは割り込み入力の監視が開始されます。
では、ここで入力接点番号1(IN1)の状態をOFFÆON(HighÆLow)にしてください。
画面上に「割り込みを検知しました」とメッセージボックスが表示されます。
- 69 - Interface Corporation では、ここより、使用したFbiDio.DLLの関数について記載します。
バックグランド処理設定のコード (『59ページ Step3. バックグランド処理の作成』)では入 力 接 点 番 号 1(IN1) を OFFÆON(HighÆLow) に し た 時 の み 割 り 込 み イ ベ ン ト が 発 生 し 、 ONÆOFF(LowÆHigh)にしても割り込みイベントは発生しません。これは、どういった信号を割 り 込 み と し て 扱 う か が 、 ボ ー ド に 設 定 さ れ て い る た め で す 。 割 り 込 み 要 因 の 設 定 に は DioSetIrqConfig関数を使用します。
nRet = DioSetIrqConfig(hDeviceHandle, &H0)
ボードのオープン時に取得したデバ イスハンドルを指定します。
関数が失敗するとエラーコー ドが格納されます。
割り込み要因の論理を設定 します
。
「使用方法」
割り込み要因の論理の設定は、設定される数値データは2進数変換時、各ビットにおいて以下の意 味をもっています。
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
EDS4 EDS3 EDS3 EDS1 SIG4 SIG3 SIG2 SIG1
SIG1〜SIG4の各々がどういった条件の時、割り 込みとするかを設定します。
各ビットを入力接点にアタッチします。
割り込み発生論理設定状態
EDS1 SIG1の割り込み発生論理の設定 EDS2 SIG2の割り込み発生論理の設定 EDS3 SIG3の割り込み発生論理の設定 EDS4 SIG4の割り込み発生論理の設定
値 意味
0 High → Low
1 Low → High
SIG1[割り込み要因割り当て]
値 意味
0 IN1 1 STB1 SIG2[割り込み要因割り当て]
値 意味
0 IN2 1 IR.IN1 SIG3[割り込み要因割り当て]
値 意味
0 IN3 1 ACK2 SIG4[割り込み要因割り当て]
値 意味
0 IN4 1 IR.IN2
コマンドボタン(cmdIrqWait)のクリックイベントのコード (『67ページ Step3. 割り込み検知 処理の作成』)においては、 &h0が設定されています。つまり、 Bit7〜Bit0までが「00000000」と設 定され、その意味は「IN1,IN2,IN3,IN4のうちどれかが、HighÆLowに変化した時それを割り込み 入力とする」と定義しているわけです。
注意
!
設定できる割り込み要因は、使用する製品により決まります。設定できる割り込み要因の詳 細に関しては、各製品マニュアルを参照してください。
では、プログラム実行後、入力接点番号2(IN2)をOFFÆON(HighÆLow)にした時はどうでしょう。
確認できるように割り込みは発生しません。
これは、IN1以外の状態の変化がマスク処理(不要な割り込み入力を保護)されているためです。
割り込み入力のマスク処理にはDioSetIrqMask関数を使用します。
nRet = DioSetIrqMask(hDeviceHandle, &H1)
ボードのオープン時に取得したデバ イスハンドルを指定します。
関数が失敗するとエラーコー ドが格納されます。
割り込み要因のマスク/ア ンマスクを設定します
。
「使用方法」
割り込み要因のマスクの設定は、設定される数値データは2進数変換時、各ビットにおいて以下の 意味をもっています。0の時その接点はマスクされます。
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
未使用 未使用 SIGR SIGT SIG4 SIG3 SIG2 SIG1
DioSetIrqConfig関数で設定した各接点に対応します。
SIGR=外部割り込み SIGT=タイマ割り込み
値 意味
0 マスクする
1 マスクしない
コマンドボタン(cmdIrqWait)のクリックイベントのコード (『67ページ Step3. 割り込み検知
処理の作成』 )では&h1が設定されています。つまりBit7〜Bit0までが「00000001」と設定され、入
力接点番号1(IN1)以外の入力信号はマスク処理されているので、入力接点番号1(IN1)以外の状態の
変化は割込み信号として処理されません。
- 71 - Interface Corporation 最後に、実際の監視処理の開始では、DioEventRequestPending関数が呼び出されて初めて処理が 開始されます。
nRet = DioEventRequestPending(hDeviceHandle, &H1, pEventBuf, lpOverlapped)
関数が失敗するとエラーコー ドが格納されます。
ボードのオープン時に取得したデバイス ハンドルを指定します。
許可するイベントをビットアサイ ンで設定します。
通知されたイベント内容 が格納されます。
OVERLAPPEDデータ構造体へのポイ ンタを指定します。
「使用方法」