آلة حالة الجهاز. الآلات النهائية، وكيفية البرنامج دون التألق. باستخدام FSM بناء على كومة

اليوم سنتحدث عن Automata، ولكن ليس أولئك الذين يحتفظون في أيدي جنود الجيش الروسي. سيكون حول هذا النمط المثير للاهتمام من متحكم البرمجة مثل البرمجة التلقائية. وبصورة أكثر دقة، فإنه ليس أسلوب برمجة ومفهوم كاملا، بفضل ما يمكن للكمبيوتر المتحول المبرمج أن يسهل تخفيف حياتهم. بفضل ما يتم حل العديد من المهام المقدمة أمام المبرمج أسهل بكثير وأسهل، مما يلغي مبرمج من الصداع. بالمناسبة، غالبا ما يتم استدعاء البرمجة التلقائية التبديل التكنولوجيا.

أريد أن ألاحظ أن التحفيز في كتابة هذا المنصب خدم دورة المقالات عن تقنية التبديل فلاديمير تاتارتشيفسكي. تسمى دورة المقالات "تطبيق تقنية التبديل عند تطوير تطبيق البرمجيات بالنسبة للكمبيوتر المتحكم، "لذلك في هذه المقالة سأحاول إعطاء مثال على رمز العمل ووصفه.

بالمناسبة، خططت لعدد من المقالات المكرسة للبرمجة، حيث سأنظر فيها بتقنيات البرمجة بالتفصيل للحصول على ميكروكماني AVR، لا تفوت.... حسنا، دعنا نذهب!

ينفذ البرنامج باستمرار الأوامر التي وضعها مبرمج. لطبيعية برنامج الحاسب طبيعي تماما عندما يعمل البرنامج وتوقف التنفيذ، مع نتائج عمله على الشاشة.

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

ما هذا هنا؟ كل شيء طبيعي - وحدة تحكم، تلك التي في أعماق اللاعب الخاص بك انتهت ببساطة تحقيق برنامجه. هنا ترى غير مريح بطريقة ما اتضح.

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

أنماط البرمجة.

"أنماط البرمجة" - تبدو غير مفهومة بطريقة أو بأخرى، ولكن حسنا. ماذا أريد أن أقول هذا؟ تخيل أن الشخص لم يشارك أبدا في البرمجة، أي غلاية كاملة.

يقرأ هذا الرجل الكثير من كتب البرمجة، درس كل التصميم الأساسي للغة.جمع معلومات عن الحبوب، جيدة الآن الوصول إلى المعلومات غير محدود. كل هذا جيد، لكن كيف تبدو برامجه الأولى؟ يبدو لي أنه لن يكون رائعا، لكنه سوف يذهب على طول الطريق من بسيطة إلى معقدة.

لذلك هذه الأنماط هي خطوات تؤدي من مستوى بسيط إلى أكثر تعقيدا، ولكن أيضا في نفس الوقت أكثر كفاءة.

في البداية لم أفكر في بعض المميزات البناءة برامج. أنا ببساطة شكلت منطق البرنامج - مخطط كتلة مرحبا وكتب الرمز. من ما تعثرت باستمرار على أشعل النار. لكنها كانت المرة الأولى التي لم أتم فيها عدم الارتفاع واستخدمت أسلوب "القروض البسيطة"، ثم بدأت في استخدام المقاطعات، ثم كانت هناك أتمتة وذهب للذهاب ...

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

فراغ الرئيسي (باطلة) (INIVIC_AL ()؛ // تهيئة محيط الوقت (1) (LEDS_BLINK ()؛ // الصمام المتعري signal_on ()؛ // signal_off () وظيفة تحول؛ // وظيفة خارج إشارة L \u003d زر ()؛ // متغير مسؤولة عن الضغط على أزرار التبديل (L) // اعتمادا على قيمة المتغير، يتم تنفيذ هذا أو هذا الإجراء (الحالة 1: (deistvie1 ()؛ // بدلا من وظيفة يمكن أن يكون المشغل الشرطي deistvie2 ()؛ // أو عدد قليل من علبة التبديل deistvie3 ()؛ deistvie4 ()؛ deistvie5 ()؛ ) الحالة 2: (deistvie6 ()؛ deistvie7 ()؛ deistvie8 ()؛ deistvie9 ()؛ deistvie10 ()؛)؛ وبعد وبعد وبعد وبعد وبعد وبعد وبعد وبعد )))

نقطة عمل البرنامج تتحرك بالترتيب. في الوقت نفسه، يتم تنفيذ جميع الإجراءات والشروط والدورات بالتتابع. يبدأ الرمز في التباطؤ، يجب عليك إدراج الكثير من الظروف غير الضرورية، مما يعقد التصور.

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

مع هذا النهج، كتبت عدة برامج، لم تكن عمالا كبيرا وشعبا، لكن الرؤية تركت الكثير مما هو مرغوب فيه. لإضافة بعض الشرط الجديد، كان من الضروري تحويل التعليمات البرمجية بأكملها، لأن كل شيء مرتبط. أدى ذلك إلى العديد من الأخطاء والصداع. أقسم المترجم بأسرع ما يمكن، تحول الدين هذا البرنامج إلى الجحيم.

2. مقاطعات دورة +.

قطع جزئيا دورة الفرامل اللانهائية باستخدام المقاطعات. تساعد المقاطعات في الخروج من دائرة مفرغة، ولا تساعد في تفويت حدث مهم، إضافة وظيفة إضافية (المقاطعات من أجهزة ضبط الوقت، المقاطعات الخارجية).

لنفترض أنه يمكنك شنق معالجة الأزرار، أو تتبع حدثا مهما. نتيجة لذلك، يصبح البرنامج أكثر بصرية ولكن ليس أقل مربكة.

لسوء الحظ، لن يتم حفظ المقاطعة من العصيدة، حيث يتحول البرنامج. لن يكون من الممكن تقسيم ما هو كله.

3. البرمجة التلقائية.

هنا يتم اختيارنا للموضوع الرئيسي لهذه المادة. البرمجة في Automata Finite تزيل البرنامج من أوجه القصور في الأمثلة الأولى المتأصلة. يصبح البرنامج أسهل، من السهل تعديله.

يشبه البرنامج المكتوبة في النمط التلقائي التبديل، والذي، اعتمادا على الظروف يتحول إلى حالة أو آخر. عدد مبرمج الدول معروف في البداية.

في وجهة نظر خشنة، هذا يشبه مفتاح الضوء. هناك دولتان تحولتان وإيقافها، وإيقاف الشرطين وإيقافها. حسنا، حول كل شيء بالترتيب.

تنفيذ تعدد المهام في تقنية التبديل.

ميكروكماني قادر على التحكم في الحمل، وميض المصابيح، وتتبع ضغط المفاتيح وأكثر من ذلك بكثير. ولكن كيف تفعل كل هذا في نفس الوقت؟ لحل هذه المشكلة هناك العديد من الحلول. أسهل منهم ذكرت هذا استخدام المقاطعات.

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

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

في البرامج المكتوبة في التبديل - التكنولوجيا، يتم الحصول على مثل هذا "وهم" تعدد المهام بفضل نظام المراسلة. كتبت "وهم" لأنه حقا، لأن البرنامج لا يفعل ذلك فعليا في نفس الوقت لأداء أقسام مختلفة من التعليمات البرمجية. سأخبرك عن نظام المراسلة أكثر قليلا.

نظام المراسلة.

قطع العديد من العمليات وإنشاء وهم تعدد المهام باستخدام نظام المراسلة.

لنفترض أننا بحاجة إلى برنامج يعمل فيه مفتاح LED. هنا لدينا Automaton، دعونا نسميها Ledon -التطبيق المسؤولية عن تشغيل الصمام والآلات التلقائية Ledoff - المسؤولة التلقائية لإيقاف تشغيل LED.

تحتوي كل من الآلات على دولتين، أي أن الجهاز يمكن أن يكون في حالة نشطة ولاية غير نشطة، مثل التبديل أو قيد التشغيل أو إيقاف تشغيله.

عند تنشيط جهاز واحد، مضاءة LED، عند تنشيط إخماد LED آخر. النظر في مثال صغير:

INT الرئيسي (الفراغ) (init_peref ()؛ // التهيئة البادئة الطرفية (LED) ()؛ // تهيئة initmessages () الموقتات؛ // تهيئة آلية معالجة الرسائل المطبوعة ()؛ // تهيئة ليدون آلة بدء التشغيل ()؛ // تهيئة آلة ledoff sendmessage (msg_ledon_activate)؛ // تنشيط ledon sei () الجهاز التلقائي ()؛ // السماح للمقاطعات // الدورة الرئيسية للبرنامج أثناء (1) (processledon ()؛ // اكتشاف ledon processledff ()؛ // iTerage ledoff processmessaes ()؛ // رسائل المعالجة)؛)

في السطر 3 -7، يحدث التهيئة المختلفة هناك. لذلك، فإنه لا يهتم بنا بشكل خاص. ولكن يحدث ذلك آخر التالي: قبل بدء الدورة الرئيسية (بينما (1))، نرسل رسالة إلى الجهاز

sendmessage (msg_ledon_activate)

المسؤول عن حرق الصمام. بدون هذا الرأس الصغير، لن يعمل شامان لدينا. بعد ذلك، فإن اللانهائي الرئيسي أثناء الدورة تؤدي العمل الرئيسي.

تراجع صغير:

الرسالة لديها ثلاث دول. وهي رسالة الرسالة قد تكون غير نشطة، ولكن تم إنشاء حالة غير نشطة ونشطة.

اتضح أن الرسالة كانت غير نشطة في البداية عندما أرسلنا رسالة، فقد تلقت الدولة "المنشأة ولكن غير نشط". وهذا يعطينا ما يلي. مع التنفيذ التسلسلي للبرنامج، لا تتلقى آلة Ledon رسالة. استضافة شركة Ledon Automaton التي لا يمكن قبول الرسالة بها الرسالة. نظرا لأن الرسالة لديها حالة "تعيين ولكن غير نشط"، يستمر البرنامج في تنفيذها.

بعد كل الآلات تصطدم ببساطة، تأتي قائمة الانتظار وظيفة التعمير (). يتم وضع هذه الميزة دائما في نهاية الدورة، بعد إجراء جميع تكرارات Automata. تعمل الدالة ProcessMessages ()، ببساطة ترجمة الرسالة من الحالة "تعيين ولكن غير نشط" في الحالة "بنشاط".

عندما تنفذ دورة لا نهاية لها الجولة الثانية، أصبحت الصورة مختلفة بالفعل مختلفة تماما. لن يكون تكرار آلة Procesledon خاملا. ستتمكن الآلة من قبول الرسالة، وانتقل إلى حالة حرق وكذلك بدوره بإرسال رسالة. سيتم توجيهها إلى آلة Ledoff و دورة الحياة سوف الرسائل كرر.

أريد أن أشير إلى أن الرسائل التي تحتوي على حالة "بنشاط"، عند تدميرها مع وظيفة المخططات، يتم تدميرها. لذلك، لا يمكن قبول الرسالة إلا بواسطة جهاز واحد. هناك نوع آخر من الرسائل - هذه رسائل البث، لكنني لن أعتبرها، في Artistarchevsky، كما أنها مغطاة جيدا.

توقيت

بمساعدة مؤسسة المراسلة الصحيحة، يمكننا التحكم في إجراء عملية تشغيل Automata النهائي، ولكن الرسائل فقط لن تفعلها.

ربما لاحظت أن الشظية السابقة للبرنامج المعطى كمثال لن يعمل كما تصور. ستقوم الآلات تبادل الرسائل، وسوف تبديل المصابيح، وهذا فقط لن نراه. سوف نرى فقط حرق الحرق الصمام.

كل ذلك لأننا لا نفكر في تأخير القراءة والكتابة. بعد كل شيء، نحن لسنا كافية لتشغيل المصابيح المصابيح، يجب أن يكون LED ليسا في كل ولاية، دعنا نقول لمدة ثانية.

ستكون الخوارزمية على النحو التالي:

يمكنك النقر للتكبير

نسيت إضافة مخطط لهذه الكتلة أنه عندما يكون الموقت الدموي، بالطبع، يتم تنفيذ الإجراء - إضاءة LED أو تبريده.

1. ندخل الدولة عن طريق إجراء رسالة.

2. تحقق من شهادة الموقت / العداد، إذا كان دمية، ثم إجراء إجراء، وإلا فإننا ببساطة نرسل رسالة إلى نفسك.

3. إرسال رسالة إلى الجهاز التالي.

4. الخروج

في المدخل التالي، يتكرر كل شيء.

تبديل برنامج التكنولوجيا. ثلاث خطوات.

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

البرنامج سأكون في لغة SI، لكنه ليس على الإطلاق معرفة أنه في الأجهزة النهائية التي تحتاج إلى الكتابة فقط على SI، يمكنك استخدام أي لغة برمجة أخرى.

سيكون البرنامج وحدات وسيتم تقسيمه إلى عدة ملفات. وحدات سنواجه ما يلي:

  • تحتوي وحدة دورة البرنامج الرئيسية على ملفات LEDS_BLINK.C، HAL.C، HAL.H
  • وحدة الموقت. يحتوي على ملفات Timers.c، Timers.h
  • وحدة معالجة الرسائل يحتوي على الرسائل. ملفات، الرسائل
  • آلة وحدة 1. يحتوي على Ledon.c، Ledon.h
  • الوحدة 2. يحتوي على ملفات Ledoff.c، Ledoff .h.

الخطوة 1.

قم بإنشاء مشروع وتوصيل الملفات على الفور من وحداتنا الثابتة به: Timers.c، Timers.h، الرسائل.

وحدة ملف LEDS_BLINK.C لدورة الهدف الرئيسي.

#include "Hal.h" #include "الرسائل" / / معالجة الوحدة النمطية #Include "Timers.h" // وحدة الموقت // مقاطعات الموقت // ########### ## ####################################################### ######################### isr (Timer0_ovf_vect) // الانتقال إلى مقاطعة المقاطعة (نوع الموقت الموقت) (Poldtimers ()؛ // معالج المقاطعة الموقت) / ############################################ ######### ################################################################## انا مين (باط) ؛ // التهيئة للمحيط (LEDs) bitgtimers ()؛ // تهيئة initmessages () الموقتات () الموقتات؛ // تهيئة آلية معالجة الرسائل المطبوعة ()؛ // التهيئة آلة ائتمان اللدمية ()؛ startgtimer (timer_sek) ؛ // بدء مؤقت sendmessage (msg_ledon_activate)؛ // تنشيط آلة FSM1 SEI ()؛ // السماح للمقاطعات // الدورة الرئيسية للبرنامج أثناء (1) (processledon ()؛ ()؛ التعمير ()؛ // معالجة الرسائل)؛)

في الأسطر الأولى، الاتصال بالبرنامج الرئيسي لبقية الوحدات النمطية. نحن هنا نرى أن وحدة الموقت وحدة معالجة الرسائل متصلة. مزيد من النص البرامج قادمة تجاوز ناقلات المقاطعة.

من الخط الدولي الرئيسي (باطلة)، يمكنك القول أن البرنامج الرئيسي يبدأ. ويبدأ في تهيئة كل شيء وكل شيء. هنا تقوم بتهيئة المحيط، أي أننا وضعنا القيم الأولية لمنافذ الإخراج للمقارنة والمحتوى التالي المتبقي لوحدة التحكم. كل هذا يجعل وظيفة init_peref، يتم إطلاقها هنا، على الرغم من أن جسمها الرئيسي هو في الملف HAL.C.

بعد ذلك، نرى تهيئة الموقتات، وحدة معالجة الرسائل، التهيئة التلقائية. هنا يتم تشغيل هذه الوظائف أيضا، على الرغم من أن الوظائف نفسها مسجلة في ملفات وحداتها. انظر كيف مريحة. لا يزال النص الرئيسي للبرنامج قابل للقراءة بسهولة ولا يتشبث به الرمز الزائد أرجل القمامة.

انتهت التهيئة الأساسية الآن، نحتاج إلى إطلاق الدورة الرئيسية. للقيام بذلك، أرسل رسالة ابتداء، وإلى جانب ذلك، نبدأ مراقبتنا تأخذ مؤقتا.

startgtimer (timer_sek)؛ // بدء تشغيل مؤقت SendMessage (msg_ledon_activate)؛ / / تنشيط آلة FSM1

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

Hal.H هو برنامج رأس وحدة دورة البرنامج الرئيسية.

#ifndef hal_h #Define hal_h #include #تضمن. // مكتبة قياسية بما في ذلك المقاطعات #Define LED1 0 #Define LED2 1 #Define LED3 2 # Define LED4 3 # Define Komparator ACSR // المقارنة # Define Viklkomparator 1<

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

لكن الملف Hal.c هو ملف قابل للتنفيذ، وكما ذكرت بالفعل، فإنه يحتوي على تهيئة مختلفة للأحياء.

#include "هالة" الفراغ init_peref (باطلة) (// تهيئة منافذ الإدخال / الإخراج // ######################### ######### ######### ############################################1 ######### ##### Komparator \u003d Viklkomparator؛ // التهيئة المقارنة - إيقاف DDRD \u003d 1<

حسنا، وحدة دورة البرنامج الرئيسية التي أظهرت الآن قد تركنانا لجعل الخطوة الأخيرة، نحتاج إلى كتابة وحدات من الآلات نفسها.

الخطوه 3.

غادرنا لكتابة وحدات من السيارات المحدودة، في حالتنا آلة ليدون وآلة LEDOFF. لتبدأ، سأقدم نص برنامج الإضاءة LED LED LEDON.C.

// ملف ledon.c #include "Ledon.h" #include "Timers.h" #include "الرسائل" غير موقعة Char Ledon_state؛ // متغير حالة الفراغ في الفراغ (باطلة) (LEDON_STATE \u003d 0؛ // هنا يمكنك تهيئة الآخرين // متغيرات الجهاز مع توافر) ProcessLodon Void (Void) (حالة 0: // غير نشط إذا الحالة (GetMessage (msg_ledon_activate)) // إذا كانت الرسالة، سيتم قبولها (// وسوف تحقق من ماكينة مؤقتا (GetGtimer (Timer_sek) \u003d\u003d One_sek) // إذا تم ضبط Timer على 1Sek، ثم قم بإجراء (Stopgtimer (Timer_sek)؛ Portd \u003d 1<

هنا، في الأسطر الأولى، كما هو الحال دائما، تكون المكتبات متصلة دائما ومتغيرات. بعد ذلك، لدينا بالفعل بالفعل وظائف التي قابلناها بالفعل. هذه هي ميزة التهيئة لجهاز InitledOl ووظيفة المعالج التلقائي Procolledon نفسه.

في جسم المعالج، هناك بالفعل عمل من الوظائف من وحدة الموقت ووحدة الرسائل. والمنطق نفسه مصنوع على أساس تصميم حالة التبديل. وهنا يمكنك أن ترى أن معالج الماكينة يمكن أن تكون معقدة أيضا عن طريق إضافة عدة مفاتيح للحالات.

سيكون ملف الرأس للجهاز أسهل:

// ملف fsm1 #ifndef Ledon_h #Define Ledon_h #include "Hal.H" الفراغ البدري (باطلة)؛ Void processledon (باطلة)؛ #إنهاء إذا.

هنا تقوم بتوصيل ملف Binder Hal.h وكذلك تحديد النماذج الأولية للوظائف.

ستبدو الملف المسؤول عن إيقاف تشغيل LED تقريبا أيضا في انعكاس المرآة، بحيث لن أسحبه هنا - التردد 🙂

يمكن تنزيل جميع ملفات المشروع لهذا الرابط \u003d\u003d\u003d\u003d \u003e\u003e\u003e حلقة الوصل.

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

بالمناسبة، خططت لعدد من المشاريع المثيرة للاهتمام التي ستكون مثيرة للاهتمام بشكل خاص، لذلك تأكد اشترك في مقالات جديدة وبعد أنا أيضا خطط لإجراء توزيع المواد الإضافية، الكثيرين مشتركين بالفعل من خلال الصفحة الرئيسية للموقع. يمكنك الاشتراك هنا.

حسنا، الآن لدي كل شيء حقا، لذلك أتمنى لك حظا سعيدا، مزاج رائع وفي اجتماعات جديدة.

مع N / N فلاديمير فاسيليف

نظرية السيارات المحدودة

نظرية أتمتاتا تكمن في نظرية المنشئين. Automaton النهائي هي واحدة من المفاهيم الأساسية. تحت تأثير تلقائي من قبل جهاز تقني موجود بالفعل، على الرغم من أنه يمكن بناء مثل هذا الجهاز، وبعض النماذج الرياضية والخصائص والسلوك يمكن أن يكون هاجرا باستخدام البرنامج على جهاز كمبيوتر. تتمثل Automaton النهائية بأحرف نماذج نظرية Automata وعادة ما تكون بمثابة جهاز تحكم لجميع الأنواع الأخرى من Automata. الوجهة لديها عدد من الخصائص:

· يمكن أن يحل Automaton النهائي عددا من مهام تجميع سهولة. تم بناء الوحدة المعجمية دائما على أساس Automaton النهائي.

· يتميز تشغيل Automaton النهائي بسرعة عالية.

· نمذجة Automaton Finite تتطلب كمية ثابتة من الذاكرة، والتي تبسط إدارة الذاكرة.

هناك عدد من النظرية والخوارزميات التي تسمح لنا بتصميم وتبسيط Automata النهائي.

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

تعريف: التلقائي النهائي هو نظام رسمي محدد باستخدام الكائنات التالية:

محدود الرموز الإدخال المتعددة؛

ولايات متعددة محدودة

· وظيفة التحولات التي يضعها كل زوج (الحالة الحالية، رمز الإدخال) حالة جديدة؛

· الحالة الأولية؛

مجموعة فرعية من الدول المخصصة على أنها السماح أو النهائي.

مثال. سنقوم بتحليل تشغيل التحقق من وحدة التحكم حتى أو عن الغريب عدد الوحدات في سلسلة تعسفية تتكون من الأصفار والوحدات. لنفترض أن الجهاز المحدود المقابل يجب أن "السماح" بجميع السلاسل التي تحتوي على عدد فردي من الوحدات وسلاسل "رفض" مع عددهم. دعنا نسمي هذا التلقائي "وحدة تحكم التكافؤ". نعتقد أن الرموز بخلاف 0 و 1 لا يمكن تقديمها إلى مدخل الجهاز. لذلك، تحتوي الأبجدية الإدخال من وحدة التحكم على مجموعة (0، 1). نعتقد أنه في وقت معين في الوقت المناسب، يتم التعامل مع التلقائي النهائي مع رمز إدخال واحد فقط، والمعلومات حول الأحرف السابقة في سلسلة الإدخال يحفظ باستخدام مجموعة محدودة من الدول. كمجموعة من الدول، سننظر في المجموعة (حتى العم)، ينبغي تحديد إحدى هذه الدول كواحدة أولية. دعهم دولة (حتى)، لأنه في الخطوة الأولى، فإن عدد الوحدات يقرأ صفر، والصفر هو رقم حتى. عند قراءة رمز الإدخال التالي، فإن حالة الجهاز إما تغييرات، أو يتم تخزينها كواحدة السابقة، وتعتمد حالتها الجديدة على رمز الإدخال والحالة الحالية. مثل هذا التغيير في الدولة يسمى الانتقال.



يمكن وصف تشغيل Automaton بواسطة الدالة الرياضية لانتقالات النموذج D (SEK.، X) \u003d SN. خلاف ذلك، يمكن كتابة هذا على النحو التالي:

د (حتى.، 0) \u003d شيت. د (حتى.، 1) \u003d العم.

د (لا.، 0) \u003d العم. د (العم، 1) \u003d حتى.

تتمتع وحدة التحكم بحالة واحدة معركة من العم، وهناك حالة "رفض". تعكس تسلسل التحولات التلقائية عند إرسال السلسلة 1101 إلى مدخلاتها.

وحدة Chet ® وحدة ® Chet® Chet®

جدول الانتقال لهذا الجهاز له النموذج:

شيت شيت اخو الام
اخو الام اخو الام شيت

تعريف. التلقائي النهائي هو نظام رسمي.

s \u003d (a، q، d، l، v)،

الكائنات هي كما يلي:

* مجموعة محدودة من أحرف الإدخال (مجموعة

محطات)؛

* س - مجموعة نهاية المطاف من سترات الداخلية للآلة

(العديد من مينالز)؛

* v هو مجموعة محدودة من أحرف الإخراج (الأبجدية الإخراج)؛

* D - وظيفة التحولات التي "Q ® Q؛

* L هي وظيفة الإخراج تحديد عرض العرض.

حاشية. ملاحظة: في هذه المحاضرة، تعتبر الطريقة الأكثر شيوعا للمهمة النهائية للغة الرسمية: قواعد اللغة والأتمتة. ونحن نعتبر أن السيارات النهائية تتوافق مع التسلسل الهرمي لحقل الحكم الأيمن، ومفاهيم Automaton Finite Automaton، وهو Automaton المحدود غير المحدد والمعترف به من قبل Automaton النهائي للغة. أمثلة عملية وتمارين لإصلاح المواد

إن أكثر الطرق شيوعا للمهمة النهائية للغة الرسمية هي قواعد اللغة والأتمتة. آلات في هذا السياق استدعاء النماذج الرياضية لبعض أجهزة الحوسبة. في هذه المحاضرة، تعتبر السيارات النهائية التي تتولى التسلسل الهرمي لتقديم الحكم الهومسكي من القواعد الدوائية. أقوى النماذج الحسابية سيتم تحديدها لاحقا، في المحاضرات "10"، "14" و "15". يمنح مصطلح "Automata" خلف اللغات المعترف به من قبل Automata المحدود، وليس من قبل أي عائلة أوسع من الآلات (على سبيل المثال، Automata مع ذاكرة المتجر أو Automata المحكبة الخطية).

يحدد القسم 2.1 مفاهيم Automaton Finite (للوضوح، مثل هذا التلقائي يمكن أن يسمى Automaton النهائي غير المحدد) والمعترف به من قبل Automaton النهائي للغة. يوفر القسم التالي آخر، ولكن يعادل التعريف الأول للغة المعترف بها من قبل Automaton النهائي. ليس من الضروري لمزيد من العرض التقديمي، لكن هذا التعريف الذي يمكن تعميمه في حالات أتمتة الأنواع الأخرى.

في القسم 2.3، ثبت أنه يمكن الحصول على نفس فئة Automata باستخدام آلات النوع الخاصة النهائي فقط (يقرأون في كل براعة بحرف واحد بالضبط ولديهم دولة أولية واحدة بالضبط). في العديد من الكتب المدرسية، تسمى هذه الآلات بنادق الجهاز النهائي.

تشكل سلسلة كاملة من النتائج الكلاسيكية لنظرية اللغات الرسمية نظرية المراسلات الدقيقة من بعض فصول القواعد إلى بعض فئات أتمتة. أول نظرية في هذه السلسلة، بحجة أن القواعد الرئيسية الصحيحة التي يتم إنشاؤها بواسطة اللغات التلقائية، ثبت في القسم 2.4.

يرتبط سلسلة أخرى من النتائج بالقدرة على تضييق بعض فئة قواعد اللغة دون تغيير فئة اللغة التي تم إنشاؤها من قبلها. عادة، في هذه الحالة، يسمى Grammar من فئة أصغر من النحو في الشكل العادي. القسم 2.5 * يصوغ نتيجة هذا النوع من القواعد اليمنى. هذا النظرية نفسها لا يمثل الكثير من الاهتمام، ولكن النتائج المماثلة التي أثبتت في وقت لاحق من القواعد الخالية من السياق تستخدم في العديد من الأدلة والخوارزميات.

ليست كل السيارات المحدودة مناسبة لبناء الاعتراف بالأجهزة المناسبة للتطبيقات العملية، كما هو الحال في الحالة العامة المحدود التلقائي لا يشير بالضبط إلى كيفية القيام به في الخطوة التالية، ويسمح بمتابعة عملية الحوسبة بعدة طرق. هذا القصور ليس في حتمية تلقائية تلقائية (حالة خاصة من الآلات المحدودة غير الحتمية) المحددة في القسم 2.6. يثبت القسم 2.7 أنه يتم تعيين كل لغة تلقائية من قبل بعض مدفع الجهاز النهائي المحدد.

2.1. السيارات النهائية غير الحتمية

التعريف 2.1.1.. المحدود التلقائي (Automaton Finite، آلة محدودة) هي خمسة، حيث - النهائي الأبجدية مدخل (أو ببساطة الأبجدية) من هذا Automaton المحدود، والمجموعات النهائية،

وبعد وتسمى العناصر س تنص على (الدولة)، عناصر الأول - خبرات (الأولي) الدول، عناصر F - نهائي أو المسموح به (النهائي، القبول) الدول. اذا كان ، ثم دعا انتقال (الانتقال) من P في Q، وكلمة الكلمة - ضع الكلمة المناسبة (تسمية) من هذا الانتقال.

مثال 2.1.2.وبعد دع Q \u003d (1،2)، ، أنا \u003d (1)، f \u003d (2)،

ثم - نهاية الجهاز.

ملاحظة 2.1.3.وبعد يمكن تصوير الآلات النهائية مخططات الدولة (مخطط الدولة) (يسمى بهم أحيانا أرقام الانتقال مخطط انتقال). في الرسم البياني، تشير كل دولة إلى دائرة، والانتقال هو سهم. يظهر السهم من P إلى Q، المسمى بكلمة x، أنه انتقال هذا الجهاز المحدود. يتم التعرف على كل دولة أولية من قبل السهم القصير الرائد. تتميز كل دولة بدخول بمخطط دائرة مزدوجة.

مثال 2.1.4.وبعد يوضح الرسم التخطيطي Automaton النهائي من مثال 2.1.2.

الملاحظة 2.1.5.وبعد إذا كانت هناك عدة انتقالات نهائية، فهناك تحتجز مع بداية إجمالية ونهاية عام، ثم يتم استدعاء هذه التحولات موازيوبعد في بعض الأحيان، في بعض الأحيان، يتم رسم تخطيطي لدول الدولة، ويتم تصوير التحولات الموازية بواسطة سهم واحد. في الوقت نفسه، يتم سرد الملصقات الانتقالية من خلال فاصلة.

مثال 2.1.6.وبعد يوضح الرسم التخطيطي Automaton النهائي من مثال 2.1.2.

التعريف 2.1.7.. طريق (المسار) من Automaton النهائي هو موكب، أينما مقابل كل ط. في هذه الحالة، Q 0 - بداية الطريق س ن - نهاية الطريق ن - طول المسار W 1 ... W N - مسار التسمية.

ملاحظة 2.1.8.وبعد لأي دولة هناك طريقة. تسمية له -، بداية ونهاية تتزامن.

تعريف 2.1.9.وبعد ويسمى المسار ناجح إذا بدأت ابدأ في الأول، والنهاية تنتمي و.

مثال 2.1.10.وبعد النظر في Automaton النهائي من مثال 2.1.2. الطريق ناجح. ملصقه هو بعب. طول هذا المسار هو 4.

التعريف 2.1.11.وبعد كلمة W. مسموح (مقبول، معترف به) آلة الحدث M، إذا كانت علامة على بعض الطريقة الناجحة.

التعريف 2.1.12.وبعد لغة، مراجعة الجهاز النهائي M، هذا هو l (m)، يتكون من ملصقات لجميع المسارات الناجحة (أي، من كل الكلمات المسموح بها بواسطة هذا Automaton). سنقول أيضا أن الجهاز م يتعرف على (يعترف، يقبل) L (م) اللغة.

ملاحظة 2.1.13.وبعد اذا كان ، ثم اللغة التعرف عليها بواسطة Automaton النهائي يحتوي على.

مثال 2.1.14.وبعد دع أين س \u003d (1،2)، ، أنا \u003d (1)، f \u003d (1،2)،

التعريف 2.1.15.وبعد بنادق الجهازين النهائيين مقابلإذا اعترفوا بنفس اللغة.

التعريف 2.1.16.وبعد وتسمى اللغة L التلقائي (اللغة المحدودة - اللغة) إذا كان هناك آلة محدودة تعترف بهذه اللغة.

الملاحظة 2.1.17.وبعد عادة ما تستخدم الكتب المدرسية تعريفا أضيقا لأجهزة Automaton النهائية غير المحددة، ولكن هذا لا يغير فئة Automata (انظر Lemma 2.3.3.).

مثال 2.1.18.وبعد النظر في الأبجدية النتيجة واحدة. مع أي ثابت ولغة إنه تلقائي.

الملاحظة 2.1.19.وبعد كل لغة محدودة تلقائية.

التعريف 2.1.20وبعد الشرط س. قابل للتحقيق (يمكن الوصول إليها) من الدولة ص، إذا كانت هناك طريقة، بدايةها ص، والنهاية هي س.

Lemma 2.1.21.. يتم التعرف على كل لغة سيارات من قبل بعض Automaton المحدود الذي تحقق فيه كل دولة من بعض الولاية الأولية ومن كل ولاية قابلة للتحقيق في حالة نهائية واحدة على الأقل..

مثال 2.1.22.وبعد النظر في Automat النهائي حيث س \u003d (1،2،3،4)، ، أنا \u003d (1،2،4)، f \u003d (1،3،4)،

في هذه المقالة، يهدف مصطلح "Automat النهائي" إلى وجود خوارزمية يمكن أن تكون في واحدة من عدد قليل من الدول. حالة "الحالة" هي حالة معينة تحدد العلاقة المحددة بين إشارات المدخلات والإخراج، وكذلك إشارات الإدخال والدول اللاحقة. أشار القارئ المقصود على الفور إلى أن الأجهزة النهائية الموصوفة في هذه المقالة هي آلات ميل. جهاز Mile هو Automaton النهائي، حيث توجد إشارات الإخراج هي وظائف الحالة الحالية وإشارة الإدخال، على عكس ماكينة مور، والتي تكون فيها إشارات الإخراج هي وظائف الشروط الوحيدة. في كلتا الحالتين، الدولة اللاحقة هي وظيفة الدولة الحالية وإشارة الإدخال.

النظر في مثال على Automaton المحدود البسيط. تخيل أنه في السلسلة النصية تحتاج إلى التعرف على تسلسل الأحرف "//". يوضح الشكل 1 كيف يتم تنفيذ هذا باستخدام آلة محدودة. لا يعطي المظهر الأول من القطع الخطية إشارة الإخراج، ولكنه يؤدي إلى حقيقة أن الجهاز يتحرك إلى الحالة الثانية. إذا لم يتم العثور على الجهاز في الحالة الثانية، فهو يعود إلى الأول، لأن وجود طبقات سريرين ضروريين. إذا تم العثور على الخط المائل الثاني، فإن الجهاز ينتج إشارة "إنهاء".

معرفة ما يحتاج إلى العملاء.

قم بإجراء مخطط انتقال الدولة

رمز "الهيكل العظمي" Automaton المحدود دون تفصيل عمليات الانتقال.

تأكد من أن التحولات تعمل بشكل صحيح.

حدد تفاصيل التحولات.

قضاء الاختبار.

مثال على آلة التلقائي المحدود

النظر في مثال أكثر إثارة للاهتمام على Automaton Finite - برنامج يتحكم في سحب وتمديد هيكل الطائرات. على الرغم من أن معظم الطائرات يتم تنفيذ هذا الإجراء باستخدام آلية مراقبة هيدروليكية كهربائية (لمجرد عدم وجود جهاز كمبيوتر على متنها)، في بعض الحالات، على سبيل المثال، في الطائرات غير المأهولة، فإن الأمر يستحق استخدام عنصر تحكم البرنامج.

لتبدأ، سوف نتعامل مع المعدات. يتكون هيكل الطائرات من الدعم الأمامي والهيكل الرئيسي الأيسر والهيكل الصحيح الرئيسي. وهي مدعومة من آلية هيدروليكية. المضخة الهيدروليكية مع إمدادات محرك كهربائي ضغط على مشغل الطاقة. باستخدام البرنامج، يتم تشغيل المضخة أو إيقافها. يضبط الكمبيوتر موقف صمام الاتجاه - "لأسفل" أو "أعلى" للسماح بالضغط لزيادة أو خفض الهيكل. يحتوي كل من يدعم الهيكل على مفتاح الحد: واحد منهم يغلق إذا تم رفع الهيكل، والآخر - إذا تم إصلاحه في وضع "لأسفل". لتحديد ما إذا كانت الطائرة على وجه الأرض، يتم إغلاق مفتاح النهاية على الدعم الأمامي إذا سقط وزن الطائرة على الدعم الأمامي. تتكون الضوابط الرائدة من ذراع الهيكل الأعلى / الأسفل وثلاثة المصابيح الكهربائية (واحد على كل دعم)، والتي يمكن أن تطفئ، تضيء الأخضر (الوضع لأسفل) أو الضوء الأحمر (موقف الانتقال).

والآن ننتقل إلى تطوير آلة محدودة. الأول، والأصعب الخطوة هي فهم التوقعات الحقيقية للعميل. أحد مزايا Automaton النهائية هو أنه يسبب مبرمجا يفكر في جميع الحالات الممكنة، ونتيجة لذلك، تلقي جميع المعلومات المطلوبة من العميل. لماذا أعتقد أن هذه هي المرحلة الأكثر صعوبة؟ وعدد المرات التي حصلت عليها وصفا للمهمة مثل هذا: لا تخفي الهيكل إذا كانت الطائرة على وجه الأرض.

بالطبع، هذا مهم، لكن العميل يعتقد أنه كل ينتهي. ماذا عن الحالات الأخرى؟ هل يكفي دفع الهيكل في تلك اللحظة عندما تخشى الطائرة من الأرض؟ ماذا لو كانت لاعبا الطائرة في البار على المدرج؟ ماذا لو أن الطيار يحول ذراع تبديل السرعة إلى وضع "UP" خلال وقوف السيارات، ونتيجة لذلك، ستبدأ الإقلاع؟ يجب أن الشاسيه في هذه الحالة تسلق؟

إحدى مزايا التفكير من حيث Automaton النهائي هي أنه يمكنك استخلاص مخطط انتقال الدولة بسرعة على لوحة الإسقاط، مباشرة أمام العميل، وتذهب من خلال العملية برمتها معها. هذا هو تعيين انتقال الدولة: "الحدث الذي تسبب في انتقال" / "إخراج الإخراج كأحد النتائج الانتقالية". إذا كنا نتطور فقط ما طرحته في البداية من العملاء ("لا تلتصق الهيكل إذا كانت الطائرة على الأرض")، فسنحصل على الجهاز المعروض في الشكل 2.

عند إعداد مخطط انتقال الدولة (أو أي خوارزمية أخرى)، تذكر ما يلي:

تعمل أجهزة الكمبيوتر بسرعة كبيرة مقارنة بالمعدات الميكانيكية.

مهندس ميكانيكي يشرح ما يجب القيام به قد لا يعرف عن أجهزة الكمبيوتر والخوارزميات لجميع ما تعرفه. وهذه هي أيضا لحظة إيجابية، وإلا فلن تحتاجها!

كيف سيتصرف برنامجك إذا استراحة جزء ميكانيكي أو كهربائي؟

يتم عرض Automaton النهائي بناء على ما هو مطلوب حقا للعميل في الشكل 3. هنا نريد منع مرفق هيكل الطائرات حتى يكون بالتأكيد في الهواء. للقيام بذلك، بعد فتح مفتاح اللمس، فإن الجهاز ينتظر خلال بضع ثوان. نريد أيضا أن تتفاعل مع مقدمة النمو في الرافعة الطيارية، وليس على المستوى، مما ستجنب المشاكل إذا نقل شخص ما الرافعة بينما تكون الطائرة في موقف للسيارات. يستغرق تشديد أو توسيع الهيكل بضع ثوان، ويجب أن نكون مستعدين للحالة التي سيغير فيها الطيار في عملية هذه العملية رأيهم ونقل الرافعة في الاتجاه المعاكس. لاحظ أيضا أنه إذا هبطت الطائرة مرة أخرى بينما نحن في انتظار حالة الإقلاع، فسوف يتم إعادة تشغيل الموقت وسحدث الهيكل ستحدث إلا إذا كانت الطائرة ستكون في الهواء لمدة ثانيتين.

تحقيق Automaton النهائي

الإدراج 1 هو تطبيقي في Automaton النهائي المعروض في الشكل 3. دعونا نناقش بعض تفاصيل التعليمات البرمجية.

/ * قائمة 1 * /

tITDEF ENUM. (Gear_Down \u003d 0، WTG_FOR_TKOFF، RAILISH_GEAR، GEAR_UP، Lowering_Gear) State_Type؛

/ * تحتوي هذه الصفيف على مؤشرات على الوظائف الناجمة في بعض الدول * /

فارغ. (* State_Table) () \u003d (تستحق الأدوية، Wtgfortakeoff، Raisinggear، Gearup، Linkinggear)؛

State_type curr_state؛

indicizeldggearsm ()؛

/ * قلب الجهاز - هذه الدورة التي لا نهاية لها. وظيفة المقابلة

وتسمى الحالة الحالية مرة واحدة في التكرار * /

في حين (1) {

state_table ()؛

strementtimer ()؛

فارغ. indicizeldggearsm ( فارغ. )

curr_state \u003d gear_down؛

/ * إيقاف المعدات، وإيقاف المصابيح الكهربائية، إلخ. * /

فارغ. تستحق ( فارغ. )

/ * اذهب إلى حالة الانتظار إذا كانت الطائرة

ليس على الأرض وحصل على فريق لرفع الهيكل * /

إذا.((Gear_lever \u003d\u003d UP) && (prev_gear_lever \u003d\u003d Down) && (Squat_switch \u003d\u003d UP)) (

curr_state \u003d wtg_for_tkoff؛

prev_gear_lever \u003d gear_lever؛

فارغ. Raisinggear ( فارغ. )

إذا. ((NEWNGEAR_IS_UP \u003d\u003d) && (Leftgear_is_up \u003d\u003d صنع) && (rtgear_is_up \u003d\u003d صنع)) (

curr_state \u003d gear_up؛

/ * إذا قام الطيار بتغيير قراره، فانتقل إلى ولاية "الهيكل السفلي" * /

إذا.(gear_lever \u003d\u003d أسفل) (

curr_state \u003d lowering_gear؛

فارغ. استعد ( فارغ. )

/ * إذا نقل الطيار الرافعة إلى موضع "لأسفل"،

انتقل إلى ولاية "الهيكل السفلي" * /

إذا. (gear_lever \u003d\u003d أسفل) (

curr_state \u003d lowering_gear؛

فارغ. Wtgfortakeoff ( فارغ. )

/ * في انتظار قبل رفع الهيكل. * /

إذا. (الموقت.<= 0.0) {

curr_state \u003d raising_gear؛

/ * إذا تطرقنا مرة أخرى أو غير الطيار القرار - بدءا من جديد مرة أخرى * /

إذا.((squat_switch \u003d\u003d أسفل) || (gear_lever \u003d\u003d أسفل)) (

curr_state \u003d gear_down؛

/ * لا تريد أن تحتاج إلى تبديل الرافعة مرة أخرى

كان هذا مجرد ترتد. * /

السابق_gear_lever \u003d لأسفل؛

فارغ. Linkinggear ( فارغ. )

إذا. (gear_lever \u003d\u003d أعلى) (

curr_state \u003d raising_gear؛

إذا. ((nowngear_is_down \u003d\u003d صنع) && (Leftgear_is_down \u003d\u003d) && (rtgear_is_down \u003d\u003d)) (

curr_state \u003d gear_down؛

أولا، قد تلاحظ أن وظيفة كل ولاية يتم تنفيذها بشكل منفصل. بالطبع، سيكون من الممكن تنفيذ تلقائي باستخدام مشغل التبديل مع حالة منفصلة "أوم لكل دولة، ولكن هذا يمكن أن يؤدي إلى وظيفة طويلة جدا (10-20 خطوط من التعليمات البرمجية لكل دولة واحدة لكل من 20-30 تنص على). يمكن أن يؤدي أيضا إلى أخطاء إذا قمت بتغيير التعليمات البرمجية في مراحل الاختبار النهائية. ربما لم تنسك أبدا مشغل الفاصل في نهاية Case`a، ولكن معي مثل هذه الحالات كانت. لن تندرج رمز دولة واحدة في التعليمات البرمجية الأخرى إذا كان لديك وظيفة منفصلة لكل ولاية.

لتجنب تطبيق بيان التبديل، يمكنني استخدام مجموعة من المؤشرات إلى وظائف الحالة، والمتغير المستخدم كوسيط صفيف، أعلن نوع المعمنة.

بالنسبة للبساطة، فإن معدات الإدخال / الإخراج المسؤولة عن قراءة حالة المفاتيح، وتشغيل المضخات وإيقافها، وما إلى ذلك، تمثل في شكل متغيرات بسيطة. من المفترض أن هذه المتغيرات هي "العناوين السحرية" المرتبطة بمعدات الوسائل غير المرئية.

شيء آخر واضح - في هذه اللحظة لا يلعب الكود دورا خاصا. يتحرك فقط من دولة إلى أخرى. هذه مرحلة متوسطة مهمة ولا ينبغي تجاهلها. بالمناسبة، سيكون من الجيد إضافة بيانات الطباعة، والسجناء بين توجيهات الترجمة الشرطية (#IFDEF Debug .. #endif)، والذي سيستمد الحالة الحالية وإشارات المدخلات.

يكمن مفتاح النجاح في التعليمات البرمجية التي تسبب انتقال الدول، أي يحدد حدوث إدخال البيانات.

إذا تم تمرير الشفرة بشكل صحيح من خلال جميع الولايات، فإن الخطوة التالية تصبح كتابة "ملء" التعليمات البرمجية، أي بالضبط ما تنتج إشارة الإخراج بالضبط. تذكر أن كل انتقال لديه إشارة الإدخال (حدث تسبب في ذلك) وإشارة الإخراج (جهاز I / O الأجهزة، كما هو الحال في مثالنا). في كثير من الأحيان من المفيد إصلاح في شكل جدول انتقال الدولة.

في جدول الدولة الانتقالي، يمثل سطر واحد لانتقال حالة واحدة.

عند ترميز شركة Automaton Finite، حاول الحفاظ على ماضيتها - الامتثال الواضح بين متطلبات العملاء والرمز. ربما، سيكون من الضروري إخفاء التفاصيل المتعلقة بالمعدات في مستوى آخر من الوظائف، على سبيل المثال، بحيث يكون رمز الجهاز النهائي قدر الإمكان جدول انتقال الدولة ومخطط انتقال الحالة. يساعد هذا التماثل على منع الأخطاء ويشرح سبب أهمية الأجهزة النهائية جزءا مهما من ترسانة مبرمجة النظم المدمجة. بالطبع، قد تحقق نفس التأثير من خلال تثبيت الأعلام وعدة متعددة إذا كان المشغلون، ومع ذلك، سيكون من الصعب للغاية تتبع التعليمات البرمجية ومقارنتها مع رغبات العملاء.

جزء الشفرة في قائمة 2 يوسع وظيفة Raisinggear (). لاحظ أن رمز الوظيفة Raisinggear () يسعى للحصول على صورة مرآة من جدول انتقال صفين لرفع العتاد.

فارغ. Raisinggear ( فارغ. )

/ * بعد أن يتم رفع جميع مفاتيح التبديل، انتقل إلى الحالة "chassis التي أثيرت" * /

إذا. ((NEWNGEAR_IS_UP \u003d\u003d) && (Leftgear_is_up \u003d\u003d صنع) && (rtgear_is_up \u003d\u003d صنع)) (

pump_motor \u003d إيقاف؛

gear_lights \u003d إطفاء؛

curr_state \u003d gear_up؛

/ * إذا غير الطيار ذهنه، ابدأ في سحب الهيكل * /

إذا. (gear_lever \u003d\u003d أسفل) (

pump_direction \u003d أسفل؛

curr_state \u003d gear_lowering؛

تذكر أن الدول المخفية يجب تجنبها. تظهر الحالة المخفية عند، نظرا للكسل، تحاول إضافة إشارة معدنية مشروطة بدلا من إضافة دولة محددة. على سبيل المثال، إذا كانت التعليمات البرمجية تعالج نفس إشارة الإدخال بطرق مختلفة (I.E.E.، فإنها تبدأ التحولات المختلفة للدولة) اعتمادا على الوضع، فهي حالة مخفية. في هذه الحالة، أعتقد، ولا ينبغي تقسيمها من قبل اثنين؟ استخدام الدول المخفية ينفي الميزة بأكملها باستخدام Automaton Finite.

كممارسة تجريب، يمكنك توسيع Automaton النهائي، والتي نظرنا فيها للتو بإضافة مهلة إلى دورة التراجع أو تمديد الهيكل، لأن مهندس ميكانيكي لا يريد مضخة هيدروليكية لفترة أطول من 60 ثانية. إذا انتهت الدورة، يجب تحذير الطيار من خلال تحويل المصباح الخضراء والأحمر، ويجب أن يكون قادرا على نقل الرافعة مرة أخرى لتكرار المحاولة. يمكنك أيضا طرح مهندس ميكانيكي افتراضي، حيث تأثرت بتغيير المضخة إلى العكس أثناء عملها، لأنه يحدث في 2 حالات عندما يغير الطيار ذهنه. بالطبع، سيقول الميكانيكي سلبا. ثم كيف يمكنك تغيير التلقائي النهائي لإيقاف المضخة بسرعة عند تغيير الاتجاه؟

اختبار آلة التلقائي المحدود

سحر ترميز الخوارزميات في شكل أتمتة محدود هو أن خطة الاختبار مكتوبة تلقائيا تقريبا. كل ما عليك فعله هو الذهاب من خلال كل انتقال الدولة. عادة ما أفعل ذلك مع علامة في يدي، مع عبور الأسهم الموجودة في مخطط انتقال الدولة لأنها تمر بنجاح الاختبار. هذه طريقة جيدة لتجنب "الدول المخفية" - في الاختبارات التي يتم تجاهلها في كثير من الأحيان أكثر من دول محددة.

يتطلب هذا صبرا كبيرا وكمية كبيرة من القهوة، مثل آلة حافة متوسطة الحجم يمكن أن يكون لها ما يصل إلى 100 عملية انتقالية مختلفة. بالمناسبة، يعد عدد التحولات وسيلة ممتازة لقياس تعقيد النظام. يتم تحديد هذا الأخير بمتطلبات العميل، والآلية النهائية يجعل أحجام الاختبار. من خلال نهج أقل تنظيما، قد يكون حجم الاختبار المطلوب مثير للإعجاب، لكنك لا تعرف ذلك فقط.

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

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

جري

عند الوفاء بجميع متطلبات العميل، يمكنني تشغيل آلة محدودة من هذا التعقيد في غضون يومين. دائما ما يقرب من الآي الآلي لأداء ما أريد. الشيء الأكثر صعوبة هو، بالطبع، أن يفهم بدقة ما يريده العميل والتأكد من أن العميل يعرف ما يريد. هذا الأخير يستغرق المزيد من الوقت!

مارتن جوميز - مختبر مبرمج للفيزياء التطبيقية بجامعة جون هوبكنز. تشارك في تطوير البرامج لضمان الرحلات الجوية المركبة الفضائية البحثية. عملت في تطوير أنظمة مضمنة لمدة 17 عاما. مارتن - بكالوريوس العلوم في مجال هندسة الفضاء والسيد في مجال هندسة الكهرباء (جامعة كورنيل).

تناقش المقالة آلات محدودة بسيطة وتنفيذها على C ++ باستخدام هياكل التبديل، وجداول الوقت التنفيذ ومكتبة Boostechart.

مقدمة

بالتحدث تقريبا، الجهاز النهائي (آلة الحالة المحددة)، وعيون المستخدم - هذا مربع أسود، حيث يمكنك أن تنقل شيئا واحصل على شيء من هناك. هذا هو تجريد مريح للغاية يسمح لك بإخفاء الخوارزمية المعقدة، باستثناء السيارات النهائية فعالة للغاية.

تصور الآلات النهائية في شكل مخططات تتكون من دول وانتقال. سأشرح على مثال بسيط:

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

تستخدم جداول السفر على نطاق واسع:

تطبيق عملي لأتمتة

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

أيضا، يتم استخدام Automata النهائي لكتابة جميع أنواع المحللين ومحللات النصوص، بمساعدة منهم يمكنك البحث بفعالية عن السلسلة الفرعية، يتم بث التعبيرات العادية أيضا إلى التلقائي النهائي.

على سبيل المثال، نقوم بتنفيذ تلقائي لعد الأرقام والكلمات في النص. لتبدأ، نوافق على أن الرقم سيعتبر سلسلة من الأرقام من 0 إلى 9 بطول تعسفي، محاط برموز الفضاء (الفضاء، علامة التبويب، ترجمة الصف). سيتم اعتبار كلمة واحدة سلسلة من الطول التعسفي الذي يتكون من رسائل وتحيط أيضا برموز الفضاء.

النظر في الرسم البياني:

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

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

بعد التبديل إلى الدولة بداية.، تتكرر دورة البحث من البداية. يشبه الفرع مع الاعتراف بالأرقام فرع التعرف على كلمة.

آلة باستخدام تعليمات التبديل

الأول ممكن:

بعد ذلك، نشأنا على الخط تطبيق آلة الرموز الحالية. الجهاز نفسه هو عبارة التبديل يؤدي أولا إلى الانتقال إلى قسم الحالة الحالي. القسم الداخلي، هناك تصميم IF- وإلا، وهذا، اعتمادا على الحدث (الرمز المشاهد)، يغير الحالة الحالية:

طول size_t cond \u003d text.length ()؛ ل (size_t i \u003d 0؛ i! \u003d الطول؛ ++ i) (const char الحالي \u003d text [i]؛ switch (state_start: if (std :: isdigit (الحالي)) (state \u003d state_number؛) آخر إذا (STD :: Isalpha (الحالي)) (الدولة \u003d State_word؛) استراحة؛ حالة Station_number: IF (STD :: ISSPACE (الحالي)) (

نحن هنا ننظر إلى الرسم البياني - الدولة الحالية عددحدث مساحة. (قدم رمز فارغ)، مما يعني أن الرقم الموجود:

مؤسسة ()؛ الدولة \u003d State_Start؛ ) آخر إذا (! STD :: ISDigit (الحالي)) (الحالة \u003d State_skip؛) استراحة؛ حالة State_word: IF (STD :: ISSPACE (الحالية)) (Foundword ()؛ الحالة \u003d State_Start؛) آخر إذا (! STD :: Isalpha (الحالي)) (State \u003d State_skip؛) استراحة؛ حالة State_skip: IF (STD :: ASSPACE (الحالية)) (الحالة \u003d State_Start؛) استراحة؛ ))

حصيلة:

كفاءة عالية

من السهل تنفيذ الخوارزميات البسيطة

- من الصعب الحفاظ عليها

تفسير وقت التنفيذ

فكرة هذا النهج بسيطة - تحتاج إلى إنشاء جدول انتقالي، وملء ذلك، ثم، عند حدوث حدث، ابحث عن الحالة التالية في الجدول وجعل الانتقال:

Enum Events (Event_Space، Event_Digit، Event_Letter، Event_INknown)؛ باطل processevent (حدث الأحداث)؛ ... بنية الانتقال (الدول basestate_؛ الأحداث الحدث_؛ الدول المستهدفة_؛)؛ addtransition الفراغ (الدول الممتازة، حدث الأحداث، تمرد الدول)؛ ... TypeDef STD :: ناقل< transition> الانتقال؛ الانتقال الانتقالي_؛ الدول currentstate_؛

تعبئة الجدول:

AddTransition (State_Start، Event_Digit، State_number)؛ AddTransition (State_Start، Event_Letter، State_word)؛ AddTransition (State_Number، Event_Space، State_Start)؛ AddTransition (State_number، Event_Letter، State_skip)؛ addtransition (state_number، event_unknown، state_skip)؛ AddTransition (State_word، Event_Space، State_Start)؛ AddTransition (State_word، Event_Digit، State_skip)؛ AddTransition (State_word، Event_unknown، State_skip)؛ AddTransition (State_skip، Event_space، State_start)؛

اتضح بشكل واضح جدا. سيكون الدفع مقابل الوضوح هو التشغيل البطيء للجهاز، وهو عدد المرات التي لا يهمها.

بحيث تتمكن Automaton، عند حدوث بعض الأحداث، يمكن إضافة بعض التعليمات البرمجية، يمكن إضافتها إلى بنية معلومات الانتقال ( انتقال.) مؤشر إلى الوظيفة ( عمل.)، والتي سوف تسمى:

Typedef Void (Dynamicmachine :: * الإجراء) ()؛ بنية الانتقال (الدول Basestate_؛ الأحداث الحدث_؛ الدول المستهدفة_؛ إجراء عمل_؛)؛ ... addtransition الفراغ (الدول الممتازة، حدث الأحداث، تمرد الدول، عمل العمل)؛ ... AddTransition (State_Number، Event_Space، State_Start، & DynamicMachine :: Foundnumber)؛

حصيلة:

المرونة والوضوح

أسهل للحفاظ على

- الأداء الصغير مقارنة بالكتل التبديل

تفسير وقت التنفيذ. تحسين السرعة

هل من الممكن الجمع بين الرؤية بسرعة؟ جعل التلقائي فعال مثل الجهاز على كتل التبديل من غير المرجح أن تنجح، ولكن يمكن تخفيضها. للقيام بذلك، من الضروري من الجدول، بناء مصفوفة، بحيث الحصول على معلومات حول الانتقال بعدم البحث، ولكن اصنع عينة من رقم الحالة والأحداث:

يتم تحقيق النتيجة، بسبب استهلاك الذاكرة.

حصيلة:

المرونة والوضوح

فعال

- استهلاك الذاكرة (على الأرجح ضئيلا)

تعزيز statechart.

ناقشنا عدة طرق لتنفيذ Automaton Finite. بالنسبة لمجموعة متنوعة أقترح النظر في مكتبة بناء Automata من دفعة. هذه المكتبة قوية جدا، وتتيح لك القدرات المقترحة بناء آلات محدودة معقدة للغاية. سنعتبر ذلك يعمل تماما.

لذلك، حدد أولا الأحداث:

أحداث مساحة الاسم (منظم: Bost :: Statechart :: Event< Digit> ()؛ بنية رسالة: Boost :: Statechart :: Event< Letter> ()؛ بنية الفضاء: Boost :: Statechart :: Event< Space> ()؛ غير معروف: Boost :: Statechart :: Event< Unknown> { } ; }

الجهاز نفسه (لاحظ أن المعلمة الثانية للقالب هي الحالة الأولية):

آلة الهيكل: دفعة :: Statechart :: State_machine< Machine, States:: Start > { } ;

وفي الواقع الدول نفسها. داخل الولايات التي تحتاج إليها لتحديد نوع التحولات وصف ( تفاعلات.)، وإذا كان هناك العديد من التحولات، ثم سردها في القائمة دفعة :: MPL :: قائمة قائمة. قالب المعلمة الثانية simple_state. - اكتب آلة وصفها. يتم وصف التحولات بواسطة معلمات قالب الانتقال، زوج الحدث - الحالة التالية:

مساحة الاسم (بداية البداية: Boost :: Statechart :: Simple_state< Start, Machine> < boost:: statechart :: transition < Events:: Digit , States:: Number >< Events:: Letter , States:: Word > \u003e ردود الفعل؛ ) رقم الهيكل: Boost :: Statechart :: Simple_state< Number, Machine> (Typedef Boost :: MPL :: List< boost:: statechart :: transition < Events:: Space , States:: Start > ، دفعة :: Statechart :: الانتقال< Events:: Letter , States:: Skip > ، دفعة :: Statechart :: الانتقال< Events:: Unknown , States:: Skip > \u003e ردود الفعل؛ ) بنية الكلمة: دفعة :: Statechart :: Simple_state< Word, Machine> (Typedef Boost :: MPL :: List< boost:: statechart :: transition < Events:: Space , States:: Start > ، دفعة :: Statechart :: الانتقال< Events:: Digit , States:: Skip > ، دفعة :: Statechart :: الانتقال< Events:: Unknown , States:: Skip > \u003e ردود الفعل؛ ) بنية تخطي: Boost :: Statechart :: Simple_state< Skip, Machine> (Bypedef Boost :: Statechart :: الانتقال< Events:: Space , States:: Start > تفاعلات؛ ) في

تم بناء الجهاز، بل لا يزال فقط لتهيئة ذلك ويمكنك استخدام:

آلة آلة؛ Machine.Initiate ()؛ ... آلة .process_event (الأحداث :: Space ())؛

حصيلة:

المرونة، القابلية للضغط

- كفاءة

سرعة

كتبت برنامج اختبار للتحقق من سرعة Automata المبني. قادت النص بحجم ~ 17 ميغابايت من خلال Automata. فيما يلي نتائج المدى:

تحميل النص طول النص: 17605548 بايت 0.19 ثانية تشغيل Boostmachine الكلمات: 998،002، أرقام: 6816 0.73 ج قيد التشغيل كلمات الديناميكية: 998،002، أرقام: 6816 0.56 ثانية تشغيل كلمات Fastdynamicmachine: 998،002، أرقام: 6816 0.29 S قيد التشغيل كلمات Simplemachine: 998،002، أرقام: 6816 0.20 S.

ما لا يزال لا يعتبر

بضعة تطبيقات أخرى من تطبيقات السيارات المحدودة ظلت غير مطهية (أوصي http://www.rsdn.ru/article/alg/static_finite_state_machine.xml و http://www.rsdn.ru/article/alg/finitestatemachine.xml)، مولدات آلات البناء من الأوصاف، مكتبة آلة الحالة المعتوية من Boost الإصدار 1.44.0، وكذلك الأوصاف الرسمية للأتمتة المحدودة. مع كل القارئ الغريب المدرج يمكن أن تعرف نفسك.