Hobby Lab 趣味のモノ作り実験のサイトです。
部品 プロセッサー他 CH32V test_ModBus
1 概要
2 MODBUSを使う
 2.1 スレーブ側
 2.1.1 フレーム構造
 2.1.2 DeviceAddress
 2.1.3 Function
 2.1.4 DataAddress & Register
 2.1.5 CRC
 2.2 マスター側
 2.2.1 フレーム構造
3 MODBUSを使う

Sf:Pt プロトコル関係
SfPt:MODBUS

Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735
PrO:オペアンプ  LM324
 LM358
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Old Processor他

1 概要

ModBusを使用したスレーブプログラムを作成する。
今回のスレーブでは、1ーWireの温度素子 DS-18B20 を 8個まで接続できるものを作成する。




2 MODBUSを使う

2.1 スレーブ側

2.1.1フレーム構造

No Byte0123~(N*2)+14~(N*2)+2N*2+3N*2+4
項目Device
Address
FunctionData数 = N Hi
Register
Lo
Register
Hi CRCLo CRC
スレーブの送信バッファーは 最大 133Byte必要 理由は以下による。
スレーブからマスターへ送るデータは
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です。

2.1.3 Function

Function Code内  容
0x03Read Holding Registers :ホールディングレジスタ(16ビットの値、読み書き可能)の読み出し。
0x04Read Input Registers :インプットレジスタ(16ビットの値、読み出し専用)の読み出し。
0x06Write Single Holding Register :単一のホールディングレジスタへの書き込み。

2.1.4 DataAddress & Register

 1 デスクリートレジスタ
使用していない。

 2 ホールディングレジスタ

※MCUに0x000の元に戻すリセットスイッチを設けること


Data
Address
項目内容
Hi RegisterLo Register
0x0000DeviceAddress他※1 通信スピードDeviceAddress
0x0001装置使用※2参照
0x0002温度素子全体Hi温度閾値Lo温度閾値
0x0003温度素子全体0x00変換分解bitなど
※1 通信スピード枠の値と通信スピード(bps)
dec(bps)Hex
0x009600 0x00002580
0x0119200 0x00004B00
0x0238400 0x00009600
0x0357600 0x0000E100
0x041152000x0001D1A0
0x052304000x00038400
0x064608000x00070800
0x065760000x0008CA00
※2 ビット情報・操作
装置の自動計測・計測停止と1-Wireの電源入・切等の状態および操作
Data
Address
Registerbit項目内容
0x0001Lob0000000x1-Wire温度計自動計測
0x0001Lob000000x01-Wire温度計電圧入
0x0001Hib0000000x装置DeviceAddress他変更
0x0001Hib000000x0温度閾値、変換分解bit変更

その他
Register項目備考
0x001064bitID 温度0-1※2 64bit ID28Byte = Data数 4
0x001164bitID 温度0-2※2
0x001264bitID 温度0-3※2
0x001364bitID 温度0-4※2
0x001464bitID 温度1-1※2
0x001564bitID 温度1-2※2
0x001664bitID 温度1-3※2
0x001764bitID 温度1-4※2
0x001864bitID 温度2-1※2
0x001964bitID 温度2-2※2
0x001A64bitID 温度2-3※2
0x001B64bitID 温度2-4※2
0x001C64bitID 温度3-1※2
0x001D64bitID 温度3-2※2
0x001E64bitID 温度3-3※2
0x001F64bitID 温度3-4※2
0x002064bitID 温度4-1※2
0x002164bitID 温度4-2※2
0x002264bitID 温度4-3※2
0x002364bitID 温度4-4※2
0x002464bitID 温度5-1※2
0x002564bitID 温度5-2※2
0x002664bitID 温度5-3※2
0x002764bitID 温度5-4※2
0x002864bitID 温度6-1※2
0x002964bitID 温度6-2※2
0x002A64bitID 温度6-3※2
0x002B64bitID 温度6-4※2
0x002C64bitID 温度7-1※2
0x002D64bitID 温度7-2※2
0x002E64bitID 温度7-3※2
0x002F64bitID 温度7-4※2
0x0030Hi,Lo閾値 温度0
0x0031Hi,Lo閾値 温度1
0x0032Hi,Lo閾値 温度2
0x0033Hi,Lo閾値 温度3
0x0034Hi,Lo閾値 温度4
0x0035Hi,Lo閾値 温度5
0x0036Hi,Lo閾値 温度6
0x0037Hi,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 ByteLo Register Byte備考
7654321076543210
0x00011-Wire
温度計
応答無し----------------76543210装置No
0x0001CRC異常76543210----------------

2.1.5 CRC


2.2 マスター側

2.2.1 フレーム構造

8Byte固定です。
NoBytrs01234567
項目Device
Address
FunctionDataAddresRegisterCRC
TopLoTopLoTopLo
Ragisterについて
ファンクションが 0x02,0x03,0x04 は
読み出したいラストData Hi Address Data Lo Addressを入れる。ただしスレーブが返答する最大データに注意して設定する必要がある。
ファンクションが 0x05、0x07 は
上表のとおり2Byteデータを入力すること。





































更新日 2025/12/20 11:42  管理者 平林 剛Hirabayashi Takeshi