Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 13:25

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 10:53 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
Есть системы с довольно сложным поведением.

Скажем есть система где

1. пользователь нажимает на кнопку ОТКРЫТЬ
2. Мотор №1 начинает двигаться - открывается крышка - мотор останавливается достигнув концевого выключателя №1.
3. Мотор №2 начинает двигаться - выезжает экран - мотор останавливается достигнув концевого выключателя №2.

4. пользователь нажимает на кнопку ЗАКРЫТЬ
5. Мотор №2 начинает двигаться - экран заезжает обратно - мотор останавливается достигнув концевого выключателя №3.
6. Мотор №1 начинает двигаться - закрывается крышка - мотор останавливается достигнув концевого выключателя №4.

Естественно на любом участке пути пользователь может применять команды СТОП, ОТКРЫТЬ, ЗАКРЫТЬ и логика отрабатывает команды в соответствии с положением моторов.
То есть если нажать на кнопку ОТКРЫТЬ при закрытой крышке - начнет двигаться Мотор №1. А если нажать на кнопку ОТКРЫТЬ в середине пути - начнет двигаться Мотор №2.
И отслеживаются все положения - скажем Мотор №2 не может начать движение пока крышка полностю не открыта (концевик №1 нажат)

До сих пор я этот сценарий жестко кодировал в микроконтроллере и все было хорошо.
Сейчас есть требование сделать эти сценарии движения програмируемые. (Пользователь загружает скрипт.)
У меня в принципе есть проект где пользователь по UART заливает скрипт я его обрабатываю и произвожу действия. Но там простой PLC - по входным условиям
(значениям на аналоговых и дигитальных входах) я выставляю значения на выходах.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 12:13 
Старожил
Аватара пользователя

Зарегистрирован: 03 дек 2012, 10:42
Сообщения: 438
Еще проверку состояний где крышка и экран не описали. У Вас всё расписано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 12:49 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
DIZEL писал(а):
Еще проверку состояний где крышка и экран не описали. У Вас всё расписано.

Это частный случай. Завтра может быть другая система. Без крышки. Другое движение. Мотор 2 первый начинает движение. Останавливается по другому условию. Единственно что не меняется - это моторы в системе. А паттерны движения и взаимодействия между ними могут меняться - задаваться пользовательским скриптом.
Нужен общий алгоритм.

Есть такая система.
Выезжает короб. Из него выезжает экран. Экран поворачивается вправо влево.
Иногда вместо концевиков я останавливаюсь по положению энкодера или по току. Но это уже частности.


Вложения:
screen1.png
screen1.png [ 12.59 Кб | Просмотров: 1439 ]
screen.png
screen.png [ 21.78 Кб | Просмотров: 1439 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 12:53 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4913
Откуда: Усинск, республика Коми
jenya77 писал(а):
Нужен общий алгоритм.

Сам же написал в первом сообщении этот самый общий алгоритм...

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 13:00 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4913
Откуда: Усинск, республика Коми
Есть 2 действия:
1. Открыть
2. Закрыть
Если нажимаешь кнопку "Открыть" выполняется действие 1, если кнопку "закрыть" - действие 2.
Есть еще кнопка "стоп", но она просто останавливает процесс. На перечень действий она не влияет и не стоит акцентировать на нее внимание.
Опишите алгоритм для открытия, для закрытия. По кнопке "стоп" отключайте оба двигателя.
Примерно так
Открытие
1. Крышка открыта? Если да - Конец
2. Если крышка не открыта - вращать двигатель до открытия крышки
3. Переход к п.1
4. Конец

Закрытие
1. Крышка закрыта? Если да - Конец
2. Если крышка не закрыта - вращать двигатель до закрытия крышки
3. Переход к п.1
4. Конец

Стоп
1. Отключить питание со всех двигателей

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 13:17 
Старожил

Зарегистрирован: 23 мар 2017, 14:45
Сообщения: 5786
Если пользователю предлагается загружать скрипт, нужно сначала договориться, на каком языке будет этот скрипт.
Когда язык выбран, Вам придется написать для МК интерпретатор этого языка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 13:45 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
Кот495 писал(а):
Если пользователю предлагается загружать скрипт, нужно сначала договориться, на каком языке будет этот скрипт.
Когда язык выбран, Вам придется написать для МК интерпретатор этого языка.

Мой вопрос был не про скрипт и не про интерпретатор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 14:05 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3937
Откуда: КЧР, поселок Нижний Архыз
jenya77 писал(а):
В данном случае никак не соображу какую структуру создать под сценарий движения и как учитывать все логические условия.

По сути сценарий и должен быть структурой конечного автомата, и без простого скриптового языка здесь все-таки не обойтись. Причем, если между состояниями автомата возможны произвольные переходы, получится вообще что-то вроде бейсика:
Код:
loop
  btn1 goto 10
  btn2 goto 20
endloop
10 move m1 until sw1
11 move m2 until sw2
12 return
20 move m2 until sw3
21 move m1 until sw4
22 return

А то и вообще Lua придется запиливать…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 14:12 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
Eddy_Em писал(а):
jenya77 писал(а):
В данном случае никак не соображу какую структуру создать под сценарий движения и как учитывать все логические условия.

По сути сценарий и должен быть структурой конечного автомата, и без простого скриптового языка здесь все-таки не обойтись. Причем, если между состояниями автомата возможны произвольные переходы, получится вообще что-то вроде бейсика:
Код:
loop
  btn1 goto 10
  btn2 goto 20
endloop
10 move m1 until sw1
11 move m2 until sw2
12 return
20 move m2 until sw3
21 move m1 until sw4
22 return

А то и вообще Lua придется запиливать…

Это уже ближе к телу, как говорил Моппасан, но все же это частный случай. Скажем until sw1 - это в данном случае, как и move m1. А вдругом случае условие поменяется.
То есть должно быть что то вроде
1. Смотрим какая команда пришла
2. По команде смотрим какое действие к ней пришпандорено (указатель на ф-цию?)
3. Идем в действие - какой мотор должен двигаться и в какую сторону.
4. Проверяем следующее действие - другой мотор начинает движение или нет
Ну это так в общем, каша в голове. А в коде это выразиться в структуре и в алгоритме проверки этой структуры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 15:35 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
Слово "IEC 61131-3" еще не прозвучало? Можно взять кого-нибудь из них и реализовать некое подобие.

Но я бы предложил кардинально другой подход: основная прошивка - это исполняющая среда и библиотека. "Скрипт" пользователя - это программа на Си, использующая эту библиотеку. Компилируем локально, отправляем на МК, там вызываем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 15:35 
Старожил
Аватара пользователя

Зарегистрирован: 03 дек 2012, 10:42
Сообщения: 438
Сессия давно закончилась, вроде лето пришло. Вам надо программу написать или зачем Вы собой народ мучаете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 15:42 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3937
Откуда: КЧР, поселок Нижний Архыз
dev писал(а):
Компилируем локально, отправляем на МК, там вызываем.

Можно бутлоадер запилить, который будет, скажем, с флешки считывать код, записывать к себе во флеш и запускать.
Но ТС, похоже, хочет как можно проще реализовать сторону пользователя. Чуть ли не ПЛК свою запилить...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 15:44 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6157
Что-то я не вижу здесь проблемы. От слова совсем.
Элемент скрипта = действие. Список описанных действий:
1. Мотор №1 двигается до концевого выключателя №1 (->)
2. Мотор №2 двигается до концевого выключателя №2 (->)
3. Мотор №2 двигается до концевого выключателя №3 (<-)
4. Мотор №1 двигается до концевого выключателя №4 (<-)
В скрипте следует прописать, по команде
ОТКРЫТЬ: п1, п2
ЗАКРЫТЬ: п3, п4
Если последовала команда СТОП, то интерпретатор останавливается.
В любой момент можно нажать любую кнопку, она вызовет прерывание текущей операции и начнет свою.
В "примере" нет "кольцевых" команд, поэтому скрипту вообще перпендикулярно текущее состояние механики.
Если кото не понял, расшифрую - "Мотор №1 двигается до концевого выключателя №1" означает, что мотор будет двигаться до тех пор, пока не сработает концевик. Если на начало команды мотор уже находился в сработавшем концевике, то он начнет движение и сразу остановится, т.к. состояние достигнуто.
Короче говоря, Никаких проблем нет. Но они появятся, если в скрипте появятся "кольца".
Например, надо обойти препятствие. Для этого надо вначале идти вверх, затем вправо, затем вниз. Обратное движение будет зеркальным - вверх, слево, вниз. Если движение прервано в неизвестной точке, то выполнение скрипта ... будет выполнено нормально. Довольно трудно придумать то, что-бы не работало. )) Взаимно симметричные команды буду выполняться правильно, вне зависимости от места их прерывания (в том числе и при отрубании питания системы и кидания механики в неизвестное состояние).
Когда же будет проблема? А тогда, когда появятся НЕ симметричные команды. Например - открыть, выдвинуть, вдвинуть, закрыть.
Их последовательное выполнение не вызывает проблем (никогда), но если пропустить или передвинуть одну из команд, то выйдет хрень. Пропустили "вдвинуть", получили режим закрытия с выдвинутой face. Face прищемили.
Здесь выходов два - или по команде STOP делать UNDO (обратное выполнение скрипта до начала операции) или ставить концевики и (или) заводить состояние механики (current state). Вот это точно "хрень".
Короче - делайте нормальные симметричные скрипты. Тогда всё просто и надежно. ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 16:43 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
u37 писал(а):
Что-то я не вижу здесь проблемы. От слова совсем.
Элемент скрипта = действие. Список описанных действий:
1. Мотор №1 двигается до концевого выключателя №1 (->)
2. Мотор №2 двигается до концевого выключателя №2 (->)
3. Мотор №2 двигается до концевого выключателя №3 (<-)
4. Мотор №1 двигается до концевого выключателя №4 (<-)
В скрипте следует прописать, по команде
ОТКРЫТЬ: п1, п2
ЗАКРЫТЬ: п3, п4
Если последовала команда СТОП, то интерпретатор останавливается.
В любой момент можно нажать любую кнопку, она вызовет прерывание текущей операции и начнет свою.
В "примере" нет "кольцевых" команд, поэтому скрипту вообще перпендикулярно текущее состояние механики.
Если кото не понял, расшифрую - "Мотор №1 двигается до концевого выключателя №1" означает, что мотор будет двигаться до тех пор, пока не сработает концевик. Если на начало команды мотор уже находился в сработавшем концевике, то он начнет движение и сразу остановится, т.к. состояние достигнуто.
Короче говоря, Никаких проблем нет. Но они появятся, если в скрипте появятся "кольца".
Например, надо обойти препятствие. Для этого надо вначале идти вверх, затем вправо, затем вниз. Обратное движение будет зеркальным - вверх, слево, вниз. Если движение прервано в неизвестной точке, то выполнение скрипта ... будет выполнено нормально. Довольно трудно придумать то, что-бы не работало. )) Взаимно симметричные команды буду выполняться правильно, вне зависимости от места их прерывания (в том числе и при отрубании питания системы и кидания механики в неизвестное состояние).
Когда же будет проблема? А тогда, когда появятся НЕ симметричные команды. Например - открыть, выдвинуть, вдвинуть, закрыть.
Их последовательное выполнение не вызывает проблем (никогда), но если пропустить или передвинуть одну из команд, то выйдет хрень. Пропустили "вдвинуть", получили режим закрытия с выдвинутой face. Face прищемили.
Здесь выходов два - или по команде STOP делать UNDO (обратное выполнение скрипта до начала операции) или ставить концевики и (или) заводить состояние механики (current state). Вот это точно "хрень".
Короче - делайте нормальные симметричные скрипты. Тогда всё просто и надежно. ))


Что внутри? Какие члены структуры?
typedef struct PARSED_SCRIPT_S
{
}PARSED_SCRIPT;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:40 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 629
Откуда: GMT+6
jenya77
u37 предложил простой вариант, разбить файл на 2 секции, в одной кодируем действия, в другой - список действий для кнопки. Какие Вам ещё члены структуры?
Код:
[Секция действий]
[ID][Условие завершения][Действие1][Действие2][Действиеn]
[Секция кнопок]
[Кнопка][ID1][ID2][IDn]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:42 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 677
yacc Вам в помощ. Генерит лексические анализаторы в зависимости от ваших условий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:46 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3287
jenya77 писал(а):
Что внутри? Какие члены структуры?
typedef struct PARSED_SCRIPT_S{
}PARSED_SCRIPT;

массив из опкодов виртуальной машины.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:52 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
Kelvin писал(а):
jenya77
u37 предложил простой вариант, разбить файл на 2 секции, в одной кодируем действия, в другой - список действий для кнопки. Какие Вам ещё члены структуры?
Код:
[Секция действий]
[ID][Условие завершения][Действие1][Действие2][Действиеn]
[Секция кнопок]
[Кнопка][ID1][ID2][IDn]

ну да...что то вроде того...ну это и есть члены структуры - [ID][Условие завершения][Действие1][Действие2][Действиеn]. это ведь мне передал пользователь в скрипте. мне ведь это хранить где то надо. осталось оформить это как то програмно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:54 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
_pv писал(а):
jenya77 писал(а):
Что внутри? Какие члены структуры?
typedef struct PARSED_SCRIPT_S{
}PARSED_SCRIPT;

массив из опкодов виртуальной машины.

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


зачем? я положил все это один раз - ну хоть сюда [ID][Условие завершения][Действие1][Действие2][Действиеn] и работаю с этим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:57 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 383
Откуда: дальнее надмосковье
Цитата:
До сих пор я этот сценарий жестко кодировал в микроконтроллере и все было хорошо.
Сейчас есть требование сделать эти сценарии движения програмируемые. (Пользователь загружает скрипт.)


Прикрутить простенький скритовый движок, Lua или упрощенный JS. Их много, и хороших тоже.

https://github.com/cesanta/mjs
https://github.com/elua/elua


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 17:58 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 677
К стате, где вы собираетесь хранить ваш скрипт ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 18:14 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
arm999 писал(а):
Цитата:
До сих пор я этот сценарий жестко кодировал в микроконтроллере и все было хорошо.
Сейчас есть требование сделать эти сценарии движения програмируемые. (Пользователь загружает скрипт.)


Прикрутить простенький скритовый движок, Lua или упрощенный JS. Их много, и хороших тоже.

https://github.com/cesanta/mjs
https://github.com/elua/elua

Да но скрипт не решает проблему алгоритмики в самом контролере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 18:20 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
ребята я вас понял. вы предлагаете скриптовый движок а я думаю это через чур. по простому передали параметры через терминал и алгоритм работает с этими параметрами. что там уж такого сложного. и потом нет готового движка под motion. все равно нужно перекраивать под себя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 18:29 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6157
Рука лицо.
Видеокарты когда-нибудь видели? В них есть "BIOS", который инициализирует и настраивает аппаратуру этой видеокарты. Если вы думаете, что BIOS пишется на языке С, С++ или похожих, то смею вас рассстроить. Программа BIOS написана на языке виртуального процессора. Т.е. файл BIOS состоит из 3х элементов - загрузчика, интерпретатора (виртуального процессора) и, собственно, самого "кода".
Я к чему ... "интерпретатор" - это стандартное решение для выполнения подобных задач. В него вводятся правила и проверки, и он им следует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Програмно задать поведение двигателей в С.
СообщениеДобавлено: 17 июл 2017, 18:37 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
u37 писал(а):
Рука лицо.
Видеокарты когда-нибудь видели? В них есть "BIOS", который инициализирует и настраивает аппаратуру этой видеокарты. Если вы думаете, что BIOS пишется на языке С, С++ или похожих, то смею вас рассстроить. Программа BIOS написана на языке виртуального процессора. Т.е. файл BIOS состоит из 3х элементов - загрузчика, интерпретатора (виртуального процессора) и, собственно, самого "кода".
Я к чему ... "интерпретатор" - это стандартное решение для выполнения подобных задач. В него вводятся правила и проверки, и он им следует.

это материал для новой темы - как прикрутить скриптовый движок к контроллеру. но я ее не создам. получу море теории в котором захлебнусь. а мне нужно практическое решение.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB