مقدمة
إذا كان لديك مطرقة فقط كأداة ، تبدأ كل مشكلة تشبه الظفر.
أبراهام ماسلو
بروتوكول Modbus معروف جيدًا لكل من قراء Habr وقراء hicktime. تم تخصيص العديد من المنشورات لتطبيقها ، والتي يصعب سردها بسبب وجود الكثير منها ، ومن وقت لآخر تظهر مقالات جديدة هنا وهناك.

ترجع شعبية هذا البروتوكول إلى انفتاحه وبساطته. نطاق التطبيق واسع بما فيه الكفاية: من أنظمة الأتمتة الصناعية المهنية إلى مشاريع DIY للهواة لأنظمة التحكم الموزعة ، والمنازل "الذكية" وما إلى ذلك. لقد اخترت هذا البروتوكول أيضًا عندما شارك فريقي في إنشاء برنامج لمحاكاة القطار. يتم استخدام بروتوكول Modbus RTU على الواجهة المادية RS485 في هذا المحاكي لتوفير إدخال في كمبيوتر التحكم للبيانات من عناصر التحكم المثبتة على وحدة تحكم السائق (لا تعتقد أن Modbus مستخدم في المخزون الحقيقي!).
لا يستحق الحديث عن الصعوبات التي ينطوي عليها إعداد البرامج التي تتفاعل مع شبكة من وحدات التحكم التي تتحكم في المعدات. خاصة عندما يكون جزء من الأجهزة موجودًا بالفعل في الحديد ، والجزء الآخر في عملية التطوير والتصنيع. في هذه الحالة ، يلزم كتابة برنامج عالي المستوى مع مراعاة تفاعله مع هذه الأجهزة. ومن المستحسن كتابته بطريقة إنشاء نسخة عمل من النظام على الفور ، دون استخدام "العكازات" التي يصعب تنظيفها دائمًا من الكود.
تقول: "أنت بحاجة إلى كتابة برامج عندما تكون النماذج الأولية لجميع الأجهزة جاهزة" ، وستكون على حق ، ولكن ... هاهاها ، نادرًا ما يحدث هذا في العالم الحقيقي. وهنا تأتي برامج محاكاة البرمجيات لمساعدتنا.
1. باختصار حول Modbus RTU
لن أتحدث بالتفصيل عن البروتوكول. يمكن لأولئك المهتمين بالتفاصيل استخدام البحث - البروتوكول مفتوح ، ومواصفاته الرسمية والكثير من المعلومات متوفرة على الشبكة. يمكنني فقط أن أقول أنه في Modbus RTU يصف التنسيق الثنائي للبيانات المرسلة ويستخدم كبل الزوج الملتوي القياسي RS485 كوسيط الإرسال. يمكن أيضًا استخدام RS232 إذا كانت الشبكة تحتوي على جهاز إرسال واحد وجهاز استقبال واحد ، أو RS422 لنقل البيانات أحادية الاتجاه.
سنكون مهتمين بـ RS485 ، وهي واجهة نصف أحادية الاتجاه ، والتي تسمح لجهاز واحد فقط بنقل البيانات في كل مرة. يتم إجراء التحكيم على الحافلة في مودبوس بسبب التحمل لفاصل الصمت الإلزامي 3.5 أحرف عند سرعة إرسال معينة. يجب أن تبدأ كل رسالة وتنتهي بفاصل زمني صامت. يوجد جهاز رئيسي واحد في الشبكة والعديد من العبيد (حتى 31 في جزء واحد من الشبكة ، دون استخدام مكررات). يحتوي كل جهاز تابع على معرف معرف فريد (من 1 إلى 31). يتم نقل البيانات عن طريق العبيد فقط إذا أرسل السيد طلبًا لاستلام البيانات من هذا الجهاز.
يشبه طلب المعالج النموذجي هذا
ID | رمز الوظيفة | عنوان البيانات | كمية البيانات (2 بايت) | البيانات | CRC16 |
يتم استخدام CRC16 للتحكم في سلامة البيانات المرسلة. يستخدم مودوس تدوين تمثيل بيانات Big Endian: بالنسبة لقيم 2 بايت ، فإن البايت الأكثر أهمية داخل الرسالة يأتي أولاً). يستخدم البروتوكول أربعة أنواع من البيانات:
- لفائف - مخرجات منفصلة (1 بت) قراءة / كتابة
- مدخلات منفصلة - مدخلات منفصلة للقراءة فقط (1 بت)
- سجلات الاحتفاظ - سجلات الإخراج (2 بايت) المتاحة للقراءة / الكتابة
- سجلات الإدخال - سجلات الإدخال (2 بايت) المتاحة للقراءة
استجابة للطلب ، يرسل الرقيق البيانات بالصيغة التالية
ID | رمز الوظيفة | كمية البيانات بالبايت | البيانات | CRC16 |
تدخل الرسالة المستلمة من الرئيسية المخزن المؤقت للتلقي لجميع الأجهزة. ومع ذلك ، إذا لم يتطابق البايت الأول من المخزن المؤقت للاستلام مع معرف الجهاز ، فإنه يتجاهل البيانات المستلمة ، ويزيل المخزن المؤقت للاستلام. إذا كانت الرسالة مخصصة لهذا الجهاز ، فإنها تشكل استجابة ، وبعد الحفاظ على فترة الصمت ، ترسلها إلى المعلم.
كما يقولون ، بسيط ، ولكن مع الذوق. يمكنك قراءة المزيد عن كل هذا في
مواصفات البروتوكول الرسمي .
اقرأ عن طرق تنفيذ البروتوكول على الواجهة التسلسلية
هنا . لم نجتمع هنا لهذا الغرض.
عند تطوير برنامج عالي المستوى (تطبيق رئيسي على أساس جهاز الكمبيوتر ، على سبيل المثال) لهذه الشبكة ، سيكون من الجيد أن يكون لديك مجموعة من أدوات البرمجيات التي تسمح بتنفيذ مثل هذا المفهوم
معنى هذا المخطط على النحو التالي. لنفترض أن لدينا جزءًا من الأجهزة المضمنة في الشبكة المستقبلية. أو حتى الآن لا توجد مثل هذه الأجهزة. ولكن هناك رغبة ملحة في كتابة برنامج لأعلى مستوى من الإدارة ، وتصحيحه ، بحيث عندما لا تزال الشبكة مطبقة في الأجهزة ، لا يتعين علينا إعادة كتابة أي شيء. للقيام بذلك ، سيكون عليك استخدام وسيط نقل مادي ، والذي نستخدم فيه جهازًا مشابهًا لهذا

يتم استخدام أحد المحولات لتوصيل برنامج المعالج المطور. آخر هو توصيل محاكي شبكة مستقبلية من العبيد. إلى الفرع بموصل أبيض ، نقوم بتوصيل هذا الجزء من الشبكة الذي تم تنفيذه بالفعل في الأجهزة. وبالتالي ، لدينا الفرصة للعمل بهدوء مع بروتوكول الاتصال القياسي ، مع إدخال المعدات الحقيقية تدريجيًا في التشغيل. بالإضافة إلى ذلك ، بإعطاء الكائن للعميل ، لا يتم حرماننا من فرصة تعديل برمجياته في بيئة معملية مريحة دون الوصول إلى الكائن. QSlave في الرسم التخطيطي هو نفس الجزء من الشبكة الذي يحاكيه البرنامج. بطبيعة الحال ، يجب عليك كتابة البرنامج المناسب ، الذي قام به المؤلف.
2. QSlave - مضاهاة شبكة الرقيق
QSlave هو محاكي شبكة مفتوح عبر منصة modbus RTU. يمكنك الحصول عليه بموجب ترخيص GPL v2.0 على Github على الرابط أعلاه.

تم تطوير التطبيق في C ++ باستخدام إطار Qt. Qt ، بشكل عام ،
لديها مكتبات للعمل مع Modbus ، ولكن تفاصيل المهمة - محاكاة شبكة من العبيد بدلاً من عبد واحد ، أدت إلى حقيقة أن مكتبات Qt المدمجة لـ Modbus لم يتم استخدامها هنا. لمعالجة البيانات المستلمة من المنفذ التسلسلي الظاهري ، تم إنشاء مكتبة modbus مكتوبة ذاتيًا. يتم تنفيذ كود هذه المكتبة كمشروع منفصل ، وهو مستقل تمامًا عن واجهة المستخدم ويمكن استخدامه لوعي محاكاة البرامج مع وظائف أكثر تقدمًا. نظرًا لفصل مضاهاة Modbus عن واجهة المستخدم ، يتم تكوين الشبكة باستخدام ملفات التكوين. تم اختيار تنسيق XML (غالبًا ما نستخدمه في مشاريعنا). يتوفر تكوين عينة
في رمز المشروع . تتكون مجموعة التكوينات من ملف رئيسي بامتداد * .net والذي يبدو كالتالي
example.net<?xml version="1.0" encoding="UTF-8" ?> <Config> <Slave> <Description>Traffic light</Description> <id>1</id> <config>traffic-light</config> </Slave> </Config>
وملفات تهيئة XML لكل من العبيد
traffic-light.xml <?xml version="1.0" encoding="UTF-8" ?> <Config> <Coil> <address>16</address> <description>Red signal</description> <value>0</value> </Coil> <Coil> <address>17</address> <description>Yellow signal</description> <value>0</value> </Coil> <Coil> <address>18</address> <description>Green signal</description> <value>0</value> </Coil> <DiscreteInput> <address>0</address> <description>Ready</description> <value>1</value> </DiscreteInput> <HoldingRegister> <address>5</address> <description>Signal activity time</description> <value>15</value> </HoldingRegister> <InputRegister> <address>2</address> <description>Signals count</description> <value>3</value> </InputRegister> </Config>
يحتوي الملف الأخير على وصف لجميع البيانات المتوفرة على الجهاز. لتنزيل التكوين ، تحتاج إلى فتح ملف * .net من قائمة برنامج QSlave (File → Open config). يجب أن تكون جميع ملفات التكوين في نفس الدليل. يصف التكوين المثال شبكة من جهاز تابع واحد ، وضوء مرور افتراضي ، وتصف مخرجاته المنفصلة الإشارات ، ويشير الإدخال الرقمي إلى جزء صغير من الجهاز جاهز للتشغيل (جاهز) ، ويسجل سجل الإدخال عدد إشارات المرور ، ويحدد سجل الإخراج الوقت الذي يتم تشغيله فيه كل من الإشارات.

بطبيعة الحال ، لا يحاكي هذا المحاكي المنطق الداخلي للجهاز. يسمح لك فقط بتعيين قيم خلايا الذاكرة المتاحة للسيد. يمكن تعيين أي من القيم حسب تقديرك عن طريق تحرير الخلية المقابلة في الجدول.
على الرغم من بساطته ، يساعدنا هذا البرنامج في العمل على برنامج المحاكاة (الذي تم تشغيله بالفعل) دون مغادرة المختبر.

لكن لا أحد يقول أنه لا يمكنك إنشاء محاكي أكثر تقدمًا يحاكي تشغيل أجهزة الشبكة الافتراضية. لإنشائه ، يمكنك استخدام كود مكتبة modbus المتاح في حزمة QSlave.
3. QMaster - محاكاة الجهاز الرئيسي
لإنشاء عبيد ، قم بتصحيح البرامج الثابتة الخاصة بهم ، تحتاج إلى محاكاة المعالج. هناك عدد من المحاكيات المفتوحة ، على سبيل المثال ،
QModbus . استخدمناه في عملنا ، حتى قررنا زيادة معدل نقل البيانات إلى 250 كيلوبت / ثانية. QModbus لا يسمح بذلك. كان من الممكن إعادة بنائه من مصادر Linux ، لكن مهندسينا الإلكترونيين يجلسون على Windows ، وحيث لم يذهب التجميع لعدد من الأسباب. اتضح أن هذا التطبيق مكتوب في Qt 4 ، يستخدم مكتبة libmodbus خارجية. كنت أرغب في الحصول على حل عبر الأنظمة الأساسية على Qt5 ، خاصة وأن Qt5 يعمل بالفعل مع Modbus خارج الصندوق. لذلك ، تمت كتابة النظير الخاص به باستخدام مكدس مكتبة Qt Modbus -
QMaster . وهو متوفر أيضًا على Github في ظل نفس الظروف.

الخلاصة
في الختام ، سأقول إنني أعمل (في العمل) بشكل رئيسي على المشاريع المغلقة. ومع ذلك ، فقد طورت أنا شخصيا الأدوات الموصوفة بمبادرة مني في أوقات فراغي. بالإضافة إلى ذلك ، في إصدار Windows ، يتم ربطهم بشكل ثابت برمز Qt GPL ، لذلك يجب أن أنقلهم إلى المجتمع في ظل نفس الشروط التي تلقتها Qt. بالإضافة إلى ذلك ، قد تكون هذه الأدوات مفيدة للقارئ.
شكرا لكم على اهتمامكم!