Страница 5 из 6 ПерваяПервая ... 3456 ПоследняяПоследняя
Показано с 41 по 50 из 54

Тема: СПК1хх & Сокеты

  1. #41

    По умолчанию

    Вы уверены? Мне кажется, что LEN не умеет отдавать больше, чем 255.
    См.рис:

    Безымянный121212.png

    ПС: bOlolo объявлена как dword. Тупо забыл имя поменять на dwOlolo.

  2. #42
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,211

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Вы уверены? Мне кажется, что LEN не умеет отдавать больше, чем 255.
    См.рис:

    Безымянный121212.png

    ПС: bOlolo объявлена как dword. Тупо забыл имя поменять на dwOlolo.

    Да, вы правы, я ошибся - забыл, что у вас строки по 10000 символов.
    В вашем случае надо использовать функцию StrLenA из библиотеки StringUtils.

  3. #43

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Да, можно использовать функцию StrConcatA из библиотеки StringUtils
    Скажите, а какую функцию можно использовать для супер-длинных строк типа wString?

  4. #44

  5. #45

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    StrConcatW
    Странно. Не заметил ее сразу.

    Протестировал.
    Она работала бы. Но вот длину строки 16000 символов она не принимает. Возвращает пустой результат.
    А при длине строки 50 символов - работает нормально.
    Может это как-то связано с тем, что используется не срока, а указатель на буфер?

  6. #46
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Может это как-то связано с тем, что используется не срока, а указатель на буфер?
    я бы советовал не заниматься строками на прямую, а брать массив байт и в него складывать свои стоковые пояснения и значения, а посети отправлять указатель на массив
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #47
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,211

    По умолчанию

    Цитата Сообщение от ВладОвен Посмотреть сообщение
    Странно. Не заметил ее сразу.

    Протестировал.
    Она работала бы. Но вот длину строки 16000 символов она не принимает. Возвращает пустой результат.
    А при длине строки 50 символов - работает нормально.
    Может это как-то связано с тем, что используется не срока, а указатель на буфер?
    Вообще, размер буфера при вызове функции задается в виде переменной типа INT, так что его максимальное значение 32767 байт.
    Ваши строки по размеру близки к граничным значениям - например, склеить две строки по 16000 символов с помощью этой функции не получится.

    Один из вариантов решения проблемы предложил выше capzap.

    Альтернативный - использовать эту библиотеку:
    https://dropmefiles.com/3g5BL

    В ней есть своя версия функции StrConcatW, где буфер уже типа UDINT и есть ФБ StringWriter, который предназначен как раз для склеивания длинных строк.

  8. #48

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Ваши строки по размеру близки к граничным значениям - например, склеить две строки по 16000 символов с помощью этой функции не получится.
    Сейчас детально посмотрел. Вы правы: при 16000 строка еще работает, а при 20000 - уже не работает.

  9. #49

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    я бы советовал не заниматься строками на прямую, а брать массив байт...
    Хорошо. Попробую этот метод.

    Создаю массив и указатель:

    arrDataSend : ARRAY[1..20000] OF BYTE; // Буфер для отправки
    wPointer : WORD := 0; // Указатель для накидывания новых строк в буфер

    wsLine01 : WSTRING := "Строка с кириллицей номер 01"; // Наша первая строка
    wsLine02 : WSTRING := "Строка с кириллицей номер 02"; // Наша вторая строка
    wsLine03 : WSTRING := "Строка с кириллицей номер 03"; // Наша третья строка

    Программа по склеиванию:

    // Первая строка:
    MEM.MemMove(ADR(wsLine01), ADR(arrDataSend[wPointer]), len(wsLine01));
    wPointer := wPointer + (len(wsLine01) * 2);

    // Вторая строка:
    MEM.MemMove(ADR(wsLine02), ADR(arrDataSend[wPointer]), len(wsLine02));
    wPointer := wPointer + (len(wsLine02) * 2);

    // Третья строка:
    MEM.MemMove(ADR(wsLine03), ADR(arrDataSend[wPointer]), len(wsLine03));
    wPointer := wPointer + (len(wsLine03) * 2);

    // Отправка на сервер:
    ...
    fbTcpWrite(xExecute:=TRUE, hConnection:=fbTcpClient.hConnection, pData:=ADR(arrDataSend), szSize:=wPointer);
    ...

    Указатель каждый раз инкрементируется на len*2 (из-за WSTRING) и каждая следующая строка начинает ложиться в буфер по новому значению.
    Тут есть вопрос: len не хочет отдавать длину строки, если она wstring. Видимо, len работает только со string. Какая функция отдаст длину wstring?

    И вообще, я правильно понял предложенную реализацию?
    Спасибо.
    Последний раз редактировалось ВладОвен; 12.12.2022 в 14:34.

  10. #50
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    сложно это передать словами, проектом тоже конкретно надо заниматься чтоб сделать его обучающим, ловите мою тестовую если разберетесь хорошо

    Я не пользуюсь wstring потому что в КДС2 их нет, но суть в том что каждую строку и указатель на неё надо задавать с фиксированным количеством символов, тогда в массив они будут попадать в нужные места занимая столько байт сколько нужно
    Вложения Вложения
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 5 из 6 ПерваяПервая ... 3456 ПоследняяПоследняя

Похожие темы

  1. UDP + Python + сокеты
    от БугиВуги в разделе Сетевые технологии
    Ответов: 0
    Последнее сообщение: 08.05.2020, 12:17
  2. PLC 110-30 v2 & сокеты
    от lazy в разделе ПЛК1хх [М02]
    Ответов: 50
    Последнее сообщение: 23.11.2018, 15:26
  3. ПЛК100 2.17 не работают сокеты
    от murdemon в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 02.07.2018, 21:15
  4. ПЛК100 + Сокеты
    от ribamuka в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 30.08.2017, 11:55
  5. Возможно ли в режиме эмуляции Codesys тестировать работу через сокеты TCP
    от Денис Бердяев в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 09.10.2014, 08:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •