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

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

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

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


Сообщения - Daniil

Страницы: [1]
1
Проверил один из проблемных скриптов (выкладываю его код сюда).
Не вижу грубых ошибок и вероятных рекурсий.
Может опытный взгляд поможет?
Но да - он привязан к переменной - которая измеряет время до конца (или от начала) процесса в секундах. Отчего и часто вызывается.

Код: (delphi)
var
  time: TDateTime;
  textVOH, textVOM, textVOS, textVO: TM_Field;

begin
  textVOH := GetTemplateObject('txtAC_1M_3FLAP_2H_1AI_WndTimeLeftHours') as TM_Field;
  textVOM := GetTemplateObject('txtAC_1M_3FLAP_2H_1AI_WndTimeLeftMinutes') as TM_Field;
  textVOS := GetTemplateObject('txtAC_1M_3FLAP_2H_1AI_WndTimeLeftSeconds') as TM_Field;
  textVO := GetTemplateObject('txtAC_1M_3FLAP_2H_1AI_WndTimeLeft') as TM_Field;

  if (textVO <> nil) then
  begin
    with (Sender as TM_Object) do
      if (GetVariableByID(textVO.Variable.ID).Value <> 0) then
      begin
        time := SecondsToDateTime(GetVariableByID(textVO.Variable.ID).Value);
        textVOH.Text := inttostr(time.HourOf);
        textVOM.Text := inttostr(time.MinuteOf);
        textVOS.Text := inttostr(time.SecondOf);
      end
      else
      begin
        textVOH.Text := '0';
        textVOM.Text := '0';
        textVOS.Text := '0';
      end;
  end;

end.

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

3
Здравствуйте!
Присутствует странная проблема, и хотелось бы получить от вас помощь.
Ситуация следующая - в случайный момент объект перестает реагировать на изменение привязанного тега и не меняет состояние по скрипту.
Причем сначала все работает штатно(то есть скрипт обрабатывает все значения и меняет объект на мнемосхеме)- и только с течением времени рандомно выплывает такая ошибка.
Судя по трендам и логу того же скрипта все происходит штатно (скрипт завершается корректно и все значения переменной получает в нужное время)- однако это не так.
Скриншот с текущим значением переменной и "неправильным" отображением тоже прикладываю (3 - охлаждение, на рисунке состояние "Пауза", значение 7).
Сам скрипт простейший:
Код: (delphi)
begin
   if not (Sender is TM_Text) then 
    Exit;

   with Sender as TM_Text do
    Log_Add("ВОП изменился статус - старт скрипта " +  Variable.Name + " - " + IntToStr(Variable.AsInt), true);

   with Sender as TM_Text do
       case AsInt of                 
         0: begin Text:='Отключен'; Color:= clDarkGray; end;
         1: begin Text := 'Отвод паро-жидкости'; Color:= clSlateGray; end;           
         2: begin Text:= 'Подача жидкости'; Color:= clDarkCyan; end;             
         3: begin Text:='Охлаждение'; Color:= clDarkCyan; end;
         4: begin Text := 'Завершение охлаждения'; Color:= clSlateGray; end;       
         5: begin Text:= 'Закрытие паро-жидкости'; Color:= clSlateGray; end;         
         6: begin Text:= 'Оттаивание'; Color:= clLightSalmon; end;
         7: begin Text:='Пауза'; Color:= clSilver; end;
         8: begin Text:='Поддержание'; Color:= clSilver; end;
         253: begin Text := 'Сервисный режим'; Color:= clMaroon; end;
         254: begin Text := 'Нет готовности'; Color:= clRed; end;
         255: begin Text:= 'Неисправность'; Color:= clRed; end;
       else
        begin Text := 'Неизвестное'; Color:= clWhite; end;
       end;
   with Sender as TM_Text do
    Log_Add("ВОП изменился статус - конец скрипта " + Variable.Name, true);

end.
Дополняю пост ссылкой на лог:
https://disk.yandex.ru/d/5Ulh_UYw7rynyA

4
Здравствуйте!
Возник такой вопрос (простите если дубль, ибо беглый поиск по форуму не дал мне ответа), а возможно ли с помощью скрипта менять шкалы переменной. Имеются в виду уже забитые шкалы в интерфейсе переменные.
Заранее спасибо.

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

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

7
Кажется Вы не совсем поняли задачу. Такой скрипт, как представили Вы у меня естественно написан по изменению переменной. НО! При первом открытии скады и, до изменения привязанной переменной, мне не хочется видеть гордую 1 в поле где должно быть написано "Отказ". Для этого мне надо проинициализировать шаблон. И вот триггер OnInit не работает как должен (ну или я что-то не понял правильно, и прошу Вас помочь). А вот OnShow отрабатывает прекрасно (с тем же текстом скрипта).

8
Здравствуйте!
Только начинаю этот нелегкий путь, посему прошу строго не судить. Задача состоит в выводе определенного текста в поле текущего состояния оборудования, исходя из пришедшего значения переменной integer. Реализован шаблон устройства и шаблонное окно. При вызове следующего скрипта по триггеру OnInit не работает. Также не работает при триггере OnInit в окне. А вот в окне же на OnShow уже прекрасно отрабатывает. Не подскажите в чем может быть проблема? Заранее спасибо.
Код: (delphi)
var
 ACStateField: TM_Field;
 varVariableACStateField: TM_Variable;
begin
  ACStateField := GetTemplateObject('txtAirCoolerWTEN1State') as TM_Field;
  if(ACStateField <> nil) then begin
    //Log_Add(ACStateField.Name);

    varVariableACStateField:= GetVariableByID(ACStateField.VariableID);
    if(varVariableACStateField <> nil) then begin
      { Log_Add(varVariableACStateField.Name); }
      Log_Add(varVariableACStateField.Name + ' - ' + IntToStr(varVariableACStateField.AsInt));

      case varVariableACStateField.AsInt of                  // если значение переменной связанной с полем равно:
         0: ACStateField.Text:= 'Отключено';  // изменить цвет рамки на зеленый          // состояние В работе.
         1: ACStateField.Text:= 'Отказ';    // изменить цвет рамки на красный          // состояние Неисправность
         2: ACStateField.Text:= 'Ожидание';   // изменить цвет рамки на серый            // состояние Выкл.
         3: ACStateField.Text:= 'Охлаждение';  // изменить цвет рамки на зеленый          // состояние В работе.
         4: ACStateField.Text:= 'Подготовка к оттайке';    // изменить цвет рамки на красный          // состояние Неисправность
         5: ACStateField.Text:= 'Оттайка';   // изменить цвет рамки на серый            // состояние Выкл.
         6: ACStateField.Text:= 'Задержка охлаждения';  // изменить цвет рамки на зеленый          // состояние В работе.
         7: ACStateField.Text:= 'Задержка вентиляции';    // изменить цвет рамки на красный          // состояние Неисправность
       else
         ACStateField.Text:= 'Неизвестное';
       end;
     end;

  end;

  //Log_Add(ACStateField.Text);
end.

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