PDA

Просмотр полной версии : Прошу помощи в программировании логической функции



Ballentrajs
10.09.2015, 23:06
Здравствуйте, уважаемые форумчане. Кому не лень, помогите решить задачку. Был у меня один автомат, собранный на Ардуино и обвязке - оптроны по входам, реле на выходах. Три входа, два выхода. Выполнял он такую функцию

Х1..Х2..Х3...Y1..Y2
0....0....0.....0...0
0....0....1.....1...0
0....1....0.....1...0
1....0....0.....1...0
0....1....1.....0...1
1....0....1.....0...1
1....1....0.....0...1
1....1....1.....1...1


Тут на днях эта конструкция погорела из-за броска по питанию, да и на стороннее обслуживание это нужно отдать. Контроллер для самоделок, как то не комильфо, да ещё с навесным монтажём обвязки. Самое недорогое решение, я думаю, программируемое реле. Но я голову сломал, исполняя это на логике. Помогите в решении, пожалуйста. Кто-то заодно пооттачивает мастерство:)

rovki
10.09.2015, 23:13
Самое простое использовать макрос ППЗУ ,записать в него эти значения (в свойствах) 0,2,2,2,1,1,1,3

melky
10.09.2015, 23:17
Еще был макрос Bool, тоже выполняет подобную функцию.
упс, на нем один выход только, так что ошибся.

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

rovki
10.09.2015, 23:26
Вот нашел 5минут перед сном :rolleyes:на 3 макросах готовых ...

melky
10.09.2015, 23:48
rovki а у AI! все гораздо лаконичнее получилось, правда требует небольшого расчета :)

rovki
10.09.2015, 23:48
Или на элементах

rovki
10.09.2015, 23:49
rovki а у AI! все гораздо лаконичнее получилось, правда требует небольшого расчета :)
Что именно

Ballentrajs
10.09.2015, 23:52
Я наверное выберу вариант на элементах. Так мне будет проще, залил и забыл. Только в схеме участвует 4-й вход. ?

melky
10.09.2015, 23:52
rovki возможность включать выход в различных комбинациях входов.

Стек сравните из примера на макросе AI! и на 3-х макросах вашего первого примера.

rovki
10.09.2015, 23:54
Там у вас в табличке ошибка во входах (4,5 строчка) ,но это не страшно ,поменяйте в ППзу число и все ....

rovki
10.09.2015, 23:55
rovki возможность включать выход в различных комбинациях входов.

Стек сравните из примера на макросе AI! и на 3-х макросах вашего первого примера.
Какой пример ,их тыщя дайте ссылку .зачем забивать новичку голову стеком ....

melky
10.09.2015, 23:56
rovki пример добавил в пост №3.

rovki
10.09.2015, 23:59
Я наверное выберу вариант на элементах. Так мне будет проще, залил и забыл. Только в схеме участвует 4-й вход. ?
Так любой проект залил и забыл....Зато если нужно будет поменять комбинации ,заменил числа в ППзу и все ,а с элементами нужно всю схему переделывать ,что не сложно если владеешь темой..

Ballentrajs
11.09.2015, 00:04
Уважаемые Специалисты, есть ли в ваших постах файл, который я загружу в п.реле, и оно заработает как мне нужно? Я не специалист в этой тематике, и многие ваши фразы, звучат для меня, как заклинания :)

AAA1
11.09.2015, 00:16
Или на элементах

Не правильно работает, относительно первого поста, а в вариантах с макросами как-то через чур наварочено, но это сугубо моё мнение :)
Тоже предложу вариант19899

Ballentrajs
11.09.2015, 00:25
Так, для примера, как это реализованно в ардуине:

const int inputPinA = 3;
const int inputPinB = 4;
const int inputPinC = 5;
const int outputPinA = 6;
const int outputPinB = 7;

void setup() {
digitalWrite(outputPinA, OUTPUT);
digitalWrite(outputPinB, OUTPUT);
digitalWrite(inputPinA, INPUT);
digitalWrite(inputPinB, INPUT);
digitalWrite(inputPinC, INPUT);
}

void loop() {
int A = digitalRead(inputPinA);
int B = digitalRead(inputPinB);
int C = digitalRead(inputPinC);

if (A + B + C == 1) {
digitalWrite(outputPinA, HIGH);
digitalWrite(outputPinB, LOW);
} else if (A + B + C == 2) {
digitalWrite(outputPinA, LOW);
digitalWrite(outputPinB, HIGH);
} else if (A + B + C == 3) {
digitalWrite(outputPinA, HIGH);
digitalWrite(outputPinB, HIGH);
} else {
digitalWrite(outputPinA, LOW);
digitalWrite(outputPinB, LOW);
}
}

Ballentrajs
11.09.2015, 00:32
ААА1, а можно пример в виде файла? Сегодня закажу п.реле и попробую все варианты.

Василий Кашуба
11.09.2015, 09:33
ААА1, а можно пример в виде файла? Сегодня закажу п.реле и попробую все варианты.
Все варианты не нужно пробовать, вам же залить и забыть. Возьмите пример от ААА1 он самый простой, его просто скопировать даже с картинки. Найдите в библиотеке такие же функции и сложите, как пазл по готовой картинке.

Ballentrajs
11.09.2015, 10:50
Спасибо всем за участие. Позвольте я напомню о себе, когда буду эту железяку программировать. Наверняка у меня появятся вопросы.

Eugene.A
11.09.2015, 11:23
19902
Ещё вариант.
Овен лоджик у меня не установлен, извиняюсь, поэтому в CS.

Ryzhij
11.09.2015, 11:29
19902
Ещё вариант.
Овен лоджик у меня не установлен, извиняюсь, поэтому в CS.Порядок исполнения надо "подрихтовать" чтобы гонок было меньше.

melky
11.09.2015, 11:30
ИМХО, когда стоит узкая задача, можно нарисовать и логикой, когда задача видоизменяется (например надо изменить комбинации включения по входам), лучше применять макросы.
Выбор макросов имеется.

AI! когда-то и написал макрос Bool по моей просьбе, так как с таким элементом столкнулся в Zelio Logic и он оказался очень удобным инструментом, когда выходом надо управлять комбинаторно.

Eugene.A
11.09.2015, 11:49
Порядок исполнения надо "подрихтовать" чтобы гонок было меньше.

Если перебивать в Овен лоджик, то там уже и делать всё путём. Главное - работает. Специально использовал минимум разных ФБ (ИЛИ-НЕ, NOT).
Есть теорема, доказывающая, что логическую функцию любой сложности можно построить на любом логическом элементе, например, алгебраическом сложении или умножении, и отрицании. Т.е. Элемента 2И-НЕ достаточно, чтобы спроектировать, например, процессор. Или контроллер.
Кстати, такой порядок выстроился именно после упорядочивания.

Ryzhij
11.09.2015, 13:59
Есть теорема, доказывающая, что логическую функцию любой сложности можно построить на любом логическом элементе,Не на любом, а либо только на 2ИЛИ-НЕ (стрелка Пирса), либо только на 2И-НЕ (штрих Шеффера).
Это теорема (критерий) Поста (https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D1%82%D0%B5%D1%80%D0%B8%D0%B9_% D0%9F%D0%BE%D1%81%D1%82%D0%B0).

Eugene.A
11.09.2015, 14:22
Не на любом, а либо только на 2ИЛИ-НЕ (стрелка Пирса), либо только на 2И-НЕ (штрих Шеффера).

А на 3ИЛИ-НЕ, 4ИЛИ-НЕ, 5ИЛИ-НЕ?

Ryzhij
11.09.2015, 14:32
А просто на одних "НЕ"?
На одних просто "И"?
На одних просто "ИЛИ" ?
;)
Стрелка Пирса или штрих Шеффера - элементарные частицы из которых можно собрать всё, что угодно.
В том числе и 3ИЛИ-НЕ, 4ИЛИ-НЕ, 5ИЛИ-НЕ

Eugene.A
11.09.2015, 14:41
В нашем универе аудитория была им. Мальцева. Того самого.

Ryzhij
11.09.2015, 14:50
В нашем универе аудитория была им. Мальцева. Того самого.Я не в теме насчёт Мальцева. И свой институт заканчивал за 30 лет до того, как тот стал универом ;)

AAA1
11.09.2015, 14:56
ААА1, а можно пример в виде файла? Сегодня закажу п.реле и попробую все варианты.
Можно-то можно, но проще как Василий Кашуба сказал. Или пишите в какой версии ОЛ Вам он нужен и для какой модели ПР, там делов на несколько минут.

Eugene.A
11.09.2015, 15:01
Я не в теме насчёт Мальцева
А вы по своей ссылке сходите. Насчёт критерия.
"Анатолий Иванович Мальцев (14 (27) ноября 1909 — 7 июля 1967) — советский математик, основоположник сибирской школы алгебры и логики."

Ryzhij
11.09.2015, 15:55
А вы по своей ссылке сходите. Насчёт критерия.
"Анатолий Иванович Мальцев (14 (27) ноября 1909 — 7 июля 1967) — советский математик, основоположник сибирской школы алгебры и логики."
Спасибо, как-то пропустил ;)

Ballentrajs
11.09.2015, 22:04
Можно-то можно, но проще как Василий Кашуба сказал. Или пишите в какой версии ОЛ Вам он нужен и для какой модели ПР, там делов на несколько минут.

ААА1, версия ОЛ 1.8.3 build 92beta, модель ПР110-220.8ДФ.4Р

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

capzap
13.09.2015, 21:41
Здравствуйте, уважаемые форумчане. Кому не лень, помогите решить задачку. Был у меня один автомат, собранный на Ардуино и обвязке - оптроны по входам, реле на выходах. Три входа, два выхода. Выполнял он такую функцию

Х1..Х2..Х3...Y1..Y2
0....0....0.....0...0
0....0....1.....1...0
0....1....0.....1...0
1....0....0.....1...0
0....1....1.....0...1
1....0....1.....0...1
1....1....0.....0...1
1....1....1.....1...1


Тут на днях эта конструкция погорела из-за броска по питанию, да и на стороннее обслуживание это нужно отдать. Контроллер для самоделок, как то не комильфо, да ещё с навесным монтажём обвязки. Самое недорогое решение, я думаю, программируемое реле. Но я голову сломал, исполняя это на логике. Помогите в решении, пожалуйста. Кто-то заодно пооттачивает мастерство:)

я вот заметил что Y2 повторяет X1, поэтому остается только собрать схемку для Y1, у меня получилось так

AAA1
13.09.2015, 22:11
ААА1, версия ОЛ 1.8.3 build 92beta, модель ПР110-220.8ДФ.4Р

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

Пожалуйста.

AAA1
13.09.2015, 22:18
я вот заметил что Y2 повторяет X1, поэтому остается только собрать схемку для Y1, у меня получилось так

Несколько раз перечитал. Y2 повторяет Х1, или Вы ошиблись, или я чего не понял. Посмотрел файл, точно ошибочка получилась у Вас.

capzap
13.09.2015, 22:36
Несколько раз перечитал. Y2 повторяет Х1, или Вы ошиблись, или я чего не понял. Посмотрел файл, точно ошибочка получилась у Вас.

ошибочка у меня появилась, потому что повелся на
Там у вас в табличке ошибка во входах (4,5 строчка) ,но это не страшно ,поменяйте в ППзу число и все ....
сейчас перелистнул вторую страничку, нашел http://www.owen.ru/forum/showthread.php?t=22168&p=180462&viewfull=1#post180462 попробую переделать

ЗЫ таблица соответствия должна писаться правильно, чтоб небыло поводов сомневаться что она ошибочна

melky
13.09.2015, 22:44
в двух случаях Y2 не повторяет X1

capzap
13.09.2015, 23:26
Так, для примера, как это реализованно в ардуине:

const int inputPinA = 3;
const int inputPinB = 4;
const int inputPinC = 5;
const int outputPinA = 6;
const int outputPinB = 7;

void setup() {
digitalWrite(outputPinA, OUTPUT);
digitalWrite(outputPinB, OUTPUT);
digitalWrite(inputPinA, INPUT);
digitalWrite(inputPinB, INPUT);
digitalWrite(inputPinC, INPUT);
}

void loop() {
int A = digitalRead(inputPinA);
int B = digitalRead(inputPinB);
int C = digitalRead(inputPinC);

if (A + B + C == 1) {
digitalWrite(outputPinA, HIGH);
digitalWrite(outputPinB, LOW);
} else if (A + B + C == 2) {
digitalWrite(outputPinA, LOW);
digitalWrite(outputPinB, HIGH);
} else if (A + B + C == 3) {
digitalWrite(outputPinA, HIGH);
digitalWrite(outputPinB, HIGH);
} else {
digitalWrite(outputPinA, LOW);
digitalWrite(outputPinB, LOW);
}
}

прочитав этот пост, понял свою ошибку и слепил из простых элементов, вобщем то ни чем не отличающийся вариант как и у остальных внимательных форумчан

tagor4444
01.10.2015, 14:23
20208 Cj, собственно еще один пример на XOR

spectrum48k
01.10.2015, 16:12
Вставлю 5 копеек)) Похоже на схему с паритетом)) Если сработал один датчик -то предупреждение Y1, если сработало два датчика, то авария Y2. Итого один элемент OR на три входа (или 2 по 2) и три элемента AND (X1&X2, X1&X3, X2&X3). Всё. Я - художник, я так вижу)))
UPD: Примеры не видел, нет у меня OwL. Если боян, то понять и простить.