SDI-12 通信プロトコル

目次

SDI-12とは

SDI-12(Serial/Digital Interface at 1200 baud)は3線式のシリアル通信規格です。レコーダーに複数台のセンサーを数珠繋ぎ(デイジーチェーン)して計測する用途で使用されます。本インターフェースは通信と電源供給を兼ねており、低コスト、低消費電力なシステムに向いています。

SDI-12バスの接続例

SDI-12バスの特徴

  • DC 12Vを供給します。
  • 半二重通信です。
  • 伝送速度は1200bpsです。

電気特性

シリアルデータライン

シリアルデータラインは半二重であり、スリーステートバッファーです。送信データの電圧レベルは下表のとおりです。

状態電圧範囲
0-0.5~1.0 V
13.5~5.5 V
送信データのロジックと電圧レベル

インピーダンス

SDI-12デバイスのトランスミッターがオンの場合、その直流抵抗は1000Ωより大きく2000Ωより小さくなければなりません。このインピーダンスにより、最大ケーブル長はデータラインに接続されているすべてのケーブルの静電容量によって決まります。

スタンバイモードを含め、SDI-12デバイスのトランスミッターがオフの場合、接地に対する直流抵抗は160k~360kΩの範囲内でなければなりません。 SDI-12センサーが12Vラインを電源として使用しない場合、電源オフのときのGNDに対するデータライン抵抗は160k~360kΩの範囲内でなければなりません。下図はこの等価回路を示しています。

等価回路

電源ライン

+12Vは、9.6~16Vの範囲となります。

通信仕様

通信はデータライン上をASCIIデータをやり取りして行います。通信設定は下表のとおりです。

項目仕様
伝送速度1200
データ長7ビット
ストップビット長1ビット
パリティー偶数
通信設定
  • データライン上を12ミリ秒以上無通信状態が続くと、ブレーク状態となります。
  • 各コマンドの最初の1文字が、レコーダーが通信する相手のセンサーを表します。
  • 自身へのコマンドではないと判断すると、センサーは省電力モードに移行します。

一般的な測定シーケンス

  1. レコーダーはブレークを使用して、SDI-12バス上のすべてのセンサーを起動します。
  2. レコーダーはアドレスを指定して、特定のセンサーに測定を行うよう指示します。
  3. 指定されたセンサーは15ミリ秒以内に応答し、測定データを準備するのに掛かる最大時間を返します。
  4. 測定データをすぐに利用できる場合、レコーダーはセンサーに測定値を返すよう要求します。
    測定に時間が掛かる場合、レコーダーはセンサーから測定完了の合図を待ちます。その後、レコーダーはセンサーに測定データを返すよう要求します。
  5. センサーは測定データを返します。

使用可能な文字

データラインを流れるデータは、印刷可能なASCII文字である必要があります。ただしこれには3つの例外があります。

  1. コマンドの応答の最後は「CR (0Dh)」と「LF (0Ah)」で終わります。
  2. CRC。
  3. 大容量バイナリーコマンドによる応答。

デバイスアドレス

各コマンドの最初の文字はセンサーアドレスです。同様に、応答の最初の文字もアドレス。これによりレコーダーは、正しいセンサーからの応答であることを確認します。

センサーアドレスに使用できる文字は、次のとおりです。

  • 「0」:デフォルトのアドレスです。
  • 「1」~「9」
  • 「A」~「Z」
  • 「a」~「z」

コマンド

すべてのレコーダーとセンサーは下表のコマンドをサポートする必要があります。

スクロールできます
コマンド名追加
ver.
コマンド応答
Acknowledge Activea!a<CR><LF>
Send IdentificationaI!allccccccccmmmmmmvvvxxx...xx<CR><LF>
Change Address1.2aAb!b<CR><LF>
Address Query1.2?!a<CR><LF>
Start MeasurementaM!atttn<CR><LF>
Start Measurement and Request CRC1.3aMC!atttn<CR><LF>
Send DataaD0! ... aD9!a<values><CR><LF>
or
a<values><CRC><CR><LF>
Additional MeasurementsaM1! ... aM9!atttn<CR><LF>
Additional Measurements and
Request CRC
1.3aMC1 ... aMC9!atttn<CR><LF>
Start VerificationaV!atttn<CR><LF>
Start Concurrent Measurement1.2aC!atttnn<CR><LF>
Start Concurrent Measurement and
Request CRC
1.3aCC!atttnn<CR><LF>
Additional Concurrent Measurements1.2aC1! ... aC9!atttnn<CR><LF>
Additional Concurrent
Measurements and Request CRC
1.3aCC1! ... aCC9!atttnn<CR><LF>
Continuous Measurements1.2aR0! ... aR9!a<values><CR><LF>
Continuous Measurements and
Request CRC
1.3aRC0! ... aRC9!a<values><CRC><CR><LF>
コマンドリスト

以降の通信例において「R → S」はレコーダーからセンサーに送信するコマンド、「R ← S」はセンサーからの応答を表します。

Acknowledge Active Command (a!)

SDI-12バス上にセンサーが存在しているかの確認に使用します。

R → S0!
R ← S0<CR><LF>
通信例

Send Identification Command (aI!)

センサーのSDI-12互換性レベル、型式、ファームウェアバージョンなどを取得します。

スクロールできます
コマンド応答
aI!allccccccccmmmmmmvvvxxx...xxx<CR><LF>
aセンサーアドレス。aセンサーアドレス。
Iコマンド。ll対応するSDI-12バージョン。「1.4」であれば「14」となります。
cccccccc8文字でベンダーIDを示します。通常は会社名の略称などを入れます。
mmmmmm6文字でセンサー型式を示します。
vvv3文字でセンサーバージョンを示します。
xxx...xxその他自由に使える最大13文字の領域です。
コマンド内容
R → S0!
R ← S013NRSYSINC1000001.2101<CR><LF>
通信例

Address Query Command (?!)

センサーのアドレスを確認します。 ?コマンドを受けたすべてのセンサーは、自身のアドレスを返します。?コマンドはレコーダーとセンサーを1対1で接続した状態で使用する必要があります。複数台のセンサーを接続した状態で使用すると、応答が競合します。

R → S?!
R ← S0<CR><LF>
通信例

Change Address Command (aAb!)

センサーのアドレスを変更します。 このコマンドに応答した後、センサーは1秒間他のコマンドに応答する必要はありません。その間にセンサーは、新しいアドレスを不揮発性メモリーに書き込みます。

スクロールできます
コマンド応答
aAb!b<CR><LF>
a現在のセンサーアドレス。b変更後のセンサーアドレス。
Aコマンド。
b変更後のセンサーアドレス
コマンド内容
R → S0A1!
R ← S1<CR><LF>
通信例

Start Measurement Command (aM!)

センサーに測定を行うよう指示します。

スクロールできます
コマンド応答
aM!atttn<CR><LF>
aセンサーアドレス。aセンサーアドレス。
Mコマンド。tttセンサーが測定データを準備できるまでの時間[秒]です。
「000」の場合、すぐに測定データを取得できます。
ttt時間のカウントは応答を返してから開始します。
ttt時間が経過する前に測定データを用意できた場合、レコーダーにサービスリクエストを送信します。
nDコマンドで測定データを返す数。[1 – 9]
コマンド内容
R → S0M!
R ← S00101<CR><LF>
R ← S0<CR><LF>
通信例
  • Mコマンドを送信する場合、事前に他のセンサーとの通信をすべて完了させておく必要があります。またMコマンドの処理中、レコーダーは他のセンサーと通信してはいけません。これはセンサーが測定データを用意できたタイミングで、サービスリクエストを送信してくるためです。
  • サービスリクエストは「a<CR><LF>」です。
測定の中止

センサーはMコマンドを受信してからサービスリクエストを送信するまでの間にブレークを検出すると、測定を中止する必要があります。 測定を中止した後にDコマンドを受信した場合、センサーアドレスに続いて<CR><LF>(または<CRC><CR><LF>)を返す必要があります。

Service Request (a)

サービスリクエストはセンサーからの応答のみです。レコーダーからのコマンド送信はありません。 Mコマンドにしたがい開始した測定が終了したとき、センサーはサービスリクエスト応答を行います。

Start Concurrent Measurement Command (aC!)

SDI-12バス上のセンサーに対して、同時測定を行うためのコマンドです。Cコマンドを受信したセンサーは、Mコマンドを受信したときと同様に測定を開始します。しかし測定を完了してもサービスリクエストを返しません。このためレコーダーは、続けて次のセンサーへCコマンドを送信することができます。

スクロールできます
コマンド応答
aC!atttnn<CR><LF>
aセンサーアドレス。aセンサーアドレス。
Cコマンド。tttセンサーが測定データを準備できるまでの時間[秒]です。
「000」の場合、すぐに測定データを取得できます。
ttt時間のカウントは応答を返してから開始します。
nnDコマンドで測定データを返す数。
コマンド内容
R → S0C!
R ← S00101<CR><LF>
通信例
同時測定の中止

同時測定中に有効なコマンドを受信した場合、センサーは同時測定を中止する必要があります。 測定を中止した後にDコマンドを受信した場合、センサーアドレスに続いて<CR><LF>(または<CRC><CR><LF>)を返す必要があります。

Send Data Command (aD0! … aD9!)

センサーから測定データを取得します。 D0コマンドは、M、MC、C、CC、VまたはHAコマンドの後に送信します。

スクロールできます
コマンド応答
aD0! (aD1! ... aD9!)a<values><CR><LF>
or
a<values><CRC><CR><LF>
aセンサーアドレス。aセンサーアドレス。
D0

D9
コマンド。<values>測定データです。{pD.d}
p:+ or –
D:1~7桁の値。
d:0~6桁の値。
データ値の最大桁数は、符号と小数点がない場合で7桁です。
測定データの最大文字数は9です。(符号 + 7桁 + 小数点)
複数の測定データを格納する場合があります。
最大長は35文字または75文字です。同時実行コマンドまたは大容量ASCIIコマンドでの最大長は75文字となります。
<CRC>3文字のCRCコードです。MC、MC1 … MC9、CC、CC1 … CC9コマンドを用いた場合に付加します。
コマンド内容

D0コマンドですべての測定データを受信できなかった場合、D1、D2コマンドと順に送信します。

Mコマンドの通信例
R → S1M!
R ← S10001<CR><LF>
R → S1D0!
R ← S1+3.14<CR><LF>
通信例1
R → S2M!
R ← S20053<CR><LF>
R ← S2<CR><LF>
R → S2D0!
R ← S2+3.14+2.718+1.414<CR><LF>
通信例2
R → S3M!
R ← S30359<CR><LF>
R ← S3<CR><LF>
R → S3D0!
R ← S3+1.11+2.22+3.33+4.44+5.55+6.66<CR><LF>
R → S3D1!
R ← S3+7.77+8.88+9.99<CR><LF>
通信例3
Continuous Measurements (aR0! … aR9!)

シャフトエンコーダーなど、測定対象の現象を継続的に監視するセンサーには、測定開始(M)コマンドは必要ありません。R コマンド(R0 … R9)で直接読み取ることができます。このRコマンドの応答は、Dコマンドと同じです。

R → S1R0!
R ← S1+3.14<CR><LF>
通信例

センサーがRコマンドに対応していない場合、「a<CR><LF>」を返します。

Additional Measurement Commands (aM1! … aM9!)

追加のMコマンド(M1…M9)はセンサーに対して異なる測定要求や、キャリブレーションを実行するよう指示するために用います。追加のMコマンドの応答は、Mコマンドと同じです。Dコマンドでデータを収集してください。

R → S0M1!
R ← S00011<CR><LF>
R ← S0<CR><LF>
R → S0D0!
R ← S0+3.14<CR><LF>
通信例

データのない追加のMコマンドを受信すると、センサーは「a0000<CR><LF>」を返します。

Additional Concurrent Measurement Commands (aC1! … aC9!)

追加のCコマンド(C1…C9)はセンサーに対して異なる測定要求や、キャリブレーションを実行するよう指示するために用います。追加のCコマンドの応答は、Cコマンドと同じです。Dコマンドでデータを収集してください。

データのない追加のCコマンドを受信すると、センサーは「a0000<CR><LF>」を返します。

Start Verification (aV!)

センサーの動作確認を行います。 本コマンドの応答はMコマンドと同じです。Dコマンドで診断結果を得られます。

R → S0V!
R ← S00011<CR><LF>
R ← S0<CR><LF>
R → S0D0!
R ← S0+1<CR><LF>
通信例

CRC

MC、CC、RCコマンドを使用した場合、DコマンドまたはRコマンドの応答にCRCが付加されます。CRCの計算は、パリティーを付加する前の値に対して行います。またアドレスからCRの手前までのデータに対して計算を行います。そのCRCの計算条件は下記のとおりです。

  • 多項式:0xA001
  • 初期値:0x0000
  • 出力XOR:0x0000
  • シフト方向:右
  • 入力反転:なし
  • 出力反転:なし

CRCの計算方法については、下記を参照ください。

上記計算により得られた16ビットのCRCを、次のように処理して3文字の<CRC>とします。

  • 1文字目:0x40 | (CRC >> 12)
  • 2文字目:0x40 | ((CRC >> 6) & 0x3F)
  • 3文字目:0x40 | (CRC & 0x3F)
CRCの処理例
  1. 「0+3.14」をCRC-16計算すると「0xFC5A」となります。
  2. 2進数では「1111 1100 0101 1010」です。
  3. 3文字に分割します。「1111」「11 0001」「01 1010」
  4. 0x40とORを取ります。「0100 1111」「0111 0001」「0101 1010」
  5. 結果<CRC>は「OqZ」となります。
R → S0MC!
R ← S00001<CR><LF>
R → S0D0!
R ← S0+3.14OqZ<CR><LF>
通信例

拡張コマンド

これまで紹介してきたコマンドだけでは、キャリブレーションなどの制御が不十分である場合があります。このようなときのために、各社独自の拡張コマンドを用意している場合があります。

  • 通常コマンドと同じく、センサーアドレスで始まり「!」で終わること。
  • 通常応答と同じく、センサーアドレスで始まり<CR><LF>で終わること。
  • コマンド名の先頭に「X」を付けることが推奨されています。現時点では仕様として明記されていませんが、将来仕様化される可能性があります。

複数行のテキストを返す拡張コマンド

複数行のテキストを返す拡張コマンドの仕様です。

  • テキストの開始に「STX (02h)」を、テキストの終わりに「ETX (03h)」を配置します。
  • センサーアドレス、<STX>、<CR>、<LF>、<ETX>を除く各行のテキストは75文字以内であること。
  • <CRC>を付加することはできません。
  • 各テキスト行の送信間隔は150ミリ秒以内であること。次のテキスト行の最初の1ビットが150ミリ秒以内に受信されない場合、レコーダーはテキストの終わりと判断します。
R → S0XHELP!
R ← S0<STX>This is the first line of text.<CR><LF>
R ← SThis is the second line of text.<CR><LF>
R ← SThis is the third and final line of text.<CR><LF><ETX>
通信例

大容量コマンド

同時測定(C)コマンドを拡張して、センサーから最大999個のパラメーターを取得することが可能となります。

スクロールできます
コマンド名追加
ver.
コマンド応答
High-Volume ASCII1.4aHA!atttnnn<CR><LF>
High-Volume Binary1.4aHB!atttnnn<CR><LF>
コマンドリスト

High-Volume ASCII Command (aHA!)

HAコマンドのCコマンドと比較した特徴は下記のとおりです。

  • Dコマンドは最大999まで指定できます。(aD0! … aD999!)
  • 「D」に続く数字に「0」を入れてはいけません。
  • Dコマンド応答の<values>の最大文字数は75文字です。
  • Dコマンドの応答には必ず<CRC>が付きます。
R → S0HA!
R ← S0045012<CR><LF>
R → S1CC!
R ← S101504<CR><LF>
R → S1D0!
R ← S1+1.23+2.34+345+4.4678KoO<CR><LF>
R → S1CC!
R ← S0+1.234-4.56+12354-0.00045+2.223+145.5+7.7003+4328.8+9+10+11.433+12Ba]<CR><LF>
通信例

High-Volume Binary Command (aHB!)

大容量バイナリー測定により、ASCII転送より効率的に大量のデータを収集できます。

  • Dコマンドではなく、DBコマンドでバイナリデータを取得します。(aDB0! … aDB999!)
  • DBコマンド応答にはパリティーは付きません。
  • 1度のDBコマンドの応答内は、すべて同一のデータタイプです。
  • マルチバイトのバイナリーデータは、最下位バイトから順に送信します。
スクロールできます
アドレスパケットサイズデータタイプバイナリーデータCRC
ASCIIバイナリーデータ長下表参照測定データ
1バイト2バイト1バイト10000バイト以下2バイト
DBコマンド応答のデータパケット
スクロールできます
データタイプレンジサイズ
0無効な要求データなし
1-128 ~ 1278ビット符号あり整数
20 ~ 2558ビット符号なし整数
3-32,768 ~ 32,76716ビット符号あり整数
40 ~ 65,53516ビット符号なし整数
5-2,147,483,648 ~ 2,147,483,64732ビット符号あり整数
60 ~ 4,294,967,29532ビット符号なし整数
7-9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807
64ビット符号あり整数
80 ~ 18,446,744,073,709,551,61564ビット符号なし整数
9±1.18×10-38 ~ ±3.4×1038IEEE 32ビット浮動小数点数
10±2.23×10-308 ~ ±1.80×10308IEEE 64ビット浮動小数点数
データタイプ
R → S1HB!
R ← S1005004<CR><LF>
R → S1DB0!
R ← S0x31 0x04 0x00 0x03 0xFF 0xFF 0x01 0x00 0xC2 0xAC
R → S1DB1!
R ← S0x31 0x08 0x00 0x09 0xC3 0xF5 0x48 0x40 0x00 0x00 0x80 0x3F 0x3B 0x6E
R → S1DB2!
R ← S0x31 0x00 0x00 0x00 0x0E 0xFC
通信例
目次