ЖУРНАЛ «СТА» №4/2007
Пусть к моменту окончания загрузки значение T на входе старой программы было равным 57, то есть значение actuator1 было равным 7,4, а actuator2 — START_VALUE (4.0). После переключения на новую программу она остаёт- ся в состоянии RUN, однако actuator1 имеет старое значе- ние (7,4) вместо положенных по новому варианту алгорит- ма 6.0 и более не будет вычисляться, а значение actuator2 изменяется скачком с 4,0 на 7,4. Казалось бы, большое де- ло – изменить пару констант. Однако среда исполнения контроллера не в состоянии парировать возникшую логи- ческую ошибку. Поэтому нужно либо загружать новую про- грамму, подождав, когда старая окажется в состоянии MANUAL, либо когда T превысит 60, либо в коде програм- мы учитывать, что она может быть заменена во время вы- полнения. В приведённом примере коррекция алгоритма, учитывающая возможность обновления на лету, неочевидна (необходимо устанавливать фиксированное значение на выходе, для которого не производится вычислений в теку- щем диапазоне T). Рассмотрим еще один вариант «незначительных» измене- ний функционирующей программы. Речь пойдет о случае, когда не затрагиваются переменные и константы програм- мы, а только «незначительно» изменяется ее код. Пусть в контроллере функционирует программа, исходный текст которой приведён ранее, и требуется поменять местами ло- гику формирования значений выходных переменных actuator1 и actuator2. То есть фрагмент кода: ... RUN: CASE T OF Tmin..Tedge1: actuator1 := A * INT_TO_REAL(T) + B; Tedge2..Tmax: actuator2 := A * INT_TO_REAL(T) + B; ELSE progState := MANUAL; END_CASE; ... модифицируется следующим образом: ... RUN: CASE T OF Tmin..Tedge1: actuator2 := A * INT_TO_REAL(T) + B; Tedge2..Tmax: actuator1 := A * INT_TO_REAL(T) + B; ELSE progState := MANUAL; END_CASE; ... С точки зрения системы исполнения контроллера и поль- зователя, это мизерное изменение, не так ли? Но что будет, если переключение на новую программу произойдёт в мо- мент, когда T равно, скажем, 66? До обновления переменные состояния имеют следующие значения: T = 66, progState = RUN, actuator1 = 8,0, actuator2 = 9,2. После загрузки нового варианта, переключения на него и первого цикла T = 66, progState = RUN, actuator1 = 9,2, actuator2 = 9,2. Но по логике обновлённого алгоритма здесь должно быть T = 66, progState = RUN, actuator1 = 9,2, actuator2 = 8,0. Таким образом, опять получаем логическую ошибку при- кладной программы, которая является побочным эффектом переключения на загруженную программу в начале нового цикла. Избежать этой ошибки можно либо дождавшись безопасного для изменений состояния старой программы, либо учитывая в прикладном алгоритме возможность его за- мены на лету. Следующий вариант возможных изменений – добавление переменных и коррекция кода. Добавим коэффициент кор- рекции значений actuator1 и actuator2, вычисляемый в зави- симости от значения и знака производной температуры. Но- вая версия программы, которую нужно загрузить на лету, может выглядеть так: PROGRAM SOME_DUMMY_REGULATOR VAR_INPUT T : INT; END_VAR VAR_OUTPUT actuator1 : REAL; actuator2 : REAL; END_VAR VAR CONSTANT MANUAL_VALUE : REAL := 4.0; START_VALUE : REAL := 5.0; A : REAL := 0.2; B : REAL := 4.0; Tmin : INT := 40; Tmax : INT := 120; Tedge1 : INT := 60; Tedge2 : INT := 61; T_UNKNOWN : INT := 32768; END_VAR VAR progState : STATE := UNCERTAIN; deltaT : INT := T_UNKNOWN; Tprev : INT := T_UNKNOWN; Kcorr : REAL := 1.0; END_VAR (* Пользовательский код начинается отсюда *) CASE progState OF UNCERTAIN: IF T < Tmax AND T > Tmin AND deltaT <> T_UNKNOWN THEN progState := START; END_IF START: actuator1 := START_VALUE; actuator2 := START_VALUE; progState := RUN; RUN: IF deltaT > 0 THEN Kcorr := 1.0 + INT_TO_REAL(deltaT)/ INT_TO_REAL(T); ELSIF deltaT < 0 THEN Kcorr := 1.0 INT_TO_REAL(deltaT)/ INT_TO_REAL(T); ELSE Kcorr := 1.0; END_IF CASE T OF Tmin..Tedge1: actuator1 := Kcorr * (A * T + B); Tedge2..Tmax: actuator2 := Kcorr * (A * T + B); ELSE progState := MANUAL; END_CASE; MANUAL: IF T > Tmax OR T < Tmin THEN 66 СТА 4/2007 АППА РАТ НЫ Е С Р Е Д С Т В А / П Р ОМЫШЛ Е ННЫ Е КОН Т Р ОЛЛ Е Р Ы www.cta.ru
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy