PDA

Просмотр полной версии : Как программировать вложенные SFC



Антон
29.01.2008, 14:11
Как программировать вложенные SFC программы?
Т.е. в основной SFC программе шаги состоят из своих программ на SFC.
У меня либо не рабоет, либо флаги размножаются.
Есть к кого нибудь пример?


Вроде разобрался сам.
Вопрос разработчикам:
У меня получился SFC стандартный sfc шаг с входным и выходным действием (E и Х).
Компилятор этого не заметил, программа работает некорректно - это плохо.

Малышев Олег
30.01.2008, 11:40
В чем проблема - в шаге могут быть и три действия одновременно (выход, выход, выполнение)?

Антон
31.01.2008, 09:17
При запуске проекта в контроллере, контроллер начинает один раз в минуту выключать реле. Я так понимаю проблема с вложенными SFC в блоке INIT.

И ДАЖЕ В РЕЖИМЕ СТОП!!!!!


После запуска один маркер остается в самом блоке INIT (при этом шаги внутри INIT не выполняются) , а другой маркер идет дальше.
Если после шага INIT поставить переход TRUE, то один маркер остается внутри INIT на шаге pink1, а другой продолжает свое движение.
Можно писать программы с вложенными SFC? КАК?
Если нет то как переделать проект, т.к. убрать модуль INIT и вставить новый среда не позволяет.
Теперь весь проект переписывать, что-бы небыло вложений?

Проект прилагается.

Малышев Олег
31.01.2008, 09:44
При запуске проекта в контроллере, контроллер начинает один раз в минуту выключать реле. Я так понимаю проблема с вложенными SFC в блоке INIT.

И ДАЖЕ В РЕЖИМЕ СТОП!!!!!


После запуска один маркер остается в самом блоке INIT (при этом шаги внутри INIT не выполняются) , а другой маркер идет дальше.
Если после шага INIT поставить переход TRUE, то один маркер остается внутри INIT на шаге pink1, а другой продолжает свое движение.
Можно писать программы с вложенными SFC? КАК?
Если нет то как переделать проект, т.к. убрать модуль INIT и вставить новый среда не позволяет.
Теперь весь проект переписывать, что-бы небыло вложений?

Проект прилагается.

Настойчиво рекомендую убрать из Init все. Он должен быть пустой. Для очистки инит используйте контекстное меню - Clear Action Transition. Вложенные SFC писать можно, но нужно понимать как они работают. Иначе говоря - SFC POU вызывает action в моменты получения маркера на состояние. Соотвественно вход- 1 раз, выход- 1 раз и Выполнение - пока нет выхода в след состояние. Если есть выход, то вложенная SFC перестает выполняться, но ее выполнение начнется с того же состояния в котором она находилась. Для сброса SFC POU используйте SFCInit - входную переменную (или SFCReset). Подробно см справку по SFC

Н_е и_с_п_о_л_ь_з_у_й_т_е стандартные SFC action и Codesys action в одном проекте.

Насчет щелканья реле - где щелкает - на МВУ или на ПЛК??? Если на МВУ посмотрите что последний раз было записано ШИМ.

Антон
31.01.2008, 11:22
Прочитал и мне чуть плохо не стало.
Разработчикам нужно сделать документ "Отличия работы в CoDeSys v.2.3.8.1 от того что написано в документе "Руководство пользователя
по программированию ПЛК в CoDeSys 2.3" в следующем виде:
Стр. документа, абзац такой-то, читать так-то.


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

Вложенные SFC писать можно, но нужно понимать как они работают. Иначе говоря - SFC POU вызывает action в моменты получения маркера на состояние. Соотвественно вход- 1 раз, выход- 1 раз и Выполнение - пока нет выхода в след состояние. Если есть выход, то вложенная SFC перестает выполняться, но ее выполнение начнется с того же состояния в котором она находилась.
Как сделать чтобы вложенная SFC выполнялась до конца, а затем шаг (в котором эта SFC записана) передавал маркер дальше?
Я уже по разному комбинировал, не получается.
В комплекте с CoDeSys нет ни одного примера с вложенными SFC.
Пример плз.



Н_е и_с_п_о_л_ь_з_у_й_т_е стандартные SFC action и Codesys action в одном проекте.

Codesys action это вы имеете ввиду упрощенный SFC шаг?
А почему?
Ведь шаг INIT - это упрощенный шаг, а если дальше добавить стандартный, то уже получится смесь разных шагов.
Опять же в документации написано что можно использовать.
Кстати. Если в стандартный шаг добавить входное и выходное действие (E и Х) то какой шаг получится?

Тогда лучше полностью переходить на стандартные шаги и действия на SFC?
Если действие написано на SFC, то после своего выполнения маркер оно не куда не передает? Чем его нужно заканчивать?


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

Малышев Олег
31.01.2008, 13:36
Прочитал и мне чуть плохо не стало.
Разработчикам нужно сделать документ "Отличия работы в CoDeSys v.2.3.8.1 от того что написано в документе "Руководство пользователя
по программированию ПЛК в CoDeSys 2.3" в следующем виде:
Стр. документа, абзац такой-то, читать так-то.

Руководства порой отличаются от жизни... Понятно, что ядро CoDeSys в ПЛК мы не меняли...



Сделаю, хотя этого нет в руководстве.

Как сделать чтобы вложенная SFC выполнялась до конца, а затем шаг (в котором эта SFC записана) передавал маркер дальше?
[QUOTE=Антон;6945]

Я уже по разному комбинировал, не получается.
В комплекте с CoDeSys нет ни одного примера с вложенными SFC.
Пример плз.

Пример приложен.



Codesys action это вы имеете ввиду упрощенный SFC шаг?
А почему?
Ведь шаг INIT - это упрощенный шаг, а если дальше добавить стандартный, то уже получится смесь разных шагов.

Извините - не так выразился - не используйте IEC steps одновременно с упрощенными.

Шаги и действия - это разные вещи.



Опять же в документации написано что можно использовать.
Кстати. Если в стандартный шаг добавить входное и выходное действие (E и Х) то какой шаг получится?

Тогда лучше полностью переходить на стандартные шаги и действия на SFC?
Если действие написано на SFC, то после своего выполнения маркер оно не куда не передает? Чем его нужно заканчивать?


В ПЛК реле первого канала.
Запусьтите проект ради интереса. МВУ и МВА можно не подключать, панель тоже по идее не должна влиять.
Это ошибки компилятора ввиду вышеприведенных ограничений?

PLC Browser ->PLCInfo

Антон
31.01.2008, 14:02
Вот пример программы.
При работе выкл реле первого канала с периодичностью 5 секунд.
Что это за мистическое время?
А оказывается это период архивации.
При удалении файла реле перестает щелкать.
Видимо возникает переполнение.


P.S. Архиватор почему-то работает в режиме полного стирания-записи файла, а не в режиме сдвига.

Быстро дорабатываете модуль архивации иначе меня уволят и я буду проситься к вам на работу тестировщиком :)

Антон
31.01.2008, 14:15
За пример спасибо. Посмотрю.

PLC Browser ->PLCInfo[/QUOTE]


PLCInfo
PLC model MODEL PLC 150
Binary VERSION 2.02.8
Need Target version 2.02
Compiled: 12:56:39 Nov 23 2007
MAC 67:77:01:03:0C:47
IP 172.16.2.249
GATE 10.0.6.1
MASK 255.255.255.0
Licence limited to 360 bytes
Current DAC
PIC version is 09

Филоненко Владислав
31.01.2008, 14:32
Уважаемый Антон!
Посмотрел Ваши проекты...
У вас 3 проблемы:
1. Программа внутри цикла ПЛК выполняется 4 мс при выставленном цикле ПЛК в 1 мс. В результате на внутренние нужды ПЛК остаётся чрезвычайно мало времени и происходит подтормаживание при всех операция. Необходимо оптимизировать Ваше приложение и разбить работу на более маленькие части с использованием Task Manager.
2. В проекте 3 архиватора, запись в каждом осуществляется в текстовом режиме, причем размер файлов во всех 3-х выставлен в 32 тысячи записей (а каждая запись - не менее 30 байт примерно). Т.о. суммарный размер файлов архиватора ~3 МБайт + размер проекта ПЛК, что в сумме превосходит весь размер диска.
3. Для работы в режиме архиватора со сдвигом, для сдвига модуль архиватора требует размер свободного ОЗУ = 1/2 размера сдвигаемого файла, т.е. 512 кБайт - столько в ПЛК не осталось, в результате архиватор переходит в запасной режим и работает стирая старый файл.
К тому-же, если модулю архивации придётся записать 512 кБайт во Flash, то это вызовет задержку, т.к. размер очереди кэша на запись составляет чуть более 30 кБайт, а при её переполнении запись начинает производится непосредственно во Flash, а не кэшируется и не производится в фоновом режиме.

Рекомендации:
1. Прооптимизировать программу.
2. Использовать Task Manager (Welcome на наш семинар)
3. Уменьшить размер файлов в архиваторе.

Антон
31.01.2008, 19:00
Уважаемый Антон!
Посмотрел Ваши проекты...
У вас 3 проблемы:
1. Программа внутри цикла ПЛК выполняется 4 мс при выставленном цикле ПЛК в 1 мс. В результате на внутренние нужды ПЛК остаётся чрезвычайно мало времени и происходит подтормаживание при всех операция. Необходимо оптимизировать Ваше приложение и разбить работу на более маленькие части с использованием Task Manager.
Раньше у меня было время цикла 40 мс (связано с джитером аналогового выхода) и были те-же проблемы (зависания обмена с МВА).
Мне надоели тормоза при отладке и я задал 1 мс.

А если задать 0 мс?
Сколько нужно задать чтобы не было никаких проблем?


2. В проекте 3 архиватора, запись в каждом осуществляется в текстовом режиме, причем размер файлов во всех 3-х выставлен в 32 тысячи записей (а каждая запись - не менее 30 байт примерно). Т.о. суммарный размер файлов архиватора ~3 МБайт + размер проекта ПЛК, что в сумме превосходит весь размер диска.
Проблемы начинаются при размерах файлов около 200 кб.
Я пробовал делать в архиве по времени 100 записей, проблема не исчезала (зависания обмена с МВА).
Более того: через несколько перезаписей архива в него начали писаться одни нули. СОВЕТУЮ проверить этот факт.
При зависании обмена с МВА я стер архивный файл. И через примерно одну минуту связь с МВА восстановилась.

А в приведенном проекте файл тоже был примерно 200 кб, когда начало щелкать реле. После стирания файла реле перестало щелкать.


3. Для работы в режиме архиватора со сдвигом, для сдвига модуль архиватора требует размер свободного ОЗУ = 1/2 размера сдвигаемого файла, т.е. 512 кБайт - столько в ПЛК не осталось, в результате архиватор переходит в запасной режим и работает стирая старый файл.
К тому-же, если модулю архивации придётся записать 512 кБайт во Flash, то это вызовет задержку, т.к. размер очереди кэша на запись составляет чуть более 30 кБайт, а при её переполнении запись начинает производится непосредственно во Flash, а не кэшируется и не производится в фоновом режиме.

Очень интересно. В паспорте на ПЛК написано что ОЗУ составляет 8 Мб.
Хотите сказать что проект в 80кб использует более 7 Мб ОЗУ ?
Как это можно посмотреть?
И опять таки даже при задании 32000 записей при глюках файлы состовляли не более 300 кб каждый. Самый длинный был 4600 строк.

Рекомендации:
1. Прооптимизировать программу.

Зачем? И так проблем хватает. Мне и 100 мс вполне достаточно, но хочется быстрой отладки/загрузки.

2. Использовать Task Manager (Welcome на наш семинар)

Лучше уж вы к нам :) (Пока нет возможности)

3. Уменьшить размер файлов в архиваторе.

Куда уж меньше. (см. выше)

Филоненко Владислав
31.01.2008, 20:49
Начнем с конца.
1.При работе в текстовом режиме архиватор считает размер файла не в байтах, а в записях, т.е. как Вы говорите 4600 строк - это 1/7 от заданного Вами же размера. Т.о. сдвиг просто еще не включался, рановато.

2. Если Вы выставляете цикл ПЛК 1 мс, а реально Ваша программа настолько велика, что выполняется 4 мс, то происходит следующее - начинается цикл, он длится в 4 раза чем задано, после окончания цикла должны проходить операции обслуживания, в т.ч. и обмена с МВА и пр.
Но, т.к. следующий цикл и так уже запоздал на 3 мс, ПЛК выделяет на обслуживание очень мало времени, несколько мкс, и за этот период операции обмена с входами/выходами, работа мастеров и пр. не успевает полностью произойти. Из-за этого и возникают проблемы с обменом.
Придется либо оптимизировать программу, либо разбивать её на мелкие подпрограммы, к-е по отдельности выполняются меньше цикла ПЛК, либо увеличить цикл ПЛК, в Вашем случае рекомендую 6 мс, а лучше 10.

3. Про память - 8МБайт, в которых расположен собственно код ядра, ОЗУ для внутренних переменных, кэш на чтение и запись, буфера для последовательных интерфейсов, Ethernet и сокетов, куча для модулей расширения и функций работы с памятью самого CoDesys, 2 Мбайта для кода проекта, 128 кБ для оперативной памяти проекта и много много чего другого. В результате остаётся не так уж и много...

4. Про архивирование - чем больше файл, тем больше ресурсов времени он требует на обработку. Соответственно при каждой записи архиватор должен открыть файл, перейти в его конец, записать, синхронизировать кэш и пр. операции обслуживания. Время на эти операции растет пропорционально размеру файла. На некотором объеме это время становиться недопустимо большим. И размер файла был сознательно ограничен 32000 байт в бинарном режиме. В текстовом режиме такое ограничение наложить невозможно, т.к. размер записи может варьироваться в очень широких пределах.

Та же проблема с большими файлами в архиваторе приводит к щелканию реле. В ПЛК есть защита от зависания центрального процессора и если в течении 250 мс процессор не подтвердит свою работоспособность, послав посылку в нижний микропроцессор, он переведёт выхода в безопасное состояние. При работе с большими файлами возможны такие задержки.
Поэтому рекомендую уменьшить размеры архивов до 20-30 кБайт и проблемы исчезнут.

P.S. При работе с файлами из самой среды СoDesys также следует за 1 цикл ПЛК не читать свыше 30-50 кБайт и не записывать свыше 20-30 кБайт.

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

P.S. также рекомендую увеличить время ожидания ответа от МВА до 50 мс

Антон
01.02.2008, 08:35
Начнем с конца.

2. Если Вы выставляете цикл ПЛК 1 мс, а реально Ваша программа настолько велика, что выполняется 4 мс, то происходит следующее - начинается цикл, он длится в 4 раза чем задано, после окончания цикла должны проходить операции обслуживания, в т.ч. и обмена с МВА и пр.
Но, т.к. следующий цикл и так уже запоздал на 3 мс, ПЛК выделяет на обслуживание очень мало времени, несколько мкс, и за этот период операции обмена с входами/выходами, работа мастеров и пр. не успевает полностью произойти. Из-за этого и возникают проблемы с обменом.
Придется либо оптимизировать программу, либо разбивать её на мелкие подпрограммы, к-е по отдельности выполняются меньше цикла ПЛК, либо увеличить цикл ПЛК, в Вашем случае рекомендую 6 мс, а лучше 10.

Сделаю 10.
Попробовал при 10 мс проект грузится 20 сек.
При 0 мс грузится 13 сек.
При 40 мс - 65 сек.


4. Про архивирование - чем больше файл, тем больше ресурсов времени он требует на обработку. Соответственно при каждой записи архиватор должен открыть файл, перейти в его конец, записать, синхронизировать кэш и пр. операции обслуживания. Время на эти операции растет пропорционально размеру файла. На некотором объеме это время становиться недопустимо большим. И размер файла был сознательно ограничен 32000 байт в бинарном режиме. В текстовом режиме такое ограничение наложить невозможно, т.к. размер записи может варьироваться в очень широких пределах.

А если ограничить макс время цикла в 10 сек? Или это не из-за этого?
У меня был архив с shift mode 100 записей, но почему-то файл стирался и каждый раз писался заново.


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

Но чем занят процессор 250 мс, если файл дописывается в конец?


Поэтому рекомендую уменьшить размеры архивов до 20-30 кБайт и проблемы исчезнут.

500 строк по 60 символов - это мало (одна строка через 1мин - 8 часов).
Даже если разбить: один архив - одна переменная (что не совсем удобно) получится 1500 строк по 20 символов - сутки.
Нужно хотя бы 3 суток.

А если стирать файл и писать с нуля? Будет работать 300-500 кб архив?
Хотя у меня ведь файл не достиг своего максимума а глюки были:confused:

Филоненко Владислав
01.02.2008, 09:48
Антон, у вас очень глобальная задача, под которую архиватор не затачивался, поэтому Вам лучше воспользоваться библиотекой SysLibFile и записывать информацию (а её много будет) самому из программы ПЛК.

Антон
01.02.2008, 10:42
Разбил один архив на несколько, теперь после загрузки проекта выдается сообщение об ошибке.
Прилагаются вид экрана с ошибкой и проект.

Антон
01.02.2008, 10:44
Антон, у вас очень глобальная задача, под которую архиватор не затачивался, поэтому Вам лучше воспользоваться библиотекой SysLibFile и записывать информацию (а её много будет) самому из программы ПЛК.

Есть пример использования этой библиотеки для записи лог файлов?

Филоненко Владислав
01.02.2008, 11:29
Разбил один архив на несколько, теперь после загрузки проекта выдается сообщение об ошибке.
Прилагаются вид экрана с ошибкой и проект.

В ПЛК позволено создавать не более 3-х модулей архивации. Ресурсы не бесконечные :(

Антон
01.02.2008, 14:06
В ПЛК позволено создавать не более 3-х модулей архивации. Ресурсы не бесконечные :(
1) Архиватор в режиме shift при переполнении стирает файл и пишет сначала, хотя должен сдвигать.
2) Нужен пример записи лог файла с использованием библиотеки.

Филоненко Владислав
01.02.2008, 14:58
Пример для лога не имею, но процедура следующая.
Открыть файл на запись.
Переместить указатель в конец файла.
Начать записывать данные в требуемом Вам формате в файл.
Когда процедура архивации закончена - закрыть файл.

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

Антон
02.02.2008, 07:06
При круглосуточной работе, непонятно когда произошла архивируемая запись.
Т.е. архиватор пишет дату только при включении питания, а при появлении новой записи указывается только время.
Нужно чтобы при переходе суток и появлении новой записи указывалась дата.

P.S. Хочется чтобы все замечания по архиватору в новой версии прошивки были устранены, а то это не архиватор а "писалка в файл".

Филоненко Владислав
02.02.2008, 08:32
Чтобы добавлялась дата каждые сутки просто сделайте время включения архивации 00:00:06, а выключения 00:00:01. Тогда в 6 секунд первого каждые сутки будет писаться заголовок.

Антон
04.02.2008, 06:27
Сделал как вы сказали. Архивы вообще перестали писаться.
Проект.

Антон
04.02.2008, 06:52
Все сделал как вы писали.
При установке флага key_plavlenie (переменная в panel key_plavlenie_p) маркер заходит в PL1 и стоит в блоке PL_init.
Что я упустил?

Филоненко Владислав
04.02.2008, 09:09
Сделал как вы сказали. Архивы вообще перестали писаться.
Проект.

Извините, маленько ввел в заблуждение.
Поставьте время включения 00:00:01
А выключения 23:59:59

Время включения должно быть меньше времени выключения.
Проверил, работает.

Малышев Олег
04.02.2008, 09:29
1)Вложенные SFC - это кончено интересно, но...
Действительно эта программа сработала один раз, дальше не стала. Честно говоря, можно обойтись и без вложения SFC - там нет никакой необходимости в этом.
2)Все таки сделайте несколько задач.

Антон
04.02.2008, 10:44
Вроде ЗАРАБОТАЛА. Я неправильно обрабатывал SFCReset (хотя при чем тут это если этим не пользовался ) .