Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

asutpvit

#615
Цитата: serg от 17 апреля 2018, 04:04:29Подскажите , как переменную типа REAL  (codesys ) вывести на скаду ?

Хочу вывести показания температуры с двумя знаками после запятой . В codesys есть переменная тип REAL , а в simple-scada SINGLE . Думаю , надо   в codesys real умножить на 100 и преобразовать в integer , а в скаде integer преобразовать в single и разделить на 100 . Не могу разобраться со скриптом преобразования типов (Преобразует целое число Value в строку).

Или как-то делается по другому .
а через какой opc передаете в скаду переменную? как она представлена в opc? Скажу на своем примере - у меня базис-21 контроллеры передают тоже в основном данные в формате реал, но через свой родной opc, в скаде вообще ничего не трогаю за исключением шкал. А modbus tcp устройства уже идут через aropc и вот для них нужно каждую переменную настраивать: масштабировать, подбирать порядок байт. Эт все к чему - скада всего лишь отображает то что ей передают, поэтому смотрите на opc сервер как он передает данные скаде

serg


Simple_Scada

#617
Здравствуйте!

ЦитироватьПодскажите , как переменную типа REAL  (codesys ) вывести на скаду ? Хочу вывести показания температуры с двумя знаками после запятой . В codesys есть переменная тип REAL , а в simple-scada SINGLE . Думаю , надо   в codesys real умножить на 100 и преобразовать в integer , а в скаде integer преобразовать в single и разделить на 100 . Не могу разобраться со скриптом преобразования типов (Преобразует целое число Value в строку).
Для вывода любой переменной (в том числе и с типом Real) в скаду не требуется использование скриптов. Если у Вас на OPC-сервере переменная настроена правильно и имеет тип Real, то можно:
  • Импортировать переменную с OPC-сервера. В этом случае редактор сам определит тип переменной на OPC-сервере и выставит соответствующий тип(Single) в редакторе переменных.
  • Добавить переменную вручную. В этом случае тип данных нужно указать самостоятельно. Типу Real соответствует тип Single в редакторе переменных.



serg


aleks218

#619
Добрый день!
Не подскажите в чём может быть ошибка не компилируется скрипт в  строке "UTF8Delete(aVar.AsUTF8String,30,i-30);"
Пишет Types if actual and formal var parameters must be identical
Код: pascal
var 
    aText: TM_Text;
    aVar: TM_Variable;
    s: string;
    i: integer;
begin
    aText := GetTextByName('TextV'+ IntToStr( Field1namevyt.Tag));  // ищем объект "Текст" с именем "TextV(I)"
    aVar:= GetVariableByName('Name_vyt'+ IntToStr( Field1namevyt.Tag));
    aVar.Value:= Name_vyt.Value ;
    i:= UTF8Length (aVar.AsUTF8String);
    if i > 30 then
      UTF8Delete(aVar.AsUTF8String,30,i-30);

    if FileExists('Ventyleit_'+ IntToStr( Field1namevyt.Tag)+'.txt', '') then
    begin
       TextFileOpen('Ventyleit_'+ IntToStr( Field1namevyt.Tag)+'.txt','' , fomRewrite, fcpUTF8);   // открываем файл для чтения
       TextFileWriteLn(aVar.AsUTF8String);
       TextFileClose;   // закрываем файл
    end;
end.

TeNQ

#620
Непонятно почему, но компилятору не нравится преобразование типа переменной aVar в параметрах функции в данном случае. Если использовать промежуточную переменную, то код компилируется.
Код: pascal
var
  aTry: utf8string;
begin  
  aTry := aVar.AsUTF8String;
  if  i > 30 then
    UTF8Delete(aTry, 30, i-30);
end.

Simple-Scada

#621
Процедура UTF8Delete объявлена так:
Код: pascal
procedure UTF8Delete(var AStr: UTF8String; AFrom, ACount: Integer);
, перед параметром AStr стоит ключевое слово "var", это означает, что параметр должен быть передан по ссылке (работа напрямую с переменной), а не по значению (работа с локальной копией переменной). Т.е. данная процедура возьмёт указанную строковую переменную и будет работать с ней напрямую, меняя её. Поэтому передать свойство "aVar.AsUTF8String" в эту процедуру нельзя, нужно обязательно передавать переменную. Верное решение предложил TeNQ выше, нужно объявить отдельную строковую переменную и получить в неё значение "aVar.AsUTF8String", затем работать с этой переменной удаляя в ней символы.

kedr

Два вопроса:
1. Типу переменной LongWord какой тип соответствует в Object Pascal? Есть ли что-то типа TM_Variable.AsLongWord ?
2. Если в скрипте в цикле несколько сотен раз читается/пишется TM_Variable.Value, имеет ли смысл заводить локальную переменную (lVar:=Sender.Value в начале и Sender.Variable.Value:=lVar в конце скрипта), или обращения непосредственно к свойству .Value достаточно эффективны?

Simple-Scada

#623
Цитировать1. Типу переменной LongWord какой тип соответствует в Object Pascal? Есть ли что-то типа TM_Variable.AsLongWord?
Если объявляете локальную переменную в скрипте, то можно так и объявлять: "MyVar: LongWord;". При взятии значения переменной используйте TM_Variable.AsInt64.

ЦитироватьЕсли в скрипте в цикле несколько сотен раз читается/пишется TM_Variable.Value, имеет ли смысл заводить локальную переменную (lVar:=Sender.Value в начале и Sender.Variable.Value:=lVar в конце скрипта), или обращения непосредственно к свойству .Value достаточно эффективны?
Идеальный вариант по производительности: взять значение перед циклом в локальную переменную и работать с ней, например:
Код: pascal
var
  i: integer;
  aValue: Integer;
begin
  aValue := myVariable.AsInt;
  for i := 0 to 1000000 do
  begin
    // здесь работаем с aValue вместо myVariable.AsInt
  end;
end.
Такой вариант быстрее, но вряд ли удастся заметить прирост в производительности "на глаз".

atomix

#624
Как реализовать вот такое в скриптах (т.е. работа с СОМ объектами).

Код: pascal
V := CreateOleObject('PDFCreator.clsPDFCreator');
V.Test('ok test.');

Пишет ошибку "need insert 'IMPORT_ActiveX.pas'"
очень такое нужно, если это получится то я все проекты переведу на вашу скаду (мне она понравилась).

kedr

Можно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?

Simple-Scada

atomix, на следующей неделе опубликуем обновление. В нём будет добавлена поддержка работы с COM-объектами.

Цитата: kedr от 10 мая 2018, 22:32:51Можно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?
Нет, это невозможно. Если переменные имеют однотипные имена отличающиеся только номером, то можно перебрать переменные в цикле получая их по имени через функцию GetVariableByName, но это плохой вариант по производительности даже несмотря на то, что GetVariableByName выполняет поиск по хеш-таблице.

kedr

Цитата: Simple-Scada от 11 мая 2018, 10:35:46Нет, это невозможно. Если переменные имеют однотипные имена отличающиеся только номером, то можно перебрать переменные в цикле получая их по имени через функцию GetVariableByName, но это плохой вариант по производительности даже несмотря на то, что GetVariableByName выполняет поиск по хеш-таблице.
Понятно, жаль.
Предлагаю ввести функции типа GetVariableByID и MaxVariableID для возможности прохождения по всем переменным в цикле.

atomix

Большое спасибо.

И еще Аваст ругается (пишет вирус IDP.Generic) и помещает файлы Server.exe и sscrep.exe в карантин.

А еще в скаде (SimpLight) есть такое - https://support.simplight.ru/knowledge-bases/2/articles/299-integratsiya-simp-light-i-oborudovaniya-radsel-ccu825

Может эти объекты (TIdHTTP и TlkJSON, или такие же по возможностям на ваш выбор, что вам легче внедрить) тоже сможете добавить будет вообще замечательно.

Simple_Scada

Здравствуйте!

ЦитироватьИ еще Аваст ругается (пишет вирус IDP.Generic) и помещает файлы Server.exe и sscrep.exe в карантин.
Simple-Scada использует систему защиты от взлома основанную на виртуализации кода. Если Ваш антивирус ложно определяет Simple-Scada 2, как вирус, то необходимо добавить сервер Simple-Scada 2 (Server.exe) и sscrep.exe в исключения. С результатами антивирусного анализа можно ознакомиться здесь.

ЦитироватьМожет эти объекты (TIdHTTP и TlkJSON, или такие же по возможностям на ваш выбор, что вам легче внедрить) тоже сможете добавить будет вообще замечательно
Поддержку контроллеров RADSEL добавлять не планируется.