Modbus ile ESP32 ve C# Master Slave Bağlantı

Projemizde  Modbus ile çalışan bir sensör geliştirilmesi gerekmektedir. Sensör Sıcaklık ve Nem değerlerini okuyarak C# arayüzüne gönderecektir. Bu iş için MCU olarak ESP32 seçilmiştir. Arayüz ise C# ile geliştirilecektir.




C# Modbus kütüphanesi olarak "EasyModbusTCP .NET Package V5.6" kullandım. DLL dosyasını indirdikten sonra projeye referans olarak ekledik. Linki burada.


ESP32 için ise modbus-esp8266 kütüphanesini kullandık. Linki burada.


C# kodları:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


using EasyModbus;


namespace MB_Modbus_TCP_Test_GUI

{

    public partial class Form1 : Form

    {


        ModbusClient mbc;

        bool baglanti = false;


        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            button2.Enabled = false;

            button3.Enabled = false;

        }


        private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                if (!baglanti)

                {

                    mbc = new ModbusClient(textBox1.Text, Convert.ToInt32(textBox2.Text));

                    mbc.Connect();

                    baglanti = true;

                    button1.Text = "Dur";

                    button2.Enabled = true;

                    button3.Enabled = true;

                }

                else

                {

                    mbc.Disconnect();

                    button2.Enabled = false;

                    button3.Enabled = false;

                    button1.Text = "Bağlan";

                }

            }

            catch (Exception)

            {


                MessageBox.Show("IP ve Port Hatasi");

            }            

        }


        private void button2_Click(object sender, EventArgs e)

        {

            mbc.WriteSingleCoil(Convert.ToInt32(textBox3.Text), false);

        }


        private void button3_Click(object sender, EventArgs e)

        {

            mbc.WriteSingleCoil(Convert.ToInt32(textBox3.Text), true);

        }

    }

}



ESP32 kodları:

/*

  Modbus-Arduino Example - Test Led (Modbus IP ESP8266)

  Control a Led on GPIO0 pin using Write Single Coil Modbus Function

  Original library

  Copyright by André Sarmento Barbosa

  http://github.com/andresarmento/modbus-arduino


  Current version

  (c)2017 Alexander Emelianov (a.m.emelianov@gmail.com)

  https://github.com/emelianov/modbus-esp8266

*/


#ifdef ESP8266

#include <ESP8266WiFi.h>

#else //ESP32

#include <WiFi.h>

#endif

#include <ModbusIP_ESP8266.h>


//Modbus Registers Offsets

const int LED_COIL = 100;

//Used Pins

const int ledPin = 0; //GPIO0


//ModbusIP object

ModbusIP mb;


bool led_status = false;


void setup() {

  Serial.begin(115200);


  WiFi.begin("SSID", "PASSWORD");


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }


  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());


  mb.server();


  pinMode(ledPin, OUTPUT);

  mb.addCoil(LED_COIL);

}



void loop() {

  //Call once inside loop() - all magic here

  mb.task();


  //Attach ledPin to LED_COIL register

  digitalWrite(ledPin, mb.Coil(LED_COIL));


  if (led_status != mb.Coil(LED_COIL)) {


    Serial.println(mb.Coil(LED_COIL));

    led_status = mb.Coil(LED_COIL);


  }


  delay(1);

}


Proje dökümanlarını Github dan indirebilirsiniz.