PDA

Просмотр полной версии : Работа с сокетами.



Antadalion
01.07.2016, 09:47
Здравствуйте. Нашел на форуме пример (не один) и пытаюсь в нем разобраться. Через комутаторы соединены два контроллера 110-30 m02 и еще я свой ноутбук к ним подключил. Запускаю этот проект в каждом контроллере.
IP адреса контроллеров 192.127.1.1 и 192.127.1.2.
Подскажите, правильно ли я понимаю работу проекта?
1. флаги binitS и binitC инициализирует открытие сокета на сервере и клиенте соответственно.

2. diClSocket:=TcpClientOpenSocket(502, '192.127.1.1', SIZEOF(BUF_SND)); тут из функции TcpClientOpenSocket с заданными параметрами возвращается дискриптор сокета, я так понял если он не -1 значит сокет открыт.

3. для сервера так же
diSrSocket:=TcpServerOpenSocket(502, 2, SIZEOF(BUF_RCV));

Не соображу где показать контроллеру откуда считывать, есть функции TcpReceiveData и TcpSendData, им же нужно указать друг на друга ( в разных контроллерах) через ADR? Нужно объявить глобальную переменную? Или я вообще не правильно понимаю как происходит обмен?

Antadalion
15.07.2016, 14:03
Вот еще попытки организовать передачу между 2мя ПЛК. Дискрипторы возвращают отличное от "-1" (SOCKET_INVALID) значение, причем это значение постоянно увеличивается, но ничего не передается, связи нет. Что должны возвращать функции SysSockSetOption, SysSockConnect(1,0 "да", "нет"?), SysSockAccept (дискриптор подключившегося порта?) и SysSockInetAddr (в параметрах указан ip адрес сервера) при состоявшемся успешном соединении?

Antadalion
20.07.2016, 10:42
Вот проекты сервера и клиента, которые заработали. С каждой стороны отправляется string "str" и на каждой стороне принимается в строку "str2". Все бы ничего только после отключения проектов эксперимент повторить не удалось. Обмена нет.

capzap
20.07.2016, 10:59
Вот проекты сервера и клиента, которые заработали. С каждой стороны отправляется string "str" и на каждой стороне принимается в строку "str2". Все бы ничего только после отключения проектов эксперимент повторить не удалось. Обмена нет.
ну какое то странное программирование, обычно сервер должен отвечать на запросы, а у Вас после того как клиент подключился сразу идет отправка каких то данных, да может клиент еще не готов принять. И эта пародия на таймаут может еще каким то образом влиять, не совпадать состояния фаз работы у клиента и сервера
мой пример запускался при каждом включении программы http://www.owen.ru/forum/showthread.php?t=12729&p=83823&viewfull=1#post83823

Antadalion
22.07.2016, 08:34
Пример взят из видео (http://www.youtube.com/watch?v=ThVLXygHnnU) с описанием сокетов и их работы для CDSv3. Если сбросить питание контроллеров и затем запустить сервер и клиент (последовательность важна), то обмен работает, но стоит лишь остановить кого нибудь, то все, до следующего сброса питания. Можете пояснить, что происходит при сбросе питания, почему сокеты начинают так себя вести? На видео объясняют, что такое явление происходит при работе сокетом в блокирующем режим, а для неблокирующего режима нужна функция SysSockIoctl(hSocket, SOCKET_FIONBIO, ADR(mode)) где mode =1, которая в свою очередь после прочтения тем на форуме превратилась в SysSockSetOption(hSocket,SOCKET_SOL,SOCK_NBIO,0,0) для ПЛК110-30 M02.
Видео примеры, где обмен работает, и где я пытался его сломать.
https://yadi.sk/i/WO6resSqtX3fg обмен
https://yadi.sk/i/So80cUz4tX3hC эксперименты

Antadalion
22.07.2016, 13:47
Все это на самом деле предисловие для использования библиотек OSCAT. При использовании вложенного в библиотеку примера MB_CLIENT в параметрах IP_C видно, что открывается сокет клиента (возвращает дискриптор). А вот пример MB_SERVER при загрузке в контролер и старте вылетает с ошибкой соединения. Кстати все функции SysSockConnect в библиотеке oscat'a приведены в овенский порядок (для срабатывания на -1).

Antadalion
25.07.2016, 07:13
Еще такой вопрос, через библиотеку OSCAT вообще можно организовать чтение SLAVE-конфигурации через конструкцию MB_CLIENT из библиотеки? Или обязательно нужно запускать MB_Serever из OSCAT'A??

Antadalion
01.08.2016, 15:31
Пытаюсь реализовать клиент через библиотеку OSCAT. Блок IP_CONTROL2 привел в порядок, через него по TCP идет обмен.(см. скрин screen_IP_CONTROL). При добавлении блока MB_CLIENT для реализации протокола ModBus TCP, возникает ошибка FF 0000 - таймаут соединения (см. скрин screen_MB_CLIENT+IP_CONTROL). Подскажите, может кто-нибудь сталкивался? Во вложении сам проект.

Antadalion
03.08.2016, 15:37
В блоке MODBUS_CLIENT массив DATA имеет размер 255, при считывании регистров удается считать только 125 регистров. Можно ли считывать большее количество регистров?

capzap
03.08.2016, 15:56
В блоке MODBUS_CLIENT массив DATA имеет размер 255, при считывании регистров удается считать только 125 регистров. Можно ли считывать большее количество регистров?

нет, всё упрется в 9 байт посылки