۴۸صنعت
+۵۰۰زیرسیستم
+۱۰۰۰پروژه
۱۸سال
شرکتصنایعسامانه‌ها و APIتماسدانلود
درس ۱۳ از ۱۵۱۸ دقیقه

اسکریپت، ماشین حالت، سناریو و آزمایشگاه تست

هدف درس

سه سازوکار اجرایی موتور منطق را از هم تفکیک می‌کنید، یک اسکریپت زمان‌بندی‌شده، یک ماشین حالت و یک سناریو می‌سازید و پیش از اتکا به آن‌ها، منطق را در آزمایشگاه تست و روی دادهٔ شبیه‌سازی می‌سنجید.

کجای نرم‌افزار

«طراحی سیستم» ← «طراحی منطقی» ← «موتور قوانین و اتوماسیون» ← زبانه‌های «اسکریپت‌ها»، «سناریوها»، «ماشین‌های حالت» و «آزمایشگاه تست»

قانون برای «اگر این، آنگاه آن» ساخته شده است. اما کارهای واقعی بهره‌برداری معمولاً ترتیب دارند (پمپ را روشن کن، سی ثانیه صبر کن، شیر را باز کن)، یا حالت دارند (چیلر: خاموش، شارژ، عملیات، تعمیر)، یا یک بستهٔ قابل برگشت‌اند (حالت تعطیلی ساختمان و بازگرداندن آن). برای این سه، سامانه سه سازوکار جدا دارد: اسکریپت، ماشین حالت و سناریو. و برای اینکه هیچ‌کدام کورکورانه روی تجهیز واقعی اجرا نشود، «آزمایشگاه تست» وجود دارد.

کدام سازوکار برای کدام کار

سازوکارمسئلهٔ اصلینمونه
اسکریپت اتوماسیونتوالی گام‌ها با تأخیر، شرط و حلقهراه‌اندازی ترتیبی موتورخانه، گزارش هفتگی
ماشین حالتفرآیندی که «الان کجاست» اهمیت داردچرخهٔ عمر چیلر، حالت‌های UPS، آسانسور
سناریوبستهٔ اقدام‌ها که فعال و بعد بازگردانده می‌شودحالت تخلیهٔ اضطراری، حالت خواب ساختمان

هر سه زبانه چیدمان یکسانی دارند: کادر جست‌وجو…، دکمهٔ بارگذاری مجدد، دکمهٔ سبز مورد جدید و کارت‌هایی که نام، توضیح، کلید فعال/غیرفعال، تراشهٔ ID و دکمه‌های ویرایش و حذف دارند. دکمهٔ اصلی هر کارت فرق می‌کند: اجرا برای اسکریپت (که هنگام اجرا به توقف تبدیل می‌شود)، فعال‌سازی/غیرفعال‌سازی برای سناریو و Reset برای ماشین حالت.

زبانهٔ اسکریپت‌ها با کارت‌های اسکریپت پروژه
زبانهٔ «اسکریپت‌ها» · تراشهٔ نوع محرک، شمار اجرا و دکمهٔ «اجرا» روی هر کارت

اسکریپت اتوماسیون

پنجرهٔ ساخت اسکریپت این فیلدها را دارد: نام، توضیحات، نوع محرک (MANUAL، ACV_CHANGE، ACV_CONDITION، SCHEDULE، RULE_FIRED)، ENID محرک، شرط محرک، Cron، مراحل اجرا (JSON) و Action هنگام خطا (JSON).

گام‌ها را با JSON می‌نویسید. نوع‌هایی که موتور اجرا می‌کند:

نوع گامفیلدهاکار آن
SET_VALUEtargetEnid و value یا expressionنوشتن مقدار در یک نقطه
DELAYdelayMsمکث بین دو گام
CONDITIONcondition، thenSteps، elseStepsانشعاب شرطی
LOOPloopType، count، condition، maxIterations، bodyStepsتکرار گام‌ها
NOTIFICATIONchannel، message، subject، recipientsارسال پیامک یا ایمیل
PARALLELstepsاجرای هم‌زمان چند گام

در متن پیام یک گام اعلان می‌توانید مقدار لحظه‌ای یک نقطه را با قالب ${ACV['enid']} درج کنید.

ماشین حالت

پنجرهٔ ماشین حالت این فیلدها را دارد: نام، توضیحات، ENID هدف (نقطه‌ای که ماشین را می‌راند)، شناسه State اولیه، Stateها (JSON)، Transitionها (JSON) و فراداده (JSON). هر حالت id و name دارد و می‌تواند isInitial، isFinal، timeoutMs، timeoutTargetStateId و اقدام‌های ورود و خروج داشته باشد. هر گذار با fromStateId و toStateId مشخص می‌شود و می‌تواند نقطهٔ محرک، شرط، نگهبان، نام رویداد و اولویت داشته باشد.

زبانهٔ ماشین‌های حالت با کارت هر ماشین
زبانهٔ «ماشین‌های حالت» · چرخهٔ حالت‌ها در توضیح کارت، ENID هدف و دکمهٔ Reset

سناریو

پنجرهٔ سناریو این فیلدها را دارد: نام، توضیحات، نوع فعال‌سازی (MANUAL، RULE، EXPRESSION، SCHEDULE)، عبارت فعال‌سازی، شرط غیرفعال‌سازی، زمان وقفه بر حسب دقیقه، شناسه قوانین مرتبط، Actionهای فعال‌سازی (JSON) و Actionهای غیرفعال‌سازی (JSON). اقدام‌ها معمولاً به شکل [{"targetEnid":"…","value":"1","delayMs":0}] نوشته می‌شوند و فهرست غیرفعال‌سازی معمولاً عکس فهرست فعال‌سازی است.

پنجرهٔ ویرایش سناریو با نوع فعال‌سازی و اقدام‌های JSON
زبانهٔ «سناریوها» · هر کارت یک سناریو با شناسه، وضعیت و دکمهٔ «فعال‌سازی»/«غیرفعال‌سازی»

گام‌به‌گام

  1. یک اسکریپت زمان‌بندی‌شده بسازید. زبانهٔ اسکریپت‌ها ← مورد جدید. نام را بنویسید (خالی بماند پیام «نام الزامی است.» می‌گیرید)، نوع محرک را SCHEDULE بگذارید و در Cron مثلاً 0 0 6 * * * بنویسید. برای محرک ACV_CONDITION به‌جای Cron، ENID محرک و شرط محرک (مثل ACV['<ENID>'] > 30) را پر کنید.
  2. گام‌ها را بنویسید و ذخیره کنید. در مراحل اجرا (JSON) فهرست گام‌ها را وارد کنید. JSON نادرست ذخیره نمی‌شود و پیام «ساختار JSON معتبر نیست: …» می‌آید. پس از ذخیره پیام «ذخیره شد» را می‌بینید.
  3. اجرای دستی را آگاهانه انجام دهید. دکمهٔ اجرا روی کارت، پرسش تأیید «اسکریپت «…» اجرا شود؟ Actionهای آن ممکن است روی سیستم اثر بگذارند.» را نشان می‌دهد. پس از تأیید پیام «اجرا شروع شد · ID n» می‌آید و دکمه به توقف تبدیل می‌شود. این اجرا واقعی است، نه آزمایشی.
  4. ماشین حالت را تعریف کنید. زبانهٔ ماشین‌های حالت ← مورد جدید. ENID هدف را بگذارید، حالت‌ها را در Stateها (JSON) و گذارها را در Transitionها (JSON) بنویسید. تعریف ناقص ذخیره نمی‌شود و خطای «Invalid state machine: …» می‌آید — مثلاً وقتی حالت اولیه تعریف نشده یا گذاری به حالتی ناشناخته اشاره می‌کند.
  5. سناریو را بسازید و برگرداندنش را هم بنویسید. زبانهٔ سناریوها ← مورد جدید. نوع فعال‌سازی را انتخاب کنید (برای EXPRESSION عبارتی مثل ACV['<دتکتور دود>'] == 1)، هر دو فهرست Action را پر کنید و در صورت نیاز شرط غیرفعال‌سازی یا زمان وقفه بگذارید. اگر موتور بخشی از تعریف را نتواند اجرا کند، هنگام ذخیره هشدار زرد «ذخیره شد، اما موتور آن را اجرا نمی‌کند: …» می‌گیرید — این هشدار را جدی بگیرید.
  6. شبیه‌ساز را همگام کنید. «طراحی سیستم» ← «شبیه‌ساز دستگاه‌ها» و دکمهٔ همگام‌سازی پروژه. بدون این کار آزمایشگاه تست دادهٔ پروژهٔ شما را ندارد.
  7. در آزمایشگاه تست ارزیابی کنید. به زبانهٔ آزمایشگاه تست برگردید و بازآوری را بزنید؛ کاشی وضعیت Snapshot باید «آماده» شود. قانون موردنظر را از فهرست قانون پروژه انتخاب و تنظیم و ارزیابی را بزنید تا پنجرهٔ آزمون امن باز شود.
    زبانهٔ آزمایشگاه تست با وضعیت Snapshot آماده
    آزمایشگاه تست · کاشی «وضعیت Snapshot»، شمار متغیرها و انتخاب قانون برای ارزیابی؛ هشدار بالای صفحه می‌گوید Snapshot باید با پروژه همگام شود
پشت صحنه: هر سه سازوکار روی سرور اجرا می‌شوند و با تغییر مقدار نقاط مرتبط بررسی می‌شوند. اسکریپت با محرک شرطی هر بار که شرط برقرار شود دوباره شروع می‌شود و به‌طور پیش‌فرض اجرای هم‌زمان دو نمونه از یک اسکریپت مجاز نیست. سناریوی EXPRESSION فقط روی «لبهٔ بالارونده» فعال می‌شود، یعنی در لحظه‌ای که شرط از نادرست به درست تغییر می‌کند؛ مهلت سناریو پس از راه‌اندازی مجدد سرور هم ادامه می‌یابد. ماشین حالت با اولین مقدار نقطهٔ هدف شروع به کار می‌کند، حالت جاری را در پایگاه داده نگه می‌دارد و پس از راه‌اندازی مجدد از همان حالت ادامه می‌دهد؛ در هر تغییر فقط یک گذار انجام می‌شود و شرط و نگهبان هر دو باید برقرار باشند.

نکته‌ها و اشتباه‌های رایج

  • در همهٔ عبارت‌ها نقطه را با ACV['ENID'] بنویسید؛ عبارتی که هیچ نقطه‌ای را نام نبرد هرگز ارزیابی نمی‌شود.
  • موتور فقط گام‌های SET_VALUE، DELAY، CONDITION، LOOP، NOTIFICATION و PARALLEL را اجرا می‌کند؛ نوع‌های دیگر بی‌صدا نادیده گرفته می‌شوند. اگر گامی اثر نکرد، اول نوع آن را بررسی کنید.
  • Action هنگام خطا (JSON) ذخیره می‌شود ولی در نسخهٔ فعلی اجرا نمی‌شود؛ رفتار امن در برابر خطا را با گام CONDITION در خود توالی بسازید.
  • کلید روی کارت سناریو یعنی «تعریف فعال است یا نه»، ولی دکمهٔ فعال‌سازی یعنی «همین حالا اجرا شود». این دو را با هم اشتباه نگیرید؛ سناریوی غیرفعال نه با محرک و نه دستی اجرا نمی‌شود.
  • در سناریو زمان وقفه برابر ۰ یعنی بدون مهلت؛ سناریو تا غیرفعال‌سازی دستی یا برقرار شدن شرط غیرفعال‌سازی فعال می‌ماند.
  • INTERVAL: کمتر از ۱۰۰۰ میلی‌ثانیه پذیرفته نمی‌شود و همهٔ زمان‌ها به وقت سرور است.
  • ماشین حالت از حالتی که در آن مانده ادامه می‌دهد؛ پس از تغییر تعریف، با Reset آن را به حالت اولیه برگردانید.
  • آزمون امن هیچ اقدامی اجرا نمی‌کند، ولی تغییر واقعی مقدار از کنسول شبیه‌ساز مسیر کامل را طی می‌کند و می‌تواند اقدام‌های قانون‌ها را اجرا کند. این دو را از هم جدا نگه دارید.

خلاصه

  • توالی → اسکریپت، حالت → ماشین حالت، بستهٔ قابل برگشت → سناریو.
  • گام‌ها و تعریف‌ها JSON‌اند؛ ساختار نامعتبر ذخیره نمی‌شود و هشدار «موتور آن را اجرا نمی‌کند» یعنی تعریف ذخیره شده ولی بی‌اثر است.
  • سناریوی EXPRESSION فقط در لحظهٔ درست‌شدن شرط فعال می‌شود، نه تا وقتی شرط برقرار است.
  • اجرای دستی اسکریپت و فعال‌سازی سناریو واقعی‌اند؛ آزمایشگاه تست جای تمرین بی‌خطر است.
  • آزمایشگاه تست بدون همگام‌سازی پروژه در شبیه‌ساز کار نمی‌کند.

تمرین عملی روی دموی زنده

روی دموی عمومی (هولدینگ ارگ) کار کنید. دکمه‌های اجرا، فعال‌سازی و Reset اجرای واقعی‌اند؛ در این تمرین آن‌ها را نزنید و چیزی را حذف نکنید.

  1. در زبانهٔ اسکریپت‌ها یک اسکریپت SCHEDULE را با آیکون ویرایش باز کنید. از روی Cron و مراحل اجرا (JSON) بنویسید این اسکریپت چه زمانی و دقیقاً چه کاری می‌کند، سپس انصراف را بزنید.
  2. در ماشین‌های حالت ماشین حالت چیلر یا UPS را باز کنید و از روی JSON، نمودار حالت‌ها و گذارها را روی کاغذ بکشید و حالت اولیه را مشخص کنید.
  3. در سناریوها یک سناریو را باز کنید و دو فهرست Action فعال‌سازی و غیرفعال‌سازی را مقایسه کنید: آیا غیرفعال‌سازی همهٔ تغییرها را برمی‌گرداند؟
  4. زبانهٔ آزمایشگاه تست را باز کنید و وضعیت کاشی وضعیت Snapshot را یادداشت کنید. اگر «نیازمند همگام‌سازی» بود، توضیح دهید برای آماده‌شدن چه گامی لازم است.
باز کردن دموی زنده

آزمون درس

برای گذراندن درس دست‌کم به ۳ پرسش از ۴ پرسش پاسخ درست بدهید.

  1. ۱. سناریویی با نوع فعال‌سازی EXPRESSION و عبارت ACV['X'] == 1، در حالی که X مدت‌هاست ۱ است، کِی فعال می‌شود؟
  2. ۲. کدام نوع گام در «مراحل اجرا (JSON)» اسکریپت اجرا نمی‌شود؟
  3. ۳. ذخیرهٔ ماشین حالتی که گذارش به حالتی ناشناخته اشاره می‌کند چه نتیجه‌ای دارد؟
  4. ۴. کاشی «وضعیت Snapshot» در آزمایشگاه تست «نیازمند همگام‌سازی» است. اول چه باید کرد؟