Modbus RTU وASCII وTCP مع SerialTool
آخر تحديث بواسطة Oliver Reedما هو Modbus
بروتوكول Modbus هو بروتوكول اتصال تسلسلي تم إنشاؤه عام 1979 بواسطة Modicon® (وهي شركة أصبحت الآن جزءًا من مجموعة Schneider Electric) لتمكين الاتصال بين وحدات التحكم المنطقية القابلة للبرمجة (PLC) الخاصة بها. وقد أصبح معيارًا de facto في مجال الاتصالات الصناعية، ويعد اليوم أحد أكثر بروتوكولات الاتصال استخدامًا في العالم بين الأجهزة الإلكترونية الصناعية. وModbus بروتوكول خالٍ من حقوق الملكية، وتُنشر مواصفاته على موقع The Modbus Organization.
بعبارة بسيطة، هو وسيلة تُستخدم لنقل المعلومات عبر الخطوط التسلسلية بين الأجهزة الإلكترونية. يُسمّى الجهاز الذي يطلب المعلومات Modbus Client، بينما تُسمّى الأجهزة التي توفر المعلومات Modbus Server. في شبكة Modbus القياسية يوجد عميل واحد وما يصل إلى 247 خادمًا، ولكل خادم عنوان فريد من 1 إلى 247. ويمكن للعميل أيضًا كتابة المعلومات إلى الخوادم.
صُمم هذا البروتوكول في الأصل للاستخدام الصناعي، لكنه استُخدم مع الوقت أيضًا في مجالات أخرى وأصبح من أكثر البروتوكولات انتشارًا. وحتى اليوم، رغم أن عمره يزيد على 40 عامًا، ما زال موجودًا في العديد من الأجهزة مثل لوحات التشغيل وPLC وأنظمة الأتمتة المنزلية وحتى الأجهزة البسيطة مثل Arduino.
نقل Modbus RTU وASCII عبر الاتصال التسلسلي
عند إنشاء هذا البروتوكول، كان الاتصال مصممًا ليعمل عبر المنفذ التسلسلي، ولهذا السبب تم تضمينه في SerialTool. وغالبًا ما يُستخدم Modbus لربط حاسوب إشرافي بوحدة طرفية بعيدة (RTU) في أنظمة SCADA (Supervisory Control and Data Acquisition). وبحسب صيغة نقل البيانات، ينقسم البروتوكول إلى:
- MODBUS RTU - تُنقل البيانات بصيغة سداسية عشرية.
- MODBUS ASCII - تُنقل البيانات بصيغة ASCII.
تختلف آلية التحقق من الأخطاء في الحالتين: ففي MODBUS RTU يُستخدم CRC (Cyclic Redundancy Check) ويُضاف في نهاية الأوامر، بينما في MODBUS ASCII يُستخدم LRC (Longitudinal Redundancy Check) ويُرسل أيضًا بعد الأوامر.
نقل Modbus TCP
في عام 1999 تم تطوير “Modbus TCP”، وهو معيار مخصص للشبكات التي تستخدم مجموعة بروتوكولات TCP/IP. وعمليًا هو نسخة من Modbus التسلسلي RTU مبنية على TCP/IP، ما يتيح الاتصال عبر شبكات الإنترنت والإنترانت. وفي السنوات الأخيرة أصبح إصدار TCP/IP أكثر استخدامًا لأنه Open Source وسهل التنفيذ ومنخفض التكلفة في التطوير ويتطلب دعمًا عتاديًا محدودًا جدًا.
تختلف آلية التحقق من الأخطاء في الحالتين: ففي MODBUS RTU يُستخدم CRC (Cyclic Redundancy Check) ويُضاف في نهاية الأوامر، بينما في MODBUS ASCII يُستخدم LRC (Longitudinal Redundancy Check) ويُرسل أيضًا بعد الأوامر.
يستخدم بروتوكول Modbus TCP/IP ترميزًا ثنائيًا للبيانات وآلية اكتشاف الأخطاء الخاصة بـ TCP/IP. وعلى عكس Modbus التسلسلي، فإن إصدار TCP/IP موجّه للاتصال ويسمح بإنشاء اتصالات متزامنة مع نفس الـ slave أو مع عدة أجهزة. كما يستخدم Modbus TCP/IP أيضًا نموذج master-slave؛ ويستخدم هذا الاتصال بالإضافة إلى ذلك أربعة أنواع من الرسائل.
يتموضع Modbus في الطبقة السابعة من مكدس ISO/OSI (طبقة التطبيق)، حيث يعرّف تنسيق الرسائل المعروف باسم framing وطريقة نقل البيانات ووظائف التحكم. ويتم الاتصال وفق نموذج client-server. كما يعرّف البروتوكول Protocol Data Unit (PDU) لا تعتمد على طبقة الاتصال الأساسية. أما Application Data Unit (ADU) فتضيف حقولًا إضافية للعنونة والتحكم في الأخطاء.
عميل Modbus في SerialTool (Master / Polling)
SerialTool هو عميل Modbus RTU وASCII وTCP مزود بوظائف polling ومسح السجلات ومراقبة الحركة والرسوم البيانية الحية لاختبار الأجهزة الصناعية وتصحيحها.
يتيح لك Modbus Client الاتصال بجهاز Modbus Slave/server عبر الاتصال التسلسلي (RTU أو ASCII) أو عبر الشبكة (TCP فوق IPv4 أو IPv6)، وقراءة البيانات وكتابتها باستخدام وظائف Modbus القياسية، وإنشاء جهاز Modbus بخريطة خاصة به يمكن تنفيذ polling مجدول عليها.
وداخل الجهاز النموذجي يمكن إضافة بنى Modbus (Discrete Output Coils وDiscrete Input Contacts وAnalog Input Register وAnalog Output Holding Register) وحفظ الجهاز بحيث يمكن إعادة تحميله عند الحاجة. كما يمكن تصدير الجهاز النموذجي الخاص بـ Modbus إلى صيغ Text أو CSV أو PDF لمشاركته بطريقة سهلة وبديهية.
وبعد إنشاء جهاز بخريطة صحيحة، يمكن عرض مخططات في الزمن الحقيقي للقيم المقروءة مباشرة من جهاز Slave عبر polling المجدول.
كما يوفّر SerialTool إمكانية عرض حركة Modbus (Serial وTCP) داخل طرفية مخصصة للحركة المرسلة والمستلمة. وتدعم هذه الطرفية المتقدمة تصدير البيانات والتصفية الفورية للبيانات الداخلة والخارجة.
ويوفر SerialTool أيضًا إمكانية فحص جهاز Slave البعيد عبر وظيفة Modbus Scanner. ومن خلال ضبط المرشحات المناسبة، يمكن محاولة رسم خريطة للجهاز البعيد (Modbus Slave) حتى بدون معرفة السجلات المدعومة حاليًا. وتعد وظيفة Modbus Scanner مفيدة جدًا عندما تريد استكشاف جهاز لا تعرف خصائصه أو تعرفها جزئيًا فقط.
فيما يلي الشاشة الرئيسية لوحدة Modbus في SerialTool:
الشاشة الرئيسية لعميل Modbus في SerialTool
تُبرز الشاشة الرئيسية الوظائف الأساسية في SerialTool وعميل Modbus (Master).
عميل Modbus في SerialTool (Master / Polling)
في الجهة اليسرى من الشاشة يمكنك اختيار وضع الاتصال التسلسلي أو TCP:
شاشة اتصال عميل Modbus
كما ذكرنا سابقًا، ينقسم بروتوكول Modbus التسلسلي إلى نوعين: RTU وASCII. ولكي تتمكن من التواصل بشكل صحيح مع الجهاز البعيد، فمن الضروري في حالة الاتصال التسلسلي معرفة نوع بروتوكول Modbus الذي يدعمه جهاز الـ Slave.
أما اتصال ModBus TCP فيدعم IPv4 وIPv6. ولإعداد اتصال Modbus عبر TCP، يجب ضبط عنوان IP الخاص بالـ slave والمنفذ البعيد المطلوب الاتصال به.
في شاشة الاتصال يوجد معامِلان متعلقان بمهلة الاستجابة التي يجب أن يقدمها جهاز Modbus Slave.
الأول مهلة استجابة عامة (Response Timeout)، وبعد انقضائها يتوقف Client (Master) عن انتظار رد الـ slave، والثاني مهلة تُحسب من آخر بايت تم استلامه من الـ Slave.
محاكاة Modbus ENRON/Daniel
من ضمن إعدادات الاتصال توجد محاكاة ENRON/Daniel (وغالبًا ما تُسمى ببساطة Enron Modbus أو Daniels Modbus)، وهي تشير إلى نوع محدد من بروتوكول الاتصال القياسي Modbus.
وقد طُورت في الأصل من قبل Enron Corporation ونُفذت على نطاق واسع في حواسيب التدفق الخاصة بـ Daniel Measurement and Control. ومع الوقت أصبحت معيارًا فعليًا لقياس السوائل إلكترونيًا (EFM)، خصوصًا في قطاع Oil & Gas.
يؤدي تمكين محاكاة ENRON/Daniel على الجهاز إلى تغيير سلوك Modbus لدعم الخصائص الأساسية التالية:
- 1. التعامل مع بيانات 32-بت داخل سجل واحد: وهذا هو الفرق التقني الأهم. ففي Standard Modbus تكون السجلات 16-بت (2 بايت) ويستلزم الحصول على قيمة 32-بت قراءة سجلين. أما في Enron Modbus فتُخزن قيم 32-بت داخل سجل واحد (4 بايت لكل سجل).
- 2. تعيين خاص للعناوين: يستخدم نطاقات محددة مسبقًا لبيانات 32-بت. فالسلسلة 5000 (مثل 45001 - 45999) مخصصة لـ Long Integers، بينما السلسلة 7000 (مثل 47001 - 47999) مخصصة لـ Floating Points.
- 3. البيانات التاريخية والأحداث: يدعم أوامر خاصة لاستخراج السجلات التاريخية وأرشيفات الإنذارات، بخلاف Modbus القياسي المصمم تقريبًا للقراءة الفورية فقط.
- 4. بدون Offset: يتطابق العنوان المطلوب تمامًا مع رقم السجل، ما يزيل مشكلة “+1 offset” الكلاسيكية الموجودة في Modbus القياسي.
باختصار: تعد هذه المحاكاة أساسية لتجنب أخطاء الاتصال (عدم محاذاة البايتات) عند التعامل مع أجهزة تنقل بيانات 32-بت أصلية في قطاع Oil & Gas.
وظائف عميل Modbus
في الجزء الأوسط من الشاشة ستجد وظائف Modbus التي يدعمها SerialTool.
الوظائف المدعومة في وضع عميل Modbus
يمكن تلخيص وظائف عميل ModBus في الجدول التالي.
| رمز الوظيفة | الإجراء | اسم الجدول / الوصف |
|---|---|---|
| 0x01 | قراءة | Discrete Output Coils |
| 0x02 | قراءة | Discrete Input Contacts |
| 0x03 | قراءة | Analog Output Holding Register |
| 0x04 | قراءة | Analog Input Registers |
| 0x05 | كتابة مفردة | Discrete Output Coil |
| 0x06 | كتابة مفردة | Analog Output Holding Register |
| 0x07 | قراءة | Exception Status |
| 0x08 | تشخيص | تشخيص (Serial Line only) |
| 0x0B (dec 11) | قراءة | Comm Event Counter (Serial Line only) |
| 0x0F (dec 15) | كتابة متعددة | Discrete Output Coils |
| 0x10 (dec 16) | كتابة متعددة | Analog Output Holding Registers |
| 0x11 (dec 17) | تقرير | Server ID (Serial Line only) |
| 0x16 (dec 22) | كتابة بالقناع | Holding Register |
| 0x17 (dec 23) | قراءة/كتابة متعددة | Holding Registers |
| 0x2B / 0x0E (dec 43 / 14) | قراءة | Device Identification |
هياكل بيانات Modbus
تُخزن المعلومات داخل جهاز Server في أربع جداول مختلفة. جدولان يخزنان قيماً منفصلة تشغيل/إيقاف (coils)، وجدولان يخزنان قيماً رقمية (registers). ولكل من coils وregisters جدول قراءة فقط وجدول قراءة/كتابة. يحتوي كل جدول على 9999 قيمة. وكل coil أو contact هو 1 bit وله عنوان بيانات بين 0000 و270E. وكل register هو 1 word = 16 bits = 2 bytes وله أيضًا عنوان بيانات بين 0000 و270E.
| أرقام Coil/Register | عناوين البيانات | النوع | اسم الجدول |
|---|---|---|---|
| 1-9999 | 0x0000 to 0x270E | قراءة/كتابة | Discrete Output Coils |
| 10001-19999 | 0x0000 to 0x270E | قراءة فقط | Discrete Input Contacts |
| 30001-39999 | 0x0000 to 0x270E | قراءة فقط | Analog Input Register |
| 40001-49999 | 0x0000 to 0x270E | قراءة/كتابة | Analog Output Holding Register |
جهاز Modbus
يتيح SerialTool إنشاء جهاز Modbus Slave يمثل خريطة السجلات الخاصة بجهاز الـ Slave الذي تنوي الاتصال به. وتُعد هذه الخريطة مهمة جدًا لأنها تتيح عرض القيم الموجودة في جهاز الـ slave البعيد داخل جدول محلي.
وظائف عميل Modbus
الوظائف المتاحة لعميل Modbus
من شريط الوظائف يمكنك تحميل جهاز تم إنشاؤه مسبقًا بواسطة وظيفة "Load Device"، وحفظ الجهاز الحالي بواسطة "Save Device"، وإضافة سجل واحد بواسطة "Add Item" أو عدة سجلات بواسطة "Add Items" إلى خريطة الجهاز.
إضافة سجلات Modbus إلى خريطة جهاز Modbus
منطقة ذاكرة جهاز Modbus Slave (جهاز Modbus)
بعد إنشاء خريطة جهاز Modbus Slave، يتيح SerialTool حفظها لاستخدامها لاحقًا أو تصدير محتواها بصيغة CSV أو Text أو PDF لمشاركتها ومعالجتها مع أطراف أخرى. تعرض الصورة التالية مثالًا على تصدير خريطة جهاز Modbus Slave:
مثال على تصدير خريطة جهاز Modbus Slave إلى PDF
يمكنك تنزيل ملف PDF من خلال هذا الرابط.
Modbus Polling
إن إنشاء جهاز Modbus Slave يتيح تنفيذ polling، أي القراءة الدورية لبعض سجلات جهاز الـ slave المتصل به.
وللقيام بذلك يجب أولًا إنشاء الـ Slave ورسم خريطته، ثم إضافة السجل أو السجلات التي تريد تنفيذ polling لها، كما هو موضح في الشكل التالي:
توضح الصورة إضافة عنصر إلى polling باتجاه الـ slave
بعد إضافة عنصر واحد أو أكثر إلى polling، يمكن بدء polling للعناصر المرتبطة بقائمة polling.
توضح الصورة العناصر المختارة لعملية polling
الوصول إلى وظائف Modbus
تم تصميم عميل Modbus في SerialTool (Master/Polling) لتنفيذ الوظائف بثلاثة أوضاع:
تنفيذ وظائف Modbus
- "Execute from Device Table" - ينفذ وظيفة Modbus بالاعتماد على خريطة الجهاز.
- "Execute Function" - ينفذ وظيفة Modbus مباشرة ويعرض النتيجة في نافذة السجل.
- "Send Raw Data" - يرسل طلبًا مباشرًا مكوّنًا من بايتات سداسية عشرية وينتظر الاستجابة.
Execute from Device Table
ينفذ هذا الوضع وظيفة Modbus المحددة باستخدام جدول الجهاز الذي تم تحميله أو إنشاؤه محليًا مباشرةً.
ويمكن للمستخدم اختيار نوع مرجع Modbus مثل Coils أو Discrete Inputs أو Holding Registers أو Input Registers، وتحديد عنوان البداية وعدد العناصر المراد قراءتها أو كتابتها، ثم إرسال الأمر إلى الـ slave بنقرة واحدة.
وتتمثل الميزة الأساسية لهذا الوضع في أن النتيجة تُعكس فورًا في خريطة الجهاز، مع تحديث القيم المعروضة في الجدول المحلي.
وبهذه الطريقة يمكن الحصول على تمثيل منظم ومستمر لحالة الجهاز البعيد، وهو أمر مفيد أثناء الاختبار وكذلك أثناء أعمال المراقبة والصيانة.
وعندما يتعلق الأمر بوظيفة كتابة، يتيح SerialTool إعداد البيانات المراد إرسالها بسهولة عبر اختيار نوع البيانات وتنسيق العرض والمحتوى الذي سيتم كتابته إلى السجلات المحددة.
لذلك فإن هذا الوضع مناسب بشكل خاص عندما تريد العمل مباشرة على البنية المنطقية لجهاز Modbus.
Execute Function
يتيح وضع Execute Function تنفيذ وظيفة Modbus عبر اختيارها مباشرة من قائمة أكواد الوظائف المتاحة،
مثل قراءة coils وقراءة discrete inputs وقراءة holding registers وقراءة input registers وعمليات الكتابة المفردة أو المتعددة وغيرها من الوظائف التي يدعمها البروتوكول.
وفي هذه الحالة لا تقتصر العملية على العرض داخل خريطة الجهاز فقط، لأن النتيجة تُعرض أيضًا في منطقة السجل داخل التطبيق.
ويكون هذا الأسلوب مفيدًا جدًا عندما تريد التحقق بسرعة من محتوى الاستجابة المستلمة، أو اختبار وظيفة Modbus معينة، أو تنفيذ اختبارات موجهة على عناوين وكميات متغيرة دون الحاجة إلى تعديل خريطة الجهاز بالضرورة.
كما أن وضع Execute Function مناسب جدًا للتصحيح، لأنه يتيح رؤية نتيجة الأمر المنفذ فورًا، والأخطاء التي يعيدها الـ slave، والمعلومات المرتبطة بالطلب والاستجابة.
Send Raw Data
ترسل هذه الوظيفة أوامر عشوائية إلى الـ slave وتستقبلها بصيغة سداسية عشرية.
وهي تسمح للمستخدم بإدخال تسلسل البايتات يدويًا لإرساله عبر الاتصال النشط، مثل الاتصال التسلسلي أو TCP/IP، دون أن يقوم البرنامج ببناء الإطار تلقائيًا.
وتُعد هذه الوظيفة مفيدة جدًا في الاختبارات المتقدمة والهندسة العكسية والتشخيص والتحقق من أجهزة Modbus والبروتوكولات المتوافقة.
وعمليًا يقوم العميل بإرسال البايتات نفسها التي أدخلها المستخدم، ما يترك تحكمًا كاملًا بمحتوى الحزمة. وهذا يجعل من الممكن محاكاة طلبات مخصصة، أو اختبار استجابات غير طبيعية، أو إرسال إطارات مكتملة أُعدّت يدويًا.
وعند تفعيل خيار انتظار الاستجابة، يمكن لـ SerialTool أيضًا التقاط إطار العودة المستلم من الـ slave وعرضه في سجل الحركة، ما يتيح مقارنة فورية بين البيانات المرسلة والمستلمة.
إرسال بيانات Raw
وظيفة Modbus Scanner
يتضمن SerialTool وظيفة لمسح عناوين Modbus الخاصة بجهاز الـ Slave المتصل.
وتتيح هذه الوظيفة استكشاف نطاق من العناوين بسرعة من عنوان بداية إلى عنوان نهاية، مع إمكانية تحديد كود الوظيفة المستخدم أثناء عملية المسح.
ويكون الماسح مفيدًا بشكل خاص عندما لا تكون خريطة الجهاز البعيد معروفة بدقة، أو عندما تريد التحقق من العناوين الصالحة والعناوين التي تحتوي على بيانات ذات قيمة. ولكل عنوان يتم الاستعلام عنه، يعرض SerialTool في الجدول نوع الوظيفة المستخدمة والعنوان والقيمة المقروءة ونتيجة العملية.
يسرّع هذا الوضع بشكل كبير أعمال التشخيص والتكامل مع أجهزة الجهات الخارجية، لأنه يتيح تحديد مناطق ذاكرة Modbus المستخدمة فعليًا من قبل الـ slave بسرعة وتصدير نتائج المسح لتحليلها لاحقًا أو مشاركتها.
جدول العناوين
مخطط سجلات Modbus الخاصة بالـ Slave
يمكن عرض قيم سجلات Modbus على شكل مخطط.
وتتيح هذه الوظيفة ربط عنصر واحد أو أكثر من خريطة الجهاز بنافذة مخطط مخصصة، حيث تُرسم القيم مع الزمن أثناء polling أو أثناء عمليات التحديث.
ويمكن عرض كل سجل مرتبط بالمخطط بمسار خاص به، يتم التعرف عليه من خلال لون معين ومعلومات مثل مرجع Modbus والعنوان والقيمة الحالية والاسم المعين للعنصر.
وبهذه الطريقة يمكن بسهولة متابعة التغير الزمني للمتغيرات التناظرية ونقاط الضبط والقياسات أو السجلات الرقمية التي تتغير أثناء تشغيل الجهاز.
وتُعد وظيفة المخطط مفيدة جدًا للمراقبة والاختبار والتحليل الديناميكي، لأنها تتيح رؤية كيفية تطور البيانات مع الزمن بشكل فوري دون الاكتفاء بالقراءة الجدولية فقط.
مخطط سجلات Modbus
سجل حركة Modbus
تُعرض جميع الأوامر المرسلة والمستلمة في نافذة سجل حركة Modbus على شكل بايتات.
ويُعد سجل الحركة أداة أساسية لتصحيح الاتصالات، لأنه يتيح عرضًا تفصيليًا للبيانات المرسلة من العميل والبيانات المستلمة من جهاز الـ slave، مع إظهار تسلسلات البايتات بصيغة مقروءة.
ومن خلال هذه النافذة يمكن التحقق من المحتوى الفعلي للإطارات، والتأكد من صحة الأوامر المولدة، وتشخيص مشكلات المهلة، والاستجابات غير الطبيعية، واستثناءات Modbus، أو البيانات غير المتوقعة.
ويمكن مراجعة الحركة أثناء الاستخدام العادي للعميل أو أثناء polling التلقائي أو أثناء إرسال بيانات raw.
وتوفر نافذة الحركة أيضًا وظائف متقدمة مثل نسخ البيانات بصيغة ASCII أو سداسية عشرية، والحفظ إلى ملف، والبحث داخل المحتوى، وتحديد الأسطر، وخيارات التخصيص الرسومي مثل الألوان والخطوط والتباعد وإعدادات العرض.
وهذا يجعل سجل الحركة ليس مجرد عارض بسيط، بل أداة تشغيلية مفيدة جدًا للمطورين والفنيين والمكاملين.
حركة Modbus