個人情報保護方針 お支払いについて お問い合わせ

C#/WPFとVisualStudioによるWindows GUIプログラミング 


FPGAボードをWindowsPC上のGUIアプリケーションからコントロールするためには、通常のWindowsアプリケーションを作成できるということだけでなく、Windowsシステムが想定している市販の周辺機器以外にアクセスする方法を確立するとともに、これらをリアルタイムで処理する技術が必要になってきます。これが組み込み制御機器用のアプリケーション開発と通常のWindowsアプリケーション開発の大きな違いになってきます。WebブラウザやWord、Excel等標準でPCに接続されているネットワークやディスプレイ、キーボードのみで動作するアプリケーションとは異なるということです。Grove Design ServiceはこのようなFPGAとその周辺に特化して業務を行っています。プログラミング言語としてはC#/WPF、ツールは無償のVisual Studioを使用しています

USB経由でのFPGAボードとのアクセス

プライムシステムズ社製のFPGAボードにはWindowsForm等のWindowsプログラムで使用できるC/C++用のDLL(Smart-USB Sigma用 SUSlv.dll/ Smart-USB Plus用 SUPlv.dll) 用意されています。FPGAボード内のレジスタやメモリに対してアクセスできる関数APIが用意されていて、これらを使用してユーザー独自のFPGAデザインに対応したアプリケーションを作成し、マウスによる簡単操作で独自の機器を制御するようなアプリケーションが作成可能です。しかし、近年Windowsアプリケーション作成の多くはC#/WPFという仕組みで作られることが多くなっています。WPFではウインドウのデザインはGUIのツールにて比較的簡単に作成することができますが、C#ではいわゆるセーフコードと呼ばれる規定外の変数やクラスへのアクセスを保護するために独特の型・クラスが使われていて、一見するとC++のDLLが使えないように見えます。しかし、実際にはC++とC#で異なる名前の型・クラスでも中身が同じものがあるので、それらをうまく変換してあげれば使用できます。Grove Design Serviceではおよそ10年ぐらい前から、これらの外部DLLを使用したWFPによるGUIソフトウェアを作成しています。

DLL Importという手法


C++用に作成されたDLLをC#から呼び出すためには、DLL Importという手法を用います。DLLのファイル名と使用したい関数名、引数などをC#に合うように定義しておくことで、C#のプログラム上でこれらの機能を使用することができます。これはプライムシステムズ社のDLLに限らず、一般的に用いられる方法です。ただし、DLL内のプログラムはC#流に作成されたセーフコードではありません。間違った引数をしていするなどすると簡単にプログラムが異常終了してしまいます。そこで、直接DLLを呼び出すのではなく、SUS/SUPクラスを作成し、それぞれのAPIに対応したメンバ関数を用意しています。メンバ関数はC#で書かれていますので、安心して使用することができます。引数も返り値もC#のクラスです。

マルチスレッドと排他制御

FPGAを用いた器機を設計する場合、FPGAボードから連続的にデータを取り込んだりFPGAボードにデータを書き込んだりする使い方が多いと思います。WindowsのGUIアプリケーションは基本的にUI操作(マウスのクリックやキーボードの入力)イベントが起きたときに動作を行う、イベントドリブン方式になっています。つまりなにか操作があったときにのみ表示を更新したりするわけです。ところが、FPGAのような動作中・測定中などの動作を表示したい場合には都合がよくありません。


この場合、C#ではスレッドという方法を取ります。UIの操作とは関係なしに、バックグラウンドで常にあるいは必要な時のみ動作するスレッドを作成し、このスレッド中でリアルタイムの処理を行うようにします。ただし、これらのスレッドからウインドウに表示を行う場合には、直接ウインドウ上のボタンやテキストボックス等のアイテムにはアクセスすることはできず。少し特殊な方法を用いる必要があります。また、FPGAボードに対して、ボタンを押した時などのUIからのアクセスとスレッドからのアクセスが同時に起こることが想定されます。これらが同時に起こると誤動作を起こしますので、プログラムでは誤動作しないように十分な排他制御をおこなう必要があります。

PCIexpress経由でのFPGAボードへの接続

AMD(旧Xilinx)のデバイスではXDMAと呼ばれる方式でPCIexpress経由でPCと接続をしています。LinuxおよびWindowsドライバがAMD/XILINXのサイト65444 - Xilinx PCI Express DMA Drivers and Software Guideで公開されています。ドライバさえ入ってしまえば、C#からのアクセスはUSBとそうはかわりません。こちらの方法も順次対応していきます。

WPFアプリケーションでのローカライズ(各国語対応)

 

アプリケーションが日本国内でのみ使用される場合、言語の対応は考える必要がありません。しかし、英語圏やそのほかの国に輸出する可能性がある場合、Windowsの言語設定にしたがってアプリケーションの言語を切り替える必要があります。この場合、あらかじめ用意されているローカライズとリソースの機能を使って、1つのアプリケーション実行形式でWindowsの言語設定に従って言語を切り替えるようにすることが可能です。言語を追加する場合にはその言語のリソースを追加するだけです。このような各国語対応にも対応できます。

WPFではサポートされない機能

WPFでは比較的単純なダイアログがSDI(1つの表示領域をもつウインドウ)がサポートされています。しかし、複雑なアプリケーションではVisualStudioのようにウインドウ全体を左右あるいは上下にいくつかの領域にわけたり、各領域にタブを追加したりして、複数の情報を切り替えながら表示したい場合があります。


WPFではこのようなアプリケーションは標準ではサポートされていませんが、外部のプラグインをインポートすることで可能になります。また、ボタンを押した時に音が出るようにしたり、ボタンなどをアニメーション表示したりすることもできます。FPGA制御の為のアプリですから凝った表示は必要がない場合も多いと思いますが、市販のアプリ等で使われているような機能はWPFだからといってできないとは限りませんので、必要な場合には相談いただければ、可能かどうか調査いたします。