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

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

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

ksapp

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #285 : 20 Апреля 2017, 12:17:15 »
Здравствуйте. Вы всё делаете правильно. Событие двойного клика перекрывается обработкой ввода. Исправим в будущих обновлениях.

Спасибо. Будем ждать ))) Кстати, остальные события для TM_Field проверил - тоже не обрабатываются.

И ещё нашёл небольшую неприятность )))

В документации ничего не сказано про функцию Inc. То есть её как бы нет.
Но если эту функцию использовать в скрипте, то при компиляции не выдаётся никаких ошибок. То есть она как бы есть, хотя и не работает.
Желательно тоже либо реализовать её, либо сделать так, чтобы компилятор сообщал об ошибке.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #286 : 20 Апреля 2017, 13:19:32 »
Цитировать
В документации ничего не сказано про функцию Inc. То есть её как бы нет.
Но если эту функцию использовать в скрипте, то при компиляции не выдаётся никаких ошибок
Inc и Dec стандартные функции инкремента и декремента, которые можно заменить на: Value := Value + 1; и Value := Value - 1;

Цитировать
То есть она как бы есть, хотя и не работает.Желательно тоже либо реализовать её, либо сделать так, чтобы компилятор сообщал об ошибке.
Она есть и работает без ошибок, а если компилятор сообщает об ошибке, значит не просто так. Приведите пример кода, который у Вас не получается скомпилировать.

ksapp

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #287 : 21 Апреля 2017, 09:16:07 »
Цитировать
Она есть и работает без ошибок, а если компилятор сообщает об ошибке, значит не просто так. Приведите пример кода, который у Вас не получается скомпилировать.
Я как раз и говорил, что ошибок компилятор не выдаёт, а функция не работает. Вот код
Код: (delphi)
CurrCmdTime.Value := CurrCmdTime.Value + 1;
который работает. А вот так:
Код: (delphi)
Inc(CurrCmdTime.Value);
не работает. При этом никаких ошибок не выдаётся. Просто значение переменной не увеличивается.
CurrCmdTime.Value - это глобальная переменная. Возможно, с локальными переменными функция работает - не проверял.
« Изменён: 28 Ноября 2018, 11:19:29 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #288 : 21 Апреля 2017, 09:19:19 »
Цитировать
А вот так: не работает.
Правильно, и не должна. В функцию нужно передавать конкретную переменную, а не свойство (как CurrCmdTime.Value). Например так:
Код: (delphi)
var 
  I: Integer;
begin
  I := CurrCmdTime.Value;
  Inc(I);
  CurrCmdTime.Value := I;
end.

И просто CurrCmdTime передать в функцию также нельзя, т.к. это не обычная переменная, а объект с типом TM_Variable и множеством своих свойств и методов.
« Изменён: 28 Ноября 2018, 11:16:50 от Simple-Scada »

ksapp

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #289 : 21 Апреля 2017, 11:27:49 »
Понял. Спасибо.

И всё-таки хотелось бы иметь возможность объявлять глобальные переменные и константы именно как обычные переменные/константы, а не как объекты. Потому что использование объектов в некоторых случаях (таких, например, как описанный ранее) вызывает неудобство, и периодически наступаешь на одни и те же грабли, забывая, что глобальная переменная на самом деле является объектом. Наверно, со временем привыкну, но всё же...

P.S. А вообще в Паскале в функцию можно передавать в том числе и свойство объекта. Поэтому и не могу никак привыкнуть ))))
« Изменён: 21 Апреля 2017, 11:30:27 от ksapp »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #290 : 21 Апреля 2017, 11:59:34 »
Цитировать
И всё-таки хотелось бы иметь возможность объявлять глобальные переменные и константы именно как обычные переменные/константы, а не как объекты.
Такая возможность планируется, но не в ближайшее время.

Цитировать
А вообще в Паскале в функцию можно передавать в том числе и свойство объекта.
В паскале, как и в делфи нельзя передавать свойства объекта в функции Inc, Dec. У нас в компиляторе то же самое, ведь наш компилятор по сути является компилятором Паскаль, с незначительными отличиями.

beloleg86

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #291 : 23 Апреля 2017, 02:48:01 »
Добрый день, у меня уже был вопрос по объекту "Заслонка". Есть сигнал положения привода от 0 до 100 (%), по нему я определяю универсальным скриптом цвет заслонок, раньше при запуске сервера и проекта заслонкам присваивались цвета в зависимости от их положения на момент запуска. Сейчас заметил, что после обновлений перестали присваиваться цвета заслонок, все стандартные серые, до того момента пока не пройдет граничное положение смены цвета, например, при запуске проекта заслонка закрыта 0 - цвет серый (должен быть оранжевый), при открывании проходя границу с 5 до 6 цвет переключается на желтый как и должно быть, ну а дальше все по скрипту работает. Ну и также если открыта или в промежуточном положении. До этого скрипт работал отлично, но после какого то обновления заслонки стали вести себя так. 
Код: (delphi)
begin
  if Sender is TM_Valve then                   // проверяем, что Sender это заслонка:
    with Sender as TM_Valve do                 // приводим объект к типу TM_Valve:
      case TM_Valve(Sender).AsInt of           // если значение переменной равно:
        -5..5 :                                // = -5 до 5 то считаем что заслонка закрыта
        begin
          Sender.Color := RGB(255, 128, 0);    // меняем цвет на оранжевый
        end;

        6..95 :                                // = 6 до 94 то считаем что заслонка в промежуточном
        begin
          Sender.Color := RGB(255, 255, 0);    // меняем цвет на желтый
        end;

        95..105 :                              // = 95 до 105 то считаем что заслонка открыта
        begin
          Sender.Color := RGB(0, 255, 0);      // меняем цвет на зеленый
        end;
    end;
end.
« Изменён: 28 Ноября 2018, 11:16:30 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #292 : 23 Апреля 2017, 13:22:10 »
beloleg86, здравствуйте. Исправим в обновлении в ближайшее время.

ksapp

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #293 : 24 Апреля 2017, 06:32:05 »
Цитировать
В паскале, как и в делфи нельзя передавать свойства объекта в функции Inc, Dec. У нас в компиляторе то же самое, ведь наш компилятор по сути является компилятором Паскаль, с незначительными отличиями.
Ну вот зацепили вы меня прям этим вопросом. Специально проверил:
Код: (delphi)
type MyObj = object
  Svoistvo : integer;
end;

var MyVar : MyObj;

begin
  MyVar.Svoistvo := 0;
  Inc(MyVar.Svoistvo);
end.

В Делфи всё прекрасно компилируется и работает. Кстати, в вашей системе вот такая конструкция:
Код: (delphi)
type MyObj = object
  Svoistvo : integer;
end;

вообще не компилируется - выдаётся ошибка. В то время как вот это:
Код: (delphi)
type MyRec = record
  Svoistvo : integer;
end;
компилируется нормально.
« Изменён: 28 Ноября 2018, 11:15:34 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #294 : 24 Апреля 2017, 09:30:53 »
Уважаемый ksapp, мы занимаемся разработкой программ на языке Delphi уже долгое время, Simple-Scada также полностью написана на Delphi и, конечно, мы не стали бы писать о передаче свойств, если бы не были уверены в правильности написанного. Как и было описано в пред. сообщении, в делфи и паскале нельзя передавать свойства объекта в функции Inc и Dec, т.к. эти функции используют передачу параметра по ссылке. Также нельзя передавать свойства объектов в любые другие процедуры и функции, если в них требуется передача параметра по ссылке, а не по значению.

В своём примере Вы передаёте в функцию Inc переменную объекта MyObj, а не свойство. Подробнее про свойства объектов можно прочесть здесь. И объект со свойством будет выглядеть так:
Код: (delphi)
type 
  MyObj = class
  private
    function GetSvoistvo: Integer;
    procedure SetSvoistvo(AValue: Integer);
  public
    property Svoistvo: integer read GetSvoistvo write SetSvoistvo;
  end;

var
  MyVar : MyObj;

// здесь нужно описать функцию GetSvoistvo и SetSvoistvo, мы пропустим описание

begin
  MyVar.Svoistvo := 0;
  Inc(MyVar.Svoistvo);  // здесь будет ошибка компиляции
end.

В упрощенном виде примерно так и выглядит класс Переменной (TM_Variable) в Simple-Scada 2. И в редакторе скриптов Вы работаете именно со свойствами объектов, а не переменными и на это есть много причин, одна из них - скрытие от пользователя (и ограничение доступа к переменным) о которых ему лучше не знать.

Кстати, в вашей системе вот такая конструкция:
Код: (delphi)
type MyObj = object
  Svoistvo : integer;
end;
вообще не компилируется - выдаётся ошибка. В то время как вот это:
Не компилируется, т.к. ключевое слово object использовалось для объявления классов в объектной модели Turbo Pascal. В современных компиляторах используется объектная модель Object Pascal и ключевое слово class. Подробнее про объектные модели здесь. Поэтому объявление класса должно быть таким:

Код: (delphi)
type 
  MyObj = class
    Svoistvo: integer;
  end;
« Изменён: 28 Ноября 2018, 11:14:16 от Simple-Scada »

ksapp

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #295 : 24 Апреля 2017, 11:27:24 »
Понятно. Спасибо за разъяснения.

AllReal

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #296 : 03 Мая 2017, 08:53:10 »
Доброе утро, подскажите пожалуйста, как сделать обращение к пользователю программное, что бы в окне отображался активный пользователь?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #297 : 03 Мая 2017, 12:30:40 »
Здравствуйте.

Т.е. нужно просто отобразить имя пользователя в окне? Для этого можно разместить в окне объект Текст и создать новый скрипт с типом события "Авторизация пользователя" и в этом скрипте написать такой код:

Код
begin
  Text1.Text := GetUserName;
end.

Функция GetUserName возвращает имя активного пользователя.
« Изменён: 03 Мая 2017, 12:31:27 от Simple-Scada »

AllReal

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #298 : 03 Мая 2017, 12:41:50 »
Спасибо за помощь!

AllReal

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #299 : 11 Мая 2017, 09:53:53 »
Добрый день, подскажите пожалуйста, при задачи переменной любое значение больше 100 становится 100, при этом шкала от -70000 до 70000  не могу найти проблему((( если задаю меньше 100 вписывает правильно, и так же не правильно вписывает отрицательные значения