langEnglish
PCベースコントローラでのリアルタイム制御
2. I/O機器のリアルタイム制御


PCベースコントローラは、コントローラに標準搭載されているLANポートやシリアルポートをはじめ、市販のPCIデバイス等の外部拡張ボードを利用できます。
通常、Windowsでデバイスを使用するためにAPIやドライバが用意されています。
リアルタイムOSで制御を行う場合も、ご要望の多いほとんどの業界標準接続インターフェースに対してリアルタイム制御用APIとドライバを提供しています。
CC-Link、CC-Link/IE、MECHATROLINK-II、MECHATROLINK-III、Devicenet、CANopen、Profibus、EtherCAT®、FL-net、モーション制御、画像処理 etc...
こういったデバイス制御は、基本的にIOポート(デバイスレジスタ)を操作したり、ハードウェア割込みを検知して処理を行います。
Windowsで制御する場合にはデバイス専用のドライバが必要となりますが、PCベースコントローラには標準関数としてデバイス制御に必要な関数が用意されているため、専用のドライバが無くてもアプリケーションから直接制御することも可能です。
(1) IOポートへのアクセス
IOポートは、デバイスに対して設定の変更や状態の確認などをするために存在する領域です。
IOポート操作関数は直接CPU命令in / outを発行しており、デバイスの持つ各レジスタに対して8bit / 16bit / 32bitアクセスが行えます。
デバイスによりレジスタの数や内容が異なるので、データシートなどの資料を参照してレジスタ構成やアクセス方法等を理解しておくことが必要です。
IOポートアクセス
- IOポートへのアクセス経路 -
□■□■□■□■□■□■□■□  COFFEE BREAK  □■□■□■□■□■□■□■□
IOポート操作関数を利用すると、RS-232C等のシリアル通信で使用するCOMポートでもデジタル入出力ができます。

COM1のRTS信号を使用して
LEDを1秒周期で5回点滅させる COMでLED点灯
■ INtime®アプリケーションのソースコード例
#include <rt.h>

#define IO_BASE 0x03F8      // IOポートのベースアドレス
#define MCR     0x0004      // モデムコントロールレジスタのオフセット
#define RTS     0x02        // RTSピンの状態設定ビット(0:OFF 1:ON)

void        main(int argc, char* argv[])
{
    int i;
    BYTE val = inbyte(IO_BASE + MCR);   // 現在の状態取得

    for(i=0; i<10; i++)
    {
        RtSleep(500);

        if(i % 2)   outbyte(IO_BASE + MCR, val & ~RTS);    // 消灯
        else        outbyte(IO_BASE + MCR, val | RTS);     // 点灯
    }
}
□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
(2) ハードウェア割り込みの利用
ハードウェア割り込みは、デバイスの信号変化などのイベントを通知する機能です。
イベントの種類はデバイスによって異なり、デジタル入出力ボードの場合は入力信号の変化を、COMポートの場合は送信バッファの状態やデータ受信状態などを通知することができます。
デバイスによっては割り込み機能がないものもあります。
ハードウェア割り込み信号は「割り込みハンドラ」が受け取ります。
ただし、割り込みコントローラ(PIC)の特性により、割り込みハンドラ実行中は他の割り込みハンドラの起動が抑止されてしまうため、処理は影響を与えぬよう可能な限り短時間に終える必要があります。
割り込みを検知した際に行う処理を記述する最も一般的な手法は、割り込みハンドラから起動する「割り込みスレッド」の中に記述する方法です。
割り込み処理
- 割り込み処理のしくみ -

< 1 2 3 4 >