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

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

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 318792 раз)

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #615 : 17 Апреля 2018, 06:44:15 »
Подскажите , как переменную типа REAL  (codesys ) вывести на скаду ?

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

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

serg

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #616 : 17 Апреля 2018, 16:06:36 »
ОРС от codesys .

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1175
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #617 : 19 Апреля 2018, 09:54:50 »
Здравствуйте!

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


« Изменён: 19 Апреля 2018, 10:19:28 от Simple-Scada »

serg

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #618 : 19 Апреля 2018, 22:44:46 »
Спасибо , разобрался .

aleks218

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #619 : 27 Апреля 2018, 15:25:50 »
Добрый день!
Не подскажите в чём может быть ошибка не компилируется скрипт в  строке "UTF8Delete(aVar.AsUTF8String,30,i-30);"
Пишет Types if actual and formal var parameters must be identical
Код: (delphi)
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.
« Изменён: 26 Мая 2018, 10:04:11 от Simple-Scada »

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #620 : 27 Апреля 2018, 22:10:50 »
Непонятно почему, но компилятору не нравится преобразование типа переменной aVar в параметрах функции в данном случае. Если использовать промежуточную переменную, то код компилируется.
Код: (delphi)
var
  aTry: utf8string;
begin 
  aTry := aVar.AsUTF8String;
  if  i > 30 then
    UTF8Delete(aTry, 30, i-30);
end.
« Изменён: 26 Мая 2018, 13:41:19 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #621 : 28 Апреля 2018, 09:54:45 »
Процедура UTF8Delete объявлена так:
Код: (delphi)
procedure UTF8Delete(var AStr: UTF8String; AFrom, ACount: Integer);
, перед параметром AStr стоит ключевое слово "var", это означает, что параметр должен быть передан по ссылке (работа напрямую с переменной), а не по значению (работа с локальной копией переменной). Т.е. данная процедура возьмёт указанную строковую переменную и будет работать с ней напрямую, меняя её. Поэтому передать свойство "aVar.AsUTF8String" в эту процедуру нельзя, нужно обязательно передавать переменную. Верное решение предложил TeNQ выше, нужно объявить отдельную строковую переменную и получить в неё значение "aVar.AsUTF8String", затем работать с этой переменной удаляя в ней символы.
« Изменён: 26 Мая 2018, 10:11:26 от Simple-Scada »

kedr

  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
LongWord
« Ответ #622 : 04 Мая 2018, 12:57:14 »
Два вопроса:
1. Типу переменной LongWord какой тип соответствует в Object Pascal? Есть ли что-то типа TM_Variable.AsLongWord ?
2. Если в скрипте в цикле несколько сотен раз читается/пишется TM_Variable.Value, имеет ли смысл заводить локальную переменную (lVar:=Sender.Value в начале и Sender.Variable.Value:=lVar в конце скрипта), или обращения непосредственно к свойству .Value достаточно эффективны?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #623 : 04 Мая 2018, 21:14:31 »
Цитировать
1. Типу переменной LongWord какой тип соответствует в Object Pascal? Есть ли что-то типа TM_Variable.AsLongWord?
Если объявляете локальную переменную в скрипте, то можно так и объявлять: "MyVar: LongWord;". При взятии значения переменной используйте TM_Variable.AsInt64.

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

atomix

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #624 : 10 Мая 2018, 20:22:37 »
Как реализовать вот такое в скриптах (т.е. работа с СОМ объектами).

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

Пишет ошибку "need insert 'IMPORT_ActiveX.pas'"
очень такое нужно, если это получится то я все проекты переведу на вашу скаду (мне она понравилась).
« Изменён: 26 Мая 2018, 10:06:19 от Simple-Scada »

kedr

  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #625 : 10 Мая 2018, 22:32:51 »
Можно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #626 : 11 Мая 2018, 10:35:46 »
atomix, на следующей неделе опубликуем обновление. В нём будет добавлена поддержка работы с COM-объектами.

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

kedr

  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #627 : 11 Мая 2018, 14:40:53 »
Нет, это невозможно. Если переменные имеют однотипные имена отличающиеся только номером, то можно перебрать переменные в цикле получая их по имени через функцию GetVariableByName, но это плохой вариант по производительности даже несмотря на то, что GetVariableByName выполняет поиск по хеш-таблице.
Понятно, жаль.
Предлагаю ввести функции типа GetVariableByID и MaxVariableID для возможности прохождения по всем переменным в цикле.

atomix

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #628 : 11 Мая 2018, 16:34:23 »
Большое спасибо.

И еще Аваст ругается (пишет вирус 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

  • Администратор
  • *****
  • Сообщений: 1175
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #629 : 11 Мая 2018, 17:04:39 »
Здравствуйте!

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

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