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

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

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

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


Сообщения - pan2000

Страницы: 1 ... 12 13 [14]
196
Цитировать
Не работает.
  with Sender as TM_Text do
    ShowMessageAll("", Text + " / " + Text);
Необходимо явно указать тип строковой константы:
Код: (delphi)
   with Sender as TM_Text do
    ShowMessageAll("", Text + UTF8Encode(" / ") + Text);

197
Ваши вопросы / Re: имя клиента
« : 07 Мая 2018, 04:57:10 »
Имя клиента можно получить в скрипте с типом события "Клиент подключен", не входящим в список событий с  неработающей функцией GetClientName (Руководство по скриптам).
Код: (delphi)
begin                                 // тип события: Клиент подключен
  ClientName.Value := GetClientName;  // записать имя клиента во внутреннюю переменную ClientName:
  //...
end.
     

198
Ваши вопросы / Re: Изменяемое название
« : 17 Апреля 2018, 08:34:26 »
Цитировать
Создать в базе данных свою таблицу с четырьмя столбцам индекс, номер механизма, назначение механизма (группа освещения, приточная система, вытяжная система и т.д.)
Судя по названию столбцов, это редко редактируемые данные, возможно только один раз.
Так что создание встроенного редактора, на мой взгляд, не обосновано.

Если у Вас есть еще вопросы, то приглашаю продолжить в "Личных сообщениях".

199
Ваши вопросы / Re: Изменяемое название
« : 16 Апреля 2018, 18:49:52 »
Цитировать
В приложенном Вами примере  изменённый  текст будет сохраняться на сервере и изменения будут видны у всех клиентов?
Из "Основного руководства" по Simple-Scada:
Цитировать
Клиенты Simple-Scada выполняют только задачи визуализации, все необходимые данные запрашиваются у сервера.
Так что скорее ДА чем НЕТ, но внести полную ясность могут только разработчики Simple-Scada. Равно как и по вопросу об одновременном редактировании значения на нескольких клиентах.


Цитировать
Если выполнение проекта остановить и запустить по новой то  будут отображены названия механизмов  уже измененные или те же самые которые создавались при создании проекта в редакторе.?
При запуске проекта свойства объекта инициализируются статическими начальными значениями, заданными при создании проекта в редакторе. Для динамических начальных значений (изменяемых в процессе исполнения и сохраняемых в качестве новых начальных значений) всю работу прийдется выполнять самостоятельно, включая:
 - организацию хранения этих значений в файле/файлах или БД;
 - инициализацию при запуске проекта;
 - редактирование и сохранение.


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


200
Ваши вопросы / Re: Изменяемое название
« : 16 Апреля 2018, 07:22:55 »
Цитировать
Не подскажите решение. Необходимо для каждого механизма создать поле c наименованием механизма. Также должна быть возможность изменения\ редактирования оператором этого поля при необходимости.

Для  наименования механизма можно использовать объект ТЕКСТ.
В этом случае редактирование отдельного названия будет состоять из следующих шагов:

1. Идентификация выбранного поля ТЕКСТ.
2. Запись исходного текста из выбранного объекта ТЕКСТ во внутреннюю переменную текстового типа, связанную с объектом ПОЛЕ.
3. Позиционирование ПОЛЯ на выбранный объект ТЕКСТ - необязательное действие, просто определяющее место редактирования текста - на объекте или фиксированное. При редактировании  на объекте  необходимо условие: номер слоя объекта ПОЛЕ больше номера слоя любого объекта ТЕКСТ.
4. Редактирование текста для объекта ПОЛЕ.
5. Запись измененого текста в идентифицированный объект ТЕКСТ.
6. Сокрытие объекта ПОЛЕ при редактировании текста на объекте.

Шаги 1-3, скрипт типа OnDblClick для объектов ТЕКСТ:
Код: (delphi)
begin
  with Sender as TM_Text do
    begin
      EditText.Tag := Tag;   // идентификатор текста
      aText.Value := Text;   // записать исходный текст в переменную редактирования
      EditText.X := X;       // позиционирование окна редактирования по X
      EditText.Y := Y;       //   по Y
    end;
end.

Шаги 5-6, скрипт типа OnDoneInput для объекта EditText c основной переменной aText:
Код: (delphi)
begin
  GetTextByName('Text' + IntToStr(EditText.Tag)).Text :=
      aText.AsUTF8String;      // запись результата редактирования
  EditText.Y := -100;          // скрыть поле редактирования
end.

Полностью пример во вложении.

201
Ошибки / Неприятности тэга типа Int64.
« : 15 Февраля 2018, 19:41:47 »
При записи переменной в тэг, значение тэга отлично от значения переменной, если значение старшего байта не равно 0.

Во вложении проект и вывод результата.

202
Victor_P., эги  кнопок по значениям битов: 1, 2, 4, 8, 16. Обработчик событий OnClick и OnMouseUp:
Код: (delphi)
Val.Value := Sender.Tag;
Первый изменяет вид кнопки при нажатии, а второй - фиксирует нажатую кнопку.
Пример во вложении. Обратите внимание на возможность любой исходной комбинации включенных кнопок (!).

203
Замечания и пожелания по результатам использования объекта "Таблица":

Возможность заполнения "Таблицы" из БД - это просто замечательно, но:

1.           ПОСПЕШИЛ С ВЫВОДАМИ, доступ к системным таблицам есть. Замечание об ошибках при обращении к системным таблицам УДАЛЕНО .


2. Метод "RunSQL" не вызывает скриптов по завершению запроса или по ошибке. Для контроля завершения можно посылать "пустой запрос" (в предположении, что запросы выполняются последовательно), а различать отсутствующую или пустую таблицу  дополнительным запросом.
Можно ли придать основной переменной объекта "Таблица" смысл значения размера таблицы, принимающее по завершении запроса значение размера таблицы (-1 при отсутствии таблицы)?


Фактически элемент "Таблица" представляет внешний двумерный текстовый массив с визуализацией, возможности которого желательно расширить:

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

2. Добавить для Таблицы свойство выбор ячейки - "CellIndex" = "RowIndex" * "ColumnsCount" + "ColumnsIndex"
(выбор с точностью до ячейки в одно обращение к скрипту при любых изменениях).

3. Разрешить запись в "Text" для "Ячейки" (позволит исключить запись-чтение таблицы при каждом изменении текста).

4. Добавить возможность задания цвета подсветки выбранной строки.


Объекта "Таблица" используется для хранения данных в следующих задачах:
1. Показ списка для выбора рецепта. Каждый рецепт хранится в отдельной таблице БД с комментарием, содержащим краткую информацию о рецепте. Список формируется из комментариев.
2. Контроль выполнения выбранного рецепта с помощью подсветки исполняемой строки.
3. Работа с таблицами рецептов - создание, редактирование и т.д.

Расширение свойств "Таблицы" позволит уменьшить код и количество объектов для визуализации и навигации по "длинной" (строк в таблицы больше, чем в экранной форме) таблице.

204
Да, клиент скады делает мелкую оптимизацию и просто не передаёт серверу скады сведения о таком вводе. А в Вашем случае для чего нужно OnDoneInput на ввод того же значения?

В моем случае - повторить действия при том же значении параметра, что вполне логично для события "Пользователь ввел значение в поле". Сейчас событие - "Пользователь изменил значение в поле", изменение можно сделать добавлением лидирующего 0.


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

Согласен, что самое приоритетное это информирование об ошибках, хотя для полноты информирования о последних событиях перед перезапуском сервера желательно использовать различные типы сообщений:
- нет сообщений (первое значение из OPC-сервера);
- переходы 0->1: ошибки и включение устройств (первое значение 0);
- переходы 1->0: выключение устройств (первое значение 1).
 

205
1. Событие OnDoneInput объекта TM-Field не наступает при вводе значения равного исходному. Т.е. это событие сейчас определяется как "Пользователь ввел новое (отличающееся от старого) значение в поле".
Возможные варианты обхода зтого ограничения:
- добавить 0 перед вводимым значением (проверено на integer);
- добавить отдельную кнопку и не использовать событие OnDoneInput.

2. Соообщения "Редактора ..." с настройками "Бит i = 1 : <Текст...> для битов, поступающих от OPC-сервера со значениями = 1, отображаются в сообщениях при запуске проекта. Такие сообщения не связаны с фактическим изменением состояния объекта управления, и в архиве сообщений можно увидеть, что "некое устройство включилось, и так 7 раз подряд".
Для определения изменения состояния необходимо два последовательных значения. Сейчас, предположительно, в качестве начального используется 0, а не первое принятое от OPC-сервера.

 ;D Значение числа "Пи" во времена ЭВМ М-20 было 3.14159265 (Руководство по скриптам - Глобальные константы)

206
Переменная типа WORD преобразуется в вещественные типы как число со знаком:

Код
var
  x: word;
  y: double;
begin                                      // Пример для x = 40000
  x := TM_Text(Sender).Variable.Value;
  Field2.Text := IntToStr(x);              // Field2.Text = '40000'

  y := x;
  Field3.Text := FloatToStr(y);            // Field3.Text = '-25536.00'

  y := TM_Text(Sender).Variable.Value;
  Field4.Text := FloatToStr(y);            // Field4.Text = '40000.00'
end.       

207
Участник форума TeNQ задал вопрос ( Re: Вопросы и предложения по Simple-Scada 2 < Ответ #520 : 16 Май 2017, 11:35:58 >):

"Есть функция GetVariableByName. ... Можно ли ввести по аналогии функцию GetObjectByName для того, чтобы обратиться к объекту в универсальном скрипте"?

Из документации по скриптам:

       function FindObjectByName(const AName: string): TM_Control;
       Описание: Возвращает объект подстраницы с именем AName...

Создание страниц, подстраниц и объектов в редакторе показывает, что "Подстраница 1" содержит те же объекты, что и сама родительская страница. Проверка показала, что объекты страницы доступны на "Подстранице 1" (для одностраничного проекта  SubPage1 соответствует Page1):

      { собственно выборка объекта TEXTi, размещенного на странице Page1}
      ObjSelect := SubPage1.FindObjectByName('TEXT' + IntToStr(i));

Т.е. можно создать универсальный скрипт для объектов одной страницы (По крайней мере в действующей сейчас редакции Simple-Scada).
Пример во вложении.


208
Ошибки / Re: Проблемы с тегом типа Int64
« : 13 Июля 2017, 12:49:25 »
 Это одна сторона увеличение размера данных. Вторая заключается в некоторой гарантии целостности данных, скажем четыре WORDа во всей цепочке передачи данных, это именно те самые четыре WORDа, которые начали движение от контроллера.

Пример для Int64:

Код
procedure XXX_OnDataChange(Sender: TM_control);

type word4 = record  a,b,c,d: word; end;
var
  t:word4;
  pt: ^word4 = @t;
begin
  PInt64(pt)^ := TM_Text(Sender).Variable.Value;   // Вызывающий процедуру тег должен иметь тип Int64 !!!
  PSUS_1.Text := FloatToStr(t.a * 0.05, 2);
  PSIS_1.Text := FloatToStr(t.b * 0.1, 1);   // и т.д

P.S. Можно использовать и тип Double, но в нем тоже похоже аналогичная проблема - коррекция данных для своего собственного типа при записи в тег.


209
Ошибки / Re: Проблемы с тегом типа Int64
« : 11 Июля 2017, 15:43:54 »
Разумнее хранить данные в формате типа объявления тега и использовать методы для преобразования к другим типам.
Но точно ответить могут только авторы.

210
Ошибки / Проблемы с тегом типа Int64
« : 11 Июля 2017, 14:17:39 »
При записи достаточно большой величины в тег типа Int64 значение изменяется на 1.

Скрипт с примером изменения:
Код
var
  a: int64;
begin
  a := $20000000000003;
  x1.Value := a;
  Text1.Text := 'Int64 =' + IntToHex(a,8);                  // Text1 = '00000003'
  Text2.Text := 'AsInt64 =' + IntToHex(x1.AsInt64,8); // Text2 = '00000004'  !
  a := $20000000000001;
  x1.Value := a;
  Text3.Text := 'Int64 =' + IntToHex(a,8);                  // Text3 = '00000001'
  Text4.Text := 'AsInt64 =' + IntToHex(x1.AsInt64,8); // Text4 = '00000000'  !
end.

Поле Text2 показывает увеличение значения на 1, поле Test4 - уменьшение на 1, простая переменная значение не изменяет.

Проект во вложении.

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