Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

Концепция mini-PLC: обсуждение деталей
(1 чел.) (1) гость
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: Концепция mini-PLC: обсуждение деталей

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #1

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
Думаю над тем, как реализовать максимально просто и в то же время гибко задуманные возможности по программированию ПЛК. Пока вырисовывается такой подход:
1. Как следует из общей концепции, функциональная блок-схема работы ПЛК строится из функций, у которых может быть переменное число параметров. Поэтому каждая функция строится так, что получает на входе указатель на структуру, в котрой указано фактическое число параметров и содержится массив с параметрами. То есть все функции имеют одинаковый интерфейс типа
calc_type function(parameter_t *ptr);
, где calc_type - тип данных для всех расчетов (по идее float), а parameter_t - это та самая структура.
2. Так как все функции имеют одинаковый интерфейс, мы можем создать массив из этих функций, и при составлении "программы ПЛК" оперировать уже индексами этого массива для указания конкретной функции.
3. Вся программа (надо придумать термин, чтобы отличать программу МК от программы, вводимой в ПЛК на "FBD-подобном языке ПЛК") оперирует следующими категориями данных:
3.1 результат функции
3.2 константа числовая
3.3 значение входного порта
3.4 значение выходного порта
3.5 значение псевдо-констант или псевдо-функций
4. Создаем описание типов данных для программы в виде структуры типа
typedef struct{
  char data_type_id;
  union{
    calc_type number; // числовая константа
    char in_port; // номер входного порта
    char out_port; // номер выходного порта
    char psevdofunc; // номер псевдо-переменной, псевдо-функции и т.п.
    char function_id; // номер функции
    // и т.д., если нужно
  } data_value;
} plc_data_t

5. Таким образом, вся программа ПЛК представляет собой последовательность записей такого вида:
<приемник><источник>, где
   приемник - номер выходного порта или переменной;
   источник - список следующего вида:
      <data_value>[кол-во параметров][список параметров], где
         data_value - это вышеупомянутая структура;
         кол-во параметров - количество параметров от 0 до 8, 
                             причем ненулевое кол-во приемлемо только для функций;
         список параметров - это укзанное количество записей типа [i]источник[/i]. 
                             то есть вот такая [u]рекурсивная запись[/u]

зато все логично и достаточно четко: имеем указатель на начало очередной строки "программы", считываем код приемника результата, затем считываем код источника, если это НЕ функция - просто помещаем нужное значение в нужную переменную, а если это функция - рекурсивно начинаем разбирать остаток строки.

По моим расчетам глубина рекурсии получится до 8 погружений, что вполне терпимо для ОЗУ любой AVR-меги.

Что скажет коллектив по этому поводу?
я не ленивый, я энергосберегающий...
Последнее редактирование: 6 года, 6 мес. назад от admin.
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #2

  • shsvv
  • Вне сайта
  • Разработчик проекта
  • Постов: 10
  • Репутация: 0
Считаю надо пробовать, имхо что-то Си подобное получается. Скажите какой тип МК и на какие ноги подцеплять индикатор, буду подготавливать макетную плату.
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #3

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
я думал, мы вместе будем решать, что и как куда подключать... ну, хотя бы обсудить варианты.
лично я пока думаю, что atmega32 будет вполне достаточно. 1 порт на входы (PORTA, т.к. на нем и АЦП сидит), 1 порт на выходы. Оставшиеся 2 порта - на дисплей, кнопки и т.п.

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

P.S. Cи-подобное - ну так я думаю, что будем работать с WinAVR, так что Си обязательно...
я не ленивый, я энергосберегающий...
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #4

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
Перечитывал пейджер, упс... Datasheet на 32-ю мегу и подумалось:
8 входов и 8 выходов - не многовато? С точки зрения концентрации кол-ва датчиков и исполнительных устройств?.
Как вариант порт А - все порты могут быть как входом (аналоговый, ттл, 1-wire), так и выходом (ттл, шим): определяется программой ПЛК.
INT0 и INT1 только асинхронные входы - для фиксирования очень коротких событий (задел на всякий случай)
OC1A и OC1B - только выходы, для аппаратного ШИМ
Ножки USART пока не трогаем - оставим на развитие (вдруг сеть решим построить ).
Тогда от порта D остались "рожки да ножки" - PD6,PD7.
В остатке порты В,С - свободны, можно для индикатора использовать, правда жалко терять аппаратный TWI (самый раз для часов на M41T81)
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #5

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
не понял, что подразумевалось под концентрацией? мне тут наоборот, твердят, что 8 входов - это очень мало... дескать, надо или больше, или предусматривать интерфейс расширения... но мешать между собой входы и выходы в единое пространство "контактов ПЛК" я бы не стал...

так как предполагается обязательное использование внешней микросхемы RTC, то под нее стоит выделить TWI, а заодно и под расширение - если приспичит в перспективе... а на счет мгновенной реакции - а она нужна? как ее программировать пользователю? для обычных "процессов" - формулы, а для этих дел? пока не вырисовывается...
я не ленивый, я энергосберегающий...
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #6

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
8 входов мало....
Я когда "прикидывал" простенькую системку (системка пока только в голове - одни наброски) мониторинга для дачи (а-ля охрана и пожаробезопасность), то пришел к выводу, что собрать в пучок провода от более чем 8 датчиков - уже многовато. В случае большого кол-ва входов/выходов целесообразнее именно платы расширения подключаемые в сеть типа 485.

мгновенная реакция - задел на всякий случай.. Программировать также, только понимая что например при поступлении короткой 1 на инт0 переменная останется 1 пока не будет сброшена пользователем.
Сигнал зарегистрируется системой мгновенно, а обработается в порядке общей очереди.
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #7

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
ну, в принципе, можно и так... типа триггерный вход. тогда лучше смотреть в сторону atmega168 или чего-то похожего - у которой есть Pin Change Interrupt на тех же линиях, что и АЦП. тогда все неплохо укладывается...

по поводу пучка - мы же делаем ПЛК типа "конструктор", то есть к базовой схеме можно будет добавлять всякие дополнительные блоки, например, концевые выключатели от какого-нибудь пресса или автомата... был случай: делал схему управления прессом для металлолома... там было кажется 3 гидроцилиндра (6 релейных выходов - в обе стороны), 6 концевиков и 3 кнопки управления... получается - уже дефицит входов, хотя пресс довольно примитивный... давайте пока ориентироваться на 8 или, как вы предложили - на 16 "смешанных" - а там будет видно...
я не ленивый, я энергосберегающий...
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #8

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
"atmega168 или чего-то похожего - у которой есть Pin Change Interrupt на тех же линиях"
Они в силу аппаратных особенностей не ловят импульсы короче чем такт.
Двух обычных внешних прерываний хватит "за глаза" - не так часто есть необходимость поймать такой импульс (большинству пользователей и не понадобится). Можно даже одно прерывание оставить.

Индикатору (классическому винстаровскому) много ног требуется, вот "жаба" и давит...
Тогда предлагаю сразу "закрепить" некоторые выводы - и в дальнейшем стараться не менять их функционал.
INT0,INT1 - асинхронный вход (если ножек будет нехватать - исключим INT1).
TXD,RXD - сеть (mPLCnet )
OC1A и OC1B - только выходы, для аппаратного ШИМ (Голосуем!)
PD6,PD7 - шина 1-wire (формирователь шины на полевиках, на 2-х выводах StrongPullUP получится?)
SDA,SCL - как есть TWI
Последнее редактирование: 6 года, 6 мес. назад от md5sum.
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #9

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
Еще вопрос:
Я, во всех своих устройствах, на МК мега8 и старше стараюсь включить bootloader (usbasploader) для дальнейшего апдейта без помощи программатора.
Этот функционал будем использовать? ("Съест" еще 2 ноги)
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #10

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
  1. мне кажется, bootloader можно предусмотреть, но на перспективу. хвататься сразу за все - не закончить никогда
  2. USART предлагаю пока зарезервировать, но не для сети, а для интерфейса с компьютером - думаю, "с годами" сделаем и какую-то IDE для взаимодействия с ПЛК... а пока что можно выводить какие-то логи в консоль. например... в "концепции" я на перспективу предусмотрел такой вариант...
  3. Аппаратный ШИМ я думал использовать в качестве "нестандартных аналоговых выходов", т.е. если уж и голосовать, то я ЗА в "концепции" на этот счет нет противоречий
  4. На счет 1-wire: вы невнимательно читали "концепцию". я предусматриваю, что любой вход может быть настроен на режим 1-wire, но предлагаю использовать только для интерфейса с DS18x20, как наиболее популярными. т.е. мы будем иметь возможность подключать до 8 датчиков! а все прочие 1-wire-девайсы я пока не вижу смысла поддерживать...
  5. Входы INTx так же не ловят фронты, причем дод 1 такта им далеко - по-моему, аж целых 4 нужно... так что особой разницы не вижу.
я не ленивый, я энергосберегающий...
Последнее редактирование: 6 года, 6 мес. назад от ARV.
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #11

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
1. bootloader - отдельный, готовый проект, никак программно не связанный с PLC. Вопрос в том - отводить под него дополнительные выводы или нет. В случае с V-USB это желательно INT0 и любой из порта D.

2. За! при отладке очень понадобится.
3. Без комментариев
4. Концепцию читал Теперь вроде понял и идею... уникальный номер 1-wire не используем, а адресуем DS18x20 по порту (в противном случае пусть они ВСЕ на одной шине висят).
5. Значит у меня очередные затыки с английским - Выкидываем...
Тема заблокирована.

Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #12

  • ARV
  • Вне сайта
  • Администратор
  • Постов: 573
  • Репутация: 22
с V-USB я никогда дел не имел, поэтому и мнения не имею. если вы возьмете на себя "курирование" этого направления - с моей стороны возражений не будет. хотя чисто по реализации мне больше по душе традиционный USART-bootloader, тем более как бы уже решено, что он будет задейтсвован для консоли...

тему я переименую, т.к. она уже отходит от рассуждений о программе, и превращается в обсуждение всей концепции...

и у меня очередной вопрос: для 1-wire необходимы внешние подтяжки 4,7К, для цифровых входов они мешать не будут, а вот для аналоговых - будут. была мысль повесить эти подтяжки на свободные 8 портов, чтобы подключать их по мере необходимости. как считаете, стоит или не стоит? можно один регистр 74HC595 для этого поставить - копейки делов...
я не ленивый, я энергосберегающий...
Тема заблокирована.

Re: Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #13

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
традиционный USART-bootloader - тоже не сталкивался... что порекомендуете? Попробую объединить с USBASP.
"курирование" bootloader-а готов взять на себя. Опыт есть... Можно даже 1-wire bootloader По 1-wire, как ни странно, мега32 прошивается на порядок быстрее чем "Громовым", и это с учетом crc16.

Про пожтяжку забыл... Либо городить что-то аппаратно, действительно регистр, либо все таки делать шину и подумать как дать пользователю опознать какой датчик у него где установлен. В случае с шиной можно активную подтяжку сделать для 2-х проводной схемы подключения (на каждый порт по активной подтяжке - это уже слишком)
Так-же, при любой схеме (шина или 8 портов), дополнительно к подтяжке необходима защита от короткого между DQ и Vdd (на датчике их так легко коротнуть - и нет порта). Это еще как минимум резистор.
Тема заблокирована.

Re: Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #14

  • shsvv
  • Вне сайта
  • Разработчик проекта
  • Постов: 10
  • Репутация: 0
1-wire bootloader интересно ещё нигде не сталкивался, по поводу 74НС595 считаю это необходимым - ведь на один порт можно повесить все необходимые входы и выходы (логические конечно), также какая-никакая защита от экстремальных внешних воздействий, и ещё в концепции говорилось о подключении PS/2 клавиатуры, ещё резервируем две ноги + видимо нужно собирать отдельный тактовый генератор от которого будет тактироваться МК и клавиатура.
Считаю также нужным подумать о подключении jtag на первых он видимо будет нужен.
Вчера ради интереса накидал пробный проект в С на Mega32 + LCD + PS/2 размер почти 3Kb, при такой тенденции начинаю потихоньку посматривать на Mega64
И ещё SPI микросхемы и/или SD -карты подключатся будут?
Последнее редактирование: 6 года, 6 мес. назад от shsvv.
Тема заблокирована.

Re: Концепция mini-PLC: обсуждение деталей 6 года, 6 мес. назад #15

  • md5sum
  • Вне сайта
  • Разработчик проекта
  • Постов: 36
  • Репутация: 1
"начинаю потихоньку посматривать на Mega64"
Правильно...вдруг кто захочет собрать девайс - а мы ему контроллер в 64TQFP или QFN/MLF only
Mega1280 в 100TQFP - самое то будет, для домашней сборки...
Тема заблокирована.
  • Страница:
  • 1
  • 2
  • 3
Время создания страницы: 0.17 секунд