Просмотр полной версии : Вопрос про математические функции
Всем добрый вечер! Возник вопрос необходимости применения функции двоичного логарифма при создании проекта для ПЛК-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.
Может быть, есть и другие варианты решения этого вопроса, но я уже окончательно сломал голову.
Всем добрый вечер! Возник вопрос необходимости применения функции двоичного логарифма при создании проекта для ПЛК-110, но ни в одной библиотеке, включая oscat не нашел (только натуральный и десятичный в наличии). Подскажите, где можно достать?
38541
lb(x)= lg(x)/lg(2) =3,3219281*lg(x)
lb(x)= ln(x)/ln(2) =1,442695*ln(x)
https://life-prog.ru/1_39460_imitatsiya-raboti-deshifratorov.html
https://life-prog.ru/1_39460_imitatsiya-raboti-deshifratorov.html
Вы, скорее всего, не поняли, что мне нужно.
Есть BOOL сигналы задающие режим управления в формате данных WORD. Эта переменная должна быть одна, изменяющая значение от 1 до 8 в зависимости от перехода в TRUE входов типа BOOL, а не множество.
Вы, скорее всего, не поняли, что мне нужно.
Есть 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 и перебором через цикл находите индекс совпавшего элемента
и еще множество вариантов не доходя до формул
я не реализацию предлагал, а направление, зачем формулы если можно логически все сделать, не получается сделать собственный дешифратор, не получается ДНФ, еще вариант
iValue := BOOL_TO_INT(inValue.0) + 2* BOOL_TO_INT(inValue.1) и т.д.
другой вариант, константный массив из элементов 1.2.4.8.16.32.64.128 и перебором через цикл находите индекс совпавшего элемента
и еще множество вариантов не доходя до формул
Пока с трудом себе представляю как это будет выглядеть на cfc (на нём у меня реализован проект).
А Вы точно умеете программировать на CFC?
ФБ pack к вашим услугам.
еще вариант
iValue := BOOL_TO_INT(inValue.0) + 2* BOOL_TO_INT(inValue.1) и т.д.
В этом примере, опять же, не получается единой изменяющейся во времени переменной, только отдельно взятые числа 1.2.3.4.5.6.7.8. Так-то я бы уже давно сделал.
По части массива. Создам массив констант и что я получу на выходе? Мне нужен в таком случае ФБ, имеющий на выходе порядковый номер совпавшей со входом константы. Таких ФБ я не нашел. Опять масло масляное получается. Не рабочий вариант.
А Вы точно умеете программировать на CFC?
ФБ decode к вашим услугам.
Реализованных проектов у меня много, просто с такой задачей сталкиваюсь впервые. Автоматизация не моя основная специализация.
А Вы точно умеете программировать на CFC?
ФБ pack к вашим услугам.
Раз уж отредактировали сообщение, то попробуйте pack сами и увидите, что там на выходе получается экспонента или геометрическая прогрессия, а не порядковые номера в формате WORD (INT) как мне нужно.
Раз уж отредактировали сообщение, то попробуйте pack сами и увидите, что там на выходе получается экспонента или геометрическая прогрессия, а не порядковые номера в формате WORD (INT) как мне нужно.
на картинке нарисуйте что хотите получить, какое значение подается во входную переменную "черного ящика" и какое значение получает выходная переменная
а то реально не понять что Вам нужно, вот и выходит что поставить пак или унпак и т.п.
Я в курсе двоичной математики. BOOL у меня взаимоисключающие и от них, по факту, мне нужны только значения TRUE. Пишу пример того, что надо:
in1BOOL; (Режим поджига и разогрева котла) Вычислен в программе с помощью ФБ WINDOW по порогу температур от 0 до 65 градусов.
in2 BOOL; (Режим 1 ступени котла) Вычислен в программе по порогу температур от 65 до 70 градусов.
И так далее 9 режимов горения в каждом из которых in(x) принимает состояние TRUE.
На выходе при активации каждого отдельно взятого режима должно появляться значение WORD от 0 (режим поджига) до 8 (максимальный режим). Это значение на входе ФБ MUX у меня задаёт ступени для исполнительных механизмов. То есть мне нужна одна переменная принимающая значение порядкового номера режима по сигналу BOOL. Получается, что були взаимоисключающие.
PS: Может быть, я пошел сложным, онанистическим путём, но программа уже готова и переписывать весь код нет времени.
Я в курсе двоичной математики. BOOL у меня взаимоисключающие и от них, по факту, мне нужны только значения TRUE. Пишу пример того, что надо:
in1BOOL; (Режим поджига и разогрева котла) Вычислен в программе по порогу температур от 0 до 65 градусов.
in2 BOOL; (Режим 1 ступени котла) Вычислен в программе по порогу температур от 65 до 70 градусов.
И так далее 9 режимов горения в каждом из которых in(x) принимает состояние TRUE.
На выходе при активации каждого отдельно взятого режима должно появляться значение WORD от 0 (режим поджига) до 8 (максимальный режим). Это значение на входе ФБ MUX у меня задаёт ступени для исполнительных механизмов.
да всё равно не понятно что Вы пишите, картинками показывайте что конкретно нужно
да всё равно не понятно что Вы пишите, картинками показывайте что конкретно нужно
Вот в очередной раз убеждаешься, что простое сделать сложнее всего. Вот, нарисовал на бумаге. Я не знаю как ещё объяснить.
38551
Скорее всего вы не совсем в теме двоичной математики.
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.
а если mode1 и mode9 будут ture то все равно на выходе 8 ?
математика тут конечно как у собаки 5 нога...
Валенок, ну почему же, вполне взаимоисключающее, типа старший буль всегда в приоритете... только все рано не пойму, при чем тут математика ? ее тут нет, просто обычные условия.
Напишите свой блок в ST как на бумаге и используйте себе на здоровье в CFC....
А ТС бьёт себя ногой в грудь что взаимоисключающие.
Ему некогда переделывать.
Ждём новостей про очередной замерзающий поселок ))
Во время ожидания постройки новой котельной появится время для переделки
Слава богу что всего лишь котел а не АЭС
А где-то у меня написано, что они могут быть не взаимоисключающие? Не выдавайте желаемого за действительное, я пишу конкретику, что нужно, а от вас пока только домыслы да не рабочие предложения.
Валенок, ну почему же, вполне взаимоисключающее, типа старший буль всегда в приоритете... только все рано не пойму, при чем тут математика ? ее тут нет, просто обычные условия.
Напишите свой блок в ST как на бумаге и используйте себе на здоровье в CFC....
Только такой вариант и остаётся, правда особого опыта работы с ST нет. Буду доходить, если других вариантов нет. А так, по сути да, это не математика, а операция вывода по условию.
Вот в очередной раз убеждаешься, что простое сделать сложнее всего. Вот, нарисовал на бумаге. Я не знаю как ещё объяснить.
38551
Вот цитата из Вашего первого поста:"вытащить из прогрессии значений BYTE 1.2.4.8.16.32.64.128", чем Вам на моем скрине не устроил байт подающийся на вход, далее в функции CONVERT из байта получаю були, ну подавайте вместо записи ХХХ.х простой буль, будет тоже самое
А если (бы) нажали две ?
У Вас то 8 режимов, то 9.
Если понимаете как работает программа, то переписать только нужное - меньше чем потраченное время на форуме.
Если не понимаете - типа она "как-то работает ничего трогать нельзя" - тогда, да - времени нет. Это особенно смешно в применении к котельной. Плаки про билет на самолет через час или кто купит новый билет - не ко мне.
А где я вижу как образуются in1, in2 ... ?
Это видно из моего описания как образовываются in(x), нужно просто читать внимательнее. Я понимаю, что сильно умные все, но по конкретному вопросу пока одни догадки. И программа на котельную написана мной, по-этому и изменить я там могу, но особого времени нет. Я вообще считаю, что модуляция на угольном котле это бред, но если варианта решения моего вопроса нет, то будет работать без модуляции - проблем никаких.
Вот в очередной раз убеждаешься, что простое сделать сложнее всего. Вот, нарисовал на бумаге. Я не знаю как ещё объяснить.
38556
Дословный перевод
if mode1....
38553 38554 38555
Дословный перевод
if mode1....
38553 38554 38555
Б...))) Ну да, точно, а почему бы и нет?:D
Пожалуй, я это и использую. Говорю же, около месяца программу пишу и всё работает, кроме этой функции, а глаза замылились на ровном месте и впал в элементарный ступор)
Всё отлично! Благодарю за помощь. Вопрос оказался на самой поверхности. Х.З. что я затупил...:(
PS: Куда ставить petera лайк, репост и прочие благодарности за вправку мозгов?)
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot