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

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

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

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


Сообщения - Dmitry_Impuls

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

Такая проблема. Проект работает без ошибок и в какой-то момент скада "зависает" в активных тегах пишет: 0 изменений. Контроллеры и ОПС в это время продолжают работать. Визуализация работает, но ничего не обновляется. В журнал изменений никаких ошибок не выводится. Я так понимаю что проблема может быть в скриптах, но не знаю в какую сторону копать так, как данное "зависание" происходит рандомно в какой-то момент и сложно отследить из-за чего это происходит.
Возможно у кого-то была данная проблема, подскажите из-за чего это может происходить.

2
Спасибо. Как-то упустил этот момент при чтении документации... :(

3
Здравствуйте. Для этого нужно отправить SQL-запрос на выполнение через RunSQL (пометить запрос уникальным тегом, например 20) и в отдельном скрипте с типом события "Выполнен SQL-запрос" убедиться что это запрос с тегом = 20. Далее пройти по полученному результату запроса и добавить каждую строку в раскрывающийся список через ComboBox.AddItem. Простой пример выполнения запроса и обработки результата описан в этой статье.

Позволю себе дополнить...
В запрос можно включить имя ComboBox`а по OnClick
Код: (delphi)
  if Sender is TM_ComboBox then
  with Sender as TM_ComboBox do
    aQuery:='SELECT '''+Name+''', `ItemName` FROM  `ItemList`;';

тогда будет универсальная обработка для любого ComboBox`а
Код: (delphi)
  if (aTag = 20) then  // наш запрос
  if (not (DataSet.IsEmpty)) then                                                        // не пустая выборка
    begin
      aCombo:=GetComboBoxByName(DataSet.Fields[0].AsUTF8String); // получили имя пославшего запрос объекта
      aCombo.Clear;                                                                            // очистили список
      aCombo.AddItem('');                                                                   // добавили (если надо)  первую пустую строку
      while not (DataSet.EOF) do
      begin
        aCombo.AddItem(DataSet.Fields[1].AsUTF8String);                     // заполняем список
        DataSet.Next
      end
    end
  else Exit;                                                                                        // если в выборке  нед данных - вышли

P.S. Есть неприятный момент - список разворачивается и тут же сворачивается.
P.P.S. Можно уменьшить длительность двойного клика в системе или чётче давить на мышку  ;D

4
Цитировать
Это если одно окно... нужно просто пересоздавать экземпляры.
И сколько по Вашему нужно создать таких экземпляров, если клиентов много? Какой шанс допустить ошибку в формировании и парсинге имен переменных? Плюс дополнительная возня, если необходимо в окне что-то поменять или доработать.
И речь идет не только о шаблонах окон.

1 Продумывать шаблон надо ДО копирования.

2 Шанс допустить ошибку - 0 (ноль), т.к. идёт автоинкремент.
Пример
Окно1 содержит btn01,btn02... btn50;
Окно2 содержит btn51,btn52... btn100;

COPY/PASTE ещё 10 раз....

Окно12 содержит btn551,btn552... btn600;

Какой шанс ошибиться считая (N-1)*50?
У тех кто арифметику не прогуливал хотя бы первые два школьных года?

3 Если надо что-то переделать - удаляются ВСЕ окна и по новой копируется исходное

Для примера - 42 типовых объекта с 48 переменными (2016 привязок!!!)
416 окон для объектов с ручным управлением  (Кнопки включения ручного режима, пуск и стоп) (1248 привязок!!)
832 окна для объектов с возможностью симуляции включения (тут всего лишь маска - 832 привязки)
ИТОГО
4096 привязок (минимум трижды мышью кликнуть, объект, поле выбора переменной, переменная)

А теперь подумайте как долго это делалось бы "обычным" способом?
И сколько ошибок было бы допущено?

5
Здравствуйте. Подскажите пожалуйста, возможно ли заполнять ComboBox через SQL запрос &
Да
 :)

6
нужно просто пересоздавать экземпляры.
Если бы всё было так просто, мы бы уже давно "пересоздавали экземпляры" окон.

Не вы. При разработке.
Делается окно. Именование объектов на окне и имена окон подбираются так, чтоб автоинкрементом можно было размножить.
Win1 -> btnOk1/btnCancel1/Text1 Копируем окна...
Win2 -> btnOk2/btnCancel2/Text2
....
WinN -> btnOkN/btnCancelN/TextN

N мало... надо I ...  ;D
Cope/Paste
WinI -> btnOkI/btnCancelI/TextI

Объекты по клику вызывают окно Win(_Номер_объекта_|_Имя_объекта_+номер)
Событие OnClick
Код: (delphi)
var
  aObject: TM_Window;
begin
  aObject := GetWindowByName('Win'+
    StringReplace(Sender.Name, '_', '',[rfReplaceAll, rfIgnoreCase]));
  if aObject <> nil then                   
    aObject.ShowClient(GetClientName);
end.

у окна событие OnShow привязывает переменные к элементам окна...
Оно может быть разное для разных типов объектов и окон...

Всё...

P.S. Занятно... пока ответ писал Миханик сообщение добавил... цитату подменили...



7
Подмена переменных происходит на всех клиентах одновременно. Допустим один пользователь открыл окно, в окно подставились переменные vrA1, vrA2 и пользователь работает с этим окном. К проекту подключается второй пользователь, который открывает то же окно, но с подстановкой других переменных vrB1 и vrB2. Переменные подставятся на всех клиентах и уже оба пользователя будут работать с vrB1 и vrB2, хотя первый пользователь этого не планировал. Т.е. текущая система совершенно не подходит для систем в которых больше 1 клиента и обязательно нужна система шаблонов.
Это если одно окно... нужно просто пересоздавать экземпляры.

Вспомнил чего ещё очень не хватает.
1 Поиска сквозного по скриптам (по тексту всех скриптов) и по переменным (при неудачном экспорте можно потерять переменную)

8
Ошибки / Re: "Мелкие" ошибки
« : 07 Октября 2019, 12:02:08 »
Добрый день

Есть две группы переменных с одинаковым именем.
При экспорте подгруппы CIP# из группы Виртуальных переменных и последующем импорте переменные
попадают в группу с тем же именем, но на уровень выше.

Параметры экспорта - только активную группу

В файле экспорта сразу пишется строка Группа CIP# иерархии нет.

А хотелось бы как при экспорте всех переменных указать
1 корень ..\
2 Группу
3 #Подгруппу
4 ##Подгруппу второго уровня

В большом проекте этот "сюрприз" мешает (т.к. непонятно куда же импортировалось...)

9
Здравствуйте.
Сейчас первоочередная задача: разработка системы шаблонных объектов, окон и сообщений (с такой системой не придётся перепривязывать теги через скрипты).

А зачем? Сейчас Вами занята ниша СКАД "для программистов".
Перепривязка работает отлично. Делается шаблонное окно. Редактор автоинкрементом меняет имена.
Очень большой плюс данноё СКАДы - доступ из скриптов к системным событиям, свойствам объектов и переменным.
Хотите сделать ещё одну СКАДу "для КИПовцев"? С привязкой через клемники/автопривязкой?

По опыту работы не хватает:
1Выгрузки/загрузки страниц (подстраниц и окон)
2 Выгрузки/загрузки объектов (нарисовал объект составной, сгруппировал и поместил в библиотеку или внешний файл)
3 Выгрузки/загрузки сообщений (так же в Excel набил список сообщений и загрузил)
4 Возможности параллельной работы в редакторе нескольких человек (ускорение работы с проектом)

10
Ваши вопросы / Re: Вопросы по WEB в Simple-Scada 2
« : 03 Октября 2019, 09:54:30 »
Меняю скриптом заливку CheckBox через внутренний тег. Значение внутреннего тега меняю кнопкой. На клиенте все работает без ошибок. На веб-клиенте цвет не меняется. В настройках режим веб выбран "С управлением".
Найдена подобная ?ошибка?

Заполнение списка для ComboBox происходит скриптом. На WEB клиенте не работает.
Привязка переменных скриптом на WEB клиенте выполняется успешно.

11
Ошибки / Re: "Мелкие" ошибки
« : 07 Сентября 2019, 15:24:15 »
Здравствуйте. См. описание функции GetClientName в руководстве.
Предполагаем, что Вы используете эту функцию в скриптах которые вызываются сервером (а не клиентом), например OnDataChange (изменились переменные). В них нет информации о клиенте, ведь скрипт вызывается сервером, поэтому вместо GetClientName нужно указывать какое-то конкретное имя клиента:
ShowMessageClient('мой_клиент', 'Ошибка!', 'Параметр вне диапазона');
GetClientName можно использовать в скриптах например на событие OnClick, ведь кликает по кнопке именно клиент. Тогда сервер будет знать информацию о клиенте и GetClientName будет работать.
Спасибо за ответ.
ShowMessageClient использовался в разных скриптах. OnClick, Ошибка SQL запроса, OnDataChange, OnShow.
Поэтому систему в появлении "ошибки" и не заметил сразу.

12
Указать текстовую константу внутри строки заключением в пары одиночных кавычек:
strQuery := 'SELECT Timestamp, Text FROM `messages_data` WHERE `Text` LIKE ''%admin%'' ORDER BY Timestamp DESC;';
Более общий подход использовать QuotedStr.
Код: (delphi)
strQuery := 'SELECT Timestamp, Text FROM `messages_data` WHERE `Text` LIKE ' + QuotedStr('%admin%') + ' ORDER BY Timestamp DESC;';
P.S. Сам пользуюсь удвоением кавычек...

13
Ошибки / Re: "Мелкие" ошибки
« : 06 Сентября 2019, 10:57:34 »
Добрый день. Версия СКАДА 2.3.5.3.

При попытке выводить сообщение оператору при помощи
ShowMessageClient(GetClientName, 'Ошибка!', 'Параметр вне диапазона');
наблюдается интересное поведение.

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

Если клиенту задать имя (пробовали Server и Factory),
то сообщение "убегает" к клиенту у которого имени нет.

14
По Вашему сообщению можно предположить:

Большое спасибо за ответ. Но он несколько запоздал.
Объекты одинаковые. Отличаются тегом. По тегу понимаем какие переменные брать.
И, да, привязка динамическая... лень тыкать мышкой было...

Смотрите первое сообщение на этой странице. Ошибка была в  том, что переменные не привязывались.
Просто выводились их значения в свойство Text.

Попутно вопрос возник.

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

15
:D
Как быть в такой ситуации?
очень просто... надо быть внимательней. Выводится текст, а меняется переменная... которой нет
после
  Columns[2].Cells[1].Text:=SecondsToStr(GetVariableByName('StepRunTimeSet_T'+aNum+'_W').AsInt64);
надо привязку всё-таки сделать...
  Columns[2].Cells[1].Variable:=(GetVariableByName('StepRunTimeSet_T'+aNum+'_W');

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