Доброго времени суток, уважаемые форумчане.
Решил попробовать работу механизма TRY_CATCH при ошибке с повторным удалением компонента журнала.
Результаты показаны на прикрепленном видео. Тестовую программу прикрепляю (без архива, так как используются только стандартные библиотеки).
Краткие комментарии.
Как было описано выше в сообщениях, если повторно удалять компонент, то система вылетает по исключению, на панели СПК загорается черный экран, так как будто бы в панели
нет приложения. Для подключения из среды разработки нужно перезагрузить панель по питанию или из веб-конфигуратора. Этот эксперимент можно провести с тестовым проектом (TestComponentManager2), если галочка "Использовать TRY_CATCH" снята.
Если галочка установлена, то попытка удаления компонента происходит в секции __TRY.
Полный код PLC_PRG представлен ниже:
НО!Код:Cntr := Cntr + 1; IF AddCmp THEN AddCmp := FALSE; AddCntr := AddCntr + 1; pCmp := Component_Manager.CMAddComponent2(Name,16#0305111E,ADR(udiCmpID),ADR(dwResult)); END_IF IF DelCmp THEN DelCmp := FALSE; DelCntr := DelCntr + 1; LogAdd2(LOG_STD_LOGGER, udiCmpID,CmpLog.LogClass.LOG_WARNING, CmpErrors.Errors.ERR_FAILED, 1,'Deleting Component'); IF NOT UseTC THEN dwResult := Component_Manager.CMRemoveComponent(pCmp); ELSE __TRY dwResult := Component_Manager.CMRemoveComponent(pCmp); __CATCH(Exec) strTemp := concat('IN CATCH SECTION! Deleting Component ERROR:',UDINT_TO_STRING(Exec)); LogAdd2(LOG_STD_LOGGER, udiCmpID,CmpLog.LogClass.LOG_WARNING, CmpErrors.Errors.ERR_FAILED, 1, strTemp); __ENDTRY END_IF END_IF IF TestMes THEN TestMes := FALSE; TestCntr := TestCntr + 1; LogAdd2(LOG_STD_LOGGER, udiCmpID,CmpLog.LogClass.LOG_WARNING, CmpErrors.Errors.ERR_FAILED, 1,'Test Message'); END_IF IF Test0Div THEN Test0Div := FALSE; IF NOT UseTC THEN rTest := rTest/rTest; ELSE __TRY rTest := rTest/rTest; __CATCH(Exec) strTemp := concat('IN CATCH SECTION! Divide ERROR:',UDINT_TO_STRING(Exec)); LogAdd2(LOG_STD_LOGGER, udiCmpID,CmpLog.LogClass.LOG_WARNING, CmpErrors.Errors.ERR_FAILED, 1, strTemp); __ENDTRY END_IF END_IF
Использование механизма TRY_CATCH не помогает.
В результате панель все равно "зависает". Причем зависание стабильно происходит при отключении среды разработки от панели (т.е. при команде Онлайн->Отключение). Хотя в представленном видео среда сама "отвалилась" от панели (без моей команды) и сразу как это произошло, панель зависла!!!




Ответить с цитированием