מבוא מעשי ל-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 תואם:
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) והוא קובע באיזו תצורת מרפק תשתמש הזרוע — הגדירו אותו במפורש בכל מקום שבו תצורה שגויה עלולה לפגוע במתקן.
בפועל תכתבו את מקטע ה-DATA ידנית רק לעתים רחוקות. כשעורכים תוכנית בפנדנט הלימוד או בתוכנת התמיכה של Shibaura Machine, הנקודות עוברות דרך עורך נתונים נפרד ו-DATA ... END נוסף אוטומטית. עריכה ידנית שמורה לעבודה אופליין ולניהול גרסאות.
התוכנית הראשונה שלך
תוכנית ה-SCOL הקטנה ביותר שיש בה תועלת קובעת מהירות, עוברת בשתי נקודות שנלמדו ומסתיימת:
PROGRAM MOVEA1A2
SPEED = 20
MOVE A1
MOVE A2
ENDSPEED מוגדר כאחוז מהמהירות המקסימלית ולא כמהירות מוחלטת. הפקודה MOVE מבצעת תנועת נקודה-לנקודה במרחב הצירים — כל הצירים מתחילים ועוצרים יחד, והמסלול בין הנקודות אינו קו ישר. השתמשו ב-MOVES כשנדרשת אינטרפולציה לינארית של נקודת הכלי, בדרך כלל בתנועות גישה ונסיגה סמוך למתקן.
תוויות ו-GOTO
ההסתעפות ב-SCOL מבוססת תוויות. מגדירים תווית על ידי הצבת מזהה בתחילת משפט ואחריו נקודתיים, וקופצים אליה באמצעות GOTO, ללא נקודתיים:
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 תוויות:
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:, תווית מחזור מפורשת, הסתעפות פסילה ויציאה נקייה בסוף מחזור.
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היא מילה שמורה נוספת שקל להיכשל בה.
בבקרי Shibaura הפקודות OPEN1, CLOSE1, OPENI1 ו-CLOSEI1 אינן פקודות מובנות — הן שגרות ספרייה שיושבות ב-SCOL.LIB בכונן ה-ROM של הבקר, והן עטיפה דקה סביב קריאות DOUT פשוטות למוצאים 203/204. הן נכשלות אם SCOL.LIB חסר, מיפוי האותות המדויק ניתן להתאמה לכל מכונה, ולאחר עריכת SCOL.LIB חובה להריץ SELECT מחדש אחרת השינוי לא יגיע לתוכנית שכבר נבחרה.
ריבוי משימות: MAXTASK, TASK, SWITCH, KILL
SCOL יכולה להריץ עד ארבע משימות במקביל. המשימה הראשית נוצרת אוטומטית עם הפעלת התוכנית ומזהה המשימה שלה הוא תמיד 1; משימות נוספות אתם מפעילים בעצמכם. השימוש הקלאסי הוא משימת תחזוקת I/O שמשיבה לאותות בזמן שהזרוע עסוקה.
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מבוטל לחלוטין. השתמשו בו לאירוע חד-פעמי אמיתי, לא כדי לזייף מקביליות.
DELAY היא פקודת בקרת תנועה — היא עוצרת את הזרוע. לכן היא אינה חוקית בתת-משימה שאין לה שליטה על הזרוע, והקומפיילר ידחה אותה. לתזמון בתוך תת-משימה השתמשו ב-TIMER.
מה הלאה
לאחר שהמבנה, התוויות והמשימות מסודרים, הדבר הבא שמשנה את זמן המחזור הוא מיזוג תנועה — PASS, ACCUR והכלל המחמיר באופן מפתיע שלפיו כל WAIT, DIN או DOUT בין שתי תנועות עלול לבטל את המיזוג בשקט. פרק 5 במדריך עוסק בכך, וכדאי לקרוא אותו לפני שמנסים לקצר זמן מחזור.
אם אתם מבצעים הרצת הפעלה לתא SCARA של Shibaura בישראל ורוצים שהתוכנית תיבדק לפני שהיא מורצת מול כלי עבודה אמיתי, דברו עם צוות ההנדסה שלנו. אנחנו מבצעים אינטגרציה ושירות לרובוטי SCARA וקרטזיים של Shibaura Machine, ואת רוב המלכודות שלמעלה דיבגנו בדרך הקשה.
מקור: Shibaura Machine STEA1163, "Robot Language Manual (SCOL2)" REV.5. זמינות הפקודות משתנה בהתאם לגרסת מערכת הבקר, ותוכן SCOL.LIB ניתן להתאמה לכל מכונה — אמתו תמיד מול גרסת המדריך ומול הספרייה שמותקנת בפועל בבקר שלכם.



