Главная страница
Навигация по странице:

  • «МИРЭА – Российский технологический университет» РТУ МИРЭА __________________________________________________________

  • ОТЧЁТ по лабораторной работе №2

  • ЛАБОРАТОРНАЯ РАБОТА № 1

  • Таблица 1. Параметры асинхронного двигателя.

  • Таблица 2. Параметры функционального блока двигателя.

  • Таблица 3. Состояния ворот.

  • Таблица 4. Структура функционального блока управления воротами.

  • Таблица 5. Структура функционального блока управления воротами.

  • Таблица 6. Мэпинг переменных для частотного преобразователя.

  • Таблица 7. Мэпинг переменных для датчиков положения

  • Таблица 8. Мэппинг переменных для индикаторов

  • Приложение ( листинг кода )

  • Программное обеспечение системы управления мехатронного модуля управления защитной дверью. 2 лаба. мирэа Российский технологический университет рту мирэа институт искусственного интеллекта Кафедра проблем управления


    Скачать 2.72 Mb.
    Названиемирэа Российский технологический университет рту мирэа институт искусственного интеллекта Кафедра проблем управления
    АнкорПрограммное обеспечение системы управления мехатронного модуля управления защитной дверью
    Дата23.03.2023
    Размер2.72 Mb.
    Формат файлаdocx
    Имя файла2 лаба.docx
    ТипЛабораторная работа
    #1011287



    МИНОБРНАУКИ РОССИИ

    Федеральное государственное бюджетное образовательное

    учреждение высшего образования

    «МИРЭА – Российский технологический университет»

    РТУ МИРЭА

    __________________________________________________________

    Институт искусственного интеллекта

    Кафедра проблем управления

    ОТЧЁТ

    по лабораторной работе №2

    «Программное обеспечение системы управления мехатронного модуля управления защитной дверью»

    Студенты группы

    КРБО – 03 – 19




    Руководитель работы

    Морозов А.А.

    Работа представлена на проверку

    «__» _____2022г.

    ___________________




    Москва, 2022г.


    ЛАБОРАТОРНАЯ РАБОТА № 1

    «Отладка программного обеспечения роботехнических систем с использованием виртуального моделирования»

    Цель работы

    Получение навыков построения программного обеспечения промышленных систем управления на базе функциональных блоков и конечных автоматов.


    Задание

    Разработать программное обеспечение системы автоматического управления приводом защитной двери. Схема механизма представлена на рисунке 1. Дверь оснащена асинхронным двигателем и четырьмя датчиками положения ( ), которые реагируют на пластину, обозначенную крестиком. Открытие и закрытие двери управляется тумблером.

    При включении системы управления дверь должна двигаться в заданную сторону на небольшой скорости для определения своего местоположения. В этом режиме необходимо, чтобы индикаторы мерцали с частотой 1 Гц. После чего происходит переход в рабочий режим.

    В рабочем режиме обеспечить максимально возможную скорость движения на отрезке , небольшую скорость на отрезках и (для обеспечения безопасности движения). Индикаторы должны показывать местоположение двери.

    Система управления ворот должна быть выполнена в виде функционального блока, предполагающего повторное использование.






    рисунок 1 – Устройство защитной двери

    Выполнение начинается с открытия заархивированного проекта исходной конфигурации, хранящийся в директории “C:\projects\Blank lab\POMRS_2”, распаковав его в папку группы, находящуюся в “C:\projects”. Далее необходимо открыть визуальную конфигурацию оборудования и добавить к имеющимся модуль частотного преобразователя “8I64xxxxxxx.00x-1”, соединив его шиной с основной установкой (рис. 2).



    рисунок 2 – Конфигурация оборудования

    Реализация проекта в виде функциональных блоков используется для повышения удобства работы с созданным программным обеспечением в дальнейшем, чтобы была возможность использовать нынешние наработки в других программах.

    Зададим необходимые параметры для асинхронного двигателя (табл. 1). Они также указаны на самом двигателе или документации к нему.

    Для этого необходимо в меню в меню Physical View выбрать частотный преобразователь и в контекстном меню выбрать пункт «Configuration». Результат настройки двигателя показан на рисунке 3.

    Таблица 1. Параметры асинхронного двигателя.

    Наименование параметра

    Название в конфигурационной таблице [eng.]

    Заданное значение

    Номинальное питающее напряжение двигателя [B]

    UNS Rated Motor volt [V]

    220

    Номинальная питающая частота [0.1 Гц]

    FRS Rated motor freq [0.1 Hz]

    500

    Сопротивление статора [мОм]

    RSC Cold Stator resist [mOhm]

    33000

    Коэффициент мощности

    COS Motor 1 Cosinus Phi [0.01]

    64

    Номинальная скорость вращения двигателя [об/мин]

    NSP Rated motor speed [rpm]

    890

    Номинальный ток [0.1 А]

    NCR Rated motor current [0.1 А]

    10



    рисунок 3 – Конфигурация асинхронного двигателя через частотный преобразователь

    Завершив настройку частотного преобразователя, приступаем к созданию необходимых объектов в проекте, а именно:

    1. ANSI C Program;

    2. ANSI C Library « DriveLib».

    В библиотеке «DriveLib» создать функциональные блоки (рис. 4):

    «DriveStateMashine» – заготовка функционального блока управления частотным преобразователем. Структура ФБ должна иметь следующий набор переменных, указанный в таблице 2.

    «DoorStateMashine» - функциональный блок, в котором будет реализована основная логика программы – задание направления вращения и скорости движения воротами в зависимости от их положения и требуемого направления вращения. Для упрощения описания состояний ворот необходимо создать новый тип данных (см. приложение): перечисление «DoorStates». Сами состояния, которые необходимо добавить приведены в таблице 3, а их связь представлена в функциональной схеме (рис. 5-6).



    рисунок 4 - функциональные блоки и их переменные



    рисунок 5 - инициализация переменных функциональных блоков

    Таблица 2. Параметры функционального блока двигателя.

    Конфигурация

    Имя

    Тип данных

    Описание

    вход

    state

    UINT

    Состояние частотного преобразователя

    вход

    enable

    BOOL

    Сигнал работы функционального блока

    выход

    command

    UINT

    Команда, подаваемая на частотный преобразователь

    выход

    speed

    INT

    Заданная скорость



    Рисунок 6. Блок-схема состояний ворот и возможных переходов между ними.

    Таблица 3. Состояния ворот.

    Состояние

    Описание

    ST_INIT

    Инициализация параметров и ожидание включения частотного преобразователя

    ST_UNKNOWN

    Ворота в неизвестном положении

    ST_OPEN

    Ворота открыты

    ST_CLOSE

    Ворота закрыты

    ST_ACC_POS

    Ускорение ворот в сторону открытия

    ST_ACC_NEG

    Ускорение ворот в сторону закрытия

    ST_POS

    Движение к открытию

    ST_NEG

    Движение к закрытию

    ST_DEC_POS

    Замедление ворот в сторону открытия

    ST_DEC_NEG

    Замедление ворот в сторону закрытия

    Теперь, имея новый необходимый тип данных, заполним структуру функционального блока (результат представлен на рисунке 4):

    Таблица 4. Структура функционального блока управления воротами.

    Конфигурация

    Имя

    Тип данных

    Описание

    вход

    state

    UINT

    Состояние частотного преобразователя

    вход

    sw1

    BOOL

    Сигнал концевого выключателя 1

    вход

    sw2

    BOOL

    Сигнал концевого выключателя 2

    вход

    sw3

    BOOL

    Сигнал концевого выключателя 3

    вход

    sw4

    BOOL

    Сигнал концевого выключателя 4

    вход

    direction

    BOOL

    Команда, подаваемая на частотный преобразователь

    выход

    speed

    INT

    Заданная скорость

    «LedStateMashine» – машина состояний обработки светодиодных индикаторов.

    Структура ФБ должна иметь следующий набор переменных:

    Таблица 5. Структура функционального блока управления воротами.

    Конфигурация

    Имя

    Тип данных

    Описание

    вход

    state

    UINT

    Состояние частотного преобразователя

    выход

    led1

    BOOL

    Сигнал работы функционального блока

    выход

    led2

    BOOL

    Сигнал работы функционального блока

    выход

    led3

    BOOL

    Сигнал работы функционального блока

    выход

    led4

    BOOL

    Сигнал работы функционального блока

    выход

    timer

    INT

    Заданная скорость

    Для совмещения работы аппаратной и программной частей, следует произвести мэпинг переменных (рис.7-9).

    Таблица 6. Мэпинг переменных для частотного преобразователя.

    Наименование

    Переменная

    Описание

    ETAD_Input

    stateMachine.state

    Текущее состояние частотного преобразователя

    CMDD_Output

    stateMachine.command

    Команды на управление

    LFRD_Output

    stateMachine.speed

    Заданное значение скорости



    Рисунок 7. Мэппинг переменных частотного преобразователя

    Таблица 7. Мэпинг переменных для датчиков положения

    Имя канала

    Используемая переменная

    DigitalInput01

    doorSM.direction

    DigitalInput02

    doorSM.s0

    DigitalInput03

    doorSM.s1

    DigitalInput04

    doorSM.s2

    DigitalInput05

    doorSM.s3



    Рисунок 8. Мэппинг переменных датчиков положения

    Для мэпинга индикаторов для модуля X20DO9322 (DO - Digital Output), соответствия каналов соответственно будут:

    Таблица 8. Мэппинг переменных для индикаторов

    Имя канала

    Используемая переменная

    DigitalOutput02

    ledSM.s0

    DigitalOutput03

    ledSM.s1

    DigitalOutput04

    ledSM.s2

    DigitalOutput05

    ledSM.s3



    Рисунок 9. Мэппинг индикаторов

    Далее готовим программу к запуску программу (рис. 10-15)



    Рисунок 10. Организация управления частотным преобраователем



    Рисунок 11. Состояния двери



    Рисунок 12. Блок-схема управления частотным преобразователем.



    Рисунок 13. Подготовка к запуску.



    Рисунок 14. Результат запуска программы в AutomationStudio



    Рисунок 15. Результат запуска программы на стенде

    Приложение (листинг кода)

    //DriveStatemachine

    #include

    #ifdef __cplusplus

    Extern “C”

    {

    #endif

    #include “DriveLib.h”

    #ifdef __cplusplus

    };

    #endif

    void DriveStateMachine(struct DriveStateMachine* inst)

    {

    UINT mask = inst->state & 0x6f;

    if(!inst->enable)

    {

    inst->command = CMD_SHUTDOWN;

    }

    else

    {

    switch(mask)

    {

    case STATE_DISABLED:

    inst->command = CMD_SGUTDOWN;

    break;

    case STATE_READY:

    inst->command = CMD_ENABLED;

    break;

    case STATE_SWITCHED_ON:

    inst->command = CMD_ SWITCHED_ON;

    break;

    }

    }

    }

    //DoorStateMachine

    #include

    #ifdef __cplusplus

    extern "C"

    {

    #endif

    #include "DriveLib.h"

    #ifdef __cplusplus

    };

    #endif

    /* TODO: Add your comment here */

    void DoorStateMachine(struct DoorStateMachine* inst)

    {

    /*TODO: Add your code here*/

    switch(inst->state)

    {

    case ST_INIT:

    {

    if(inst->sw1==0 && inst->sw2==0 && inst->sw3==0 && inst->sw4==0)

    inst->state=ST_UNKNOWN;

    break;

    }

    case ST_UNKNOWN:

    {

    if(inst->direction==0 && inst->sw4==0)

    inst->state=ST_OPEN;

    if(inst->direction==0 && inst->sw3==0 && inst->sw4!=0)

    inst->state=ST_DEC_POS;

    if(inst->direction==0 && inst->sw2==0 && inst->sw3!=0)

    inst->state=ST_POS;

    if(inst->direction==0 && inst->sw1==0 && inst->sw2!=0)

    inst->state=ST_ACC_POS;

    if(inst->direction==1 && inst->sw1==1)

    inst->state=ST_CLOSE;

    if(inst->direction==1 && inst->sw2==1 && inst->sw1!=1)

    inst->state=ST_DEC_NEG;

    if(inst->direction==1 && inst->sw3==1 && inst->sw2!=1)

    inst->state=ST_NEG;

    if(inst->direction==1 && inst->sw4==1 && inst->sw3!=1)

    inst->state=ST_ACC_NEG;

    break;

    }

    case ST_CLOSE:

    {

    inst->speed = 0;

    if(inst->direction==0)

    inst->state=ST_ACC_POS;

    break;

    }

    case ST_ACC_NEG:

    {

    inst->speed = -200;

    if(inst->direction==1 && inst->sw3==1)

    inst->state=ST_NEG;

    if(inst->direction==0)

    inst->state=ST_DEC_POS;

    break;

    }

    case ST_NEG:

    {

    inst->speed = -600;

    if(inst->direction==1 && inst->sw2==1)

    inst->state=ST_DEC_NEG;

    if(inst->direction==0)

    inst->state=ST_POS;

    break;

    }

    case ST_DEC_NEG:

    {

    inst->speed = -200;

    if(inst->direction==1 && inst->sw1==1)

    inst->state=ST_CLOSE;

    if(inst->direction==0)

    inst->state=ST_ACC_POS;

    break;

    }

    //LedStateMachine

    #include

    #ifdef __cplusplus

    extern "C"

    {

    #endif

    #include "DriveLib.h"

    #ifdef __cplusplus

    };

    #endif

    void LedStateMachine(struct LedStateMachine* inst)

    {

    switch(inst->state)

    {

    case ST_INIT:

    {

    break;

    }

    case ST_UNKNOWN;

    {

    if(inst->timer%5==4)

    {

    inst->led1=!inst->led1;

    inst->led2=!inst->led2;

    inst->led3=!inst->led3;

    inst->led4=!inst->led4;

    }

    break;

    }

    //Cyclic

    #include

    #ifdef _DEFAULT_INCLUDES

    #include

    #endif

    void _CYCLIC ProgramCyclic(void)

    {

    DoorStateMachine(&doorSM);

    driveSM.speed = doorSM.speed;

    DriveStateMachine(&driveSM);

    ledSM.state = doorSM.state;

    LedStateMachine(&ledSM);

    }

    //Init

    #include

    #ifdef _DEFAULT_INCLUDES

    #include

    #endif

    void _INIT ProgramInit(void)

    {

    driveSM.enable=1;

    }

    //Exit

    #include

    #ifdef _DEFAULT_INCLUDES

    #include

    #endif

    void _EXIT ProgramExit(void)

    {

    }


    написать администратору сайта