Страница 11 из 13 ПерваяПервая ... 910111213 ПоследняяПоследняя
Показано с 101 по 110 из 126

Тема: Логика: Распознать отдельно короткое и отдельно длинное нажатия (CodeSys v3)

  1. #101

    По умолчанию

    Чё за индусский код-то?
    Мне хоть расскажите, я стебаться сам буду. А то я не в курсе и думаю, что вы все - диванные эксперты по коду, которые переменные толком назвать не умеют.

    Валенок А ты всё читал? Или так забежал?
    Я написал, что автомат там - ДО этого. Он окучивает работу с кнопкой.
    А дальше отдельно есть логика диммера. Которую в виде конечного автомата я и не писал.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  2. #102

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Чё за индусский код-то?
    Мне хоть расскажите, я стебаться сам буду. А то я не в курсе и думаю, что вы все - диванные эксперты по коду, которые переменные толком назвать не умеют.
    Могу ошибаться, но, лично мне, не нравятся граничные проверки.

  3. #103

    По умолчанию

    Цитата Сообщение от saii Посмотреть сообщение
    Могу ошибаться, но, лично мне, не нравятся граничные проверки.
    Без них никуда же: текущее значение яркости и шаг его изменения может быть любым. И может быть такой случай, когда

    capzap Всё равно мне непонятно, над чем стебутся.
    Я воспринимаю это с той стороны, что когда я помощи просил - то 2/3 начало пихать примеры под ПРку и ПЛК110, которые мне тогда не годились. А другая треть - пихала примеры без комментариев и пояснений. И с кривыми именами переменных. В которых я мало что понимал, потому что у меня были проблемы с алгоримизацией в том числе.
    И я вижу, что те, кто стебутся, на форуме сами мало что выкладывают, втом числе и понятного для новичков (где-то и я полный ноль или тупенький новичок). Из тех примеров, которые я использовал с форума, только пример архивации на флешку в CSV-файл был отлично документирован и прокомментирован. Каждой строчкой.
    Про многобукв. Если это пишут дети инстаграмма, про который в лекциях SEO рассказывают так: "Не бойтесь писать посты длиннее 1000 символов", то зачем мне их слушать?

    Я по форуму вижу тренды на:
    а) Диванных экспертов (которые заполнили всю тему про ПЛК110 со своими рассказнями про блоки питания);
    б) Умных жадин. Это те, которые бросают фразу вида "Ха! Не так ты делаешь! И такие вот идут в автоматизацию!", но не хотят или даже не могут пояснить подробно.
    Всё это я проходил на своём рабочем сайте, которому идёт 11ый год. Диванных экспертов я выгонял, а умным жадиной не был: я ругал, и потом объяснял почему.


    Касательно картинок. Валенок стебался, кажется, не над этим. Он стебался над тем, что значение прибавляется, и что про это написано.
    А тут прошу пояснить про границы. Только не в стиле умной жадины пожалуйста. Когда я это писал, у меня в голове была чёткая логика:
    а) Там, где IF - это ОПЕРАЦИЯ. Изменение яркости по шагам, пока нажата кнопка. И мне надо решить: меняю я яркость, или она дошла до максимума и её менять не надо.
    А так как:
    * Шаг изменения задаётся в настройках.
    * Яркость диммера задаётся (будет задаваться) на СПК слайдером на экране с точностью 1%
    Может получиться так, что мы к 99% прибавляем шаг, равный 3%, то на шаге прибавления мы можем получить не 100%, а 102%.
    Вот поэтому я написал ограничения по краям. На каждом ШАГЕ изменения яркости.

    б) Там, где MAX - это ВКЛЮЧЕНИЕ. Там однократно задаётся начальная яркость диммера при включении, так как она может быть задана двумя параметрами:
    * Минимальная техническая Config.DimLimitMin - я могу настроить диммер так, что меньше 5% диммер даже не опускается. Например для LED-ленты, которая отключается по питанию 230V и её гасят аппаратно. От диммера в этом случае требуется не дать загнать яркость ленты в ноль, чтобы исключить ситуации, когда питание на ленту подано, а она "не горит".
    * Минимальная яркость включения (Config.DimStartMin) - та яркость, на которую диммер встаёт при операции его включения. Это задумано для LED-ламп, некоторые из которых могут корректно включиться только при определённой яркости на момент включения. Условно, включать надо на 70%, а потом регулировать можно хоть до 20% минимума. Такое бывает, и ещё на CCFL-лампах было.

    Короче, эксперты (?). За год активничания на форуме я многих из вас хорошо узнал. И скажу следующее:
    1. Оправдываться мне не за что.
    2. Критикуя логику - объясняйте, что не так. На пустую критику без пояснений (где-то - пояснений для новичков) я отвечать не буду.
    3. Критику по коду (комментариям, стилю написания и индусскости) я буду принимать от тех, кто публично покажет свой код размером не менее чем в один экран. Без этого я слушать никого не буду. Как я уже говорил, я учусь только у тех, кто делает лучше меня.
    4. Конкретно capzap. Прежде чем учить меня код писать, просьба научиться писать на русском языке. Я имею ввиду "научиться писать сложноподчинённые предложения и грамотно (или хотя бы вообще начать) расставлять знаки препинания".
    Всё.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  4. #104

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Без них никуда же: текущее значение яркости и шаг его изменения может быть любым.
    Я не про их наличие

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    А тут прошу пояснить про границы. Только не в стиле умной жадины пожалуйста. Когда я это писал, у меня в голове была чёткая логика:
    а) Там, где IF - это ОПЕРАЦИЯ. Изменение яркости по шагам, пока нажата кнопка. И мне надо решить: меняю я яркость, или она дошла до максимума и её менять не надо.
    А так как:
    * Шаг изменения задаётся в настройках.
    * Яркость диммера задаётся (будет задаваться) на СПК слайдером на экране с точностью 1%
    Может получиться так, что мы к 99% прибавляем шаг, равный 3%, то на шаге прибавления мы можем получить не 100%, а 102%.
    Вот поэтому я написал ограничения по краям. На каждом ШАГЕ изменения яркости.
    А Вы уверены, что прибавив 3 к 99 на выходе Вы получите 100? (см. третий скрин строки 38-42)

    И нижнюю границу, на мой взгляд можно проверять проще:
    1. Сдвинув 0 вправо, например, на 100 и тогда сравнивать Value c 100
    2. Привести результат к значению со знаком и сравнивать с 0.
    Последний раз редактировалось saii; 10.08.2021 в 09:23.

  5. #105

    По умолчанию

    saii
    Туплю. Что тут не так? Если у меня Value равно 99, то если я прибавлю Config.DimValStep * 2 (который может быть чем угодно) - то получу Value больше 100.
    Код:
    IF (Value < Config.DimLimitMax) THEN
    	Value := Value + Config.DimValStep * 2;	(* Прибавляем значение на шаг *)
    ELSE
    	Value := Config.DimLimitMax;	(* Уравниваем значение с максимумом, ограничивая его сверху *)
    END_IF
    Value - это сразу же выход диммера. Напрямую, выход FB. Поэтому я и не хотел его фигачить со знаком, а хотел чтобы он был WORD - чтобы сразу в регистры его можно было пихать без преобразований типов. Поэтому написал муть с проверкой на отрицательные значения в дополнительном коде.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  6. #106

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Туплю. Что тут не так? Если у меня Value равно 99, то если я прибавлю Config.DimValStep * 2 (который может быть чем угодно) - то получу Value больше 100.
    Согласен

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Код:
    IF (Value < Config.DimLimitMax) THEN
    	Value := Value + Config.DimValStep * 2;	(* Прибавляем значение на шаг *)
    ELSE
    	Value := Config.DimLimitMax;	(* Уравниваем значение с максимумом, ограничивая его сверху *)
    END_IF
    При исходных данных чему будет равно Value по завершению этого куска кода?

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Value - это сразу же выход диммера. Напрямую, выход FB. Поэтому я и не хотел его фигачить со знаком, а хотел чтобы он был WORD - чтобы сразу в регистры его можно было пихать без преобразований типов. Поэтому написал муть с проверкой на отрицательные значения в дополнительном коде.
    А я и не предлагаю преобразовывать Value, а преобразовать результат операции Value - Step в значение со знаком и результат сравнивать с нулем. Либо, как вариант:
    Код:
    if Value + 100 - Step < 100 then ...

  7. #107

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Value := MAX(Config.DimLimitMax,Value + Config.DimValStep * 2);
    разве будет хуже? Меньше кода -> меньше потенциальных ошибок, меньше комментариев
    Здесь нужен MIN, и разницы между IF и MAX/MIN принципиальной нет, т.к. MAX/MIN это те же IFы.
    Последний раз редактировалось saii; 10.08.2021 в 10:02.

  8. #108
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    Cs-Cs Индусский код, это когда людям платят за количество строк кода. погуглите.
    А Валенок стебется над тем, что программисту объяснять понятие IF THEN в принципе глупо, а не программист туда просто и не полезет.
    Комменты надо писать по самому внутреннему коду функции, а не по прописным истинам типа IF

  9. #109
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,656

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Cs-Cs Индусский код, это когда людям платят за количество строк кода. погуглите.
    А Валенок стебется над тем, что программисту объяснять понятие IF THEN в принципе глупо, а не программист туда просто и не полезет.
    Комменты надо писать по самому внутреннему коду функции, а не по прописным истинам типа IF
    Индусский код- наиболее хитровывернутый, неочевидный вариант решения задачи. Примеры откуда-то из ... Ну и наверное построчная оплата таки да...

    Примеры индусского кода

    Пример № 1 (C#)uint i;
    ...
    if (i.ToString().Length == 1)
    {
    ...
    }


    Не сразу можно понять, что в этом коде просто-напросто выполняется проверка 0 <=i <10. Алгоритм достаточно прост: выполняется преобразование i в строку, после чего вычисляется её длина. Если число больше 9, то его десятичная запись содержит больше одного символа. Поскольку отрицательные числа переменная типа uint содержать не может, то проверку успешно проходят лишь числа от 0 до 9. Строка же, полученная из отрицательного числа, состоит как минимум из знака '-' и одной цифры, поэтому проверка справедлива и для знаковых целых (int). Алгоритм ресурсоёмок, неочевиден, и не поддаётся сопровождению даже теоретически.

    А вот и про комментарии:


    5. Комментарии с фанатизмом


    Комментируйте все подряд, кроме самых не очевидных кусков (см пример 1.) Если вы еще не достигли полного просветления и в вашей индусской программе случайно осталось две-три функции — создайте «шаблон описания функции», включите туда умные слова-разделы, в разделе «Description» перечислите еще раз все что было написано выше, но развернуто. Особенно эффект умножения строк кода проявляется с функциями типа «FSerror()» из примера выше.


    даже пустой такая шапка смотрится значимо
    /************************************************** ************************
    Function:
    void func (void)
    Summary:
    Does a hard work
    Conditions:
    This function should not be called by the user
    Input:
    None
    Return Values:
    None
    Side Effects:
    None
    Description:
    This function will do <a hard work>, with <none> input parameter....
    Remarks:
    Optimize code later
    ************************************************** ************************/


    Но есть еще и китайский код, очень востребован, а иногда (часто) просто необходим в АСУ-ТП

    Kитайский код — стиль написания программ, нарушающий принцип НПС («Не повторяй себя»). Китайский подход к программированию требует эксплицитного отказа от циклов, локальных переменных, любых процедур и условных выражений, а также использования технологии copy-and-paste чуть менее, чем везде. Такой подход точно увеличивает объём исходников и может увеличить производительность (ведь пропускаются такты на джамповые команды).
    [<collapsible-collapse>] Возьмём, к примеру, такой кусочек программы на C:
    int arr[10];
    int i;
    for (i = 0; i < 10; i++)
    {
    arr[i] = 0;
    }


    Который, кстати, вполне мог бы выглядеть и так:
    int arr[10] = {0};

    Типичный программист в китайском стиле напишет это так:
    int a0 = 0;
    int a1 = 0;
    int a2 = 0;
    int a3 = 0;
    int a4 = 0;
    int a5 = 0;
    int a6 = 0;
    int a7 = 0;
    int a8 = 0;
    int a9 = 0;


    и в дальнейшем будет использовать a0, a1, a2, a3, a4 и т.д. Например, вместо прекрасного:
    if (x < 10) arr[x] = x;

    будет:
    if (x == 0)
    {
    a0 = x;
    }
    else if (x == 1)
    {
    a1 = x;
    }
    else if (x == 2)
    {
    ...
    }


    Пример № 1, приведённый выше:
    uint i;
    ...
    if (i.ToString().Length == 1)
    {
    ...
    }


    приверженец китайской методы перепишет так:
    if (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9)
    {
    // произвести ещё одну бессмысленную операцию
    }



    В то время как суть индусского метода заключается в как можно более полном затуманивании предназначения программного продукта, китайский код зачастую поражает и даже отупляет простотой и брутальной прямолинейностью подхода, что характерно для китайской инженерии в целом. С другой стороны, нельзя не отметить, что подобные технологии позволяют максимальным образом трудоустроить население и приводят к сокрушительным победам в социалистических соревнованиях по количеству написанных строчек.

    http://nouveau.lurkmore.net/%D0%98%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D 0%B9_%D0%BA%D0%BE%D0%B4
    Последний раз редактировалось Sergey666; 10.08.2021 в 13:24.

  10. #110

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    saii
    Привет!
    Ну так чем всё закончилось?!
    Прочитал всю тему)) Вообще говоря, работоспособность модбаса в панельном ПК судя по твоим постам не обрадовала.
    По существу:
    1. Нашёл инфу, как работает планировщик?
    2. Планировщик делает асинхронные вызовы (запросы) и, возможно, из-за этого иногда "натыкается" "запрос" на "ответ"? 2000 ошибок непозволительно много. 1 - нормально. 0 - идеально.
    3. Выходит, кроме как "вручную" рисовать запросы\ответы более-менее вменяемого механизма опроса сейчас для СПК нет? Интересно, для МК210 будет всё также?
    4. 60% загрузки ПЛК только на опрос I\O?!??! Как по мне... это прям очень, очень много. Тоже решаю, какой ПЛК бы поставил себе в дом... Вот провести бы нагрузочное сравнительное тестирование в сравнении с тем же сименс S7-1200..
    5. Так как сейчас у тебя устроен поллинг? Запрос-Ответ, Запрос-Ответ?

    И да... Планировщик... Не разыта ли здесь собака как раз в том, что насколько я понимаю (не спец по кодесис, правда) - там всё в линуксе? Просто в ПК110 стоит некая RT-оболочка, позволяющая выполнять циклы "жестко", а планировщик - это уже больше из области управления ресурсами\контекстом, т.е. ближе к операционной системе, чем системам с "жестким циклом", тем это и чревато?
    Последний раз редактировалось Teemon; 28.09.2021 в 11:39.

Страница 11 из 13 ПерваяПервая ... 910111213 ПоследняяПоследняя

Похожие темы

  1. отключение звука нажатия СП307
    от vendor в разделе Панели оператора (HMI)
    Ответов: 2
    Последнее сообщение: 25.01.2018, 10:12
  2. Ответов: 5
    Последнее сообщение: 24.07.2017, 12:08
  3. Ответов: 0
    Последнее сообщение: 31.05.2017, 19:40
  4. Подтверждение нажатия
    от Carter в разделе Master SCADA 3
    Ответов: 9
    Последнее сообщение: 14.11.2016, 17:32
  5. Нечеткая логика в CoDeSys
    от Fallensky в разделе ПЛК1хх
    Ответов: 38
    Последнее сообщение: 09.07.2011, 14:01

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •