Объявление

Свернуть
Пока нет объявлений.

Кодировка cp855

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Кодировка cp855

    Доброго дня.
    В какой кодировке работает STRING переменные? Я понимаю что это ASCII, но что делать с кириллицей?
    Мне нужно, как-то, на выходе получить кириллицу в кодировке cp855.
    Помогите разобраться в этом вопросе.

  • #2
    Сообщение от Nimnul Посмотреть сообщение
    Доброго дня.
    В какой кодировке работает STRING переменные? Я понимаю что это ASCII, но что делать с кириллицей?
    Мне нужно, как-то, на выходе получить кириллицу в кодировке cp855.
    Помогите разобраться в этом вопросе.
    Добрый день, если задача состоит в том, чтобы отобразить кириллицу на дисплее ПЛК, в проекте CODESYS, то нужно использовать переменную типа wstring. Такая переменная текст выводит через элемент "Текстовое поле" с заполнителем %s либо %ws. Если же Вам нужно конвертировать из String в Wstring или обратно, тогда нужно использовать функции из биб-ки AgavaTypes, StrToWstring, WstrToString

    Комментарий


    • #3
      Сообщение от Пушкарев Андрей Посмотреть сообщение

      Добрый день, если задача состоит в том, чтобы отобразить кириллицу на дисплее ПЛК, в проекте CODESYS, то нужно использовать переменную типа wstring. Такая переменная текст выводит через элемент "Текстовое поле" с заполнителем %s либо %ws. Если же Вам нужно конвертировать из String в Wstring или обратно, тогда нужно использовать функции из биб-ки AgavaTypes, StrToWstring, WstrToString
      Задача немного другая.
      Есть массив 2 колонки 10 строк тип STRING. Этот массив прикручен в визуализации к выпадающему меню. С выпадающего меню, нужно выбрать какую либо строку. Соответственно получаем две строковые переменные (не более 50 символов). Потом мне нужно объединить эти строки в одну с разделителем. Этот текст программа должна преобразовать в кодировку cp855.
      К этому тексту я в текстовой переменной добавляю служебные символы и по нажатию экранной кнопки, эта финальная строка, через сокет, улетает в другую железку.
      Последний раз редактировалось Nimnul; 30-01-2024, 06:42 PM.

      Комментарий


      • #4
        Сообщение от Nimnul Посмотреть сообщение

        Задача немного другая.
        Есть массив 2 колонки 10 строк тип STRING. Этот массив прикручен в визуализации к выпадающему меню. С выпадающего меню, нужно выбрать какую либо строку. Соответственно получаем две строковые переменные (не более 50 символов). Потом мне нужно объединить эти строки в одну с разделителем. Этот текст программа должна преобразовать в кодировку cp855.
        К этому тексту я в текстовой переменной добавляю служебные символы и по нажатию экранной кнопки, эта финальная строка, через сокет, улетает в другую железку.
        Пробуйте использовать функции из биб-ки AgavaTypes, StrToWstring. Функция делает преобразование string в cp1251, перекодировки в cp855 нет, нужно реализовывать собственноручно.

        Комментарий


        • #5
          Это можно решить через утилиту iconv.
          Но, для этого её нужно вызвать из ОС.
          Отсюда два вопроса:
          1. Есть ли утилита в составе прошивки?
          2. Как можно обратиться к терминалу Linux из CDS?

          Комментарий


          • #6
            Сообщение от Nimnul Посмотреть сообщение
            Это можно решить через утилиту iconv.
            Но, для этого её нужно вызвать из ОС.
            Отсюда два вопроса:
            1. Есть ли утилита в составе прошивки?
            2. Как можно обратиться к терминалу Linux из CDS?
            1. iconv нет в составе OS Linux
            2. К терминалу можно обратиться через биб-ку SysProcess, нужная функция SysProcessExecuteCommand
            вот например исполнение команды рестарта рантайма.
            FUNCTION restart : RTS_IEC_RESULT
            var
            sCommand :string := 'systemctl restart codesys ';
            end_var
            // перезапуск RunTime Codesys
            SysProcessExecuteCommand(pszComand := sCommand, pResult := ADR(restart));

            Комментарий


            • #7
              Сообщение от Пушкарев Андрей Посмотреть сообщение

              1. iconv нет в составе OS Linux
              2. К терминалу можно обратиться через биб-ку SysProcess, нужная функция SysProcessExecuteCommand
              вот например исполнение команды рестарта рантайма.
              FUNCTION restart : RTS_IEC_RESULT
              var
              sCommand :string := 'systemctl restart codesys ';
              end_var
              // перезапуск RunTime Codesys
              SysProcessExecuteCommand(pszComand := sCommand, pResult := ADR(restart));
              Короче говоря, более-менее простым способом, получить текст в нестандартной кодировке не получится.
              Можно ли попросить, разработчиков, добавить в библиотеку AgavaTypes, функции перекодировки кириллицы в cp855, cp866, KOI8-R, в будущие релизы?

              Комментарий


              • #8
                Сообщение от Nimnul Посмотреть сообщение

                Короче говоря, более-менее простым способом, получить текст в нестандартной кодировке не получится.
                Можно ли попросить, разработчиков, добавить в библиотеку AgavaTypes, функции перекодировки кириллицы в cp855, cp866, KOI8-R, в будущие релизы?
                Разработчики такие вопросы самостоятельно не решают. Если такой функционал требуется, его нужно согласовывать с руководством, напишите официальное письмо в КБ-АГАВА, его рассмотрят, примут решение.

                Комментарий


                • #9
                  Добавить перекодировку между внутренним string и cp855 в SDK можно, но на это уйдет время. Сколько это займет пока сказать сложно, в плане такой работы нет.
                  Может быть быстрее будет самому написать перекодировщик? В интернете полно примеров для С++, адаптировать для ST не должно быть слишком сложно.
                  Преобразуйте string в cp1251, потом сделайте перекодирование 1251 -> 855.
                  Вот к примеру алгоритм преобразования 1251-866 с форума геймдев (за корректность не ручаюсь 😎:

                  Код HTML:
                  char *winstrtodos(char *buffer)
                  {
                    char *ptr=buffer;
                    while (*ptr!='\0')
                    {
                      if ( (*ptr>=0x80+0x40)&&(*ptr<=0xAF+0x40) )
                        *ptr =(char)(*ptr-0x40);
                      if ( (*ptr>=0xE0+0x10)&&(*ptr<=0xEF+0x10) )
                        *ptr = (char)(*ptr-0x10);
                      if (*ptr==0xA8) *ptr=0xF0;
                      if (*ptr==0xB8) *ptr=0xF1;
                      ptr++;
                    }
                    return (buffer);
                  }

                  Комментарий


                  • #10
                    Сообщение от Nimnul Посмотреть сообщение

                    Короче говоря, более-менее простым способом, получить текст в нестандартной кодировке не получится.
                    Можно ли попросить, разработчиков, добавить в библиотеку AgavaTypes, функции перекодировки кириллицы в cp855, cp866, KOI8-R, в будущие релизы?

                    вот пример перекодировки с 1251 в CP866. Используется биб-ка SysFile от 3s

                    function convert : RTS_IEC_RESULT
                    var_input
                    pData: pointer to byte;
                    size: udint;
                    end_var
                    var
                    n: udint;
                    end_var

                    if ( pData = nullptr ) or ( size = 0 ) then return; end_if

                    convert := SysFileSetPos( _handle, 0 );

                    // Перекодировка из CP1251 в CP866.
                    for n := 1 to size do

                    if ( pData[ n - 1 ] >= 192 ) and ( pData[ n - 1 ] <= 239 ) then pData[ n - 1 ] := pData[ n - 1 ] - 64; elsif ( pData[ n - 1 ] >= 240 ) and ( pData[ n - 1 ] <= 255 ) then pData[ n - 1 ] := pData[ n - 1 ] - 16; elsif ( pData[ n - 1 ] = 168 ) then pData[ n - 1 ] := 240; // Ё elsif ( pData[ n - 1 ] = 184 ) then pData[ n - 1 ] := 241; // ё end_if
                    end_for

                    SysFileWrite( _handle, pData, size, adr( convert) );

                    Комментарий


                    • #11
                      Хорошо, а может быть есть возможность работать с кодировкой UTF-8?
                      Ввод данных, либо из массива через выпадающее меню визуализации, либо с кириллической клавиатуры визуализации.

                      Комментарий


                      • #12
                        Сообщение от Nimnul Посмотреть сообщение
                        Хорошо, а может быть есть возможность работать с кодировкой UTF-8?
                        Ввод данных, либо из массива через выпадающее меню визуализации, либо с кириллической клавиатуры визуализации.
                        Попробуйте использовать биб-ки из вложения. В разделе POUs\Converting+Formatting\extended string functions есть функции преобразования, а именно STRING_TO_UTF8.
                        Вероятно, это поможет решить Ваш ворос. Если же это не сработает, тогда нужно писать самостоятельно функционал по конвертации.
                        Вложения
                        Последний раз редактировалось Пушкарев Андрей; 21-02-2024, 11:56 AM.

                        Комментарий

                        Обработка...
                        X