PDA

Просмотр полной версии : варианты реализации обхода логики контроллера



Vitaly123
27.06.2011, 16:51
Есть необходимость реализовать такую вещь:
Как в среде CodeSys при нажатии на кнопку происходит включение выхода 1.
Так и в сторонней программе необходимо сгенерировать некий пакет и послать на контроллер, чтобы включить выход 1.

Сложность в том, как понять что за пакет, чем отличается кнопка 1 от кнопки 2 и по какому протоколу (протоколам это можно сделать)?

Спасибо.

Николаев Андрей
28.06.2011, 10:57
Описываете в программе условие - так как в контроллерере логику Вы определяете сами...

Vitaly123
28.06.2011, 14:17
Так как мне такое реализовать?
Необходимо на вход (скажем USB порт) подать сигнал, который посылает среда разработки (эмулировать среду)
Так реально сделать?
У меня не получилось - поймал два пакета в программе, их набил и послал в программе прослушки - ноль реакции.
Так данные не защищены?
Спасибо.

alexval2006
28.06.2011, 20:12
То есть вы хотите управлять контролером из своего софта программу серавно заливать в контролер придется из кодесиса а дальше общаетесь с контролером через ModBus или OPC примеры есть на форуме было про написание софта на делфи

Vitaly123
29.06.2011, 10:18
Именно такая мне инфа и нужна была.
Буду знать теперь в какую сторону копать.
Я понял что проект в Codesys всё равно необходим.
Более того, если его содержимое измениться, то и вызовы будут другие (в моем случае).

Про мои изыскания.
Пробовал по USB ловить пакеты.
По Codesys подключался и нажимал три моих кнопки.
Эмулировал посылку пакетов через свою программу в тот же порт.

Мною была замечена разница:
Через среду Codesys индикатор горит постоянно, через мою прогу - при посылке пакета горит 10 секунд и гаснет, пока не погаснет - следующий пакет не примет.

В чем может быть проблема?

Примеры во вложении.
Если этот вариант(посылка пакета в порт) добить, он будет лучше чем ModBus или OPC - ничего не надо изучать, программировать, а просто перехватить пакеты в проекте и в своей программе их послать.

Например то, что я наковырял:
нажатие кнопки - последовательность $AA$AA$11$00$01$00$9B$01$50$45$01$00$00$00$04$00$9 8$00$00$00$0100$00$00$01
отжатие кнопки - последовательность
$AA$AA$11$00$01$00$9A$01$50$45$01$00$00$00$04$00$9 8$00$00$00$0100$00$00$00

Спасибо.


При связи постоянно шлет одну и ту же последовательность пакетов.

Спасибо.

Николаев Андрей
29.06.2011, 10:21
1. Порт для программирования при использовании кабеля для программирования ждет связи именно с CoDeSys. Если данные приходят "некорректные" он несколько раз проверяет, и отказывает в доступе. По этому и задержка.
2. Можете не использовать ModBus или OPC. На форуме есть пример работы с библиотекой UNM. Вы сами открываете порт, и просто получаете из него данные. А в программе, написанной в CoDeSys эти данные нужным Вам образом разбираете.

Vitaly123
29.06.2011, 10:42
Нет, тут проблема немного не та.
Я никоим образом не собираюсь вмешиваться в работу программы контроллера и среды Codesys.
А алгоритм его работы прост -
открытый дискретный вход 1 - открытый дискрытный выход 1
открытый дискретный вход 2 - открытый дискрытный выход 2
открытый дискретный вход 3 - открытый дискрытный выход 3

Разница в том, что я хочу именно с КОМПЬЮТЕРА подать на вход не дискретный сигнал (нет у меня такой аппаратуры), а в любой доступный порт, я выбрал USB, кинуть посылку, которую отсылает Codesys.

Надеюсь смог объяснить мою потребность.

Спасибо.

Vitaly123
29.06.2011, 10:55
Кстати, забыл спросить.
Говорилось про кабель для программирования и про порт для программирования.
Мне как раз необходимо не использовать Codesys, а просто подключиться к ПЛК и включить дискретный порт (любым путем).
По какому порту это можно сделать?
Спасибо.

Николаев Андрей
29.06.2011, 12:24
В программе на CoDeSys заводите переменные, отвечающие за конктертные входы и выходы.
И получая данные их порта (Ethernet будет для Вас я думаю самым оптимальным) в программе присваиваете полученное значение из Ethernet переменной, отвечающей за соответствующий выход.
Надеюсь понятно объяснил...

Николаев Андрей
29.06.2011, 12:25
Сами протоколом Gateway Вы пользоваться не сможете ни по какому интерфейсу...

Vitaly123
29.06.2011, 13:44
В программе на CoDeSys заводите переменные, отвечающие за конктертные входы и выходы.
И получая данные их порта (Ethernet будет для Вас я думаю самым оптимальным) в программе присваиваете полученное значение из Ethernet переменной, отвечающей за соответствующий выход.
Надеюсь понятно объяснил...

Да вроде понятно, но:
Мне необходимо не прочитать значение выхода, а установить значение на дискретном входе - т.е. как бы нажать кнопку но не в Codesys, а в своей программе.

Касательно протокола gateway (который для среды), мне удалось таким образом послать необходимые данные - можете посмотреть во вложении - там проект Codesys и проект Delphi, который делает тоже самое.

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

Спасибо.
Если не трудно, ткните на ссылку на пример, никак не могу найти.

Николаев Андрей
29.06.2011, 18:18
Не надо пытаться обмануть контроллер - учитесь с ним дружить. ГОСТ он и есть ГОСТ.
Пример программы.
Область определения:
in1 : Bool; Переменная, привязанная к физическому входу.
in_myprog1 : bool; Переменная, получаемая от ПК программой в контроллере (протокол не обговариваем)

Программа:
if in1 = true then
Делаем что надо
end_if;

if in_myprog1 = true then
Делаем еще что то
end_if;

Вова
29.06.2011, 23:17
установить значение на дискретном входе - т.е. как бы нажать кнопку но не в Codesys, а в своей программе.
Скажите, а для какой цели всё это, если не секрет?

Leonid
30.06.2011, 20:33
Задача непонятна. Зачем разбирать и эмулировать протокол обмена данным между Кодесис и ПЛК?
Отсылайте сетевой пакет из Вашей программы, принимайте его программой в ПЛК, вот и управление. Если сеть проводная и не очень сложная, то протокол UDP вполне подойдет.
Для ПЛК есть библиотека по работе с сетью.