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

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

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

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


Сообщения - pan2000

Страницы: 1 ... 10 11 [12] 13 14 15
166
Здравствуйте.

Ещё часто подходит функция StrToIntDef, которая в случае неудачи возвращает заданное вами значение. Например:

Значение по умолчанию - это частный случай для ограниченного диапазона значений. Петрову поможет, а Сидорову - нет. Чем try, как общий случай, то плох?
Года три назад try - это был единственный вариант борьбы с отладкой по TeamViewer, когда проект на удаленной машине вставал 'раком' по завершении цикла отладки.

167
Всем хорошего дня , подскажите как наиболее коротко и оптимально проверить строку, что она не сможет преобразоваться в интежер, т.е. в ней есть посторонние символы и буквы
  Здравствуйте!
На мой взгляд, наиболее оптимальное разрешение спорных вопросов - использование исключений, в Вашем случае:
Код: (delphi)
begin
  try
    Text1.Text := IntToStr(StrToInt(aSTR.AsStr));  // попытались
  except
    Text1.Text := 'Увы, это не переводимая игра слов C(К/ф""Бриллиантовая рука"")';  // не удалось
  end.           

aStr - внутренний тег типа строка.
Пример во вложении (!)
 

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

Восстановление таблицы при запуске проекта - скрипт "Проект полностью запущен"
Код: (delphi)
begin
// заполнение таблицы при запуске проекта
  Table1.RunSQL('SELECT * FROM `preferences`;', tsSaveFixRow);
end.

Добавить пользователя по кнопке:
Код: (delphi)
begin
// собственно запись
  RunSQL(' INSERT INTO  `preferences` (`cart`, `name`, `surname`, `pref`) VALUES('
        + cart.AsStr + ', '''
        + name.AsStr + ''', '''
        + surname.AsStr + ''', '''
        + pref.AsStr + ''');', nil, 0);
// обновление таблицы
  Table1.RunSQL('SELECT * FROM `preferences`;', tsSaveFixRow);
end.

Для работы с реальной таблицей необходимы:
- контроль входных данных: уникальность номера карты, заполнение всех полей и т.д.;
- редактирование для некоторых столбцов ("номер карты", "предпочтения") и удаление строк;
- сортировка строк по каким-либо критериям: по номеру карты, по фамилии и т.д,
- действия после заполнения таблицы: форматирование столбцов, "раскраска" ячеек по характеру данных и т.д.

Возможно следует добавить в таблицу дополнительные данные: дата регистрации, дата рождения, текущий статус гостя (новичок, постоянный, VIP, выбыл, исключен и т.д.).
 
Пример из вложения иллюстрирует контроль заполения всех полей и форматирование номера карты с лидирующими нулями.

169
Цвет фона ячейки доступен для записи. Для контроля временного интервала, привязанного к началу часа, можно использовать событие "Прошел час".
Пример скрипа для таблицы Table1 c фиксированной первой строкой:
Код: (delphi)
// подсветка ячейки, соответствующей текущему часу
var i: integer;
begin
  for i := 0 to 23 do
    with Table1.GetCell(0,i + 1) do
      if i = HourOf(Now) then Color := clFuchsia else Color := clGray;
end.
При запуске проекта можно установить цвет фона текущего интервала в скрипте "Проект полностью запущен":
Код: (delphi)
begin
  Table1.GetCell(0,HourOf(Now) + 1).Color := clFuchsia;
end.

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

Каждый оператор IF должен выполнятся только при изменении "своей" переменной, например:
Код: (delphi)
 . . .
  //Скважина 1
  if Variable.Name = 'Danfoss_disconnect_flag' then   // проверка на "свою" переменную
    if Danfoss_disconnect_flag.AsBool then
      AddMessage(Now, mkMessage, 'Зв''язок з перетворювачем частоти відновлено [Свердловина 1]', TRUE, FALSE)
    else
      AddMessage(Now, mkAlarm, 'Зв''язок з перетворювачем частоти втрачено [Свердловина 1]', TRUE, FALSE);
 . . .

171
Ваши вопросы / Re: Вопрос по отчётам
« : 04 Октября 2019, 00:52:24 »
    Здравствуйте!
Скорее всего, лишние строки появляются в исходных данных из-за неопределенных (нет связи) состояний внешнего тега run_fc.
Исключить ложные переходы для тега run_fc (нет связи -> 0, нет связи -> 1) можно сохраняя его значения во внутренней переменной run_fc_1.

Скрипт по изменению внешнего тега:
Код: (delphi)
begin
  run_fc_1.Value := run_fc.Value;     // присвоить текущее состояние насоса внутренней переменной
end.
Скрипт по изменению внутренней переменной:
Код: (delphi)
begin
  if run_fc_1.AsBool then vrOn.Value  := Now   // время включения насоса
                     else vrOff.Value := Now;  // время выключения насоса
end.

172
... но вот как написано в требованиях, так нужно делать
Я так понимаю, что выхода нет в данной ситуации?

Есть лазейка, а для выхода нужно изменить возникновение события OnDoneInput объекта "Поле" на завершение ввода, в т.ч. и без изменения переменной (Enter или клик мыши вне поля ввода переменной).

Построить двухслойную структуру из объектов поле, каждый из которых связан со своей переменной. Верхнее поле Field2 для вывода, ввод запрещен. Нижнее Field1 - для ввода.
Скрипты по событиям:

Field2_OnClick, Field2_OnMouseEnter
Код: (delphi)
begin
  Field2.Visible := false;
end.

Field1_OnMouseLeave (вернуть верхнее поле если переменная не изменилась, собственно это и есть лазейка), Field1_OnDoneInput
Код: (delphi)
begin
  VisVar.Value := ExtVar.Value / 100;  // VisVar - внутренняя вещественная переменная формата 0.## для вывода,
  Field2.Visible := true;              // ExtVar - переменная контроллера со шкалой 0..300
end.
Ограничения при вводе - указатель мыши должен находится в поле ввода (иначе поле ввода невидимо, а ввод может быть продолжен).

173
Ваши вопросы / Re: Работа с таблицей и БД
« : 07 Сентября 2019, 07:19:06 »
    Здравствуйте!

Цитировать
Данные в таблицу должны заноситься тогда, когда установка закончит свой цикл, т.е. есть условие

Условие окончания цикла установки, заключающееся в достижении переменной определенного значения, можно обрабатывать в скрипте "Изменились переменные":
Код: (delphi)
var aStr: string;
begin
// проверка условия
  if Variable.Value <условие> <значение> then begin
    . . .
// запись в таблицу метки времени и сопутствующих данных
  aStr := 'INSERT INTO `statp1` (`timestamp`, `param1`, `param2`, <другие имена заполняемых столбцов> ) VALUES ('
        + MySQLDateTime(Now, dttFull) + .', '    // время-дата Simple-Scada
        + varParav1.asStr + ', '                 // числовой параметр
        + QuotedStr(varParav2.asStr) + ', '      // строковый параметр - текст в одинарных кавычках
        +  ... + ');';
        RunSQL(aStr, nil, 0);

Text1.Text := aStr;  // контроль запроса RunSQL на время отладки
  end;
end.

Для контроля ошибок запросов можно использовать событие "Ошибка SQL-запроса":
Код
begin
  ShowMessageAll('ОШИБКА!', Msg, clNone);
end.
     

Цитировать
когда нужно заносить в ``? когда нужно ставить '' ? зачем ставятся ++?

Первый параметр процедуры RunSQL - строка состоящая из строковых констант и выражений. Константы заключаются в одиночные кавычки.
++ это простое объедение составляющих строки.
`` окаймляют имена столбцов и таблиц БД.
Для выражения, которое по правилам для MySQL необходимо заключить в одинарные кавычки, можно использовать функцию QuotedStr или пары одинарных кавычек, интерпретируемых внутри строки как одинарные.

Цитировать
как сделать выборку, когда временной диапазон задается календарями,

Подготовить два календаря, с привязанными виртуальными переменными TimeFrom и TimeTo типа DataTime:
Код: (delphi)
  Table1.RunSQL('SELECT timestamp, text FROM `statp1` '
    + 'WHERE(`timestamp` >= ' + MySQLDateTime(TimeFrom.AsDateTime,  dttFull) + ') '
    + 'AND (`timestamp` <= ' + MySQLDateTime(TimeTo.AsDateTime,  dttFull) + ');', tsSaveFixRow);

Если предоставите более полную информацию о "проблемной" части задачи, то постараюсь ответить с примерами.

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

Указать текстовую константу внутри строки заключением в пары одиночных кавычек:

strQuery := 'SELECT Timestamp, Text FROM `messages_data` WHERE `Text` LIKE ''%admin%'' ORDER BY Timestamp DESC;';

175
. . .
  Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);
надо привязку всё-таки сделать...
  Columns[2].Cells[1].Variable:=(GetVariableByName('StepRunTimeSet_T'+aNum+'_W');
Привязка переменной к Полю или Ячейке выводит на экран её значение в формате переменной, свойство ячейки Text не используется при редактировании ячейки.


А как отображаются объекты (текстовое поле, ячейка и т.д.) у которых привязан тег сервера/переменная и есть свойство Text?
1. Объект ТЕКСТ не редактируется (пока?), переменные связаны только с событиями.

2. Объект ПОЛЕ имеет собственную текстовую переменную с начальным значением устанавливаемым в редакторе и первоначально выводимой на экран.
В дальнейшем на экране отображается последнее изменение: или собственная переменная (запись свойства Text) или форматированная переменная (при привязке или изменении).
Чтение свойства Text при отсутствии привязки - из собственной переменной, при наличии - форматированное из переменной.
Редактирование с сохранением результата только в переменную, редактирование без привязанной переменной выполняется в числовом формате и не сохраняется.

3. Ячейка ТАБЛИЦЫ - комбинация из редактируемого ТЕКСТа и ПОЛЯ. Поведение аналогично объекту ПОЛЕ (приоритет по убыванию: переменная, Text переменной, Text ячейки).

Взаимную связь составляющих объектов ПОЛЕ и ячейка ТАБЛИЦЫ можно посмотреть в примере из вложения.

Цитировать
Сейчас при вводе видно число секунд (ввод пользователя), потом их преобразование в формат времени.

В примере можно смоделировать Ваш ввод.

176
И таймер, и скрипт могут использоваться для измерения временных интервалов в единицах "секунда". Таймер предполагает изменение связанной с ним переменной с момента запуска таймера через одну секунду. Скрипт предполагает изменение по сетке, привязанной ко времени ПК.
Предлагаемый проект строит распределение моментов наступления события относительно текущего времени (NOW) для каждого из процессов.
Контролируется монотонность изменения секунд сравнением предыдущего и текущего значения, которые должны отличатся на 1 при сравнении по модулю 60.



177
Добрый день , возможно ли сделать разбор строки , несколько значений через разделитель, ...

Пример функции по разбору CSV-строки. Функция возвращает n-ое поле (n = 1..) или "пусто" для несуществующего поля.
Код: (delphi)
  function GetField(aStr: string; n: integer): string;
  var i, j: integer;
     aStr1: string;
  begin
    j := 1;                              // номер собираемого поля
    aStr1 := '';                         // собственно собираемое поле
    for i := 1 to Length(aStr) do begin
      if aStr[i] = ';' then begin        // проверить на разделитель
        if j = n then begin
          GetField := aStr1;             // поле найдено
          exit;
        end;
        aStr1 := ''; j := j + 1;         // на следующие поле
      end
      else aStr1 := aStr1 + aStr[i];     // продолжить собирать поле
    end;
    GetField := aStr1;                   // поле с номером n не найдено в строке
  end;


Цитировать
. .  и второе главное , возможно из одного скрипта вызвать другой скрипт, если да то как , какой синтаксис.
Единственный вызвыаемый из другого скрипт это "Изменились переменные". Можно было использовать для общего кода.


Добрый день , ещё вопрос есть скрипт  в редакторе проходит компиляцию, а при сохранении нет ...
Исправленный код:
Код: (delphi)
var
  i: integer;
  sw: string;
begin
  i := 99;
... и вы уверены, что вот здесь: "while i <= 0 do" правильное условие? Может нужно изменить знак на ">"?
Код: (delphi)
  while i > 0 do        // цикл выполнится 99 раз, i >= 0  - выполнится 100 раз 
  begin
    sw := IntToStr(i);
    if FileExists('vesy_1_' + sw + 'txt', 'C:Base/') and (read.Value) then  // ошибка выражения  +sw.'txt'
      RenameFile('C:Base/vesy_1_'+sw+'txt', 'C:Base/vesy_1.txt');
    i := i - 1;
  end;
end.

178
Во вложении пример редактирования таблицы из 50 строк (с прокруткой) с числовым и текстовым столбцами.
Если мы правильно поняли, то lipvasko говорил о прямом редактировании текста в Редакторе, на этапе разработки, чтобы не приходилось редактировать текст через инспектор объектов, а можно было просто кликнуть объект и сразу редактировать текст.

Более актуальна, на мой взгляд, работа с таблицей на этапе исполнения:
1. Добавить метод и свойство для смещения первой строки экранной формы относительно таблицы.
2. Добавить метод и свойство для индекса подсвечиваемой строки таблицы.
3. Для объекта "Поле" ввести событие "Пользователь завершил редактирование" аналогичное OnDoneInput, но вызываемое безусловно изменения данных.

Пункт 3 позволит реализовать совмещение полей для вывода одной переменной и ввода другой.

И, для полноты счастья, добавить запросы пользователя, т.е возможность вызывать скрипт из скрипта (например, "мышинных"). Что должно позволить реализацию сложных и редко используемых "слоеных" объектов без цепочки нажатий ЛКМ.


Цитировать
Также, касаемо таблиц, можно ведь у колонок или ячеек включить свойство "Редактирование" -> "разрешить", тогда можно будет менять значения в ячейках во время работы проекта, аналогично полям.

Но только кроме включения свойства, еще необходимо и выбрать переменную для ячейки. Но, для большой статической таблицы это проблематично, а для динамической (загруженной из БД) - невозможно.


179
   Здравствуйте, vladka767!

Только переписыванием списка заново. Для небольшого списка можно сязать флажки с разрядами переменной iStringSelect,
а в качестве источника строк использовать предварительно заполненный список ComboBox1, результат в ComboBox2.
Скрипт по изменению значения iStringSelect:
Код: (delphi)
var i: integer;
begin
  ComboBox2.Clear;    // очистить список
  for i := 0 to 15 do
    if GetBit(iStringSelect.AsInt64, i) then
      ComboBox2.AddItem(ComboBox1.Items[i].Text);  // добавить отмеченные строки
end.

Пример для 64 строк во вложении.

180
   Здравствуйте, Серега!

Во времена предыдущих редакции компилятора и формата CSV-файла у меня был проект, который создавал по CSV-файлу таблицу в MySQL.
Параметры: имя БД и имя CSV-файла из списков, имя таблицы и отмеченные столбцы, включаемые в таблицу.
Имена отмеченных столбцов можно изменять по двойному клику ЛКМ.

Во вложении проект ("As is"), адаптированный к текущей версии компилятора и CSV-файла в кодировке UTF8.

Выбор имен столбцов переключается между входящими во вторую строку CSV-файла и именами из массива в проекте (можно изменить в проекте под свои имена). Столбцы с отсутствующими именами игнорируются.
К сожалению строка имен CSV-файла содержит повторяющиеся имена и отсутствует имя для идентификатора переменной.

После записи таблицы операция записи блокируется до изменения имён базы данных или файла или таблицы (для списка достаточно его
раскрыть и выбрать строку повторно, для таблицы - реальное изменение).

Замечания:
1. Ограничение на доступ к базам отсутствует и при небольшой настойчивости можно забить ВСЕ БАЗЫ хламом - таблицами переменных.
2. Проект переваривает файлы похожей структуры (вторая строка - имена столбцов, данные - начиная с четвертой строки).


Страницы: 1 ... 10 11 [12] 13 14 15