Блог
Анатолия Борисова

Как повысить свою долю в экспорте программного
обеспечения из России до 1 000 000 рублей в год?

Подарок

для каждого подписавшегося
на нашу рассылку

Интерпретатор для устройства с числовым программным управлением. Часть 1.

ВВЕДЕНИЕ

Сложно ли создать свой интерпретатор? Сразу возникает столько вопросов. Хотя бы что это такое - интерпретатор? Для простоты будем считать что это программа. Работает она следующим образом и рассмотрим это на простом бытовом примере, а именно замене перегоревшей лампочки. Действия по замене лампы накаливания:

  1. Обесточить люстру;
  2. Вывернуть лампу против часовой стрелки из патрона;
  3. Проверить ее мощность указанную на колбе;
  4. Подобрать замену;
  5. Ввернуть лампу по часовой стрелке в патрон;
  6. Включить люстру.

Когда Вы меняете первый раз в своей жизни лампочку по этой простой инструкции Вы выполняете ее интерпретацию. Делаете все медленно и обстоятельно. Это будет происходить потом каждый раз, просто вы уже буде знать ее наизусть и делать все неосознанно и быстро. Что же такое интерпретация? Вы читаете первую инструкцию (Обесточить люстру). Далее анализируете ее, выбираете из памяти понятия-образы "обесточить" и "люста". Решаете какие действия для это нужно сделать. Выполняете эти действия - щелкаете выключателем. Вот как все просто, Вы проинтерпретировали первую инструкцию.

АНАЛИЗ ПРОБЛЕМЫ

Поскольку интерпретаторы вообще и особенно для абстрактных языков мало интересны для практических целей, нужно найти реальную проблему. С такой проблемой я и столкнулся - вышедший из строя станок с ЧПУ 2С42-65. Так как это УЧПУ (устройство с числовым программным управлением) оказалось старше меня, то единственный способ оживить станок - это замена УЧПУ. Было принято решение разработать свое устройство ЧПУ для металлообрабатывающего станка. При выполнении этой задачи были сформулированы следующие требования:

  1. В основе УЧПУ должна быть вычислительная платформа совместимая с архитектурой х86 фирмы Intel;
  2. Возможность объединения всех станков в локальную сеть;
  3. Обмен информации выполняется по промышленным стандартным интерфейсам (RS-422, RS-485) и протоколам (MODBUS);
  4. Повышение точности обработки за счет диагностических алгоритмов коррекции движения рабочего органа;
  5. Взаимодействие с CAD/CAM-системами (AutoCAD, Компас) посредством импорта данных через стандартизованный форматы (Gerber);
  6. Требования к кодированию информации управляющих программ (УП), изложенные в ГОСТ 20099-83 /1/ и документации на УЧПУ 2С42-65 /2/.

АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ

На рисунке 1.1 представлен круг вопросов решаемых при модернизации станков с числовым программным управлением и место  проекта в нем. Как видно он довольно обширный и требует системного подхода.

Модернизация станка с ЧПУ

Рисунок 1.1 - Модернизация станка с ЧПУ

Интерпретатор является подсистемой программного обеспечения(ПО) УЧПУ, поэтому рассмотрим подробнее ее составляющие. В состав ПО УЧПУ будут входить следующие модули:

  1. Оболочка. Обеспечивает взаимодействие с оператором станка посредством графического интерфейса. Координирует работу остальных модулей ПО УЧПУ. Часть функций оболочки связанных с управлением транслятором реализованы в тестовой программе модуля транслятора;
  2. Интерпретатор. Обеспечивает формирование команд для модуля управления движением путем анализа УП. Формирует различные сообщений связанных с процессом трансляции. Сообщения отображаются оболочкой. Транслятор наиболее универсальная часть ПО УЧПУ, так как он работает со стандартизованными входными данными и имеет четко определенный программный интерфейс. Эти свойства позволяют встраивать его в другие подобные системы;
  3. Модуль управления движением, управляет электроникой и электромеханикой станка;
  4. Модуль диагностики станка. Выполняет контроль исправности аппаратных средств, сохранности системного ПО, контроль над правильным протеканием процесса управления с целью предотвращения аварий в системе и брака.

Входными данными интерпретатора является управляющая программа (УП). УП состоит из кадров, которые в свою очередь состоят из слов. Слово состоит из символа адреса (латинская прописная буква), математического знака «+» или «-» (при необходимости), последовательности цифр. Язык не чувствителен к регистру символов и не содержит символов-разделителей (отделяющих один идентификатор от другого) кроме конца кадра (перевод строки).

Значительную часть языка составляют подготовительные и вспомогательные функции  (коды Gxx и Mxx соответственно), их назначение изложен в /1/, часть положений в данном ГОСТе отмеченных как «не определено» приводятся ниже в соответствии с /2/, в таблице 1.1.

Таблица 1.1 – Особенности использования адресов в УЧПУ 2С42-65

ФункцияАдресСмысл
Номер программы О Номер программы от 1 до 99
Номер инструмента Т Номер инструмента от 0 до 99
Номер смещения инструмента Н, D Номер инструмента от 0 до 99
Пауза Е Задание паузы от 0,1 до 6553,5 сек
Номер подпрограммы Р Задание номера подпрограммы от 1 до 99
Число повторений L Число повторений подпрограммы, постоянно цикла
На рисунке 1.2 представлена упрощенная модель транслятора /3/.

Модель типового интерпретатора

Рисунок 1.2 - Модель типового интерпретатора

Назначение блоков:

  1. Таблицы. Хранят набор лексем, статическую и динамическую информацию, связанную с ними. Таблица символов транслятора должна обеспечивать доступ к своим элементам за минимальное время, хэш-таблица обеспечивает доступ к любому элементу за одинаковое время, то есть от количества элементов это время не увеличивается, как, например, в случае с бинарным деревом;
  2. Лексический блок. Выполняет проверку на соответствие УП алфавиту языка, выделяет лексемы и выполняет их поиск в таблице символов;
  3. Синтаксический анализатор. Переводит последовательность лексем, построенную лексическим блоком, в другую последовательность, которая непосредственно отражает порядок, в котором, по замыслу программиста, должны выполняться операции в программе, язык УП довольно простой и поэтому не требует синтаксического анализа;
  4. Генератор кода. Формирует управляющие команды для модуля управления движением.

Таким образом, необходимо разработать только три блока:

  1. Таблица символов;
  2. Лексический блок;
  3. Генератор кода.

ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ АНАЛИЗ И ПРОЕКТИРОВАНИЕ

Для проектирования применен язык UML, как наиболее подходящий для визуализации, спецификации, конструирования и документирования объектно-ориентированных систем. Язык UML используется для создания диаграмм отражающих систему с различных точек зрения. Было выбрано три вида диаграмм, так как точки зрения и аспекты, охватываемые остальными диаграммами тривиальны.

Диаграмма вариантов представляет статический аспект с точки зрения прецедентов (рисунок 1.3) и является основой для дальнейшего проектирования.

Диаграмма вариантов использования

Рисунок 1.3 -Диаграмма вариантов использования

Описание вариантов использования.

«Выполнить поиск». Оболочка передает транслятору не более 5 символов. Обычно вначале выполняется поиск номера программы, далее начало программы или главный кадр, или номер кадра.

«Установить режим». Обобщает следующие варианты задания режима выполнение программы:

  1. «Автоматический».
  2. «Полуавтоматический».
  3. «Ручной».

«Выполнить пуск». Старт выполнения программы в установленном режиме:

  1. Автоматический, старт программы с ее начала;
  2. Полуавтоматический, старт программы со следующего кадра;
  3. Ручной, старт выполнения введенного кадра;

«Выполнить программу». Выполнение программы в соответствии с установленным режимом.
«Остановить программу». Остановка автоматической работы УЧПУ, состояние координат остается согласно последнему кадру, происходит возврат УЧПУ (не станка!) в исходное состояние. Остановка программы возможна, только если она выполняется (на это указывает связь с ролью «extend» - расширяет).
«Команда модулю движения». Формирование команды для модуля управления движения.
«Выдать сообщение». Обобщает следующие варианты:

  1. «Ошибка трансляции» - неизвестный символ (отсутствует в алфавите языка) или неправильное кодирование, например вызов подпрограммы, является не последним словом в кадре.
  2. «Информационное сообщение» - сообщения о ходе выполнения программы.
  3. «Сообщение программы» - текстовое сообщение, запрограммированное в УП.

Диаграмма классов транслятора представляет статический аспект с точки зрения проектирования (рисунок 1.4), она позволила сгенерировать класс с объявлениями его методов и атрибутов, структуры данных и связи между ними непосредственно на языке С++.

Диаграмма классов

Рисунок 1.4 -Диаграмма классов

Главным процессом модуля является интерпретация. Поэтому была выделена сущность – интерпретатор. Остальные сущности являются данными и включены посредством различных связей в интерпретатор. Деление интерпретатора на другие сущности со своими операциями не было выполнено из-за соображений производительности. Описание связей:

  1. FInterpreter – hash_map<string, _TableData> (1:1) - направленная связь агрегации с шаблоном hash_map, роль А называется NameTable;
  2. FInterpreter – _Command (1:1) - направленная связь агрегации с структурой, содержащей данные команды модуля управления движением;
  3. FInterpreter - _Mode (1:1) - направленная связь агрегации с перечислением, описывающего режимы работы транслятора;
  4. FInterpreter - _State (1:1) - направленная связь агрегации с перечислением, описывающего состояния конечного автомата лексического анализатора.

Шаблон hash_map выполняет функции таблицы символов и хранит пары ключ (строка) – значение (структура _TableData). Значения отображены направленной связью агрегации один ко многим.
Структура _TableData содержит данные о лексеме и содержит шаблон stack (направленная связь агрегации, роль А называется VarTable).
Шаблон stack используется при вызове подпрограмм.

Диаграмма последовательности для варианта использования «Пуск» представляет динамический аспект с точки зрения проектирования (рисунок 1.5).

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

Рисунок 1.5 - Диаграмма последовательности

После создания объекта класса FInterpreter в его конструкторе выполняется настройка таблицы символов с помощью метода InitNameTable(). Далее выполняется установка режима отработки программы – вызов метода SetCurrentMode(_Mode). В установленном режиме происходит старт выполнения программы – метод Start(). Этот метод выполняет лексический анализ УП на основе информации хранящейся в таблице символов. Выделения лексем программы ищутся в таблице методом find(string). Метод find возвращает итератор – NameTableIter, через который изменяется или извлекается информация по найденной лексеме. Большинству лексем назначен конкретный метод класса FInterpreter, например лексеме М02 соответствует метод afM02().


1 ГОСТ 20999-83 Устройства числового программного управления для металлообрабатывающего оборудования. Кодирование информации управляющих программ. – М.: Издательство стандартов, 1983.
2 Программное обеспечение УЧПУ 2С42-65. УК80031.
3 Ф. Льюис, Д. Розенкранц, Р. Стирз. Теоретические основы проектирования компиляторов. Пер. с англ. – М.: «Мир», 1979.

4 ответов

  1. Вася
    Программирование стал изучать совсем недавно и на текущий момент все вышеописанные процессы являются для меня сложными, разобраться до конца в них не получилось. Но для тех, кто занимается программированием уже не в первый год, это вещи элементарные и я считаю что реализовать все описанное выше не должно представлять никаких сложностей.
    • Да уж,программирование это вещь,если понимаешь,всегда будешь на коне.
  2. Соня
    Я еще раз убедилась в том, что программирование это не мое.. тут так все запутано, хотя по идее должно быть просто и легко.. И все таки не зря я не пошла учиться на программиста. Из меня ничего хорошего бы не получилось и я просто потеряла бы время. Так что пусть такие сложные вещи как эта делают те, кому это дано от природы.
    • Зря вы так говорите Соня,все равно чему нибудь научили бы. А потом и опыт получили бы.

Оставить комментарий