[?]: Языки программирования промышленных роботов

Прочие PLC и HMI на русском
Iamgi
Posts: 10
Joined: Thu Jun 10, 2010 3:14 am

[?]: Языки программирования промышленных роботов

Post by Iamgi »

Хотелось бы поговорить о языках программирования промышленных роботов.
Так как такую информацию трудно найти, то то любая информация от тех, кто что нибудь о них знает, либо встречался с ними или даже работал, будет очень полезна и интересна.
В частности интересует язык MELFA-BASIC IV.
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?]: Языки программирования промышленных роботов

Post by dmitry_79 »

Назовите конкретно производителя...

Могу дать немного информации о FANUC, с другими не работал поэтому ничего сказать не смогу.
Iamgi
Posts: 10
Joined: Thu Jun 10, 2010 3:14 am

Re: [?]: Языки программирования промышленных роботов

Post by Iamgi »

Конкретный производитель не интересует, так как нет к нему "привязки", а интересуют сами языки. Но вышеупомянутый язык MELFA-BASIC IV используется роботами Mitsubishi и еще вроде Kuka. Был бы признателен за информацию о FANUC...
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?]: Языки программирования промышленных роботов

Post by dmitry_79 »

К сожалению через 5 часов уезжаю, поэтому информацию выложу только по приезду - в конце июня. Могу предложить для разбора часть рабочего кода 3-осевого робота FUNUC M-410iB, который складывает в "пачки" готовую продукцию. Что это за язык, я вточности сказать немогу, но очень похоже на Си... или на подобный "высокого" уровня. Естественно имеется своя система команд по перемещению в заданные точки, и позиционных регистров.

Описания на русском нет, но разобраться можно.
Iamgi
Posts: 10
Joined: Thu Jun 10, 2010 3:14 am

Re: [?]: Языки программирования промышленных роботов

Post by Iamgi »

dmitry_79, Вы еще не приехали? :) хотелось бы взглянуть на тот фрагмент кода про который вы упоминали.
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?]: Языки программирования промышленных роботов

Post by dmitry_79 »

Iamgi wrote:dmitry_79, Вы еще не приехали? :) хотелось бы взглянуть на тот фрагмент кода про который вы упоминали.
Уже приехал :). Чемоданы распакую и выложу.
Iamgi
Posts: 10
Joined: Thu Jun 10, 2010 3:14 am

Re: [?]: Языки программирования промышленных роботов

Post by Iamgi »

dmitry_79, вот бы коду глянуть....где же где же... :)
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?]: Языки программирования промышленных роботов

Post by dmitry_79 »

Программа трехосевого робота FANUC- M-410iB

Некомпилированный файлы имеют расширение *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
Робот имеет в памяти т.н. позиционные регистры ( 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.


Примерно так....
Iamgi
Posts: 10
Joined: Thu Jun 10, 2010 3:14 am

Re: [?]: Языки программирования промышленных роботов

Post by Iamgi »

Спасибо за код и пояснения.