ISaGRAF Ver. 4/5のI/Oドライバの命名方法とアドレスの取得方法


(この機能は、ISaGRAF PRO開発ツールキット、またはISaGRAF I/O開発キットを使用して実装します)

I/Oドライバを開発時には、I/Oのハードウェアを操作するC言語の関数をいくつか作ることになります。これらの関数名は、"パッケージ名/ドライバ名/デバイス名"に実行するアクションの種別(IosInit/IosExit 等)をつけたものにします。

【例】
パッケージ名:CJI
ドライバ名 :IBS
装置機器名 :CPX2B8IO
単一デバイス名:SPL8IB
アクション :IosInit(初期化)、IosRead(チャネルのリード)等

この場合、作成する関数名は
    cjiibsIosInit
    cjiibscpx2b8iospl8ibIosRead
等になります。

カーネル内部では、まずワークベンチのコンパイラが作ったデータを元に、これらの名前を組み立ます。さらに、名前をもとに関数のアドレスを得ています。
この部分のコードはカスタマイズ可能で、ソースファイル
    IsaKer\DIOS0CUS.c
の中に記述されています。ソースの中で、以下の関数群をカスタマイズできます。

初期化
下記の関数はI/O全体の初期化時、各I/Oドライバの初期化前にコールされます。
typSTATUS iosCusInit(
    strRtIoDrv* pRtIoDrv, /*In: 最初のI/OドライバのランタイムI/O構造体 */
    uint16 huNbRtIoDrv, /*In: I/Oドライバの数 */
    strKIoXParam* pKIoXParam /*In: 追加のパラメ-タ */
)

終了
下記の関数はI/O全体の終了処理時、各I/Oドライバのexit処理後にコールされます。
void iosCusExit(
    strRtIoDrv* pRtIoDrv, /*In: 最初のI/OドライバのランタイムI/O構造体 */
    uint16 huNbRtIoDrv, /*In: ドライバの数 */
    strKIoXParam* pKIoXParam /*In: 追加のパラメ-タ */
)

名前からアドレスを得る
このルーチンは、ワークベンチでデータから得たI/Oドライバの名前から、その関数のアドレスを取得します。
関数名は、"pvRtIoObj"の"psName"フィールドに格納されていて、I/Oオブジェクトの種別に応じてつけられるパッケージ名/ドライバ名/デバイス名を結合したものです。名前の大文字/小文字は未定義です。標準のターゲットでは、小文字で格納されます。
void iosCusFctAddGet(
    void* pvRtIoObj, /* In: I/OオブジェクトのランタイムI/O構造体 */
    strKIoXParam* pKIoXParam, /* In: 追加のパラメータ */
    uchar cuIoFctType, /* In: アドレスを取得するI/O関数の種別 */
    typPFnIplFct* ppfnIplFct1, /* Out: 関数1のアドレス (I/Oオブジェクトに依存) */
    typPFnIplFct* ppfnIplFct2 /* Out: 関数2のアドレス (I/Oオブジェクトに依存) */
)

"pvRtIoObj"の実際の型は、"cuIoFctType"パラメータの値によります。
cuIoFctTypeの値 void* pvRtIoObjの実際の型 実体
ISA_IO_FCTTYP_DRV strRtIoDrv* I/Oドライバ
ISA_IO_FCTTYP_LEV1DVC strRtIoCpxDvc* または
strRtIoSplDvc*
レベル1デバイス。I/O装置機器、または単一のI/Oデバイスです。区別するためにはISA_IO_OBJID_GET()関数を使います。
ISA_IO_FCTTYP_SPLDVCR strRtIoSplDvc* 入力デバイス
ISA_IO_FCTTYP_SPLDVCW strRtIoSplDvc* 出力デバイス

この関数は実装済みです。
なお、I/Oドライバの名前の生成は次の関数内で行っています。
static uchar _iosObjFctNmBuild(
    char* psIoObjName, /*In: I/Oオブジェクト名 */
    char* psActionName, /*In: 作成する関数ののアクション名 */
    char* psIoObjFctNm, /*Out: 作成した関数名の格納バッファ */
    uchar cuIoObjfctNmMLn /*In: バッファの最大長 */
)
この関数も変更可能です。例えば、"psIoObjName"パラメータの一部分を取り出すことが出来ます。

アドレスの開放
この関数はI/O関数のアドレスを開放します。ディフォルトの実装のままで機能を実現できます。
void iosCusFctAddRelease(
    void* pvRtIoObj, /* In: オブジェクトのランタイムI/O構造体 */
    strKIoXParam* pKIoXParam, /* In: 追加のパラメータ */
    uchar cuIoFctType, /* In: 開放する関数の種別 */
    typPFnIplFct pfnIplFct1, /* In: 関数1のアドレス (I/Oオブジェクトに依存) */
    typPFnIplFct pfnIplFct2 /* In: 関数2のアドレス (I/Oオブジェクトに依存) */
)
最終更新:
2008-06-25 18:14
改訂:
1.0
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.