Да, разработчик ОЛ не писал больших программ. Даже не смешно.
Вид для печати
Там же было не просто "больших программ", а "больших программ в ОЛ".
А вообще, спасибо за ОЛ!
Смотря, какой макрос.
Macros MS Office - изначально - просто возможность записывать и потом нужное количество раз воспроизводить последовательность нажатий клавиш. Позднее расширился до VBA
Macros С - отдельный, хоть и упрощенный, транслятор.
Macros ОВЕН - на сегодня, это FBD, причем, полноценное, с вложением. В данном контексте - лучшее. Лучше этого - текст и компилятор (ИМХО)
Вариант 1.
У вас есть, например, загрузчик и разгрузчик. В каждом из которых - несколько заслонок. Поэтому, макрос заслонка - встраивается по нескольку раз и в загрузчик и разгрузчик. Называется - повторное использование кода - не надо каждую заслонку описывать заново.
Вариант 2.
Та же ситуация. Когда смотришь код загрузчика, сразу видишь несколько заслонок, код которых уже посмотрел, и он не захламляет взгляд. Называется - повысить читаемость кода.
Вариант 3.
Та же ситуация. Вы допустили ошибку в алгоритме работы заслонки. Меняете в одном месте и уверены, что не пропустите это исправление где-то среди заслонок загрузчика и разгрузчика. Не помню, как это называется )
Вариант 4.
Та же ситуация. Вы вычленяете заслонку, с ее состояниями, ошибками, и прочим, в отдельную задачу, которую может сделать другой человек. Называется - декомпозиция задачи.
Хм. Повторное использование кода это когда один экземпляр кода вызывается из разных мест.
В случае макросов N экземпляров кода (пусть и одинакового) вызываются каждый раз отдельно. Т.е. программа в N раз больше и несколько медленнее (т.к. Cache Miss чаще возникает).
Не путаем ФБ/Функции в ST и макросы ОЛ
Тогда надо говорить, что не вызывается каждый раз, а каждый раз один и тот же код прописывается в программе. Правильно?
Не путаем. Код - он бывает и текстовый и исполняемый. Если знакомы с С, это как вызов обычной функции, и вызов той же функции Inline. И в том и в другом случае, есть повторное использование кода. В разных случаях - для разных задач. В случае inline - для быстродействия, в случае обычной функции - для экономии.
Но изменив код в одном месте - он поменяется при всех вызовах - смотрим снова на все пункты.
ЗЫ. "Убегание кэша" вам вообще ничем не грозит, так как:
1. Вы его не получите, так как булева алгебра очень близка к машинному коду = компактна. Даже при использовании строк.
2. Чем код менее оптимизирован компилятором под размер (меньше переходов, линейный), тем он больше но и быстрее исполняется, так как меньше операций PUSH, POP.
2. Даже, если, вдруг, каким-то чудом, получите множественную очистку кэша, вас, как программиста автоматики, это не должно волновать. Так как у вас есть отведенное технологическим оборудованием время цикла, например, 10мс. И пока вы из него не выбиваетесь - остальное не важно. Прогармма должна выполнить цикл менее или равно, чем за отведенное время. Если нужны короткие циклы, то для этого придумали ПЛИС (я месяца 3 назад решил поизучать - просто восторге от их быстродействия).
да, столкнулся с этим. Только беззнаковый тип. или переходи на реал
Я завел обр связь с вых функции на вход и получил возможность на ST писать свои счетчики, триг со всякой нужной мне логикой. мне показалось, что это удобно и очень компактно. Интересно, кто нибудь так делал?
Это не ваша заслуга, а ваша невнимательность, другие(в том числе и я) так давно(всегда) делали для удобства!
https://owen.ru/forum/showthread.php?t=35810
Вложение 59027
быстродействие получают с inline за счёт убирания преамбулы и выхода из функции. Но это работает за счёт размера кода и в какой-то момент код, 100% попадающий в кэш вылазит за него и тут, вдруг, в 3-4 раза начинает медленнее выполняться. И вся "оптимизация" идёт в пустыню Наска. Так что утверждать, что в ПР макросы быстрее функций можно на какой-нибудь нанопрограмме. А вот на больших проектах это не так.
Дефектов в самом деле много. Плохо, что нельзя вставить в макрос, нет глоб переменных. Но что есть, тоже много дает, если освоить.
Функция преобразования для датчика температуры KTY81-110, интерполяция на основе данных даташита по средним (нормальным) значениям:
Цитата:
function KTY81_110_To_Temp: real; //Преобразование сопротивления датчика KTY81_110 в градусы
var_input //объявление входных переменных
resist : real; //входное сопротивление
end_var
var //коэффициенты кубического полинома
k1 : real := 1.76498e-8;
k2 : real := 0.0000953607;
k3 : real := 0.265696;
k4 : real := 162.834;
end_var
KTY81_110_To_Temp := k1*resist*resist*resist - k2*resist*resist + k3*resist - k4;
end_function
все классно, но полиномиальная функция постоянно меняет знаки между степенным множителями, потому универсальную функцию не сделать.
Да нормально всё с полиномом.
Взял циферки из даташита, скопипастил в эксель, и он мне любезно полином подобрал.
Если полином подобрать не под полный диапазон из даташита, а только под тот, с которым собираешься работать, то точность будет заметно выше.
-------------
Оказалось что это сообщение было юбилейным, 1000. Какой же я старый...
Может кому пригодится в помощь: файл excel, подготавливает ссылки с данными на сайт WolframAlpha, для нескольких типов аппроксимации
Прикольно, я и не подозревал что есть такой сайт как WolframAlpha, а Вы похоже не знали про фичу экселя.
Пробовал на этом сайте найти как составить запрос на подбор функции по таблице, сразу не осилил, потом поленился, т.е. не смог.
А ваш файл ссылку на моём компе не генерит.
Файл подправил для Excel, теперь работает
Здравствуйте. Как добавит второй выход для функции, как это записать? С входными ясно.
function Out_1: bool;
var_input //объявление входных переменных
in_1: udnt;
in_2: real;
end_var
var //
end_var
end_function
X200881 это функции, а не блоки, выход может быть только один.
У функций 2-х выходов не бывает. Можно передавать несколько значений либо запаковывая их в выходное значение, либо через глобальные переменные. В некоторых языках есть ещё указатели, но не с МЭК ST.
Ну 2 функции в одной? На IL функции все делается.
А вот так можно использовать функцию в ST?
Тут применены два оператора return внутри условия if.
Эта функция возвращает false, если a и b неравны.Код:FUNCTION myFunc: BOOL
VAR
a, b : INT;
END_VAR
...
... Некие вычисления а и b
...
IF a > b THEN myFunc:=FALSE; RETURN; END_IF
IF a < b THEN myFunc:=FALSE; RETURN; END_IF
myFunc:=TRUE; // Если условия не сработали, то возвращает TRUE
(конец функции. Тут автоматический выход из неё)
Она возвращает true, если a и b равны.
Правильна ли такая конструкция?
День добрый!
А почему функцию на ST нельзя вставить в макрос ? Или надо какой то шаманский обряд совершить для этого ?
Заранее благодарен.
То есть надо выйти из макроса для использования функции и опять зайти в макрос... Прикольно...
Понял, Благодарю за ответ.
Нормальный пример с несколькими точками выхода
Добрый день, скажите, а ФБ когда можно будет писать в OL?? Или только функции и останутся?