Просмотр полной версии : Организация программы для ПЛК (переход с AVR на ПЛК)
Здравствуйте люди добрые.
Обычно работаю с микроконтроллерами ATMEL AVR. Управление вентиляцией. Необходимо построить нечто подобное на ПЛК 160. Наш контроллер не имеет возможности диспетчеризации (RS485, Ethernet). В проекте был заложен ПЛК 160.
Никак не переключить свои мозги на работу с ПЛК.
Так вот на языке С делаю бесконечный цикл (main) с watchdog'ом в процессе которого по флагам выполняются определённые действия: управление исполнительными устройствами, получение температур, сканирование датчиков, вычисление регуляторов и т.д. Флаги устанавливаются в таймере с определённым периодом: получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду, управление ЖКИ 10 раз в секунду и т. д.
В обсуждении http://www.owen.ru/forum/showthread.php?t=8830 сказано что "Основное отличие надо прочувствовать: на Си цикл надо организовывать. В CoDeSys цикл надо тормозить - контроллер автоматически работает по циклу..."
В общем хожу-брожу вокруг да около как говорится...
Начал делать главную программу PLC-PRG в CFC. Думается как-то так:
4854
Не сообразить никак, дайте ниточку пожалуйста...
сложно вам придется)
совет для начала - это не CFC, а SFC. главную программу PLC_PRG не следует делать на этом языке. st, fbd, cfc - пожалуйста, но не sfc.
Ваш пример будет работать не так как Вам кажется, а именно Step2 включится через 1с и останется активным до выключения ПЛК, через 2с в дополнение к Step2, включится Step3 и останется активным до выключения ПЛК, через 3с в дополнение к Step2 и Step3, включится Step4 и останется активным до выключения ПЛК или пока переменная t1 не станет равной 0.
Т.е через 3с будут активны все шаги и будут выполняться все операнды, описанные в действиях этих шагов.
Если Вы хотели чтобы через 2c выполнялся Step3, а не Step2, то условие нужно описать более точно
для Step1 - (t1>=1s AND t1<2s).
Судя по тому, что Вы хотели
выполняются определённые действия: управление исполнительными устройствами, получение температур, сканирование датчиков, вычисление регуляторов и т.д. Флаги устанавливаются в таймере с определённым периодом: получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду, управление ЖКИ 10 раз в секунду и т. д. язык CFC не совсем подходит.
Создайте в дополнение к PLC_PRG другие POU (подпрограммы или Функц. блоки) каждый из которых будет выполняются определённые действия:
управление исполнительными устройствами, получение температур, сканирование датчиков, вычисление регуляторов и т.д. Флаги устанавливаются в таймере с определённым периодом: получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду, управление ЖКИ 10 раз в секунду и т. д.
и вызывайте их из PLC_PRG с заданной периодичностью с использованием таймеров.
Или используйте многозадачность как здесь 4856, пример не мой не помню у кого я его закачал. Смотреть нужно в конфигурации задач.
определённым периодом: получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду, управление ЖКИ 10 раз в секунду и т. д.
Фиксированные каналы, независимо от программиста будут обновлять значение каждый цикл ПЛК. Отображать данные с различной периодичностью задача не ПЛК, а СКАДА-систем
Для того, чтобы
переключить свои мозги на работу с ПЛК нужно прочитать литературу типа "ПЛК для начинающих" и ознакомиться с принципом работы классического ПЛК.
Это не свободно программируемое устройство, которое Вы разрабатывали раньше с использованием микропроцессоров или микроконтроллеров. В данном случае программа в ПЛК выполняется циклически с периодом называемом рабочим циклом с первой строки программы по последнюю (это очень утрированное утверждение, но смысл такой).
Для классического ПЛК рабочий цикл:
1. Сканирование физических входов и запоминание состояния входов на время рабочего цикла;
2. Выполняются строки программы с 1 по последнюю с учетом условных операторов и операторов переходов (переходы в программе снизу вверх не возможны). При этом в программе используются те состояния входов, которые были получены на шаге 1 и значения переменных которые были получены на предыдущем рабочем цикле. Выходные воздействия получаемые при выполнении строк программы запоминаются в специальном буфере выходов, а не записываются в физические выходы ПЛК.
3. Происходит запись значений из буфера в физические выходы ПЛК.
Отсюда и особенности программирования ПЛК и требования не использовать циклы в своей программе.
используйте многозадачность
Спасибо, посмотрю возможность применения. Для меня это гораздо понятнее.
Step2 включится через 1с и останется активным до выключения ПЛК, через 2с в дополнение к Step2, включится Step3 и останется активным до выключения ПЛК, через 3с в дополнение к Step2 и Step3, включится Step4 и останется активным до выключения ПЛК или пока переменная t1 не станет равной 0
Условия перехода просто так задал. Меня больше волнует сама идея построения цикла.
вызывайте их из PLC_PRG с заданной периодичностью с использованием таймеров
Может и так попоробую. Только вот кажется что не так это должно делаться.:o
на картинке полный бред конечно и это SFC а не CFC
для начала - это не CFC, а SFC
Очепятка конечно, сильно не пинайте...;)
Если я правильно понял про конфигуратор задач, картина должна получиться следующая:
4861
Каждая задача вызывается с необходимой частотой, задаваемой в свойствах задачи. Из каждой задачи вызывается соответствующая программа (можно и не одна).
Программы можно будет в крайнем случае и на ST написать - ближайший родственник языка С.
Поправьте меня если что не так.
Послушайте совета - начните с чтения литературы.
Ну зачем вообще все выносить в отдельные задачи?
Если я правильно понял про конфигуратор задач, картина должна получиться следующая
С точки зрения теории примерно так и есть. Только вроде название главной задачи не должно быть PLC_PRG, и ее тоже надо включить в конфигуратор задач как свободно выполняемую. Согласен с Aso,
Ну зачем вообще все выносить в отдельные задачи?Многозадачность отъедает ресурсы ПЛК.
Зачем?
получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду
Надо менять психологию, многое из того что Вы программировали для микроконтроллера, в ПЛК делает операционная система (встроенная среда исполнения). Все датчики и так сканируются автоматически с периодом цикла выполнения программы, если значение на входе ПЛК изменяется в середине цикла выполнения программы, то программа и не заметит это изменение, и почему нельзя в каждом цикле устанавливать значения на выходах ПЛК (например 100 раз подряд за одну сек. будет записываться значение "ВКЛ" или один раз в сек. какая разница?). Время измерения аналоговых величин зависит от железа ПЛК и тоже имеет конкретные значения.
То, что весь алгоритм управления разбит на отдельные POU, это правильно, причем не обязательно их все делать программами можно и функциональными блоками, ф.блоки те же подпрограммы. Можно на этапе разработки всей программы разрабатывать конкретные POU по частям. Сначала POU c пустым оператором (; например), а затем наполнять их постепенно коддом и главная программа будет работать практически сразу.
Николаев Андрей
13.10.2011, 08:20
Некоторые рекомендации (в принципе аккумулирующие все вышесказанное).
Контроллер уже работает в цикле.
Контроллер уже может управлять входами и выходами - Вам об этом думать в принципе не надо.
1. Настройте конфигурацию контроллера. Подключите датчики, отмасштабируйте, убедитесь, что работает.
2. Создайте простую программу на языке, аналогичном тому, на котором программировали AVR. Скорее всего это st (аналог паскаля). Простую - это не вентиляцию простую, а пустую программу, на которой можно посмотреть как работают таймеры, детекторы фронтов, счетчики. Как все это вызывается, запускается, сбрасывается.
3. PLC_PRG должна быть всегда в проекте, кроме тех случаев, когда Вы работаете с многозадачностью. В Вашем случае это абсолютно не нужно, так как у Вас все алгоритмы связаны между собой (управление тем, или инным узлом). Ну не логично клапан калорифера регулировать с одним периодом, а заслонки с другим... Зачем?
4. Для наглядности и простоты реализации можно делать программные модули (отдельные POU на любом удобном языке) аналоги библиотек для AVR. И уже вызывать эти блоки в основной программе.
Много примеров, в том числе как организовать вызов блоков можно найти на форуме, в разделе ПЛК\Примеры программ и полезности.
Многозадачность отъедает ресурсы ПЛК.
Другое дело. Понятно почему так не принято делать.
Надо менять психологию Вот над этим и бьюсь :)
получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду Всё это сделано для разгрузки микроконтроллера, чтобы не одновременно выполнять поставленные задачи поскольку ресурсов маловато.
Значит PLC-PRG по сути это последовательный набор действий - так называемый "прогон", связывающий входы с выходами, выполняемый с определённой цикличностью (CycleLenght ms).
Николаев Андрей
13.10.2011, 09:11
Еще раз - Вы не можете влиять на нагрузку ядра по опросу входов. Вы не работаете с физическими входами, как и с выходами.
Вы работаете только с образом памяти (МЭК память) содержащей значения входов и выходов.
Вы не можете влиять на нагрузку ядра по опросу входов Понял. Зато могу задать аппаратную (а не программную как делал с AVR) фильтрацию входных дискретных сигналов: Time of filtration in ms. Могу задать масштабирование аналоговых сигналов: Параметры канала. Очень по-моему удобно.
Получается что-то такое:
4862
Начинаю потихоньку менять психологию :)
если убрать штриховые стрелки, то будет похоже
Начинаю потихоньку менять психологию :)
Приветствую тебя, мой далекий коллега! Я оттуда же пришел к ПЛК, совесм недавно. Интересно теперь наблюдать, как это происходит :)
Особо психологию тут и не надо менять, если ты программировал на МК задачи реального времени. Одна из ошибок, которую я делал - переоценивал отличия. На самом деле, если взять грамотно написанную программу той же АВР-ки, в которой есть пофазное исполнение программы - то отличия только в наличии здесь ОС, обслуживающей входы-выходы.
Смотрим на страшилки, которыми автоматчики путают, и немного приглаживаем их. Здесь я умышленно придерживаюсь нестрогого изложения, да простят меня взрослые зубастые ПЛК-шники. Важно, чтобы родная душа меня поняла и двинулась вперед быстрее и проще. А там и сам поймешь, какую чушь я иногда говорю для понятности.
Итак,
1) Петля
Ну что тут особенного? Нужно знать, что ОС ПЛК уже организовала бесконечный цикл. Все, что ты делаешь обычно до своего цикла (а он всегда есть!), свои всякие init() - запихни в условную петлю, для которой теперь ТЫ САМ организуешь ОДНОКРАТНОЕ исполнение. И все. Больше об этой страшной петле не говорим.
2) Остановки
Да, нужно забыть о примочке типа стою, курю, жду повторения программного цикла стопитцот раз. Или жду, пока датчки не покажет событие. Так ты меня прости - об этом пора было забыть давным давно, если ты МК управлял реальной задачей с событиями. Там все равно создавалось либо пофазное прохождение, либо вообще ОСРВ в том или ином виде.
Здесь обслуживание событий в режиме "поставил слежение за флажком и полетел дальше" - the must
3) Возвраты
Вот уж не понимаю, что тут такого. Да можно вернуться куда ХОШЬ! Тот же цикл, например - это многочисленные возвраты. С учетом п.п. 1 и 2 о страшилке 3 можно вообще не думать
4) Конфигуратор ПЛК
Вот это нужно учитывать - но ты, вижу, уже в курсах. Для меня было проблемой просто понять, что вот так вот ручками поназывал переменные (илди просто создал табличку для себя) - и тепереь юзаешь эту область, не думая, как она там опрашивается.
ДОБАВИЛ: даже не так. С пользовательской точки зрения как раз все просто: обращайся себе к переменным из области ввода-вывода, НЕ ДУМАЯ ОБ ИХ ОСОБОМ СТАТУСЕ. Просто переменные. Я вот как раз придавал им некую исключительность, даже создавал копию в "обычном ОЗУ". Не нужно этого делать.
Единственное, что надо понять момент их использования исполняющей системой для ввода-вывода. Этот момент - за пределами твоей програмульки. Раз вся прога включена в цикл, то все, что наваял, будет проходиться за цикл контроллера (не факт, что исполняться, естественно, ведь есть же условные операторы, переключатели и прочее), а в это время входы-выходы НЕ ИЗМЕНЯЮТСЯ. Вот когда дойдешь до конца (а ОС сама перекинет в начало) - в этот таинственный момент выходы установятся, а входы опросятся.
Всего-то и делов.
А про SFC - это бомба! Попиши пока на ST, но потом обязательно вернись к нему.
И, конечно, коллеги правы. Поиграйся с простыми примерами. День-два, неделю-две - это уж как получится. Но без этого никак. Иначе скоро тебя начнут пинать ногами за вопросы, которые не возникают у прилежного ученика.
Вспомнл еще одну проблему. Отнесись флегматично к качеству документации и некоторым кострубастостям КоДеСис. Это нужно принять :)
Успехов!
Приветствую тебя, мой далекий коллега... Спасибо за понимание, коллега! :)
Смотрим на страшилки... Хорошо излагаете, коллега! :)
Итак, поступаю следующим образом:
1) Рисую на бумаге слева входы системы
_______датчики температуры - аналоговые входы;
_______пож.датчик, термостаты, переключатели, кнопки и т.д.- дискр.входы.
справа рисую выходы:
_______вкл/выкл приточного вентилятора;
_______вкл/выкл вытяжного вентилятора;
_______управление приводом подогрева воздуха;
_______управление приводом охлаждения воздуха и т.д.
2) Затем беру ручку и для каждого выхода пишу условия его работы (например для вентилятора):
Вентилятор должен включаться когда:
_______нет пожарной опасности;
_______нет опасности замерзания водяного калорифера в режиме "зима";
_______нет сработки датчика термозащиты вентилятора;
_______переключатель "вкл/выкл" находится в положении "вкл" и т.д.
3) Далее соединяю на листе входы и выходы с учётом п.2 с помощью стандартных библиотечных блоков.
Таким образом получаю именно структурную схему системы - это и есть программа ПЛК. В данном случае язык СFC получается.
Конечно, алгоритм весьма упрощён, и ещё необходимо приложить усилия чтобы "причесать" программу (отдельные блоки сделать макросами или подпрограммами), но наглядность по-моему очевидна.
Итак, поступаю следующим образом:
...
получаю именно структурную схему системы - это и есть программа ПЛК. В данном случае язык СFC получается.
Ну, я CFC не юзал, пусть настоящие спецы подскажут. Да, если реализуется просто логическая схема связи входов с выходами - такого рода представление будет удобно. Мне лично мало такое приходилось программировать, привык в задачам, "раскручивающимся во времени" - а тут уж SFC, мммммммм! лапочка.
Но все же, некоторые простые элементы есть смысл пробовать до того, как переходишь к предметной задаче. Или по ходу создавать левые проекты-примерчики. Я, например, со всяким таймерами и триггерами, со временнЫми пеерменными - постоянно создаю и проверяю. Тут есть камешки под водой (возьми, для примера, дурацкое называние триггером одновибратора - это ж в голову плохо лезет).
Но все же, некоторые простые элементы есть смысл пробовать до того, как переходишь к предметной задаче. Или по ходу создавать левые проекты-примерчики Полностью согласен. У меня в IAR проектик есть под названием "Debug" в котором все непонятки и решаю. Также и тут поступать буду.
такого рода представление будет удобно Я на электроприводе учился так что структурные схемы самое то :)
Валерий Бурик
14.10.2011, 21:36
Хочу тоже дать дельный совет. Так как и Вы я тоже пришел с МК51, а потом с AVR. Меня теперь и палкой не загонишь назад в микроконтроллеры! Совет такой, используйте визуализацию. Работу, в моем случае механизма, разбиваю на шаги в SFC. Переход на следующий шаг по условию с датчиков. В квадратиках пишу на ST. Таймеры, счетчики описываю в FB, там нагляднее видно. И самое главное параллельно рисую в визуализации. Накидал квадратиков - датчиков, описал их в конфигурации ПЛК, присвоил им конкретные адреса входов контроллера. Нарисовал кружочек- двигатель, присвоил выход контроллера. FALSE один цвет, TRUE другой (тревожный). Написал действие с входом и выходом. Запустил программу, если не ругается на ошибку, нажал курсором мышки на датчик и смотрю реакцию на двигатель, ага, получилось, иду дальше. Забыл сказать, сначала нужно нарисовать конкретную схему вашего устройства, где входа и выхода контроллера привяжете к реальным сигналам датчиков и исполнительным механизмам.
И как все повторюсь, начните с примеров. Начните с примера "Светофора" что в CodeSys, наберите его вручную. Здесь никак изучение не объедешь.
С уважением и успехов.
Николаев Андрей
14.10.2011, 23:16
Приветствую тебя, мой далекий коллега! Я оттуда же пришел к ПЛК, совесм недавно. Интересно теперь наблюдать, как это происходит :)
Особо психологию тут и не надо менять, если ты программировал на МК задачи реального времени. Одна из ошибок, которую я делал - переоценивал отличия. На самом деле, если взять грамотно написанную программу той же АВР-ки, в которой есть пофазное исполнение программы - то отличия только в наличии здесь ОС, обслуживающей входы-выходы.
Смотрим на страшилки, которыми автоматчики путают, и немного приглаживаем их. Здесь я умышленно придерживаюсь нестрогого изложения, да простят меня взрослые зубастые ПЛК-шники. Важно, чтобы родная душа меня поняла и двинулась вперед быстрее и проще. А там и сам поймешь, какую чушь я иногда говорю для понятности.
Итак,
1) Петля
Ну что тут особенного? Нужно знать, что ОС ПЛК уже организовала бесконечный цикл. Все, что ты делаешь обычно до своего цикла (а он всегда есть!), свои всякие init() - запихни в условную петлю, для которой теперь ТЫ САМ организуешь ОДНОКРАТНОЕ исполнение. И все. Больше об этой страшной петле не говорим.
2) Остановки
Да, нужно забыть о примочке типа стою, курю, жду повторения программного цикла стопитцот раз. Или жду, пока датчки не покажет событие. Так ты меня прости - об этом пора было забыть давным давно, если ты МК управлял реальной задачей с событиями. Там все равно создавалось либо пофазное прохождение, либо вообще ОСРВ в том или ином виде.
Здесь обслуживание событий в режиме "поставил слежение за флажком и полетел дальше" - the must
3) Возвраты
Вот уж не понимаю, что тут такого. Да можно вернуться куда ХОШЬ! Тот же цикл, например - это многочисленные возвраты. С учетом п.п. 1 и 2 о страшилке 3 можно вообще не думать
4) Конфигуратор ПЛК
Вот это нужно учитывать - но ты, вижу, уже в курсах. Для меня было проблемой просто понять, что вот так вот ручками поназывал переменные (илди просто создал табличку для себя) - и тепереь юзаешь эту область, не думая, как она там опрашивается.
ДОБАВИЛ: даже не так. С пользовательской точки зрения как раз все просто: обращайся себе к переменным из области ввода-вывода, НЕ ДУМАЯ ОБ ИХ ОСОБОМ СТАТУСЕ. Просто переменные. Я вот как раз придавал им некую исключительность, даже создавал копию в "обычном ОЗУ". Не нужно этого делать.
Единственное, что надо понять момент их использования исполняющей системой для ввода-вывода. Этот момент - за пределами твоей програмульки. Раз вся прога включена в цикл, то все, что наваял, будет проходиться за цикл контроллера (не факт, что исполняться, естественно, ведь есть же условные операторы, переключатели и прочее), а в это время входы-выходы НЕ ИЗМЕНЯЮТСЯ. Вот когда дойдешь до конца (а ОС сама перекинет в начало) - в этот таинственный момент выходы установятся, а входы опросятся.
Всего-то и делов.
А про SFC - это бомба! Попиши пока на ST, но потом обязательно вернись к нему.
И, конечно, коллеги правы. Поиграйся с простыми примерами. День-два, неделю-две - это уж как получится. Но без этого никак. Иначе скоро тебя начнут пинать ногами за вопросы, которые не возникают у прилежного ученика.
Вспомнл еще одну проблему. Отнесись флегматично к качеству документации и некоторым кострубастостям КоДеСис. Это нужно принять :)
Успехов!
Вот ей богу порадовали.
Респект;)
Дорогие коллеги: ещё вопрос, если можно :o
Система ПЛК160 (Slave) - ИП320 (Master). В конфигурации ПЛК выбираю "Modbus (slave)" и начинаю "забивать" туда сетевые переменные. Эти переменные, насколько я понял из документации, являются Retain.
В Global_Variables при объявлении Retain-переменных пишем например "Water_Actuator_Type:INT:=1;" и всё.
Никак не сообразить: как задать начальное значение сетевой переменной?
можете объявить переменные не в самой конфигурации, а в тех же глобальных видом
perem1 AT %QW10.32.0 : int := -125;
где %QW10.32.0 - адрес модуля 2 byte в конфигурации
p.s. только учтите, что панель ип320 вам перезапишет нулями эти переменные на старте программы
...панель ип320 вам перезапишет нулями эти переменные на старте программы
Даже если так объявить? Только на старте?
В AVR-контроллерах задание начальных значений для eeprom-переменных в инициализацию "запихнул" - и дело в шляпе...
Есть ли ещё какие-то способы?
только на старте. способы чего?
способы чего?
...как задать начальное значение сетевой переменной.
Т.е. нужно сесть и сделать таблицу сетевых переменных, для каждой переменной указать её адрес, тип, начальное значение, и номер регистра ПЛК, где будет храниться переменная: я правильно понимаю?
если вы подразумеваете под "сетевыми переменными" переменные для передачи инфы в панель, то как таковыми сетевыми они не являются.
простой пример: вам надо передать на панель цифровое int значение. вы добавляете в конфигурации плк модуль modbus slave, настраиваете связь, затем "по-простому" именуете 2 byte именем вашей переменной. вместо этого можно тоже самое сделать сразу в глобальных. но добавлять модуль modbus slave и все необходимые 2 byte все равно надо. как это сделать - см. пост #23
если вы подразумеваете под "сетевыми переменными" переменные для передачи инфы в панель
Да, подразумеваю.
...добавляете в конфигурации плк модуль modbus slave, настраиваете связь, затем "по-простому" именуете 2 byte именем вашей переменной
Так и делаю. Причём эта операция то же самое что и Вы указали выше:
тоже самое сделать сразу в глобальных.
НО: насколько я понял, при помощи конфигурации начальное значение не задать. И это можно сделать в Global_Variables(RETAIN) c указанием адреса (пост #23). По-моему не очень удобно получается...
НО: насколько я понял, при помощи конфигурации начальное значение не задать.
насколько я знаю - да, не задать
И это можно сделать в Global_Variables(RETAIN) c указанием адреса (пост #23). По-моему не очень удобно получается...
можно без ретайн. область обмена из конфигурации (модбас слэйв или мастер) автоматом сохраняется в ретайн.
выбор за вами. по-моему наоборот удобнее так - сразу видно что за переменная, какой имеет тип, начальное значение можно задать, комментарий. а в конфигурации надо все время раскрывать этот 2 byte
В общем буду делать так:
1) В конигурации ПЛК в ModBus(slave) "забиваю" переменные необходимые для отправки на панель с несколько изменёнными именами. Если имена переменных будут одинаковые - компилятор ругается.
5028
2) В Global_Variables(RETAIN) задаю переменную с таким же адресом уже с начальным значением:
PVent_Enable AT %QX7.1.0.0: BOOL := TRUE;
По крайней мере так работает.
А если в системных событиях, взять событие старт, установить галочку и создать этому событию функцию, в которой переменной из модбас присвоить начальное значение, так не получится?
В общем буду делать так:
1) В конигурации ПЛК в ModBus(slave) "забиваю" переменные необходимые для отправки на панель с несколько изменёнными именами. Если имена переменных будут одинаковые - компилятор ругается.
5028
2) В Global_Variables(RETAIN) задаю переменную с таким же адресом уже с начальным значением:
PVent_Enable AT %QX7.1.0.0: BOOL := TRUE;
По крайней мере так работает.
и какой смысл в дублировании переменных?
А если в системных событиях, взять событие старт, установить галочку и создать этому событию функцию, в которой переменной из модбас присвоить начальное значение, так не получится?
Спасибо за идею. Получается, но не всё.
Выбираем событие старт, устанавливаем галочку, справа пишем название POU (например INIT), которое будет вызываться при событии СТАРТ. В самом POU пишем что нам надо.
Далее в PLC-PRG(CFC) вводим элемент с названием INIT. После изучения документации на библиотеку SysLibCallback получаем:
5033
Так и не понял: что такое dwFilter.
Всё компилируется и работает, однако при попытке изменения модбас переменной из конфигуратора, она снова принимает прежнее значение. :(
Коллеги: что делаю не так?
а зачем её где то еще добавлять, ПЛК стартует, наступает событие старт, выполняется единожды функция, где Вы не смотря на область объявления, присваиваете нужным переменным свои первоначальные значения и все.
загрузите прогу, после старта задайте какой-нибудь переменной отличное от начального значение, нажмите стоп потом старт и переменная должна обновится до первоначального
а зачем её где то еще добавлять, ПЛК стартует, наступает событие старт, выполняется единожды функция В том-то и дело, что функция почему-то не выполняется, ни единожды, ни циклически - вообще никак.
Что ещё нужно сделать помимо
Выбираем событие старт, устанавливаем галочку, справа пишем название POU (например INIT), которое будет вызываться при событии СТАРТ. В самом POU пишем что нам надо. Или как правильно вызвать эту самую функцию?
вроде все правильно, у меня работает, смотрите видео
Вроде всё правильно, а у меня не работает. Проект в студию:
5043
Отслеживаю модбас переменную PVent_Enable.
Целевая платформа выбрана PLC160-L.
5044
и какой смысл в дублировании переменных?
Как такового дублирования не происходит. При таком объявлении
В Global_Variables(RETAIN) задаю переменную с таким же адресом уже с начальным значением никаких новых переменных не появляется - проверил по данным компиляции (Использовано данных: Энергонезависимых данных: )
Поскольку событие СТАРТ у меня почему-то не работает, остаётся действовать таким способом (пост #30).
:) не сдавайтесь, в конфигурации ПЛК есть еще модуль статистика, а там битовый канал "Power Status", его привязываете к такому коду
rtg(CLK:=power_status);
IF rtg.Q THEN INIFUN(0,0,0); END_IFгде rtg - это R_TRIG,а INIFUN та функция где устанавливаете первоначальные значения
Загадка разрешилась. EVENT_START и POWER_STATUS работают.
Ключик: режим эмуляции нужно убрать. Работает только с реальным контроллером (online)!
Спасибо capzap и swerder за помощь :)
Загадка разрешилась. EVENT_START и POWER_STATUS работают.
Ключик: режим эмуляции нужно убрать. Работает только с реальным контроллером (online)!
А вот у меня что-то не получается с модулем Статистика. запускаю с реальным ПЛК, в онлайн вижу нулевые значения всех переменных. Что не так?
5117
А вот у меня что-то не получается с модулем Статистика. запускаю с реальным ПЛК, в онлайн вижу нулевые значения всех переменных. Что не так?
5117
одна из причин может быть то, что после перепрошивки ПЛК, необходимо переустановить по новой в КДС таргеты и обновить проект
фигасе... Переустановка трагета, ЕМНИП, очищает конфигурацию ПЛК?
Николаев Андрей
27.11.2011, 13:44
CiDeSys не надо, а вот Target поди старый остался...
Ну и в любом случае надо делать - стандартная конфигурация...
Коллеги, вы бы как-то понятнее... Не пойму, что нужно обновлять.
В рабочий проект добавив в Конф. ПЛК модуль Статистика.
Скомпилировал, загрузил. Переменные - нули.
Сделал загрузочный проект, все сбросил, запустил. Нули.
Перезапустил КДС, открыл проект, сделал ОНЛАЙН. Сбросил ПЛК, запустил. Нули.
Потанцевал с бубном. Обратился к духам. Духи, что мне делать?
Еще раз, импликативные вы мои. Вы либо знаете, либо нет, а я точно не знаю. Давайте разберемся.
Включение в ДЕЙСТВУЮЩИЙ проект модуля Статистика - что требует, кроме создания его в Конфигураторе, затем компиляции проекта и затем создания загрузочного модуля?
Господи помилуй, вот о какой перепрошивке идет речь! Нет, не перепрошивал никогда. Значит... все должно работать?
надеюсь не в эмуляторе проверяете
ну как бы да,
Не хочется лезть в Конфигуратор задач. Там тоже есть что-то, которое можно вылавливать. Но при существующей документации раскапывать нюансы - себе дороже.
Да и вообще, флаг POWER STATUS придуман именно для таких ситуаций, что я отлавливаю. Поэтому хочется сделать все канонически, без вывертов.
Николаев Андрей
27.11.2011, 15:36
Понял, понял.
Прошивка контроллера на менялась. Вы поменяли только программу на CoDeSys.
Какая версия прошивки контроллера и версия Target файла?
Модуль statistica не работал (все нули) только при несоответствии версии ПРОШИВКИ (не программы) контроллера и Target файла.
Какая версия прошивки контроллера и версия Target файла?
Контроллер:
5119
А как узнать версию таргет-файла?
удалить таргеты на ПЛК100 и поставить их заново,
Это что именно надо сделать? Я не понимаю. Тагрет-файлы - это просто файлы где-то в недрах компа. В КоДеСис разве есть ЗАГРУЖЕННЫЕ таргеты?
Если честно, то мне этот танец не нравится.
1. Смысла особого не вижу - ибо мой ПЛК имеет достаточно неновую прошивку и модуль статистики не есть нанотехнология, которую вот только что добавили...
2. А вот риски есть. Матюкнется КДС, слетит конфигурация - и опять ее ручками? Ну, там можно внимательно смотреть по ходу пьесы и попытаться не допустить летального исхода... Но, с учетом п.1, я подожду других предложений.
:) если стоит винда семерка
Да, и я в упор не могу найти у себя Гипертерминал. Это капец какой-то! Может подскажешь, раз уж речь зашла о нетленном творении товарища Билла?
Да, и я в упор не могу найти у себя Гипертерминал. Это капец какой-то! Может подскажешь, раз уж речь зашла о нетленном творении товарища Билла?[/QUOTE]
Гипертерминала, к огромному сожалению ("респект" Билли) в семёрке нет.
Николаев Андрей
27.11.2011, 22:27
Гипера нет начиная с вистаса - это плохо.
А вот то, что он просто копируется из ХР и переносится без установки на vista - хорошо :) :) :)
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot