Доброго времени суток, уважаемые форумчане.
Решил попробовать работу механизма 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 не помогает.
В результате панель все равно "зависает". Причем зависание стабильно происходит при отключении среды разработки от панели (т.е. при команде Онлайн->Отключение). Хотя в представленном видео среда сама "отвалилась" от панели (без моей команды) и сразу как это произошло, панель зависла!!!