Страница 4 из 5 ПерваяПервая ... 2345 ПоследняяПоследняя
Показано с 31 по 40 из 44

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

  1. #31

    По умолчанию

    Вкину свои 5 копеек.

    Были слегка подобные случаи, в общем в конфигурацию ПЛК м02 постепенно по мере прироста оборудования добавлялись модули вывода МВ210-403. И вот в один день уже под конец раб. дня добавил ещё один мв210-403, причём сделал это копированием т.е. новый модуль в конфигурации встал между двумя последними модулями но т.к. надо было уже уезжать с объекта, я его добавил, потыкал оборудование, проверил что всё работает и решил, что в следующий раз займусь его окончательной настройкой и полной проверкой, а сейчас откачусь на прежнюю рабочую прошивку. Короче просто удалил его из конфигурации, перезалил прежнюю программу на ПЛК, которая до это стабильно работала, и каково же было моё удивление, что сразу после перезаливки у меня самопроизвольно включились выходы на последнем модуле вывода. И были включены пока я не нажал "Старт", я опять также добавил новый модуль в конфигурацию, залил с новым модулем и всё нормально. Удалил его, и снова опять те же выходы сработали на последнем модуле. но т.к. времени уже было в обрез, разбираться не стал, просто добавил новый модуль и оставил так.

    Я слабо себе представляю как там организовано адресное пространство, что с чем взаимодействует, и что на что влияет. Но у меня сложилось впечатление, что когда я воткнул новый модуль между двумя последними, а потом его удалил, то последний модуль вывода "переехал" на место предпоследнего, который я удалил, и там остались какие-то данные в том адресном пространстве, которые обнулились только после запуска основной программы.

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

  2. #32

    По умолчанию

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

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

    Частный случай использования указателей, как принципиального способа структурирования данных - это массивы.
    И тогда ваша запись вида:
    Код:
    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.

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

    По умолчанию

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

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

  4. #34

    По умолчанию

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

    Thanks, cap.

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

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

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

    По умолчанию

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

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

  6. #36

    По умолчанию

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

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

  7. #37

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Каким боком картинка к этому проекту ?
    Тот проект и те условия - где ?
    Я извиняюсь, все-таки год прошел. На сервере, оказывается, этой версии уже не было. Достал старый ноут, на нем нашел. Версия из письма в техподдержку во вложении. (Справедливости ради - отличия непринципиальные).
    Номера строк теперь совпадают с картинкой.
    Цитата Сообщение от Валенок Посмотреть сообщение
    И напоследок, после чего [-----Контроль перекрытия областей памяти -------] копаться в поведении 500 строк только PLC_PRG только мазохисты будут
    Согласен, проект не миниатюрный. Но вообще-то, речь идет о единственной логической переменной cmd_screw_lower, значение которой используется в единственном вызове ФБ screw_lower_ctrl и более нигде. Причем все присваивания (только значения TRUE) ей делаются выше по коду, до вызова ФБ.
    На загадочном скриншоте как раз видно, что ФБ вызывается со значением FALSE, и в то же время сам ФБ говорит, что вызван со значением TRUE. Эту загадку я решить не смог.

    Насчет перекрытия областей памяти, выдаваемых компилятором. В данном случае это не ошибка. Таким образом я задаю псевдонимы для переменных, работающих с панелью. На разных экранах используются разные имена для одних и тех же адресов (экономия регистров МОДБАС). Просто взгляните в VAR_GLOBAL, и все станет ясно.

    Про указатели я из любопытства спросил. Уже пятнадцатый год контроллеры программирую, ни разу не понадобились. Вот и интересно, зачем их люди применяют. (Объяснять, что такое указатели - не надо.)
    Вложения Вложения
    Последний раз редактировалось Евгений Пашигоров; 01.04.2021 в 14:13.

  8. #38

    По умолчанию

    Цитата Сообщение от 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. #39

    По умолчанию

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

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

  10. #40

    По умолчанию

    Верно. Я невнимателен. Ваш способ проще. (Самое смешное, что там рядом в коде есть и работа с битами!) Но тут все зависит от компилятора. Если он понимает степени двойки, то окончательный код может и не отличаться.
    Я вот тут недавно запихивал данные в слово в троичной системе. Со степенями тройки вариант с битами не прокатывает.

Страница 4 из 5 ПерваяПервая ... 2345 ПоследняяПоследняя

Похожие темы

  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, 18:21

Ваши права

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