Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: ASCII символы с OPC в человекочитаемый вид.  (Прочитано 1254 раз)

godygadu

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Здравствуйте. С OPC сервера принимаю набор тэгов (максимум 200) в которых может отображаться номер символа из таблицы ASCII (набор закодированных данных - это цифры). Я не могу разобраться, как SCADA может преобразовывать ASCII в, например, String, чтобы оператор мог видеть значение.
Описание:
- OPC - сервер SICK
- Тэги в количестве 200, но значение может отображаться не во всех ячейках, например в 50 или 30, или 10
- Значение в тэге - это номер символа таблицы ASCII
« Изменён: 30 Марта 2020, 15:34:12 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: ASCII символы с OPC в человекочитаемый вид.
« Ответ #1 : 30 Марта 2020, 15:45:03 »
Здравствуйте.

Допустим нужно взять коды символов из внешних переменных Letter1, Letter2, Letter3, перевести их в строку и отобразить в компоненте Text1. Тогда код будет таким:
Код: (delphi)
begin
  Text1.Text := UTF8Encode(AnsiChar(Letter1.AsInt) + AnsiChar(Letter2.AsInt) + AnsiChar(Letter3.AsInt));
end.

Если переменных для символов много, то можно автоматизировать построение строки с помощью подпроцедуры. Пусть у нас есть 10 внешних переменных, которые хранят коды символов: Letter1, Letter2, Letter3... Letter10. Тогда их можно вот так перевести в строку:
Код: (delphi)
  { вспомогательная функция для перевода переменных с кодами в строку }
  function MyConvert(const APrefix: string; AFrom, ATo: Integer): string;
  var
    I: Integer;
    aVar: TM_Variable;
  begin
    Result := '';
    for I := AFrom to ATo do
    begin
      aVar := GetVariableByName(APrefix + IntToStr(I));
      if aVar <> nil then
        Result := Result + AnsiChar(aVar.AsInt);
    end;
  end;

begin
  // инициализируем для примера
  Letter1.Value := 192;
  Letter2.Value := 193;
  Letter3.Value := 194;
  Letter4.Value := 195;
  Letter5.Value := 196;
  Letter6.Value := 197;
  Letter7.Value := 198;
  Letter8.Value := 199;
  Letter9.Value := 200;
  Letter10.Value := 201;

  // получаем строки из переменных Letter1..Letter10
  Text1.Text := UTF8Encode(MyConvert('Letter', 1, 10));   // Text1.Text := 'АБВГДЕЖЗИЙ'
end.
« Изменён: 30 Марта 2020, 15:46:13 от Simple-Scada »

godygadu

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: ASCII символы с OPC в человекочитаемый вид.
« Ответ #2 : 30 Марта 2020, 16:13:25 »
Спасибо. Попробую так.

godygadu

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Re: ASCII символы с OPC в человекочитаемый вид.
« Ответ #3 : 09 Апреля 2020, 10:38:45 »
Здравствуйте. Я попробовал Ваш способ. Он работает, но проблема в том, что скрипт жёстко привязан к промежутку переменных из которых я должен выбирать значения. В эти переменные записываются значения штрихкодов и эти значения не постоянны, следовательно я не знаю промежуток из которого выбирать значения. Может есть возможность записывать переменные в массив, а затем из него производить выборку значений (только из тех ячеек, в которых они есть)?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: ASCII символы с OPC в человекочитаемый вид.
« Ответ #4 : 10 Апреля 2020, 09:42:56 »
Длину данных нужно знать в любом случае, т.к. без неё невозможно будет понять когда нужно остановить чтение символов.

Цитировать
Может есть возможность записывать переменные в массив, а затем из него производить выборку значений (только из тех ячеек, в которых они есть)?
У массивов тоже есть длина и если она не будет известна, то возникнет та же проблема.

Не существует каких-то автоматических решений в этой задаче, т.к. скада никак не сможет угадать длину штрихкода. Передайте как-то длину в скаду, например через отдельную переменную и переводите в символы столько данных, сколько указывает переменная длины. Второй вариант: при заполнении штрихкода - обнулять все символы которые превысили длину. Тогда в скаде можно проходить по всем переменным до тех пор, пока не встретится переменная с кодом 0 и на ней останавливать чтение.