Хотелось бы поговорить о языках программирования промышленных роботов.
Так как такую информацию трудно найти, то то любая информация от тех, кто что нибудь о них знает, либо встречался с ними или даже работал, будет очень полезна и интересна.
В частности интересует язык MELFA-BASIC IV.
[?]: Языки программирования промышленных роботов
-
- Posts: 10
- Joined: Thu Jun 10, 2010 3:14 am
-
- Posts: 149
- Joined: Sun Dec 20, 2009 1:30 pm
- Location: Russia
Re: [?]: Языки программирования промышленных роботов
Назовите конкретно производителя...
Могу дать немного информации о FANUC, с другими не работал поэтому ничего сказать не смогу.
Могу дать немного информации о FANUC, с другими не работал поэтому ничего сказать не смогу.
-
- Posts: 10
- Joined: Thu Jun 10, 2010 3:14 am
Re: [?]: Языки программирования промышленных роботов
Конкретный производитель не интересует, так как нет к нему "привязки", а интересуют сами языки. Но вышеупомянутый язык MELFA-BASIC IV используется роботами Mitsubishi и еще вроде Kuka. Был бы признателен за информацию о FANUC...
-
- Posts: 149
- Joined: Sun Dec 20, 2009 1:30 pm
- Location: Russia
Re: [?]: Языки программирования промышленных роботов
К сожалению через 5 часов уезжаю, поэтому информацию выложу только по приезду - в конце июня. Могу предложить для разбора часть рабочего кода 3-осевого робота FUNUC M-410iB, который складывает в "пачки" готовую продукцию. Что это за язык, я вточности сказать немогу, но очень похоже на Си... или на подобный "высокого" уровня. Естественно имеется своя система команд по перемещению в заданные точки, и позиционных регистров.
Описания на русском нет, но разобраться можно.
Описания на русском нет, но разобраться можно.
-
- Posts: 10
- Joined: Thu Jun 10, 2010 3:14 am
Re: [?]: Языки программирования промышленных роботов
dmitry_79, Вы еще не приехали?
хотелось бы взглянуть на тот фрагмент кода про который вы упоминали.

-
- Posts: 149
- Joined: Sun Dec 20, 2009 1:30 pm
- Location: Russia
Re: [?]: Языки программирования промышленных роботов
Уже приехалIamgi wrote:dmitry_79, Вы еще не приехали?хотелось бы взглянуть на тот фрагмент кода про который вы упоминали.

-
- Posts: 10
- Joined: Thu Jun 10, 2010 3:14 am
Re: [?]: Языки программирования промышленных роботов
dmitry_79, вот бы коду глянуть....где же где же... 

-
- Posts: 149
- Joined: Sun Dec 20, 2009 1:30 pm
- Location: Russia
Re: [?]: Языки программирования промышленных роботов
Программа трехосевого робота FANUC- M-410iB
Некомпилированный файлы имеют расширение *ls, компилированный - *tp.
Файлы *ls можно редактировать двумя вариантами:
- на PC с помощью текстового редактора, а компилировать - специальным компилятором.
- с пульта управления роботом (имеет большой экран и клавиатуру). В этом случае компиляция производиться програмным обеспечением самого робота.
Ниже приведен листинг одного из файлов: _S01.ls
Робот имеет в памяти т.н. позиционные регистры ( PR[xx:...] ) и в которых может задаваться точка пространства. Причем команда перемщения (J или L) может содержать дополнительную информацию: скорость, линейность , траекторию и т.п.
Кроме позиционных регистров есть дискретный входы (DI) и дискретные выходы (DO) оперируя которыми можно организовать какой-то алгоритм (например: ожидать на входе DI1 сигнал, по его появлению переместиться в позицию PR[xx:...]; по окончанию движения установить выход DO1...)
Существуют групповые DI/DO.
Состояние DI/DO передается по сетевым интерфесам.
Так-же есть инфоормационные регистры (R[xx:...]) для хранения каких-либо переменных
Робот имеет интерфейсы ETHERNET, PROFIBUS, встроенный FTP-сервер.
Специфичный для языка синтаксис:
! - знак коментария
х: - номер строки
L PR[91:S1] 400mm/sec FINE Skip - двигаться в позицию записанную регистре 91 со скоростью 400мм/с, все оси робота при этом достигают заданной точки в одно время (т.е робот сам расчитывает скорость конкретной оси в зависимости от расстояния)
J PR[99:home position] 30% двигаться в позицию поз.регистра 99, все оси при этом двигаются со скоростью 30% от максимальной
Сторки после 160 не выполняются в цикле (в строке 160 стоит LBL[9999:end]). Они предназначены для записи конкретной позиции робота в пространстве в какой-то регистр. Т.е. запускаем программу со строки 161, выводим робота в ручную в нужную позицию, и сохраняем текущую позицию например в регистр P[21:"pickup TP 1"].
Этот процесс называется "обучение"
или teach position.
Примерно так....
Некомпилированный файлы имеют расширение *ls, компилированный - *tp.
Файлы *ls можно редактировать двумя вариантами:
- на PC с помощью текстового редактора, а компилировать - специальным компилятором.
- с пульта управления роботом (имеет большой экран и клавиатуру). В этом случае компиляция производиться програмным обеспечением самого робота.
Ниже приведен листинг одного из файлов: _S01.ls
Code: Select all
/PROG _S01
/ATTR
OWNER = MNEDITOR;
COMMENT = "250x120x088 RP1";
PROG_SIZE = 3831;
CREATE = DATE 09-02-28 TIME 17:50:20;
MODIFIED = DATE 09-02-28 TIME 17:53:36;
FILE_NAME = _S02;
VERSION = 0;
LINE_COUNT = 160;
MEMORY_SIZE = 4347;
PROTECT = READ_WRITE;
TCD: STACK_SIZE = 0,
TASK_PRIORITY = 50,
TIME_SLICE = 0,
BUSY_LAMP_OFF = 0,
ABORT_REQUEST = 0,
PAUSE_REQUEST = 0;
DEFAULT_GROUP = 1,*,*,*,*,*,*;
CONTROL_CODE = 00000000 00000000;
/APPL
/MN
1: ! ;
2: !robot R1 ;
3: !
4: !;
5: !size number 2 ;
6: !drawing no. 694261 ;
7: ;
8: JMP LBL[10] ;
9: !installation mode (Teaching) ;
10: !program for ;
11: !installation ;
12: !-- IMPORTANT -- ;
13: !execute the process ;
14: !only in ;
15: !step mode ;
16: ;
17: OVERRIDE=10% ;
18: ;
19: MESSAGE[ ] ;
20: MESSAGE[ ] ;
21: MESSAGE[ - A T T E N T I O N -] ;
22: MESSAGE[ installation mode] ;
23: MESSAGE[ is running] ;
24: MESSAGE[ execute the process] ;
25: MESSAGE[ only in] ;
26: MESSAGE[ S T E P M O D E ] ;
27: $SSR.$SINGLESTEP=1 ;
28: $SSR.$STEPSTMTTYP=0 ;
29: PAUSE ;
30: ;
31: !teach pick up positions ;
32: !************************ ;
33: UTOOL_NUM=2 ;
34: UFRAME_NUM=1 ;
35: ;
36: !pick up position 1 ;
37:J P[21:pickup TP 1] 20% FINE ;
38: PAUSE ;
39: ;
40: !pick up position 2 ;
41:J P[22:pickup TP 2] 20% FINE ;
42: PAUSE ;
43: ;
44: !intermediate pick up ;
45:J P[81:intermediate PU ] 20% FINE ;
46: PAUSE ;
47: ;
48: !teach set down positions ;
49: !************************ ;
50: UTOOL_NUM=2 ;
51: UFRAME_NUM=4 ;
52: ;
53: !set down position 1 ;
54:J P[31:set down TP 1] 25% FINE ;
55: PAUSE ;
56: ;
57: !set down position 2 ;
58:J P[32:set down TP 2] 25% FINE ;
59: ABORT ;
60: ;
61: LBL[10] ;
62: !pick up positions ;
63: PR[21:pick up TP 1]=P[21:pickup TP 1] ;
64: PR[22:pick up TP 2]=P[22:pickup TP 2] ;
65: PR[81:interm. TP PU]=P[81:intermediate PU ] ;
66: ;
67: !set down position ;
68: PR[31:set down TP 1]=P[31:set down TP 1] ;
69: PR[32:set down TP 2]=P[32:set down TP 2] ;
70: ;
71: R[33:pick up no. max]=1 ;
72: R[34:set down no. max]=8 ;
73: ;
74: !offset initialisation ;
75: !article CW x CH x CL ;
76: !article 250 x 120 x 088 ;
77: R[37:column width]=250 ;
78: R[38:column height]=120 ;
79: R[39:column length]=88 ;
80: ;
81: R[51:one X-Offset SD]=0 ;
82: R[52:one Y-Offset SD]=0 ;
83: R[53:one Z-Offset SD]=R[38:column height] ;
84: ;
85: !offset for pick up bricks ;
86: PR[42:offs. above PU]=PR[100:XYZWPR 0] ;
87: PR[43:offs.1 before PU]=PR[100:XYZWPR 0] ;
88: PR[44:offs.2 before PU]=PR[100:XYZWPR 0] ;
89: PR[45:offs.3 before PU]=PR[100:XYZWPR 0] ;
90: PR[47:offs. 1after PU]=PR[100:XYZWPR 0] ;
91: PR[48:offs. 2after PU]=PR[100:XYZWPR 0] ;
92: ;
93: PR[42,1:offs. above PU]=0 ;
94: PR[42,2:offs. above PU]=0 ;
95: PR[42,3:offs. above PU]=500 ;
96: ;
97: PR[43,1:offs.1 before PU]=0 ;
98: PR[43,2:offs.1 before PU]=0 ;
99: PR[43,3:offs.1 before PU]=150 ;
100: ;
101: PR[44,1:offs.2 before PU]=0 ;
102: PR[44,2:offs.2 before PU]=0 ;
103: PR[44,3:offs.2 before PU]=300 ;
104: ;
105: PR[45,1:offs.3 before PU]=0 ;
106: PR[45,2:offs.3 before PU]=0 ;
107: PR[45,3:offs.3 before PU]=250 ;
108: ;
109: PR[47,1:offs. 1after PU]=0 ;
110: PR[47,2:offs. 1after PU]=0 ;
111: PR[47,3:offs. 1after PU]=150 ;
112: ;
113: PR[48,1:offs. 2after PU]=0 ;
114: PR[48,2:offs. 2after PU]=0 ;
115: PR[48,3:offs. 2after PU]=200 ;
116: ;
117: !offsets for set down bricks ;
118: PR[52:offs. above SD]=PR[100:XYZWPR 0] ;
119: PR[53:offs.1 before SD]=PR[100:XYZWPR 0] ;
120: PR[54:offs.2 before SD]=PR[100:XYZWPR 0] ;
121: PR[57:offs.1 after SD]=PR[100:XYZWPR 0] ;
122: PR[58:offs.2 after SD]=PR[100:XYZWPR 0] ;
123: ;
124: PR[52,1:offs. above SD]=0 ;
125: PR[52,2:offs. above SD]=200 ;
126: PR[52,3:offs. above SD]=1800 ;
127: ;
128: PR[53,1:offs.1 before SD]=0 ;
129: PR[53,2:offs.1 before SD]=0 ;
130: PR[53,3:offs.1 before SD]=100 ;
131: ;
132: PR[54,1:offs.2 before SD]=0 ;
133: PR[54,2:offs.2 before SD]=0 ;
134: PR[54,3:offs.2 before SD]=500 ;
135: ;
136: PR[57,1:offs.1 after SD]=0 ;
137: PR[57,2:offs.1 after SD]=0 ;
138: PR[57,3:offs.1 after SD]=150 ;
139: ;
140: PR[58,1:offs.2 after SD]=0 ;
141: PR[58,2:offs.2 after SD]=0 ;
142: PR[58,3:offs.2 after SD]=350 ;
143: ;
144: IF R[3:program init.]=1,JMP LBL[20] ;
145: R[6:pick up cycle]=1 ;
146: R[7:set down cycle]=1 ;
147: R[8:pick up TP act]=1 ;
148: R[10:layer no. act]=1 ;
149: R[211:timer number old]=0 ;
150: R[212:timer number act]=1 ;
151: ;
152: LBL[20] ;
153: CALL _S01_C ;
154: ;
155: !constants initialisation ;
156: R[1:Size no. act]=1 ;
157: R[4:program oper.no]=1 ;
158: R[3:program init.]=1 ;
159: ;
160: LBL[9999:end] ;
/POS
P[21:"pickup TP 1"]{
GP1:
UF : 1, UT : 2, CONFIG : 'U, 0, 0',
X = 10.000 mm, Y = 0.000 mm, Z = 10.000 mm,
W = 180.000 deg, P = 0.000 deg, R = 0.000 deg
};
P[22:"pickup TP 2"]{
GP1:
UF : 1, UT : 2, CONFIG : 'U, 0, 0',
X = 10.000 mm, Y = 0.000 mm, Z = 10.000 mm,
W = 180.000 deg, P = 0.000 deg, R = 0.000 deg
};
P[31:"set down TP 1"]{
GP1:
UF : 4, UT : 2, CONFIG : 'U, 0, 0',
X = 0.000 mm, Y = 0.000 mm, Z = 120.000 mm,
W = -180.000 deg, P = .000 deg, R = -180.000 deg
};
P[32:"set down TP 2"]{
GP1:
UF : 4, UT : 2, CONFIG : 'U, 0, -1',
X = 0.000 mm, Y = 0.000 mm, Z = 120.000 mm,
W = 180.000 deg, P = 0.000 deg, R = 90.000 deg
};
P[81:"intermediate PU "]{
GP1:
UF : 1, UT : 2, CONFIG : 'U, 0, 0',
X = 0.000 mm, Y = -1500.000 mm, Z = 300.000 mm,
W = 180.000 deg, P = 0.000 deg, R = 0.000 deg
};
/END
Кроме позиционных регистров есть дискретный входы (DI) и дискретные выходы (DO) оперируя которыми можно организовать какой-то алгоритм (например: ожидать на входе DI1 сигнал, по его появлению переместиться в позицию PR[xx:...]; по окончанию движения установить выход DO1...)
Существуют групповые DI/DO.
Состояние DI/DO передается по сетевым интерфесам.
Так-же есть инфоормационные регистры (R[xx:...]) для хранения каких-либо переменных
Робот имеет интерфейсы ETHERNET, PROFIBUS, встроенный FTP-сервер.
Специфичный для языка синтаксис:
! - знак коментария
х: - номер строки
L PR[91:S1] 400mm/sec FINE Skip - двигаться в позицию записанную регистре 91 со скоростью 400мм/с, все оси робота при этом достигают заданной точки в одно время (т.е робот сам расчитывает скорость конкретной оси в зависимости от расстояния)
J PR[99:home position] 30% двигаться в позицию поз.регистра 99, все оси при этом двигаются со скоростью 30% от максимальной
Сторки после 160 не выполняются в цикле (в строке 160 стоит LBL[9999:end]). Они предназначены для записи конкретной позиции робота в пространстве в какой-то регистр. Т.е. запускаем программу со строки 161, выводим робота в ручную в нужную позицию, и сохраняем текущую позицию например в регистр P[21:"pickup TP 1"].
Этот процесс называется "обучение"

Примерно так....
-
- Posts: 10
- Joined: Thu Jun 10, 2010 3:14 am
Re: [?]: Языки программирования промышленных роботов
Спасибо за код и пояснения.