SDI-12とは
SDI-12(Serial/Digital Interface at 1200 baud)は3線式のシリアル通信規格です。レコーダーに複数台のセンサーを数珠繋ぎ(デイジーチェーン)して計測する用途で使用されます。本インターフェースは通信と電源供給を兼ねており、低コスト、低消費電力なシステムに向いています。
SDI-12バスの特徴
- DC 12Vを供給します。
- 半二重通信です。
- 伝送速度は1200bpsです。
電気特性
シリアルデータライン
シリアルデータラインは半二重であり、スリーステートバッファーです。送信データの電圧レベルは下表のとおりです。
状態 | 電圧範囲 |
---|---|
0 | -0.5~1.0 V |
1 | 3.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文字が、レコーダーが通信する相手のセンサーを表します。
- 自身へのコマンドではないと判断すると、センサーは省電力モードに移行します。
一般的な測定シーケンス
- レコーダーはブレークを使用して、SDI-12バス上のすべてのセンサーを起動します。
- レコーダーはアドレスを指定して、特定のセンサーに測定を行うよう指示します。
- 指定されたセンサーは15ミリ秒以内に応答し、測定データを準備するのに掛かる最大時間を返します。
- 測定データをすぐに利用できる場合、レコーダーはセンサーに測定値を返すよう要求します。
測定に時間が掛かる場合、レコーダーはセンサーから測定完了の合図を待ちます。その後、レコーダーはセンサーに測定データを返すよう要求します。 - センサーは測定データを返します。
使用可能な文字
データラインを流れるデータは、印刷可能なASCII文字である必要があります。ただしこれには3つの例外があります。
- コマンドの応答の最後は「CR (0Dh)」と「LF (0Ah)」で終わります。
- CRC。
- 大容量バイナリーコマンドによる応答。
デバイスアドレス
各コマンドの最初の文字はセンサーアドレスです。同様に、応答の最初の文字もアドレス。これによりレコーダーは、正しいセンサーからの応答であることを確認します。
センサーアドレスに使用できる文字は、次のとおりです。
- 「0」:デフォルトのアドレスです。
- 「1」~「9」
- 「A」~「Z」
- 「a」~「z」
コマンド
すべてのレコーダーとセンサーは下表のコマンドをサポートする必要があります。
コマンド名 | 追加 ver. | コマンド | 応答 |
---|---|---|---|
Acknowledge Active | a! | a<CR><LF> | |
Send Identification | aI! | allccccccccmmmmmmvvvxxx...xx<CR><LF> | |
Change Address | 1.2 | aAb! | b<CR><LF> |
Address Query | 1.2 | ?! | a<CR><LF> |
Start Measurement | aM! | atttn<CR><LF> | |
Start Measurement and Request CRC | 1.3 | aMC! | atttn<CR><LF> |
Send Data | aD0! ... aD9! | a<values><CR><LF> or a<values><CRC><CR><LF> | |
Additional Measurements | aM1! ... aM9! | atttn<CR><LF> | |
Additional Measurements and Request CRC | 1.3 | aMC1 ... aMC9! | atttn<CR><LF> |
Start Verification | aV! | atttn<CR><LF> | |
Start Concurrent Measurement | 1.2 | aC! | atttnn<CR><LF> |
Start Concurrent Measurement and Request CRC | 1.3 | aCC! | atttnn<CR><LF> |
Additional Concurrent Measurements | 1.2 | aC1! ... aC9! | atttnn<CR><LF> |
Additional Concurrent Measurements and Request CRC | 1.3 | aCC1! ... aCC9! | atttnn<CR><LF> |
Continuous Measurements | 1.2 | aR0! ... aR9! | a<values><CR><LF> |
Continuous Measurements and Request CRC | 1.3 | aRC0! ... aRC9! | a<values><CRC><CR><LF> |
以降の通信例において「R → S」はレコーダーからセンサーに送信するコマンド、「R ← S」はセンサーからの応答を表します。
Acknowledge Active Command (a!)
SDI-12バス上にセンサーが存在しているかの確認に使用します。
R → S | 0! |
R ← S | 0<CR><LF> |
Send Identification Command (aI!)
センサーのSDI-12互換性レベル、型式、ファームウェアバージョンなどを取得します。
コマンド | 応答 | ||
---|---|---|---|
aI! | allccccccccmmmmmmvvvxxx...xxx<CR><LF> | ||
a | センサーアドレス。 | a | センサーアドレス。 |
I | コマンド。 | ll | 対応するSDI-12バージョン。「1.4」であれば「14」となります。 |
cccccccc | 8文字でベンダーIDを示します。通常は会社名の略称などを入れます。 | ||
mmmmmm | 6文字でセンサー型式を示します。 | ||
vvv | 3文字でセンサーバージョンを示します。 | ||
xxx...xx | その他自由に使える最大13文字の領域です。 |
R → S | 0! |
R ← S | 013NRSYSINC1000001.2101<CR><LF> |
Address Query Command (?!)
センサーのアドレスを確認します。 ?コマンドを受けたすべてのセンサーは、自身のアドレスを返します。?コマンドはレコーダーとセンサーを1対1で接続した状態で使用する必要があります。複数台のセンサーを接続した状態で使用すると、応答が競合します。
R → S | ?! |
R ← S | 0<CR><LF> |
Change Address Command (aAb!)
センサーのアドレスを変更します。 このコマンドに応答した後、センサーは1秒間他のコマンドに応答する必要はありません。その間にセンサーは、新しいアドレスを不揮発性メモリーに書き込みます。
コマンド | 応答 | ||
---|---|---|---|
aAb! | b<CR><LF> | ||
a | 現在のセンサーアドレス。 | b | 変更後のセンサーアドレス。 |
A | コマンド。 | ||
b | 変更後のセンサーアドレス |
R → S | 0A1! |
R ← S | 1<CR><LF> |
Start Measurement Command (aM!)
センサーに測定を行うよう指示します。
コマンド | 応答 | ||
---|---|---|---|
aM! | atttn<CR><LF> | ||
a | センサーアドレス。 | a | センサーアドレス。 |
M | コマンド。 | ttt | センサーが測定データを準備できるまでの時間[秒]です。 「000」の場合、すぐに測定データを取得できます。 ttt時間のカウントは応答を返してから開始します。 ttt時間が経過する前に測定データを用意できた場合、レコーダーにサービスリクエストを送信します。 |
n | Dコマンドで測定データを返す数。[1 – 9] |
R → S | 0M! |
R ← S | 00101<CR><LF> |
… | |
R ← S | 0<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時間のカウントは応答を返してから開始します。 |
nn | Dコマンドで測定データを返す数。 |
R → S | 0C! |
R ← S | 00101<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 → S | 1M! |
R ← S | 10001<CR><LF> |
R → S | 1D0! |
R ← S | 1+3.14<CR><LF> |
R → S | 2M! |
R ← S | 20053<CR><LF> |
… | |
R ← S | 2<CR><LF> |
R → S | 2D0! |
R ← S | 2+3.14+2.718+1.414<CR><LF> |
R → S | 3M! |
R ← S | 30359<CR><LF> |
… | |
R ← S | 3<CR><LF> |
R → S | 3D0! |
R ← S | 3+1.11+2.22+3.33+4.44+5.55+6.66<CR><LF> |
R → S | 3D1! |
R ← S | 3+7.77+8.88+9.99<CR><LF> |
Continuous Measurements (aR0! … aR9!)
シャフトエンコーダーなど、測定対象の現象を継続的に監視するセンサーには、測定開始(M)コマンドは必要ありません。R コマンド(R0 … R9)で直接読み取ることができます。このRコマンドの応答は、Dコマンドと同じです。
R → S | 1R0! |
R ← S | 1+3.14<CR><LF> |
センサーがRコマンドに対応していない場合、「a<CR><LF>」を返します。
Additional Measurement Commands (aM1! … aM9!)
追加のMコマンド(M1…M9)はセンサーに対して異なる測定要求や、キャリブレーションを実行するよう指示するために用います。追加のMコマンドの応答は、Mコマンドと同じです。Dコマンドでデータを収集してください。
R → S | 0M1! |
R ← S | 00011<CR><LF> |
… | |
R ← S | 0<CR><LF> |
R → S | 0D0! |
R ← S | 0+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 → S | 0V! |
R ← S | 00011<CR><LF> |
… | |
R ← S | 0<CR><LF> |
R → S | 0D0! |
R ← S | 0+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)
- 「0+3.14」をCRC-16計算すると「0xFC5A」となります。
- 2進数では「1111 1100 0101 1010」です。
- 3文字に分割します。「1111」「11 0001」「01 1010」
- 0x40とORを取ります。「0100 1111」「0111 0001」「0101 1010」
- 結果<CRC>は「OqZ」となります。
R → S | 0MC! |
R ← S | 00001<CR><LF> |
R → S | 0D0! |
R ← S | 0+3.14OqZ<CR><LF> |
拡張コマンド
これまで紹介してきたコマンドだけでは、キャリブレーションなどの制御が不十分である場合があります。このようなときのために、各社独自の拡張コマンドを用意している場合があります。
- 通常コマンドと同じく、センサーアドレスで始まり「!」で終わること。
- 通常応答と同じく、センサーアドレスで始まり<CR><LF>で終わること。
- コマンド名の先頭に「X」を付けることが推奨されています。現時点では仕様として明記されていませんが、将来仕様化される可能性があります。
複数行のテキストを返す拡張コマンド
複数行のテキストを返す拡張コマンドの仕様です。
- テキストの開始に「STX (02h)」を、テキストの終わりに「ETX (03h)」を配置します。
- センサーアドレス、<STX>、<CR>、<LF>、<ETX>を除く各行のテキストは75文字以内であること。
- <CRC>を付加することはできません。
- 各テキスト行の送信間隔は150ミリ秒以内であること。次のテキスト行の最初の1ビットが150ミリ秒以内に受信されない場合、レコーダーはテキストの終わりと判断します。
R → S | 0XHELP! |
R ← S | 0<STX>This is the first line of text.<CR><LF> |
R ← S | This is the second line of text.<CR><LF> |
R ← S | This is the third and final line of text.<CR><LF><ETX> |
大容量コマンド
同時測定(C)コマンドを拡張して、センサーから最大999個のパラメーターを取得することが可能となります。
コマンド名 | 追加 ver. | コマンド | 応答 |
---|---|---|---|
High-Volume ASCII | 1.4 | aHA! | atttnnn<CR><LF> |
High-Volume Binary | 1.4 | aHB! | atttnnn<CR><LF> |
High-Volume ASCII Command (aHA!)
HAコマンドのCコマンドと比較した特徴は下記のとおりです。
- Dコマンドは最大999まで指定できます。(aD0! … aD999!)
- 「D」に続く数字に「0」を入れてはいけません。
- Dコマンド応答の<values>の最大文字数は75文字です。
- Dコマンドの応答には必ず<CRC>が付きます。
R → S | 0HA! |
R ← S | 0045012<CR><LF> |
R → S | 1CC! |
R ← S | 101504<CR><LF> |
R → S | 1D0! |
R ← S | 1+1.23+2.34+345+4.4678KoO<CR><LF> |
R → S | 1CC! |
R ← S | 0+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バイト |
データタイプ | レンジ | サイズ |
---|---|---|
0 | 無効な要求 | データなし |
1 | -128 ~ 127 | 8ビット符号あり整数 |
2 | 0 ~ 255 | 8ビット符号なし整数 |
3 | -32,768 ~ 32,767 | 16ビット符号あり整数 |
4 | 0 ~ 65,535 | 16ビット符号なし整数 |
5 | -2,147,483,648 ~ 2,147,483,647 | 32ビット符号あり整数 |
6 | 0 ~ 4,294,967,295 | 32ビット符号なし整数 |
7 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 64ビット符号あり整数 |
8 | 0 ~ 18,446,744,073,709,551,615 | 64ビット符号なし整数 |
9 | ±1.18×10-38 ~ ±3.4×1038 | IEEE 32ビット浮動小数点数 |
10 | ±2.23×10-308 ~ ±1.80×10308 | IEEE 64ビット浮動小数点数 |
R → S | 1HB! |
R ← S | 1005004<CR><LF> |
R → S | 1DB0! |
R ← S | 0x31 0x04 0x00 0x03 0xFF 0xFF 0x01 0x00 0xC2 0xAC |
R → S | 1DB1! |
R ← S | 0x31 0x08 0x00 0x09 0xC3 0xF5 0x48 0x40 0x00 0x00 0x80 0x3F 0x3B 0x6E |
R → S | 1DB2! |
R ← S | 0x31 0x00 0x00 0x00 0x0E 0xFC |