Вы уверены? Мне кажется, что LEN не умеет отдавать больше, чем 255.
См.рис:
Безымянный121212.png
ПС: bOlolo объявлена как dword. Тупо забыл имя поменять на dwOlolo.
Вы уверены? Мне кажется, что LEN не умеет отдавать больше, чем 255.
См.рис:
Безымянный121212.png
ПС: bOlolo объявлена как dword. Тупо забыл имя поменять на dwOlolo.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Странно. Не заметил ее сразу.
Протестировал.
Она работала бы. Но вот длину строки 16000 символов она не принимает. Возвращает пустой результат.
А при длине строки 50 символов - работает нормально.
Может это как-то связано с тем, что используется не срока, а указатель на буфер?
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Вообще, размер буфера при вызове функции задается в виде переменной типа INT, так что его максимальное значение 32767 байт.
Ваши строки по размеру близки к граничным значениям - например, склеить две строки по 16000 символов с помощью этой функции не получится.
Один из вариантов решения проблемы предложил выше capzap.
Альтернативный - использовать эту библиотеку:
https://dropmefiles.com/3g5BL
В ней есть своя версия функции StrConcatW, где буфер уже типа UDINT и есть ФБ StringWriter, который предназначен как раз для склеивания длинных строк.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Хорошо. Попробую этот метод.
Создаю массив и указатель:
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.
сложно это передать словами, проектом тоже конкретно надо заниматься чтоб сделать его обучающим, ловите мою тестовую если разберетесь хорошо
Я не пользуюсь wstring потому что в КДС2 их нет, но суть в том что каждую строку и указатель на неё надо задавать с фиксированным количеством символов, тогда в массив они будут попадать в нужные места занимая столько байт сколько нужно
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран