Убрать таймаут и запустить таймер от xEnable до xActive.
Вид для печати
А вот еще вопрос.
Тот, кто писал эту библиотеку (NBS), почему он сделал ФБ TCP_Client с параметром udiTimeOut,
а ФБ TCP_Read без этого параметра?
Ну было бы удобно задавать тайм-аут параметром, а не доп.таймером при чтении данных от сервера!
Разве нет?
Ладно. Вот такой вопрос.
Сервер не отвечает, потому что нету в моей строке завершающего символа с кодом 0.
Как его туда поставить? Думаю так:
1. Раз за разом перед началом чистить мою 10к-строку, чтобы в ней все символы были равны 0.
2. Формировать мою строку на сервер.
3. Непосредственно при отправке в ФБ fbTcpWrite вписывать так:
fbTcpWrite(xExecute:=TRUE, hConnection:=fbTcpClient.hConnection, pData:=ADR(sDataSend), szSize:=SIZEOF(sDataSend) +1 );
Так получится?
Буфер будет на один символ длиннее, а там 0 (см. п1.).
Мы в OwenCommunication в ФБ UNM_TcpRequest так и сделали.Цитата:
Ну было бы удобно задавать тайм-аут параметром, а не доп.таймером при чтении данных от сервера!
Разве нет?
Так что наши клиенты могут обойтись и без доп. таймера.
Если вы делаете SIZEOF от строки - то отправляется и "завершающий символ с кодом 0".
Потому что в CODESYS строки нуль-терминированные.
https://ru.wikipedia.org/wiki/%D0%9D...BE%D0%BA%D0%B0
Более того - отправляется ровно столько байт, сколько выделено под строку (потому что вы используете SIZEOF).
Т.е. если в вашей STRING(10000) реально всего 100 символов - то будут отправлены эти 100 символов и еще 9901 нулевых байт следом.
Буфер не будет "на один символ длиннее".Цитата:
Буфер будет на один символ длиннее, а там 0 (см. п1.).
Вы просто пытаетесь убедить блок в том, что размер вашей переменной на один байт больше, чем на самом деле.
Результат вы уже видели.
Т.е. строка в таком случае всегда вылетает с этим символом 0? Даже, если я напишу "МАМА", то вылетят не 4, а 5 символов?
Т.е. я понял смысл нуль-терминальной строки, но как происходит выход такой строки в порт?
Ваши предположения неверны.
Вложение 64346