מערכת בקרה חזותית לקו ייצור · AfifAI
מקרה בוחן · ראייה ממוחשבת בתעשייה · 2026

מצלמות שמזהות תקלות בקו הייצור ומתריעות למכונה תוך שניות

יצרנית פלסטיק ישראלית רצתה שקו הייצור שלה ייבדק במצלמות, ולא רק בעין. הובלתי ובניתי מערכת בקרה חזותית שבודקת כל מצלמה פעם בשנייה, פותחת תקלה רק אחרי שלושה פריימים בעייתיים ברצף, מעדכנת את אות התקלה ב־⁠PLC של הקו, ומראה למפעילים מה נמצא ואיפה, בעברית או באנגלית.

⁦.NET 8⁩ / ⁦ASP.NET Core⁩SignalRPostgreSQLReact + TypeScriptPyTorch + scikit-learnSiemens S7 PLC
לקוח
יצרנית פלסטיק תעשייתי ישראלית (חסוי)
התפקיד שלי
ראש צוות, ארכיטקט ומפתח בפועל
לוח זמנים
יוני–אוקטובר 2026 · On‑prem, קו ייצור אחד, מחובר ל־⁠PLC
סטטוס
באוויר
במבט אחד
≈1 שנייהמהפריים הבעייתי השלישי ועד מסך המפעיל, לעומת עד 30 שניות דרך ה־⁠heartbeat של הבריאות
⁦93.9%⁩דיוק של מסווג התקלות על test set מוחזק (precision של ⁦98.2%⁩ על ”בעיה”)
120 עד 2רשומות audit על שעה של נפילת מסד נתונים, אחרי מעבר לרישום מעברי מצב בלבד
86,400 עד 1קריאות למסד ביום עבור מצב המערכת, שנשמר עכשיו בזיכרון מרגע העלייה
≈600 עד 0קריאות חיזוי מיותרות לכל תקלה פתוחה, כי המצלמה הזו מושתקת לחלון של 10 דקות
3 ברצףפריימים בעייתיים נדרשים לפני שנפתחת תקלה, כך שרעש של פריים בודד לא עוצר את הקו
20 + 2נקודות קצה REST וזרמי SignalR חיים, עם 2 תפקידי משתמש
≈4 חודשיםמה־⁠commit הראשון ועד חיבור ה־⁠PLC, ב־⁠3 ריפוזיטוריז
הבעיה

תקלות זוהו בעין, אם מישהו הסתכל

יריעת הפלסטיק יוצאת מהמכונה דרך חלון יציאה. קיפולים, קרעים בצד, חומר שלא ממורכז או סוף גליל יכולים להופיע בכל רגע, ועד שמישהו שם לב, הקו ממשיך לייצר פסולת. הלקוח רצה מצלמות על חלון היציאה, מודל שמבדיל בין פריים תקין לבעייתי, מסך למפעילים ולמנהלי מערכת, ואות ישיר ל־⁠PLC של הקו. הכול היה צריך לרוץ On‑prem ליד המכונה, ולשתוק כשאין בעיה: מערכת שמתריעה לשווא פשוט מכבים אותה.

מה הובלתי

מ־⁠POC של מסווג תמונות לקו מחובר

  • ארכיטקטורה והובלה טכנית של כל המערכת: backend, אפליקציית הניהול, שירות המודל והחיבור ל־⁠PLC.
  • כתבתי בעצמי את רוב הקוד: צינור הבקרה ב־⁠⁦.NET⁩, זרמי הבריאות והתקלות, ה־⁠audit, מנגנוני השמירה והמחיקה, ומסכי הניהול ב־⁠React.
  • הפכתי POC של מסווג ב־⁠Python (642 תמונות מתויגות, 7 סוגי תקלה) לשירות חיזוי ב־⁠HTTP, ושילבתי את ממשק הבדיקה הידנית שלו בתוך אפליקציית הניהול.
  • תכננתי את חוקי התקלה (פריימים ברצף, חלון התראה לכל מצלמה, אישור תקלה, מצב Setup) כך שיתאימו לאופן שבו הקו באמת מתופעל.
  • הקמתי את זרימת הענפים dev ← QA ← stage ← prod, עם 8 גרסאות ממוספרות של אפליקציית הניהול.
ארכיטקטורה

שירות On‑prem אחד מחזיק את הלולאה, את החוקים ואת האות

התרשים רחב מהמסך: החליקו הצידה לצפייה בכולו →

הכול רץ על מחשב אחד ליד הקו, כך שאין תלות בענן במסלול הזיהוי. בין המצלמות ל־⁠backend אין שום חיבור חוץ מתיקייה: המצלמה כותבת תמונות, והצינור קורא את התמונה התקינה האחרונה. החלפת ספק מצלמות לא דורשת שינוי בקוד.

החלטות תכנון

שקט כשהקו תקין, ומתריע פעם אחת בלבד

שני זרמים, משמעות אחת לכל אחד

בהתחלה סטטוס בריאות אחד כיסה גם ”השרת לא עובד” וגם ”יש תקלה בקו”. נורה אדומה יכלה להיות מסד נתונים שנפל או יריעה קרועה. פיצלתי לזרם של בריאות השירות ולזרם של תקלות הקו, לכל אחד שעון משלו. המחיר: הלקוח מאחד את שניהם בעצמו, ומציג מצב שלישי כשאי אפשר לסמוך על זרם התקלות.

רצף פריימים, ואז השתקה לכל מצלמה

תקלה נפתחת אחרי 3 פריימים בעייתיים ברצף. פריים תקין מאפס את הספירה, ופריים שלא נקרא לא משנה אותה. אחרי תקלה רק המצלמה הזו מפסיקה להידגם ל־⁠10 דקות, ומצלמות אחרות עדיין יכולות לדווח. המחיר: המערכת לא רואה שהתקלה נפתרה מוקדם, ולכן המפעילים קיבלו כפתור אישור.

הגדרות שדורשות restart מוקפאות בעלייה

ספים ומרווח הדגימה נקראים פעם אחת ונשמרים לכל חיי התהליך. המצב נשמר בזיכרון ונכתב קודם למסד. שאילתה בכל טיק של שנייה הייתה מגיעה ל־⁠86,400 קריאות ביום. המחיר: חלק מהעריכות דורשות restart, ולכן אפליקציית הניהול מציגה פס ”ממתין ל־⁠restart” עד שהוא קורה.

ה־⁠PLC אף פעם לא מעכב זיהוי

המודיע על התקלה רק מכניס את הביט החדש לתור. לולאת רקע מתחברת, כותבת פעם אחת, מתנתקת, ומנסה שוב כל 5 שניות עד שהכתיבה מצליחה. בין שינויים יכולות לעבור שעות, וחיבור S7 שעומד בטל נופל. המחיר: אחרי כיבוי והדלקה של ה־⁠PLC הביט שומר את ערכו האחרון עד השינוי הבא. לבדיקת החיווט יש מצב ידני.

מודל קטן שמתאמן בשניות

עם 642 תמונות מתויגות, backbone קפוא של MobileNetV3 וראש של random forest ניצחו fine-tuning. הוא רץ על CPU בכ־⁠30 ms לתמונה ומתאמן מחדש בפחות משנייה מפיצ׳רים שמורים. המחיר: תמונות גבוליות שלא סווגו הן נקודת התורפה (recall של ⁦58%⁩ בתת־קבוצה הזו).

איך תקלה מתנהגת

עברו שלב אחר שלב על חוקי התקלה

זו המחשה של החוקים שה־⁠backend אוכף על מצלמה אחת שנדגמת פעם בשנייה. אין בה נתונים של הלקוח.

יומן הנדסי

במה נתקלנו, ואיך זה תוקן

רוב החלקים הקשים היו קשורים לזמן, לרעש ולאמון, לא למודל. מבחר:

22.7

המודל ישב בכלי נפרד

ל־⁠POC של המסווג היה דף אינטרנט עצמאי משלו, באנגלית. מפעילים היו צריכים לעבור בין שתי מערכות.

תרגמתי לעברית, התאמתי לריצה בתוך iframe, ושילבתי כמסך ”בדיקה ידנית” באפליקציית הניהול, מאחורי כתובת HTTPS שנקבעת לפי סביבה.

2.8

הדשבורד דגם בריאות ב־⁠polling

מסך הסטטוס שאל את השרת שוב ושוב, והמידע בו היה עדכני רק ברמת מרווח הדגימה.

העברתי את הבריאות לזרם SignalR שנדחף בהתחברות, ב־⁠heartbeat ובכל שינוי. מסלול ה־⁠polling נשאר כגיבוי.

19.8

לחיצה על ”עצור” לא עצרה מיד

קריאת חיזוי יכולה להימשך עד 30 שניות. אם מצב Setup היה מחכה לסיום המחזור הנוכחי, המערכת הייתה ממשיכה לקרוא פריימים ולשמור ראיות חצי דקה אחרי שהמפעיל עצר.

חיברתי cancellation token לכל סשן ניטור, וכל מחזור מקושר אליו. כניסה ל־⁠Setup מבטלת מיד את קריאת ה־⁠HTTP ואת כתיבת הראיה, ומחזור שבוטל נרשם כמידע ולא ככשל של הצינור.

23.8

audit שהיה טובע בעצמו

בדיקת הבריאות רצה כל 30 שניות והדוגם כל שנייה. רישום של כל תוצאה היה מייצר כ־⁠2,900 וכ־⁠86,400 שורות זהות ביום.

כל רכיב שרץ בלולאה מחזיק בעצמו את המצב ”כבר דווח”, ורושם ב־⁠audit רק מעברים. שעה של נפילת מסד היא עכשיו 2 רשומות במקום 120. טקסט של exceptions לא נכנס ל־⁠audit, כך ש־⁠connection strings לא יכולים לדלוף אליו.

24.8

תקלות חיכו ל־⁠heartbeat

תקלות מצלמה הגיעו ללקוחות דרך מפרסם הבריאות, שרץ על שעון קבוע של 30 שניות. תקלה שזוהתה יכלה לחכות חצי דקה בלי דיווח.

פיצלתי את התקלות לזרם משלהן, שנדחף על ידי הרכיב שרואה את הפריים השלישי. הזמן מזיהוי ועד המסך ירד מעד 30 שניות לטיק דגימה אחד (כשנייה).

26.8

הגדרה יכלה להשתנות באמצע

פרמטרים שדורשים restart נשמרו ב־⁠cache רק בקריאה הראשונה. עד שמשהו קרא אותם, ערך שנערך בממשק עוד יכול היה להיכנס לתוקף, וההתנהגות הייתה תלויה בתזמון.

הקפאתי את כל הפרמטרים שדורשים restart ב־⁠snapshot אחד בזמן העלייה, השארתי את דגל ה־⁠restart רק בפרמטרים שבהם הוא שווה את זה, והוספתי פס ”ממתין ל־⁠restart” באפליקציית הניהול.

2.9

מצלמה עיוורת נראתה תקינה

כשהתיקייה של מצלמה התרוקנה או לא הייתה נגישה, לולאת הצינור המשיכה להסתובב ונשארה ירוקה, למרות שחלק מהקו כבר לא נבדק.

מצלמה שלא מספקת פריים עוברת ל־⁠Error בטיק הראשון וחוזרת בפריים התקין הראשון, בעדכון compare-and-set. כל מצלמה ב־⁠Error הופכת את רכיב צינור התמונות ל־⁠Unhealthy.

7.10

חלק מהמצלמות כותבות לתתי־תיקיות לפי תאריך

חלק מדגמי המצלמות כותבים תמונות לתתי־תיקיות לפי תאריך, ולא לתיקייה שהוגדרה להם, כך שהדוגם לא מצא כלום.

הוספתי מבנה תיקיות שמוצא פריימים בתתי־תיקיות לפי תאריך, והרחבתי את ניקוי ה־⁠snapshots כך שגם הן מנוקות.

⁦8–14.10⁩

חיבור בטוח ל־⁠PLC

ה־⁠PLC של הקו היה צריך ביט תקלה אחד, והמהנדסים היו צריכים דרך לבדוק את החיווט בלי לחכות לתקלה אמיתית.

בניתי כותב S7 מבוסס שינויים, עם תור, ניסיונות חוזרים ורשומות audit, ומצב ידני למנהלי מערכת בלבד. שחרור המצב הידני תמיד כותב בחזרה את המצב האמיתי, כך שה־⁠PLC אף פעם לא נשאר עם ערך בדיקה. המפעילים קיבלו כפתור אישור לסגירת תקלה שתוקנה.

תוצאה

איפה זה עומד

מהלפניאחרי
מעקב אחרי חלון היציאהבעין, בין משימות אחרותכל מצלמה נבדקת פעם בשנייה, במצב Monitor
מתקלה ועד מסך המפעילעד 30 שניות (heartbeat של הבריאות)כשנייה (טיק דגימה אחד)
מתקלה ועד המכונהמישהו היה צריך לשים לב ולהגיבביט תקלה ב־⁠PLC באותו רגע, עם ניסיונות חוזרים עד הצלחה
רעשכל פריים בעייתי בודד יכול היה להתריע3 ברצף, דיווח אחד לתקלה, חלון של 10 דקות לכל מצלמה
נפח audit, נפילה של שעה120 רשומות זהות2 רשומות (נפל, חזר)
קריאות הגדרות במסלול החםשאילתה בכל טיק (86,400 ביום)קריאה אחת בעלייה, ואז זיכרון
  • דשבורד חי עם כותרת אתר וקו, ספירת מצלמות, המצב הנוכחי, פס תקלה פעילה עם כפתור אישור, ופס של ממתין ל־⁠restart.
  • ניהול מצלמות (יצירה, עריכה, מחיקה, סטטוס) ו־⁠19 פרמטרי מערכת עם טיפוסים ו־⁠validation, כולל תיאורים ויחידות בעברית.
  • תמונות ראיה שנשמרות לפי תאריך ומצלמה עם הגנה מפני path traversal, וניקוי כל 24 שעות של ראיות, snapshots ולוגים.
  • מצבי Monitor ו־⁠Setup שהמפעילים מחליפים מהכותרת. Setup מקפיא את הבקרה מיד.
  • audit עם 28 סוגי אירועים: התחברות, הגדרות, מצלמות, הצינור, ניקוי וכתיבות ל־⁠PLC.
  • עברית ואנגלית בכל המסכים (288 מפתחות תרגום בכל שפה), פריסת RTL, ותמות בהירה וכהה.
טכנולוגיות

טכנולוגיות

Backend
⁦.NET 8⁩, ⁦ASP.NET Core⁩, BackgroundService, HealthChecks, AutoMapper
נתונים
PostgreSQL, EF Core (database-first), 12 מיגרציות SQL ממוספרות
זמן אמת
SignalR: hub לבריאות ו־⁠hub לתקלות מצלמה, לקוח עם התחברות מחדש אוטומטית
Front end
React 18, TypeScript, Vite, Redux Toolkit, Ant Design, i18next
מודל ראייה
פיצ׳רים מ־⁠MobileNetV3-Small ב־⁠PyTorch, random forest ב־⁠scikit-learn, Flask
תעשייה
Siemens S7-1200 בפרוטוקול S7, ביט אחד ב־⁠data block
אבטחה ותפעול
JWT עם refresh, 2 תפקידים, audit בפורמט JSON ב־⁠NLog, פריסה On‑prem

שיחת אבחון חינם · 30 דקות · ללא התחייבות

הביאו תהליך אחד. קבלו תוכנית ומספר לשפר.

כתבו בכמה שורות: איזה תהליך או מערכת, מה כואב היום (זמן, טעויות, עלויות או פיילוט AI שנתקע) ומי עובד עם זה. אחרי שיחה קצרה מקבלים תוך כ־3 ימים תוכנית כתובה והצעת מחיר סגורה.

לשיחת אבחון חינםafif.mansour@gmail.com

נפתח מייל מוכן מראש · מענה תוך יום עסקים

ה־AI קורא. הקוד סופר.

כל הפרויקטים