Показано с 1 по 10 из 44

Тема: работа несколько функциональных блоков (PID_FUNCTION) на ПЛК110-60 М2

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    15.06.2012
    Адрес
    Витебск
    Сообщений
    28

    По умолчанию

    Цитата Сообщение от Евгений Пашигоров Посмотреть сообщение
    Это не "ля-ля с картинками", а отладчик, в котором видно, что в основной программе вызывается экземпляр ФБ с IN := false, а внутри экземпляра этого ФБ вход IN имеет значение true в это же самое время!
    Такое возможно только если меняли таргеты, большой кусок кода ещё что-то тогда нужно сделать "Очистить всё" и перекомплировать проект и всё станет в норму. Если это делали, то 100% ошибка в коде которую вы не можете найти. Может где-то в другом куске программы присваиваете этому фб на вход IN:=TRUE. Сами же пишете что первый раз переписали ФБ и стало норм. Не совсем понятное для меня использование Case и таймеров внутри условий(что тоже нужно делать аккуратно).
    Согласен с Валенком тоже используем большое количество ФБ с указателями и без. И никогда не было проблем с распределением памяти только собственные ошибки.

  2. #2

    По умолчанию

    Цитата Сообщение от TOPan Посмотреть сообщение
    Такое возможно только если меняли таргеты, большой кусок кода ещё что-то тогда нужно сделать "Очистить всё" и перекомплировать проект и всё станет в норму.
    Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".

    Цитата Сообщение от TOPan Посмотреть сообщение
    Может где-то в другом куске программы присваиваете этому фб на вход IN:=TRUE. Сами
    же пишете что первый раз переписали ФБ и стало норм.
    Все изменения команды на вход делаются выше по коду. Потом один раз вызывается этот ФБ.
    Цитата Сообщение от TOPan Посмотреть сообщение
    Не совсем понятное для меня использование Case и таймеров внутри условий(что тоже нужно делать аккуратно).
    Мне тоже непонятно ваше высказывание. Пришла команда отработать цилиндру - включить таймер, надо считать время работы цилиндра.
    А CASE и IF вообще братья-близнецы. CASE только намного лучше читается.
    Цитата Сообщение от TOPan Посмотреть сообщение
    тоже используем большое количество ФБ с указателями и без. И никогда не было проблем с распределением памяти только собственные ошибки.
    Непонятная мне необходимость в указателях! А зачем они вам?
    Цитата Сообщение от TOPan Посмотреть сообщение
    Если это делали, то 100% ошибка в коде которую вы не можете найти.
    Это точно. Ошибку не нашел.
    Вложения Вложения
    Последний раз редактировалось Евгений Пашигоров; 31.03.2021 в 10:39.

  3. #3

    По умолчанию

    Цитата Сообщение от Евгений Пашигоров Посмотреть сообщение
    Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".

    Непонятная мне необходимость в указателях! А зачем они вам?
    Чтобы можно было оперировать не целиком данными, а указателями на них, но это достаточно сложное для понимания колдунство. Утрированный пример таков: есть два человека в отеле, которые хотят поговорить (обменяться данными), и можно их друг с другом свести лицом к лицу т.е. доставить целиком человека из одного номера в другой, материально переместить, и есть телефонистка, которая может просто соединить телефонное гнездо первого человека с телефонным гнездом второго человека, и произойдёт передача данных от одного человека к другому. Указатели используются для достижения полиморфизма, когда вам, грубо говоря, не важен сам человек, а важен человек в том номере, с которым соединит телефонистка, а будет там мужчина, женщина или ребёнок не так принципиально, утрировано как-то так.

    Частный случай использования указателей, как принципиального способа структурирования данных - это массивы.
    И тогда ваша запись вида:
    Код:
    PROGRAM temperature_ctrl
    VAR
    	pwm1chan,
    	pwm2chan,
    	pwm3chan,
    	pwm4chan,
    	pwm5chan,
    	pwm6chan,
    	pwm7chan,
    	pwm8chan: PWM_B;
    END_VAR
    превращается в:
    Код:
    pwmchan: array[1..8] of PWM_B;
    А конструкция вида:

    (
    Код:
    *формируем код устройства*)
    ...
    panel_error1 :=
    BOOL_TO_INT(cmd_l_mould_forw OR cmd_l_mould_back
    	OR cmd_l_mould_open OR cmd_l_mould_close) * 1 +		(*левая форма*)
     BOOL_TO_INT(cmd_r_mould_forw OR cmd_r_mould_back
    	OR cmd_r_mould_open OR cmd_r_mould_close) * 2 +	(*правая форма*)
    BOOL_TO_INT(cmd_screw_rising OR cmd_screw_lower) * 4 +...	(*шнек*)
     ...
    Превращается в:
    Код:
    panel_error1.0:=cmd_l_mould_forw OR cmd_l_mould_back OR cmd_l_mould_open OR cmd_l_mould_close;
    panel_error1.1:=cmd_r_mould_forw OR cmd_r_mould_back OR cmd_r_mould_open OR cmd_r_mould_close;
    ...
    т.е. не целиком числовые значения перемещать, переммножать и суммировать в переменные, а работать напрямую с битами.
    Последний раз редактировалось Parovoz; 01.04.2021 в 06:50.

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    Цитата Сообщение от Parovoz Посмотреть сообщение
    Частный случай использования указателей, как принципиального способа структурирования данных - это массивы.
    всё нижеизложенное это вообще не указатель
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    всё нижеизложенное это вообще не указатель
    Да, лааааадно. Чё серьёзно? Не может быть...

    Thanks, cap.

    Речь шла о самом принципе использования указателей, а не о "POINTER TO"

    Автор то массивами не пользуется, а также булевыми функциями через раз, привык всё на пальцах считать количественным исчислением, что 3 - это не первые два бита истинные, а только 1+2, а вы ему тут про указатели адресные и динамическое выделение памяти...
    Последний раз редактировалось Parovoz; 01.04.2021 в 08:33.

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    Цитата Сообщение от Parovoz Посмотреть сообщение
    а вы ему тут про указатели адресные и динамическое выделение памяти...
    покажите где я ему про...
    перечитайте, это я Вам предложил не вводить в заблуждение
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    покажите где я ему про...
    перечитайте, это я Вам предложил не вводить в заблуждение
    Чтобы не было путаницы, Ты ему нигде.
    Вы - это обращение к обществу присутствующих здесь людей, а не к тебе лично. Извиняюсь за фамильярность, но так понятнее.

    Про указатели и динамическую память тему завёл TOPan.

  8. #8

    По умолчанию

    Цитата Сообщение от Parovoz Посмотреть сообщение
    А конструкция вида:

    (
    Код:
    *формируем код устройства*)
    ...
    panel_error1 :=
    BOOL_TO_INT(cmd_l_mould_forw OR cmd_l_mould_back
    	OR cmd_l_mould_open OR cmd_l_mould_close) * 1 +		(*левая форма*)
     BOOL_TO_INT(cmd_r_mould_forw OR cmd_r_mould_back
    	OR cmd_r_mould_open OR cmd_r_mould_close) * 2 +	(*правая форма*)
    BOOL_TO_INT(cmd_screw_rising OR cmd_screw_lower) * 4 +...	(*шнек*)
     ...
    Превращается в:
    Код:
    panel_error1.0:=cmd_l_mould_forw OR cmd_l_mould_back OR cmd_l_mould_open OR cmd_l_mould_close;
    panel_error1.1:=cmd_r_mould_forw OR cmd_r_mould_back OR cmd_r_mould_open OR cmd_r_mould_close;
    ...
    Не превращается.
    В данном фрагменте кода производится запись кучи ошибок в одно 16-битное слово для передачи в панель.

  9. #9

    По умолчанию

    Цитата Сообщение от Евгений Пашигоров Посмотреть сообщение
    Не превращается.
    В данном фрагменте кода производится запись кучи ошибок в одно 16-битное слово для передачи в панель.
    Ещё как превращается, потому что, что сверху, что снизу один и тот же результат произведённый разными способами.

    Только в вашем случае вы превращаете булевые значения в целочисленные, используя степени числа 2 согласно номерам битов в слове, а затем суммируете чтобы получить итоговое значение, а в моем я сразу пишу эти биты в переменную согласно номерам этих битов. Результат один и тот же только действий, что для вас, что для контроллера меньше.
    Последний раз редактировалось Parovoz; 01.04.2021 в 20:49.

  10. #10
    Пользователь
    Регистрация
    15.06.2012
    Адрес
    Витебск
    Сообщений
    28

    По умолчанию

    Цитата Сообщение от Евгений Пашигоров Посмотреть сообщение
    Пунктом "Очистить все" действительно, я не пользуюсь (даже не знаю, что он делает). Всегда делаю "Компилировать все".

    Все изменения команды на вход делаются выше по коду. Потом один раз вызывается этот ФБ.
    Мне тоже непонятно ваше высказывание. Пришла команда отработать цилиндру - включить таймер, надо считать время работы цилиндра.
    А CASE и IF вообще братья-близнецы. CASE только намного лучше читается.

    Непонятная мне необходимость в указателях! А зачем они вам?

    Это точно. Ошибку не нашел.
    1) Полностью очищает папку с проектом и при следующей компиляции происходит полная "сборка проекта" с нуля - онлайн изменения при этом невозможны. Пару раз встречалась такая ситуация. Если у вас не было ошибок в коде 100% должно было бы помочь.
    2) Про таймеры встречал что-то наподобие такого кода и потом люди удивлялись почему выход на таймере выдаёт TRUE. (Там было нечто похожее только IF'ов было больше человек потерялся).
    VAR
    x: BOOL:=TRUE;
    tTON: TON;
    END_VAR
    IF x THEN
    tTON(IN:=x, PT:=T#10s);
    x:=FALSE;
    END_IF
    tTON();
    3) Про Case по мне так не очень читабельно получилось - но тут дело каждого.
    4) При опросе устройств с Modbus, нестандартными протоколами приходит ответ, который зачастую нужно разбирать и переставлять байты чтобы получить значение. Можно передавать указатель на структуру в которой хранятся нужные данные для ФБ и т.д. Уменьшает количество кода и вероятнее скорость обработки данных, но это лишь моё предположение)

Похожие темы

  1. Написание функциональных блоков
    от bobovich в разделе Среда программирования OWEN Logic
    Ответов: 10
    Последнее сообщение: 11.11.2020, 17:35
  2. Ответов: 15
    Последнее сообщение: 25.06.2020, 11:42
  3. Макс. число функциональных блоков
    от diman_ob_304 в разделе Программируемые реле
    Ответов: 3
    Последнее сообщение: 18.10.2017, 00:31
  4. Ответов: 1
    Последнее сообщение: 27.04.2017, 21:07
  5. Ответов: 13
    Последнее сообщение: 10.07.2009, 17:21

Ваши права

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