PDA

Просмотр полной версии : Организация программы для ПЛК (переход с AVR на ПЛК)



morcat
12.10.2011, 11:27
Здравствуйте люди добрые.

Обычно работаю с микроконтроллерами 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

Не сообразить никак, дайте ниточку пожалуйста...

swerder
12.10.2011, 12:16
сложно вам придется)
совет для начала - это не CFC, а SFC. главную программу PLC_PRG не следует делать на этом языке. st, fbd, cfc - пожалуйста, но не sfc.

petera
12.10.2011, 12:44
Ваш пример будет работать не так как Вам кажется, а именно 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, пример не мой не помню у кого я его закачал. Смотреть нужно в конфигурации задач.

capzap
12.10.2011, 13:21
определённым периодом: получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду, управление ЖКИ 10 раз в секунду и т. д.
Фиксированные каналы, независимо от программиста будут обновлять значение каждый цикл ПЛК. Отображать данные с различной периодичностью задача не ПЛК, а СКАДА-систем

petera
12.10.2011, 13:21
Для того, чтобы
переключить свои мозги на работу с ПЛК нужно прочитать литературу типа "ПЛК для начинающих" и ознакомиться с принципом работы классического ПЛК.
Это не свободно программируемое устройство, которое Вы разрабатывали раньше с использованием микропроцессоров или микроконтроллеров. В данном случае программа в ПЛК выполняется циклически с периодом называемом рабочим циклом с первой строки программы по последнюю (это очень утрированное утверждение, но смысл такой).
Для классического ПЛК рабочий цикл:
1. Сканирование физических входов и запоминание состояния входов на время рабочего цикла;
2. Выполняются строки программы с 1 по последнюю с учетом условных операторов и операторов переходов (переходы в программе снизу вверх не возможны). При этом в программе используются те состояния входов, которые были получены на шаге 1 и значения переменных которые были получены на предыдущем рабочем цикле. Выходные воздействия получаемые при выполнении строк программы запоминаются в специальном буфере выходов, а не записываются в физические выходы ПЛК.
3. Происходит запись значений из буфера в физические выходы ПЛК.
Отсюда и особенности программирования ПЛК и требования не использовать циклы в своей программе.

morcat
12.10.2011, 13:34
используйте многозадачность
Спасибо, посмотрю возможность применения. Для меня это гораздо понятнее.

Step2 включится через 1с и останется активным до выключения ПЛК, через 2с в дополнение к Step2, включится Step3 и останется активным до выключения ПЛК, через 3с в дополнение к Step2 и Step3, включится Step4 и останется активным до выключения ПЛК или пока переменная t1 не станет равной 0
Условия перехода просто так задал. Меня больше волнует сама идея построения цикла.

вызывайте их из PLC_PRG с заданной периодичностью с использованием таймеров
Может и так попоробую. Только вот кажется что не так это должно делаться.:o

на картинке полный бред конечно и это SFC а не CFC

для начала - это не CFC, а SFC
Очепятка конечно, сильно не пинайте...;)

morcat
12.10.2011, 15:20
Если я правильно понял про конфигуратор задач, картина должна получиться следующая:

4861

Каждая задача вызывается с необходимой частотой, задаваемой в свойствах задачи. Из каждой задачи вызывается соответствующая программа (можно и не одна).

Программы можно будет в крайнем случае и на ST написать - ближайший родственник языка С.

Поправьте меня если что не так.

ASo
12.10.2011, 15:40
Послушайте совета - начните с чтения литературы.
Ну зачем вообще все выносить в отдельные задачи?

petera
12.10.2011, 17:13
Если я правильно понял про конфигуратор задач, картина должна получиться следующая
С точки зрения теории примерно так и есть. Только вроде название главной задачи не должно быть 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. И уже вызывать эти блоки в основной программе.

Много примеров, в том числе как организовать вызов блоков можно найти на форуме, в разделе ПЛК\Примеры программ и полезности.

morcat
13.10.2011, 08:44
Многозадачность отъедает ресурсы ПЛК.
Другое дело. Понятно почему так не принято делать.

Надо менять психологию Вот над этим и бьюсь :)

получение температур 1 раз в секунду, сканирование датчиков 100 раз в секунду, вычисление регуляторов 1 раз в секунду Всё это сделано для разгрузки микроконтроллера, чтобы не одновременно выполнять поставленные задачи поскольку ресурсов маловато.

Значит PLC-PRG по сути это последовательный набор действий - так называемый "прогон", связывающий входы с выходами, выполняемый с определённой цикличностью (CycleLenght ms).

Николаев Андрей
13.10.2011, 09:11
Еще раз - Вы не можете влиять на нагрузку ядра по опросу входов. Вы не работаете с физическими входами, как и с выходами.
Вы работаете только с образом памяти (МЭК память) содержащей значения входов и выходов.

morcat
13.10.2011, 09:56
Вы не можете влиять на нагрузку ядра по опросу входов Понял. Зато могу задать аппаратную (а не программную как делал с AVR) фильтрацию входных дискретных сигналов: Time of filtration in ms. Могу задать масштабирование аналоговых сигналов: Параметры канала. Очень по-моему удобно.

Получается что-то такое:

4862

Начинаю потихоньку менять психологию :)

swerder
13.10.2011, 11:08
если убрать штриховые стрелки, то будет похоже

drvlas
14.10.2011, 08:07
Начинаю потихоньку менять психологию :)
Приветствую тебя, мой далекий коллега! Я оттуда же пришел к ПЛК, совесм недавно. Интересно теперь наблюдать, как это происходит :)

Особо психологию тут и не надо менять, если ты программировал на МК задачи реального времени. Одна из ошибок, которую я делал - переоценивал отличия. На самом деле, если взять грамотно написанную программу той же АВР-ки, в которой есть пофазное исполнение программы - то отличия только в наличии здесь ОС, обслуживающей входы-выходы.

Смотрим на страшилки, которыми автоматчики путают, и немного приглаживаем их. Здесь я умышленно придерживаюсь нестрогого изложения, да простят меня взрослые зубастые ПЛК-шники. Важно, чтобы родная душа меня поняла и двинулась вперед быстрее и проще. А там и сам поймешь, какую чушь я иногда говорю для понятности.
Итак,

1) Петля
Ну что тут особенного? Нужно знать, что ОС ПЛК уже организовала бесконечный цикл. Все, что ты делаешь обычно до своего цикла (а он всегда есть!), свои всякие init() - запихни в условную петлю, для которой теперь ТЫ САМ организуешь ОДНОКРАТНОЕ исполнение. И все. Больше об этой страшной петле не говорим.

2) Остановки
Да, нужно забыть о примочке типа стою, курю, жду повторения программного цикла стопитцот раз. Или жду, пока датчки не покажет событие. Так ты меня прости - об этом пора было забыть давным давно, если ты МК управлял реальной задачей с событиями. Там все равно создавалось либо пофазное прохождение, либо вообще ОСРВ в том или ином виде.
Здесь обслуживание событий в режиме "поставил слежение за флажком и полетел дальше" - the must

3) Возвраты
Вот уж не понимаю, что тут такого. Да можно вернуться куда ХОШЬ! Тот же цикл, например - это многочисленные возвраты. С учетом п.п. 1 и 2 о страшилке 3 можно вообще не думать

4) Конфигуратор ПЛК
Вот это нужно учитывать - но ты, вижу, уже в курсах. Для меня было проблемой просто понять, что вот так вот ручками поназывал переменные (илди просто создал табличку для себя) - и тепереь юзаешь эту область, не думая, как она там опрашивается.
ДОБАВИЛ: даже не так. С пользовательской точки зрения как раз все просто: обращайся себе к переменным из области ввода-вывода, НЕ ДУМАЯ ОБ ИХ ОСОБОМ СТАТУСЕ. Просто переменные. Я вот как раз придавал им некую исключительность, даже создавал копию в "обычном ОЗУ". Не нужно этого делать.
Единственное, что надо понять момент их использования исполняющей системой для ввода-вывода. Этот момент - за пределами твоей програмульки. Раз вся прога включена в цикл, то все, что наваял, будет проходиться за цикл контроллера (не факт, что исполняться, естественно, ведь есть же условные операторы, переключатели и прочее), а в это время входы-выходы НЕ ИЗМЕНЯЮТСЯ. Вот когда дойдешь до конца (а ОС сама перекинет в начало) - в этот таинственный момент выходы установятся, а входы опросятся.
Всего-то и делов.

А про SFC - это бомба! Попиши пока на ST, но потом обязательно вернись к нему.
И, конечно, коллеги правы. Поиграйся с простыми примерами. День-два, неделю-две - это уж как получится. Но без этого никак. Иначе скоро тебя начнут пинать ногами за вопросы, которые не возникают у прилежного ученика.
Вспомнл еще одну проблему. Отнесись флегматично к качеству документации и некоторым кострубастостям КоДеСис. Это нужно принять :)

Успехов!

morcat
14.10.2011, 09:28
Приветствую тебя, мой далекий коллега... Спасибо за понимание, коллега! :)

Смотрим на страшилки... Хорошо излагаете, коллега! :)

Итак, поступаю следующим образом:

1) Рисую на бумаге слева входы системы
_______датчики температуры - аналоговые входы;
_______пож.датчик, термостаты, переключатели, кнопки и т.д.- дискр.входы.

справа рисую выходы:
_______вкл/выкл приточного вентилятора;
_______вкл/выкл вытяжного вентилятора;
_______управление приводом подогрева воздуха;
_______управление приводом охлаждения воздуха и т.д.

2) Затем беру ручку и для каждого выхода пишу условия его работы (например для вентилятора):
Вентилятор должен включаться когда:
_______нет пожарной опасности;
_______нет опасности замерзания водяного калорифера в режиме "зима";
_______нет сработки датчика термозащиты вентилятора;
_______переключатель "вкл/выкл" находится в положении "вкл" и т.д.

3) Далее соединяю на листе входы и выходы с учётом п.2 с помощью стандартных библиотечных блоков.

Таким образом получаю именно структурную схему системы - это и есть программа ПЛК. В данном случае язык СFC получается.

Конечно, алгоритм весьма упрощён, и ещё необходимо приложить усилия чтобы "причесать" программу (отдельные блоки сделать макросами или подпрограммами), но наглядность по-моему очевидна.

drvlas
14.10.2011, 10:45
Итак, поступаю следующим образом:
...
получаю именно структурную схему системы - это и есть программа ПЛК. В данном случае язык СFC получается.
Ну, я CFC не юзал, пусть настоящие спецы подскажут. Да, если реализуется просто логическая схема связи входов с выходами - такого рода представление будет удобно. Мне лично мало такое приходилось программировать, привык в задачам, "раскручивающимся во времени" - а тут уж SFC, мммммммм! лапочка.

Но все же, некоторые простые элементы есть смысл пробовать до того, как переходишь к предметной задаче. Или по ходу создавать левые проекты-примерчики. Я, например, со всяким таймерами и триггерами, со временнЫми пеерменными - постоянно создаю и проверяю. Тут есть камешки под водой (возьми, для примера, дурацкое называние триггером одновибратора - это ж в голову плохо лезет).

morcat
14.10.2011, 10:59
Но все же, некоторые простые элементы есть смысл пробовать до того, как переходишь к предметной задаче. Или по ходу создавать левые проекты-примерчики Полностью согласен. У меня в 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, но потом обязательно вернись к нему.
И, конечно, коллеги правы. Поиграйся с простыми примерами. День-два, неделю-две - это уж как получится. Но без этого никак. Иначе скоро тебя начнут пинать ногами за вопросы, которые не возникают у прилежного ученика.
Вспомнл еще одну проблему. Отнесись флегматично к качеству документации и некоторым кострубастостям КоДеСис. Это нужно принять :)

Успехов!

Вот ей богу порадовали.
Респект;)

morcat
08.11.2011, 16:09
Дорогие коллеги: ещё вопрос, если можно :o

Система ПЛК160 (Slave) - ИП320 (Master). В конфигурации ПЛК выбираю "Modbus (slave)" и начинаю "забивать" туда сетевые переменные. Эти переменные, насколько я понял из документации, являются Retain.

В Global_Variables при объявлении Retain-переменных пишем например "Water_Actuator_Type:INT:=1;" и всё.

Никак не сообразить: как задать начальное значение сетевой переменной?

swerder
08.11.2011, 16:49
можете объявить переменные не в самой конфигурации, а в тех же глобальных видом

perem1 AT %QW10.32.0 : int := -125;
где %QW10.32.0 - адрес модуля 2 byte в конфигурации
p.s. только учтите, что панель ип320 вам перезапишет нулями эти переменные на старте программы

morcat
08.11.2011, 17:06
...панель ип320 вам перезапишет нулями эти переменные на старте программы

Даже если так объявить? Только на старте?

В AVR-контроллерах задание начальных значений для eeprom-переменных в инициализацию "запихнул" - и дело в шляпе...

Есть ли ещё какие-то способы?

swerder
08.11.2011, 17:12
только на старте. способы чего?

morcat
08.11.2011, 17:21
способы чего?

...как задать начальное значение сетевой переменной.

Т.е. нужно сесть и сделать таблицу сетевых переменных, для каждой переменной указать её адрес, тип, начальное значение, и номер регистра ПЛК, где будет храниться переменная: я правильно понимаю?

swerder
08.11.2011, 17:27
если вы подразумеваете под "сетевыми переменными" переменные для передачи инфы в панель, то как таковыми сетевыми они не являются.
простой пример: вам надо передать на панель цифровое int значение. вы добавляете в конфигурации плк модуль modbus slave, настраиваете связь, затем "по-простому" именуете 2 byte именем вашей переменной. вместо этого можно тоже самое сделать сразу в глобальных. но добавлять модуль modbus slave и все необходимые 2 byte все равно надо. как это сделать - см. пост #23

morcat
08.11.2011, 17:38
если вы подразумеваете под "сетевыми переменными" переменные для передачи инфы в панель

Да, подразумеваю.


...добавляете в конфигурации плк модуль modbus slave, настраиваете связь, затем "по-простому" именуете 2 byte именем вашей переменной

Так и делаю. Причём эта операция то же самое что и Вы указали выше:


тоже самое сделать сразу в глобальных.

НО: насколько я понял, при помощи конфигурации начальное значение не задать. И это можно сделать в Global_Variables(RETAIN) c указанием адреса (пост #23). По-моему не очень удобно получается...

swerder
09.11.2011, 08:40
НО: насколько я понял, при помощи конфигурации начальное значение не задать.
насколько я знаю - да, не задать

И это можно сделать в Global_Variables(RETAIN) c указанием адреса (пост #23). По-моему не очень удобно получается...
можно без ретайн. область обмена из конфигурации (модбас слэйв или мастер) автоматом сохраняется в ретайн.
выбор за вами. по-моему наоборот удобнее так - сразу видно что за переменная, какой имеет тип, начальное значение можно задать, комментарий. а в конфигурации надо все время раскрывать этот 2 byte

morcat
09.11.2011, 09:12
В общем буду делать так:

1) В конигурации ПЛК в ModBus(slave) "забиваю" переменные необходимые для отправки на панель с несколько изменёнными именами. Если имена переменных будут одинаковые - компилятор ругается.

5028

2) В Global_Variables(RETAIN) задаю переменную с таким же адресом уже с начальным значением:

PVent_Enable AT %QX7.1.0.0: BOOL := TRUE;

По крайней мере так работает.

capzap
09.11.2011, 10:25
А если в системных событиях, взять событие старт, установить галочку и создать этому событию функцию, в которой переменной из модбас присвоить начальное значение, так не получится?

swerder
09.11.2011, 10:33
В общем буду делать так:

1) В конигурации ПЛК в ModBus(slave) "забиваю" переменные необходимые для отправки на панель с несколько изменёнными именами. Если имена переменных будут одинаковые - компилятор ругается.

5028

2) В Global_Variables(RETAIN) задаю переменную с таким же адресом уже с начальным значением:

PVent_Enable AT %QX7.1.0.0: BOOL := TRUE;

По крайней мере так работает.

и какой смысл в дублировании переменных?

morcat
09.11.2011, 18:11
А если в системных событиях, взять событие старт, установить галочку и создать этому событию функцию, в которой переменной из модбас присвоить начальное значение, так не получится?

Спасибо за идею. Получается, но не всё.
Выбираем событие старт, устанавливаем галочку, справа пишем название POU (например INIT), которое будет вызываться при событии СТАРТ. В самом POU пишем что нам надо.
Далее в PLC-PRG(CFC) вводим элемент с названием INIT. После изучения документации на библиотеку SysLibCallback получаем:
5033

Так и не понял: что такое dwFilter.

Всё компилируется и работает, однако при попытке изменения модбас переменной из конфигуратора, она снова принимает прежнее значение. :(

Коллеги: что делаю не так?

capzap
09.11.2011, 18:22
а зачем её где то еще добавлять, ПЛК стартует, наступает событие старт, выполняется единожды функция, где Вы не смотря на область объявления, присваиваете нужным переменным свои первоначальные значения и все.
загрузите прогу, после старта задайте какой-нибудь переменной отличное от начального значение, нажмите стоп потом старт и переменная должна обновится до первоначального

morcat
10.11.2011, 13:36
а зачем её где то еще добавлять, ПЛК стартует, наступает событие старт, выполняется единожды функция В том-то и дело, что функция почему-то не выполняется, ни единожды, ни циклически - вообще никак.

Что ещё нужно сделать помимо
Выбираем событие старт, устанавливаем галочку, справа пишем название POU (например INIT), которое будет вызываться при событии СТАРТ. В самом POU пишем что нам надо. Или как правильно вызвать эту самую функцию?

morcat
10.11.2011, 17:09
вроде все правильно, у меня работает, смотрите видео

Вроде всё правильно, а у меня не работает. Проект в студию:
5043

Отслеживаю модбас переменную PVent_Enable.

morcat
10.11.2011, 17:27
Целевая платформа выбрана PLC160-L.

5044

morcat
11.11.2011, 10:04
и какой смысл в дублировании переменных?

Как такового дублирования не происходит. При таком объявлении

В Global_Variables(RETAIN) задаю переменную с таким же адресом уже с начальным значением никаких новых переменных не появляется - проверил по данным компиляции (Использовано данных: Энергонезависимых данных: )

Поскольку событие СТАРТ у меня почему-то не работает, остаётся действовать таким способом (пост #30).

capzap
11.11.2011, 10:50
:) не сдавайтесь, в конфигурации ПЛК есть еще модуль статистика, а там битовый канал "Power Status", его привязываете к такому коду

rtg(CLK:=power_status);
IF rtg.Q THEN INIFUN(0,0,0); END_IFгде rtg - это R_TRIG,а INIFUN та функция где устанавливаете первоначальные значения

morcat
11.11.2011, 14:07
Загадка разрешилась. EVENT_START и POWER_STATUS работают.

Ключик: режим эмуляции нужно убрать. Работает только с реальным контроллером (online)!

Спасибо capzap и swerder за помощь :)

drvlas
27.11.2011, 13:37
Загадка разрешилась. EVENT_START и POWER_STATUS работают.
Ключик: режим эмуляции нужно убрать. Работает только с реальным контроллером (online)!

А вот у меня что-то не получается с модулем Статистика. запускаю с реальным ПЛК, в онлайн вижу нулевые значения всех переменных. Что не так?
5117

capzap
27.11.2011, 13:43
А вот у меня что-то не получается с модулем Статистика. запускаю с реальным ПЛК, в онлайн вижу нулевые значения всех переменных. Что не так?
5117

одна из причин может быть то, что после перепрошивки ПЛК, необходимо переустановить по новой в КДС таргеты и обновить проект

drvlas
27.11.2011, 13:44
фигасе... Переустановка трагета, ЕМНИП, очищает конфигурацию ПЛК?

Николаев Андрей
27.11.2011, 13:44
CiDeSys не надо, а вот Target поди старый остался...
Ну и в любом случае надо делать - стандартная конфигурация...

drvlas
27.11.2011, 13:51
Коллеги, вы бы как-то понятнее... Не пойму, что нужно обновлять.

В рабочий проект добавив в Конф. ПЛК модуль Статистика.
Скомпилировал, загрузил. Переменные - нули.
Сделал загрузочный проект, все сбросил, запустил. Нули.
Перезапустил КДС, открыл проект, сделал ОНЛАЙН. Сбросил ПЛК, запустил. Нули.

Потанцевал с бубном. Обратился к духам. Духи, что мне делать?

drvlas
27.11.2011, 14:04
Еще раз, импликативные вы мои. Вы либо знаете, либо нет, а я точно не знаю. Давайте разберемся.

Включение в ДЕЙСТВУЮЩИЙ проект модуля Статистика - что требует, кроме создания его в Конфигураторе, затем компиляции проекта и затем создания загрузочного модуля?

drvlas
27.11.2011, 14:27
Господи помилуй, вот о какой перепрошивке идет речь! Нет, не перепрошивал никогда. Значит... все должно работать?

drvlas
27.11.2011, 15:10
надеюсь не в эмуляторе проверяете
ну как бы да,

Не хочется лезть в Конфигуратор задач. Там тоже есть что-то, которое можно вылавливать. Но при существующей документации раскапывать нюансы - себе дороже.
Да и вообще, флаг POWER STATUS придуман именно для таких ситуаций, что я отлавливаю. Поэтому хочется сделать все канонически, без вывертов.

Николаев Андрей
27.11.2011, 15:36
Понял, понял.
Прошивка контроллера на менялась. Вы поменяли только программу на CoDeSys.

Какая версия прошивки контроллера и версия Target файла?
Модуль statistica не работал (все нули) только при несоответствии версии ПРОШИВКИ (не программы) контроллера и Target файла.

drvlas
27.11.2011, 15:49
Какая версия прошивки контроллера и версия Target файла?

Контроллер:

5119

А как узнать версию таргет-файла?

drvlas
27.11.2011, 16:54
удалить таргеты на ПЛК100 и поставить их заново,
Это что именно надо сделать? Я не понимаю. Тагрет-файлы - это просто файлы где-то в недрах компа. В КоДеСис разве есть ЗАГРУЖЕННЫЕ таргеты?

drvlas
27.11.2011, 17:41
Если честно, то мне этот танец не нравится.

1. Смысла особого не вижу - ибо мой ПЛК имеет достаточно неновую прошивку и модуль статистики не есть нанотехнология, которую вот только что добавили...

2. А вот риски есть. Матюкнется КДС, слетит конфигурация - и опять ее ручками? Ну, там можно внимательно смотреть по ходу пьесы и попытаться не допустить летального исхода... Но, с учетом п.1, я подожду других предложений.


:) если стоит винда семерка
Да, и я в упор не могу найти у себя Гипертерминал. Это капец какой-то! Может подскажешь, раз уж речь зашла о нетленном творении товарища Билла?

kolyan
27.11.2011, 18:56
Да, и я в упор не могу найти у себя Гипертерминал. Это капец какой-то! Может подскажешь, раз уж речь зашла о нетленном творении товарища Билла?[/QUOTE]


Гипертерминала, к огромному сожалению ("респект" Билли) в семёрке нет.

Николаев Андрей
27.11.2011, 22:27
Гипера нет начиная с вистаса - это плохо.
А вот то, что он просто копируется из ХР и переносится без установки на vista - хорошо :) :) :)