הרשמה ל-JoVE נדרשת לצפייה בתוכן זה. התחברו או התחילו בגרסת ניסיון בחינם.

מאמר שיטה

פרוטוקול ליצירה אוטומטית של ממשקים מבוססי רשת עבור יישומים של LabVIEW באמצעות פרוטוקול interoperability מרחוק

189 צפיות

⸱

DOI:

10.3791/72765

⸱

14 באוגוסט 2026

במאמר זה

סיכום

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

תקציר

פלטפורמות ניסיוניות מרוחקות מאפשרות גישה למודלי סימולציה מקומיים או להתקנים פיזיים דרך רשת, אך ממשקי קצה (front ends) קונבנציונליים של האינטרנט דורשים בדרך כלל דף נפרד, פריסת בקרים ולוגיקת תקשורת נתונים עבור כל ניסוי, דבר המגדיל את עלויות הפיתוח. עבודה זו מתקפת זרימת עבודה מבוססת ליצירה אוטומטית של ממשק משתמש (UI) באינטרנט מתוך מכשירים וירטואליים (VIs) של LabVIEW באמצעות פרוטוקול תפעוליות מרחוק (RIP), ומספקת פרוטוקול הניתן לשחזור ליישומו. זרימת העבודה בונה LabVIEW VIs המגדירים בקרי קלט ומחווני פלט בלוח הפנים (Front Panel), רושמת כל VI בתצורת שרת ה-RIP, קוראת את המטא-נתונים של המשתנים שהתקבלו, ומייצרת את בקרי האינטרנט ותצוגות הפלט התואמים. Caddy משמש כפרוקסי הפוך (reverse proxy) כדי לאחד את נתיב הקבצים הסטטיים של ממשק הקצה ואת נתיב הבקשות של ממשק התכנות (API) של ה-RIP. זרימת העבודה מוערכת באמצעות שתי מערכות נפרדות: מודל מהירות מאוורר ומודל בקרת מיקום של בקר פרופורציונלי-אינטגרלי-דיפרנציאלי (PID) למנוע זרם ישר (DC). בשני המקרים, דף האינטרנט מזהה את המשתנים החשופים, כותב קלט משתמש אל ה-back end של LabVIEW, קורא פלטי מודל ומייצר את הממשק מתוך המטא-נתונים של ה-RIP. תוצאות אלו מתקפות את אותו תהליך אוטומטי של יצירת ממשק משתמש בשתי מערכות דינמיות שונות ומתעדות את השלבים הנדרשים לשחזורו.

מבוא

עם פיתוחם של ניסויים מרחוק, הוראה מקוונת וטכנולוגיות האינטרנט של הדברים (Internet-of-Things), אספקת גישה מבוססת רשת למודלי סימולציה מקומיים או למכשירי ניסוי הפכה לכיוון חשוב בפיתוח פלטפורמות ניסוייות1,2,3,4. עבודות אחרונות שילבו עוד יותר מעבדות המצוידות בטכנולוגיות אינטרנט של הדברים עם למידה מבוססת פרויקטים וגישה מקומית או מרחוק, ובכך הדגימו את הפיתוח המתמשך של פלטפורמות ניסוייות גמישות ומרושתות בחינוך הנדסי5. בניסויי מערכות בקרה, משתמשים נדרשים בדרך כלל להתאים פרמטרי קלט בדפדפן ולצפות במצבי פלט בזמן אמת6,7. שיטות קונבנציונליות דורשות בדרך כלל דף רשת נפרד, לוגיקת קישור בקרה וממשק תקשורת נתונים עבור כל אובייקט ניסויי8,9. כאשר המשתנים במודל ה-back-end משתנים, לעיתים קרובות יש לשנות את דף ה-front-end בהתאם, דבר היוצר עבודת פיתוח חזרתית ניכרת ומגביל את ההרחבה המהירה של הפלטפורמה הניסויית.

פרוטוקול קישוריות מרחוק (RIP) מספק שכבת תווכה בין מודלים ניסיוניים של צד-שרת לבין ממשקי משתמש של דפדפנים10,11. בגישה ליצירה אוטומטית של ממשק משתמש המבוססת על RIP, המתוארת בעבודות קודמות, שרת ה-RIP מספק מטא-דאטה עבור כל ניסוי, כולל שמות משתנים, מאפייני קלט/פלט, סוגי נתונים, ערכי מינימום, ערכי מקסימום, דיוק, תיאורים ושיטות קריאה/כתיבה זמינות11. לקוח Web יכול להשתמש במטא-דאטה זה כדי ליצור את אלמנט ה-HTML התואם, כגון תוויות, שדות קלט מספריים, מחוונים (sliders), בקרים בוליאניים ותצוגות פלט, במהלך טעינת הדף או רענונו11. הפרוטוקול הנוכחי אינו מממש מחדש או מגדיר מחדש את מפרט ה-RIP. תחת זאת, הוא משתמש בשירות ה-RIP הקיים בקוד פתוח ובלוגיקת יצירת ממשקי משתמש של המרה ממטא-דאטה ל-HTML המבוססת על RIP כבסיס לתקשור ולייצור הממשק, ומתמקד בבנייה הניתנת לשחזור, ברישום, בפריסת פרוקסי ובאימות של שתי דוגמאות LabVIEW VI.

בהשוואה לפיתוח קונבנציונלי של ממשק אינטרנט מותאם אישית, יצירת ממשק משתמש (UI) אוטומטית מבוססת RIP מפחיתה את הצורך בהטמעה של פריסות בקרה, לוגיקה של קישור משתנים ופונקציות תקשורת בסיסיות כאשר מספר ניסויי LabVIEW חושפים משתני קלט ופלט סקלאריים דומים8,9,10,11. לאחר ש-VI חדש נרשם ומשתניו זמינים לשרת ה-RIP, ניתן להשתמש שוב באותה לוגיקה של קריאת מטא-נתונים ויצירת בקרות כדי לבנות את ממשק האינטרנט הבסיסי10,11. תכונה זו מועילה לפריסה מהירה, להדגמות לימודיות ולפלטפורמות של מעבדות מרחוק הדורשות גישה עקבית למספר ניסויים דומים3,8,9. עם זאת, לממשק המיוצר באופן אוטומטי יש גם מגבלות. הוא אינו מסיק באופן מלא את הקשרים הפיזיים בין המשתנים, אינו קובע אוטומטית מיפויים של תרשימים ואינו מעצב אינטראקציות של בטיחות וויזואליזציה ספציפיות לתחום11. לכן, פיתוח ידני של ממשק אינטרנט נותר מועדף כאשר ניסוי דורש גרפיקה מותאמת אישית במיוחד, זרימות עבודה מורכבות של משתמשים, ויזואליזציה מתקדמת, מנעי בטיחות של חומרה או בוררות כתיבה עבור מספר משתמשים.

זרימת העבודה הכללית של הפרוטוקול מסוכמת ב-איור 1. בזרימה זו, LabVIEW VI מגדיר תחילה את בקרות הקלט ומחווני הפלט הנדרשים בלוח הבקרה (Front Panel). לאחר מכן, ה-VI נרשם ב-RIP Server Configuration על ידי ציון שם הניסוי ונתיב ה-VI. לאחר הרישום, שרת ה-RIP קורא את המטא-דאטה של הניסוי הנבחר ומספק גישת קריאה/כתיבה למשתנים הזמינים. דף האינטרנט ב-XHTML משתמש במטא-דאטה שהוחזר כדי להפיק באופן אוטומטי את בקרות הקלט ותצוגות הפלט התואמות, בעוד ש-Caddy מספק נתיב גישה מאוחד עבור דף האינטרנט הסטטי ונתיבי התקשורת של ה-RIP. מודלים של מאוורר ומנוע זרם ישר משמשים במחקר זה כשתי מימושים של אותה זרימת עבודה. עבור ניסויי LabVIEW אחרים המספקים משתנים סקלריים, מספריים ובוליאניים תואמים, מפתחים יכולים לעקוב אחר אותה זרימת עבודה של בנייה-רישום-פריסה-אימות כדי ליצור ממשק אינטרנט שנוצר באופן אוטומטי, תוך הוספת ויזואליזציה ספציפית לניסוי, לוגיקת בטיחות או טיפול בנתונים מורכבים בעת הצורך.

מאמר זה אינו מציע ארכיטקטורת RIP חדשה או מרחיב את מגוון סוגי הנתונים הנתמכים כבר על ידי RIP. במקום זאת, הוא משתמש ב-RIP כמנגנון התקשורת המקובל ומנגנון יצירת ממשק משתמש (UI) מבוסס-מטא-נתונים, ומתמקד בתיקוף של אותו תהליך עם שתי מערכות LabVIEW שונות, תוך תיעוד פרוטוקול יישום הניתן לשחזור. עבודות קודמות הציגו שיטה בסיסית ליצירה אוטומטית של ממשק משתמש רשת המבוססת על מטא-נתוני RIP, והשתמשו בניסוי במנוע סרוו מקוון כמקרה בוחן11. ארכיטקטורות של מעבדות מרחוק מבוססות-רשת המשלבות ממשקים אינטראקטיביים עם תוכנות הנדסיות ו-LabVIEW דווחו גם במחקרים קודמים9,12. עם זאת, במהלך שחזור מעשי, חלק מדגמי ה-LabVIEW במקרה הבוחן המקורי הושפעו מגרסאות תוכנה ומבעיות תאימות של מודולים, מה שהקשה על השימוש הישיר בהם בסביבה חדישה יותר. לפיכך, העבודה הנוכחית בונה מחדש שני VIs תואמים בצד השרת (back-end)—דגם של מאוורר ומודל בקרת מיקום פרופורציונלי-אינטגרלי-דיפרנציאלי (PID) עבור מנוע זרם ישר (DC)—ומחילה את אותו תהליך יצירת ממשק משתמש מונחה-מטא-נתונים על שניהם. התרומה היא התיקוף של זרימת העבודה (workflow) המבוססת על RIP על פני מערכות שונות ופרוטוקול מפורט לשחזור התהליך, ולא הרחבת הכלליות של RIP.

המשתמשים המיועדים של פרוטוקול זה הם חוקרים, מרצים ומפתחי מעבדות שכבר משתמשים ב-LabVIEW VIs וזקוקים לחשוף מודלי סימולציה או מערכות ניסיוניות ברמת סיכון נמוכה באמצעות דפדפן אינטרנט, מבלי להטמיע באופן עצמאי ממשק קדמי מותאם אישית ומלא עבור כל מודל. הפרוטוקול מתאים במיוחד לניסויים המשתמשים במשתנים מספריים ובוליאניים סטנדרטיים, כוונון פרמטרים וניטור מצב בזמן אמת10,11. הוא פחות מתאים כפתרון עצמאי לניסויים הדורשים מבני נתונים מורכבים, ויזואליזציה ייעודית, מנגנוני נעילה בטיחותיים קשיחים של חומרה או בוררות כתיבה עבור מספר משתמשים11. מטרת עבודה זו היא לתקף יצירה אוטומטית של ממשק משתמש (Web UI) מבוסס RIP באמצעות שתי מערכות LabVIEW שונות, ולספק פרוטוקול מלא וניתן לשחזור, החל מבניית ה-VI של ה-back-end ועד לאינטראקציה מבוססת דפדפן. הפרוטוקול כולל הגדרת משתני קלט ופלט, רישום ניסוי ב-RIP Server, יצירת ממשק משתמש המבוססת על מטא-דאטה, פריסת פרוקסי Caddy ואימות קריאה/כתיבה מרחוק. יישום אותו זרימת עבודה על מודלי המאוורר ומנוע ה-DC מדגים כי ניתן לשחזר את התהליך שנקבע מבלי לכתוב מחדש ידנית ממשק קדמי מלא עבור כל דוגמה9,10,11.

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

פרוטוקול

השלים את השלבים הבאים כדי לבנות, לרשום, לפרוס ולאמת שני ניסויי LabVIEW הנגישים דרך RIP, בהתאם לזרימת העבודה המסוכמת ב-איור 1. כל הכלים והפלטפורמות שנעשה בהם שימוש במחקר זה מפורטים ב-טבלת החומרים.

1. בנייה והפעלה של ניסוי מודל המאוורר

  1. בנו את מודל המאוורר VI.
    1. פתח את LabVIEW, צור VI חדש ושמור את הקובץ בשם fengshan.vi. שמור את ה-VI בכל ספרייה הנגישה לתהליך ה-RIP WebService. תיקיית Private משמשת רק כספרייה לדוגמה ואינה מוטמעת קשיח (hardcoded) ב-RIP. הזן את הנתיב הממשי שנבחר עבור ה-VI במהלך רישום הניסוי ב-RIP.
    2. בפאנל הקדמי, הוסף את בקרים הקלט עבור דגם המאוורר. בדוגמה זו, תן שמות לבקרי הקלט אפשר, הספק פולסים (PWM), עומס, טאו, KMaxRPM, ו- הפרעהקביעה הפעל כביקורת בוליאנית, וקבעו PWM, עומס, טאו (Tau), KMaxRPMו- הפרעה כבקרים מספריים של נקודה צפה בדיוק-כפול (DBL). ראה טבלה משלימה 1 עבור המשמעות הפיזיקלית ותפקיד המודל של משתני המאוורר.
    3. הוסף את מחווני הפלט עבור מודל המאוורר. בדוגמה זו, תן שם למחווני הפלט מהירותRPM, מהירותקבועהRPM, זמןS, מהירותנורמלית, זרםA, ו- PowerWהגדר את כל מחווני הפלט כמחווני DBL.
      ​הערה: טבלה 1 מתאר את המשמעות הפיזיקלית ואת תפקידם במודל של משתני פלט אלה. פאנל החזית המורכב של המאוורר מוצג ב- איור 2שמות המשתנים, הטווחים וגדלי הצעדים המוצגים ב- טבלה 1 תארו את שתי הדוגמאות המיושמות בפרוטוקול זה. אלו אינן דרישות מקובעות (hardcoded) של RIP. בניסויי LabVIEW אחרים, מפתחים עשויים להגדיר שמות משתנים שונים בלוח הבקרה (Front Panel) ותכונות מספריות שונות. שרת ה-RIP קורא את שמות המשתנים בפועל, את סוגי הנתונים, את תכונות הקלט/פלט ואת התכונות המספריות הזמינות מתוך המטא-נתונים של ה-VI, ודף האינטרנט יוצר את הבקרים והתצוגות התואמים מתוך המטא-נתונים שהוחזרו.
    4. הוסיפו לולאת While לתרשים הבלוקים. הוסיפו שני אוגרי הזזה (Shift Registers) לאחסון מהירות_קודמת ו- זמן קודם, ואתחלו את שני הערכים ל-0.
    5. הוסף צומת נוסחאות (Formula Node) בתוך לולאת ה-While. חבר הפעלה, PWM, עומס, טאו, KMaxRPM, הפרעה, מהירות_קודמת, ו- זמן_קודם אל הדקי הקלט השמאליים של ה-Formula Node, והגדר SteadyRPM, speed_next, SpeedNorm, CurrentA, PowerW, ו- הזמן הבא כמסופי הפלט הימניים.
    6. בנה את ה- הפעל לוגיקת בקרה מחוץ לצומת הנוסחה. השתמש ב- הפעל כאות הבחירה, כך ש- u = אפנון רוחב פולס (PWM) מתי הפעל הוא אמת ו u = 0 מתי הפעל הוא שגוי.
    7. הזינו את קוד דגם המאוורר בצומת הנוסחאות. השתמשו בקוד זה כדי לחשב מהירות במצב יציב, מהירות בפועל, מהירות מנורמלת, זרם, הספק וזמן ריצה; עיינו בקובץ הקידוד הנלווה 1 (Supplementary Coding File 1) לקבלת הקוד המלא.
    8. חבר את ה- מהירות_הבא את פלט צומת הנוסחאות (Formula Node) אל ה- מהירות-RPM אינדיקטור, וחבר מהירות_הבא חזרה לאוגר ההסטה (Shift Register) ימינה עבור מהירות_קודמתחבר SteadyRPM אל ה- SteadyRPM אינדיקטור
    9. חבר זמן_הבא אל ה- TimeS אינדיקטור, וחבר הזמן הבא חזרה אל אוגר ההזזה (Shift Register) ימינה עבור זמן_קודםחבר SpeedNorm, CurrentA, ו- PowerW למדדי הפלט המתאימים.
    10. הוסיפו פונקציית Wait (המתנה) בתוך לולאת ה-While והגדירו את זמן ההמתנה ל-50 מילי-שניות (ms). הוסיפו כפתור Stop Local וחברו אותו לטרמינל התנאי של לולאת ה-While.
    11. שמרו את הקובץ fengshan.vi. תרשים הבלוקים שהושלם של המאוורר מוצג ב- איור 3.
      נקודת עצירה: לאחר שמירת ה-VI של המאוורר שהושלם, ניתן להפסיק את זרימת העבודה. ניתן להמשיך מאוחר יותר על ידי פתיחה מחדש של ה-VI השמור ואישור שכל הבקרים, האינדיקטורים והחיבורים ב-Block Diagram עדיין קיימים ב-Front Panel.
  2. רשום את ניסוי המאוורר בשרת ה-RIP.
    1. פתח את RIPWebService.lvproj ב-LabVIEW Project Explorer
      .
    2. פתח את הקובץ Configuration.vi מעץ הפרויקט ואתר את טבלת הגדרות הניסוי.
    3. הוסף שורה חדשה של ניסוי. הגדר את השם (Name) כ-fan. הגדר את הנתיב המלא לקובץ fengshan.vi השמור. שדות הרישום עבור ניסוי ה-fan מוצגים ב- איור 4.
    4. מלאו את שדות התצורה הנותרים. הגדירו את Authors (מחברים) למחבר הניסוי, את Keywords (מילות מפתח) ל-Fan, את Description (תיאור) ל-fan speed model, ואת Sampling Freq (תדירות דגימה) ל-200.
    5. בתפריט ה-LabVIEW, בחר עריכה > הגדר ערכים נוכחיים כברירת מחדלSave Configuration.vi.
    6. הפעילו מחדש את ה-RIP WebService ואשרו כי ניסוי המאוורר עדיין מופיע בממשק התצורה (Configuration interface) לאחר ההפעלה מחדש.
      הערה: שם הניסוי הוא רגיש לרבציות (case-sensitive). הערך בשדה fan תחת RIP Configuration חייב להתאים בדיוק למזהה הניסוי (experiment ID) המשמש בקובץ ה-XHTML של צד הלקוח (front-end). כדי לפרוס VI אחר של LabVIEW עם אותו לוגיקה של יצירה אוטומטית של ממשק משתמש, יש להוסיף רשומה חדשה של ניסוי ב-RIP Configuration, להגדיר ערך Name חדש, ולהגדיר את ה-Path לקובץ ה-VI המתאים. לאחר מכן, השתמש באותו ערך Name כמזהה הניסוי בקובץ ה-XHTML. אין צורך לכתוב מחדש את דף צד הלקוח עבור כל משתנה.
      ​נקודת עצירה: לאחר שמירת Configuration.vi והגדרת הערכים הנוכחיים כברירת מחדל, ניתן להפסיק את זרימת העבודה. ניתן להמשיך מאוחר יותר על ידי הפעלה מחדש של RIP WebService ואישור שניסוי המאוורר עדיין רשום.
  3. הכינו את העמוד הקדמי עבור ניסוי המאוורר.
    1. מקם את הקובץ Fan_Automatic_UI.xhtml בספריית ה-Client המשמשת כספריית השורש של צד הלקוח (front-end).
    2. פתח את הקובץ Fan_Automatic_UI.xhtml באמצעות עורך טקסט.
    3. אתר את משתנה מזהה הניסוי (experiment ID) בחלק הסקריפט והגדר אותו כ-fan.
      הערה: ערך זה חייב להתאים בדיוק לשדה השם (Name) של ניסוי המאוורר בהגדרות ה-RIP. הגדרות המזהה של הניסוי ולוגיקת יצירת ממשק המשתמש המבוססת על מטא-נתונים משותפים עבור קבצי ה-XHTML של צד הלקוח מוצגים ב- איור 5.
    4. וודאו כי הדף מקבל את מקור הגישה הנוכחי באמצעות window.location.origin, ומבקש מטא-נתונים של הניסוי באמצעות rip.info(), ומעבירה את המטא-דאטה שהוחזר אל בנייה אוטומטית של ממשק משתמש().
      הערה: אין להזין באופן ידני את שמות המשתנים של המאוורר, את הטווחים או את גדלי הצעדים בדף. במקום זאת, משתנים הניתנים לכתיבה מיוצרים מ- רשימת כתיבה של מטא-נתונים, משתנים קריאים נוצרים מ- רשימת קבצים קריאיםומהותים מספריים כגון min, max ו-step מתקבלים מהמטא-דאטה המוחזר על ידי שרת ה-RIP.
    5. שמור את Fan_Automatic_UI.xhtml.
      ​הערה: כדי להשתמש באותה לוגיקת יצירה של ממשק המשתמש (front-end) עבור VI אחר של LabVIEW, הגדירו מזהה ניסוי (experiment ID) חדש בקובץ ה-XHTML ורשמו את שם הניסוי ונתיב ה-VI התואמים ב-RIP Configuration. בקרי הרשת ותצוגות הפלט נוצרים בהתאם למטא-נתונים המוחזרים מהניסוי הנבחר.
  4. הגדר את נתיב הגישה של ה-Caddy עבור ניסוי המאוורר.
    1. פתח את ה-Caddyfile באמצעות עורך טקסט.
    2. הגדירו את ספריית השורש של צד הלקוח (front-end root directory) לספריית ה-Client המכילה את הקובץ Fan_Automatic_UI.xhtml.
    3. בחרו פורט מקומי שאינו בשימוש עבור Caddy כדי לאפשר גישה דרך הדפדפן לדף האינטרנט ולנתיבי RIP. בפרוטוקול זה, פורט 8090 משמש כפורט לדוגמה עבור גישת פרוקסי.
      הערה: יש端口 8090 אינו נדרש על ידי RIP או Caddy. אם פורט 8090 תפוס, החליפו אותו בפורט מקומי אחר שאינו בשימוש והשתמשו באותו פורט בכתובת הדפדפן.
    4. הוסף נתיב המבצע כתיבה מחדש (rewrite) של /fan ל-Fan_Automatic_UI.xhtml.
    5. זהה את הפורט של ה-RIP WebService שהוגדר ב-LabVIEW. בפרוטוקול זה, http://localhost:8001 משמש ככתובת ה-RIP WebService.
      הערה: פורט 8001 הוא פורט ה-back-end של ה-LabVIEW/RIP WebService המשמש בסביבת הבדיקה. ניתן לשנות אותו בהגדרות ה-LabVIEW/RIP WebService. אם נעשה שימוש בפורט אחר, החליפו את http://localhost:8001 ב-Caddyfile בכתובת ה-RIP WebService המתאימה.
    6. הוסף כלל reverse proxy המפנה בקשות מסוג /RIP/SSE* לכתובת ה-WebService של RIP, לדוגמה http://localhost:8001.
    7. הוסיפו כלל פרוקסי הפוך (reverse proxy) השולח בקשות מסוג /RIP* לכתובת ה-WebService של RIP, כגון http://localhost:8001. תצורת ה-Caddyfile מוצגת ב- איור 6.
    8. פתחו את שורת הפקודה (Command Prompt) ב-Windows. עברו לספריית ההורדה או ההתקנה המקומית של Caddy על ידי הזנת הפקודה הבאה:
      cd /d D:\caddy
      הערה: בפרוטוקול זה, D:\caddy הוא נתיב ההורדה או ההתקנה המקומי של Caddy שבו נעשה שימוש בסביבת הבדיקה. אם Caddy מאוחסן בספריה אחרת, החליפו את D:\caddy בנתיב המקומי המתאים.
    9. הפעילו את Caddy עם ה-Caddyfile המצוין על ידי הזנת הפקודה הבאה:
      caddy.exe run --config Caddyfile
    10. יש לוודא ש-Caddy עולה ללא דיווח על שגיאת תצורה. פתחו את כתובת ה-URL ‏http://localhost:8090/fan בדפדפן אינטרנט ואמתו כי ממשק המשתמש הגרפי של המאוורר נוצר, כפי שמוצג ב- איור 7.
      ​הערה: אם הדפדפן מחזיר שגיאת 502, יש לוודא ש-RIP WebService פועל, שפורט ה-RIP WebService ב-LabVIEW תואם לכתובת ה-reverse proxy ב-Caddyfile, וכי פורט הגישה הנבחר ב-Caddy אינו תפוס.
  5. אמתו את תוצאות התפעול של ניסוי המאוורר.
    1. וודא שדף קצה הממשק (front-end) מייצר באופן אוטומטי את ה- הפעל, PWM, עומס, טאו, KMaxRPM, ו הפרעה בקרות קלט.
    2. וודאו שהדף הקדמי מציג את ה- מהירותRPM, מהירותקבועהRPM, זמןS, מהירותנורמלית, זרםA, ו- PowerW משתני פלט.
    3. כוון אפנון רוחב פולס (PWM) ובחן האם מהירות (סל"ד) עולה ככל ש- אפנון רוחב דופס (PWM) עולה ויורד ככל ש- אפנון רוחב פולס (PWM) פוחת.
    4. כוון את העומס ובדוק האם SteadyRPM ו- מהירותRPM פוחת ככל שהעומס עולה.
    5. כוון את ההפרעה ובדוק אם מהירותRPM, זרםA, ו- PowerW שינוי בתגובה לקלט ההפרעה.
    6. וודא ש- TimeS ממשיכה לעלות, מה שמאשר כי מאוורר האחור (back-end fan VI) פועל באופן רציף.

2. בנייה והפעלה של ניסוי בקרת מיקום PID למנוע DC

  1. בניית מודל ה-VI לבקרת מיקום PID של מנוע DC.
    1. פתחו את LabVIEW, צרו VI חדש ושמרו את הקובץ בשם Motor.vi. שמרו את ה-VI בכל ספרייה שניתן לגשת אליה באמצעות תהליך ה-RIP WebService.
      הערה: תיקיית Private משמשת רק כספריית דוגמה ואינה מקודדת באופן קשיח ב-RIP. הזינו את נתיב ה-VI שנבחר בפועל במהלך רישום הניסוי ב-RIP.
    2. בפאנל הקדמי (Front Panel), הוסיפו את בקרות הקלט עבור מודל בקרת המיקום PID של מנוע ה-DC. בדוגמה זו, תנו לבקרות הקלט את השמות Setpoint, Kc, Ti, Td, Disturbance ו-Reset control. הגדירו את Setpoint, Kc, Ti, Td, ו-Disturbance כבקרות מספריות מסוג DBL, והגדירו את Reset control כבקרת Boolean.
      הערה: טבלה 1 מתארת את המשמעות הפיזיקלית, את תפקיד המודל ואת הטווח המומלץ של המשתנים המשמשים בדוגמה זו.
    3. הוסיפו את מחווני הפלט עבור מודל בקרת המיקום PID של מנוע ה-DC. בדוגמה זו, תנו למחווני הפלט את השמות Position, Voltage, Time, ו-Measured angular velocity. הגדירו את כל מחווני הפלט כמחווני DBL. טבלה 1 מתארת את המשמעות הפיזיקלית ואת תפקיד המודל של משתני פלט אלו. הפאנל הקדמי המוגמר עבור המנוע מוצג ב-איור 8.
      הערה: שמות המשתנים והטווחים המפורטים ב-טבלה 1 מתארים את שתי הדוגמאות המיושמות בפרוטוקול זה. אלו אינן דרישות קבועות עבור זרימת העבודה של יצירת ממשק משתמש (UI) אוטומטית מבוססת RIP. כאשר נעשה שימוש ב-LabVIEW VI אחר, RIP קורא את שמות המשתנים בפועל, את סוגי הנתונים, את תכונות הקלט/פלט ואת התכונות המספריות הזמינות מתוך המטא-דאטה של ה-VI. לכן, לוגיקת יצירת צד-הלקוח אינה צריכה לקודד באופן קשיח את שמות המשתנים, ערכים מקסימליים, ערכים מינימליים או גודלי צעדים עבור כל ניסוי.
    4. הוסיפו לולאת While לתרשים הבלוקים (Block Diagram). הוסיפו שישה אוגרי העברה (Shift Registers) לאחסון של theta, omega, im, e_prev, integ, ו-time, ואתחלו את כל ששת הערכים ל-0.
    5. הוסיפו צומת נוסחאות (Formula Node) בתוך לולאת ה-While. בהתאם לתרשים מודל בקרת המיקום PID של מנוע ה-DC המוצג ב-איור 9, השתמשו בצומת נוסחאות זה כמודול החישוב המרכזי לחישוב שגיאה, בקרת PID, הגבלת מתח, המודל החשמלי, המודל המכני ועדכון מיקום.
      הערה: פרמטרי המנוע הפנימיים המשמשים במודל זה, כגון R, L, J, b, Kt, Ke, ו-Vmax, הם פרמטרים מנורמלים של מודל הוראה ולא פרמטרים מכוילים של מנוע פיזי ספציפי. הם נבחרו כדי להפיק תגובה סימולטיבית יציבה וניתנת לצפייה תחת צעד הזמן והגבלת המתח שנבחרו, כך שניתן להדגים בבירור את ההשפעות של Setpoint, Kc, Ti, Td, ו-Disturbance במהלך הפעלה מבוססת אינטרנט.
    6. הגדירו את sp, theta, omega, im, e_prev, integ, Kc, Ti, Td, disturbance, reset, ו-dt a כטרמינלי הקלט של צומת הנוסחאות. הגדירו את theta_next, omega_next, im_next, e_next, integ_next, ו-voltage כטרמינלי הפלט של צומת הנוסחאות.
    7. חברו את בקרת ה-Setpoint לטרמינל הקלט sp של צומת הנוסחאות. חברו את Kc, Ti, Td, ו-Disturbance לטרמינלי הקלט Kc, Ti, Td, ו-disturbance i של צומת הנוסחאות, בהתאמה.
    8. המירה את אות ה-Boolean של בקרת ה-Reset לאות מספרי וחברו אותו לטרמינל הקלט reset של צומת הנוסחאות. בצעו איפוס מצב כאשר reset אינו שווה ל-0, ובצעו בקרת PID ועדכון מצב מנוע כאשר reset שווה ל-0.
    9. הוסיפו את הקבוע המספרי dt והגדירו את ערכו ל-0.001 s. חברו את ה-dt לטרמינל הקלט dt של צומת הנוסחאות והשתמשו בו לעדכון הזמן (Time updating).
    10. הגדירו את פרמטרי המודל הפנימיים של מנוע ה-DC בצומת הנוסחאות. ראו טבלה משלימה 2 עבור המשמעות הפיזיקלית ותפקיד המודל של משתני המנוע.
    11. הזינו את קוד בקרת המיקום PID של מנוע ה-DC בצומת הנוסחאות. השתמשו בקוד זה כדי ליישם לוגיקת איפוס, חישוב שגיאה, חישוב איבר אינטגרלי, חישוב איבר דיפרנציאלי, בקרת PID, הגבלת מתח, עדכון זרם, עדכון מהירות זוויתית ועדכון מיקום; ראו את קובצי הקוד המשלימים לקוד המלא.
    12. חברו את theta_next למחוון ה-Position, וחברו את theta_next חזרה לאוגר ההעברה הימני עבור theta. חברו את omega_next למחוון ה-Measured angular velocity indicator, וחברו את omega_next חזרה לאוגר ההעברה הימני עבור omega.
    13. חברו את המתח למחוון ה-Voltage. חברו את im_next, e_next, ו-integ_next חזרה לאוגרי ההעברה הימניים עבור im, e_prev, ו-integ, בהתאמה.
    14. השתמשו בפונקציית Add מחוץ לצומת הנוסחאות כדי לחשב time_next = time + dt. חברו את time_next למחוון ה-Time, וחברו את time_next חזרה לאוגר ההעברה הימני עבור time.
    15. הוסיפו פונקציית Wait בתוך לולאת ה-While והגדירו את זמן ההמתנה ל-1 ms. הוסיפו כפתור Stop וחברו אותו לטרמינל התנאי של לולאת ה-While.
    16. שמרו את Motor.vi. תרשים הבלוקים המוגמר של המנוע מוצג ב-איור 10.
      נקודת עצירה: לאחר שמירת ה-VI המוגמר של המנוע, ניתן להפסיק את זרימת העבודה. חזרו אליה מאוחר יותר על ידי פתיחה מחדש של ה-VI השמור ואישור שכל בקרות הפאנל הקדמי, המחוונים וחיבורי תרשים הבלוקים עדיין קיימים.
  2. רישום ניסוי המנוע בשרת RIP.
    1. פתחו את RIPWebService.lvproj בסייר הפרויקטים של LabVIEW.
    2. פתחו את Configuration.vi מעץ הפרויקט ואתרו את טבלת הגדרות הניסוי.
    3. הוסיפו שורה חדשה לניסוי. הגדירו את ה-Name כ-Motor. הגדירו את ה-Path לנתיב המלא של קובץ ה-Motor.vi השמור. שדות רישום ניסוי המנוע מוצגים ב-איור 11.
    4. מלאו את שאר שדות ההגדרות. הגדירו את Authors למחבר הניסוי, Keywords כ-Motor, Description כ-DC motor position control model, ו-Sampling Freq ל-200.
    5. בתפריט LabVIEW, בחרו Edit > Make Current Values Default. שמרו את Configuration.vi.
    6. הפעילו מחדש את RIP WebService ואשרו שניסוי ה-Motor עדיין מופיע בממשק ההגדרות לאחר ההפעלה מחדש.
      הערה: שם הניסוי רגיש לאותיות גדולות וקטנות. הערך Motor בהגדרות RIP חייב להתאים בדיוק למזהה הניסוי המשמש ב-Motor_Automatic_UI.xhtml. כדי לפרוס LabVIEW VI אחר עם אותה לוגיקת יצירה אוטומטית של ממשק משתמש, הוסיפו רשומת ניסוי חדשה ב-RIP Configuration, הגדירו ערך Name חדש, והגדירו Path לקובץ ה-VI המתאים. לאחר מכן השתמשו באותו ערך Name כמזהה הניסוי בקובץ ה-XHTML. אין צורך לכתוב מחדש את דף צד-הלקוח עבור כל משתנה.
      ​נקודת עצירה: לאחר שמירת Configuration.vi והגדרת הערכים הנוכחיים כברירת מחדל, ניתן להפסיק את זרימת העבודה. חזרו אליה מאוחר יותר על ידי הפעלה מחדש של RIP WebService ואישור שניסוי ה-Motor עדיין רשום.
  3. הכנת דף צד-הלקוח עבור ניסוי המנוע.
    1. מקמו את Motor_Automatic_UI.xhtml בספריית Client המשמשת כספריית השורש של צד-הלקוח.
    2. פתחו את Motor_Automatic_UI.xhtml באמצעות עורך טקסט.
    3. אתרו את משתנה מזהה הניסוי (experiment ID) בחלק הסקריפט והגדירו אותו כ-Motor. ערך זה חייב להתאים בדיוק לשדה ה-Name של ניסוי המנוע ב-RIP Configuration. דף צד-הלקוח של המנוע משתמש באותה לוגיקת יצירת ממשק משתמש מבוססת מטא-דאטה המוצגת ב-איור 5; רק מזהה הניסוי שונה כדי להתאים לרשומת ה-Motor ב-RIP Configuration.
    4. וודאו שהדף מכיל את לוגיקת קריאת המטא-דאטה של RIP, את לוגיקת יצירת בקרת ה-HTML, את פונקציית הכתיבה של RIP ואת פונקציית עדכון הפלט.
      הערה: הדף לא צריך לקודד באופן ידני את שמות משתני המנוע, הטווחים או גדלי הצעדים. תכונות אלו נגזרות מהמטא-דאטה המוחזר משרת RIP, בהתאם למנגנון יצירת HTML ממטא-דאטה מבוסס RIP שתואר קודם לכן11.
    5. שמרו את Motor_Automatic_UI.xhtml.
      ​הערה: כדי להשתמש באותה לוגיקת יצירת צד-לקוח עבור LabVIEW VI אחר, הגדירו מזהה ניסוי חדש בקובץ ה-XHTML ורשמו את שם הניסוי (Name) ונתיב ה-VI (VI Path) המתאימים ב-RIP Configuration. בקרות הרשת ותצוגות הפלט נוצרות בהתאם למטא-דאטה המוחזר מהניסוי שנבחר.
  4. הגדרת נתיב גישת Caddy עבור ניסוי המנוע.
    1. פתחו את ה-Caddyfile באמצעות עורך טקסט.
    2. הגדירו את ספריית השורש של צד-הלקוח לספריית Client המכילה את Motor_Automatic_UI.xhtml.
    3. בחרו פורט מקומי שאינו בשימוש עבור Caddy כדי לספק גישה בדפדפן לדף האינטרנט ולנתיבי RIP. בפרוטוקול זה, פורט 8090 משמש כפורט גישה לדוגמה כפרוקסי.
      הערה: פורט 8090 אינו נדרש על ידי RIP או Caddy. אם פורט 8090 תפוס, החליפו אותו בפורט מקומי אחר שאינו בשימוש והשתמשו באותו פורט בכתובת הדפדפן.
    4. הוסיפו נתיב הממיר (rewrites) את /motor ל-Motor_Automatic_UI.xhtml.
    5. זהו את פורט ה-RIP WebService שהוגדר ב-LabVIEW. בפרוטוקול זה, http://localhost:8001 משמש ככתובת ה-RIP WebService.
      הערה: פורט 8001 הוא פורט ה-back-end של LabVIEW/RIP WebService המשמש בסביבת הבדיקה. ניתן לשנות אותו בהגדרות LabVIEW/RIP WebService. אם נעשה שימוש בפורט אחר, החליפו את http://localhost:8001 ב-Caddyfile בכתובת ה-RIP WebService המתאימה.
    6. הוסיפו כלל פרוקסי הפוך (reverse proxy) השולח בקשות /RIP/SSE* לכתובת ה-RIP WebService, כגון http://localhost:8001.
    7. הוסיפו כלל פרוקסי הפוך השולח בקשות /RIP* לכתובת ה-RIP WebService, כגון http://localhost:8001. הגדרת ה-Caddyfile מוצגת באיור 6.
    8. פתחו את שורת הפקודה (Command Prompt) ב-Windows. עברו לספריית ההורדה או ההתקנה המקומית של Caddy על ידי הזנת הפקודה הבאה:
      cd /d D:\caddy
      הערה: בפרוטוקול זה, D:\caddy הוא נתיב ההורדה או ההתקנה המקומי של Caddy המשמש בסביבת הבדיקה. אם Caddy מאוחסן בספרייה אחרת, החליפו את D:\caddy בנתיב המקומי המתאים.
    9. הפעילו את Caddy עם ה-Caddyfile שצוין על ידי הזנת הפקודה הבאה:
      caddy.exe run --config Caddyfile
    10. אשרו ש-Caddy התחיל ללא דיווח על שגיאת הגדרה. פתחו את http://localhost:8090/motor בדפדפן אינטרנט ואשרו שממשק המשתמש של המנוע נוצר, כפי שמוצג ב-איור 12.
      ​הערה: אם דף האינטרנט של המנוע נטען אך ערכי הפלט אינם מתעדכנים, וודאו ש-RIP WebService פועל, שה-VI של המנוע רץ, שפורט ה-RIP WebService ב-LabVIEW תואם לכתובת הפרוקסי ההפוך ב-Caddyfile, ושהנתיב /RIP/SSE* מועבר כראוי דרך הפרוקסי.
  5. אימות תוצאות הפעלה של ניסוי המנוע.
    1. וודאו שדף צד-הלקוח יוצר אוטומטית את בקרות קלט ה-Setpoint, Kc, Ti, Td, Disturbance, ו-Reset .
    2. וודאו שדף צד-הלקוח מציג את משתני הפלט Position, Voltage, Time, ו-Measured angular velocity.
    3. כווןו את ה-Setpoint ובחנו האם המיקום (Position) מגיב לשינוי במיקום הרצוי.
    4. כווןו את Kc, Ti, ו-Td ובחנו האם Voltage, Position, ו-Measured angular velocity משתנים.
    5. כווןו את ההפרעה (disturbance) ובחנו האם המיקום, מתח הבקרה או המהירות הזוויתית הנמדדת מושפעים מקלט ה-disturbance .
    6. לחצו על בקרת Reset ובחנו האם Position, Voltage, Measured angular velocity, והמצבים הפנימיים הקשורים חוזרים למצביהם הראשוניים בהתאם ללוגיקת האיפוס.

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

תוצאות

לאחר השלמת זרימת העבודה המתוארת לעיל, ניתן לגשת הן לניסוי המאוורר והן לניסוי בקרת המיקום PID של מנוע ה-DC דרך ממשק האינטרנט (Web front end) שנוצר באופן אוטומטי. תוצאה מוצלחת מודגשת על ידי שלוש תצפיות. ראשית, דף האינטרנט מייצר באופן אוטומטי בקרות קלט ושדות תצוגת פלט בהתאם למטא-נתוני המשתנים שהוחזרו על ידי שרת ה-RIP. שנית, כאשר המשתמש משנה משתנה קלט בדף האינטרנט, הערך המעודכן נכתב אל ה-VI של ה-LabVIEW ב-back-end באמצעות ממשק ה-RIP. שלישית, משתני הפלט שחושבו על ידי ה-VI ב-back-end מוחזרים דרך ה-RIP ומתעדכנים בדף האינטרנט בז...

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

דיון

שלב קריטי בפרוטוקול זה הוא הבנייה והרישום הסטנדרטיים של ה-VI של ה-back-end ב-LabVIEW. הבקרים והמחוונים ב-Front Panel חייבים להשתמש בשמות משתנים ברורים וייחודיים, וסוגי הנתונים שלהם חייבים להתאים למשתנים המצופים על ידי חישוב המודל ועל ידי תהליך הקריאה/כתיבה של ה-RIP. בשתי הדוגמאות המשמשות בפרוטוקול זה, משתנים מספריים סקלאריים מוגדרים כבקרים או מחוונים מסוג DBL, ומשתנים בוליאניים מוגדרים כבקרים בוליאניים. על ה-Block Diagram לשמור גם הוא על עדכון מצב רציף באמצעות While Loop, Shift Registers ו-Formula Node, כך שניתן יהיה לעד...

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

גילויים

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

תודות

עבודה זו נתמכה על ידי תוכניות ההכשרה לתשיתי חדשנות לבשלבים ראשוניים של התואר באוניברסיטת ווהאן.

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

חומרים

רשימת החומרים שנעשה בהם שימוש במאמר זה
שםחברהמספר קטלוגהערות
שרת פרוקסי CaddyCaddyN/Aפרוקסי הפוך המשמש להגשת ממשק המשתמש של האינטרנט ולהעברת בקשות /RIP לשירות האינטרנט (WebService) של RIP
Caddyfileהוכן על ידי המחבריםN/Aמגדיר נתיבי קבצים סטטיים ונתיבי פרוקסי הפוך לתקשורת RIP
Fan_Automatic_UI.xhtmlהוכן על ידי המחבריםN/Aממשק משתמש של רשת מבוסס מטא-נתונים עבור ניסוי המאוורר
LabVIEWNational Instruments2026תוכנה המשמשת לבנייה ולהרצה של fengshan.vi ו-Motor.vi
מערכת ההפעלה Microsoft WindowsMicrosoftWin11מערכת ההפעלה המשמשת להרצת LabVIEW, שירות האינטרנט (WebService) של RIP, Caddy והדפדפן.
Motor_Automatic_UI.xhtmlהוכן על ידי המחבריםN/Aממשק משתמש של רשת מבוסס מטא-נתונים עבור ניסוי המנוע
דפדפן שולחן Mozilla FirefoxMozilla2026דפדפן שולחן המשמש לגישה לממשק המשתמש של האינטרנט, כלי מפתחים, תצפיות על תזמון/משאבים וצילומי מסך של רשת/קונסולה.
שירות האינטרנט (WebService) של RIPUNEDLabshttps://github.com/Nebulous-Systems/rip-server_labviewמקבל בקשות RIP POST ומספק את שכבת התקשורת של שירות האינטרנט המשמשת את ממשק הקדמה של הדפדפן.
מנהל המשימות של WindowsMicrosoftמובנה ב-Windowsמשמש להקלטת תצפיות על CPU וזיכרון ברמת תהליך עבור תהליכי הדפדפן ו-LabVIEW.

מקורות

  1. Gomes, L., Bogosyan, S. Current trends in remote laboratories. IEEE Trans Ind Electron. 2009;56(12):4744–4756.
  2. Ma, J., Nickerson, J. V. Hands-on, simulated, and remote laboratories: A comparative literature review. ACM Comput Surv. 2006;38(3):7-es.
  3. Heradio, R. et al. Virtual and remote labs in education: A bibliometric analysis. Comput. Educ. 2016;98:14–38.
  4. May, D., Jahnke, I., Moore, S. Online laboratories and virtual experimentation in higher education from a sociotechnical-pedagogical design perspective. J. Comput. High. Educ. 2023;35:203–222.
  5. Amador Nelke, S. et al. Enhancing lessons on the Internet of Things in science, technology, engineering, and medical education with a remote lab. Sensors.2024;24(19):6424.
  6. Lei, Z. et al. Interactive and visualized online experimentation system for engineering education and research. J. Vis. Exp. 2021;(177):e63342.
  7. Zhang, G., Lei, Z., Hu, W., Zhou, H. Online virtual reality networked control laboratory applied in control engineering education. J. Vis. Exp. 2024;(204):e66432.
  8. Fabregas, E., Farias, G., Dormido-Canto, S., Dormido, S., Esquembre, F. Developing a remote laboratory for engineering education. Comput. Educ. 2011;57(2):1686–1697.
  9. Chacón, J., Vargas, H., Farias, G., Sánchez, J., Dormido, S. EJS, JIL Server, and LabVIEW: An architecture for rapid development of remote labs. IEEE Trans. Learn. Technol.2015;8(4):393–401.
  10. Chacón, J., Farias, G., Vargas, H., Visioli, A., Dormido, S. Remote Interoperability Protocol: A bridge between interactive interfaces and engineering systems. IFAC-PapersOnLine.2015;48(29):247–252.
  11. de la Torre, L., Chacón, J., Chaos, D., Heradio, R., Chandramouli, R. Using IoT-type metadata and smart Web design to create user interfaces automatically. IEEE Trans. Ind. Inform. 2023;19(3):3109–3118.
  12. Chaos, D., Chacón, J., Lopez-Orozco, J. A., Dormido, S. Virtual and remote robotic laboratory using EJS, MATLAB, and LabVIEW. Sensors. 2013;13(2):2595–2612.
  13. Haj-Hosseini, N., Jonasson, H., Stridsman, M., Carlsson, L. Interactive remote electrical safety laboratory module in biomedical engineering education. Educ. Inf. Technol. 2024;29:20505–20521.
  14. Galán, D. et al. Safe experimentation in optical levitation of charged droplets using remote labs. J. Vis. Exp. 2019;(143):e58699.
  15. Kurtz, M., Benabbou, A., Pons, C., Broisin, J. Collaboration in virtual and remote laboratories for education: A systematic literature review. Int. J. Comput.-Support. Collab. Learn. 2025;20:549–603.
  16. Zamarreño, J. M., Ríos, J. C., Alonso, G. Virtual and remote laboratory as a complementary support in control education. Discov. Educ. 2025;4:477.
  17. Chacón, J., Sáenz, J., de la Torre, L., Díaz, J. M., Esquembre, F. Design of a low-cost air levitation system for teaching control engineering. Sensors. 2017;17(10):2321.
  18. Stefanovic, M., Cvijetkovic, V., Matijevic, M., Simic, V. A LabVIEW-based remote laboratory experiments for control engineering education. Comput. Appl. Eng. Educ.2011; 19(3):538–549.
  19. González, I., Calderón, A. J., Mejías, A., Andújar, J. M. Novel networked remote laboratory architecture for open connectivity based on PLC-OPC-LabVIEW-EJS integration. Application in remote fuzzy control and sensors data acquisition. Sensors. 2016;16(11):1822.
  20. Abdulwahed, M., Nagy, Z. K. Developing the TriLab, a triple access mode (hands-on, virtual, remote) laboratory, of a process control rig using LabVIEW and Joomla. Comput. Appl. Eng. Educ. 2013;21(4):614–626.

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

הדפסות חוזרות והרשאות

תגיות

ממשק משתמש באינטרנטיצירה אוטומטית של ממשק משתמשמכשירים וירטואלייםהגדרת שרת RIPפרוקסי הפוךפרוקסי Caddyבקרת מיקום PIDמטא-נתונים משתנים

מאמר זה פורסם

הסרטון יגיע בקרוב