最新情報
ESP32 Modbus 通信 で PLC 制御 (1)
ESP32 とPLC(FP0R)を
ModbusRTU 通信 で 繋げてみようと思います。
ESP32 をマスター
PLC(FP0R)をスレーブとします。
将来的には、RS485で、1:N 通信を考えていますが
手持ちのPLCが、RS232ポートしか持っていないので
テストは、RS232で1:1の通信でテストしてみます。
繋げ方(回路図)です。
PLC(FP0R)
ユニットID:1
通信モード:MODBUSRTU
通信速度:115200
伝送フォーマット:8、N、1 (8bit Non 1)
ラダー図(PLCソフト)、といっても、今回は空っぽ。
これらを、FP0Rへ書き込みます。
ESP32
必要に応じてシリアル(USB)デバッグをしたいので
ESP32 DevKitCの
シリアル2(IO16,IO17)を使用します。
開発環境は
VisualStudioCode + PlatformIO
です。
ModbusRTUのライブラリは
「ModbusMaster」 DocWalkerさんのものを使用させていただきました。
テスト用プログラムは、こんな感じ。
#include <Arduino.h>
#include <ModbusMaster.h> //Library for using ModbusMaster
ModbusMaster node; //object node for class ModbusMaster
uint8_t X_STATE=0;
uint8_t X_STATE_BUF=0;
uint8_t Y0[8];
uint8_t RY_NO;
uint8_t bin[8];
//———————————
void setup()
{
Serial.begin(115200); //Baud Rate as 115200
Serial2.begin(115200); //Baud Rate as 115200
node.begin(1, Serial2); //Slave ID as 1
}
//———————————
void dec2bin(uint8_t num){
uint8_t i;
for(i=0; i<8; i++){ // バッファクリア
bin[i] = 0;
}
for(i=0; num>0; i++){ // Y0入力に対して変換
bin[i] = num % 2; // 配列に格納
num = num / 2;
}
}
//———————————
void loop()
{
// 入力 X0-X7
node.clearResponseBuffer();
X_STATE = node.readDiscreteInputs(0x0000, 8); // 8bit 読込み
X_STATE_BUF = node.getResponseBuffer(0); // 1Byte 出力
//—–
dec2bin(X_STATE_BUF); // X0-X7 入力を配列へ
// コイル出力 Y0–Y7
for (RY_NO=0; RY_NO<8; RY_NO++){
node.writeSingleCoil(RY_NO, bin[RY_NO]);
}
// 確認用 シリアル出力
Serial.print(X_STATE_BUF);
Serial.println();
}
ソース
実験動画
ESP32 で ModbusRTU 使ってPLC操作 – YouTube
PLCは
IOを増設したり
操作画面を取りつけたり
熱電対を取付けられたり
などなど簡単に周辺機器を取り付けられます。
また、工場現場を考慮して作られているのでノイズ耐性も強力です。
超高速な動作など、シビアな条件でなければ
マイコンからPLCを操作して
マイコン、PLCのそれぞれの長所を有効利用しても良いのではないでしょうか?
-
- 2024.09.19
- 薪ストーブ、新城軽トラ市「49番ブース」、出店します。
-
- 2024.01.20
- 薪ストーブ出展 新城消防祭
-
- 2023.11.28
- SDGsへの貢献:薪ストーブ
-
- 2023.11.01
- 薪ストーブ今週末のイベント
-
- 2023.11.01
- 薪ストーブ納品 南信州うるぎ高原 風の森