Вы находитесь на странице: 1из 29

МИНИСТЕРСТВО ТРАНСПОРТА

РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное
образовательное
учреждение высшего образования
«РОССИЙСКИЙ УНИВЕРСИТЕТ ТРАНСПОРТА
(МИИТ)»

Кафедра «Путевые, строительные машины и


робототехнические комплексы»

А.Н.Неклюдов, А.В.Мишин, П.А. Сорокин

ПРОГРАММИРОВАНИЕ РОБОТОВ НА
ЯЗЫКЕ RAPID

ЧАСТЬ 1
Учебно-методическое пособие к практическим
занятиям

Москва – 2018
0
МИНИСТЕРСТВО ТРАНСПОРТА
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное
образовательное
учреждение высшего образования
«РОССИЙСКИЙ УНИВЕРСИТЕТ ТРАНСПОРТА
(МИИТ)»

Кафедра «Путевые, строительные машины и


робототехнические комплексы»

А.Н.Неклюдов, А.В.Мишин, П.А. Сорокин

ПРОГРАММИРОВАНИЕ РОБОТОВ НА
ЯЗЫКЕ RAPID

ЧАСТЬ 1
Учебно-методическое пособие
Для студентов направлений
15.03.01 «Машиностроение»,
15.04.06 «Мехатроника и робототехника»

Москва – 2018
1
УДК 004.89
Н 47

Неклюдов А.Н., Мишин А.В., Сорокин П.А.


Программирование роботов на языке RAPID. Часть
1: Учебно-методическое пособие к практическим
занятиям. - М.: РУТ (МИИТ), 2018. – 28 с.

В учебно-методическом пособии показаны


базовые конструкции языка программирования
Rapid.
Учебно-методическое пособие предназначено
для студентов направлений 15.03.01
«Машиностроение» и 15.04.06 «Мехатроника и
робототехника».

Рецензент:
Доцент кафедры «Электропоезда и
локомотивы» РУТ (МИИТ) к.т.н. Володин С.В.

© РУТ (МИИТ), 2018

2
ВВЕДЕНИЕ
Фирмы-производители промышленных
роботов разрабатывают собственные языки
программирования и средства разработки.
Большинство промышленных роботов имеют
комплексную программную оболочку, в которую по
необходимости можно интегрировать разнообразные
дополнительные модули расширения. Написание
программ происходит в обычном текстовом
редакторе или в собственных встроенных
текстовыми редакторами. Программы одного
производителя робота не подходят для робота
другого.
Программирование промышленных роботов
делится на два вида:
- Online-программирование;
- Offline-программирование.
Как правило, для программирования робота
могут использоваться оба вида. Существуют также
различия относительно методов программирования,
возможностей самих языков программирования и
возможностей роботов.
Online-программированием называют
программирование робота непосредственно на месте
его установки, с помощью пульта робота.
К данному способу относятся два метода:
Teach-In (обучение) и Playback (проигрывание).
Метод Teach-In. При этом методе движение
робота в пространстве к заданному участку
3
производится управляющей консолью. В
большинстве случаев в самом роботе (в первую ось)
заложена система координат, связанная в свою
очередь посредством кинематической цепи с самой
удаленной точкой робота (например, 6- й осью у
шестиосевого робота). Таким образом,
местоположение и ориентация всех осей и
предполагаемого инструмента робота в пространстве
всегда известны. Достигнутое местоположение
(пункт) запоминается котроллером робота и
выполняется до тех пор, пока робот не выполнит все
требуемые операции. Совокупность таких пунктов
определяет траекторию самостоятельного движения
робота. Каждый пункт имеет определенное
количество изменяемых параметров таких как
скорость движения и углового вращения, точность
конфигурацию осей.
Метод Playback. Рабочий орган робота
оператором вручную обводится по траектории
предполагаемого движения, которая в последствии в
точности повторяется роботом. Этот метод часто
применяется при программировании роботов,
занимающихся лакированием и покраской.
К недостаткам Online-программирования
относится то, что производственный процесс во
время программирования приостанавливается. К
тому же такое программирование не обеспечивает
высокой точности обработки и конечно не очень
удобно для каких-либо изменений.
4
Offline-программирование Данный вид
программирования производится на компьютере без
непосредственного участия робота, что дает
возможность программирования робота без
остановки производственного процесса.
Offline-программирование осуществляется
следующими видами программирования:
- Текстовое программирование. Это обычный
вид программирования, когда используется
текстовой язык программирования. Программа
описывает алгоритм работы всех частей робота,
опрос сенсоров и т.д. Программа непосредственно
или удаленно загружается в контроллер робота.
- Графическое программирование:
Программирование контуров обрабатываемых
деталей посредством запоминания отдельных точек
достаточно кропотливая работа, занимающая много
времени. С развитием компьютерной техники и
конструкторских программ стало возможным
применение CAD моделей для программирования
траектории движения робота на графические модели
деталей и затем интерпретировать их в язык
программирования роботов. Данные программы
позволяют также создавать модели и прототипы
робототехнических комплексов с роботами и
периферийным оборудованием, которые наглядно
отображают технологический процесс. Конечно,
такие программы не лишены недостатков и должны
быть впоследствии адаптированы непосредственно
5
на месте. Преимущество таких программ: экономия
времени и практически не останавливают
производства, возможность работать с программами
моделирования, которые позволяют увидеть работу
робота на экране монитора. Получаемое наглядное
изображение дает возможность предварительной
оценки многих параметров еще на стадии
планирования и конструирования
роботизированного комплекса:
- выбор типа робота;
- будет ли робот держать деталь или
инструмент;
- в состоянии ли робот достичь желаемой
позиции в пространстве.
Позиционирование детали в пространстве,
возможное столкновения робота и вспомогательного
оборудования, время рабочего цикла и т.д.
Виртуальная оценка рабочего пространства
робота дает четкое представление о расположении
узлов установки, что в реальности не всегда
возможно.
Но есть и недостатки такого
программирования. Offline-программирование
предполагает наличие CAD-данных по возможности
всех узлов роботизированного комплекса. Чем
точнее и полнее данные, тем точнее осуществляется
программирование робота. На практике не всегда
возможно получение всех 3D-моделей. Также
довольно трудно оценить расположение проводок
6
водо-, газо-, и энергоснабжения монтированных на
роботе и изменяющих свое положение в зависимости
от конфигураций осей робота.

RAPID – это язык программирования,


используемый для промышленных роботов фирмы
ABB, который применятся в среде разработки
RobotStudio.
Язык RAPID относится к языкам высокого
уровня.
Для примера представлена программа на языке
RAPID:

MODULE MainModule
VAR num length;
VAR num width;
VAR num area;
PROC main()
length := 10;
width := 5;
area := length * width;
TPWrite "Square" \Num:=area;
END PROC
ENDMODULE

Данная программа рассчитывает площадь


прямоугольника и выводит результат на пульт
FlexPendant:
Площадь прямоугольника равна 50
7
1. ОСНОВЫ ЯЗЫКА RAPID
1.1 ПЕРЕМЕННЫЕ

В рассматриваемом языке программирования


есть различные типы данных. Рассмотрим четыре
основных типа данных:
- Числовой (num): числовые данные целого и
десятичного типов, например, 10 или 3.14159.
- Длинный числовой (dnum): числовые данные
более широкого диапазона и расширения целого и
десятичного типов, например, 4503599627370496
или 3.141592653589793.
- Текстовый (string): строка текста, например,
«Это строка символов». Максимум из 80 символов.
- Логический (bool): булева переменная,
принимающая только два значения либо ПРАВДА
(TRUE), либо ЛОЖЬ (FALSE).
Переменная позволяет обращаться к данным и
содержит в себе их значение. Перед тем как
использовать переменную ее необходимо объявить и
присвоить значение. Объявляя переменную,
определяем ей имя и тип данных. Объявление
переменной осуществляется с помощью ключевого
слова VAR:
VAR num length;
VAR dnum pi;
VAR string name;
VAR bool finished;

8
Для присвоения значения переменной
используют инструкцию := (двоеточие равно):
length := 10;
pi := 3.141592653589793;
name := "Иван"
finished := TRUE;
Стоит отметить, что «:=» - это символ
присваивания. Выражение справа записывается в
переменную слева (только переменная может быть
слева от :=). Например, после выполнения
следующего кода переменная reg1 примет значение
3:
reg1 := 2;
reg1 := reg1 + 1;
Присвоение может быть осуществлено в
момент объявления переменных:
VAR num length := 10;
VAR dnum pi := 3.141592653589793;
VAR string name := "Иван";
VAR bool finished := TRUE;
Реманентная (persistance) переменная
запоминает последнее значение, которое ей было
присвоено, даже если программа остановилась и
снова запустилась (без выключения питания
контроллера).
Реманентная переменная объявляется с
помощью ключевого слова PERS. При объявлении
нужно сразу присвоить ей значение:
PERS num nbr := 1;
9
PERS string string1 := "Привет";
Рассмотри на примере:
PERS num nbr := 1;
PROC main()
nbr := 2;
ENDPROC
Если выполнить эту программу, то значение
изменится на 2. Когда в следующий раз программа
будет выполняться, программный код будет
выглядеть следующим образом:
PERS num nbr := 2;
PROC main()
nbr := 2;
ENDPROC

1.2 ПОСТОЯННЫЕ

Постоянные содержат значения, которые не


могут быть изменены в ходе исполнения программы.
Объявление постоянных происходит с
использованием ключевого слова CONST, за
которым следует тип данных, имя и присвоенное
значение:
CONST num gravity := 9.81;
CONST string greating := "Привет"

10
1.3 ОПЕРАТОРЫ

Операторы алгебраических действий,


используемые только с числовыми данными:
сложение (+), вычитание (-), умножение (*), деление
(/).
Операторы соотношения, используемые только
с булевыми данным:
равенство (=), знак меньше (<), знак больше (>), знак
меньше или равно (<=), знак больше или рано (>=),
знак не равно (<>).
Оператор в строковом выражении,
объединяющий две или более символьных или
двоичных строки, два или более столбцов или
несколько строк и имен столбцов в одно выражение
(строковый оператор):
! Имя
VAR string firstname := "Иван";
! Фамилия
VAR string lastname := "Иванов";
! Полностью (Имя и фамилия)
VAR string fullname;
fullname := firstname + " " + lastname;
В ходе выполнения кода программы в
переменную fullname будет записана строка: «Иван
Иванов»

11
1.4 УСЛОВИЕ И ЦИКЛЫ

В ранее рассмотренных примерах программа


выполнялась последовательно сверху вниз. Для
более комплексных программ нам может
понадобиться проконтролировать, какую часть кода
следует выполнить, в каком порядке и сколько раз.
Для начала рассмотрим, как установить условия,
если последовательность программная должна быть
выполнена или нет.

Условие IF-THEN.
Инструкция условия IF может быть
использована, когда ряд операторов должен быть
исполнен при определенном условии, встреченном в
программе.
Если логическое утверждение в постановке
условия IF – правда, тогда программа выполняет ту
часть кода, которая заключена между ключевыми
словами THEN и ENDIF. Если утверждение – ложь,
то код не выполняется и продолжает выполнение
после ENDIF.
В нижеприведенном примере строка string1
выводится на дисплей FlexPendant, если строка не
пуста. Если string1 пуста (нет символов), тогда
ничего не происходит.
VAR string string1 := "Привет";
IF string1 <> "" THEN
TPWrite string1;
12
ENDIF
Утверждение IF также может содержать код
программы для исполнения, если условие его
выполнения - ложь.
Если логическое условие в IF – правда, то
выполняется часть программы между словами THEN
и ELSE. Если логическое условие – ложь, то
выполняется часть программы между словами ELSE
и ENDIF.
В следующем примере строка string1
выводится на дисплей FlexPendant, если строка не
пуста. Если string1 пуста, тогда на дисплей будет
выведена строка «Строка пуста».
VAR string string1 := "Привет";
IF string1 <> "" THEN
TPWrite string1;
ELSE
TPWrite "Строка пуста";
ENDIF
Иногда выходит, что имеется более двух
альтернатив, тогда используется ELSEIF для их
разрешения:
VAR num time := 38.7;
IF time < 40 THEN
TPWrite "Станок работает в быстром режиме";
ELSEIF time < 60 THEN
TPWrite " Станок работает в среднем режиме ";
ELSE

13
TPWrite " Станок работает в медленном
режиме ";
ENDIF
В данном примере прописывается разный
текст в зависимости от значения переменной time.
Отметим, что при первом условие – правда, текст
будет выведен на дисплей (два оставшихся не будут
выведены, несмотря на то, что время будет меньше
60).
Примеры использования цикла IF:

Пример 1: выбор какую строку выводить на


дисплей (какое изделие работает быстрее).

VAR string part1 := "Ось";


VAR num time1;
VAR string part2 := "Труба";
VAR num time2;
PROC main()
time1 := 41.8;
time2 := 38.7;
IF time1 < time2 THEN
TPWrite part1 + " быстрее работает";
ELSEIF time1 > time2 THEN
TPWrite part2 + " быстрее работает ";
ELSE
TPWrite part1 + " and " + part2 + "
равносильно";
ENDIF
14
ENDPROC

Пример 2: если требуется более 60 секунд на


обработку изделия, выведите сообщение. Если
булева переменная full_speed – ЛОЖЬ, то сообщение
скажет оператору увеличить скорость робота. Если
full_speed – ПРАВДА, то сообщение попросит
оператора выяснить причину медленной работы.

VAR num time := 62.3;


VAR bool full_speed := TRUE;
PROC main()
IF time > 60 THEN
IF full_speed THEN
TPWrite "Выясни причину медленной
работы ";
ELSE
TPWrite " Увеличь скорость робота ";
ENDIF
ENDIF
ENDPROC

Цикл FOR.
Другой способ контроля потока программы –
это повторять код программы несколько раз.
Рассмотрим на примере программы, которая
повторит написание слова «Привет» 5 раз:
FOR i FROM 1 TO 5 DO
TPWrite "Привет";
15
ENDFOR
Синтаксис FOR следующий:
FOR счетчик цикла FROM начальное значение
TO конечное значение DO
Программный код для повторения
ENDFOR
Счетчик не должен быть объявлен, но
считается числовой переменной внутри цикла FOR.
В первый раз выполнения кода значение счетчика
определяется начальным значением. И каждый раз
при выполнении кода значение счетчика
увеличивается на 1. В последний раз код
выполняется, когда счетчик равен конечному
значению. После этого выполняется код после
ENDFOR.
Счетчик может быть использован внутри
цикла FOR. Например, вычислим сумму чисел от 1
до 50 используя следующую программу.
VAR num sum := 0;
FOR i FROM 1 TO 50 DO
sum := sum + i;
ENDFOR
В ходе цикла FOR счетчику цикла не
присваивается значение.

Цикл WHILE.
С циклом WHILE программа будет повторять
код до тех пор, пока условие не станет правдивым.
Цикл имеет следующий синтаксис:
16
WHILE условие DO
Программный код для повторения
ENDWHILE
Если условие сразу же ложное, то код
выполнится ни разу.
Если условие правдиво, то код будет
выполняться пока условие не перестанет быть
правдивым.
Следующий код будет прибавлять числа, пока
сумма не достигнет 100.

VAR num sum := 0;


VAR num i := 0;
WHILE sum <= 100 DO
i := i + 1;
sum := sum + i;
ENDWHILE

Будьте осторожны: если условие никогда не


станет ложным, то цикл будет выполнятся
бесконечно и потребует больших затрат от
компьютера. Бывают случаи, когда такой цикл
требуется, но тогда добавьте инструкций для
ожидания, которые позволят осуществить другие
задачи.
Циклы с большим объемом вычислений и
записью на пульт FlexPendant, без инструкций
движения, могут потребовать инструкций ожидания,
даже если число циклом лимитировано.
17
WHILE TRUE DO
! Some code
...
! Wait instruction that waits for 1 second
WaitTime 1;
ENDWHILE
Отметим, что инструкции движения
воспринимаются как инструкции ожидания, если
выполнение программы не продолжается, пока робот
не достигнет пункта назначения.

1.5 СИНТАКСИС

В данном пункте расскажем о правилах


синтаксиса RAPID при программировании.
- В конце каждой строки кода ставится точка с
запятой (;). Примеры:
Объявление переменных:
VAR num length;
Присвоение значений:
area := length * width;
Большинство инструкций:
MoveL p10,v1000,fine,tool0;
Исключения: некоторые инструкции не
заканчиваются точкой запятой. Вместо этого
имеются ключевые слова, указывающие на это.
Примеры:
Ключевое Завершающее
слово инструкции ключевое слово
18
IF ENDIF

FOR ENDFOR

WHILE ENDWHILE

PROC ENDPROC
- Комментарии, начинающиеся с восклицательного
знака (!), не воспринимаются контроллером робота.
Используйте свободно в коде. Пример:
! Вычисление площади прямоугольника
area := length * width;
- В RAPID рекомендуется все зарезервированные
слова (VAR, PROC) писать с заглавной буквы.
- Для удобного восприятия код находящийся между
PROC и ENDPROC необходимо делать с отступами.
Когда программируете с помощью FlexPendant,
отступы реализуются автоматически. Пример:

VAR bool repeat;


VAR num times;
PROC main()
repeat := TRUE;
times := 3;
IF repeat THEN
FOR i FROM 1 TO times DO
TPWrite "Hello!";
ENDFOR
19
ENDIF
END PROC

Заметьте, что проще увидеть, где цикл IF начинается


и заканчивается. Если есть несколько позиций IF и
нет отступов, то сложно будет понять какой ENDIF
относится к какому IF.

2. ФУНКЦИОНИРОВАНИЕ РОБОТОВ С RAPID


2.1 ИНСТРУКЦИИ ДВИЖЕНИЯ

Преимущество языка RAPID заключается в


том, что он специально разработан для управления
роботом. Наиболее важно, что в нем заложены
инструкции для движения робота.
Простая инструкция движения может
выглядеть следующим образом:
MoveL p10, v1000, fine, tool0;
где:
- MoveL – это инструкция для следования
робота по прямой линии от данной позиции до
обозначенной;
- p10 – обозначает позицию, к которой будет
двигаться робот;
- v1000 – указывает скорость движения
(миллиметры в секунду);
- fine – определяет, что робот направляется
именно к указанной точке без срезания углов по
пути;
20
- tool0 – показывает, что установленный
инструмент в качестве рабочего органа должен
двигаться в указанную позицию.
Разберемся подробнее в синтаксисе
инструкции MoveL:
MoveL В_точку Скорость Зона Инструмент;
В_точку: точка назначения определяется
постоянной типа данных robtarget. Когда
программирование происходит с помощью пульта
FlexPendant, можно присвоить значение robtarget,
указав роботу, куда следует переместиться.
Программируя иначе, может быть сложно вычислить
координаты точки назначения.
robtarget будет подробно рассмотрена далее.
На данный момент, примем, что позиция 𝑥 =
600, 𝑦 = −100, 𝑧 = 800 может быть объявлена и
присвоена следующим образом:
CONST robtarget p10 := [ [600, -100, 800], [1, 0,
0, 0], [0, 0, 0, 0], [ 9E9, 9E9, 9E9, 9E9, 9E9, 9E9] ];
Скорость: скорость движения определяется
постоянной типа данных speeddata. Есть несколько
базовых предустановленных значений: v5 (5 мм/с),
v100 (100 мм/с), v1000 (1000 мм/с), vmax
(максимальная скорость робота). Полный список
предустановленных значений speeddata можно найти
в технической документации. Используя
предустановленные значения, их не нужно
объявлять и присваивать.

21
Зона: определяет угловую зону постоянной
типа данных zonedata. Есть много
предустановленных значения, такие как: fine – робот
движется прямо к указанной точке; z10 – робот по
пути может срезать углы, когда до точки остается
меньше 10 мм; z50 – робот по пути может срезать
углы, когда до точки остается меньше 50 мм.
Полный список предустановленных значений
zonedata так же можно найти в технической
документации. Как и со скоростью, используя
предустановленные значения, их не нужно
объявлять и присваивать.
Результатом следующей инструкции RAPID
будет путь, показанный ниже:
MoveL p10, v1000, z50, tool0;
MoveL p20, v1000, fine, tool0;

Инструмент: определяем, какой инструмент


используется роботом, глобальной переменной типа

22
данных tooldata. Если робот оборудован сварочным
пистолетом, пульверизатором с клеем или ручкой, то
мы хотим запрограммировать точку назначения для
данного рабочего органа. Это произойдет
автоматически, если tooldata объявлена, присвоена и
используется в инструкции MoveL. tool0 –
предустановленный инструмент, обозначающий
робота без установленного на нем какого-либо
инструмента, и который не должен быть объявлен
или присвоен. Иной инструмент должен быть
объявлен и присвоен до начала использования.
Позиция, к которой, согласно инструкциям,
происходит движение, определена как координаты в
системе координат. Если система координат не
определена, заданная позиция относиться к базовой
системе координат робота, находящаяся в основании
робота (см. схему ниже). Другая система координат
может быть определена и использована
инструкциями движения. Какая система координат
для движения будет использована, определяется с
помощью опционального аргумента \WObj:
MoveL p10, v1000, z50, tool0 \WObj:=wobj1;
Для большей информации, как определять
систему координат, можно ознакомиться с
технической документацией.
Примеры использования MoveL.
1) Робот держит ручку (в качестве рабочего
органа) над бумагой на столе. Требуется опустить
кончик ручки на бумагу, и затем нарисовать квадрат.
23
Программа:

PERS tooldata tPen := [ TRUE, [[200, 0, 30], [1,


0, 0 ,0]], [0.8, [62, 0, 17], [1, 0, 0, 0], 0, 0, 0]];
CONST robtarget p10 := [ [600, -100, 800],
[0.707170, 0, 0.707170, 0], [0, 0, 0, 0], [ 9E9, 9E9, 9E9,
9E9, 9E9, 9E9] ];
CONST robtarget p20 := [ [600, 100, 800],
[0.707170, 0, 0.707170, 0], [0, 0, 0, 0], [ 9E9, 9E9, 9E9,
9E9, 9E9, 9E9] ];
CONST robtarget p30 := [ [800, 100, 800],
[0.707170, 0, 0.707170, 0], [0, 0, 0, 0], [ 9E9, 9E9, 9E9,
9E9, 9E9, 9E9] ];
CONST robtarget p40 := [ [800, -100, 800],
[0.707170, 0, 0.707170, 0], [0, 0, 0, 0], [ 9E9, 9E9, 9E9,
9E9, 9E9, 9E9] ];

PROC main()
MoveL p10, v200, fine, tPen;

24
MoveL p20, v200, fine, tPen;
MoveL p30, v200, fine, tPen;
MoveL p40, v200, fine, tPen;
MoveL p10, v200, fine, tPen;
ENDPROC

2) Нарисуем похожую фигуру, как в


предыдущем примере, но скруглим угловые зоны
около точки р20 на 20 мм и около точки р40 на 50
мм.
VAR tooldata tPen := ...
...
VAR robtarget p40 := ...

PROC main()
MoveL p10, v200, fine, tPen;
MoveL p20, v200, z20, tPen;
MoveL p30, v200, fine, tPen;
MoveL p40, v200, z50, tPen;
MoveL p10, v200, fine, tPen;
ENDPROC

Следующие инструкции движения – MoveL,


MoveJ и MoveC.
MoveJ (move joint – движение сустава)
используется, когда от робота требуется быстро
переместиться от одной точки к другой и движение
не обязательно должно быть по прямой линии.
Используйте MoveJ, чтобы рабочий орган робота
25
завис в воздухе близко к месту, около которого
будет работать. Инструкция MoveL не сработает,
например, если база робота будет между текущей
позицией рабочего органа и запрограммированной
позицией назначения, или если переориентация
инструмента слишком сложна и огромна. MoveJ
оптимально подходит в этих ситуациях.
Синтаксис MoveJ аналогичен MoveL:
MoveJ p10, v1000, fine, tPen;
MoveС ( move circle – движение по кругу)
используется для движения робота циркулярно по
дуге:
MoveL p10, v500, fine, tPen;
MoveC p20, p30, v500, fine, tPen;
MoveL p40, v500, fine, tPen;

26
Оглавление
1. ОСНОВЫ ЯЗЫКА RAPID................................ 8
1.1 ПЕРЕМЕННЫЕ......................................... 8
1.2 ПОСТОЯННЫЕ ...................................... 10
1.3 ОПЕРАТОРЫ .......................................... 11
1.4 УСЛОВИЕ И ЦИКЛЫ............................ 12
1.5 СИНТАКСИС.......................................... 18
2. ФУНКЦИОНИРОВАНИЕ РОБОТОВ С
RAPID ................................................................... 20
2.1 ИНСТРУКЦИИ ДВИЖЕНИЯ................... 20

27
Учебно-методическое издание

Неклюдов Алексей Николаевич


Мишин Алексей Владимирович
Сорокин Павел Алексеевич

ПРОГРАММИРОВАНИЕ РОБОТОВ НА
ЯЗЫКЕ RAPID

ЧАСТЬ 1

Учебно-методическое пособие

Формат 60x84 1/16 Тираж 100 экз. Изд. № 100-18

Москва, Копировальный центр PrintSide

28

Вам также может понравиться