PDA

Просмотр полной версии : ПЛК 154 сетевой обмен c ПК через ModbusTCP



Денис Бердяев
20.11.2015, 14:19
Добрый день, есть несколько контроллеров ПЛК 154, все имеют выход в интернет. Есть ПК с выделенным белым статическим IP адресом на котором установлена программа диспетчеризации, программа написана на Delphi, связь в данный момент написана по средствам TCP Socket, причем контроллер является клиентом, так как его IP адрес динамический, а программа на ПК сервером. Есть огромное желание перевести всё это в работу по протоколу ModbusTCP, начал с того что нашел компонент под delphi Modbus Master и Slave, но как сконфигурировать контроллер не представляю. Поделитесь пожалуйста мыслями и соображениями на эту тему, сразу предупрежу мы не можем отказаться от самописного приложения и перейти на SCADA или OPC сервер.

Спасибо

Вольд
20.11.2015, 14:54
Сделай ПК клиентом а ПЛК серверами.

Денис Бердяев
20.11.2015, 14:58
Плк висят в интернете по принципу "как приходится", какие то вообще на GPRS модеме, какие-то под 3G маршрутизатором, и я не могу знать их IP адрес, а ПК всегда в интернете под одним и тем же IP в этом и смысл что ПК сервер а ПЛК клиент

Вольд
20.11.2015, 15:02
Если у вас все сделано и работает, то в чем проблема ?

Денис Бердяев
20.11.2015, 15:09
если б всё работало... не писал бы сейчас, а оно живет своей жизнью - отваливается периодически, долго не подключается и т.п. поэтому решили сделать ход конём, плюс в сетевом обмене через SyslibSockets очень много проблем, начиная с того что на стороне контроллера не возможно видеть статус соединения, мы используем сейчас принцип отправки пакета на сервер и ждем его возвращения, если не пришло за 3 секунды, рвем соединение и устанавливаем заново, плюс мусор в сетевом обмене, повторяющиеся строки, данные приходят как им вздумается, кусками например и т.д.

melky
20.11.2015, 15:11
поставить 3G модемы с возможностью поднятия VPN канала, запустить VPN сервер на сервере диспетчера, настроить маршрутизацию и пользовать ModbusTCP как в обычной сети.

Вольд
20.11.2015, 15:13
если б всё работало... не писал бы сейчас, а оно живет своей жизнью - отваливается периодически, долго не подключается и т.п. поэтому решили сделать ход конём, плюс в сетевом обмене через SyslibSockets очень много проблем, начиная с того что на стороне контроллера не возможно видеть статус соединения, мы используем сейчас принцип отправки пакета на сервер и ждем его возвращения, если не пришло за 3 секунды, рвем соединение и устанавливаем заново, плюс мусор в сетевом обмене, повторяющиеся строки, данные приходят как им вздумается, кусками например и т.д.

Глянь тут, там мужик то же на Delphi ваял: http://www.owen.ru/forum/showthread.php?t=12622

Денис Бердяев
20.11.2015, 15:38
Там тоже подключение происходит к контроллеру (т.е. ip адрес контроллера известен заранее), а как реализовать чтобы контроллер подключался к ПК, может ли протокол ModBus на стороне контроллера быть настроен клиентом, чтобы он инициировал соединение по известному IP

Денис Бердяев
20.11.2015, 15:44
поставить 3G модемы с возможностью поднятия VPN канала, запустить VPN сервер на сервере диспетчера, настроить маршрутизацию и пользовать ModbusTCP как в обычной сети.
не реально везде сделать VPN к_а_н_а_л тем более не всегда на маршрутизаторах он есть. Оборудование уже нереально поменять, финансировния нет, по этому надо думать как это победить

melky
20.11.2015, 15:57
Компьютеры на объектах есть или только ПЛК ?, если только ПЛК то НИКАК

А, можно взять oscat библиотеки и сделать работу через FTP. костыльный вариант, но все же.

Денис Бердяев
20.11.2015, 16:14
Компьютеры на объектах есть или только ПЛК ?, если только ПЛК то НИКАК

А, можно взять oscat библиотеки и сделать работу через FTP. костыльный вариант, но все же.

Компов нет на объектах, только ПЛК и климатическое оборудование которым он и рулит.

Может использовать принцип кратковременного подключения, типо подключился на пол секунды все что нужно передал, считал и спать секунд на 10, но тогда нужно решить что то с мусором в трафике.

Выглядит это так, я с ПЛК отправляю строку SysSockSend (SOCKET, ADR(TextToSend), SIZEOF(TextToSend), 0);
трока например из 25 символов, скажем "0123456789ABCDEFGHIJKLMNOP" а на сервер приходят это строка не за рас а за три или четыре по 5 символов, и иногда в половине другая половина вклинилась

щас обрисую
вот что вижу в логе после того как отрпвил строку с контроллера

1. 012345
2. 0123456789A
3. 0123456789ABCDEFGHI
4. JKLMNOP

а может так

1. 012345
2. 012340123456789ABCDEFGHI56789A
3. 012345678JKLMNOP9ABCDEFGHI


и непонятно на какой стороне капать

capzap
20.11.2015, 16:15
любой плк имеет на боту мастера модбасТСР, на ПК сделать слейв не проблема, как мне кажется для любого языка, что не так то?

Денис Бердяев
20.11.2015, 16:23
любой плк имеет на боту мастера модбасТСР, на ПК сделать слейв не проблема, как мне кажется для любого языка, что не так то?

Работать будет если IP контроллера не известен?

capzap
20.11.2015, 16:27
если на контроллере клиент и ему нужен только адрес сервера, который у Вас известен, то причем тут какой айпишник у плк?

petera
20.11.2015, 16:27
Работать будет если IP контроллера не известен?
ПЛК же будет мастером! Зачем ему знать свой IP?
Мастер в ПЛК будет обращаться слейву в ПК, а у ПК статический, т.е. известный IP адрес.

Денис Бердяев
20.11.2015, 16:30
ПЛК же будет мастером! Зачем ему знать свой IP?
Мастер в ПЛК будет обращаться слейву в ПК, а у ПК статический, т.е. известный IP адрес.

вот хоть что то теперь понятно становится, для меня ModBus темный лес, как сконфигурировать ПЛК чтобы он был мастером

Денис Бердяев
20.11.2015, 16:45
в конфигурации ПЛК даже нет пункта TCP если выбираешь режим мастер, может это в рантайме нужно делать?

Денис Бердяев
20.11.2015, 16:47
если на контроллере клиент и ему нужен только адрес сервера, который у Вас известен, то причем тут какой айпишник у плк?

Можете немножко более углублено объяснить, вот мы выяснили, что контроллер являясь мастером ModBus будет обращатьяс к Slave на ПК по IP адресу ПК то как его сконфигурировать, куда вписать IP и т.д.

capzap
20.11.2015, 16:52
в конфигурации ПЛК даже нет пункта TCP если выбираешь режим мастер, может это в рантайме нужно делать?

в параметры мастера загляните, и еще если читали документацию, то обязательно найдете, есть там и куда адрес задать и с сериального порта на ТСР перейти

Денис Бердяев
20.11.2015, 17:02
дак нету у меня никакой документации, сам разбираюсь находя всё в интернете можете ссылку дать?

Вольд
20.11.2015, 17:25
дак нету у меня никакой документации, сам разбираюсь находя всё в интернете можете ссылку дать?

Вот, читай.

Денис Бердяев
20.11.2015, 19:27
Может кто нибудь помнит готовый проект с ModBusTCP Master на плк при работе через TCP, посмотреть что хоть должно там быть. У меня по итогу к серверу ПЛК подключается и непонятно что передаёт, а может и не передает ничего

petera
21.11.2015, 05:37
Может кто нибудь помнит готовый проект с ModBusTCP Master на плк при работе через TCP, посмотреть что хоть должно там быть. У меня по итогу к серверу ПЛК подключается и непонятно что передаёт, а может и не передает ничего
Примеры здесь http://www.owen.ru/forum/showthread.php?t=13588
См. Пример обмена по протоколу Modbus TCP через порт Ethernet (http://kipshop.ru/Primeri/Samples_plc1xx/Communication/02_Modbus%20TCP.zip)

Вольд
21.11.2015, 09:59
Примеры здесь http://www.owen.ru/forum/showthread.php?t=13588
См. Пример обмена по протоколу Modbus TCP через порт Ethernet (http://kipshop.ru/Primeri/Samples_plc1xx/Communication/02_Modbus%20TCP.zip)

В http://kipshop.ru/Primeri/Samples_plc1xx/Communication/02_Modbus%20TCP.zip конфигурация ПЛК битая.

melky
21.11.2015, 22:29
ага, а кому ПК отвечать будет если требуется ответ от слейва ? на деревню дедушке ?

capzap
22.11.2015, 08:19
ага, а кому ПК отвечать будет если требуется ответ от слейва ? на деревню дедушке ?

а браузер на Вашем телефоне тоже не получает ответов от веб-серверов? Или в чем был Ваш коммент?

Денис Бердяев
27.11.2015, 15:59
И так рассказываю что получилось на данный момент.

На контроллере сфконфигурирован Modbus master и он даже общается с написанным мною сервером на ПК, но толком получается работать только с типов WORD, по строкам при передаче половина данных теряется или доходит не за один раз при слабом канале. Но строки пол беды, как работать с типом real я вообще не понимаю))

Дело в том что на сервер приходит набор (массив) байт, что чему соответсвует я не понмаю

прикладываю таблицу того что увидел при экспериментах


0.5=, 0,3,0,32,4,0, 0, 0, 63,
1.0=, 0,3,0,32,4,0, 0, 128,63,
1.5=, 0,3,0,32,4,0, 0, 192,63,
2.0=, 0,3,0,32,4,0, 0, 0, 64,
2.5=, 0,3,0,32,4,0, 0, 32, 64,
3.0=, 0,3,0,32,4,0, 0, 64, 64,
3.5=, 0,3,0,32,4,0, 0, 96, 64,
4.0=, 0,3,0,32,4,0, 0, 128,64,
4.5=, 0,3,0,32,4,0, 0, 144,64,
5.0=, 0,3,0,32,4,0, 0, 160,64,
5.5=, 0,3,0,32,4,0, 0, 176,64,
6.0=, 0,3,0,32,4,0, 0, 192,64,
6.5=, 0,3,0,32,4,0, 0, 208,64,
7.0=, 0,3,0,32,4,0, 0, 224,64,
7.5=, 0,3,0,32,4,0, 0, 240,64,
8.0=, 0,3,0,32,4,0, 0, 0, 65,
8.5=, 0,3,0,32,4,0, 0, 8, 65,
9.0=, 0,3,0,32,4,0, 0, 16, 65,
9.5=, 0,3,0,32,4,0, 0, 24, 65,
10.0=,0,3,0,32,4,0, 0, 32, 65,
16.0=,0,3,0,32,4,0, 0, 128,65,
16.1=,0,3,0,32,4,205,204,128,65,
16.2=,0,3,0,32,4,154,153,129,65,
16.3=,0,3,0,32,4,102,102,130,65,
16.3=,0,3,0,32,4,51, 51, 131,65,
16.5=,0,3,0,32,4,0, 0, 132,65,
16.6=,0,3,0,32,4,205,204,132,65,
16.7=,0,3,0,32,4,154,153,133,65,
16.8=,0,3,0,32,4,102,102,134,65,
16.9=,0,3,0,32,4,51, 51, 135,65,
32.0=,0,3,0,32,4,0, 0, 0, 66,
32.1=,0,3,0,32,4,102,102,0, 66,
32.2=,0,3,0,32,4,205,204,0, 66,
32.3=,0,3,0,32,4,51, 51, 1, 66,
32.4=,0,3,0,32,4,154,153,1, 66,
32.5=,0,3,0,32,4,0, 0, 2, 66,
32.6=,0,3,0,32,4,102,102,2, 66,
32.7=,0,3,0,32,4,205,204,2, 66,
32.8=,0,3,0,32,4,51, 51, 3, 66,
32.9=,0,3,0,32,4,154,153,3, 66,
33.0=,0,3,0,32,4,0, 0, 4, 66,

Вольд
27.11.2015, 17:33
Умножай в программе ПЛК переменную типа REAL на 100 или 1000 (в зависимости от того сколько цифр после запятой хочешь иметь в итоге), преобразуй в DWORD и предавай в ПК. В приложении для ПК делай обратные преобразования.

Денис Бердяев
27.11.2015, 17:44
Это я и сделал пока, но решение то на костыле))), и DWORD приходит странновато на сервер, например максимальное число для DWORD записываю в переменную на контроллере и на сервер приходи два числа 65535))). Не пробовал ли кто нибудь строки передавать длинной под 50 символов

Yegor
27.11.2015, 18:14
Модбас-мастер — который в конфигураторе — делает отдельный запрос на каждый регистр. С этим можно жить на прямом соединении, но через сотовый канал это наверняка тяжко. Выход — запрашивать сразу весь диапазон одной строкой и строку парсить как байтовый массив.

Денис Бердяев
27.11.2015, 18:28
Модбас-мастер — который в конфигураторе — делает отдельный запрос на каждый регистр. С этим можно жить на прямом соединении, но через сотовый канал это наверняка тяжко. Выход — запрашивать сразу весь диапазон одной строкой и строку парсить как байтовый массив.

как показала практика, на хреновом канале это как раз не вариант, длинная строка может придти не полностью или в середине её окажется какой нибудь "мусор", по факту получается лучше отправлять каждый регистра (WORD) отдельно с разрывом в 500 милисекунд или вообще по изменению, тогда есть шансы что просто что то не дойдет, это лучше, потому что пока программа парсит, могут возникут ошибки и сервер ляжет