Добрый день, всем читающим данную тему.
У нас есть контроллер ПЛК100 с прошивкой 2.15.8.
Нам потребовалось организовать сбор данных с контроллеров ПЛК100 на ПК. Мы реализовали передачу необходимых данных через ModbusTCP используя библиотеку Modbus.lib 27.5.09. Все прекрасно работало "на столе" во время разработки, когда же перенесли контроллер в рабочую сеть, то передача данных работать перестала. Поясню - у нас на предприятии сеть Ethernet разделена на два сегмента: один для офисных компьютеров, а другой для производственного оборудования. Между этими двумя сетями установлен программный шлюз (маршрутизатор). Сделано это по соображениями безопасности, чтобы подключиться к производственному оборудованию можно было только с тех компьютеров в офисной сети, для которых такой доступ разрешен на маршрутизаторе.
По началу подозревали какую-либо специфическую ошибку в программе на ПЛК или ПК. Для тестирования на ПЛК была создана минимальная версия программы для передачи данных по ModbusTCP. Проект с данной программой (ModbusTcpClient) прикладываю к данному сообщению. Как можно видеть из проекта, в нем используется всего одна функция MB_CLIENT, которая вызывается каждые 5 секунд и записывает содержимое трех регистров Modbus в устройстве Slave (по компьютерной терминологии это надо бы назвать сервером), которым являлся персональный компьютер с запущенной программой по приему Modbus пакетов. Адрес контроллера у нас при тестировании был всегда один и тот же - 172.17.0.94. Если компьютер имеет IP адрес из той же подсети, например 172.17.0.95, то данные успешно приходят и пакеты можно наблюдать в Wireshark. Но стоит только перенести ПК в другую подсеть, например 172.17.32.138, то данные сразу перестают приходить и в Wireshark не видно никаких попыток контроллера соединиться.
Изучая данную проблему глубже, я начал копаться в кодах библиотеки Modbus.lib и стал подозревать, что проблема в другой библиотеке SysLibSockets 20.2.06. Чтобы проверить свои предположения я нашел на данном форуме проект по реализации сетевого ping на ПЛК. И решил его протестировать. Мои опасения подтвердились - если компьютер имеет IP адрес из той же подсети что и контроллер, например все тот же 172.17.0.95, то пинги проходят нормально - контроллер видит ответы и в Wireshark видны как входящие, так и исходящие ICMP пакеты. Но стоит только сменить IP адрес компьютера на другую подсеть, например 172.17.32.138, то ping пропадает. Данный проект также прикладываю.
Сразу хочу отметить, что компьютерная сеть настроена на 100% верно - данные подсети существуют уже не первый год и в каждой из подсетей расположено довольно много разного оборудования (компьютеры, принтеры, контроллеры Siemens, серверы и т.д.) и связь между этим оборудованием по различным протоколам работает замечательно. Сетевые настройки на ПЛК установлены также верно - задан IP адрес, маска подсети, адрес маршрутизатора такие же как на другом оборудовании в этой же подсети.
Собственно после всех этих тестирований, на которые было потрачено время и силы, у маня появилось стойкое подозрение, что контроллер, в частности ПЛК100, не способен по Ethernet передавать данные устройствам, которые находятся в другой подсети. Мне до сих пор не хочется в это верить, особенно читая на данном форуме темы по созданию Web серверов на контроллерах или удаленного управления, ведь все эти задачи не могут быть выполнены без передачи данных между различными подсетями, но мой реальный опыт пока свидетельствует о том, что данные между разными подсятеми контроллером не передаются.
Очень хочется услышать отзывы разработчиков или специалистов имеющих опыт по организации сетевого взаимодействия на контроллерах Овен. Был бы очень рад, если бы кто-нибудь указал в приложенных мною проектах ошибки, которые не позволяют передавать данные между различными подсетями или выложил бы 100% рабочий проект где такое взаимодействие успешно реализовано.