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

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

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

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


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

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

1. В любых непонятных ситуациях нужно в первую очередь проверить журнал сервера скады. С большой вероятностью в нем будут содержаться ошибки или предупреждения, которые укажут, в чем именно проблема.
2. В примере по ссылке описано, как сохранять значение требуемой переменной с заданной периодичностью в свою таблицу БД. Если строго следовать руководству, то проблем быть не должно. Убедитесь, что в проекте настроено подключение к БД и в указанной БД создана таблица "my_archive".
3. Какая версия Simple-Scada используется? Возможно, Вы используете версию с ограничением на выполнение SQL-запросов – это версии Minimal и Demo-64.
4. Если требуется архивация переменных, то в этом случае использовать скрипты не требуется. Для этого нужно у требуемых переменных настроить архивацию – описание доступных способов архивации и их настроек доступно по ссылке. Тогда, после запуска проекта переменные, у которых включена архивация будут архивироваться в БД и можно будет работать с архивными данными этих переменных, например просмотреть тренды, создать отчет и т.д.

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

2
Ваши вопросы / Re: Время, таймер и так далее
« : 18 Февраля 2026, 10:52:37 »
Здравствуйте.

Цитировать
Timer:TDateTime;
Timer := SecondsBetween(StrToTime(tblSchedule.GetCell(4, 1).Text), StrToTime(tblSchedule.GetCell(2, 1).Text));
См. описание функции "SecondsBetween" – она возвращает целое число, а вы пытаетесь записать его в переменную TDateTime.

Цитировать
tblSchedule.GetCell(5, 2).Text := TimeToStr(Timer); // не работает, выводит только нули
Чтобы преобразовать секунды в строку, необходимо использовать функцию "SecondsToStr".

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

Для этого в колонке данных с переменной "Qтв" можно выполнять умножение на 0.2388 – см. скриншот во вложении.

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

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

В нашем примере время задаётся по переменной "vrTime", которая расположена в календаре. Для календаря задан формат времени "мм:сс" (минуты и секунды), чтобы задавать часы, нужно изменить формат времени, например на "чч:мм:сс".

Внесли изменения в проект – во вложении.

5
Для этого в окне можно разместить компонент "Фигура", растянуть её на всё окно и установить нужный цвет. Чтобы фигура не мешала при редактировании, её можно выделить и "заморозить" через меню "Действия -> Заморозить".

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

Чтобы цвет, введённый в формате HEX, применился, необходимо нажать кнопку "Ок" – см. скриншот во вложении.

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

1. В именах объектов нельзя использовать подстановки.
2. Работа с шаблонами в скриптах рассмотрена по ссылке.
3. Рекомендуем всегда стараться использовать универсальные скрипты.
4. Ознакомьтесь с примерами использования кнопок по ссылке.

Для описанной Вами задачи можно использовать следующий способ:
1. В шаблоне создать необходимые кнопки с одним состоянием и задать нужное значение в состоянии для каждой кнопки.
2. В свойство "Тег" кнопок указать значения, соответствующие значениям, которые должны принимать кнопки при их нажатии.
3. Создать универсальный скрипт со следующим кодом:
Код: (delphi)
begin
  if Sender is TM_Button then      // проверяем, что Sender это кнопка
    with Sender as TM_Button do    // приводим Sender к типу "TM_Button"
      if AsInt = Tag then          // если значение переменной кнопки равно значению, указанному в свойстве "Тег", то
        Color := clGreen           // изменить цвет кнопки на зеленый
      else                         // иначе
        Color := RGB(109,109,109)  // изменить цвет кнопки на серый
end.
4. Назначить скрипт на событие "OnDataChange" всех кнопок.
5. Готово. Пример проекта во вложении.

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

Начиная с версии 2.7.0.0 изменилась система прав пользователей – права пользователей перенесены в группы. Рекомендуем ознакомиться с пояснениями по переходу на новую систему прав пользователей.

В Вашем случае проблема, скорее всего, в том, что подключение выполняется под одним и тем же пользователем, который находится в группе с отключенной опцией "Множественная авторизация". Включите данную опцию или создайте отдельных пользователей для каждого клиента. Далее сохраните, перезапустите проект и протестируйте повторно.

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

При указании пути в конце обязательно должен быть символ "\".

10
Ваши вопросы / Re: Элемент Флажок
« : 09 Декабря 2025, 11:08:30 »
Здравствуйте.

Цитировать
Как исключить повторное отжатие флажка, не используя его скрытие с экрана
Для изменения доступности объекта нужно использовать свойство "Enabled".

Цитировать
получились вопросы по временным функциям, спасибо за ответы
Методы для работы с датой/временем можно найти в руководстве по ссылке. Текущую дату/время можно получить с помощью функции "Now". Если требуется получить количество секунд между переменными "DateTime", то можно использовать функцию "SecondsBetween". Далее, используя функцию "SecondsToDateTime", можно перевести количество секунд в значение "DateTime". Используя функцию "SecondsToStr", можно перевести количество секунд в строку вида "чч:мм:сс".

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

Код: (delphi)
var
  aTemp_Corr, aCorr: TM_Variable;
begin
  aTemp_Corr := GetVariableByName(Variable.Name + '_Corr');  // выполняем поиск переменной vrTemp_Corr
  aCorr := GetVariableByName('CorrValue_' + Variable.Name);  // выполняем поиск переменной CorrValue_vrTemp
  if (aTemp_Corr <> nil) and (aCorr <> nil) then             // если переменные существуют, то
    if Variable.IsGoodQuality then                           // если переменная имеет хорошее качество, то
      aTemp_Corr.Value := Variable.AsInt + aCorr.AsInt       // в переменную vrTemp_Corr записываем значение переменной vrTemp + значение переменной CorrValue_vrTemp
    else                                                     // иначе (если переменная имеет плохое качество)
      aTemp_Corr.Value := 0;                                 // в переменную vrTemp_Corr записываем 0
end.

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

Можно использовать следующие способы:
1. Если требуется преобразовать значение из одной шкалы в другую, то можно использовать режим масштабирования переменной.
2.1. Создать внутреннюю переменную (в которую будем записывать результат вычисления) с именем, как у исходной переменной + приставка "_Corr". Например, для переменной "vrTemp" -> "vrTemp_Corr". Далее создать скрипт с типом события "Изменились переменные", добавить внешнюю переменную, изменение которой необходимо отслеживать, в список скрипта и написать такой скрипт:
Код: (delphi)
var
  aTemp_Corr: TM_Variable;
begin
  aTemp_Corr := GetVariableByName(Variable.Name + '_Corr');  // выполняем поиск переменной vrTemp_Corr
  if aTemp_Corr <> nil then                                  // если переменная существует, то
    aTemp_Corr.Value := Variable.AsInt + corr.AsInt;         // записываем в нее значение переменной vrTemp + значение переменной "corr"
end.
Теперь в переменную "vrTemp_Corr" будет записываться значение переменной "vrTemp" + значение переменной "vrTemp_Corr". Данный скрипт универсальный, если таких переменных несколько, то их все можно добавить в список скрипта и он будет выполняться для каждой переменной отдельно.
Данный пример подойдет для группы переменных с одинаковым значением корректировки.
2.2. Если для каждой внешней переменной будет уникальное значение корректировки, то для переменных корректировки также нужно задать однотипные имена, например "CorrValue_" + имя исходной переменной, и использовать следующий код скрипта:
Код: (delphi)
var
  aTemp_Corr, aCorr: TM_Variable;
begin
  aTemp_Corr := GetVariableByName(Variable.Name + '_Corr');  // выполняем поиск переменной vrTemp_Corr
  aCorr := GetVariableByName('CorrValue_' + Variable.Name);  // выполняем поиск переменной CorrValue_vrTemp
  if (aTemp_Corr <> nil) and (aCorr <> nil) then             // если переменные существуют, то
    aTemp_Corr.Value := Variable.AsInt + aCorr.AsInt;        // в переменную vrTemp_Corr записываем значение переменной vrTemp + значение переменной CorrValue_vrTemp
end.
3. Если эту переменную не требуется выводить в тренды, отчеты, генерировать по ней сообщения о нарушении границ и т.д., то можно использовать следующий способ: выводить значение переменной в компонент "Текст" (см. пример №5 по ссылке), с прибавлением необходимого значения. Для этого внешнюю переменную нужно указать в свойстве "Переменная", а переменную корректировки в свойстве "Доп. переменная", и на событие "OnDataChange" использовать следующий код:
Код: (delphi)
begin
  if Sender is TM_Text then                         // проверяем, что Sender это текст
    with Sender as TM_Text do                       // приводим Sender к типу "TM_Text"
      Text := IntToStr(AsInt + VariableEx.AsInt);   // записываем в текст значение основной переменной + значение доп. переменной
end.
Если необходимо выполнять скрипт после изменения значения переменной корректировки, то данный скрипт также необходимо назначить на событие "OnDataChangeEx".

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

1. Вывести данные из сторонней БД в тренды не получится. В трендах отображаются только те данные, которые архивируются штатными средствами.
2. Получить данные из сторонней БД можно в системе отчетов, добавив в отчет свой источник данных. Далее, по аналогии с примером по ссылке, можно построить график по этим данным.

14
Ваши вопросы / Re: Шаблоны и OnInit
« : 04 Ноября 2025, 15:31:48 »
Здравствуйте.

1. В любых непонятных ситуациях нужно в первую очередь проверить журнал сервера скады. С большой вероятностью в нем будут содержаться ошибки или предупреждения, которые укажут, в чем именно проблема.
2. Работа с шаблонами в скриптах рассмотрена по ссылке.

Цитировать
(Sender as TM_Button).Tag
Sender – это объект, который вызвал скрипт. Событие "OnInit" вызывается для шаблона, а не для кнопки, поэтому данная конструкция работать не будет. В строчке "bTC := GetTemplateObject('tmp_butTC') as TM_Button;" Вы уже нашли необходимую кнопку шаблона, поэтому далее нужно использовать ссылку на эту кнопку:
Код: (delphi)
bTC.States[0].Caption := 'TU4' + IntToStr(bTC.Tag);

15
Ваши вопросы / Re: Виртальная клавиатура
« : 17 Октября 2025, 14:11:29 »
Здравствуйте.

В настройках "Options.exe" на вкладке "Simple-Client" доступна опция "Включить виртуальную клавиатуру". В работе устройств с сенсорным экраном есть несколько особенностей, подробнее см. по ссылке.

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