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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Simple Scada

Страницы: [1] 2 3 ... 11
1
Здравствуйте.

Можно выполнять проверку превышения оригинального значения переменной (например, используя свойство "OriginalAsInt") над максимумом шкалы переменной и выдавать соответствующее сообщение. Пример универсального скрипта на событие "OnDataChange" объекта, с которым связана переменная:
Код: (delphi)
begin
  if Sender is TM_Object then   // проверяем, что Sender это объект
    with Sender as TM_Object do // приводим Sender к типу "TM_Object"
      if Variable.OriginalAsInt > Maximum then
        AddMessage(Now, mkAlarm, 'Значение переменной "' + Variable.Name +
        '" вышло за пределы диапазона допустимых значений: ' + AsStr, True, False);
end.

2
Ваши вопросы / Re: Прозрачная кнопка
« : 20 Марта 2024, 11:42:27 »
Здравствуйте.

См. скриншот во вложении.

3
Ваши вопросы / Re: Время работы за сутки
« : 15 Марта 2024, 13:32:29 »
Здравствуйте.

Цитировать
Результат выводится в поле Calendar, с отключенным значением даты и временем в формате hh:mm:ss
Проблема в том, что если агрегат работал все 24 часа, то в поле Calendar выводится 00:00:00
В компонент "Календарь" и переменную типа "DateTime" нельзя вывести значение времени больше чем 23:59:59. Если время наработки/простоя может быть больше 23:59:59, то его можно выводить в компонент "Текст", как это описано в примере №2 по ссылке.

Цитировать
Как сделать так, чтобы в таком случае отображалось 24:00:00 ?
Значение 24:00:00 можно отобразить в компоненте "Текст". Для этого компонент "Текст" нужно связать с переменной "DateTime_Val" и на событие OnDataChange написать универсальный скрипт:

Код: (delphi)
var
  aSeconds: Int64;
begin
  if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
    begin
      aSeconds := SecondsBetween(0, DateTime_Val.AsDateTime); // получить кол-во секунд
      Text := SecondsToStr(aSeconds);     // переводит секунды в строку вида "чч:мм:сс".
    end;
end.

4
Ваши вопросы / Re: Ошибки OPC серверов
« : 12 Марта 2024, 11:22:24 »
Здравствуйте.

Проверьте имена переменных в конфигурации OPC-сервера. Возможно, имена переменных содержат начальные/конечные пробелы или непечатаемые символы. Если в именах переменных имеются такие символы или пробелы, то для корректной работы нужно в конфигурации OPC-сервера удалить начальные и конечные пробелы и непечатаемые символы.

Если дело не в этом, то пришлите нам на support@simple-scada.com конфигурацию OPC-сервера и текущую версию Вашего проекта для проверки.

5
Здравствуйте.

В web-клиенте "Режим масштабирования" работает иначе, чем в десктоп-клиенте. Подробнее см. по ссылке.

6
Ваши вопросы / Re: Вопрос по таймерам
« : 07 Марта 2024, 10:27:32 »
Здравствуйте.

Данные скрипты так, как Вы описали, работать не будут. Таймерные процедуры рассмотрены по ссылке. Пример работы с таймерами можно найти в демо-проекте -> страница "Скрипты" -> "Простые скрипты (1)" -> пример №3). Если нужно поставить таймер на паузу, то нужно использовать процедуру "TimerPause". Если сбросить, то "TimerReset".

Чтобы при достижении значения переменной "vrTime" значения, заданного в календаре "Cal", таймер останавливался или сбрасывался, в скрипт (на событие "OnDataChange" компонента "Текст" с которым связана переменная "vrTime") нужно добавить соответствующую проверку и выполнение процедур "TimerPause" или "TimerReset":
Код: (delphi)
begin
  // если значение таймера >= значение календаря, то ставим таймер на паузу
  if CompareDateTime(vrTime.AsDateTime, Cal.AsDateTime) >= 0 then
    TimerPause(vrTime);

  Text.Text := IntToStr(TimerGetState(vrTime));
end.
Также, в скрипте на кнопку Пуск нужно удалить строку "vrTime.Value := Cal.Value;"

Если не разберетесь, то пришлите для проверки на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" и укажите скрипты, которые нужно проверить. Опишите подробно, какую именно задачу Вы пытаетесь решить? Если требуется включать/выключать какое-либо оборудование по расписанию, то для этого можно использовать компонент "Расписание".

7
Ваши вопросы / Re: Вопрос по SELECT, MSSQL и Quality.
« : 29 Февраля 2024, 10:22:14 »
Здравствуйте.

Да, это нормально. Если "Поле" не связано с переменной, то оно будет доступно для ввода и в него выведется значение, указанное в редакторе (см. свойство "Значение").

При необходимости "Поля" которые не связаны с переменной (не указана подстановка или переменной с указанным именем не существует) можно скрывать. Для этого на событие "OnInit" шаблона/шаблонного окна нужно написать такой код:
Код: (delphi)
var
  aObj: TM_Object;
begin
  aObj := GetTemplateObject('Field1');
  aObj.Visible := aObj.Variable <> nil;
 
  aObj := GetTemplateObject('Field2');
  aObj.Visible := aObj.Variable <> nil;
end.
В скрипте нужно перечислить все возможные объекты, которые предполагается скрывать.

8
Ваши вопросы / Re: Вопросы по WEB в Simple-Scada 2
« : 27 Февраля 2024, 19:04:09 »
Извините, допустили ошибку в скрипте "raport_LVP". Правильный код:
Код: (delphi)
var
  aReport: TM_Report;
begin
  if ArcGroupTag = 2 then
  begin
    aReport := ReportBuildEx('Рапорт электроэнергия ЛВП', ClientData);
    aReport.View(ClientData.Name);
  end;
end.

9
Ваши вопросы / Re: Вопросы по WEB в Simple-Scada 2
« : 27 Февраля 2024, 15:05:39 »
Здравствуйте.

1. См. описание функции "GetClientName" – она не будет работать в скрипте с типом события "Выполнены архивные процедуры". Вместо GetClientName можно указать имя клиента, на котором требуется открыть/сохранить отчёт (имя клиента задаётся через настройки - "Имя этого клиента") или константу SS_SERVER_NAME для сохранения отчёта на серверном ПК (см. пример 6 по ссылке). 

2. Возможно, в Вашем случае проще создать Периодический отчет (если подходит). В нем можно использовать необходимые типы обработки, например "среднее", что позволит получить средневзвешенное по времени значение между значением переменной на конец интервала и значением на начало интервала. При этом архивные процедуры использовать не придётся.

3. Если вычислять архивные данные требуется именно в скриптах Simple-Scada, то для открытия отчета на клиенте, который вызвал вычисление архивных процедур по нажатию на кнопку, можно использовать следующий способ:
  • Перейдите в меню редактирования скриптов и создаёте новый глобальный модуль, например с именем "GlobalUnit" и следующим кодом:
Код: (delphi)
interface

var
  ClientData: TM_ClientData;

implementation

end.
  • В код скрипта, который вызывает вычисление архивных процедур (скрипт должен вызываться действием пользователя, например "OnClick"), добавьте строку:
Код: (delphi)
ClientData := GetClientData;
  • Код скрипта "raport_LVP" измените так:
Код: (delphi)
var
  aReport: TM_Report;
begin
  if ArcGroupTag = 2 then
  begin
    aReport := ReportBuild('Рапорт электроэнергия ЛВП');
    aReport.View(ClientData.Name);
  end;
end.
Не забудьте сохранить проект и перезапустить его на сервере.

10
Здравствуйте.

Пример универсального скрипта на событие OnDataChange поля:
Код: (delphi)
var
  aAngle: Double;
begin
  if Sender is TM_Field then   // проверяем, что Sender это поле
    with Sender as TM_Field do // приводим Sender к типу "TM_Field"
      begin
        // Проверка ввода на корректность
        if (AsFloat < -1) or (AsFloat > 1) then
          AddMessage(Now, mkAlarm, 'Ошибка: косинус должен быть в диапазоне от -1 до 1. Значение: ' + AsStr , True, True)
        else
        begin
          // Расчёт угла в радианах по формуле arccos(x)=arctan(sqrt(1-sqr(x))/x)
          aAngle := arctan(sqrt(1 - sqr(AsFloat)) / AsFloat);

          // Перевод угла из радиан в градусы
          aAngle := aAngle * 180 / pi;
 
          // Вывод результата
          VariableEx.Value := aAngle;
          AddMessage(Now, mkMessage, 'Угол, косинус которого равен ' + AsStr + ', равен ' + VariableEx.AsStr + ' градусов.', True, False);
        end;
      end;
end.
Переменную "cos_a_48086532" нужно указать в свойство "Переменная" поля, а переменную "angle_a_48086532" – в свойство "Доп. переменная" поля. Пример проекта во вложении.

11
Здравствуйте.

Если нужно формировать отчет только из данных выделенной строки таблицы, то при выделении нужной строки записывайте значения ячеек в переменные (как в примере по ссылке) и формируйте отчет с текущими данными.
Также можно в отчете создать переменные и перед построением отчета передать в них значения из строки таблицы. Чтобы установить значение в переменную отчета можно использовать метод SetVariableValue, см. пример по ссылке.

Если требуется что-то другое, то опишите подробно, что именно требуется.

12
Ваши вопросы / Re: Вопросы по WEB в Simple-Scada 2
« : 22 Января 2024, 15:05:47 »
Здравствуйте.

Убедитесь, что в скрипте формирования отчета указано не конкретное имя клиента, а используется функция "GetClientName". Web-клиент не является отдельным приложением и работает в браузере, поэтому он получает случайно сгенерированное имя. Чтобы получить это имя, нужно использовать функцию "GetClientName".

Если дело не в этом, то повторите проблему, завершите работу сервера скады и пришлите нам на почту support@simple-scada.com целиком папку с логами "..\Simple-Scada 2\Logs". Также пришлите текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\", укажите отчет и скрипт, которые нужно проверить.

13
Здравствуйте.

В секции initialization глобального модуля нельзя использовать функции поиска, т.к. на момент инициализации список, по которому осуществляется поиск, еще не сформирован. Можно перенести код из секции initialization в отдельный скрипт по событию "Запуск проекта".

14
Здравствуйте.

Если используется десктоп-клиент, то закройте его полностью и запустите повторно. Если используется web-клиент, то очистите кэш браузера или перезагрузите страницу с очисткой кэша и протестируйте повторно.

15
Здравствуйте.

У переменной в источнике данных можно изменить "Тип" на "timespan" (см. скриншот во вложении). Тогда значение переменной будет преобразовываться автоматически. Если количество часов может быть более 24, то можно использовать способ, описанный по ссылке.

Страницы: [1] 2 3 ... 11