Skip to main content
דלג לתוכן הראשי
רובוט SCARA דגם THE-400 מבית Shibaura Machine — תכנות SCOL2
Shibaura

תכנות Shibaura SCOL: מבנה, תוויות וריבוי משימות

צוות ההנדסה של Xpert Robotics12 דקות קריאה

מבוא מעשי ל-SCOL2, שפת הרובוט של בקרי SCARA מבית Shibaura Machine. המדריך מכסה את מבנה GLOBAL/PROGRAM/DATA, תוויות ו-GOTO, שלד תוכנית MAIN נכונה, וריבוי משימות אמיתי עם TASK, SWITCH ו-KILL — כולל המלכודות שעלו לנו בשעות דיבוג על מכונה חיה.

SCOL היא שפת הרובוט של בקרי SCARA מבית Shibaura Machine — היצרנית שאותה אתם אולי עדיין מכירים בשם Toshiba Machine. הניב הנוכחי נקרא SCOL2, ואם כתבתם ABB RAPID או Pascal הוא ייראה לכם מוכר: משתנים בעלי טיפוס, בקרת זרימה מסודרת ותוכניות בעלות שם. אבל ל-SCOL יש מוסכמות משלה, ושתיים מהן — מבנה שלושת המקטעים והאופן שבו ריבוי משימות חולק מצב — מפילות כמעט כל מתחיל.

מדריך זה מכסה את מבנה הקובץ, תוויות והסתעפות, שלד תוכנית MAIN שאפשר באמת לבנות עליו, וריבוי משימות אמיתי עם TASK, SWITCH ו-KILL.

שלושת המקטעים של קובץ SCOL

קובץ SCOL אינו רשימה שטוחה אחת. הוא בנוי משלושה סוגי מקטעים לכל היותר, כשכל אחד נפתח במילת מפתח משלו ונחתם ב-END תואם:

scol
GLOBAL
  MAXTASK = 2
  PARTS   = 0
END

PROGRAM MAIN
  MOVE HOME
END

DATA
  POINT HOME = 600, 0, 100, 0, 0 / RIGHTY
END

מה תפקידו של כל מקטע:

  • GLOBAL ... END — אזור המשתנים הגלובליים. כל מה שמוגדר כאן ניתן לקריאה ולכתיבה מכל מקום בקובץ. כדי לקבע את הטיפוס של משתנה חייבים לתת לו ערך התחלתי; מערכים הם החריג, מכיוון ש-DIM קובע את הטיפוס ואת מספר האיברים בנפרד.
  • PROGRAM <שם> ... END — מקטע התוכנית, כלומר הקוד עצמו. השמטת END תגרום לשגיאת קומפילציה. קובץ יכול להכיל מקטעי תוכנית רבים; PROGRAM MAIN היא נקודת הכניסה המקובלת, ותתי-תוכניות יכולות לקבל ארגומנטים, למשל PROGRAM SUB1(N1, N2, N3).
  • DATA ... END — מקטע הנתונים, המחזיק נקודות שנלמדו ונתוני מערכות קואורדינטות כהצהרות POINT, JOINT ו-TRANS.

נתוני מיקום מוצהרים בתחביר POINT <שם> = X, Y, Z, C, T / <תצורה>, כאשר הקואורדינטות במילימטרים ובמעלות. איברים שהושמטו מקבלים 0, ולכן POINT A1 = 444.44, 333.33, , , / RIGHTY הוא תחביר חוקי. שדה התצורה הוא FREE, LEFTY או RIGHTY (0, 1, 2) והוא קובע באיזו תצורת מרפק תשתמש הזרוע — הגדירו אותו במפורש בכל מקום שבו תצורה שגויה עלולה לפגוע במתקן.

NOTE

בפועל תכתבו את מקטע ה-DATA ידנית רק לעתים רחוקות. כשעורכים תוכנית בפנדנט הלימוד או בתוכנת התמיכה של Shibaura Machine, הנקודות עוברות דרך עורך נתונים נפרד ו-DATA ... END נוסף אוטומטית. עריכה ידנית שמורה לעבודה אופליין ולניהול גרסאות.

התוכנית הראשונה שלך

תוכנית ה-SCOL הקטנה ביותר שיש בה תועלת קובעת מהירות, עוברת בשתי נקודות שנלמדו ומסתיימת:

scol
PROGRAM MOVEA1A2
  SPEED = 20
  MOVE A1
  MOVE A2
END

SPEED מוגדר כאחוז מהמהירות המקסימלית ולא כמהירות מוחלטת. הפקודה MOVE מבצעת תנועת נקודה-לנקודה במרחב הצירים — כל הצירים מתחילים ועוצרים יחד, והמסלול בין הנקודות אינו קו ישר. השתמשו ב-MOVES כשנדרשת אינטרפולציה לינארית של נקודת הכלי, בדרך כלל בתנועות גישה ונסיגה סמוך למתקן.

תוויות ו-GOTO

ההסתעפות ב-SCOL מבוססת תוויות. מגדירים תווית על ידי הצבת מזהה בתחילת משפט ואחריו נקודתיים, וקופצים אליה באמצעות GOTO, ללא נקודתיים:

scol
PROGRAM GOTOSAMPLE
  MOVE A1
LOOP:
  MOVE A2
  MOVE A3
  GOTO LOOP
END

הכללים שבאמת מכשילים:

  • GOTO יכולה להסתעף רק בתוך אותו מקטע תוכנית. אין קפיצה בין תוכניות — במקום זאת קראו לתת-תוכנית.
  • GOTO לתווית שאינה קיימת באותה תוכנית תגרום לשגיאת קומפילציה.
  • שני משפטים בעלי אותו שם תווית באותה תוכנית הם גם כן שגיאה — הבקר אינו יכול להכריע לאיזה יעד לקפוץ.
  • הנקודתיים שייכות להגדרה בלבד: LOOP: מגדירה את התווית, ו-GOTO LOOP קופצת אליה.

תוויות הן גם הדרך לכתוב הסתעפות מותנית, מכיוון ש-IF ... THEN מקבלת משפט: IF DIN(3) THEN GOTO REJECT.

GOTO() — הסתעפות לפי ערך

ל-SCOL יש קפיצה מחושבת. GOTO(<ביטוי>) <תווית>, <תווית>, ... מסתעפת לתווית הראשונה כאשר הביטוי שווה 1, לשנייה כאשר הוא 2 וכן הלאה, עד 10 תוויות:

scol
PROGRAM SORTPART(N)
  GOTO(N) BIN1, BIN2, BIN3
  RETURN
BIN1:
  MOVE A1
  RETURN
BIN2:
  MOVE A2
  RETURN
BIN3:
  MOVE A3
  RETURN
END

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

RCYCLE: — תווית איפוס המחזור

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

מגבלות RCYCLE:

  • מותר להשתמש בה פעם אחת בלבד בתוכנית הראשית.
  • זרימת התוכנית חייבת להבטיח שהשורה RCYCLE: באמת מגיעה לביצוע לפחות פעם אחת.
  • לא ניתן להשתמש בה בתוכנית עם ריבוי משימות — שילוב RCYCLE עם TASK גורם לשגיאה.

תוכנית MAIN נכונה

לפניכם שלד MAIN חד-משימתי, עם החלקים שתוכנית ייצור באמת צריכה: אתחול חד-פעמי מעל RCYCLE:, תווית מחזור מפורשת, הסתעפות פסילה ויציאה נקייה בסוף מחזור.

scol
GLOBAL
  PARTS = 0
END

PROGRAM MAIN
'*** ONE-TIME INITIALISATION ******************
  ACCUR   = COARSE
  SPEED   = 20
  PAYLOAD = {5, 20}
  RESET DOUT
  OPEN1
  MOVE HOME

RCYCLE:
'*** CYCLE BODY *******************************
CYCLETOP:
  WAIT DIN(1)
  MOVE PICK + POINT(0, 0, 50)
  MOVE PICK WITH ACCUR = FINE
  WAIT MOTION >= 100
  CLOSE1
  DELAY 0.3
  MOVE PICK + POINT(0, 0, 50)

  IF DIN(3) THEN GOTO REJECT

  MOVE PLACE + POINT(0, 0, 50)
  MOVE PLACE WITH ACCUR = FINE
  WAIT MOTION >= 100
  OPEN1
  DELAY 0.3
  MOVE PLACE + POINT(0, 0, 50)
  PARTS = PARTS + 1

  IF MODE == CYCLE THEN GOTO CYCLEEND
  GOTO CYCLETOP

'*** REJECT HANDLING **************************
REJECT:
  MOVE SCRAP + POINT(0, 0, 50)
  MOVE SCRAP
  WAIT MOTION >= 100
  OPEN1
  DELAY 0.3
  MOVE SCRAP + POINT(0, 0, 50)
  GOTO CYCLETOP

CYCLEEND:
  MOVE HOME
END

למה כל חלק נחוץ:

  • ACCUR = COARSE בפתיחה, עם WITH ACCUR = FINE רק בתנועות שנדרש בהן דיוק. ברירת המחדל של הבקר היא FINE, שמאלצת בדיקה של הגעה מדויקת ליעד לפני המשפט הבא — כל נקודת דרך הופכת לעצירה מלאה ושום מיזוג מסלול אינו אפשרי.
  • RESET DOUT ו-OPEN1 מעמידים את התא במצב ידוע, במקום להתחיל מהמצב שהותירה אחריה עצירה חריגה קודמת.
  • WAIT MOTION >= 100 לפני תפיסה. MOTION מדווח על התקדמות התנועה הנוכחית באחוזים, ולכן זו הדרך לוודא שהזרוע הגיעה ליעד, במקום לנחש באמצעות השהיה.
  • DELAY 0.3 אחרי CLOSE1/OPEN1, מפני שהתפסנית פנאומטית — מצב המוצא משתנה הרבה לפני שהלסתות זזות. אם קיימים חיישני משוב לתפסנית, עדיף בהרבה להמתין להם באמצעות WAIT DIN(...) מאשר להסתמך על השהיה קבועה.
  • IF MODE == CYCLE THEN GOTO CYCLEEND מאפשר לאותה תוכנית לשרת גם הרצות יבשות במחזור בודד וגם ייצור רציף. בלעדיה, הפעלה במצב מחזור עדיין תרוץ לנצח.
  • הסתעפות הפסילה חוזרת ל-CYCLETOP: ולא ל-RCYCLE: — חלק שנפסל אינו אמור להריץ מחדש את האתחול.
  • התווית היא CYCLETOP: ולא CYCLE:, מפני ש-CYCLE היא מילה שמורה — זהו קבוע המערכת שמושווה מול MODE. נספח B במדריך מפרט את כל המילים השמורות, וכדאי לבדוק מולו את שמות התוויות והמשתנים שלכם. TID היא מילה שמורה נוספת שקל להיכשל בה.
NOTE

בבקרי Shibaura הפקודות OPEN1, CLOSE1, OPENI1 ו-CLOSEI1 אינן פקודות מובנות — הן שגרות ספרייה שיושבות ב-SCOL.LIB בכונן ה-ROM של הבקר, והן עטיפה דקה סביב קריאות DOUT פשוטות למוצאים 203/204. הן נכשלות אם SCOL.LIB חסר, מיפוי האותות המדויק ניתן להתאמה לכל מכונה, ולאחר עריכת SCOL.LIB חובה להריץ SELECT מחדש אחרת השינוי לא יגיע לתוכנית שכבר נבחרה.

ריבוי משימות: MAXTASK, TASK, SWITCH, KILL

SCOL יכולה להריץ עד ארבע משימות במקביל. המשימה הראשית נוצרת אוטומטית עם הפעלת התוכנית ומזהה המשימה שלה הוא תמיד 1; משימות נוספות אתם מפעילים בעצמכם. השימוש הקלאסי הוא משימת תחזוקת I/O שמשיבה לאותות בזמן שהזרוע עסוקה.

scol
GLOBAL
  MAXTASK = 2
  SUBID   = 0
END

PROGRAM MAIN
  IF SUBID == 0 THEN SUBID = TASK("IOWATCH")
LOOP:
  MOVE A1
  MOVE A2
  SWITCH
  GOTO LOOP
END

PROGRAM IOWATCH
WATCH:
  WAIT DIN(9)
  DOUT(5)
  WAIT DIN(-9)
  DOUT(-5)
  SWITCH
  GOTO WATCH
END

ארבע הפקודות הבסיסיות:

  • MAXTASK — מצהיר כמה משימות מותר להריץ במקביל. הוא חוקי רק במקטע GLOBAL, המקסימום הוא 4, והערך הנכון הוא מספר קריאות ה-TASK בתוספת אחת עבור המשימה הראשית. אזור העבודה של הבקר מתחלק שווה בשווה בין המשימות, ולכן MAXTASK מנופח מקטין את המקום שכל משימה מקבלת ועלול למנוע טעינה של תוכנית גדולה.
  • TASK("<שם>") — מפעילה כמשימה את מקטע התוכנית הנקוב בשם ומחזירה את מזהה המשימה. החזרת 0 פירושה שההפעלה נכשלה, וכדאי לבדוק זאת ולא להניח שהצליחה.
  • SWITCH — מפנה את התור למשימה אחרת. SCOL אינה מפנה את התור מעצמה כשהתוכנית נמצאת בלולאה צמודה, ולכן זו פקודה מחייבת ולא קוסמטית.
  • KILL(<ביטוי>) — מסיימת את המשימה בעלת המזהה הזה. ניסיון לסיים את מזהה 1 או מזהה שאינו קיים אינו שגיאה אלא פעולה ריקה. משימה שתופעל שוב לאחר מכן עם TASK תקבל מזהה חדש.

חמש מלכודות בריבוי משימות

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

קראו את אלה לפני שתכתבו את המשימה השנייה שלכם:

  • תנועה שייכת למשימה הראשית בלבד. שימוש ב-MOVE וב-MOVES בתת-משימה הוא שגיאה. תת-משימה יכולה לנטר אותות, לספור ולהפעיל מוצאים — היא אינה יכולה להזיז את הזרוע.
  • ENABLE NOWAIT משותף לכל המשימות ואינו מוגבל לאחת. המדריך ממליץ עליו עבור תת-משימת I/O, אבל הפעלתו שם מחלחלת ל-MAIN והופכת את התנועה של MAIN ללא-חוסמת, כך ש-MAIN דוהרת קדימה ומקדימה את הזרוע. התסמינים מבלבלים: תפסנית שנפתחת ונסגרת באמצע נסיעה, או שגרת חזרה לאפס שמדווחת על סיום בזמן שהזרוע עוד בתנועה. השאירו את ברירת המחדל DISABLE NOWAIT אלא אם הגדרתם את פרמטר הבקר לכל משימה בנפרד.
  • תת-משימה אינה יכולה להפעיל מוצא בזמן ש-MAIN בתנועה. ה-DOUT שלה נדחה עד לסיום התנועה הפעילה של MAIN, בעוד ש-DOUT של MAIN עצמה נכנס לתוקף מיד. לכן לעולם אל תמסרו לתת-משימה מוצא רגיש לתזמון — תנו ל-MAIN לפקד עליו, ולתת-המשימה רק לשמר אותו או להפעיל אותו מחדש.
  • WAIT על משתנה רגיל לעולם אינו מפנה את התור. WAIT DIN(1) מפנה כראוי, אבל WAIT FLAG == 1 מסתובב בלולאה, מרעיב את MAIN, ואז MAIN אף פעם לא מתוזמנת כדי לעדכן את FLAG — קיפאון מלא. סנכרנו משימות באמצעות תנאי I/O, או דגמו משתנה בלולאה שקוראת ל-SWITCH.
  • ON <תנאי> DO <משפט> אינה משימת רקע. היא חד-פעמית: הניטור נפסק ברגע שהפעולה מתבצעת. היא אינה מנטרת במהלך תנועה תחת DISABLE NOWAIT, ואם הוא מופעל בעוד WAIT מתבצע — אותו WAIT מבוטל לחלוטין. השתמשו בו לאירוע חד-פעמי אמיתי, לא כדי לזייף מקביליות.
NOTE

DELAY היא פקודת בקרת תנועה — היא עוצרת את הזרוע. לכן היא אינה חוקית בתת-משימה שאין לה שליטה על הזרוע, והקומפיילר ידחה אותה. לתזמון בתוך תת-משימה השתמשו ב-TIMER.

מה הלאה

לאחר שהמבנה, התוויות והמשימות מסודרים, הדבר הבא שמשנה את זמן המחזור הוא מיזוג תנועה — PASS, ACCUR והכלל המחמיר באופן מפתיע שלפיו כל WAIT, DIN או DOUT בין שתי תנועות עלול לבטל את המיזוג בשקט. פרק 5 במדריך עוסק בכך, וכדאי לקרוא אותו לפני שמנסים לקצר זמן מחזור.

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

NOTE

מקור: Shibaura Machine STEA1163, "Robot Language Manual (SCOL2)" REV.5. זמינות הפקודות משתנה בהתאם לגרסת מערכת הבקר, ותוכן SCOL.LIB ניתן להתאמה לכל מכונה — אמתו תמיד מול גרסת המדריך ומול הספרייה שמותקנת בפועל בבקר שלכם.

תכנות Shibauraשפת SCOL2רובוט SCARA שיבאורהתכנות רובוט Toshiba Machineריבוי משימות SCOLתוויות SCOL GOTO