• 検索結果がありません。

割り込み処理

ドキュメント内 Visual BasicによるDIO入門書 (ページ 68-75)

第 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データ構造体へのポイ ンタを指定します。

「使用方法」

許可するイベントは、設定される数値データは2進数変換時、各ビットにおいて以下の意味をもっ ています。1の時そのイベントは有効となります。 コマンドボタン(cmdIrqWait)のクリックイベ ントのコード (『67ページ  Step3. 割り込み検知処理の作成』)ではBit3〜Bit0までが「1111」と 設定され、IN1〜IN4で入力信号を検知すると割り込みイベントとして認識するよう定義していま す。

Bit0 IN1からの入力信号または、 STB1からの入力信号

Bit1 IN2からの入力信号または、IR.IN1(外部割り込み入力信号)からの入力信号

Bit2 IN3からの入力信号または、ACK2からの入力信号

Bit3 IN4からの入力信号または、IR.IN2(外部割り込み入力信号)からの入力信号

Bit4 インターバルタイマ

Bit5 外部リセット入力 (RSTIN)割り込み

DioSetIrqMask関数でマスクされた接点のイベントを有効にしても、それは割込み信号として処理 されません。また反対に、 DioSetIrqMask関数においてアンマスクな接点でもイベントが有効でな い限り、同様に割込み信号として処理されません。

では、実際のDioSetIrqMask関数の用途ですが、割り込み入力監視中等にフォアグラウンドで実行 される処理の状況により割り込み要因を変更したい場合等、割り込み入力監視開始時には全ての 割り込みイベントを有効としておき、途中、 DioSetIrqMask関数によりその入力をマスクするとい った用途等があげられます。 コマンドボタン(cmdIrqWait)のクリックイベントのコード (『67 ページ  Step3. 割り込み検知処理の作成』)ではDioSetIrqMask関数を便宜上記載しました。

ここまでが、 Win32APIを用いた割り込み処理のプログラム例です。割り込みを多用するとプログ ラムが複雑になることがあります。ですが、柔軟なシステム作成においてこの割り込み処理は有 効な手法となります。

割り込み入力設定において、LowÆHighへの信号変化を割り込みとしたプログラムを作成したに も関わらず、HighÆLowの変化も割り込みとしてとらえてしまう場合があります。この現象は接 点スイッチ部にメカニカルスイッチを用いた場合等に発生します。これは、信号の特性とチャタ リング

*

の影響によるものです。ボードの仕様範囲内で電圧をかける等すると同現象を回避できる 場合があります。

※メカニカルなスイッチ等のON,OFFでは切り替わる際に信号がON/OFFの境界をしばらく行き来 するノイズが発生します。これをチャタリングと言います。スイッチによっては、数百msの間、

信号が安定しない場合もあります。

- 73 - Interface Corporation

ドキュメント内 Visual BasicによるDIO入門書 (ページ 68-75)

関連したドキュメント