1 概要
ModBusを使用したスレーブプログラムを作成する。
今回のスレーブでは、1ーWireの温度素子 DS-18B20 を 8個まで接続できるものを作成する。
今回のスレーブでは、1ーWireの温度素子 DS-18B20 を 8個まで接続できるものを作成する。
2 MODBUSを使う
2.1 スレーブ側
2.1.1フレーム構造
| No Byte | 0 | 1 | 2 | 3~(N*2)+1 | 4~(N*2)+2 | N*2+3 | N*2+4 |
|---|---|---|---|---|---|---|---|
| 項目 | Device Address | Function | Data数 = N | Hi Register | Lo Register | Hi CRC | Lo CRC |
スレーブの送信バッファーは 最大 133Byte必要 理由は以下による。
スレーブからマスターへ送るデータは
1Byte(Device Address) +
1Byte(Function) +
1Byte(Data数) +
128Byt(最大レジスター数 64×2) +
2Byte(CRC) = 133Byte
バッファーの数を確保できない場合は、プログラムで制限するとともに取り扱い説明書にData数の最大値を表記しておく必要がある。
なお
Data数 n = 単位は1Byteです。
ModBusのレジスターのデータは通常2Byteなので通常最低値は n = 2 となります。
1Byte(Device Address) +
1Byte(Function) +
1Byte(Data数) +
128Byt(最大レジスター数 64×2) +
2Byte(CRC) = 133Byte
バッファーの数を確保できない場合は、プログラムで制限するとともに取り扱い説明書にData数の最大値を表記しておく必要がある。
なお
Data数 n = 単位は1Byteです。
ModBusのレジスターのデータは通常2Byteなので通常最低値は n = 2 となります。
2.1.2 DeviceAddress
ブロードキャストアドレスは0x00です。
ブロードキャストアドレスでは全スレーブで
保持レジスターの書き込みに使用される。
マスターへ返答はしません。
設定できるアドレスの範囲は0x01〜0xF7です。
初期設定は0x01です。
ブロードキャストアドレスでは全スレーブで
保持レジスターの書き込みに使用される。
マスターへ返答はしません。
設定できるアドレスの範囲は0x01〜0xF7です。
初期設定は0x01です。
2.1.3 Function
| Function Code | 内 容 |
|---|---|
| 0x03 | Read Holding Registers :ホールディングレジスタ(16ビットの値、読み書き可能)の読み出し。 |
| 0x04 | Read Input Registers :インプットレジスタ(16ビットの値、読み出し専用)の読み出し。 |
| 0x06 | Write Single Holding Register :単一のホールディングレジスタへの書き込み。 |
2.1.4 DataAddress & Register
1 デスクリートレジスタ
使用していない。
2 ホールディングレジスタ
※MCUに0x000の元に戻すリセットスイッチを設けること
| Data Address | 項目 | 内容 | |
|---|---|---|---|
| Hi Register | Lo Register | ||
| 0x0000 | DeviceAddress他 | ※1 通信スピード | DeviceAddress |
| 0x0001 | 装置使用 | ※2参照 | |
| 0x0002 | 温度素子全体 | Hi温度閾値 | Lo温度閾値 |
| 0x0003 | 温度素子全体 | 0x00 | 変換分解bitなど |
| 値 | dec(bps) | Hex |
|---|---|---|
| 0x00 | 9600 | 0x00002580 |
| 0x01 | 19200 | 0x00004B00 |
| 0x02 | 38400 | 0x00009600 |
| 0x03 | 57600 | 0x0000E100 |
| 0x04 | 115200 | 0x0001D1A0 |
| 0x05 | 230400 | 0x00038400 |
| 0x06 | 460800 | 0x00070800 |
| 0x06 | 576000 | 0x0008CA00 |
※2 ビット情報・操作
装置の自動計測・計測停止と1-Wireの電源入・切等の状態および操作| Data Address | Register | bit | 項目 | 内容 |
|---|---|---|---|---|
| 0x0001 | Lo | b0000000x | 1-Wire温度計 | 自動計測 |
| 0x0001 | Lo | b000000x0 | 1-Wire温度計 | 電圧入 |
| 0x0001 | Hi | b0000000x | 装置DeviceAddress他 | 変更 |
| 0x0001 | Hi | b000000x0 | 温度閾値、変換分解bit | 変更 |
その他
| Register | 項目 | 備考 |
|---|---|---|
| 0x0010 | 64bitID 温度0-1 | ※2 64bit ID28Byte = Data数 4 |
| 0x0011 | 64bitID 温度0-2 | ※2 |
| 0x0012 | 64bitID 温度0-3 | ※2 |
| 0x0013 | 64bitID 温度0-4 | ※2 |
| 0x0014 | 64bitID 温度1-1 | ※2 |
| 0x0015 | 64bitID 温度1-2 | ※2 |
| 0x0016 | 64bitID 温度1-3 | ※2 |
| 0x0017 | 64bitID 温度1-4 | ※2 |
| 0x0018 | 64bitID 温度2-1 | ※2 |
| 0x0019 | 64bitID 温度2-2 | ※2 |
| 0x001A | 64bitID 温度2-3 | ※2 |
| 0x001B | 64bitID 温度2-4 | ※2 |
| 0x001C | 64bitID 温度3-1 | ※2 |
| 0x001D | 64bitID 温度3-2 | ※2 |
| 0x001E | 64bitID 温度3-3 | ※2 |
| 0x001F | 64bitID 温度3-4 | ※2 |
| 0x0020 | 64bitID 温度4-1 | ※2 |
| 0x0021 | 64bitID 温度4-2 | ※2 |
| 0x0022 | 64bitID 温度4-3 | ※2 |
| 0x0023 | 64bitID 温度4-4 | ※2 |
| 0x0024 | 64bitID 温度5-1 | ※2 |
| 0x0025 | 64bitID 温度5-2 | ※2 |
| 0x0026 | 64bitID 温度5-3 | ※2 |
| 0x0027 | 64bitID 温度5-4 | ※2 |
| 0x0028 | 64bitID 温度6-1 | ※2 |
| 0x0029 | 64bitID 温度6-2 | ※2 |
| 0x002A | 64bitID 温度6-3 | ※2 |
| 0x002B | 64bitID 温度6-4 | ※2 |
| 0x002C | 64bitID 温度7-1 | ※2 |
| 0x002D | 64bitID 温度7-2 | ※2 |
| 0x002E | 64bitID 温度7-3 | ※2 |
| 0x002F | 64bitID 温度7-4 | ※2 |
| 0x0030 | Hi,Lo閾値 温度0 | |
| 0x0031 | Hi,Lo閾値 温度1 | |
| 0x0032 | Hi,Lo閾値 温度2 | |
| 0x0033 | Hi,Lo閾値 温度3 | |
| 0x0034 | Hi,Lo閾値 温度4 | |
| 0x0035 | Hi,Lo閾値 温度5 | |
| 0x0036 | Hi,Lo閾値 温度6 | |
| 0x0037 | Hi,Lo閾値 温度7 | |
| 0x0038 | 分解bit 温度0 | 下位byteに格納 |
| 0x0039 | 分解bit 温度1 | 下位byteに格納 |
| 0x003A | 分解bit 温度2 | 下位byteに格納 |
| 0x003B | 分解bit 温度3 | 下位byteに格納 |
| 0x003C | 分解bit 温度4 | 下位byteに格納 |
| 0x003D | 分解bit 温度5 | 下位byteに格納 |
| 0x003E | 分解bit 温度6 | 下位byteに格納 |
| 0x003F | 分解bit 温度7 | 下位byteに格納 |
3 インプットレジスタ
| Register | 項目 | 備考 |
|---|---|---|
| 0x0000 | 温度計接続数 | HiByteは用途無しLoByteに温度計接続数 |
| 0x0001 | 温度計エラー | ※1 |
| 0x0002 | 温度 温度0 | ※1値は符号付きで1/16にすること。 |
| 0x0003 | 温度 温度1 | ※1 |
| 0x0004 | 温度 温度2 | ※1 |
| 0x0005 | 温度 温度3 | ※1 |
| 0x0006 | 温度 温度4 | ※1 |
| 0x0007 | 温度 温度5 | ※1 |
| 0x0008 | 温度 温度6 | ※1 |
| 0x0009 | 温度 温度7 | ※1 |
※1ビット情報
| Data Address | 装置 | 内容 | Hi Register Byte | Lo Register Byte | 備考 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
| 0x0001 | 1-Wire 温度計 | 応答無し | -- | -- | -- | -- | -- | -- | -- | -- | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 装置No |
| 0x0001 | CRC異常 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | -- | -- | -- | -- | -- | -- | -- | -- | ||
2.1.5 CRC
2.2 マスター側
2.2.1 フレーム構造
8Byte固定です。
読み出したいラストData Hi Address Data Lo Addressを入れる。ただしスレーブが返答する最大データに注意して設定する必要がある。
ファンクションが 0x05、0x07 は
上表のとおり2Byteデータを入力すること。
| NoBytrs | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 項目 | Device Address | Function | DataAddres | Register | CRC | |||
| Top | Lo | Top | Lo | Top | Lo | |||
Ragisterについて
ファンクションが 0x02,0x03,0x04 は読み出したいラストData Hi Address Data Lo Addressを入れる。ただしスレーブが返答する最大データに注意して設定する必要がある。
ファンクションが 0x05、0x07 は
上表のとおり2Byteデータを入力すること。
