|
мини PLC. |
|
|
|
Jan 27 2016, 08:11
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини Programmable Logic Controller. для примера код Код // условие на входе If (temp > 30 && hum > 80 || input1 ==1) { // условие на выходе output2 = 1; } Где temp, hum - глобальные переменные но задаваемые пользователем через теринал. пользователь програмирует такое условие следующим образом. Код task 1 param 1 temp > 30 AND task 1 param 2 hum > 80 OR task 1 in 1 1 task 1 out 2 1 или так Код task 1 param 1 temp > 30 task 1 param 2 hum > 80 task 1 in 1 1 task 1 param 1 AND param 2 OR in 1 task 1 out 2 1 и я это сохраняю и потом проверяю и если условие выполняется - включаю\выключаю нужные выходы. вопрос есть ли какие то готовые библиотеки а-ля-PLC?
Сообщение отредактировал Jenya7 - Jan 27 2016, 08:18
|
|
|
|
|
 |
Ответов
(75 - 84)
|
Jan 28 2016, 12:41
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(syoma @ Jan 28 2016, 14:06)  adnega, неужели в наше время, микропроцессорные ресурсы такие ценные, что пришлось так извращаться? Конечно, нет. Просто я привык к таблицам истинности и для меня на порядок проще набросать ее, нежели городить пятиэтажные логические формулы. Кста, иногда решаю обратную задачу - по таблице истинности написать и упростить логическое выражение. И самая ирония в том, что затем рисую в схемном редакторе схему, соответствующую этой логической формуле на стандартных элементах, а компилятор "упихивает" ее в LUT внутри ПЛИС )) Вдогонку добавлю, что LUT замечен даже в gcc. Делал машину состояний для энкодера на Си в лоб. Переделал в LUT. Посмотрел листинги и (прошу прощения) офигел - gcc сотворил одинаковый LUT в обоих случаях.
|
|
|
|
|
Jan 28 2016, 20:41
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(adnega @ Jan 28 2016, 20:04)  Из значений переменных собираем индекс: n = (param1 << 4) + (param2 << 3) + (input1 << 2) + (input 2 << 1) + (input3 << 0); Затем получаем результат: ((0xFEF0EE00) >> n) & 1 Т.е. для вычисления (param1 && input1) || (param2 && (input2 || input3)) нам достаточно знать одно волшебное 32-битное число 0xFEF0EE00. А теперь немножко расширим подход. Запланируем "таблицу" в 256 значений, соответственно, "волшебное число" будет состоять не из 4-битных полей, а из 8-битных, т.е из байт. "Bолшебное число" не будем ограничивать размерами, а запишем в байтовый массив произвольной длины. А в самой таблице будем держать адреса функций, которые будут выполняться, когда в массиве встретится соответствующий байт. В результате мы получим заготовку для простейшей Форт-машины, а байтовый массив будет содержать то, что называется "программой из байт-кодов". Для того, чтобы окончательно оформить Форт-машину, сначала зададимся вопросом; а как функции, вызываемые по своим байт-кодам, будут обмениваться информацией друг с другом? И придем к выводу, что проще всего использовать стек, откуда функции будут брать исходные данные для вычислений, и куда они будут класть результаты. Затем задумаемся, а хорошо ли, что наши программы выполняются линейно, в порядке расположения байт-кодов в массиве? Нехорошо, надо бы предусмотреть возможность изменения порядка выполнения байт-кодов при помощи самих байт-кодов. Заведем байт-коды для условной и безусловной передачи управления в произвольное место программы, а также вызовы подпрограмм, состоящих из байт-кодов, и возврата из подпрограмм. Для хранения адресов возврата заведем еще один стек, назовем его "стек возвратов". Вот теперь мы получили вполне функциональную Форт-машину. Для того, чтобы она была полной по Тьюрингу, достаточно задать всего пару десятков байт-кодов. То есть, на такой машине можно выполнить любые вычисления, хоть искусственный интеллект создать. Окончательно эта Форт-машина превратится в настоящий Форт после того, как (при помощи программ, написанных в байт-кодах) будет добавлен ввод-вывод, написан транслятор из исходного текста (или клавиатурного ввода) в байт-код, добавлены средства для организации и вызова программ в виде словарей.
|
|
|
|
|
Jan 28 2016, 22:46
|
Знающий
   
Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861

|
Цитата(=AK= @ Jan 29 2016, 02:27)  Ну да. Жаль, автор давно забросил этот проект.  Был бы он в нормальной форме, то задача создания встроенного интерпретатора решалась бы за 5 минут. А так его полдня чистить и править надо, прежде чем заработает, скажем, под CodeBlocks. Всегда есть надежда и вероятность вернуться к "допиливанию" заброшенных (или отложенных для продвижения будущих целей) авторских идей. (на том же sourceforge) В тематике Форт их достаточно много, даже при "отсутствии" Форт программистов, как одной из движущих сил IT сообщества.  P.S. На sourceforge мне был интересен из Форт с С в связке F-- проект.
Сообщение отредактировал Kopa - Jan 28 2016, 22:59
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|