Q: switch 文における case 値の最大数はいくつですか? (セクション 3.6.4.2 )
2 メッセージの送信 msg_send()関数 msg_cancel() 関数
3 メッセージの受信 msg_arrivesイベント
msg_receive()関数 msg_inオブジェクト 4 確認応答付きサービスの
メッセージ送信の後
msg_completesイベント msg_succeedsイベント msg_fails イベント 5 リクエスト/レスポン
ス・サービスのメッセー ジに対するレスポンスの 送信
resp_out オブジェクト resp_send() 関数 resp_cancel() 関数 resp_arrives イベント resp_receive() 関数 resp_in オブジェクト 6 明示的なバッファの割り
当て
msg_alloc()関数
msg_alloc_priority()関数 msg_free()関数
resp_free()関数
メッセージの作成 メッセージの作成 メッセージの作成 メッセージの作成
アプリケーション・メッセージはmsg_out発信メッセージ・オブジェクトを 使用して作成します。この定義はNeuron Cに組み込まれています。メッセー ジの送信にはmsg_send()関数を使用します。一度に作成できるのは、1つの 発信メッセージ(またはレスポンス)と1つの着信メッセージ(またはレス ポンス)だけです。つまり、1つのプログラムの中で並行して2つのメッセ ージを作成し、その両方を送ったり、2つの入力メッセージを同時に処理す ることはできません。
msg_out
オブジェクトの定義オブジェクトの定義 オブジェクトの定義オブジェクトの定義発信メッセージはNeuron Cコンパイラで以下のように定義されています。
typedef enum {FALSE, TRUE} boolean;
typedef enum {ACKD, UNACKD_RPT,
UNACKD, REQUEST} service_type;
struct {
boolean priority_on; // TRUE if a priority message
// (default:FALSE)
msg_tag tag; // message tag (required)
int code; // message code (required) int data[MAXDATA] // message data
(default:none)
boolean authenticated; // TRUE if to be authenticated
// (default:FALSE)
service_type service; // service type (default:ACKD)
msg_out_addr dest_addr; // see include file msg_addr.h
// (optional field)
} msg_out;
priority_on メッセージを優先メッセージとして送信するときに
TRUEに設定します。このフィールドにFALSEを指 定するか、何も指定しないと、メッセージには優先 権が与えられません。このフィールドを指定すると きには、必ずメッセージ・オブジェクトの最初のフ ィールドとして設定し、タグよりも前にしてくださ い。デフォルトは、FALSE(非優先)です。
tag メッセージに対するメッセージ・タグ識別子を指定 します。このフィールドは省略できません。本章の
「メッセージ・タグ」を参照してください。
code メッセージ・コードを表す数値を指定します。この
フィールドは省略できません。本章の「メッセージ・
コード」を参照してください。
data アプリケーションのデータを指定します。このフィ ールドはオプションで、メッセージ・タグとメッセ ージ・コードだけのメッセージも作成できます。ネ ットワーク・バッファにはオーバーヘッドがあるた め、MAXDATAは228以下に設定してください。デ ータの最大長(MAXDATA)は、app_buf_out_sizeプ ラグマの設定によって決まります(第8章 参照)。
MAXDATA = app_buf_out_size – 6 または、
MAXDATA = app_buf_out_size - 17
(このプログラムのメッセ ージまたはネットワーク変 数に明示的にアドレスを指 定する場合)
注意 注意 注意
注意:::: Neuronファームウエアは、データ配列のどの場所に代入があったか を把握しており、それに応じて自動的に発信メッセージの長さを設定するこ とに注意してください。
authenticated 認証機能を利用するメッセージを送信するときに
TRUEを指定します。認証を必要としないメッセージ を送信する場合は、このフィールドにFALSEを指定 するか、何も指定しません。デフォルトはFALSE(認 証なし)です。
service 次のサービス・タイプのうちの1つを指定します。
ACKD - (デフォルト)リトライを伴う確認応答付
きサービス
REQUEST - リクエスト/レスポンス・プロトコル
UNACKD - 確認応答なしサービス
UNACKD_RPT - 反復サービス(メッセージは繰り
返し送られます)
注意注意
注意注意:::: 認証機能を使用するメッセージには、UNACKDやUNACKD_RPTサ ービスを使用できません。ACKDまたはREQUESTサービス・タイプを使用 してください。
dest_addr 送信先アドレスを明示的に指定するmsg_out内のオ プションのフィールドです。dest_addrをセットして いない場合、メッセージは「タグ」に結び付けられ ているアドレスに送信されます(タグが結びつけら れている場合)。詳しくは、本章で後述する「明示 的なアドレス指定」のセクションを参照してくださ い。
注意 注意 注意
注意:::: このフィールドを使用するには、
<addrdefs.h>と<msg_addr.h>をインクルードする必 要があります。
メッセージ・タグ
「メッセージ・タグ」はアプリケーション・メッセージの接続点です。着信 アプリケーション・メッセージは、いつでもmsg_inという共通のメッセー ジ・タグで受信するようになっていますが、発信する明示的メッセージを使 用する場合には、1つ以上のメッセージ・タグを宣言する必要があります。
着信タグおよび各発信タグに対する一意のネットワークアドレスの割り当て には、ネットワーク管理ツールを使用できます。
メッセージ・タグ宣言には、コネクション情報を指定するオプション・フィ ールドがあります。メッセージ・タグの宣言シンタックスは次のとおりです。
msg_tag [connection-info] tag-identifier [, tag-identifier ...];
connection-infoフィールドは、コネクション情報に接続オプションを設定する
ための省略可能なフィールドで、次のような形式で指定します。
bind_info (options)
メッセージ・タグに設定できる接続オプションは、以下のとおりです。
nonbind このオプションを指定すると、暗黙的アドレス指定
情報を含まないメッセージ・タグになります。した がって、このメッセージ・タグはアドレス・テーブ ル・エントリを消費しません。このオプションは、
明示的にアドレス指定したメッセージを作成すると きの送信先タグとして使用します。
rate_est (const-expr) 推定メッセージ・レートを指定します。これはメッ セージ・タグを転送するのに予想されるメッセー ジ・レートで、1秒間のメッセージ数の10倍の値を 指定します。ここには0から18780までの値(0~
1878.0メッセージ/秒)を指定できます。
max_rate_est (const-expr)
最大推定メッセージ・レートを指定します。これは メッセージ・タグを転送するのに予想される最大メ ッセージ・レートで、1秒間の最大メッセージ数の 10倍の値を指定します。ここには0から18780まで の値(0~1878.0メッセージ/秒)を指定できます。
tag-identifier メッセージ・タグ名をNeuron Cの識別子の形式で指
定します。
rate_estとmax_rate_estは、いつでも指定できるとは限りません。例えば、
メッセージの出力レートはデバイスがインストールされている特定のネット ワークに左右されることがよくあります。これらの値はネットワーク・デバ イスを解析するためにネットワーク管理ツールが使用するもので、オプショ ンの項目です。また、rate_estとmax_rate_estには0から18780までの値を 指定できますが、すべての値を使用できるわけではありません。これらの値 はコード化されて値nにマッピングされます。nは0から127までの範囲の 値です。コード化された値だけがデバイスにある自己識別(SI)データに保 存されます。実際の値は、このコード化された値から再構成されます。コー ド化された値がゼロであれば、実際の値は未定義です。コード化された値が 1から127の間にあれば、実際の値はa=2(n/8)-5の結果を小数点以下1桁で四 捨五入した数字になります。この式で求めた実際の値は、秒当たりのメッセ ージ数になります。
各発信メッセージのmsg_out.tagフィールドにはメッセージ・タグを割り当 てる必要があります。これは各発信メッセージがどの接続点(アドレス・テ ーブルのエントリに対応する)を使用するかを指定するためのものです。一 度タグ・フィールドを割り当てたら、そのメッセージは送信するか、取り消 すかのどちらかを実行しなければなりません。
アドレス指定以外のメッセージ・タグの役割としては、完了イベントと発信 メッセージによるレスポンスとの関連付けが挙げられます。例えば、tag1メ ッセージ・タグを使って送信されたメッセージとメッセージ完了イベントを 関連付けるには、次のwhen節を使用します。
when (msg_completes(tag1))
メッセージ・タグをイベントに関連付けておくと、特定の発信メッセージに 対応するイベントが起こったときにだけ、イベントの評価がTRUEになりま す。
メッセージ・コード
「メッセージ・コード」は、メッセージの数値識別子です。アプリケーショ ン・メッセージには、必ずメッセージ・コードが指定されていなければなり ません。このコードは、受信側のアプリケーションが各メッセージの内容を 解釈するために使用します。
メッセージ・コードはアプリケーション・メッセージだけでなく、すべての LonTalkメッセージによっても使用されます。メッセージ・コードの値は表 6.1に示す範囲になります。アプリケーションには、0~62と64~78のコー ドを使用してください。一般に、低い方の数値は独自のアプリケーション・
メッセージに使用し、高い方の数値は他のネットワークに接続するアプリケ ーション・レベルの独自ゲートウェイに使用します。
表表
表表6.1 メッセージ・コードの範囲メッセージ・コードの範囲メッセージ・コードの範囲メッセージ・コードの範囲
メッセージのタイプ メッセー ジ・コード
説明
ユーザ・アプリケーショ ン・メッセージ
0~~~~47 一般アプリケーション・メッセージ。
メッセージ・コードの解釈は、アプリ ケーション依存です。
標準アプリケーショ ン・メッセージ
48~~~62 ~ LONMARK Interoperability Association が定義する標準アプリケーション・メ ッセージ。
応答側オフライン 63 アプリケーションのレスポンス・メッ セージに使用します。レスポンスの送 信側がオフライン状態にあり、リクエ ストを処理できないことを意味しま す。
外部フレーム 64~~~~78 他のネットワークへのアプリケーシ ョン・レベルのゲートウェイが使用し ます。メッセージ・コードの解釈は、
アプリケーション依存です。
外部応答側オフライン 79 外部フレーム・レスポンスが使用しま す。レスポンスの送信側がオフライン 状態にあり、リクエストを処理できな いことを意味します。
ネットワーク診断メッ セージ
80~~~95 ~ ネットワークを診断するためにネッ トワーク管理ツールが使用します。
ネットワーク管理メッ セージ
96~~~~127 ネットワークをインストールし、保守 するためにネットワーク管理ツール が使用します。
ネットワーク変数 128~~~~255 メッセージ・コードの下位6ビットに は、ネットワーク変数セレクタの上位 6ビットが含まれています。最初のテ ータ・バイトには、セレクタの下位8 ビットが含まれています。
アプリケーション・メッセージの作成例 アプリケーション・メッセージの作成例 アプリケーション・メッセージの作成例 アプリケーション・メッセージの作成例
msg_tag motor;
#define MOTOR_ON 0
#define ON_FULL 100 msg_out.tag = motor;
msg_out.code = MOTOR_ON;
msg_out.data[0] = ON_FULL;