SimpleModbusの概要
SimpleModbusは、Arduinoプラットフォーム用に開発されたModbus RTUプロトコルライブラリのセットです。Google Code Archive(プロジェクトはアーカイブされている。Juan Besterによって開発され、SimpleModbusMaster(マスターライブラリ)とSimpleModbusSlave(スレーブライブラリ)の2つの独立したArduinoライブラリを含んでいる。プロジェクト名には“Simple”がありますが、Modbus RTU Communicationで最も一般的に使用される関数コードをカバーする機能を提供し、Arduino初心者やラピッドプロトタイピングに最適です。
⚠️注意点は:SimpleModbusプロジェクトはアクティブに更新されません。新しいプロジェクトには、より近代的なものを推奨する。Modbus RTU for Arduinoライブラリライブラリ名は“Modbus”またはesp-modbus(ESP32プラットフォーム)しかし、SimpleModbusのコードはシンプルでわかりやすく、Modbusプロトコル実装を学ぶための入門書として貴重です。
SimpleModbusサポートされる機能
- SimpleModbusMasterFC 01
- SimpleModbusSlaveFC03(リードホールドレジスタ)およびFC16(ライトマルチレジスタ)をサポート
- ハードウェア要件Arduino + RS-485変換モジュール(MAX485など)
ハードウェア接続
ArduinoはMAX485モジュールを介してRS-485バスに接続する。典型的な配線方法:
| MAX 48 5ピン | Arduino Uno | 説明書は |
|---|---|---|
| VCC | 5V | パワー·パワー |
| GND | GND | 土地のこと。 |
| RO | RX (D0) | データ受信→ Arduino RX |
| DI | TX (D1) | データ送信:ArduinoのTX |
| RE | D2 | 受信イネーブル(低効率) |
| DE | D2 | 送信イネーブル(高効率)、REとに同一 IOに |
| A | Aバス+WWN | RS-485Aライン差動+ |
| B | Bバス- | RS-485Bライン(差動-) |
️RS-485バスの両端に120Ωの終端抵抗(A-B間)を追加する必要があります。さもなければ、長距離通信では信号反射が発生し、データエラーにつながります。
SimpleModbusSlaveの例:Modbus RTUスレーブとしてのArduino
#include SimpleModbusSl.h>
//保持レジスタ配列を定義する(10個のレジスタ)
enum {
TEMP_REG = 0 temperature(x 10)
HUMIDITY_REG 湿度(x 10)
COIL_、 //コイル状態
SETPOINT、 //設定値
// ...より多くのレジスタ。
TOTAL_REGS = 10
};
unsigned int holdingRegs[TOTAL_REGS];
void setup {
//RS-485 方向制御ピンを設定する
pinMode 2、pinMode 2、;
// SimpleModbusSlave引数
// 1。レジスタ配列アドレス
// 2.。レジスタの数
// 3.。送信イネーブルピン
// 4。送信イネーブル有効レベル
// 5。駅からの住所
// 6。ボーレート
【7】。検証(0=検証なし)
mod_ure hingRegs TOTAL_REGS
2, // TXenピン
HIGH、 // TXEN Highで送信
1, //駅からのアドレス
9600, //ボーレート
0 - 0です。 //チェックアウト
}
void loop {
//センサデータの更新(アナログ)
holdingRegs[TEMP_REG] = analogRead A0/ 2; // temperatureシミュレーション
holdingRegs[HUMIDITY_REG] = analogRead A1/ 3;
holdingRegs[COIL_STATUS] = digitalRead 3;
//Modbusリクエストの処理
mod_update;
}SimpleModbusMasterの例スレーブデータの読み込み
#include SimpleModbusMaster.h>
#define TOTAL_NO_OF_REGISTERS 2
unsigned int holdingRegs[TOTAL_NO_OF_REGISTERS];
void setup {
Serial.begin(96 00);
// SimpleModbusMaster引数
// 1。ローカルレジスタ配列
// 2.。読み出し/书き込みレジスタ数
// 3.。送信イネーブルピン
// 4。送信イネーブル有効レベル
mod_ure hingRegs TOTAL_NO_OF_ISTERS
2, // TXenピン
HIGH; // TXEN Highのとき送信
}
void loop {
//スレーブアドレス1、スタートアドレス0、2つのホールドレジスタを読み出す
unsigned char result = modbus_read_holding_registers 1,0,2;
if result == 0 {
Serial.print "temperature";
Serial.print holdingRegs[0] / 10.0;
Serial.print "°C、湿度";
Serial.print holdingRegs[1] / 10.0;
Serial.println "%";
(エルゼ)
Serial.print "Modbus読み取りに失敗しました。エラーコード";
Serial.println result;
}
delay 1000;
}SimpleModbus vs現代の代替案
SimpleModbusプロジェクトは数年前に更新をStopし、最新のArduinoプロジェクトは以下の代替案を推奨している。
| クワの名前 | プラットフォームは | 特徴は |
|---|---|---|
| ArduinoModbus | Arduino(公式サイト) | Arduinoの公式メンテナンス、RTUとTCPのサポート、Arduino IDEライブラリマネージャのワンクリックインストール |
| Modbus-Master-Slave-for-Arduino | Arduino | マスターとスレーブを同時にサポートし、機能コードは完全にカバーし、GitHubのアクティブな更新。 |
| esp-modbus | ESP32 / ESP8266 | Modbus RTU/TCP/ASCIIをサポートするEspressif公式ライブラリ、優れたパフォーマンス |
| SimpleModbus | Arduino | 学習に適していますが、Stopします。 |
ESP32 上のModbus RTU Communication(最新のソリューション)
ESP32プラットフォームを使用している場合は、Espressif公式のesp-modbusライブラリをお勧めします。以下は最小の例です。
// ESP32はHardware Serial + MAX485を使用
#include Arduinoを含む>
//RS-485制御ピンの定義
#define RXD 2 16 //ESP 32 RX 2
#define TXD 2 17 //ESP 32 TX2
#define DE_RE 4 // RS-485 方向制御
ware
void setup {
Serial.begin 115200;
modbusSerial.begin(96 00、SERIAL_8 N 1、RXD 2、TXD 2);
pinMode DE_RE、;
digitalWrite DE_RE、LOW; //デフォルト受信モード
}
void loop {
//Modbus RTUリクエストの送信(手動フレーム構築)
uint8_t request[] = {
0 x 0 1、 //駅からのアドレス
0 x 0 3、 //関数コード(リードホールドレジスタ)
0x00 0x00//開始アドレス
0 x 0 0、0 x 0 2 //2レジスタを読み込む
};
uint16_t crc = calculateCRC request 6;
request[6] = crc 0 xFF;
request[7] = crc 8;
送信モードに切り替えます。
digitalWrite DE_RE、HIGH;
delayMicroseconds 100;
modbusSerial.write request 8;
modbusSerial.flush;
受信モードに戻る。
digitalWrite DE_RE、LOW;
//応答を待ち
delay(500);
while modbusSerial.available {
Serial.printf " % 02X" modbusSerial.read;
}
Serial.println;
delay 2000;
}Arduino公式Arduino Modbusライブラリ
Arduino IDEでライブラリマネージャ(Sketch → Include Library → Manage Libraries)を開き、検索します。"ArduinoModbus"インストールできます。Arduino ModbusはModbus RTU(RS-48 5)とModbus TCP(WiFi/Ethernet)をマスターモードとスレーブモードでサポートしています。
#include Arduino RS485.h>
#include Arduino Modbus.h>
void setup {
Serial.begin(96 00);
RS-485の初期化
RS485.begin(96 00);
//Modbus RTUスレーブ(アドレス1)を起動
Modbus RTUServer.begin(1,96 00);
//保持レジスタの設定
ModbusRTUServer.configureHoldingRegisters 0 10;
}
void loop {
//Modbusリクエストの送信
ModbusRTUServer.poll;
//レジスタ値を更新
int orValue = anRead A0;
ModbusRTUServer.hingRegister0 orValue;
}よくある質問のチェック
Communicationが全く応答しない
- MAX485 DE/REピンの方向切り替えロジックが正しいことを確認します(送信時HIGH、受信時LOW)。
- ボーレートとスレーブアドレスがプライマリ·ステーションの構成と一致していることを確認する
- USBからRS-485モジュール+シリアルアシスタントでバスデータを監視し、信号がexistenceするかどうかを確認する
- A/Bラインが反転しているかどうかを確認します(マルチメータで差動電圧を測定:AとBが正電圧になるとバスがアイドルになります)。
時折データまたはCRCエラーを失う
- RS-485バスの両端に120Ωの終端抵抗があるかどうかを確認します
- ボーレートを下げる試み(4800または2400)、シグナルインテグリティ要因を除外
- バス長の短縮またはリピータの追加
- 送信完了確認から受信切り替えまでに十分な遅延(少なくとも1文字)を残すこと。
概要まとめ
初期のArduino Modbus RTUライブラリとしてSimpleModbusは、コードが簡潔で機能が明確で、初心者がModbusプロトコルの実装原理を理解するのに適している。しかし、実際のプロジェクトでは、よりアクティブで機能的な代替手段が推奨されます。Arduinoの公式ライブラリであるArduino Modbus(汎用Arduinoプラットフォーム)またはesp-modbus(ESP32/ESP 826 6プラットフォーム)です。どのライブラリを選択しても、Modbus RTU Communicationのコア原理(スレーブアドレス、ファンクションコード、レジスタマッピング、CRCチェック)は一貫しています。
Leave a Reply