Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: godygadu от 30 Марта 2020, 15:16:32

Название: ASCII символы с OPC в человекочитаемый вид.
Отправлено: godygadu от 30 Марта 2020, 15:16:32
Здравствуйте. С OPC сервера принимаю набор тэгов (максимум 200) в которых может отображаться номер символа из таблицы ASCII (набор закодированных данных - это цифры). Я не могу разобраться, как SCADA может преобразовывать ASCII в, например, String, чтобы оператор мог видеть значение.
Описание:
- OPC - сервер SICK
- Тэги в количестве 200, но значение может отображаться не во всех ячейках, например в 50 или 30, или 10
- Значение в тэге - это номер символа таблицы ASCII
Название: Re: ASCII символы с OPC в человекочитаемый вид.
Отправлено: Simple-Scada от 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.
Название: Re: ASCII символы с OPC в человекочитаемый вид.
Отправлено: godygadu от 30 Марта 2020, 16:13:25
Спасибо. Попробую так.
Название: Re: ASCII символы с OPC в человекочитаемый вид.
Отправлено: godygadu от 09 Апреля 2020, 10:38:45
Здравствуйте. Я попробовал Ваш способ. Он работает, но проблема в том, что скрипт жёстко привязан к промежутку переменных из которых я должен выбирать значения. В эти переменные записываются значения штрихкодов и эти значения не постоянны, следовательно я не знаю промежуток из которого выбирать значения. Может есть возможность записывать переменные в массив, а затем из него производить выборку значений (только из тех ячеек, в которых они есть)?
Название: Re: ASCII символы с OPC в человекочитаемый вид.
Отправлено: Simple-Scada от 10 Апреля 2020, 09:42:56
Длину данных нужно знать в любом случае, т.к. без неё невозможно будет понять когда нужно остановить чтение символов.

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

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