Показано с 1 по 9 из 9

Тема: Modbus MasterOPC сервер - проблема с unicode

  1. #1

    По умолчанию Modbus MasterOPC сервер - проблема с unicode

    Необходимо получить и записать в устройство unicode-строку.

    Вводим на самом устройстве строку "1234".
    Настраиваем в OPC-сервере тег: типы string, длина 64 байта, формат строки unicode. Запускаем режим исполнения - получаем строку "1".
    Меняем формат строки на hex - получаем 3100320033003400 (и далее нули).
    Предположительно OPC-сервер интерпретировал строку как ascii и поэтому оборвал ее на первом же нуле.

    Как это выглядит с кириллицей: вводим на устройстве "АБВГ", получаем в формате строки unicode строку из 8 кракозямбр, в формате строки hex - 1004110412041304 (и далее нули).
    Предположительно OPC-сервер интерпретировал строку как ascii.

    Что делать? Версия сервера 4.0.3 Demo.
    Кстати, возможность перестановки байт для строк "Старшим байтом вперед" была бы в нашем случае очень удобна, пока приходится делать это вручную в устройстве.
    Последний раз редактировалось Terminat; 03.07.2017 в 13:06.

  2. #2

    По умолчанию

    Ошибка исправлена - скачайте текущую версию.
    Чередование байт для строки сделать нельзя, так как неизвестна ее длина
    Спасибо.

  3. #3

    По умолчанию

    Спасибо, все работает.
    Жаль. Длина строки вроде бы указывается в настройках тега.

  4. #4

    По умолчанию

    Правильно. Но их может быть больше 8, а чередование байт только для 8 байта.
    Можно скриптами менять чередование.
    Спасибо.

  5. #5

    По умолчанию

    Такова текущая реализация, и новшество с шаблоном перестановки из устройства - отличное. Но речь не о произвольном порядке байт, а только об единственном варианте "Старший байт вперед" для строк: применяемое в данном случае устройство строго следует именно этому правилу для всех типов данных. Предполагаю, что это не уникальная ситуация.
    Мы, как я писал, выполняем перестановку вручную на устройстве (отдельно для чтения и записи), но думаю, что пример скрипта для MasterSCADA или MasterOPC (что выглядит предпочтительнее) будет многим полезен.

    Еще раз - спасибо!

  6. #6

    По умолчанию

    Вам нужно просто задом наперед их?
    function OnRead()
    local str,qual=server.ReadCurrentTag();
    if str==nil then return; end;
    local NewStr="";
    for i=string.len(str),1,-1 do
    NewStr=NewStr..string.sub(str,i,i);
    end;
    server.WriteCurrentTag(str,qual);
    end
    Последний раз редактировалось SCADAMaster; 05.07.2017 в 11:03.
    Спасибо.

  7. #7

    По умолчанию

    Не совсем, нужно попарно поменять байты местами. Т.е. порядок перестановки 10(3254 и далее до конца строки).

  8. #8

    По умолчанию

    В этой строчке:
    NewStr=NewStr..string.sub(str,i,i);
    sub - это выделение определенного символа строки.
    Извлеките каждый символ, а затем склейте строку через оператор .. как вам нужно
    Спасибо.

  9. #9

    По умолчанию

    Увы, вариант вида:
    Код:
    function OnRead()
      local str,qual=server.ReadCurrentTag();
      if str==nil then return; end;
      local NewStr="";
      for i=1,string.len(str),2 do 
        NewStr=NewStr..string.sub(str,i+1,i+1);
        NewStr=NewStr..string.sub(str,i,i);
      end;
      server.WriteCurrentTag(NewStr,qual);
    end
    - для unicode-строки меняет местами символы, а не байты.
    Ладно, вопрос закрыт. Спасибо.

Похожие темы

  1. Ответов: 1108
    Последнее сообщение: 21.03.2024, 08:54
  2. Ответов: 1
    Последнее сообщение: 23.02.2016, 17:53
  3. Ответов: 0
    Последнее сообщение: 19.01.2015, 07:05
  4. Ответов: 1
    Последнее сообщение: 02.01.2015, 15:58
  5. Modbus Universal MasterOPC сервер или Lectus MODBUS OPC?
    от Olegis в разделе Master SCADA 3
    Ответов: 11
    Последнее сообщение: 05.04.2013, 09:35

Ваши права

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