ЖУРНАЛ «СТА» №4/2007

actuator1 := MANUAL_VALUE; actuator2 := MANUAL_VALUE; ELSE progState := START; END_IF END_CASE; IF Tprev <> T_UNKNOWN THEN deltaT := T  Tprev; END_IF Tprev := T; END_PROGRAM Обращаем внимание, что при изменении состава пере- менных программы при переключении на вновь загружен- ную программу невозможно просто дать новой программе использовать значения переменных старого варианта про- граммы, – нужно сделать чтото ещё. Будем считать, что в системе исполнения контроллера имеется некий механизм разрешения такой ситуации. Пусть загрузка приведённого нового варианта программы успешно завершилась в мо- мент, когда старая программа находилась в состоянии RUN, а значение T было равным 81. Тогда после переключения на новую программу после первого цикла значения её пере- менных состояния и выходных переменных будут следую- щими: actuator1 = 8,0, Kcorr = 405,543, actuator2 = 4947,6246, Tprev = 81, deltaT = –32768. Таким образом, алгоритмически корректная программа, загруженная в контроллер, по крайней мере два цикла будет формировать на выходе actuator2 значение, равное темпера- туре теплового излучения при ядерном взрыве. Для того что- бы избежать проявления данной ошибки, нужно, чтобы раз- работчиком в коде была учтена возможность замены на лету. Последний вариант касается случая, когда меняется тип какойнибудь переменной и соответствующим образом кор- ректируется код. Пусть, к примеру, принято решение в пере- менной state хранить не только текущее состояние програм- мы, но и значение кода команды, поступающей по сети: TYPE COMPOUND_STATE : STRUCT command : BYTE; state : STATE; END_STRUCT END_TYPE PROGRAM SOME_DUMMY_REGULATOR ... VAR progState : COMPOUND_STATE; ... END_VAR (* Пользовательский код начинается отсюда *) CASE progState.state OF ... END_CASE; ... END_PROGRAM Очевидно, в таком случае не существует ни одного прием- лемого способа возобновить работу программы после за- грузки без её полного перезапуска. Для приведённого примера характерно наличие в заменяе- мой программе информации о её состоянии на предыдущих циклах исполнения. Если выходные данные, формируемые программой, зависят от входных данных и переменных со- стояния только на текущем цикле, то переключение на но- вую версию программы при незначительных изменениях скорее всего не приведет к проблемам. Проблема, однако, в том, что среда исполнения контроллера не знает, зависит ли правильность алгоритма, реализуемого загруженной про- граммой, от состояния на предыдущих циклах исполнения. По идее, среда исполнения могла бы предоставлять приклад- ной программе функцию, вызов которой информировал бы среду исполнения о допустимости переключения на новую программу. Тогда пользователю не пришлось бы ждать, когда заменяемая программа окажется в допустимом для замены состоянии. Кроме того, вновь загруженная программа, по всей видимости, также могла бы иметь возможность указать среде исполнения момент, когда допустимо произвести пе- реключение, например, при выполнении некоторого усло- вия. А до достижения такого подходящего момента она мог- ла бы выполняться параллельно со старой программой, как бы обучаясь, и при этом не передавая данные ни одному из потребителей данных этой программы. Пример: PROGRAM SOME_DUMMY_REGULATOR ... VAR progState : COMPOUND_STATE; ... END_VAR (* Пользовательский код начинается отсюда *) CASE progState.state OF UNCERTAIN: ... START: ... RUN: ... MANUAL: (* Переключение на эту программу допустимо *) SwitchToThisProgramAllowed(TRUE); (* Переключение этой программы на новую допустимо *) SwitchFromThisProgramAllowed(TRUE); END_CASE; ... END_PROGRAM В качестве аргументов SwitchToThisProgram()/ SwitchFromThisProgram() могут использоваться любые вы- ражения с результатом типа BOOL. Конечно же, описанный возможный механизм не прост в реализации и имеет определённые ограничения, однако ни- чего подобного нет ни в стандарте МЭК 611313, ни в среде исполнения CoDeSys. Таковы причины, по которым мы ограничили возможно- сти взаимодействия между средой разработки и средой ис- полнения CoDeSys в контроллерах Fastwel I/O в части об- новления программ на лету, а также не поддержали пере- менные типа VAR PERSISTENT. Автор благодарит И. Петрова, технического директора ПК «Пролог», за весьма ценные замечания и предложения по содер- жанию данной части статьи, а также за оперативную по- мощь в решении технических проблем, возникавших у нас в про- цессе работы над проектом. ● Автор — сотрудник фирмы Fastwel Телефон: +7 (495) 234-0639 E-mail: info@fastwel.ru Web: www.fastwel.ru АППА РАТ НЫ Е С Р Е Д С Т В А / П Р ОМЫШЛ Е ННЫ Е КОН Т Р ОЛЛ Е Р Ы 67 СТА 4/2007 www.cta.ru

RkJQdWJsaXNoZXIy MTQ4NjUy