На форуме обязательно:
  1. Заполнить свой профиль НА РУССКОМ ЯЗЫКЕ КИРИЛИЦЕЙ. См. Правила, п.2.d.
  2. Не писать свой вопрос в первую попавшуюся тему, а вместо этого создать свою. См. Правила, п.3.a.

Рекламу мы не размещаем ни на каких условиях.

WinCC OA - Как изменять настройки алармов с помощью языка CONTROL

Ответить

Автор темы
MaxShul
здесь недавно
здесь недавно
Сообщения: 2
Зарегистрирован: 25 май 2018, 14:29
Имя: Максим

WinCC OA - Как изменять настройки алармов с помощью языка CONTROL

Сообщение MaxShul » 25 май 2018, 14:35

Здравствуйте. Нужно изменять граничные значения, классы и тексты сообщений. Конфигурационный _alert_hdl я наследую от мастер-точки данных. Там уже заданы классы, границы диапазонов и тексты сообщений. Пробовал dpSet() и alertSet(), но не помогло. В справке есть пример в dpSet(), но он работает, если этого конфигурационного элемента нет у элемента точки данных.


Автор темы
MaxShul
здесь недавно
здесь недавно
Сообщения: 2
Зарегистрирован: 25 май 2018, 14:29
Имя: Максим

WinCC OA - Как изменять настройки алармов с помощью языка CONTROL

Сообщение MaxShul » 31 май 2018, 08:53

нашёл решение. Такой код:

Код: Выделить всё

//------------------------------
// Установка обработки алармов
//--------------------------------
bool setDpeAlertHdl(string dpe, float minAlarm, float minNorm, float maxNorm, float maxAlarm)
{  
  int rc;
  dyn_errClass err;
  
  int type = 13;
  dyn_int rangeTypes = makeDynInt(4, 4, 4, 4, 4);
  dyn_bool inclLimit = makeDynBool(TRUE, FALSE,TRUE, FALSE,FALSE, TRUE,FALSE, TRUE); //1_u_limit, 2_l_limit,2_u_limit, 3_l_limit,3_u_limit, 4_l_limit,4_u_limit, 5_l_limit
  dyn_string alertTexts = makeDynString("Alert!!!", "Warning!", "OK", "Warning!", "Alert!!!");
  dyn_string alertClasses = makeDynString("System1:alert.", "System1:warning.", "", "System1:warning.", "System1:alert.");
  
  //dpe = "System1:Z.Value2"; 
  string dpeNameAlertHdl = dpe + ":_alert_hdl";
  DebugN("dpeNameAlertHdl = " + dpeNameAlertHdl);

  if (!isDpeValid(dpe))  //читаем данные, если данный элемент точки данных существует
    return false;
  
  //чтение данных из конф. элемента _alert_hdl точки данных dpe
  rc = dpGet( 
    dpeNameAlertHdl + ".._type", type,
    dpeNameAlertHdl + ".1._type", rangeTypes[1],
    dpeNameAlertHdl + ".2._type", rangeTypes[2],
    dpeNameAlertHdl + ".3._type", rangeTypes[3],
    dpeNameAlertHdl + ".4._type", rangeTypes[4],
    dpeNameAlertHdl + ".5._type", rangeTypes[5],
      
    dpeNameAlertHdl + ".1._u_incl", inclLimit[1],      
    dpeNameAlertHdl + ".2._l_incl", inclLimit[2],
    dpeNameAlertHdl + ".2._u_incl", inclLimit[3],
    dpeNameAlertHdl + ".3._l_incl", inclLimit[4],      
    dpeNameAlertHdl + ".3._u_incl", inclLimit[5],
    dpeNameAlertHdl + ".4._l_incl", inclLimit[6],
    dpeNameAlertHdl + ".4._u_incl", inclLimit[7],
    dpeNameAlertHdl + ".5._l_incl", inclLimit[8],
      
    dpeNameAlertHdl + ".1._class", alertClasses[1],
    dpeNameAlertHdl + ".2._class", alertClasses[2],
    dpeNameAlertHdl + ".4._class", alertClasses[4],
    dpeNameAlertHdl + ".5._class", alertClasses[5],
      
    dpeNameAlertHdl + ".1._text", alertTexts[1],
    dpeNameAlertHdl + ".2._text", alertTexts[2],
    dpeNameAlertHdl + ".3._text", alertTexts[3],
    dpeNameAlertHdl + ".4._text", alertTexts[4],
    dpeNameAlertHdl + ".5._text", alertTexts[5]       
  );
    
  err = getLastError();

  if (dynlen(err) > 0 || rc < 0) 
  {
    DebugN("Не удалось прочитать данные из конфигурационного элемента '_alert_hdl' точки данных " + dpe + "");
    //DebugN(err);
  } 
  
  DebugN("rangeTypes = " + rangeTypes);
  DebugN("type = " + type);
  DebugN("inclLimit = " + inclLimit);
  DebugN("alertTexts = " + alertTexts);
  DebugN("alertClasses = " + alertClasses);
  

/*  rc = dpSetWait(dpName + "." + elName + ":_alert_hdl.._ack", DPATTR_ACKTYPE_SINGLE); // квитирование
  rc = dpSetWait(dpConf + ".._active", FALSE); // деактивирование
*/
  bool ackResult = acknowledgeDpe(dpe);
  DebugN("ackResult = " + ackResult);
   
  bool deactiveResult = setActiveDpeAlertHdl(dpe, FALSE);
  DebugN("deactiveResult = " + deactiveResult);
 /*
      if (!ackResult)
         return false;
      
      if (!setActiveDpeAlertHdl(dpe, FALSE))
         return FALSE;*/
  
 
  //запись данных в ":_alert_hdl"
  rc = dpSetWait( 
      dpeNameAlertHdl + ".._type", type,
      dpeNameAlertHdl + ".1._type", rangeTypes[1],
      dpeNameAlertHdl + ".2._type", rangeTypes[2],
      dpeNameAlertHdl + ".3._type", rangeTypes[3],
      dpeNameAlertHdl + ".4._type", rangeTypes[4],
      dpeNameAlertHdl + ".5._type", rangeTypes[5],
      
      dpeNameAlertHdl + ".1._u_limit", minAlarm,
      dpeNameAlertHdl + ".2._l_limit", minAlarm,
      dpeNameAlertHdl + ".2._u_limit", minNorm,
      dpeNameAlertHdl + ".3._l_limit", minNorm,
      dpeNameAlertHdl + ".3._u_limit", maxNorm,
      dpeNameAlertHdl + ".4._l_limit", maxNorm,
      dpeNameAlertHdl + ".4._u_limit", maxAlarm,
      dpeNameAlertHdl + ".5._l_limit", maxAlarm,
      
      dpeNameAlertHdl + ".1._u_incl", inclLimit[1],      
      dpeNameAlertHdl + ".2._l_incl", inclLimit[2],
      dpeNameAlertHdl + ".2._u_incl", inclLimit[3],
      dpeNameAlertHdl + ".3._l_incl", inclLimit[4],      
      dpeNameAlertHdl + ".3._u_incl", inclLimit[5],
      dpeNameAlertHdl + ".4._l_incl", inclLimit[6],
      dpeNameAlertHdl + ".4._u_incl", inclLimit[7],
      dpeNameAlertHdl + ".5._l_incl", inclLimit[8],
            
      dpeNameAlertHdl + ".1._class", alertClasses[1],
      dpeNameAlertHdl + ".2._class", alertClasses[2],
      dpeNameAlertHdl + ".4._class", alertClasses[4],
      dpeNameAlertHdl + ".5._class", alertClasses[5],
      
      dpeNameAlertHdl + ".1._text", alertTexts[1],
      dpeNameAlertHdl + ".2._text", alertTexts[2],
      dpeNameAlertHdl + ".3._text", alertTexts[3],
      dpeNameAlertHdl + ".4._text", alertTexts[4],
      dpeNameAlertHdl + ".5._text", alertTexts[5]      
      ,dpeNameAlertHdl + ".._orig_hdl", TRUE,
      dpeNameAlertHdl + ".._active", TRUE
  );
 
  err = getLastError();
 
  if (dynlen(err) > 0)
  {
    //throwError(err);   
    DebugN("Ошибка при записи граничных значений для алармов в точку данных " + dpe + "!");
    return false;
  }
  
  if (rc < 0)
  {
    DebugN("Ошибка при записи граничных значений для алармов в точку данных " + dpe + "!");
    return false;
  } 
      
  return true;
}

Ответить

Вернуться в «WinCC»