Visual C++によるメモリ共有 インタフェース入門書 … 商標/登録商標...

74
www.interface.co.jp チュートリアル Visual C++によるメモリ共有 インタフェース入門書

Transcript of Visual C++によるメモリ共有 インタフェース入門書 … 商標/登録商標...

www.interface.co.jp

チュートリアル

Visual C++によるメモリ共有

インタフェース入門書

www.interface.co.jp

商標/登録商標 本ドキュメントに掲載されている会社名,製品名は、それぞれ各社の商標または登録商標です。 保障の内容と制限 弊社はドキュメント内の情報の正確さに万全を期しています。万一、誤記または誤植等があった

場合、弊社は予告なく改訂する場合があります。ドキュメントまたはドキュメント内の情報に起

因するいかなる損害に対しても弊社は責任を負いません。 製品に含まれるバグ、あるいは製品の供給(納期遅延),性能、もしくは使用に起因する付帯的損害もしくは間接的損害に対して、弊社に全面的に責がある場合でも、弊社はその製品に対する改良

(正常に動作する)、代品交換までとし、金銭面での賠償の責任は一切負わないものとしますので、予めご了承ください。 ドキュメント内の図や表は説明のためであり、ユーザ個別の応用事例により変化する場合があり

ます。 著作権,知的所有権 弊社は本製品に含まれるおよび本製品に対する権利や知的所有権を保持しています。 本製品はコンピュータ ソフトウェア(プログラム),図,文章,写真等を含んでいます。 複製の禁止 弊社の許可なく、本製品(ドキュメント含む)の全て、または一部に関わらず、複製,改変等を行うことはできません。 責任の制限 弊社は、弊社または再販売者の予見の有無に関わらず、発生したいかなる特別損害,偶発的損害,間接的な損害,重大な損害について、責任を負いません。 補償の内容 本ドキュメントで使用している弊社製品の補償については、各製品のマニュアルを参照してくだ

さい。

本書の内容の一部または全部を、無断で転載することを禁止します。 本書の内容は、将来予告なく変更することがありますので、予めご了承ください。 © 2000, 2007 Interface Corporation. All rights reserved.

TUT-0032

- 1 - Interface Corporation

改訂履歴

Ver. 年 月 改 訂 内 容 1.1 2007年1月 ●フォーマット変更。

●製品紹介削除。 ●対応型式追加。 ●ソフトウェア Windows Vista,XP Embedded,Server 2003,XP,2000対応。 ●技術資料一覧追加。 ●奥付き追加。

1.0 2000年12月 新規作成

本チュートリアルをご使用の際は、必ず各製品型式の最新のドキュメント(ユーザーズマニュアル,Help)をあわせて参照してください。また、最新のドライバソフトウェアをご使用ください。 ユーザーズマニュアル,ドライバソフトウェアは弊社Web site(www.interface.co.jp)からダウンロードできます。(Helpはドライバソフトウェアに含まれています)

TUT-0032

Interface Corporation - 2 -

目 次

第 1章 メモリ共有インタフェース(メモリンク)概要 5

1.1 デュアルポートRAM.................................................................................................................... 6 1.2 システム構成 ................................................................................................................................. 6

第 2章 メモリンク製品のインストール 8

2.1 コンピュータへの設置方法......................................................................................................... 8 2.1.1 デバイスドライバのインストール.................................................................................. 9 ■Windows Vistaをご使用の場合 ......................................................................................... 9 ■Windows XP Embedded,Windows XP,Windows Server 2003をご使用の場合............ 12 ■Windows 2000をご使用の場合 ....................................................................................... 14

2.2 サンプルプログラム,Help,ヘッダファイル,インポートライブラリ,最新情報ドキュメントファイルのインストール ....................................................................................................... 16

第 3章 Visual C++によるメモリンク制御 17

3.1 DLLプロシージャ呼び出しによるプログラミング(概要).................................................... 18 3.2 メモリンク制御概略 ................................................................................................................... 18

第 4章 チュートリアル 19

4.1 メモリの共有 ............................................................................................................................... 20 Step1.プロジェクト作成 .............................................................................................................. 21 Step2.DLLプロシージャ宣言 ...................................................................................................... 22 Step3.初期化処理と終了処理 ...................................................................................................... 25 Step4.ダイアログ作成 .................................................................................................................. 30 Step5.メモリ共有(マスタ側) ....................................................................................................... 31 Step6.メモリ共有(スレーブ側) ................................................................................................... 33

4.2 ブロック操作 ............................................................................................................................... 35 Step1.プロジェクト作成 .............................................................................................................. 36 Step2.ブロック操作 ...................................................................................................................... 39

4.3 メモリ操作 ................................................................................................................................... 44 Step1.プロジェクト作成 .............................................................................................................. 44 Step2.コピー操作 .......................................................................................................................... 47 Step3.フィル操作 .......................................................................................................................... 50

4.4 割り込み処理 ............................................................................................................................... 52 Step1.プロジェクト作成 .............................................................................................................. 52 Step2.コールバック処理(コールバックイベント)................................................................... 53 Step3.割り込み発生 ...................................................................................................................... 55

第 5章 FbiMl.DLLリファレンス 58

MlOpen ........................................................................................................................................... 58 MlClose........................................................................................................................................... 58 MlGetInformatioin ......................................................................................................................... 58

TUT-0032

- 3 - Interface Corporation

MlReadByte.................................................................................................................................... 59 MlReadWord .................................................................................................................................. 59 MlWriteByte ................................................................................................................................... 59 MlWriteWord ................................................................................................................................. 60 MlFillByte....................................................................................................................................... 60 MlFillWord ..................................................................................................................................... 60 MlReadMemoryByte ...................................................................................................................... 61 MlReadMemoryWord .................................................................................................................... 61 MlWriteMemoryByte ..................................................................................................................... 61 MlWriteMemoryWord ................................................................................................................... 62 MlCopyMemoryByte...................................................................................................................... 62 MlCopyMemoryWord .................................................................................................................... 62 MlSetEventMask ............................................................................................................................ 63 MlGetEventMask............................................................................................................................ 63 MlSetEvent ..................................................................................................................................... 63 MlSetEventEx................................................................................................................................. 64 MlGetEventStat .............................................................................................................................. 65 MlKillEvent .................................................................................................................................... 65 MlGenerateIrq ................................................................................................................................ 65 MlSetAcControl.............................................................................................................................. 66 MlGetAcControl ............................................................................................................................. 66 MlSetSlaveNo(PCI-4912,4915用) ................................................................................................ 66 MlGetSlaveNo(PCI-4912,4915用) ............................................................................................... 67 MlParityCheck(PCI-4911,4913用) ............................................................................................... 67 エラーコード一覧 ........................................................................................................................ 67

5.1. Visual C++用定数一覧 .................................................................................................................. 68

技術資料紹介 69

TUT-0032

Interface Corporation - 4 -

はじめに

平素は格別のご高配を賜り、厚く御礼申し上げます。本冊子は、はじめて弊社メモリンク製品を

利用しVisual Basicにて制御プログラムの作成を行われる方を対象に、製品の導入からプログラム作成までに関し説明したものです。プログラム初心者の方が弊社製品をご利用頂き、またVisual Basicにてプログラムの開発を行われる際の手助けになればと考えております。 記述する内容に関しましては、基本的なことにとどまっております。 また、弊社Web site(www.interface.co.jp)ではFAQ,製品マニュアル,および本チュートリアル記載のサンプルプログラムのソース(BPC-0810)の公開を行っておりますので、こちらもあわせてご覧頂けますと、より一層ご理解を深めて頂けるものと思います。

注意事項

本冊子では、使用する環境をWindows Vista/XP/XP Embedded/Server 2003/2000+Visual Basic Ver. 5.0(SP3)またはVer. 6.0(SP5)を想定し記載しております。 Windows NT/Me/98/95をご利用の場合、I/Oモジュールのインストール方法が本冊子に記載した内容とは異なりますのでご注意ください。こちらに関しましては、弊社製品マニュアルをご確認く

ださい。 Visual Studio.NETでご利用の方は、GPC-4910の.NET用補足Helpを参照してください。 対応OSはI/Oモジュール型式によって異なりますので、対応ソフトウェア(GPC-4910)のReadmeもしくはHelpでご確認ください。

対象環境 本チュートリアルは以下の制約事項があります。 対象型式 (PCI)

PCI-4911 PCI-4914

PCI-4912 PCI-4915

PCI-4913 PCI-4919

対象型式 (CPZ)

CPZ-4911 CPZ-4914

CPZ-4912 CPZ-4915

CPZ-4913 CPZ-4919

対象型式 (CTP)

CTP-4911 CTP-4914

CTP-4912 CTP-4915

CTP-4913 CTP-4919

対象型式 (PEX)

PEX-493103 PEX-493104 PEX-493109

対象型式 (LPC)

LPC-493103 LPC-493104 LPC-493109

対象ユーザ 制御用電子機器および、コンピュータ等に関して基本的な知識を有している方。

※ 本冊子は上記の弊社製品型式のみに対応しています。 製品の詳細は弊社Web siteを参照してください。

TUT-0032

- 5 - Interface Corporation

第1章 メモリ共有インタフェース(メモリンク)概要

メモリ共有インタフェースとは、コンピュータ間をメモリで結合する通信インタフェースです。

マスタとスレーブを専用のケーブルで接続することで、スレーブ上のデュアルポート

RAM(D.P.RAM)を介してデータ転送を行うことができる弊社独自のシステムです。このとき、スレーブ上のD.P.RAMを2台のコンピュータが共有し、それぞれのコンピュータがメモリで結合(リンク)されることから、「メモリンク」と呼んでいます。

マスタ

スレーブ 専用ケーブル

メモリマップ

00000H

C0000H

E0000H

100000H

“ABC”

00000H

C0000H

E0000H

100000H

“ABC”

メモリにデータを書くだけで 接続先のメモリにデータが 伝わります。

DP RAM

メモリマップ

メモリンクと、モデムやISDNのTAとの接続によく使われる調歩同期シリアル通信との比較を以下に示します。

項目 メモリンク 調歩同期シリアル通信 通信速度 3m版で最高2MB/s

30m版で最高1MB/s RS-232使用時、最高1MB (バイト換算で、125KB/s) RS-485使用時、最高10MB (バイト換算で、1.25MB/s) ※ 規格上の最高速度です。

通信方法 メモリンクのメモリ領域にデータを書き込むと、相手側のメモリ領域に書き込んだデータが出現する。

通信コントローラを制御し、データのビット操作を行いつつ、データを送信する。 受信側は、受信待ちを行い、受け取ったデータのビット操作を行いつつ、元のデータに復号化する。

延長距離 3m版で最大3m 30m版で最大30m

RS-232使用時、最大15m RS-485使用時、最大1200m

メモリ領域 共有できるメモリ領域は256KB。

メモリンクの最大の特徴は、通信方法にあります。 調歩同期シリアル通信等の通信方式では、通信コントローラが存在し、データの送受信は、この

コントローラへアクセスすることで行います。 メモリンクは、メモリに書いたものが、そのまま相手に伝わります。通信を行っているという感

覚は無く、まさに「メモリを共有」している感覚で通信が行えます。

TUT-0032

Interface Corporation - 6 -

1.1 デュアルポートRAM

デュアルポートRAMとは、メモリデバイス内の記憶部に対して、書き込み用/読み出し用のインタフェースを2つ有するRAMです。 メモリンクでは、このメモリ上のデータはコンピュータが割り当てたアドレス空間に現れます。

★リソースの割り当て PCI/CompactPCIバス製品では、メモリリソースはコンピュータにより自動的に割り付けられますが、ISAバス,C(98)バス製品はロータリスイッチにてアドレスを設定する必要があります。

1.2 システム構成

メモリンクの接続方法は「マスタ⇔終端スレーブ」が基本となります。

マスタ 終端スレーブ

さらに接続を増やす場合には「マスタ⇔終端スレーブ」の間に分岐アダプタを設置し、増設スレー

ブを接続します。1つのマスタに対し最大8つのスレーブ(増設スレーブ7+終端スレーブ1)を接続することが可能です。

マスタ終端

スレーブ

分岐アダプタ 分岐アダプタ

増設スレーブ

#1

増設スレーブ

#7

増設スレーブ7台

終端スレーブ1台

メモリンクには3m版と30m版とがあり、それぞれ接続時のケーブルの長さに上限があります。

30m版メモリンクの場合、マスタから終端スレーブまでは30m以内、分岐アダプタから増設スレーブま

では3m以内となります。

また、3m版メモリンクの場合、マスタから終端スレーブまでは3m以内、分岐アダプタから増設スレー

ブまでは0.3m以内となります。

TUT-0032

- 7 - Interface Corporation

分岐アダプタ 分岐アダプタ

増設スレーブ

#0

増設スレーブ

#6

30m以内

3m以内

マスタ終端

スレーブ

30m版メモリンクの場合

分岐アダプタ 分岐アダプタ

増設 スレーブ

#0

増設 スレーブ

#6

3m以内

0.3m以内

マスタ 終端 スレーブ

3m版メモリンクの場合

TUT-0032

Interface Corporation - 8 -

第2章 メモリンク製品のインストール

作成するアプリケーションからメモリンク共有制御を行う場合、当然のことながらアプリケーシ

ョンを実行するコンピュータにメモリンク製品が組み込まれていなければなりません。 ここではWindowsVista/XP/XP Embedded/Server 2003/2000環境における、弊社メモリンク製品のインストール方法を記載します。Windows NT/Me/98/95ではインストール方法がここに記載する内容とは異なります。こちらに関しては、製品マニュアルまたはオンラインドキュメントをご確認く

ださい。

2.1 コンピュータへの設置方法

※ 写真は実物と異なる場合があります。

①コンピュータ本体の電源が“OFF”であることを確認し、電源ケーブルをACコンセントから外します。その後、外装カバー,スロットカバーを外します。

②拡張用スロットへI/Oモジュールを差し込みます。

<例>

基板の左右の端に力を入れ、カツンとショックがあるまで押し込む。

I/Oモジュール

コンピュータ

PCIコネクタ

金メッキ端子がコネクタに隠れていることを確認する。

ビス留め

注意!

製品は正しい向きに実装してください。間違った向きに実装した場合、コンピュータ,I/Oモジ

ュールを破損する恐れがあります。

③パネルをコンピュータ本体とビス留めしてください。

④本体へ外装カバーを元通り取り付け、電源ケーブルをACコンセントに接続します。その後、コンピュータを起動します。

以上でI/Oモジュールの設置は完了です。次にドライバのインストールを行います。

TUT-0032

- 9 - Interface Corporation

2.1.1 デバイスドライバのインストール

■Windows Vistaをご使用の場合

Administratorsのグループに所属しているユーザが、インストールを行ってください。 ※ 「続行するにはあなたの許可が必要です」と警告が表示されることがあります。その場合、 「続行」をクリックしてください。

①Windows Vistaが起動すると、「新しいハードウェアが見つかりました」が表示されます。

②「ドライバソフトウェアを検索してインストールします(推奨)」をクリックします。

③「オンラインで検索しません」をクリックします。

TUT-0032

Interface Corporation - 10 -

④「ディスクはありません。他の方法を試します」をクリックします。

⑤「コンピュータを参照してドライバソフトウェアを検索します(上級)」をクリックします。

⑥ドライバ保存先の「¥Win2000」フォルダを指定し、「次へ」をクリックします。

TUT-0032

- 11 - Interface Corporation

⑦ファイルのコピーが始まります。 ※ 「ドライバソフトウェアの発行元を検証できません」と表示された場合、「このドライバ ソフトウェアをインストールします」をクリックします。

⑧インストールが完了した旨のダイアログボックスが表示されるので、「閉じる」ボタンをクリックします。

以上で、Windows Vista用のドライバインストールは完了です。

TUT-0032

Interface Corporation - 12 -

■Windows XP Embedded,Windows XP,Windows Server 2003をご使用の場合 Administratorsのグループに所属しているユーザが、インストールを行ってください。 ※ Windows XP Embeddedは、Windows XPと同様の手順で、ドライバのインストールができます。

(ただし、OSイメージにデバイスの検出に必要なコンポーネントが含まれている必要があります。)

①Windows XP Embedded,Windows XP,Windows Server 2003が起動すると、「新しいハードウェアの検出ウィザード」が表示されます。

②「一覧または特定の場所からインストールする(詳細)」が選択されていることを確認し、「次へ」をクリックします。

③「次の場所で最適のドライバを検索する」を選択し、「次の場所を含める」にチェックをつけ、

ドライバ保存先の「¥Win2000」フォルダを指定し、「次へ」をクリックします。

ドライバ保存先の「¥Win2000」フォルダを指定します。

④ファイルのコピーが始まります。

TUT-0032

- 13 - Interface Corporation

⑤インストールが完了した旨のダイアログボックスが表示されるので、「完了」ボタンをクリッ

クします。

以上で、Windows XP Embedded,Windows XP,Windows Server 2003用のデバイスドライバのインストールは完了です。デバイスドライバのインストール完了後以降は、システム起動時に上記②の

ように「新しいハードウェアの検索ウィザード」が起動することはありません。

• Windows XP Embedded 用ハードウェア情報ファイルのインポートをする場合 ・ドライバダウンロード方法 ①弊社Web siteよりGPC-4910のDriver Disk [Windows Vista,XPe,XP,2003,2000]をダウンロードします。

②ダウンロードしたプログラムを実行すると、「Win2000」フォルダが作成されます。

・ドライバインストール方法 ①Windows XP Embedded 開発環境の Component Database Manager を起動します。

②弊社製品のハードウェア情報ファイルをインポートします。作成した「Win2000」フォルダ内の拡張子がSLDのファイルを、画面の指示に従ってインポートしてください。

③以上で、ハードウェア情報のインポートは完了です。

TUT-0032

Interface Corporation - 14 -

■Windows 2000をご使用の場合

Administratorsのグループに所属しているユーザが、インストールを行ってください。 ①Windows 2000が起動すると、「新しいハードウェアの検出ウィザード」が表示されるので、「次へ」ボタンをクリックします。

②「デバイスドライバに最適なドライバを検索する(推奨)」を選択し、「次へ」ボタンをクリックします。

③「検索場所のオプション」で「場所を指定」を選択し、「次へ」ボタンをクリックします。

④「参照」ボタンをクリックし、「製造元のファイルのコピー元」にドライバ保存先の「¥Win2000」フォルダを指定します。その後、「OK」ボタンをクリックします。

TUT-0032

- 15 - Interface Corporation

⑤デバイスドライバが見つかった旨のダイアログボックスが表示されるので、「次へ」ボタンを

クリックします。 ⑥ファイルのコピーが始まります。 ⑦インストールが完了した旨のダイアログボックスが表示されるので、「完了」ボタンをクリッ

クします。

以上で、Windows 2000用のデバイスドライバのインストールは完了です。 デバイスドライバのインストール完了後以降は、システム起動時に上記②のように「新しいハー

ドウェアの検索ウィザード」が起動することはありません。 インストールを完了したら、リソース(I/Oアドレス,割り込みレベル)の設定,競合の有無の確認を行ってください。 ドライバのインストールが正常に行われると、システムプロパティのデバイスマネージャに表示

されます。

ここに I/O モジュールが追加

されます。

TUT-0032

Interface Corporation - 16 -

2.2 サンプルプログラム,Help,ヘッダファイル,インポートライブラリ,最新情報ドキュメントファイル

のインストール

1. 弊社Web siteよりGPC-4910のUtility Diskをダウンロードします。 2. ダウンロードしたプログラムを実行すると、「SETUP」フォルダが作成されます。 3.「SETUP」フォルダ内のSETUP.EXEを実行して下さい。プログラムが起動しインストールが開始されます。

インストールが完了すると、「スタート」メニューの「プログラム」に、「Interface GPC-4910」が追加されます。

TUT-0032

- 17 - Interface Corporation

第3章 Visual C++によるメモリンク制御

Visual C++より、メモリンクを制御するには、DLLを利用します。Visual C++では直接I/Oやメモリにアクセスすることができません。従って、メモリンクに対して直接的に信号を送ることができ

ません。そこで、メモリンクに対して直接的に信号を送るプログラム(DLL)から必要な手続き(関数)を呼び出し、このDLLを介してI/Oモジュールの制御を行います。

I/Oモジュール

仮想デバイスドライバ (CP4910.SYS)

Win32 API

ダイナミックリンクライブラリ

(FBIML.DLL)

VMM

Visual C++アプリケーション

入力

出力

TUT-0032

Interface Corporation - 18 -

3.1 DLLプロシージャ呼び出しによるプログラミング(概要)

Visual C++よりDLLプロシージャ呼び出しプログラミングを行うには、弊社、メモリンク制御用ソフト(FBIML.DLL)をダイナミックリンクし使用します。DLLとはダイナミックリンクライブラリ(Dynamic Link Library)の略でアプリケーションの実行時に動的にリンクして利用できるプロシージャのライブラリです。プロシージャとは実行時に1つの単位として処理されるコードの集まりを意味します。 Visual C++にてDLLプロシージャを利用するには、FBIML.LIBファイルをリンクしてDLLプロシージャのアドレスを指定します。(リンクの方法は後で記載しています)

3.2 メモリンク制御概略

メモリンク製品の制御を行う場合、基本的に下記の制御シーケンス(順番)で行います。

初期化

各種処理

終了処理

2

1

3

プログラム起動

メモリのリード/ライト

プログラム終了

(1) デバイスの初期化 Visual C++で作成されたアプリケーションがメモリンクへの操作を行う場合、まずアプリケーションは、メモリンク製品を利用可能な状態にする必要があります。 この処理がデバイスの初期化です。デバイスの初期化を行うと、プログラムはメモリンクへの

アクセスが可能となります。本処理が行われないとメモリンクへのアクセスは行えません。

(2) 各種処理 マスタおよびスレーブにおいてメモリのリード/ライトを行います。

(3) 終了 デバイスの使用終了を行うための手続きです。プログラム終了時にはかならず必要です。

TUT-0032

- 19 - Interface Corporation

第4章 チュートリアル

ここでは、実際に弊社メモリンク製品を用いて、メモリンク通信を行います。本チュートリアル

を行うにあたっては、ご使用になる製品により以下の準備を行ってください。

3m版メモリンクをご使用の場合 3m版メモリンクにてチュートリアルを行う場合、以下の製品が必要になります。

PCI-4913 1枚:マスタ PCI-4914 1枚:終端スレーブ ECO-13xx 1本:60ピンメモリンクケーブル

それぞれのコンピュータにメモリンク製品(PCI-4913,4914)を実装し、ケーブル(ECO-13xx)を用いてマスタとスレーブを接続してください。 この時、スレーブではスレーブ番号を「0」に、バス接続スイッチを「ON」にしてください。

マスタ終端

スレーブ

PCI-4913 PCI-4914

「0」に設定します。

「ON」に 設定します。

スレーブの設定

TUT-0032

Interface Corporation - 20 -

30m版メモリンクをご使用の場合 30m版メモリンクにてチュートリアルを行う場合、以下の製品が必要になります。

PCI-4911 1枚:マスタ PCI-4915 1枚:終端スレーブ ECO-14xx 1本:100ピンメモリンクケーブル

それぞれのコンピュータにメモリンク製品(PCI-4911,4915)を実装し、ケーブル(ECO-14xx)を用いてマスタとスレーブを接続してください。 この時、スレーブでは製品に添付される「スレーブ番号設定ユーティリティ」を用いてスレーブ

番号を「0」に設定してください。

マスタ終端

スレーブ

PCI-4911 PCI-4915

スレーブ番号設定ユーティリティ

4.1 メモリの共有

メモリンク製品がスレーブ上に搭載されたメモリ(D.P. RAM)を共有するということは先に記載したとおりですが、ここでは、実際にアプリケーション側からみて、どのようにメモリの共有が行

われているかを確認してみます。

PC① PC②

メモリリード

ライト

リード

ライト

※ メモリの共有は、マスタ-スレーブ間においてのみ行われます。これは、増設スレーブを接続した場合も同様で、スレーブ-スレーブ間の共有は行えません。

TUT-0032

- 21 - Interface Corporation

Step1.プロジェクト作成

ここでは、これから作成するプログラムの画面作成を行います。 1. Visual C++を起動し新しいプロジェクトを作成します。 ・「ファイル」メニューより「新規作成」を選択すると、新規作成ダイアログボックスが表示

されます。「プロジェクト」タブを選択,表示します。 ・MFC AppWizard(exe)を選択し、プロジェクト名を記入します。ここでは“MemByteCommon”と記入し、以後それについての説明とします。 ・作業する場所を位置で指定してください。その後「OK」をクリックします。

MFC AppWizard (exe)を選択します

プロジェクト名を書き込みます

フォルダを指定します

2. ステップ1で「ダイアログベース」を選択し「次へ」をクリックします。 ・リソースで使用する言語の指定は「日本語」を選択します。

ダイアログベースを選択します

TUT-0032

Interface Corporation - 22 -

3. ステップ2,3は「次へ」をクリックし、ステップ4は「終了」をクリックします。 4. 新規プロジェクト情報というダイアログ表示されますので「OK」をクリックします。 ここまでで、新規プロジェクトの作成は完了です。

OKをクリック

Step2.DLLプロシージャ宣言

DLLプロシージャを利用するには、FBIML.LIBファイルを使ってプロシージャの位置を指定し、プロシージャの呼び出しに使う引数の識別を行わなければなりません。 DLLとはダイナミックリンクライブラリ(Dynamic Link Library)の略でアプリケーションの実行時に動的にリンクして利用できるプロシージャのライブラリです。 そもそも、Windowsアプリケーションプログラミングでは直接I/Oやメモリにアクセスすることが禁止されています。言い換えれば、メモリンクに対して直接的に信号を送ることができません。そこで、メモリンクに対して直

接的に信号を送るプログラム(DLL)から必要なプロシージャを呼び出し、このDLLを介してボートの制御を行います。 ここで一度宣言したDLLプロシージャは、Visual C++のプロシージャと同じようにコードで呼び出すことが可能となります。 では、DLLプロシージャを使用するための設定を行います。

TUT-0032

- 23 - Interface Corporation

1. プロジェクトにFBIML.LIB,FBIML.Hのパス設定を行います。

・表示するディレクトリを「インクルードファイル」にします。空白の部分をダブルクリックし

ます。(下図参照)

インクルードファイルにします

ダブルクリックしますクリックします

・ディレクトリの追加を行います。ディレクトリ先を<Program Files>¥Interface¥GPC4910

¥includeに設定して「OK」をクリックします。(下図参照)

includeを選択します

TUT-0032

Interface Corporation - 24 -

・下図のようにディレクトリに追加されます。

追加されたディレクトリ

次に、表示するディレクトリを「ライブラリファイル」にします。 ディレクトリの追加を行います。ディレクトリ先を<Program Files>¥Interface¥GPC4910¥libと設定して「OK」をクリックします。(下図参照)

libを選択します

・下図のようにディレクトリに追加されます。

ライブラリファイルにします

追加されたディレクトリ

TUT-0032

- 25 - Interface Corporation

2. プロジェクトにFBIML.LIBファイルをリンクします。 ・「プロジェクト」→「設定」を選択し、「リンク」タブを選択します。 ・設定の対象を「すべての構成」に設定し、「オブジェクト/ライブラリモジュール」に“FbiMl.lib”と書き込み「OK」をクリックします

FbiMl.libをリンクします

すべての構成にします

“FBIML.LIB” “FBIML.H”は、Setupでインストールされる<インストール先>¥lib、 <インストール先>¥includeにあります。 (インストール先:<Program Files>¥interface¥GPC4910)

Step3.初期化処理と終了処理

ここでは、実際のプログラム作成を行う前に、メモリンクの初期化処理と終了処理に関して、知

っておかなければならないこと、および制約事項について記載します。 メモリンクの制御を行うには、まずデバイスの初期化を行わなければなりません。デバイスの初

期化は以下のコード(List 1-1)により行います。 (List 1-1 デバイスの初期化) HANDLE hDeviceHandle; hDeviceHandle = MlOpen("FBIML1" , ML_FLAG_SHARE);

この時、FBIML1に設定する値は、使用するメモリンクのデバイス名を指定します。デバイス名は、「コントロールパネル」-「システム」を選択し「システムのプロパティ」の「デバイスマネー

ジャ」より確認できます。

TUT-0032

Interface Corporation - 26 -

ここに、デバイス名が表示されます

デバイスの初期化はMlOpen関数により行います。また、設定するパラメータにML_FLAG_SHAREとありますが、これは、同じデバイス名のI/Oモジュールを2つ以上のアプリケーションで共有するか否かを設定しています。本サンプルコードでは「共有する」となっています。

「使用例」 HANDLE hDeviceHandle;

hDeviceHandle = MlOpen(“FBIML1”, ML_FLAG_SHARE);

デバイスハンドルを格納する HANDLE 型の変数を指定します。

同じデバイスを重複(共有)してオープンすることを許可するフラグです。

使用するメモリンクのデバイス名を指定します。

また、アプリケーションの終了時、もしくは処理の終了時に、デバイスに対して必ず終了処理を

行わなければなりません。 デバイスの終了処理は以下のコード(List 1-2)により行います。

(List 1-2 デバイスの終了処理) ‘終了処理 nRet = MlClose(hDeviceHandle);

TUT-0032

- 27 - Interface Corporation

デバイスの終了処理はMlClose関数より行います。ここで、注意しなければならないのは、設定する引数のhDeviceHandleです。hDeviceHandle にはデバイス初期化の際に取得した、MlOpen関数の戻り値を指定します。MlOpen実行時、その戻り値であるhDeviceHandleには有効なハンドル(番号)が格納されています(List1-2参照)。ハンドルとは使用するデバイスの接続に関する情報が格納されたメモリ領域を、識別するための値を示します。 プログラム作成時、終了処理を行うデバイスのhDeviceHandleの値が、MlOpen実行時に取得された値となるように、MlOpenとMlCloseは必ず組になるよう注意してください。

MlOpen

MlClose

ハンドル

では、実際に初期化処理と終了処理のプログラムの作成を行います。 1. FileViewを表示し、SourceFileフォルダを展開してMemByteCommonDlg.cppの以下の位置(最初の部分)に#include “FbiMl.h”,HANDLE ghDviceHandleを追加します。(List 1-3)

(List 1-3 MemByteCommonDlg.cppのインクルードコード メモリ共有) // MemByteCommonDlg.cpp : インプリメンテーション ファイル // #include "stdafx.h" #include "MemByteCommon.h" #include "MemByteCommonDlg.h" #include "FbiMl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif HANDLE ghDeviceHandle;

「使用例」

nRet = MlClose(hDeviceHandle);

関数が失敗するとエラーコードが格納されます。

デバイスのオープン時に取得したデバイスハンドルを指定します。

ここに追加します

TUT-0032

Interface Corporation - 28 -

2. メニューバーの「表示」を選択し、「ClassWizard」を開きます。

ClassWizardをクリックします

3. 「MFC ClassWizard」ダイアログが表示されますので、以下のように設定し「関数の追加」を クリックします。

プロジェクト MemByteCommon クラス名 CMemByteCommonDlg オブジェクト CMemByteCommonDlg メッセージ WM_CREATE

関数の追加をクリックします

4. 同様にメッセージを「WM_DESTROY」に設定して「関数の追加」クリックします。

TUT-0032

- 29 - Interface Corporation

5. 下図のようにメンバ関数が追加されますので「OK」をクリックします。

追加されたメンバ関数 クリックします

6. ClassViewを表示しCMemByteCommonDlgクラスの中のOnCreate,OnDestroy関数にそれぞれList

1-4,List 1-5を記述してください。

(List 1-4 OnCreate関数のコード 初期化処理) int CMemByteCommonDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: この位置に固有の作成用コードを追加してください // デバイスの初期化 ghDeviceHandle = MlOpen("FBIML1" , ML_FLAG_SHARE); if(ghDeviceHandle == INVALID_HANDLE_VALUE){ AfxMessageBox("デバイスオープンに失敗しました"); exit(1); // 終了 } return 0; }

(List 1-5 OnDestroy関数のコード 終了処理) void CMemByteCommonDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 // 終了処理 lRet = MlClose(ghDeviceHandle); if(lRet != ML_ERROR_SUCCESS){ AfxMessageBox("デバイスクローズに失敗しました"); } }

では、プログラムの説明を行います。 手順3,4で追加した関数は、WM_CREATEがウィンドウ作成時、WM_CREATEがウィンドウ破棄時に送られてくるメッセージです。つまり、プログラムを実行しウィンドウが作成(表示)されると同時に初期化処理(MlOpen)を行い、ウィンドウが閉じる(破棄)時に終了処理(MlClose)を行います。

TUT-0032

Interface Corporation - 30 -

Step4.ダイアログ作成

では、メモリ共有のプログラム作成を行います。マスタ側のコンピュータで入力するデータをス

レーブ側のコンピュータでモニタしてみましょう。まずはマスタ側のプログラムから作成します。 1. ResourceViewを表示し、Dialogフォルダを展開して「IDD_MEMBYTECOMMON_DIALOG」 をダブルクリックします。

ResourceViewを選択します

ダブルクリックします

2. ダイアログボックスの必要のないボタン,スタティックテキストを削除します。「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択し、Deleteキーを押してください。

それぞれ選択して Deleteキーで削除します

3. ダイアログ上に、2つボタンを配置して、それぞれ以下のように設定します。

(ボタン1) ID IDC_BYTE_WRITE キャプション メモリライト

(ボタン2) ID IDC_BYTE_READ キャプション メモリリード

ボタンを配置します

TUT-0032

- 31 - Interface Corporation

Step5.メモリ共有(マスタ側)

1. 作成した「メモリライト」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリック

します。 プロジェクト MemByteCommon クラス名 CMemByteCommonDlg オブジェクト IDC_BYTE_WRITE メッセージ BN_CLICKED

関数の追加をクリックします

メンバ関数名を決定するダイアログが表示されますので、“OnByteWrite”となっているこを確認し、「OK」をクリックします。

「OK」をクリックします

2. 同様に、オブジェトをIDC_BYTE_READに設定して「関数の追加」をクリックしてください。メンバ関数名が“OnByteRead”となっていることを確認し、「OK」をクリックします。

TUT-0032

Interface Corporation - 32 -

3. そのまま「コード編集」をクリックし、OnByteWrite関数とOnByteRead関数にそれぞれList1-6,List

1-7を記述してください。 (List 1-6 OnByteWrite関数のコード メモリ共有) void CMemByteCommonDlg::OnByteWrite() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 INT nWriteSlaveNo; // スレーブ番号 DWORD dwWriteOffset; // オフセットアドレス BYTE byWriteData; // ライトデータ nWriteSlaveNo = 0; // 書き込むスレーブ番号 byWriteData = 0xAA; // 書き込むデータ for(dwWriteOffset = 0x0000 ; dwWriteOffset < 0x007 ; dwWriteOffset++){ lRet= MlWriteByte(ghDeviceHandle, nWriteSlaveNo, dwWriteOffset, byWriteData); if(lRet != ML_ERROR_SUCCESS){ AfxMessageBox("メモリライトに失敗"); } } }

(List 1-7 OnByteRead関数のコード メモリ共有) void CMemByteCommonDlg::OnByteRead() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 INT nReadSlaveNo; // スレーブ番号 DWORD dwReadOffset; // オフセットアドレス BYTE byReadData; // リードデータ char szFirstData[3]; // リードデータ一次格納 char szSecondData[50] ; // リードデータ二次格納 nReadSlaveNo = 0; // 読み込むスレーブ番号 strcpy(szSecondData,""); // 配列の初期化 for(dwReadOffset = 0x0000 ; dwReadOffset < 0x0007 ; dwReadOffset++){ lRet = MlReadByte(ghDeviceHandle, nReadSlaveNo, dwReadOffset, &byReadData); if(lRet != ML_ERROR_SUCCESS){ AfxMessageBox("メモリリードに失敗"); } sprintf(szFirstData, "%X ", byReadData); strcat(szSecondData, szFirstData); } MessageBox(szSecondData); // リードデータ表示 }

以上で、マスタ側のメモリ共有プログラム作成は完了です。

TUT-0032

- 33 - Interface Corporation

Step6.メモリ共有(スレーブ側)

次にスレーブ側のプログラムですが、先に作成したマスタ側のプログラムと同様のものを使用し

ます。そのまま使用するとわかりにくいので、マスタ側のプログラムをスレーブ側にコピーし、

以下の修正を行ってください。

「修正個所」 - List 1-6 - (網掛け部分の修正) byWriteData = 0xAA; → byWriteData = 0x55;

修正が完了したら、プログラムを保存してください。

以上で、マスタ側,スレーブ側のプログラムが整いました。では、それぞれのプログラムを実行してみてください。ダイアログ自体は同じものが表示されます。

マスタ側プログラム スレーブ側プログラム

では、まずマスタ側のプログラムで、「メモリライト」ボタンをクリックしてください。次に「メ

モリリード」ボタンをクリックしてください。画面上に以下のメッセージボックスが表示されま

す。

次に、スレーブ側の「メモリリード」ボタンをクリックしてください。先程と同様のメッセージ

ボックスが表示されます。 今度は、スレーブ側の「メモリライト」ボタンをクリックした後、マスタ側の「メモリリード」

ボタンをクリックしてください。 画面上に以下のメッセージボックスが表示されます。

TUT-0032

Interface Corporation - 34 -

以上のことから分かるように、マスタとスレーブでは、同じメモリ情報を共有することができま

す。マスタ側で登録したメモリ情報は、スレーブ側で取得することが可能で、また、その逆の動

作も可能です。 これは、マスタおよびスレーブ側のコンピュータが、特定領域のメモリを共有し、それぞれが同

一の領域に対してデータのライト/リードを行っているからです。 では、プログラムの内容を順に読み取ってみましょう。 まず、List 1-6ですが、ここではメモリの書き込みを行っています。共有するメモリに任意のデータをバイト単位で書き込みます。 バイト単位でのデータ書込みにはMlWriteByte関数を使用します。

「使用例」

nRet = MlWriteByte(ghDeviceHandle, nWriteSlave, dwWriteOffset, byWriteData);

デバイスのオープン時に取得したデバイスハンドルを指定します。

スレーブ番号を指定します。※

関数が失敗するとエラーコードが格納されます。

書き込むデータを格納したバイト型の変数を指定します。

データの書込み開始位置を指定します。

※ 制御対象がスレーブの場合は「0」を指定します。

第3引数のdwWriteOffsetですが、共有するメモリのオフセット位置を指定します。実際のメモリンクが使用するメモリの範囲とは異なります。実際にI/Oモジュールが使用しているメモリの範囲は「コントロールパネル」-「システム」のデバイスマネージャより目的の型式を選択し「プロパ

ティ」をクリックします。そうすると下図のようなダイアログが表示されます。(下図はPCI-4914のプロパティを表示しています) システムによって割り付けられるメモリの範囲は使用する環境によりそれぞれ異なります。

左図の場合、メモリンクが使用しているメモリの範囲は0B120000~0B123FFFhですが、List1-6ではオフセット位置が0~6に対し、「AA」を入力しています。 この時、実際のメモリ上では0B120000~0B120006に「AA」が格納されています。

TUT-0032

- 35 - Interface Corporation

次に、List 1-7ですが、ここではメモリの読み込みを行っています。共有するメモリ上の格納されたデータをバイト単位で読み込みます。 バイト単位でのデータ読み込みにはMlReadByte関数を使用します。 ※ 制御対象がスレーブの場合は「0」を指定します。 スレーブ番号,オフセットアドレスはMlWriteByte関数の設定と同じにします。 ここまでが、メモリ共有の簡単なサンプルです。メモリ共有の実際の動作を理解頂けたと思いま

す。

「使用例」

nRet = MlReadByte(ghDeviceHandle, nReadSlave, deReadOffset, &byReadData);

デバイスのオープン時に取得したデバイスハンドルを指定します。

スレーブ番号を指定します。※

関数が失敗するとエラーコードが格納されます。

読み込んだデータを格納するバイト型の変数を指定します

データの読み込み開始位置を指定します。

4.2 ブロック操作

『20ページ 4.1 メモリの共有』ではバイト単位でのメモリリード/ライトを解説しました。これとは別にワード単位(16ビット)単位でのメモリリード/ライトも行えますが、多量のデータを処理するには不利な面があります。 FBIML.DLLでは一度に多くのデータを処理するためにブロック単位(最大256KB)でのメモリリード/ライトを行うことができます。 ここでは、その方法について記載します。基本的なプログラム作成手順は『20ページ 4.1 メモリの共有』と同じです。(『20ページ 4.1 メモリの共有』を参照してください)

TUT-0032

Interface Corporation - 36 -

Step1.プロジェクト作成

ここでは、これから作成するプログラムの画面作成を行います。ブロック操作プログラムはマス

タ,スレーブ共に同じプログラムを使用します。 1. Visual C++を起動し新しいプロジェクト(プロジェクト名:MemBlock)を作成します(『20ページ

4.1 メモリの共有』でのStep1を参照してください)。 2. プロジェクトにFBIML.LIBファイル,FBIML.Hファイルのパス設定を行い、ライブラリファイル”FbiMl.lib”をリンクさせます(『20ページ 4.1 メモリの共有』でのStep2を参照してください)。

3. 初期化処理と終了処理を行う関数を追加します。 ・”FbiMl.h”ファイルのインクルード,デバイスハンドルの変数宣言を行います(『20ページ 4.1 メモリの共有』でのStep3を参照してください)。 ・「MFC ClassWizard」で以下のように設定し、メッセージ「WM_CREATE」, 「WM_DESTROY」に対して初期化処理のコード,終了処理のコードをそれぞれ実装します

(『20ページ 4.1 メモリの共有』でのStep3を参照してください)。 プロジェクト MemBlock クラス名 CMemBlockDlg オブジェクト CmemBlockDlg

4. ResourceViewを表示し、Dialogフォルダを展開して「IDD_MEMBLOCK_DIALOG」をダブルクリックします。

ResourceViewを選択します

ダブルクリックします

5. ダイアログボックスの必要のないボタン,スタティックテキストを削除します。「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択し、Deleteキーを押してください。

それぞれ選択して Deleteキーで削除します

TUT-0032

- 37 - Interface Corporation

6. ダイアログ上に、ボタン2つとエディットボックス2つを配置して、それぞれ以下のように設定します。

(ボタン1) ID IDC_BLOCK_WRITE キャプション メモリライト(ブロック)

(ボタン2) ID IDC_BLOCK_READ キャプション メモリリード(ブロック)

(エディットボックス1) ID IDC_BLOCK_DATA

(エディットボックス2) ID IDC_BLOCK_SIZE

ボタンを配置します

エディットボックス2

を配置します

エディットボックス1を配置します

7. メンバ変数の設定を行います。エディトボックスを右クリックし、「ClassWizard」を選択して「メンバ変数」タブを表示します。 以下のように設定し、「変数の追加」をクリックします。

プロジェクト MemBlock クラス名 CMemBlockDlg コントロール IDC_BLOCK_DATA

8. さらに以下のように設定し、「OK」をクリックします。 メンバ変数 m_szBlockData カテゴリ 値 変数のタイプ Cstring

TUT-0032

Interface Corporation - 38 -

9. 図のようにメンバ変数が追加されます。ここで最大文字数を“256”と設定し「OK」をクリックします。この“256”という数字は、目安として最大256文字と設定しています。必ずしも“256”にする必要はありません。

追加したメンバ変数

“256”に設定

10. 同様に以下の設定でメンバ変数“m_nBlockSize”の設定を行います。

プロジェクト MemBlock クラス名 CMemBlockDlg コントロール IDC_BLOCK_DATA メンバ変数 m_dwBlockSize カテゴリ 値 変数のタイプ DWORD 最小値 0 最大値 255

TUT-0032

- 39 - Interface Corporation

Step2.ブロック操作

1. 先程作成した「メモリライト(ブロック)」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト MemBlock クラス名 CMemBlockDlg オブジェクト IDC_BLOCK_WRITE メッセージ BN_CLICKED

関数の追加をクリックします

2. メンバ関数名を決定するダイアログが表示されますので、“OnBlockWrite”となっているこを確認し、「OK」をクリックします。

「OK」をクリックします

3. 同様に、オブジェトをIDC_BLOCK_READに設定して「関数の追加」をクリックしてください。メンバ関数名が“OnBlockRead”となっていることを確認し、「OK」をクリックします。

4. そのまま「コード編集」をクリックし、OnBlockWrite関数とOnBlockRead関数にそれぞれList 2-1、List 2-2を記述してください。

TUT-0032

Interface Corporation - 40 -

(List 2-1 OnBlockWrite関数のコード ブロック操作) void CMemBlockDlg::OnBlockWrite() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 INT nWriteSlaveNo; // スレーブ番号 DWORD dwWriteOffset; // (先頭)オフセットアドレス char szWriteData[256]; // ライトデータ格納 DWORD dwSize; // ライトデータ件数 nWriteSlaveNo = 0; dwWriteOffset = 0x0000; UpdateData(TRUE); dwSize = strlen(m_szBlockData); // ライトデータの長さを求める if(dwSize == 0){ AfxMessageBox("ライトデータがありません"); } else{ strcpy(szWriteData,m_szBlockData); // ライトデータをコピー lRet = MlWriteMemoryByte(ghDeviceHandle, nWriteSlaveNo, dwWriteOffset, &szWriteData, dwSize); if(lRet != ML_ERROR_SUCCESS){ AfxMessageBox("メモリライトに失敗しました"); } } }

(List 2-2 OnBlockRead関数のコード ブロック操作) void CMemBlockDlg::OnBlockRead() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 INT nReadSlaveNo; // スレーブ番号 DWORD dwReadOffset; // オフセットアドレス char szReadData[256]; // リードデータ格納 nReadSlaveNo = 0; dwReadOffset = 0x0000; UpdateData(TRUE); if(m_dwBlockSize > 0 && m_dwBlockSize < 256){ // リードを行う件数を入力 lRet = MlReadMemoryByte(ghDeviceHandle, nReadSlaveNo, dwReadOffset, &szReadData, m_dwBlockSize); if(lRet != ML_ERROR_SUCCESS){ AfxMessageBox("メモリリードに失敗しました"); } else{ szReadData[m_dwBlockSize] = '¥0'; // リードデータの最後に”¥0”を加える MessageBox(szReadData); // リードデータ表示 } } }

以上で、ブロック操作プログラム作成は完了です。

TUT-0032

- 41 - Interface Corporation

では、それぞれのプログラムを実行してみてください。下図のようにダイアログが表示されます。

ダイアログ自体は同じものが表示されます。

マスタ側プログラム スレーブ側プログラム

では、まずマスタ側のプログラムで、エディットボックスに“ABCDFFG”と入力し「メモリライト」ボタンをクリックしてください。次に“7”入力し「メモリリード」ボタンをクリックしてください。メモリ上のデータが以下のようにメッセージボックスに表示されます。

“ABCDEFG”と入力後、「メモリライト」をクリックします。

ライトしたデータが表示されます。

マスタ側プログラム マスタ側プログラム

“7”と入力後、「メモリリード」をクリックします。

次に、スレーブ側で“7”と入力し「メモリリード」ボタンをクリックしてください。先程と同様にメモリ上のデータが表示されます。

TUT-0032

Interface Corporation - 42 -

今度は、スレーブ側のプログラムで、エディットボックスに“abcdefg”と入力し「メモリライト」ボタンをクリックした後、マスタ側で“7”と入力し「メモリリード」ボタンをクリックしてください。メモリ上のデータがテキストボックスに以下のように表示されます。

“abcdefg”と入力後、「メモリライト」をクリックします。

ライトしたデータ

が表示されます。

スレーブ側プログラム マスタ側プログラム

“7”と入力後、「メモリリー

ド」をクリックします。

『20ページ 4.1 メモリの共有』のメモリ共有では、for(dwReadOffset = 0x0000 ; dwReadOffset < 0x0007 ; dwReadOffset++)により1バイトずつ処理していたのに対し、ここでは、最大256バイトのデータを一度にリード/ライトしています。256バイトというのは、Step1の9,10で設定した値とプログラム中の配列szWriteData,szReadDataの配列長の値により設定しています。この部分を変更することで、最大256KBのデータをライト/リードできます。 Step1の10の値が“255”に設定してあるのは、読み込んだデータが配列szReadData[0]から格納されるため、“256”ではなく“255”に設定しています。 では、プログラムの内容を読み取ってみましょう。 まずは、List 2-1ですが、ここではメモリの書き込みを行っています。共有するメモリに任意のバイト型データを指定するブロック単位で書き込みます。 バイト型データをブロック単位で書込むにはMlWriteMemoryByte関数を使用します。

「使用例」

lRet = MlWriteMemoryByte(ghDeviceHandle, nWriteSlave, dwWriteOffset,

&szWriteData, dwSize);

デバイスのオープン時に取得したデバイスハンドルを指定します。

スレーブ番号を指定します。※

関数が失敗するとエラーコードが格納されます。

書き込むデータを格納したchar型の変数を指定します。

データの書込み開始位置を指定します。

件数を指定します。

※ 制御対象がスレーブの場合は「0」を指定します。

TUT-0032

- 43 - Interface Corporation

第5引数の「dwSize」ですが、1ブロックの処理件数を指定します。List2-1ではエディットボックスより入力されたライトデータをメンバ変数を介して配列変数szWriteDataに保存されます。szWriteDataだけでは、データの件数がわかりません。そこで、strlen関数を用いてライトデータが何バイトあるか求め、それを件数としてdwSizeに代入しています。 次に、List 2-2ですが、ここではメモリの読み込みを行っています。共有するメモリ上より格納されたデータを指定するブロック単位で読み込みます。 ブロック単位でのデータ読み込みにはMlReadMemoryByte関数を使用します。

「使用例」

lRet = MlReadMemoryByte(ghDeviceHandle, nReadSlave, dwReadOffset,

&szReadData, m_dwBlockSize);

デバイスのオープン時に取得したデバイスハンドルを指定します。

スレーブ番号を指定します。※

関数が失敗するとエラーコードが格納されます。

読み込んだデータを格納したchar型の変数を指定します。

データの書込み開始位置を指定します。

件数を指定します。

※ 制御対象がスレーブの場合は「0」を指定します。 スレーブ番号,オフセットアドレスは、MlWriteMemoryByte関数と同じ設定にします。 第5引数は、読み込むデータの件数を与えます。List2-2では、メンバ変数を用いて読み込む件数の値を与えています。“ABCDEFG”とメモリライトした場合、データは7件なので“7”と入力して「メモリリード」をクリックします。結果としてメモリライトしたデータ7件分がメモリリードされメッセージボックス表示されます。 読み込まれたデータは、配列変数szReadDataに格納され、文字列終端を意味する“¥0”を最後に付け足しています。 ここまでが、ブロック処理の簡単なサンプルです。

TUT-0032

Interface Corporation - 44 -

4.3 メモリ操作

FBIML.DLLでは、共有するメモリに対し複写(コピー),任意の値による埋め込み(フィル)を行う関数が用意されています。ここでは、これら関数を実際に使用し、その動作の確認を行ってみます。

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000 00010 00020

3FFD0 3FFE0 3FFF0

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000 00010 00020

3FFD0 3FFE0 3FFF0

メモリマップ メモリマップ

指定した任意の領域のデータを、別の

領域にコピーします。

コピー操作 フィル操作

指定した任意の領域を、任意の値で埋

め尽くします。

Step1.プロジェクト作成

ここでは、これから作成するプログラムの画面作成を行います。(詳しくは『20ページ 4.1 メモリの共有』でのStep1,Step2,Step3を参照してください。)

1. Visual C++を起動し新しいプロジェクト(プロジェクト名:MemCtrl)を作成します(『20ページ 4.1 メモリの共有』でのStep1を参照してください)。

2. プロジェクトにFBIML.LIBファイル,FBIML.Hファイルのパス設定を行い、ライブラリファイル”FbiMl.lib”をリンクさせます(『20ページ 4.1 メモリの共有』でのStep2を参照してください)。

3. 初期化処理と終了処理を行う関数を追加します. ・”FbiMl.h”ファイルのインクルード、デバイスハンドルの変数宣言を行います(『20ページ 4.1 メモリの共有』でのStep3を参照してください)。

・「MFC ClassWizard」で以下のように設定し、メッセージ「WM_CREATE」,「WM_DESTROY」に対して初期化処理のコード、終了処理のコードをそれぞれ実装します(『20ページ 4.1 メモリの共有』でのStep3を参照してください)。

プロジェクト MemCtrl クラス名 CMemCtrlDlg オブジェクト CmemCtrlDlg

TUT-0032

- 45 - Interface Corporation

4. ResourceViewを表示し、Dialogフォルダを展開して「IDD_MEMCTRL_DIALOG」をダブル クリックします。

ResourceViewを選択します

ダブルクリックします

5. ダイアログボックスの必要のないボタン,スタティックテキストを削除します。「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択し、Deleteキーを押してください。

それぞれ選択して Deleteキーで削除します

6. ダイアログ上に、メモリにデータの書き込みを行うボタンと、メモリのデータを読み込むボタンを配置します。それぞれ以下のように設定してください。

(ボタン1) ID IDC_MEM_WRITE キャプション メモリライト (ボタン2) ID IDC_MEM_READ キャプション メモリリード

ボタンを配置します

TUT-0032

Interface Corporation - 46 -

7. メモリに書き込みを行うメンバ関数を追加します。 ・先程作成した「メモリライト」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」を

クリックします。 プロジェクト MemCtrl クラス名 CMemCtrlDlg オブジェクト IDC_MEM_WRITE メッセージ BN_CLICKED

関数の追加をクリックします

メンバ関数名を決定するダイアログが表示されますので、”OnMemWrite”となっていること を確認し、「OK」をクリックします。

そのまま「コード編集」をクリックし、メンバ関数”OnMemWrite”を実装します。以下のコードを記述してください。

(List 3-1 CMemCtrlDlgクラスのOnMemWriteのコード メモリ操作) void CMemCtrlDlg::OnMemWrite() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の戻り値 INT nWriteSlaveNo; // スレーブ番号 DWORD dwWriteOffset; // オフセット BYTE byWriteData; // 書き込みデータ // スレーブ番号を設定します nWriteSlaveNo = 0; // 書き込みデータを設定します byWriteData = 0x00; // メモリライトします for(dwWriteOffset = 0; dwWriteOffset < 15; dwWriteOffset++){ nRet = MlWriteByte(ghDeviceHandle, nWriteSlaveNo, dwWriteOffset, byWriteData); if(nRet != 0){ AfxMessageBox("メモリライトできませんでした"); return; } byWriteData++; } }

TUT-0032

- 47 - Interface Corporation

8. メモリの読み込みを行うメンバ関数の追加を行います。”OnMemWrite”と同様に「ClassWizard」で以下のように設定し、さらに以下のコードを追加します。

プロジェクト MemCtrl クラス名 CMemCtrlDlg オブジェクト IDC_MEM_READ メッセージ BN_CLICKED

(List 3-2 CMemCtrlDlgクラスのOnMemReadのコード メモリ操作) void CMemCtrlDlg::OnMemRead() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の戻り値 INT nReadSlaveNo; // スレーブ番号 DWORD dwReadOffset; // オフセット BYTE byReadData; // 読み込みデータ char szTmpData[5]; // 読み込みデータ一時格納用 char szDumpData[50]=""; // ダンプデータ // スレーブ番号を設定します nReadSlaveNo = 0; // メモリライトします for(dwReadOffset = 0; dwReadOffset < 16; dwReadOffset++){ nRet = MlReadByte(ghDeviceHandle, nReadSlaveNo, dwReadOffset, &byReadData); if(nRet != 0){ AfxMessageBox("メモリリードできませんでした"); return; } sprintf(szTmpData, "%02X ", byReadData); strcat(szDumpData, szTmpData); } // データをダンプします MessageBox(szDumpData); }

Step2.コピー操作

では、コピー操作を行うプログラムを作成します。 1. ダイアログ上に、コピー操作を行うボタンを配置します。以下のように設定してください。

ID IDC_COPY キャプション コピー

ボタンを配置します

TUT-0032

Interface Corporation - 48 -

2. コピー操作を行うメンバ関数の追加を行います。先程作成した「コピー」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト MemCtrl クラス名 CMemCtrlDlg オブジェクト IDC_COPY メッセージ BN_CLICKED

メンバ関数名を決定するダイアログが表示されますので、“OnCopy”となっていることを確認し、「OK」をクリックします。 3. そのまま「コード編集」をクリックし、メンバ関数“OnCopy”を実装します。以下のコードを記述してください。

(List 3-3 CMemCtrlDlgクラスのOnCopyのコード メモリ操作) void CMemCtrlDlg::OnCopy() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の戻り値 INT nCopySlaveNo; // スレーブ番号 DWORD dwSrcOffset; // コピー元オフセット DWORD dwDstOffset; // コピー先オフセット // スレーブ番号を設定します nCopySlaveNo = 0; // オフセットを指定します dwSrcOffset = 8; dwDstOffset = 0; // メモリコピーします nRet = MlCopyMemoryByte(ghDeviceHandle, nCopySlaveNo, dwSrcOffset, dwDstOffset, 8); if(nRet != 0){ AfxMessageBox("メモリコピーできませんでした"); return; } }

プログラムの入力が終わったら保存した後、実行てください。 まず、「メモリライト」ボタンをクリックし、次に「メモリリード」ボタンをクリックしてくだ

さい。画面上に以下のメッセージボックスが表示されます。

これにより、オフセット位置が「0」~「15」までのメモリ中のデータを確認できます。 では、「OK」ボタンをクリック後、「コピー」ボタンをクリックし、再度「メモリリード」ボタンをクリックしてください。

TUT-0032

- 49 - Interface Corporation

今度は、以下のようにメッセージボックスが表示されます。

これは、オフセット位置「8」~「15」の内容が、オフセット位置「0」~「7」にコピーされたことを意味します。

(コピー前)

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 (コピー後)

08 09 10 11 12 13 14 15 08 09 10 11 12 13 14 15

指定領域のデータを別の領域にコピーするにはMlCopyMemoryByte関数を使用します。

「使用例」

nRet = MlCopyMemoryByte(ghDeviceHandle,nCopySlaveNo,

dwSrcOffset, dwDstOffset, 8);

デバイスのオープ

ン時に取得したデバイスハンドルを指定します。

スレーブ番号を指定します。※

関数が失敗するとエラーコードが格納されます。

コピー元のオフセット位置を指定します。

コピー先のオフセット位置を指定します。

コピーする件数を指定します。

※ 制御対象がスレーブの場合は「0」を指定します。 ここまでが、コピー操作の簡単なサンプルです。

コピー

TUT-0032

Interface Corporation - 50 -

Step3.フィル操作

では、フィル操作を行うプログラムを作成します。 1. ダイアログ上に、フィル操作を行うボタンを配置します。以下のように設定してください。

ID IDC_FILL キャプション フィル

ボタンを配置します

2. フィル操作を行うメンバ関数の追加を行います。先程作成した「フィル」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリックします。

プロジェクト MemCtrl クラス名 CMemCtrlDlg オブジェクト IDC_FILL メッセージ BN_CLICKED

メンバ関数名を決定するダイアログが表示されますので、“OnFill”となっていることを確認し、「OK」をクリックします。

3. そのまま「コード編集」をクリックし、メンバ関数“OnFill”を実装します。以下のコードを記述してください。

(List 3-4:CMemCtrlDlgクラスのOnFillのコード) void CMemCtrlDlg::OnFill() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の戻り値 INT nFillSlaveNo; // スレーブ番号 DWORD dwFillOffset; // オフセット BYTE byFillData; // フィルデータ // スレーブ番号を設定します nFillSlaveNo = 0; // オフセットを指定します dwFillOffset = 0; byllData = 0x88; // メモリコピーします nRet = MlFillByte(ghDeviceHandle, nFillSlaveNo, dwFillOffset, byFillData, 16); if(nRet != 0){ AfxMessageBox("メモリフィルできませんでした"); eturn; } }

TUT-0032

- 51 - Interface Corporation

プログラムの入力が終わったら保存した後、実行てください。 先程と同様に、「メモリライト」ボタンをクリックし、次に「メモリリード」ボタンをクリック

してください。画面上に以下のメッセージボックスが表示されます。

次に、「OK」ボタンをクリック後、「フィル」ボタンをクリックし、再度「メモリリード」ボタンをクリックしてください。 今度は、以下のようにメッセージボックスが表示されます。

これは、オフセット位置「0」~「15」の内容が、フィル操作により「88h」に書き換えられたことを意味します。 指定領域を任意のデータで埋め尽くすにはMlFillByte関数を使用します。

「使用例」

nRet = MlFillByte(ghDeviceHandle, nFillSlaveNo, dwFillOffset, byFillData, 16);

デバイスのオープ

ン時に取得したデバイスハンドルを指定します。

スレーブ番号を指定します。※

関数が失敗するとエラーコードが格納されます。

フィル開始位置ののオフセット位置を指定します。

処理件数を指定します。

フィル操作を行う任意の値を指定します。

※ 制御対象がスレーブの場合は「0」を指定します。 ここまでが、フィル操作の簡単なサンプルです。

TUT-0032

Interface Corporation - 52 -

4.4 割り込み処理

FBIML.DLLでは、マスタからスレーブ、またはスレーブからマスタに対し、割り込み信号を発生させることができます。例えばマスタ側でプログラムが実行中、この割り込み信号をスレーブ側

から送信することにより、マスタ側のそれまで実行されていた処理を一時的に中断させ、別の処

理を実行させるといったことが行えます。 ここでは、割り込み信号の発生方法および割り込み信号の取得方法について記載します。

Step1.プロジェクト作成

ここでは、これから作成するプログラムの画面作成を行います。(詳しくは『20ページ 4.1 メモリの共有』でのStep1,Step2,Step3を参照してください。) 1. Visual C++を起動し新しいプロジェクト(プロジェクト名:MemEvent)を作成します(『20ページ

4.1 メモリの共有』でのStep1を参照してください)。 2. プロジェクトにFBIML.LIBファイル,FBIML.Hファイルのパス設定を行い、ライブラリファイル

“FbiMl.lib”をリンクさせます(「メモリ共有」でのStep2を参照してください)。 3.初期化処理と終了処理を行う関数を追加します。 ・“FbiMl.h”ファイルのインクルード、デバイスハンドルの変数宣言を行います(『20ページ 4.1 メモリの共有』でのStep3を参照してください)。

・「MFC ClassWizard」で以下のように設定し、メッセージ「WM_CREATE」,「WM_DESTROY」に対して初期化処理のコード、終了処理のコードをそれぞれ実装します(『20ページ 4.1 メモリの共有』でのStep3を参照してください)。

プロジェクト MemEvent クラス名 CMemEventDlg オブジェクト CMemEventDlg

4. ResourceViewを表示し、Dialogフォルダを展開して、「IDD_MEMEVENT_DIALOG」をダブルクリックします。

ResourceViewを選択します

ダブルクリックします

TUT-0032

- 53 - Interface Corporation

5. ダイアログボックスの必要のないボタン,スタティックテキストを削除します。「OK」ボタン,「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティックテキストをそれぞれ選択し、Deleteキーを押してください。

それぞれ選択して Deleteキーで削除します

6. ダイアログ上に、割り込みを発生させるボタンと、割り込みの設定を行うボタンを配置します。それぞれ以下のように設定してください。

(ボタン1) ID IDC_MEM_EVENT キャプション 割り込み発生 (ボタン2) ID IDC_MEM_WAIT キャプション 割り込み待機

ボタンを配置します

Step2.コールバック処理(コールバックイベント)

ここでは、割り込みイベントが発生した時に呼び出される処理,割り込みマスクの設定,割り込みイベントの登録,イベントの削除を行う処理の作成を行います。 1. 先程作成した「割り込み待機」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」をクリ

ックします。 プロジェクト MemEvent クラス名 CMemEventDlg オブジェクト IDC_MEM_WAIT メッセージ BN_CLICKED

メンバ関数名を決定するダイアログが表示されますので、“OnMemWait”となっていることを確認し、「OK」をクリックします。

TUT-0032

Interface Corporation - 54 -

2. そのまま「コード編集」をクリックし、メンバ関数“OnMemWait”を実装します。さらに、メンバ関数“OnMemWait”の上の部分に、割り込みイベントが発生した時に呼び出される関数についても記述します。以下のコードを記述してください。

(List 4-1 CMemEventDlgクラスのOnMemWait、およびコールバック関数lpEventProcのコード 割り込み処理) void CALLBACK lpEventProc(DWORD dwEvent, DWORD dwUser) { AfxMessageBox("割り込みを検知しました"); } void CMemEventDlg::OnMemWait() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の戻り値 lRet = MlSetEventMask(ghDeviceHandle,1); if(lRet != 0){ AfxMessageBox("イベントマスクに失敗しました"); } lRet = MlSetEventEx(ghDeviceHandle, NULL, NULL, WM_NULL, lpEventProc, 0); if(lRet != 0){ AfxMessageBox("イベントの登録に失敗しました"); } }

3. イベントの削除を行う処理を加えます。ClassViewを表示し、CMemEventDlgを展開して

OnDestroy()をダブルクリックします。OnDestroy関数にコードを追加して、以下のように記述してください。

(List 4-2 CMemEventDlgクラスのOnDestroyのコード 割り込み処理) void CMemEventDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果 // コールバックイベントを解除します lRet = MlKillEvent(ghDeviceHandle); if(lRet != 0){ AfxMessageBox("イベントの削除に失敗しました"); } // 終了処理 lRet = MlClose(ghDeviceHandle); if(lRet != ML_ERROR_SUCCESS){ AfxMessageBox("デバイスクローズに失敗しました"); } }

TUT-0032

- 55 - Interface Corporation

Step3.割り込み発生

ここでは、割り込み信号を発生させる処理を作成します。

1. 先程作成した「割り込み発生」ボタンにカーソルを合わせ、右クリックし「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関数の追加」を クリックします。

プロジェクト MemEvent クラス名 CMemEventDlg オブジェクト IDC_MEM_EVENT メッセージ BN_CLICKED

メンバ関数名を決定するダイアログが表示されますので、“OnMemEvent”となっていることを確認し、「OK」をクリックします。

2. そのまま「コード編集」をクリックし、メンバ関数“OnMemEvent”を実装します。 以下のコードを記述してください。

(List 4-3 CMemEventDlgクラスのOnMemEventのコード 割り込み処理) void CMemEventDlg::OnMemEvent() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の戻り値 INT nTargetSlave; // スレーブ番号 nTargetSlave = 0; lRet = MlGenerateIrq(ghDeviceHandle, nTargetSlave); if(lRet != 0){ AfxMessageBox("割り込み信号の発生に失敗しました"); } }

プログラムの入力が終わったら保存してください。 では、作成したプログラムを、マスタ側/スレーブ側でそれぞれ実行してください。

マスタ側プログラム スレーブ側プログラム

TUT-0032

Interface Corporation - 56 -

では、マスタ側/スレーブ側の「割り込み待機」ボタンをそれぞれクリックしてください。 次に、スレーブ側の「割り込み発生」ボタンをクリックしてください。マスタ側の画面上に「割

り込みを検知しました」とメッセージボックスが確認できます。 今度は、マスタ側の「割り込み発生」ボタンをクリックしてください。スレーブ側の画面上に「割

り込みを検知しました」とメッセージボックスが確認できます。

マスタ側 スレーブ側

では、プログラムの内容を順に読み取ってみましょう。 まずはList 4-1ですが、ここでは割り込み信号を取得した際に実行するプロシージャの定義を行っています。この定義によりメモリンクへの割り込みを、割り込みイベントとして捉えることが可

能です。 割り込みイベントの定義には、MlSetEventMask関数,MlSetEventEx関数を使用します。 MlSetEventEx関数は、メッセージやイベントを使用することができますが、本プログラムではコールバックのみを使用しています。 MlSetEventMask関数で割り込みイベントの有効/無効を定義し、MlSetEvent関数にて実際のイベントを定義しています。

「使用例」

lRet = MlSetEventMask(ghDeviceHandle, 1);

デバイスのオープン時

に取得したデバイスハンドルを指定します。

関数が失敗するとエラーコードが格納されます。

割り込みイベントの有効/無効を指定します。 1=有効 0=無効

「使用例」

lRet = MlSetEventEx(ghDeviceHandle, NULL, NULL, WM_NULL, lpEventProc, 0);

デバイスのオープン時に取得したデバイスハンドルを指定します。

関数が失敗するとエラーコードが格納されます。

コールバック関数に渡す、任意の値をDWORD 値で指定します。

イベントが有効になった時にポストするメッセージコードを指定します。

イベントが有効になった時にポストメッセージするウィンドウのハンドルを指定します。

イベントが有効になった時にシグナル状態とするイベントハンドルを指定します。

コールバック関数のアドレスを指定します。

TUT-0032

- 57 - Interface Corporation

次に、List 4-3ですが、ここでは接続されたマスタまたはスレーブに対して割り込み信号を送信しています。割込み信号の送信にはMlGenerateIrq関数を使用します。

「使用例」

lRet = MlGenerateIrq(ghDeviceHandle, nTargetSlave);

デバイスのオープン時に取得したデバイスハンドルを指定します。

関数が失敗するとエラーコードが格納されます。

割り込みイベントを発生させるスレーブ番号を指定します。※

※ 制御対象がスレーブの場合は「0」を指定します。

最後に、List 4-2ですが、プログラムは終了時(ダイアログを閉じる時)に、登録したイベントを削除しています。登録したイベントの削除にはMlKillEvent関数を使用します。

「使用例」

lRet = MlKillEvent(ghDeviceHandle);

デバイスのオープン時に取得したデバイスハンドルを指定します。

関数が失敗するとエラーコードが格納されます。

ここまでが、割り込み処理のプログラム例です。

TUT-0032

Interface Corporation - 58 -

第5章 FbiMl.DLLリファレンス MlOpen

指定されたデバイス名のデバイスのオープンを行い、以後のデバイスへのアクセスを行えるようにします。 宣言 HANDLE MlOpen(LPCTSTR lpszName, DWORD fdwFlags); パラメータ

lpszName 任意のデバイス名を指定します。 fdwFlags オープン時のフラグを指定します。

識別子 意味

ML_FLAG_NORMAL 通常のオープン時に使用するフラグです。これを指定すると重複してオープンすることはできません。

ML_FLAG_SHARE 同じデバイスを重複(共有)してオープンすることを許可するフラグです。

戻り値 関数が成功すると有効なデバイスハンドルが返されます。 関数が失敗するとINVALID_HANDLE_VALUEが返されます。INVALID_HANDLE_VALUEの値は、FFFFFFFFh(-1)です。 解説 ML_FLAG_SHAREを指定することにより、同じデバイスを2つ以上のアプリケーションで共有することが可能となります。ML_FLAG_SHAREを指定せずにオープンされているデバイスに対して、ML_FLAG_SHAREを指定したオープンを実行した場合、オープンは失敗します。 オープン(MlOpen関数)とクローズ(MlClose関数)の実行回数は必ず一致しなければなりません。

MlClose

デバイスのクローズを行い、デバイスアクセスのために使用されていた各種リソースの解放し、以後のデバイスへのアクセスを禁止します。 宣言 INT MlClose(HANDLE hDeviceHandle); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlGetInformatioin

メモリンク製品の型式とRSW番号を取得します。 宣言 INT MlGetInformatioin(HANDLE hDeviceHandle, PINT pnBoardType, PINT pnRswNo); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します pnBoardType バッファへのポインタを指定します。このバッファに取得した製品型式が格納されます。

pnRswNo バッファへのポインタを指定します。このバッファに取得したRSW番号が格納されます。 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

- 59 - Interface Corporation

MlReadByte

指定したスレーブのメモリから、1バイト(8ビット)のデータを読み込み、アプリケーションの領域に格納します。 宣言 INT MlReadByte(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, PBYTE pbValue); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定します。

スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は

0h~3FFFFh(256KB)です。 pbValue バッファへのポインタを指定します。このバッファに取得したバイトデータが格納されます。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlReadWord

指定したスレーブのメモリから、1ワード(16ビット)のデータを読み込み、アプリケーションの領域に格納します。 宣言 INT MlReadWord(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, PWORD pwValue); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定します。

スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は

0h~3FFFFh(256KB)です。 pwValue バッファへのポインタを指定します。このバッファに取得したワードデータが格納されます。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlWriteByte

指定したスレーブのメモリアドレスへ、アプリケーション領域から1バイト(8ビット)のデータを書き込みます。 宣言 INT MlWriteByte(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, BYTE bValue); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 SlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定します。

スレーブの場合には0を指定します。

dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は0h~3FFFFh(256KB)です。

bValue 書き込むデータ(バイト型)を指定します。 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

Interface Corporation - 60 -

MlWriteWord

指定したスレーブのメモリアドレスへ、アプリケーション領域から1ワード(16ビット)のデータを書き込みます。 宣言 INT MlWriteWord(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, WORD wValue); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定します。

スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は

0h~3FFFFh(256KB)です。 wValue 書き込むデータ(バイト型)を指定します。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlFillByte

指定したスレーブのメモリ領域を、指定のバイト(8ビット)データで埋め尽くします。 宣言 INT MlFillByte(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, BYTE bValue, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定します。

スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は

0h~3FFFFh(256KB)です。 bValue フィルデータをバイト型で指定します。 dwSize フィルするサイズをバイト単位で指定します。(最大256KB)

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlFillWord

指定したスレーブのメモリ領域を、指定のワード(16ビット)データで埋め尽くします。 宣言 INT MlFillWord(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, WORD wValue, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。

dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は0h~3FFFFh(256KB)です。

wValue フィルデータを指定します。

dwSize フィルするサイズをバイト単位で指定します。(最大256KB) �奇数サイズの単位を指定した場合には、偶数サイズに切り捨てられます。 例:11バイトの場合には、10バイトとして処理されます。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

- 61 - Interface Corporation

MlReadMemoryByte 指定したスレーブのメモリ領域から、バイト単位でユ-ザ領域にメモリブロックを読み込みます。 宣言 INT MlReadMemoryByte(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, PVOID pDestination, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲

は0h~3FFFFh(256KB)です。 pDestination バッファへのポインタを指定します。このバッファに取得したバイトデータが格納されます。

dwSize 読み込んだデータを格納するメモリブロックのサイズをバイト単位で指定します。(最大256KB)

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlReadMemoryWord

指定したスレーブのメモリ領域から、ワード単位でユ-ザ領域にメモリブロックを読み込みます。 宣言 INT MlReadMemoryWord(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, PVOID pDestination, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。

dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範囲は0h~3FFFFh(256KB)です。

pDestination バッファへのポインタを指定します。このバッファに取得したバイトデータが格納されます。dwSize 読み込んだデータを格納するメモリブロックのサイズをバイト単位で指定します。(最大

256KB) �奇数サイズの単位を指定した場合には、偶数サイズに切り捨てられます。 例:11バイトの場合には、10バイトとして処理されます。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlWriteMemoryByte

指定したスレーブのメモリ領域に、バイト単位でユ-ザ領域のデータを書き込みます。 宣言 INT MlWriteMemoryByte(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, PVOID pSource, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範

囲は0h~3FFFFh(256KB)です。 pSource バッファへのポインタを指定します。このバッファに書き込むデータを指定します。 dwSize 書き込みデータを格納するメモリブロックのサイズをバイト単位で指定してmます。(最大

256KB) 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

Interface Corporation - 62 -

MlWriteMemoryWord

指定したスレーブのメモリ領域に、ワード単位でユ-ザ領域のデータを書き込みます。 宣言 INT MlWriteMemoryWord(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwOffset, PVOID pSource, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 dwOffset 読み込みを行う物理メモリのオフセットアドレスをバイト単位で指定します。指定可能な範

囲は0h~3FFFFh(256KB)です。 pSource バッファへのポインタを指定します。このバッファに書き込むデータを指定します。 dwSize 書き込みデータを格納するメモリブロックのサイズをバイト単位で指定してmます。(最大

256KB) �奇数サイズの単位を指定した場合には、偶数サイズに切り捨てられます。 例:11バイトの場合には、10バイトとして処理されます。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。 解説 外部リセット信号が有効の間(pbResetInStatus = 1)は、出力、および割り込みマスク、要因等の設定をすることができません。外部リセット信号入力でリセットされた場合、PpiGetResetInStatusでリセット入力信号が無効になったことを確認してからデバイスの再設定を行ってください。

MlCopyMemoryByte

指定されたメモリンクのメモリ領域から、同じメモリンクの他のメモリ領域に、バイト単位でメモリをコピーします。 宣言 INT MlCopyMemoryByte(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwSourceOffset, DWORD dwDestinationOffset, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 dwSourceOffset メモリのコピー元のオフセットアドレスをバイト単位で指定してください。指定可能な範囲

は0h~3FFFFh(256KB)です。 dwDestinationOffset メモリのコピー先のオフセットアドレスをバイト単位で指定してください。指定可能な範囲

は0h~3FFFFh(256KB)です。 dwSize コピーするサイズをバイト単位で指定してます。(最大256KB)

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlCopyMemoryWord

指定されたメモリンクのメモリ領域から、同じメモリンクの他のメモリ領域に、ワード単位でメモリをコピーします。 宣言 INT MlCopyMemoryWord(HANDLE hDeviceHandle, INT nSlaveNo, DWORD dwSourceOffset, DWORD dwDestinationOffset, DWORD dwSize); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 dwSourceOffset メモリのコピー元のオフセットアドレスをバイト単位で指定してください。指定可能な範囲は

0h~3FFFFh(256KB)です。 dwDestinationOffset メモリのコピー先のオフセットアドレスをバイト単位で指定してください。指定可能な範囲は

0h~3FFFFh(256KB)です。 dwSize コピーするサイズをバイト単位で指定してます。(最大256KB)

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

- 63 - Interface Corporation

MlSetEventMask

イベントマスクを設定します。 宣言 INT MlSetEventMask(HANDLE hDeviceHandle, INT nEventMask); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nEventMask イベントのマスクデータを指定します。

0:割り込み無効 1:割り込み有効

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlGetEventMask

イベントマスク設定を取得します。 宣言 INT MlGetEventMask(HANDLE hDeviceHandle, PINT pnEventMask); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 pnEventMask バッファへのポインタを指定します。このバッファにイベントマスクの状態を示す値が格納さ

れます。 0:割り込み無効 1:割り込み有効

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlSetEvent

イベント発生時に起動するコールバック関数を登録します。 宣言 INT MlSetEvent(HANDLE hDeviceHandle, LPMLCALLBACK lpEventProc, DWORD dwUser); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 lpEventProc コールバック関数のアドレスを指定します。

dwUser コールバック関数に渡す任意の32ビットデータを指定します。 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。 コールバック関数の書式は以下の通りです。 宣言 void CALLBACK lpEventProc(DWORD dwEvent, DWORD dwUser);

TUT-0032

Interface Corporation - 64 -

パラメータ

発生した割り込みイベント要因が格納されます。 下記のビット構成で表されます。

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SL7 SL6 SL5 SL4 SL3 SL2 SL1 SL0

dwEvent

内容(1:検出, 0:未検出) Bit0 : SL0 スレーブ0からの割り込み検出 Bit1 : SL1 スレーブ1からの割り込み検出 Bit2 : SL2 スレーブ2からの割り込み検出 Bit3 : SL3 スレーブ3からの割り込み検出 Bit4 : SL4 スレーブ4からの割り込み検出 Bit5 : SL5 スレーブ5からの割り込み検出 Bit6 : SL6 スレーブ6からの割り込み検出 Bit7 : SL7 スレーブ7からの割り込み検出 �スレーブの場合、マスタからの割込みイベント要因は、常にビット0が立ちます。

dwUser ユーザデータを指定します。

コールバックルーチンの関数型 LPMLCALLBACK は下記のように定義されます。 typedef void (CALLBACK MLCALLBACK)(DWORD dwMlID, DWORD dwUser); typedef MLCALLBACK FAR *LPMLCALLBACK;

MlSetEventEx イベント発生時にシグナル状態とするイベント、ポストするメッセージ、および起動するコールバック関数を登録します。 宣言 INT MlSetEventEx(HANDLE hDeviceHandle, HANDLE hEvent, HWND hWnd,UINT uMsg, LPMLCALLBACK lpEventProc, DWORD dwUser); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 hEvent メモリンクからのイベントが有効になった時にシグナル状態とするイベントハンドルを指定し

ます。イベントハンドルはCreateEvent Win32APIにて指定します。 イベントを使用しない場合には、-1を指定してください。

hWnd メモリンクからのイベントが有効になった時にポストメッセージするウィンドウのハンドルを指定します。次のメッセージコードと併せて使用します。 ポストメッセージを使用しない場合には、-1を指定してください。

uMsg メモリンクからのイベントが有効になった時にポストするメッセージコードを指定します。 ポスとメッセージを使用しない場合には、WM_NULLを指定してください。

lpEventProc コールバック関数のアドレスを指定します。 dwUser コールバック関数に渡す任意の32ビットデータを指定します。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。 コールバック関数の書式は以下の通りです。 宣言 void CALLBACK lpEventProc(DWORD dwEvent, DWORD dwUser); パラメータ

発生した割り込みイベント要因が格納されます。 下記のビット構成で表されます。

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SL7 SL6 SL5 SL4 SL3 SL2 SL1 SL0

dwEvent

内容(1:検出, 0:未検出) Bit0 : SL0 スレーブ0からの割り込み検出 Bit1 : SL1 スレーブ1からの割り込み検出 Bit2 : SL2 スレーブ2からの割り込み検出 Bit3 : SL3 スレーブ3からの割り込み検出 Bit4 : SL4 スレーブ4からの割り込み検出 Bit5 : SL5 スレーブ5からの割り込み検出 Bit6 : SL6 スレーブ6からの割り込み検出 Bit7 : SL7 スレーブ7からの割り込み検出 �スレーブの場合、マスタからの割込みイベント要因は、常にビット0が立ちます。

dwUser ユーザデータを指定します。

コールバックルーチンの関数型 LPMLCALLBACK は下記のように定義されます。 typedef void (CALLBACK MLCALLBACK)(DWORD dwMlID, DWORD dwUser); typedef MLCALLBACK FAR *LPMLCALLBACK;

TUT-0032

- 65 - Interface Corporation

MlGetEventStat

メモリンクからのイベント発生時の要因を取得します。 MlSetEventEx関数にてイベントを登録し、イベントがシグナル状態となった時に本APIにてそのイベント要因を取得することができます。 宣言 INT MlGetEventStat(HANDLE hDeviceHandle, DWORD *dwEvent); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。

メモリンクからのイベントが有効になった時の要因を格納する変数へのポインタを指定します。 要因のフォーマットは次の通りです。

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SL7 SL6 SL5 SL4 SL3 SL2 SL1 SL0

dwEvent

内容(1:検出, 0:未検出) Bit0 : SL0 スレーブ0からの割り込み検出 Bit1 : SL1 スレーブ1からの割り込み検出 Bit2 : SL2 スレーブ2からの割り込み検出 Bit3 : SL3 スレーブ3からの割り込み検出 Bit4 : SL4 スレーブ4からの割り込み検出 Bit5 : SL5 スレーブ5からの割り込み検出 Bit6 : SL6 スレーブ6からの割り込み検出 Bit7 : SL7 スレーブ7からの割り込み検出 ※ スレーブの場合、マスタからの割込みイベント要因は、常にビット0が立ちます。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlKillEvent

登録されたコールバック関数を削除します。 宣言 INT MlKillEvent(HANDLE hDeviceHandle); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlGenerateIrq

スレーブに対して割り込みを発生させます。 宣言 INT MlGenerateIrq(HANDLE hDeviceHandle, INT nSlaveNo); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定します。

スレーブの場合には0を指定します。 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

Interface Corporation - 66 -

MlSetAcControl

リモート電源コントロールの制御を行います。 宣言 INT MlSetAcControl(HANDLE hDeviceHandle, INT nSlaveNo, INT nAcControl); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 nAcControl バッファへのポインタを指定します。このバッファにACコントロールの設定を以下のビット

構成で設定します。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - - - - - - CH2 CH1 CH1 : ACコントロールのCH1制御(0:OFF,1:ON)

CH2 : ACコントロールのCH2制御(0:OFF,1:ON) 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。 解説 本関数は、制御対象となるデバイスがリモート電源コントロール機能に対応し、かつリモート電源コントロールデバイスに接続されている場合のみ有効です。

MlGetAcControl

リモート電源コントロールの現在の情報を取得します。 宣言 INT MlGetAcControl(HANDLE hDeviceHandle, INT nSlaveNo, PINT pnAcControl); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo hDeviceHandleで指定されるデバイスがマスタの場合、0から7までのスレーブ番号を指定しま

す。スレーブの場合には0を指定します。 pnAcControl バッファへのポインタを指定します。このバッファにACコントロールの設定設定が以下のビ

ット構成で格納されます。 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - - - - CTL PC CH2 CH1 CH1 : ACコントロールのCH1制御(0:OFF,1:ON)

CH2 : ACコントロールのCH2制御(0:OFF,1:ON) PC : ACコントロールが接続されているPCの電源状態(0:OFF,1:ON) CTL : ACコントロールの接続状態(0:未接続,1:接続)

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。 解説 本関数は、制御対象となるデバイスがリモート電源コントロール機能に対応し、かつリモート電源コントロールデバイスに接続されている場合のみ有効です。

MlSetSlaveNo(PCI-4912,4915用)

スレーブのスレーブ番号を設定します。 宣言 INT MlSetSlaveNo(HANDLE hDeviceHandle, INT nSlaveNo); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 nSlaveNo 設定するスレーブ番号を0~7で指定します。

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

TUT-0032

- 67 - Interface Corporation

MlGetSlaveNo(PCI-4912,4915用)

スレーブのスレーブ番号を取得します。 宣言 INT MlGetSlaveNo(HANDLE hDeviceHandle, PINT pnSlaveNo); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 pnSlaveNo バッファへのポインタを指定します。このバッファに設定されたスレーブ番号が

格納されます。 戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

MlParityCheck(PCI-4911,4913用)

マスタでパリティをチェックします。 宣言 INT MlParityCheck(HANDLE hDeviceHandle, PINT pnParityError); パラメータ

hDeviceHandle 有効なデバイスハンドルを指定します。 pnParityError バッファへのポインタを指定します。このバッファにパリティエラーの状態を示

す値がが格納されます。 定数 意味 ML_PARITY_NONE パリティエラーなし ML_PARITY_WRITE 書き込みパリティエラー発生 ML_PARITY_READ 読み込みパリティエラー発生 ML_PARITY_BOTH 書き込み/読み込みパリティエラー発生

戻り値 関数が成功するとML_ERROR_SUCCESSが返されます。 関数が失敗するとML_ERROR_SUCCESS以外の値が返ります。関数が失敗した場合の戻り値については『67ページ エラーコード一覧』を参照してください。

エラーコード一覧 定数 値 内容 ML_ERROR_SUCCESS 0 正常終了 ML_ERROR_NOT_DEVICE 0xC0000001 指定されたデバイスがありません ML_ERROR_NOT_OPEN 0xC0000002 システムがデバイスをオープンできません ML_ERROR_INVALID_HANDLE 0xC0000003 デバイスハンドルが正しくありません ML_ERROR_ALREADY_OPEN 0xC0000004 すでにOPENしているデバイスをOPENしようとしました ML_ERROR_HANDLE_EOF 0xC0000005 EOFに達しました ML_ERROR_MORE_DATA 0xC0000006 さらに多くのデータが利用可能です ML_ERROR_INSUFFICIENT_BUFFER 0xC0000007 システムコールに渡されたデータ領域が小さすぎます ML_ERROR_IO_PENDING 0xC0000008 非同期I/O操作が進行中です ML_ERROR_NOT_SUPPORTED 0xC0000009 サポートされていない機能です ML_ERROR_INITIALIZE_IRQ 0xC0001000 割り込みの初期化に失敗しました ML_ERROR_INVALID_SLAVENUM 0xC0001001 不正なスレーブ番号を指定しました ML_ERROR_INVALID_OFFSET 0xC0001002 不正なオフセットを指定しました ML_ERROR_INVALID_VALUE 0xC0001003 不正な書き込み値を指定しました ML_ERROR_INVALID_SIZE 0xC0001004 不正なサイズを指定しました ML_ERROR_INVALID_ACCONTROL 0xC0001005 不正なACコントロール設定値を指定しました ML_ERROR_INVALID_MASK 0xC0001006 不正なイベントマスクを指定しました ML_ERROR_ALREADY_REGISTRATION

0xC0001007 イベントはすでに登録済みです

ML_ERROR_ALREADY_DELETE 0xC0001008 イベントはすでに削除されています ML_ERROR_MEMORY_NOTALLOCATED

0xC0001009 作業用メモリの確保に失敗しました

ML_ERROR_MEMORY_FREE 0xC000100A メモリの解放に失敗しました ML_ERROR_TIMER 0xC000100B タイマリソースの取得に失敗しました ML_ERROR_DRVCAL 0xC000100C ドライバが呼び出せません ML_ERROR_NULL_POINTER 0xC000100D ドライバ、DLL間でNULLポインタが渡されました ML_ERROR_PARAMETER 0xC000100E 引数パラメータの値が不正です

TUT-0032

Interface Corporation - 68 -

5.1. Visual C++用定数一覧 オープンフラグ識別子 #define ML_FLAG_NORMAL 0x0000 // デバイスを共有しません #define ML_FLAG_SHARE 0x0002 // デバイスを共有します パリティエラー識別子 #define ML_PARITY_NONE 0 // パリティエラーなし #define ML_PARITY_WRITE 1 // 書き込みパリティエラー発生 #define ML_PARITY_READ 2 // 読み込みパリティエラー発生 #define ML_PARITY_BOTH 3 // 書き込み/読み込みパリティエラー発生

TUT-0032

- 69 - Interface Corporation

技術資料紹介 弊社では下記の技術資料を提供しております。 詳しくは、弊社Web site(www.interface.co.jp)、または弊社窓口までお問い合わせください。 カタログ

PRM-0061 CPZカタログ(日本語版) PRM-0062 PCIカタログ(日本語版) PRM-0063 CSIカタログ(日本語版)

チュートリアル TUT-0058 チュートリアル CPZ拡張ユニット 入門編 TUT-0056 チュートリアル XP Embedded OS構築編 TUT-0055 チュートリアル 画像入力I/Oモジュール TUT-0054 CANチュートリアル TUT-0053 モーションコントロールチュートリアル TUT-0050 RTLinuxによるモーションコントローラI/Oモジュール制御プログラミング チュートリアル(GPG-7400用) TUT-0048 RTLinuxによるメモリンクI/Oモジュール制御プログラミング チュートリアル TUT-0044 RTLinuxによるメモリ共有インタフェースI/Oモジュール制御プログラミング チュートリアル TUT-0043 RTLinuxによる調歩同期シリアル通信I/Oモジュール制御プログラミング チュートリアル TUT-0041 RTLinuxによるGP-IBI/Oモジュール制御プログラミング チュートリアル TUT-0040 RTLinuxによるDAI/Oモジュール制御プログラミング チュートリアル TUT-0039 RTLinuxによるADI/Oモジュール制御プログラミング チュートリアル TUT-0038 RTLinuxによるDIOI/Oモジュール制御プログラミング チュートリアル TUT-0037 RTLinuxによるHDLCI/Oモジュール制御プログラミング チュートリアル TUT-0036 RTLinuxによるPCI/CompactPCI/CardBus制御入門書(導入編) TUT-0034 Visual C++によるPPI入門書 TUT-0033 Visual Basicによるメモリ共有インタフェース入門書 TUT-0032 Visual C++によるメモリ共有インタフェース入門書 TUT-0031 Visual Basicによるメモリンク入門書 TUT-0030 Visual C++によるメモリンク入門書 TUT-0029 Visual BasicによるHDLC入門書 TUT-0028 Visual C++によるHDLC入門書 TUT-0027 Visual BasicによるGP-IB入門書 TUT-0026 Visual C++によるGP-IB入門書 TUT-0025 Visual BasicによるDIO入門書 TUT-0024 Visual C++によるDIO入門書 TUT-0023 Visual BasicによるDA入門書 TUT-0022 Visual C++によるDA入門書 TUT-0021 Visual BasicによるAD入門書 TUT-0020 Visual C++によるAD入門書 TUT-0019 Visual Basicによるモーションコントローラ入門書 TUT-0018 Visual C++によるモーションコントローラ入門書 TUT-0017 メモリンクを使用した負荷分散システム事例チュートリアル TUT-0016 Visual BasicによるPPI入門書 TUT-0015 モーションコントロールチュートリアル TUT-0014 Microsoft Visual Studio .NET移行ガイド TUT-0008 拡張ユニット チュートリアル(問題解決編) TUT-0007 拡張ユニットチュートリアル(入門編) TUT-0006 C(98)/ISA製品からPCI/CompactPCI製品への移行チュートリアル(DOS編) TUT-0005 DOSによるLAP-B入門書 TUT-0004 DOSによるAD入門書 TUT-0003 LinuxによるPCI/CompactPCI/CardBus制御 入門書 TUT-0002 PCI-ISAバスブリッジチュートリアル TUT-0001 PCI-Cバスブリッジチュートリアル

技術情報資料 初めてのCANインタフェース Linux, リアルタイムLinux移植(SH-4)経験談及び当社の今後の取り組みについて LinuxからPCI/CompactPCII/Oモジュールを制御する方法 ActiveXコントロールによるシステム組み込み技術 CompactPCIへの置き換え+システム構築/移行ガイド MS-DOSからPCI/CompactPCII/Oモジュールを制御する方法

TUT-0032 2007年 1月 Ver. 1.1 発行 発行所

〒732-0828 広島県広島市南区京橋町10-21 TEL 082-262-7777 FAX 082-262-5066

定価 ¥2,000

本書の内容の一部または全部を、無断で転載することを禁止します。 本書の内容は、将来予告なく変更することがありますので、予めご了承ください。 © 2000, 2007 Interface Corporation. All rights reserved.

www.interface.co.jp

サポート体制

本製品についてのお問い合わせは、お客様相談センタで承ります。弊社Web siteのオンライ

ンQA(「サポート」→「お客様相談センタ」をクリック)、E-mailまたはフリーダイヤルをご利用く

ださい。 お問い合わせ先 <お客様相談センタ> TEL 0120-447213 FAX 0120-458257 (祝日および弊社休業日を除く月~金 AM9:00~PM5:00迄) E-mail [email protected]

TUT-0032 Ver. 1.1 Vol. 1/1

www.interface.co.jp

Visual C++によるメモリ共有インタフェース入門書

TUT-0032 Ver. 1.1