PDA

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



Arimon
30.08.2018, 00:27
Всем добрый вечер! Возник вопрос необходимости применения функции двоичного логарифма при создании проекта для ПЛК-110, но ни в одной библиотеке, включая oscat не нашел (только натуральный и десятичный в наличии). Подскажите, где можно достать?
PS: Логарифмом хочу вытащить из прогрессии значений BYTE 1.2.4.8.16.32.64.128 соответственно значения 1.2.3.4.5.6.7.8 для задания по BOOL сигналам переменной типа WORD в свою очередь для построения модулируемого режима на управление котлом.
Получается, что нужно мне получить данные типа WORD в диапазоне от 1 до 8, соответствующие 8 BOOL сигналам, выдаваемым в случае соответствия параметров требуемым значениям. 8 BOOL сигналов я уже получил, программа готова, теперь нужно по вызову каждого из них передавать на одну глобальную переменную 8 различных значений WORD.
Может быть, есть и другие варианты решения этого вопроса, но я уже окончательно сломал голову.

petera
30.08.2018, 04:38
Всем добрый вечер! Возник вопрос необходимости применения функции двоичного логарифма при создании проекта для ПЛК-110, но ни в одной библиотеке, включая oscat не нашел (только натуральный и десятичный в наличии). Подскажите, где можно достать?


38541



lb(x)= lg(x)/lg(2) =3,3219281*lg(x)

lb(x)= ln(x)/ln(2) =1,442695*ln(x)

capzap
30.08.2018, 07:24
https://life-prog.ru/1_39460_imitatsiya-raboti-deshifratorov.html

Arimon
30.08.2018, 09:13
https://life-prog.ru/1_39460_imitatsiya-raboti-deshifratorov.html

Вы, скорее всего, не поняли, что мне нужно.
Есть BOOL сигналы задающие режим управления в формате данных WORD. Эта переменная должна быть одна, изменяющая значение от 1 до 8 в зависимости от перехода в TRUE входов типа BOOL, а не множество.

capzap
30.08.2018, 09:22
Вы, скорее всего, не поняли, что мне нужно.
Есть BOOL сигналы задающие режим управления в формате данных WORD. Эта переменная должна быть одна, изменяющая значение от 1 до 8 в зависимости от перехода в TRUE входов типа BOOL, а не множество.

я не реализацию предлагал, а направление, зачем формулы если можно логически все сделать, не получается сделать собственный дешифратор, не получается ДНФ, еще вариант
iValue := BOOL_TO_INT(inValue.0) + 2* BOOL_TO_INT(inValue.1) и т.д.

другой вариант, константный массив из элементов 1.2.4.8.16.32.64.128 и перебором через цикл находите индекс совпавшего элемента

и еще множество вариантов не доходя до формул

Arimon
30.08.2018, 09:55
я не реализацию предлагал, а направление, зачем формулы если можно логически все сделать, не получается сделать собственный дешифратор, не получается ДНФ, еще вариант
iValue := BOOL_TO_INT(inValue.0) + 2* BOOL_TO_INT(inValue.1) и т.д.

другой вариант, константный массив из элементов 1.2.4.8.16.32.64.128 и перебором через цикл находите индекс совпавшего элемента

и еще множество вариантов не доходя до формул

Пока с трудом себе представляю как это будет выглядеть на cfc (на нём у меня реализован проект).

ASo
30.08.2018, 10:20
А Вы точно умеете программировать на CFC?
ФБ pack к вашим услугам.

Arimon
30.08.2018, 10:20
еще вариант
iValue := BOOL_TO_INT(inValue.0) + 2* BOOL_TO_INT(inValue.1) и т.д.



В этом примере, опять же, не получается единой изменяющейся во времени переменной, только отдельно взятые числа 1.2.3.4.5.6.7.8. Так-то я бы уже давно сделал.
По части массива. Создам массив констант и что я получу на выходе? Мне нужен в таком случае ФБ, имеющий на выходе порядковый номер совпавшей со входом константы. Таких ФБ я не нашел. Опять масло масляное получается. Не рабочий вариант.

Arimon
30.08.2018, 10:23
А Вы точно умеете программировать на CFC?
ФБ decode к вашим услугам.

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

Arimon
30.08.2018, 10:30
А Вы точно умеете программировать на CFC?
ФБ pack к вашим услугам.

Раз уж отредактировали сообщение, то попробуйте pack сами и увидите, что там на выходе получается экспонента или геометрическая прогрессия, а не порядковые номера в формате WORD (INT) как мне нужно.

capzap
30.08.2018, 10:48
Раз уж отредактировали сообщение, то попробуйте pack сами и увидите, что там на выходе получается экспонента или геометрическая прогрессия, а не порядковые номера в формате WORD (INT) как мне нужно.

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

а то реально не понять что Вам нужно, вот и выходит что поставить пак или унпак и т.п.

Arimon
30.08.2018, 11:05
Я в курсе двоичной математики. BOOL у меня взаимоисключающие и от них, по факту, мне нужны только значения TRUE. Пишу пример того, что надо:
in1BOOL; (Режим поджига и разогрева котла) Вычислен в программе с помощью ФБ WINDOW по порогу температур от 0 до 65 градусов.
in2 BOOL; (Режим 1 ступени котла) Вычислен в программе по порогу температур от 65 до 70 градусов.
И так далее 9 режимов горения в каждом из которых in(x) принимает состояние TRUE.
На выходе при активации каждого отдельно взятого режима должно появляться значение WORD от 0 (режим поджига) до 8 (максимальный режим). Это значение на входе ФБ MUX у меня задаёт ступени для исполнительных механизмов. То есть мне нужна одна переменная принимающая значение порядкового номера режима по сигналу BOOL. Получается, что були взаимоисключающие.
PS: Может быть, я пошел сложным, онанистическим путём, но программа уже готова и переписывать весь код нет времени.

capzap
30.08.2018, 11:07
Я в курсе двоичной математики. BOOL у меня взаимоисключающие и от них, по факту, мне нужны только значения TRUE. Пишу пример того, что надо:
in1BOOL; (Режим поджига и разогрева котла) Вычислен в программе по порогу температур от 0 до 65 градусов.
in2 BOOL; (Режим 1 ступени котла) Вычислен в программе по порогу температур от 65 до 70 градусов.
И так далее 9 режимов горения в каждом из которых in(x) принимает состояние TRUE.
На выходе при активации каждого отдельно взятого режима должно появляться значение WORD от 0 (режим поджига) до 8 (максимальный режим). Это значение на входе ФБ MUX у меня задаёт ступени для исполнительных механизмов.
да всё равно не понятно что Вы пишите, картинками показывайте что конкретно нужно

Arimon
30.08.2018, 11:23
да всё равно не понятно что Вы пишите, картинками показывайте что конкретно нужно

Вот в очередной раз убеждаешься, что простое сделать сложнее всего. Вот, нарисовал на бумаге. Я не знаю как ещё объяснить.
38551

Arimon
30.08.2018, 11:37
Скорее всего вы не совсем в теме двоичной математики.
8 булей в ворде, это не 8 значений а 256. (вне зависимости от места положения битов. Хоть в старшем байте)

А для 1..8 нужно 4 буля. Че-ты-ре.
Но так как true-кодеры с считают с нуля (0..7), то им бы хватило и 3-х булей.

Если були у вас гарантировано взаимоисключающие то зачем упаковывать в маску ? Можно проста задать число по которому запустите нужный процесс например через case (зачем дырявой CFC-ложкой селектор хлебать - не понимаю. Видимо разновидность БСДМ)

Если були не взаимоисключающие, то только 0...255 (стрелять в ногу размещением каких-то битов с старшем байте - тоже БСДМ)
А как вы будете делить 256 вариантов на 8-емь процессов - это уж ваше дело.

PS
А с логарифмами - over-educaton. Проще надо быть

PS-PS
Нахождение номера гарантировано единственного бита в маске-ворде)//вот накой это ?

N := -1; //-1 - а нету бита
while маска <> 0 do
N := N + 1;
маска := маска / 2; //ror(маска,1), shr(маска,1) .. на любителя
end_while

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

melky
30.08.2018, 11:41
а если mode1 и mode9 будут ture то все равно на выходе 8 ?

математика тут конечно как у собаки 5 нога...

melky
30.08.2018, 11:49
Валенок, ну почему же, вполне взаимоисключающее, типа старший буль всегда в приоритете... только все рано не пойму, при чем тут математика ? ее тут нет, просто обычные условия.


Напишите свой блок в ST как на бумаге и используйте себе на здоровье в CFC....

Arimon
30.08.2018, 11:52
А ТС бьёт себя ногой в грудь что взаимоисключающие.
Ему некогда переделывать.
Ждём новостей про очередной замерзающий поселок ))
Во время ожидания постройки новой котельной появится время для переделки


Слава богу что всего лишь котел а не АЭС

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

Arimon
30.08.2018, 11:58
Валенок, ну почему же, вполне взаимоисключающее, типа старший буль всегда в приоритете... только все рано не пойму, при чем тут математика ? ее тут нет, просто обычные условия.


Напишите свой блок в ST как на бумаге и используйте себе на здоровье в CFC....

Только такой вариант и остаётся, правда особого опыта работы с ST нет. Буду доходить, если других вариантов нет. А так, по сути да, это не математика, а операция вывода по условию.

capzap
30.08.2018, 12:06
Вот в очередной раз убеждаешься, что простое сделать сложнее всего. Вот, нарисовал на бумаге. Я не знаю как ещё объяснить.
38551

Вот цитата из Вашего первого поста:"вытащить из прогрессии значений BYTE 1.2.4.8.16.32.64.128", чем Вам на моем скрине не устроил байт подающийся на вход, далее в функции CONVERT из байта получаю були, ну подавайте вместо записи ХХХ.х простой буль, будет тоже самое

Arimon
30.08.2018, 12:31
А если (бы) нажали две ?

У Вас то 8 режимов, то 9.

Если понимаете как работает программа, то переписать только нужное - меньше чем потраченное время на форуме.
Если не понимаете - типа она "как-то работает ничего трогать нельзя" - тогда, да - времени нет. Это особенно смешно в применении к котельной. Плаки про билет на самолет через час или кто купит новый билет - не ко мне.


А где я вижу как образуются in1, in2 ... ?

Это видно из моего описания как образовываются in(x), нужно просто читать внимательнее. Я понимаю, что сильно умные все, но по конкретному вопросу пока одни догадки. И программа на котельную написана мной, по-этому и изменить я там могу, но особого времени нет. Я вообще считаю, что модуляция на угольном котле это бред, но если варианта решения моего вопроса нет, то будет работать без модуляции - проблем никаких.

petera
30.08.2018, 12:31
Вот в очередной раз убеждаешься, что простое сделать сложнее всего. Вот, нарисовал на бумаге. Я не знаю как ещё объяснить.
38556
Дословный перевод
if mode1....
38553 38554 38555

Arimon
30.08.2018, 12:39
Дословный перевод
if mode1....
38553 38554 38555

Б...))) Ну да, точно, а почему бы и нет?:D
Пожалуй, я это и использую. Говорю же, около месяца программу пишу и всё работает, кроме этой функции, а глаза замылились на ровном месте и впал в элементарный ступор)

Arimon
30.08.2018, 12:55
Всё отлично! Благодарю за помощь. Вопрос оказался на самой поверхности. Х.З. что я затупил...:(
PS: Куда ставить petera лайк, репост и прочие благодарности за вправку мозгов?)