ВЕТЕР постоянно трудится над разнообразными предложениями по улучшению CoDeSys. Дело полезное.
В некоторых панельках есть встроенный язык программирования. Его сравнивать с CoDeSys смешно. Это довольно разные вещи, разные области применения.
Кратко - техническая задача CoDeSys Visu работать в РВ и на дешевых встраиваемых проц. 16 бит, который обязан тянуть логику ПЛК и графику одновременно. Никакую скаду туда не воткнуть. Графика должна быть минимально необходимой для снижения требований к проц. Такова была задача на разработку для V2.3. Применение – машиностроение, транспорт. Нечто типа панели автомобиля, трактора, погрузчика, крана, трамвая – 5 стрелок, 10 кнопок. Таких применений CoDeSys Visu десятки тысяч. Все это серийные продукты (кроме ходовой панели яхты Абрамовича). Естественно, по графике CoDeSys Visu глупо сравнивать со спец. панелями или скадами, созданными для работы на более мощных проц.
Встроенная визуализация CoDeSys как водка. По вкусовым качествам уступает рому, коньку, марочному вину и много еще чему, но от этого область уместного применения не уменьшается![]()
Для этой задачи хватает. На СКАДУ денег не выделили, довольствуемся малымНе хватает только архивирования (хотя можно обрабатывать логи), люди обходятся скриншотами. Зато единая среда, можно заглянуть "вовнутрь" в отладочных целях. Понимаю, что это избыточная возможность для оператора, но для "телефонной" отладки достаточно немного соображающего в компьютерах оператора.
Ну, я про красивость, а не распространенность (с ней не поспоришь).
А насчет примера у меня такая строчка может быть в цикле (20 одинаковых объектов), плюс расчетные задачи (выход целое или плавающее, а не логическое; тот же ПИД). Мне удобнее изменить в одном месте, чем в 20 сразу при изменении логики. Или приведенный пример; он тоже на LD реализуется?
Код:tim3(in:=TRUE,pt:=t#5s); IF tim3.Q THEN time4:=DINT_TO_WORD(TIME_TO_DINT(tim2.ET)/60000); IF tp1c<>tp1co THEN n:=n+1; ss:=ss+tp1; ELSE tp1:=t; END_IF; IF tp2c<>tp2co THEN n:=n+1; ss:=ss+tp2; ELSE tp2:=t; END_IF; IF tp3c<>tp3co THEN n:=n+1; ss:=ss+tp3; ELSE tp3:=t; END_IF; IF tp4c<>tp4co THEN n:=n+1; ss:=ss+tp4; ELSE tp4:=t; END_IF; IF tp5c<>tp5co THEN n:=n+1; ss:=ss+tp5; (* ELSE tp5:=t; *) END_IF; tim3(in:=FALSE); tp1co:=tp1c; tp2co:=tp2c; tp3co:=tp3c; tp4co:=tp4c; tp5co:=tp5c; IF n<>0 THEN t:=ss/n; END_IF; ttemp:=t; END_IF;
Andy!
Может проще завести массивы:
tpc[0..20]
tpc0[0..20]
tp[0..20]
и в цикле опрашивать функцию, в которой входной переменной будет индекс массива i и выполняется:
Да и саму двадцатку объявить глобальной константой и менять при увеличении числа объектов.Код:IF tpc[i]<>tpco[i] THEN n:=n+1; ss:=ss+tp[i]; ELSE tp[i]:=t; END_IF;
С уважением,
Herzog
Нет, это разные случаи. В приведенном примере используются переменные из области ВВ, для массива надо их переприсваивать и т.д.
Почему нет? Правой кнопкой мышки щелкаете, Конвертировать объект… в LD. Получится зуб в зуб с ветвлениями. Руками с нуля будет красивее.
Все языки приводятся препроцессором в один собственный формат. Это значит: 1. Любую программу можно перевести на любой язык. 2. Машинный код при этом не изменится. 3. Выбор языка исключительно дело вкуса.
Переделывать тут нет никакого смысла. Если думать в IF ELSE и так писать на LD, то получается жуть. Поэтому и говорю, что красиво писать на LD нужно уметь и думать не так как на текстовых языках. Мне лично ST ближе. Есть мастера, которые делают на LD изящные программы.
* Область ВВ позволяет объявлять переменные ‘внахлест’. Можно положить массив поверх входов. Будет типа union в Си.
* ; после END_IF в ST не нужна, дает пустой оператор.
Насчет "внахлест" - это ж надо описывать переменные не в дереве конфигурации; хотя, когда проект устоялся (не добавляются внешние переменные), можно и переделать под такой вариант.
Про "думать на LD" - наверное, да, мешает опыт программирования на процедурных языках. Может, когда-нибудь прозрею?
Как это внахлёст адреса? Подскажите
В области в/в и в маркерной (M) переменные кладутся на определенные адреса по AT. Никто не запрещает положить 2 или более переменных на один адрес. Компилятор выдаст предупреждение. Оно опционально отключаемое.
Например, можно объявить текстовую строку в М памяти и на этот же адрес положить байтовый массив. Получим легкий побайтовый доступ к строке.