Вопрос решил написанием пары функций. Решил выложить сюда вдруг кому пригодиться :-)
Для начала написал конвертор из байта в символ
Код:
FUNCTION fncWord2String : STRING(1) // Из байта получаем символ.
VAR_INPUT
wdInPut: WORD:=0;
END_VAR
VAR
pByte : POINTER TO BYTE;
bByte : BYTE:=0;
END_VAR
// Через указатели сконвертим word в STRING(1)
// Сначала получим из ворда байт
bByte:=TO_BYTE(wdInPut);
// Запомним адрес этого байта
pByte := ADR(bByte);
// Область памяти со значением байта переложим в STRING(1)
// и отправим на верх.
fncWord2String[0]:=pByte^;
Дальше сама функция перевода строки WSTRING в STRING.
Код:
FUNCTION UNICODE_TO_CP1251_1 : STRING // Строку WSTRING конвертим в STRING.
VAR_INPUT
wsIn : WSTRING(255);
END_VAR
VAR
iCounter : WORD;
wdlen : WORD;
w_Char : WORD;
wsBuff : STRING(254):='';
END_VAR
// Таблица символов 1251. Символ и его соответствующий код.
// https://ru.wikipedia.org/wiki/Windows-1251
// Введем ограничение на длину сообщения
wdlen := MIN(255, INT_TO_WORD(Standard64.WLEN(wsIn)));
FOR iCounter := 0 TO wdlen - 1 DO
w_Char := TO_WORD(wsIn[iCounter]);
(* ASCII диапазон 0x00–0x7F -> копируем как есть *)
IF w_Char <= 16#7F THEN
wsBuff:=Standard.CONCAT(wsBuff, fncWord2String(wdInPut:=w_Char));
(* Кириллица и спецсимволы CP1251: 0400–04FF и некоторые спецсимволы *)
ELSIF (w_Char >= 16#0400) AND (w_Char <= 16#04FF) THEN
(* Таблица маппинга UCS-2 -> CP1251 для кириллицы *)
CASE w_Char OF
16#0410..16#042F: (* А–Я *)
wsBuff:=Standard.CONCAT(wsBuff, fncWord2String(wdInPut:=w_Char - 848));
16#0430..16#044F: (* а–я *)
wsBuff:=Standard.CONCAT(wsBuff, fncWord2String(wdInPut:=w_Char - 848));
16#0401: (* Ё *)
wsBuff:=Standard.CONCAT(wsBuff, 'Ё');
16#0451: (* ё *)
wsBuff:=Standard.CONCAT(wsBuff, 'ё');
ELSE
(* Нестандартные/редкие символы кириллицы -> пропускаем или заменяем *)
wsBuff:=Standard.CONCAT(wsBuff, '?');
END_CASE;
ELSE
(* Символы вне CP1251 — пропускаем либо заменяем на '?' *)
wsBuff:=Standard.CONCAT(wsBuff, '?');
END_IF;
END_FOR;
(* Передадим на верх полученную строку.*)
UNICODE_TO_CP1251_1 := wsBuff;
Понимаю что тут нет двойных ковычек, неразрывных пробелов, переносов строк и т.д. Для меня это не критично, но если кто дополнит/упростит буду ОЧЕНЬ признателен.