من Modbus RTU إلى MQTT: تعيين السجلات وترتيب البايتات والتحجيم
يتطلب التكامل الموثوق من Modbus RTU إلى MQTT اتفاقًا واضحًا بين خريطة سجلات الجهاز والتطبيق الذي يستخدم قياساته. فالاستجابة الناجحة عبر الاتصال التسلسلي تثبت وصول البايتات فحسب. ويجب أن تتحقق اختبارات التشغيل أيضًا من معنى تلك البايتات وما إذا كانت القيمة الناتجة لا تزال حديثة وصالحة للاستخدام.
يتناول هذا الدليل القياس عن بُعد للقراءة فقط: تحويل العناوين، ورموز الوظائف، والقيم ذات الإشارة، والتحجيم، وترتيب السجلات المتعددة، وحداثة بيانات MQTT. جميع تعيينات السجلات والقيم وحمولات الرسائل الواردة أدناه أمثلة توضيحية، وليست مواصفات لمنتجات Obeita أو قياسات ميدانية.
ابدأ بعملية قراءة RTU واحدة تم التحقق منها
اجمع طراز الجهاز وإصدار البرنامج الثابت وإصدار خريطة السجلات وإعدادات الاتصال التسلسلي وعنوان المحطة وقيمة مرجعية معلومة. راجع توصيلات RS-485 ومقاومات الإنهاء والانحياز وفق وثائق التركيب. تأكد من أن الجهاز الرئيسي المقصود وحده يتحكم في الناقل. عالج انتهاء المهلة وأخطاء CRC قبل محاولة تصحيح القيم بالتحجيم.
يحدد دليل Modbus للخط التسلسلي بنية إطارات RTU والتوقيت والتحقق من الأخطاء. ويجب أن يلتزم برنامج الاستقصاء في بيئة التشغيل الفعلية بهذه المتطلبات وبحدود استجابة الجهاز. ابدأ بنقطة قياس واحدة موثقة، ولا توسّع مجموعة نقاط الاستقصاء حتى تتوافق استجابتها الخام مع القيمة الناتجة عن فك ترميزها.
تحقق من عنوان السجل ورمز الوظيفة معًا
تستخدم مواصفات بروتوكول تطبيق Modbus عناوين PDU تبدأ من الصفر. يقرأ رمز الوظيفة 03 سجلات الاحتفاظ، ويقرأ رمز الوظيفة 04 سجلات الإدخال. وهما جدولان منطقيان منفصلان. ولا يعني تطابق القيمة العددية للإزاحة أن الوظيفتين تعيدان القياس نفسه.
في أسلوب التدوين المعتاد في الوثائق، يشير 40001 إلى أول سجل احتفاظ، ويشير 30001 إلى أول سجل إدخال. يحدد الرقم الأول الجدول، ولا يُعد جزءًا من عنوان PDU المُرسل. راجع شرح العنونة لدى Modbus Organization.
| بند توضيحي في الدليل | الوظيفة | عنوان البداية في PDU |
|---|---|---|
| سجل الاحتفاظ 40011 | 03 | 10 عشريًا، 0x000A |
| سجل الإدخال 30011 | 04 | 10 عشريًا، 0x000A |
وفق هذا الأسلوب، 40011 − 40001 = 10. لكن الأدلة قد تعرض أصلًا إزاحات تبدأ من الصفر، أو أرقام سجلات تبدأ من الواحد، أو عناوين بالنظام الست عشري. وقد تطبق واجهات البوابات تحويلًا خاصًا بها. سجّل كلًا من التدوين الوارد في الدليل والإزاحة الفعلية في PDU، ولا تطرح واحدًا تلقائيًا. ولا تستبدل FC03 بـ FC04 للحصول على رقم يبدو معقولًا ما لم تدعم وثائق الجهاز ذلك التعيين صراحةً.
في المثال الأول، تكون وحدة PDU للطلب هي 03 00 0A 00 01: الوظيفة 03، والبداية 10، والعدد سجل واحد. هذه وحدة PDU فقط وليست إطار RTU كاملًا؛ فقد حُذف منها عنوان المحطة وCRC.
فك ترميز القيم ذات الإشارة قبل تطبيق التحجيم
أنشئ تعريفًا لكل نقطة يتضمن عنوان المحطة والوظيفة وإزاحة PDU وعدد السجلات ونوع البيانات وترتيب الكلمات ومعامل التحجيم والإزاحة المضافة والوحدة وقواعد القيم غير الصالحة والحد المسموح لقدم البيانات. احتفظ بكلمات السجلات الخام في سجلات اختبارات التشغيل كي يتمكن مهندس آخر من إعادة إجراء التحويل.
لنفترض أن نقطة المثال تمثل درجة حرارة ذات إشارة بطول 16 بت، بمعامل تحجيم 0.1 °C وإزاحة مضافة تساوي صفرًا. تُقرأ كلمة الاستجابة 0xFF9C على أنها 65436 عند تفسيرها كقيمة بلا إشارة. أما تفسيرها بصيغة المتمم الثنائي ذي الإشارة فهو 65436 − 65536 = −100. طبّق التحجيم بعد فك الترميز:
engineering_value = decoded_value × scale + offset
= -100 × 0.1 + 0
= -10.0 °C
أما فك الترميز بلا إشارة فسينشر بدلًا من ذلك 6543.6 °C. وتغيير معامل التحجيم لإخفاء تلك النتيجة يترك الخطأ الأساسي في نوع البيانات دون تصحيح. اختبر القيم الموجبة والسالبة والحدّية. وتحقق من رموز عدم الصلاحية التي يحددها المصنّع قبل التحجيم؛ فلا يجوز أن تتحول قيمة حارسة إلى قياس يبدو موثوقًا.

ميّز بين ترتيب البايتات داخل 16 بت وترتيب الكلمات عبر عدة سجلات
داخل سجل Modbus قياسي بطول 16 بت، يُرسل البايت الأعلى أهمية أولًا. لذلك تظهر 0x4148 على هيئة 41 48. أما CRC في RTU فهو حقل منفصل يُرسل بايته الأقل أهمية أولًا، ولا يُعد ترتيبه قاعدةً لفك ترميز السجلات.
تشغل قيمة التطبيق بطول 32 بت سجلين، لكن ترتيب كلمتيها خاص بالجهاز. يوضح مثال Schneider Electric للقيم العائمة ذات الكلمات المتبادلة لماذا يلزم أحيانًا إعادة ترتيب الكلمتين الأعلى والأقل أهمية.
للقيمة التوضيحية 12.5 التي يمكن تمثيلها بدقة بصيغة IEEE 754 float32، يكون نمط البتات هو 0x41480000. تعيد الخريطة التي تضع الكلمة الأعلى أهمية أولًا 0x4148, 0x0000، بينما تعيد الخريطة التي تضع الكلمة الأقل أهمية أولًا 0x0000, 0x4148. أعد ترتيب الكلمات وفق الدليل، ثم أعد تفسير البتات المجمّعة بصيغة float32. أما تحويل العدد الصحيح المجمّع عدديًا إلى عدد عائم فهو عملية مختلفة.

قد يكون خيار البوابة المسمى «little endian» ملتبسًا. وثّق بدقة تبديل الكلمات والبايتات الذي يطبقه. تحدد بعض خرائط المورّدين أيضًا تبديلات للبايتات على مستوى التطبيق، لذا تحقق منها صراحةً. اقرأ الكلمات المرتبطة في طلب واحد متى كان ذلك مدعومًا، وتحقق مما إذا كان الجهاز يضمن لقطة بيانات متسقة أثناء التحديثات.
انشر حداثة البيانات وجودتها مع قيمة MQTT
امنح كل قياس اسم نقطة ثابتًا ووحدة وحالة جودة وطابعًا زمنيًا ذا معنى محدد. إذا لم يوفر الجهاز طابعًا زمنيًا للاقتناء، فسمِّ وقت القراءة الناجحة لدى البوابة تسميةً دقيقة. يجب ألا يُستخدم وقت نشر لاحق لإخفاء قِدم عينة.
تستخدم حمولة التطبيق التوضيحية التالية وقت اكتمال قراءة البوابة وتسلسلًا ضمن دورة تشغيل واحدة:
{
"schema_version": 1,
"device_id": "example-device-07",
"point": "temperature",
"value": -10.0,
"unit": "degC",
"quality": "good",
"read_completed_at": "2026-10-03T12:00:00Z",
"time_source": "gateway_read",
"boot_id": "example-boot-01",
"sequence": 1042
}
حدد السلوك عند تعذّر إجراء قراءة في دورة استقصاء: مثل الاحتفاظ بالطابع الزمني لآخر قراءة سليمة مع الإبلاغ عن تقادم البيانات في حالة الجودة، أو نشر قيمة تدل صراحةً على عدم التوفر. حدد عتبة تقادم تناسب العملية، ومتطلبات مزامنة الساعة، وحدود طابور الانتظار. وعند إعادة إرسال عينات مخزّنة مؤقتًا، احتفظ بأوقات قراءتها الأصلية.
يمكن أن تساعد رسائل MQTT المحتفَظ بها المشترك الجديد على الحصول على آخر حالة منشورة، لكن الاحتفاظ بالرسالة لا يثبت حداثتها. ويمكن لخاصية Message Expiry في MQTT 5 أن تحدّ من عمر الرسائل في الطابور، لكن التطبيقات المستهلكة ما زالت بحاجة إلى فحوص لعمر البيانات على مستوى التطبيق. راجع القسمين 3.3 و4.3 من MQTT 5.0.
اختر QoS دون التعهد بمعالجة مرة واحدة بالضبط من البداية إلى النهاية
يوفر MQTT QoS 0 تسليمًا مرة واحدة على الأكثر، وQoS 1 تسليمًا مرة واحدة على الأقل، وQoS 2 تسليمًا مرة واحدة بالضبط ضمن تبادله البروتوكولي. تحصر المواصفات نطاق التسليم في مُرسل واحد ومُستقبل واحد، بينما يكون التسليم من الوسيط إلى المشترك تبادلًا منفصلًا. ولا يستطيع QoS 2 وحده ضمان إجراء اقتناء واحد بالضبط من المستشعر أو تحديث واحد بالضبط لقاعدة البيانات على مستوى النظام بأكمله.
عندما يكون للتكرار أثر، صمّم عمليات الكتابة لدى التطبيق المستهلك بحيث لا يغيّر تكرارها النتيجة. يمكن لمفتاح على مستوى التطبيق يجمع الجهاز ومعرّف دورة التشغيل ورقم التسلسل أن يدعم إزالة التكرارات إذا حُددت قواعد تفرده واستمرارية حفظه. اختبر إعادة الاتصال ومحاولات الإعادة في المراحل اللاحقة باستخدام الإعداد الفعلي للوسيط والعميل والتخزين.
قائمة التحقق لاختبارات التشغيل
- قارن وحدة PDU للطلب بخريطة العناوين المعتمدة، بما في ذلك الاختيار بين FC03 وFC04.
- تحقق من الكلمات الخام بمقارنتها بقراءة معروفة يعرضها الجهاز قبل تفعيل الحسابات السحابية.
- اختبر القيم السالبة ورموز عدم الصلاحية وتغييرات ترتيب الكلمات ودورات الاستقصاء التي تفشل جزئيًا.
- افصل الجهاز التسلسلي والوسيط كلًا على حدة، وتأكد من بقاء البيانات المتقادمة قابلة للتمييز.
- أعد تشغيل البوابة والتطبيق المستهلك، وافحص عمر البيانات المعاد إرسالها والتعامل مع التكرارات وسلوك التسلسل.
- سجّل البرنامج الثابت المختبَر وإصدار الخريطة ومخطط الحمولة ونتائج القبول.
جهّز مراجعة متطلبات الربط من Modbus RTU إلى MQTT
للنقاش مع Obeita بشأن التكامل، جهّز الصفحات المعنية من دليل الجهاز، وعينة إطار طلب واستجابة، والقيم الهندسية المتوقعة، وعدد النقاط، وفاصل الاستقصاء، ومتطلبات الوسيط، والسلوك عند الانقطاع. احجب كلمات المرور والمفاتيح ومعرّفات العملاء وتفاصيل الشبكة الخاصة والبيانات المملوكة التي لا تملك صلاحية مشاركتها. تتيح هذه المدخلات تعريف التعيين واختباره قبل اعتماد إعداد البوابة.
اطّلع على خدمة ربط الأجهزة القديمة من Obeita، وعلى مشروع اقتناء البيانات باستخدام STM32 والتكامل مع MQTT (بالإنجليزية) الذي تم تسليمه، لمعرفة نطاق الأعمال الهندسية ذات الصلة. لمناقشة متطلبات التعيين الخاصة بك، تواصل مع Obeita.
المراجع الأصلية
- مواصفات بروتوكول تطبيق Modbus، الإصدار V1.1b3. الأقسام ذات الصلة: 4.2, 4.3, 4.4, 6.3, 6.4.
- مقدمة إلى Modbus — Modbus Organization. الأجزاء ذات الصلة: عنونة بيانات Modbus والوظيفة 03.
- مواصفات Modbus عبر الخط التسلسلي ودليل التنفيذ، الإصدار V1.02. الأقسام ذات الصلة: 2.2, 2.5.1, 3.
- Schneider Electric — كيفية قراءة قيم عائمة ذات كلمات متبادلة في Modbus. الجزء ذو الصلة: Resolution (الحل).
- MQTT الإصدار 5.0 — معيار OASIS. الأقسام ذات الصلة: 3.3.1.3, 3.3.2.3.3, 4.3.