最初のRTX64アプリを作る — INtime経験者のためのクイックスタート【Application Template / Hello World】

コーディング

INtimeでアプリを作り始めるとき、ノードの設定ウィザードとアプリ作成ウィザードを別々に実行した記憶はありませんか?RTX64では、Visual Studioの「RTX64 Application」テンプレートひとつで、RTSS用とWindows用の両ビルド構成が一度にセットアップされます。この記事では、INtime経験者がRTX64の最初のアプリを動かすまでの流れを、INtimeとの違いを交えながら解説します。

INtimeとRTX64:プロジェクト作成の違い

INtimeでは、Node(RTOSカーネルの動作単位)の設定ウィザードと、アプリケーションプロジェクトの作成ウィザードが別々のステップになっていました。対してRTX64では、ノードに相当する概念(RTSSプロセス)はVisual Studioのテンプレートに組み込まれており、ひとつのウィザードで完結します。

項目INtimeRTX64
プロジェクト作成ノード設定ウィザード+アプリウィザード(2段階)RTX64 Applicationテンプレート1つ
ビルド構成INtime用とWin32用を個別管理RTSSDebug / RTSSRelease / Debug / Release の4構成が自動生成
コンソール出力printf()RtPrintf()(RTSSプロセス内)
パス指定相対パス可絶対パスのみ

ステップ1:Visual Studioでプロジェクトを作成する

Visual Studioを起動し、「新しいプロジェクトの作成」を選びます。検索ボックスに「RTX64」と入力すると、RTX64 Applicationテンプレートが表示されます(分類:Visual C++ → RTX64)。

テンプレートを選択して「次へ」を押すと、プロジェクト名・場所・ソリューション名を入力するダイアログが表示されます。入力後「作成」をクリックすると、次の設定ダイアログが開きます。

RTX64 Applicationウィザードの設定項目

チェックボックス説明推奨
Supported String Conventionサポートされる文字列の規則UnicodeMultiByteAnsi から選びます。Windows側のHMIアプリケーションと共有メモリ等で文字列データをやり取りする際、文字化けを防ぐためにWindows標準に合わせた Unicode を選択しておくのが現在の主流です。
RT-TCP/IP support装置内でリアルタイムEthernet通信(例:独自プロトコルでのノード間通信)を行う場合に必須となります。リアルタイムTCP/IPスタックを使用する場合にチェックを入れます。
RT Network Abstraction Layer supportリアルタイムネットワーク抽象化レイヤー(NAL)を使用するための設定特定のNICに依存しない、より低遅延で決定論的なパケット処理を実装する際に利用します。
Microsoft C Runtime supportCRTライブラリを使用可能にする。printf や malloc 等を使う場合は必須チェックする。
RTX64 Vision supportGigE Visionカメラ等を用いたリアルタイム画像処理を行う場合に使用します。アライメント補正や外観検査などを、RT側でWindowsの遅延を受けずに処理したい場合に非常に強力なオプションです。
Provide an RTSS program frameworkひな形コードを生成するチェックする。
メインコードのみ作成されます

「Provide a program framework」をオフにして「OK」を押すと、最小構成のRTX64プロジェクトが作成されます。

ステップ2:自動生成されるビルド構成を理解する

プロジェクトが作成されると、ソリューション構成に以下の4つが自動で追加されます。INtimeでは手動でビルド設定を分けていたものが、RTX64では最初から整理された状態で提供されます。

構成名用途出力バイナリ
RTSSDebugRTSSプロセス(デバッグ).rtss(デバッグ情報付き)
RTSSReleaseRTSSプロセス(リリース).rtss
DebugWindowsプロセス(デバッグ).exe(デバッグ情報付き)
ReleaseWindowsプロセス(リリース).exe

RTSSプロセスとしてリアルタイム動作させるには RTSSDebug または RTSSRelease を選択してビルドします。Debug / Release はWindowsアプリとしてビルドするためのもので、RTSS機能(RtPrintf等)はここでは動作しません。

ステップ3:Hello World コードを書く

生成されたソースファイルに、最小限のHello Worldコードを書いてみましょう。INtimeの main() に相当するのが、RTX64の _RtapiProcessEntryCRT です。

int _tmain(int argc, _TCHAR * argv[])
{
    // RtPrintf はRTSSプロセス内のコンソール出力関数
    // INtime の printf に相当する
    RtPrintf("Hello from RTSS!\n");

    return 0;
}

コードのポイント

  • RtPrintf:RTSSプロセス内で使うコンソール出力関数。RTX64 Intervalウィンドウに出力されます。INtimeのprintfと同じ感覚で使えますが、RTSS環境専用です。
  • UNDER_RTSS:RTSSDebug/RTSSReleaseビルド時に自動で定義されるマクロ。このマクロを使ってRTSS専用コードとWindows共通コードを切り替えられます。

ステップ4:ビルドして実行する

ビルド

ソリューション構成を RTSSRelease(または RTSSDebug)に切り替えて「ビルド」を実行します。成功すると、プロジェクトフォルダの RTSSRelease\ ディレクトリに プロジェクト名.rtss が生成されます。

RTSSプロセスの実行

RTSSプロセスは通常の .exe のようにダブルクリックでは実行できません。RTX64 Interval(RTX64の管理コンソール)から起動するか、コマンドラインから以下のように実行します。

RtssRun.exe "C:\Projects\HelloRtss\RTSSRelease\HelloRtss.rtss"

パスは必ず絶対パスで指定してください。RTSSプロセスは相対パスをサポートしていません(INtimeとの重要な違いです)。

実行すると、RTX64 IntervalウィンドウのログエリアにRtPrintfの出力が表示されます。

UNDER_RTSS で Windows/RTSS 共用コードを書く

INtimeでは「RTOSコードはRTOS側だけ」という割り切りが多かったと思いますが、RTX64ではWindowsとRTSSの両方でビルドできるコードを書くことができます。UNDER_RTSSマクロを活用すると、ひとつのソースファイルでRTSS専用処理とWindows共通処理を切り替えられます。

int _tmain(int argc, _TCHAR * argv[])
{
    // UNDER_RTSS はRTSSビルド時に自動定義されるプリプロセッサマクロ
    // RTSSビルドとWindowsビルドでコードを切り替えるのに使う
#ifdef UNDER_RTSS
    RtPrintf("This code is running under RTSS.\n");
#else
    printf("This code is running under Windows.\n");
#endif

    return 0;
}

この関数はRTSSDebug/RTSSReleaseビルドでは RtPrintf を、Debug/Releaseビルドでは printf を使います。共通ロジックをひとつのソースで管理できるため、保守性が高まります。

注意事項

  • 絶対パスのみ:RTSSプロセス内でファイルや外部リソースを参照する場合、パスは必ず絶対パスで指定してください。相対パスはRTSSでは動作しません。
  • CRTサポートの選択:ウィザードで「Microsoft C Runtime support」をオフにした場合、malloc/printf 等のCRT関数は使用できません。後から変更する場合はプロジェクトプロパティを直接編集します。
  • $(Rtx64Platform)マクロ:プロジェクトのライブラリディレクトリには $(Rtx64Platform) というVSマクロが使われています。RTX64のインストールパスが変わった場合はここを更新します。
  • Kill禁止:タスクマネージャーなどからRTSSプロセスを強制終了(Kill)するのは危険です。RTX64 Intervalから「Stop」でグレースフルシャットダウンしてください。

まとめ

  • プロジェクト作成:VS → 「RTX64 Application」テンプレートを選択。INtimeの2段階ウィザードと異なり、1回のウィザードで完結する。
  • 4つのビルド構成:RTSSDebug / RTSSRelease(RTSS用)、Debug / Release(Windows用)が自動生成される。
  • エントリポイント:_RtapiProcessEntryCRT(CRTあり)または _RtapiProcessEntry(CRTなし)。INtimeの main() に相当。
  • コンソール出力:RTSSプロセス内では printf の代わりに RtPrintf を使う。
  • UNDER_RTSS:RTSSビルド時に自動定義されるマクロ。RTSSとWindowsでコードを切り替えるのに活用する。
  • 絶対パス必須:RTSSプロセス内でのパス指定は絶対パスのみ有効。

RTXこんな感じです。デバック時、Windows用コードで動かして、関数の動きを確認できるのはいいですね!

コメント

タイトルとURLをコピーしました