CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Чт ноя 23, 2017 2:36 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Чт сен 27, 2012 11:52 am 
Не в сети

Зарегистрирован: Ср сен 26, 2012 10:51 am
Сообщения: 1
Добрый день,

поделитесь пожалуйста опытом архитектуры программы в ПЛК в части приема и обработки команд от верхнего уровня (ВУ). протокол modbus

раньше я делал прием команд так:
1. ВУ присваивает значение 1 тэгу, значение пересылается в ПЛК,
2. ПЛК исполняет команду и
3. сбрасывает ячейку памяти куда пришла команда.

НО

есть контроллеры которые немогут записывать/обнулять область памяти куда произведена запись с ВУ - segnetics, fastwel (codesys). у них есть понятие записи в ПЛК с ВУ по протоколу modbus в область памяти Holding Register. Ячейкам этой области памяти ставятся в соответствие переменные. и !! в эти переменные нельзя записывать. можно только читать.

получается если ВУ посылает команду со значением 1 в такую ячейку ПЛК ее исполнит, например по переходу из 0 в другое значение, и даже может запомнить что исполнил ее и больше не исполнять, НО

(главный вопрос)
как еще раз выполнить эту же команду по прошествии времени? (оператор кликает кнопку, должна послаться команда в плк)

вижу несколько вариантов:

1. на ВУ посылать команду (задвать значение тэгу) по нажатию кнопки а по отжатию сбрасывать (писать 0 в тэг). в этом случае нет полной гарантии что запись в ячейку пройдет если будут проблемы со связью. в том числе нет полной гарантии что пройдет запись 1 и что важнее для логики запись 0. в этом случае в ячейке контроллера останется 1 и чтобы еще раз выполнить команду нужно будет кликать на кнопку пока не пройдет запись 0 и уже потом снова запись 1 и 0.

2. на ВУ посылать команду словом состоящим из 2х частей - команды и маркера 0xXXYY где в YY будет команда, а в XX будет маркер - постоянно изменяющееся число. т.е. чтобы послать команду 1 через тэг zz нужно выполнить

zz = ((zz + 0x100) & 0xFF00) + 1

это даст с вероятностью 1/256 значение отличное от значения маркера в ячейке ПЛК и ПЛК определит наличие новой команды и исполнит ее. и в случае рассинхронизации маркера тэга и маркера ячейки до состояния отличия (тэг-1 == ячейка плк) потребуется одна повторная команда от ВУ чтобы передать ее на ПЛК - по первой произойдет синхронизация значений маркера (тэг == ячейка) и по второму повтору запишется маркер (ячейка = тэг+1)

3. из ВУ писать команду в ячейку1, ПЛК будет принимать команду и перекладывать ее в выходную ячейку2, ВУ читает ячейку2 и в случае совпадения посланного в ячейку1 с прочитанным из ячейки2 команда считается принятой. этот вариант кажется наиболее правильным, НО у него нет встроенной поддержки со стороны ВУ типа iFIX (и InTouch кажется тоже, хотя это неважно т.к. в текущем проекте исползуется ifix). все неудобство в том что для того чтобы прошла команда нужна одна запись ячейки modbus, но чтобы ВУ это понял нужно еще чтение ячейки modbus.

упрощенно-схематически

если по нажатию кнопки на ВУ
m_out_vu = 1 (в io-тэг в 4xxxx, в надежде что ВУ имеет очередь исполнения записи)

ежесекундно на ВУ
m_out_vu = m_in_vu (из io-тэга из 3xxx)

в ПЛК (НУ нижний уровень). условно
m_in_nu - переменная связанная с ячейкой modbus 40001
m_out_nu - переменная связанная с ячейкой modbus 30001

каждый цикл плк
по переднему +фронту m = m_in_nu
m_out_nu = m
по завершению команды или раньше можно сделать m = 0

end


то же в виде циклограммы
если для отображения графики использовать m_in_vu, а в плк использовать m_out_nu получилось такое:

m_in_vu|m_out_vu|m_in_nu|m_out_nu
0|0|0|0
нажатие кнопки
0|1|0|0
запись по сети
0|1|1|0
цикл плк, по переднему +фронту
0|1|1|1
исполнение и сброс в плк
0|1|1|0
чтение по сети, цикл ВУ
0|0|1|0
запись по сети
0|0|0|0

или если чтение по сети прошло раньше сброса в плк (что маловероятно)
0|0|0|0
нажатие кнопки
0|1|0|0
запись по сети
0|1|1|0
цикл плк, по переднему +фронту
0|1|1|1
чтение по сети, цикл ВУ
1|0|1|1
1|1|1|1
исполнение и сброс в плк
1|1|1|0
чтение по сети, цикл ВУ
0|1|1|0
0|0|1|0
запись по сети
0|0|0|0

как же правильнее делать когда контроллер не может стирать HR?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB