PDA

Просмотр полной версии : Socket и ПЛК



o_nik
13.10.2009, 19:32
Доброго времени суток.

Пишу реализацию протокола поверх TCP/IP, использую SysLibSockets.
Возникает несколько вопросов:
Пока идет просто передача "неосмысленных" пустых пакетов без парсинга содержимого.
ПЛК является сервером, ПК - клиентом, отправляю пакеты запроса 30 Кб с ПК на ПЛК, получаю ответы 30 Кб обратно.
1. Максимальный объем принимаемых за 1 вызов SysSockRecv равен 512 Кб? можно ли увеличить этот объем?
2. Максимальный объем передаваемых SysSockSend 1536 Кб? Аналогично, можно ли больше?
3. Скорость обмена ПЛК - ПК через Ethernet выходит не более 100-200 Кбит/с, это нормальная скорость или можно сделать быстрее?
4. Помимо реализации протокола поверх TCP на этом же контроллере идет прием широковещательных пакетов с двух других ПЛК по UDP (Ваша стандартная реализация). Может ли UDP мешать работе сокета?
5. Можно в SysSockListen(socket, 1); использовать 2 и более соединения?
6. Как определить IP-адрес присоединившегося к сокету клиента?, в структуре SOCKADDRESS его вроде не проявляется.
7. ПЛК 304/308 уже в продаже? как у них обстоят дела с Ethernet?

o_nik
20.10.2009, 09:24
все-таки хотелось бы чтобы тех.поддержка овен ответила

Филоненко Владислав
20.10.2009, 10:48
Доброго времени суток.

Пишу реализацию протокола поверх TCP/IP, использую SysLibSockets.
Возникает несколько вопросов:
Пока идет просто передача "неосмысленных" пустых пакетов без парсинга содержимого.
ПЛК является сервером, ПК - клиентом, отправляю пакеты запроса 30 Кб с ПК на ПЛК, получаю ответы 30 Кб обратно.
1. Максимальный объем принимаемых за 1 вызов SysSockRecv равен 512 Кб? можно ли увеличить этот объем?

512 Кб о_О???? Столько памяти в программе CoDeSys нету...



2. Максимальный объем передаваемых SysSockSend 1536 Кб? Аналогично, можно ли больше?

Нельзя. Но можно вызвать функцию 2 раза :)


3. Скорость обмена ПЛК - ПК через Ethernet выходит не более 100-200 Кбит/с, это нормальная скорость или можно сделать быстрее?

Нельзя, ПЛК предназначен для регулирования, Ethernet - вспомогательная функция и приоритет её низок. Опять же, откуда Вы берете 200Кбит/с данных?


4. Помимо реализации протокола поверх TCP на этом же контроллере идет прием широковещательных пакетов с двух других ПЛК по UDP (Ваша стандартная реализация). Может ли UDP мешать работе сокета?

какого сокета? 1 соединение-1 сокет. Число сокетов ограничено. Для сетевых переменных затят 1 UDP сокет (если их включили). Для CoDeSys занят 1 TCP сокет всегда.


5. Можно в SysSockListen(socket, 1); использовать 2 и более соединения?

Нет. 1 соединение-1 сокет. Число сокетов ограничено. Никакого произвольного распределения ресурсов. Хотите 5 соединений - сообщите об этом контроллеру явно. Чтобы в "ответственный" момент сокетов "вдруг" не оказалось меньше требуемых соединений.


6. Как определить IP-адрес присоединившегося к сокету клиента?, в структуре SOCKADDRESS его вроде не проявляется.


использовать функцию SysSockRecvFrom - в поле pSockAddr возвращается адрес и порт клиента.

[QUOTE=o_nik;28902]


7. ПЛК 304/308 уже в продаже? как у них обстоят дела с Ethernet?
Нет. Есть 2 порта Ethernet в наличии.

o_nik
20.10.2009, 13:00
512 Кб о_О???? Столько памяти в программе CoDeSys нету...
Ошибся, 512 байт и 1536 байт, естественно, я имел в виду

Опять же, откуда Вы берете 200Кбит/с данных?
Примерно прикинул скорость "на глазок" (тем более Кбит, а не Кбайт)

Остальное понятно, спасибо.

Филоненко Владислав
20.10.2009, 14:28
прочитать за раз можно тоже не более 1536, т.к. это максимальный размер 1 пакета. но и эту функцию можно вызвать 2 раза :)

я имел в виду не измеренную на глазок скорость, так и есть, а потребность в ней. 200кбит/с еще надо умудрится сгенерить.

Леонид
01.07.2011, 14:46
прочитать за раз можно тоже не более 1536, т.к. это максимальный размер 1 пакета. но и эту функцию можно вызвать 2 раза :)

я имел в виду не измеренную на глазок скорость, так и есть, а потребность в ней. 200кбит/с еще надо умудрится сгенерить.

1.
А вот у меня никак не получается прочитатьбольше чем 492 байта в одной посылке!
Нет ли у вас примерчика проектов где это получилось сделать?
2.
Если вызвать функцию чтения 2 раза, то если я хочу получить 3000 байт,
нкжно первым вызовом прчитать первые 1500 байт , а вторым оставшиеся 1500 байт?
C каим флагом в таком случае нужно вызывать функцию ?