RisalDash RisalDash

دليل · RS-485 · Modbus

اقرأ حساسات صناعية على بُعد 1200 م عبر RS-485 وModbus RTU

يستسلم I²C وUART العادي بعد متر أو مترين. حين تحتاج الوصول إلى حساس عبر حظيرة أو غرفة مرجل أو أرضية مصنع — عشرات العُقد ومئات الأمتار وضوضاء كهربائية — فالجواب هو RS-485، واللغة المستخدمة فوقه عادةً هي Modbus RTU. وحدة MAX485 بدولار واحد مع ESP32 توصلانك إلى هدفك.

RS-485Modbus RTUMAX485ESP32Arduinoصناعي

RS-485 ليس بروتوكولاً جديداً — إنه نفس إطار UART، فقط مُرسَل عبر زوج مجدول بمستويات تفاضلية، مثل CAN. من هنا يأتي المدى ومناعة الضوضاء. إن كانت الفكرة جديدة عليك، فألقِ نظرة أولاً على قسم RS-232 / RS-485 من الشرح التفاعلي للنواقل — فهو يُظهر على راسم الذبذبات لماذا يتفوّق التفاضلي على أحادي الطرف.

لماذا RS-485 بدلاً من UART

توصيل وحدة MAX485

وحدة MAX485 هي مرسل-مستقبِل: UART من جهة، وزوج A/B الخاص بـ RS-485 من الجهة الأخرى. الطرف الوحيد غير البديهي هو الاتجاه: يُوصَل DE (تمكين المرسِل) وRE (تمكين المستقبِل) معاً ويُقادان بطرف GPIO — HIGH للإرسال، LOW للاستقبال.

وحدة MAX485               ESP32
-----------              -----
RO  (خرج المستقبِل)  -->  RX  (مثلاً GPIO16)
DI  (دخل المرسِل)    <--  TX  (مثلاً GPIO17)
DE + RE (موصولان)    <--  DIR (مثلاً GPIO4)   // HIGH = إرسال، LOW = استقبال
VCC                 -->  5V (الوحدة) / توجد نسخ آمنة لمنطق 3V3
GND                 -->  GND
A / B  -->  زوج مجدول إلى الناقل (120 Ω عند كل طرف بعيد)
ESP32 موصّل بمحوّل RS-485 من نوع MAX485 — RO إلى RX وDI إلى TX وDE وRE مربوطان بطرف اتجاه GPIO وA وB إلى زوج الناقل الملتوي
توصيل MAX485: ‏RO ← RX، ‏DI ← TX، ‏DE+RE إلى طرف اتجاه واحد، وA/B إلى الناقل. مبنيّ في BoardLab.

قاعدتان عتاديّتان تُوقعان الجميع: ضع مُنهياً 120 Ω عند كل من الطرفين البعيدين للناقل (لا على كل عُقدة)، وحافظ على A→A وB→B على طول الخط بالكامل. على النواقل الطويلة أو «الهادئة» أضِف مقاومات انحياز لتستقر الخط في السكون على مستوى محدد.

Modbus RTU في شاشة واحدة

Modbus بروتوكول «سيّد/تابع» بالغ البساطة: السيّد يسأل، تابع واحد يجيب، وكل إطار ينتهي بـ CRC. تحتاج غالباً إلى رمزي دالة فقط — 0x03 (قراءة سجلّات holding) و 0x04 (قراءة سجلّات input). إليك ESP32 يقرأ سجلّين من التابع رقم 1 باستخدام مكتبة ModbusMaster، مع قلب طرف الاتجاه تلقائياً:

#include <ModbusMaster.h>
#define DIR 4                       // طرف الاتجاه DE+RE
ModbusMaster node;

void preTx()  { digitalWrite(DIR, HIGH); }   // تشغيل المرسِل قبل الإرسال
void postTx() { digitalWrite(DIR, LOW);  }   // العودة إلى الاستماع بعده

void setup() {
  pinMode(DIR, OUTPUT); digitalWrite(DIR, LOW);
  Serial2.begin(9600, SERIAL_8N1, 16, 17);   // UART لـ RS-485
  node.begin(1, Serial2);                     // عنوان التابع 1
  node.preTransmission(preTx);
  node.postTransmission(postTx);
}

void loop() {
  // قراءة سجلّين من نوع holding بدءاً من 0x0000 (رمز الدالة 0x03)
  if (node.readHoldingRegisters(0x0000, 2) == node.ku8MBSuccess) {
    uint16_t temp = node.getResponseBuffer(0);
    uint16_t hum  = node.getResponseBuffer(1);
    Serial.printf("temp=%u  hum=%u\n", temp, hum);
  }
  delay(1000);
}

هذا هو النمط بالكامل: وجّه المكتبة إلى UART الخاص بك، وأعطِها استدعاءات طرف الاتجاه، ثم استدعِ readHoldingRegisters(). استبدِل خريطة سجلّات حساسك من ورقة بياناته.

حين لا يعمل — المشتبه بهم المعتادون

اضبط الزوج والمُنهيات وطرف الاتجاه بشكل صحيح، وسيتمكّن ESP32 واحد من استطلاع مبنى كامل من حساسات Modbus — عدّادات طاقة، ومجسّات حرارة، ومتحكمات PLC — عبر زوج مجدول واحد.

شاهد كيف يحمل الزوج التفاضلي بايتاً حيث يعجز UART العادي.