
النقاط الرئيسية أو ماذا عن هذه المقالة؟
موضوع المقال هو البرمجة المرئية لـ
ShIoTiny PLC للمنزل الذكي الموضح هنا:
ShIoTiny: أتمتة صغيرة ، إنترنت الأشياء ، أو "ستة أشهر قبل الإجازات" .
تتم
مراجعة بإيجاز شديد مفاهيم مثل
العقد ،
والاتصالات ،
والأحداث ، فضلاً عن ميزات تحميل وتنفيذ برنامج مرئي على
ESP8266 ، وهو أساس
ShIoTiny PLC.
موقع مشروع ShIoTinyمقدمة أو بضعة أسئلة تنظيمية
في مقال سابق حول
تطوري ، قدمت لمحة موجزة عن قدرات وحدة التحكم
ShIoTiny .
ومن الغريب أن الجمهور أبدى اهتمامًا قويًا وسألني الكثير من الأسئلة. حتى أن بعض الرفاق عرضوا عليّ شراء وحدة تحكم. لا ، أنا لا أعارض كسب القليل من المال ، لكن ضميري لا يسمح لي ببيع شيء لا يزال خامًا للغاية من حيث البرامج.
لذلك ، قمت بنشرها على ثنائيات برنامج GitHub الثابتة ومخطط الجهاز:
البرامج الثابتة + أقصر تعليمات + حلبة + أمثلة .
الآن يمكن للجميع وميض ESP-07 واللعب مع البرامج الثابتة لوحدهم. إذا كان أي شخص يريد بالفعل مثل هذه اللوحة كما في الصورة ، فعندها لدي العديد منها. الكتابة إلى
shiotiny@yandex.ru . ولكن ، كما كان الخيار الذي لا ينسى اعتاد أن يقول: "أنا لست مسؤولاً عن أي شيء!"
لذلك ، دعونا نصل إلى النقطة: ما هي "
العقدة " (العقدة) و "
الحدث "؟ كيف يتم تنفيذ البرنامج؟
كالعادة - لنبدأ بالترتيب: عن طريق تنزيل البرنامج.
كيف يتم تحميل البرنامج
بادئ ذي بدء ، ماذا يحدث عندما نقر فوق الزر "
تحميل" في محرر
ElDraw ،
وينتقل برنامجنا ، الذي يتكون من مربعات جميلة ، إلى الجهاز.
أولاً ، بناءً على المخطط الذي رسمناه ، تم بناء وصفه في شكل نص.
ثانياً ، يتم التحقق مما إذا كانت جميع مدخلات العقد متصلة بالمخرجات. لا ينبغي أن يكون هناك "معلقة" المدخلات. إذا تم اكتشاف مثل هذا الإدخال ، فلن يتم تحميل الدائرة في ShIoTiny ، وسيعرض المحرر تحذيرًا.
إذا سارت الأمور على ما يرام ، يرسل المحرر وصفًا نصيًا للدائرة إلى عقدة واحدة في ShIoTiny. بالطبع ، تمت إزالة المخطط الموجود من ShIoTiny مسبقًا. يتم حفظ وصف النص الناتج في ذاكرة فلاش.
بالمناسبة ، إذا كنت تريد إزالة الدائرة من الجهاز ، فقم ببساطة بتحميل دائرة فارغة (لا تحتوي على أي عناصر عقدة) فيها.
بمجرد تحميل دائرة البرنامج بالكامل في ShIoTiny PLC ، تبدأ في "التشغيل". ماذا يعني هذا؟
لاحظ أن عمليات تحميل الدائرة من ذاكرة فلاش عندما تكون الطاقة قيد التشغيل وعندما يتم استلام الدائرة من المحرر متطابقة.
يأتي أولاً إنشاء كائنات عقدة بناءً على وصفها.
ثم يتم ترتيب الاتصالات بين العقد. بمعنى ، يتم إنشاء روابط المخرجات إلى المدخلات والمدخلات إلى المخرجات.
وفقط بعد كل هذا ، يتم إطلاق دورة تنفيذ البرنامج الرئيسية.
لقد كتبت لفترة طويلة ، لكن العملية برمتها - من "تحميل" الدائرة من ذاكرة FLASH إلى بداية الحلقة الرئيسية - تأخذ ثانية مقسمة لدائرة من 60 إلى 80 عقدة.
كيف تعمل الحلقة الرئيسية؟ بسيط جدا أولاً ، ينتظر
حدوث الحدث في أي عقدة ، ثم يعالج هذا الحدث. وهكذا بلا نهاية. حسنًا ، أو حتى يتم تحميل مخطط جديد إلى ShIoTiny.
سبق أن ذكرت عدة مرات أشياء مثل
الأحداث والعقد والاتصالات . ولكن ما هو من وجهة نظر البرنامج؟ سنتحدث عن هذا اليوم.
العقد ، الاتصالات ، والأحداث
انظر فقط إلى أمثلة برامج الدوائر ل
ShIoTiny لفهم أن الدائرة تتكون من كيانين فقط - العقد (أو العناصر) والعلاقات بينهما.
العقدة أو
العقدة أو
عنصر الدائرة عبارة عن تمثيل افتراضي لبعض
الإجراءات على البيانات. قد تكون هذه عملية حسابية أو عملية منطقية أو أي عملية تحدث لنا على الإطلاق. الشيء الرئيسي هو أن العقدة لديها المدخلات والمخرجات.
المدخلات هي حيث تتلقى العقدة البيانات. الصور المدخلة هي نقاط موجودة دائمًا على الجانب الأيسر من العقدة.
الإخراج هو المكان الذي يتم استخراج نتيجة تشغيل العقدة منه. صور الإخراج هي النقاط التي هي دائما على الجانب الأيمن من العقدة.
بعض العقد ليس لها مدخلات. هذه العقد تولد نتيجة في حد ذاتها. على سبيل المثال ، عقدة ثابتة أو عقدة استشعار: فهي لا تحتاج إلى بيانات من العقد الأخرى للإبلاغ عن النتيجة.
العقد الأخرى ، في المقابل ، ليس لها مخارج. هذه هي العقد التي تعرض ، على سبيل المثال ، المحركات (المرحلات أو بعض الأجهزة الأخرى المماثلة). إنهم يقبلون البيانات ، لكنهم لا ينشئون نتائج الحسابات المتاحة للعُقد الأخرى.
بالإضافة إلى ذلك ، هناك أيضًا عقدة تعليق فريدة. إنه لا يفعل شيئًا ، ليس له مدخلات ولا مخرجات. والغرض منه هو أن يكون تفسيرا في الرسم البياني.
ما هو "
الحدث "؟
حدث هو حدوث بيانات جديدة في عقدة. على سبيل المثال ، تتضمن الأحداث: تغيير حالة
الإدخال (عقدة
الإدخال ) ، وتلقي البيانات من جهاز آخر (
العقدان MQTT و
UDP ) ، وانتهاء فترة زمنية محددة (
عقدتا الموقت والتأخير ) ، وما إلى ذلك.
ما هي الأحداث ل؟ نعم ، لتحديد العقدة التي ظهرت فيها البيانات الجديدة وحالات العقد التي يجب تغييرها فيما يتعلق باستلام البيانات الجديدة. الحدث ، كما كان ، "يمر" على طول سلسلة العقد حتى يتم تجاوز جميع العقد التي يجب التحقق من حالتها وتغييرها.
يمكن تقسيم جميع العقد إلى فئتين.
تسمى العقد التي يمكنها توليد الأحداث "
العقد النشطة ".
تسمى العقد التي لا يمكنها إنشاء أحداث "
العقد المنفعلة ".
عندما تقوم العقدة بإنشاء حدث (أي ، تظهر بيانات جديدة في مخرجاتها) ، فبصفة عامة تتغير حالة سلسلة العقد بالكامل المتصلة بإخراج عقدة مُولِّد الحدث.
لتوضيح الأمر ، فكر في المثال في الشكل.

العقد النشطة هنا هي Input1 و Input2 و Input3. العقد المتبقية هي سلبية. فكر في ما يحدث عند إغلاق هذا الإدخال أو ذاك. للراحة ، يتم جدولة النتائج.

كما ترون ، عند حدوث حدث ، يتم بناء سلسلة من العقدة المصدر للحدث إلى عقدة النهاية. لا تتغير حالة تلك العقد التي لا تقع في السلسلة.
يطرح سؤال مشروع ، لكن ماذا سيحدث إذا حدث حدثان أو حتى حدثان في وقت واحد؟
بصفتي من محبي أعمال جليب أنفيلوف ، أُغري أن أرسل سؤالًا فضوليًا إلى كتابه "رحلة من مفاجأة". هذه هي "نظرية النسبية لأصغرها" ، حيث يتم إخبارها جيدًا بما هو "متزامن" وكيفية التعايش معها.
لكن كل شيء تقريبًا يكون أبسط من ذلك بكثير: عند حدوث حدثين أو حتى عدة أحداث ، يتم بناء جميع السلاسل من كل مصدر للحدث ومعالجتها بالتتابع وبدون معجزات.
والسؤال الشرعي التالي للقارئ الفضولي هو ماذا سيحدث إذا كانت العقد متصلة في حلقة؟ أو ، كما هو معتاد أن نقول من بين هذه الخدع لك ، لإبداء الرأي. بمعنى ، قم بتوصيل إخراج إحدى العقد بإدخال العقدة السابقة بحيث تؤثر حالة إخراج هذه العقدة على حالة الإدخال الخاص بها. لن يسمح لك محرر
ElDraw بالاتصال مباشرة
بمخرج العقدة لمدخلاته الخاصة. لكن بشكل غير مباشر ، كما في الشكل أدناه - يمكن القيام بذلك.
إذن ماذا سيكون في هذه الحالة؟ ستكون الإجابة "محددة": اعتمادًا على العقد. النظر في المثال في الشكل.

عندما تكون جهات اتصال الإدخال Input1 مفتوحة عند الإدخال العلوي للعقدة A - 0. عند إخراج العقدة A ، أيضًا 0. عند إخراج العقدة B - 1. وأخيراً ، عند الإدخال السفلي للعقدة A - 1. كل شيء واضح. ولمن ليس واضحًا - انظر أدناه للحصول على وصف لكيفية عمل العقد "AND" و "NOT".
أغلق الآن جهات الاتصال الخاصة بالإدخال 1 ، أي أننا سنزود واحدًا بالإدخال العلوي من العقدة A. أولئك الذين هم على دراية بالالكترونيات يعلمون أننا في الواقع نحصل على دائرة مولد المنطق الكلاسيكية. ومن الناحية النظرية ، يجب أن ينتج مثل هذا المخطط إلى ما لا نهاية عند إخراج العناصر A و B التسلسلات 1-0-1-0-1-0 .... و 0-1-0-1-0-1-1 .... بعد كل شيء ، يجب تغيير الحدث باستمرار حالة العقد A و B ، يعمل في دائرة 2-3-2-3- ...!
ولكن هذا لا يحدث في الواقع. ستقع الدائرة في حالة عشوائية - أو سيبقى التتابع متوقفًا عن التشغيل أو متوقفًا عن التشغيل ، أو قد ينطلق بشكل متقطع قليلًا عدة مرات متتالية. كل هذا يتوقف على الطقس في القطب الجنوبي للمريخ. ولهذا السبب يحدث هذا.
يغير حدث من العقدة Input1 حالة العقدة A ، ثم العقدة B ، وما إلى ذلك في دائرة عدة مرات. يحدد البرنامج "حلقات" الحدث وينهي هذا الكرنفال بالقوة. بعد ذلك ، يتم حظر التغييرات حالة العقد A و B حتى يحدث حدث جديد. اللحظة التي يقرر فيها البرنامج - "توقف عن الدوران في دائرة!" - في الحالة العامة ، يعتمد على العديد من العوامل ويمكن اعتباره عشوائيًا.
كن حذرًا عند توصيل العقد في حلقة - لن تكون التأثيرات واضحة دائمًا! تخيل جيدا ماذا ولماذا تفعل!
ولكن هل من الممكن بناء مولد على العقد المتاحة لنا؟ نعم يمكنك ذلك! ولكن هذا يتطلب عقدة تعرف بنفسها كيفية إنشاء الأحداث. وهناك مثل هذه العقدة - وهذا هو "خط التأخير". دعونا نرى كيف يعمل المولد مع فترة 6 ثوان في الشكل أدناه.

العنصر الرئيسي للمولد هو العقدة A ، خط التأخير. إذا قمت بتغيير حالة إدخال سطر التأخير من 0 إلى 1 ، فلن يظهر رقم 1 في الإخراج على الفور ، ولكن بعد وقت محدد فقط. في حالتنا ، هو 3 ثوان. وبالمثل ، إذا قمت بتغيير حالة إدخال خط التأخير من 1 إلى 0 ، فسيظهر 0 عند الإخراج بعد 3 ثوانٍ واحدة. يتم تعيين وقت التأخير في أعشار الثانية. وهذا هو ، والقيمة هي 30 ويعني - 3 ثوان.
تتمثل ميزة خط التأخير في أنه ينشئ حدثًا بعد انقضاء وقت التأخير.
لنفترض أن ناتج خط التأخير في البداية كان 0. بعد المرور عبر العقدة B ، العاكس ، يتحول 0 إلى 1 وينتقل إلى إدخال خط التأخير. لا شيء يحدث على الفور. عند إخراج سطر التأخير ، كما كان ، سيبقى 0 ، ولكن بعد ذلك يتم تشغيل العد التنازلي لوقت التأخير. يستغرق 3 ثوان. ثم ينشئ خط التأخير حدثًا. عند الإخراج ، لديها 1. هذه الوحدة ، بعد المرور عبر العقدة B ، العاكس ، تتحول إلى 0 وتذهب إلى إدخال خط التأخير. تمر 3 ثوانٍ أخرى ... وتتكرر العملية. أي ، تتغير حالة إخراج سطر التأخير كل 3 ثوانٍ من 0 إلى 1 ثم من 1 إلى 0. وينقلب التتابع. المولد يعمل. فترة النبضة هي 6 ثوانٍ (3 ثوانٍ عند إخراج صفر و 3 ثوانٍ - ثانية واحدة).
لكن في الدوائر الحقيقية ، لا تحتاج عادةً إلى استخدام هذا المثال. هناك عقد مؤقت خاصة تعمل بشكل مثالي وبدون مساعدة خارجية على توليد سلسلة من النبضات مع فترة معينة. مدة "صفر" و "وحدات" في هذه النبضات تساوي نصف الفترة.
لتعيين إجراءات دورية ، استخدم عقد المؤقت.
ألاحظ أن مثل هذه الإشارات الرقمية ، حيث تكون مدة "صفر" و "وحدات" متساوية ، تسمى "متعرج".
آمل أن أوضح السؤال قليلاً حول كيفية توزيع الأحداث بين العقد وما الذي لا ينبغي عمله؟
الخلاصة والمراجع
تبين أن المقالة قصيرة ، لكن هذه المقالة هي الإجابة على الأسئلة التي أثيرت على العقد والأحداث.
مع تطور البرامج الثابتة
وظهور أمثلة جديدة ، سأكتب عن كيفية
برمجة مقالات
ShIoTiny الصغيرة ، طالما أنها ستكون مثيرة للاهتمام للناس.
كما كان من قبل ، فإن المخطط والبرامج الثابتة والأمثلة ووصف العقد وكل شيء
آخر موجود هنا .
أسئلة ، رغبات ، نقد - هذا هنا:
shiotiny@yandex.ru