מתכננים IoT למפעל קטן עם MQTT
מפעל ״גליל פלסט״ מייצר מכסי פלסטיק עם ארבע מכונות. המטרה: לראות מהמשרד את מצב כל מכונה, לקבל התראות לטלפון, לשמור היסטוריה לדוחות ולשנות את מהירות קו האריזה מרחוק.
הפעילו את הסימולציה האינטראקטיבית ←🏭 המכונות ומה הן מודדות
- 🧪 מכונת הזרקה M1 (אולם הזרקה) — מייצרת מכסי פלסטיק. חום התבנית קריטי לאיכות. מדדים: טמפרטורת תבנית כל 2 שניות, מונה יחידות כל דקה, ומצב המכונה.
- ⚙️ מכונת CNC M2 (אולם עיבוד) — מעבדת תבניות. רעידות חריגות מעידות על שחיקת כלי. מדדים: רעידות ציר כל שנייה, ומצב המכונה.
- 📦 קו אריזה M3 (אזור אריזה) — אורז את המכסים לקרטונים. ניתן לשנות את מהירות הקו מהמשרד. מדדים: קרטונים שנארזו כל דקה, ומצב המכונה.
- 💨 מדחס אוויר C1 (תשתיות) — מספק אוויר דחוס לכל המכונות. נפילת לחץ עוצרת את הייצור. מדדים: לחץ אוויר כל 5 שניות, ומצב המכונה.
🏗️ ארכיטקטורה
לכל מכונה שער (Gateway) שקורא את נתוני הבקר ומפרסם אותם ב-MQTT. ה-Broker (Mosquitto) יושב על שרת מקומי בתוך המפעל ומאזין ב-TLS על פורט 8883, כך שהייצור וההתראות ממשיכים לעבוד גם כשהאינטרנט נופל. הצרכנים (לוח בקרה, אפליקציית תחזוקה, מסד נתונים היסטורי ומנהל תשתיות) לא מכירים את המכונות — רק את הטופיקים.
🌳 עץ הטופיקים
מבנה אחיד: galil/plant1/<area>/<machine>/<data>, למשל galil/plant1/molding/m1/temperature. פקודות יושבות תחת cmd/ נפרד, למשל galil/plant1/packing/m3/cmd/speed, כדי שיהיה קל להגביל אותן בהרשאות.
👥 מי נרשם למה (Wildcards)
| צרכן | מסננים | מטרה |
|---|---|---|
| 📊 לוח בקרה במשרד | galil/plant1/+/+/statusgalil/plant1/+/+/alarm | מצב כל המכונות והתראות — בלי טלמטריה גולמית. |
| 🔧 אפליקציית תחזוקה | galil/plant1/+/+/alarmgalil/plant1/machining/m2/vibration | רק התראות, ובנוסף רעידות ה-CNC לתחזוקה מונעת. |
| 🗄️ מסד נתונים היסטורי | galil/plant1/# | שומר הכול לניתוח ודוחות. |
| ⚡ מנהל תשתיות | galil/plant1/utilities/# | מעקב אחר המדחס ומערכות התשתית בלבד. |
🛡️ QoS ו-Retained לכל סוג הודעה
| סוג | QoS | Retained | למה |
|---|---|---|---|
| 🌡️ טלמטריה שוטפת | 0 | לא | ערך חדש מגיע בעוד שנייה-שתיים, כך שאיבוד מדידה בודדת לא מזיק. QoS 0 הוא הקל והמהיר. אין טעם לשמור (Retain) ערך שמתיישן מהר. |
| 🟢 מצב מכונה | 1 | כן | המצב חייב להגיע (QoS 1), ולוח בקרה שנפתח עכשיו צריך לראות מיד את המצב האחרון — בדיוק התפקיד של Retained. זה גם הנושא שבו ה-LWT יפרסם "offline". |
| 🚨 התראה | 1 (או 2) | לא | התראה אסור לאבד, לכן לפחות QoS 1 (גם QoS 2 סביר). היא אירוע חד-פעמי, ולכן לא Retained — אחרת כל מנוי חדש יקבל התראה ישנה כאילו היא קורית עכשיו. |
| 🔢 מונה ייצור | 1 | כן | נשלח פעם בדקה ומשמש לדוחות, לכן כדאי שיגיע (QoS 1). כ-Retained, מסך חדש מציג מיד את הסכום האחרון בלי לחכות דקה. |
| 🎛️ פקודה למכונה | 1 (או 2) | לא | פקודה חייבת להגיע (QoS 1 לפחות). לעולם לא Retained: אם הקו יתנתק ויתחבר מחדש, הוא יקבל שוב את הפקודה השמורה ויבצע אותה שוב — בלי שאיש ביקש. |
ה-LWT של כל שער מוגדר על טופיק ה-status שלו עם התוכן offline, QoS 1 ו-Retained, כך שנפילה פתאומית של מכונה מופיעה בכל לוח בקרה — גם כזה שייפתח מאוחר יותר.
🔐 אבטחה
| לקוח | ClientID | פרסום | הרשמה |
|---|---|---|---|
| 🧪 שער מכונה M1 | plant1-m1-gw | galil/plant1/molding/m1/# | — |
| 📦 שער קו אריזה M3 | plant1-m3-gw | galil/plant1/packing/m3/# | galil/plant1/packing/m3/cmd/# |
| 📊 לוח בקרה | plant1-dashboard | galil/plant1/packing/m3/cmd/# | galil/plant1/# |
| 🔧 אפליקציית תחזוקה | plant1-maint-<שם> | — | galil/plant1/+/+/alarm |
TLS על פורט 8883, שם משתמש וסיסמה לכל לקוח, ClientID ייחודי (כפילות גורמת ל-Broker לנתק את הלקוח הקודם בלולאה), ורק לוח הבקרה רשאי לפרסם פקודות. עצירת חירום נשארת כפתור פיזי מקומי — MQTT משמש לניטור ולשינויי הגדרות, לא לבטיחות.