PDA

Просмотр полной версии : Component Manager удаление компонента



Спорягин Кирилл
13.08.2025, 18:36
Вечер добрый, форумчане!

Внимательно изучил документ "Работа c логами в CODESYS V3 (https://owen.ru/forum/showthread.php?t=28167&page=4&p=272260&viewfull=1#post272260)" (автор Евгений Кислов) и сопутствующую информацию (документацию Кодесис по библиотекам CmpLog и Component Manager).

Наткнулся на следующую ситуацию.
Если вызываешь функцию CMRemoveComponent для уже удаленного компонента (т.е. сначала создал компонент, затем его удалил и затем еще раз пытаешься), то происходит исключение.
Что в общем логично. Не логично только, то что нигде никаких записей об этом не остается! Более того после этого действия подключиться к панели из среды разработки не получается. Помогает только или перезагрузка по питанию или перезагрузка кодесис из веб-конфигуратора (ПЛК -> Настройки -> "Перезапустить CODESYS").

Для аналогии попробовал как будет вести себя система при делении на 0. В этом случае также вылетает по исключению, но и в журнале веб-конфигуратора (ПЛК -> "Файлы журналов") и в журнале из под CODESYS видно исключение. Более того, если после этого подключаться из среды, то тебя выбрасывает на строчку, где произошла ошибка (см. фото).
85287
85288

Для возможности повторить эксперимент выкладываю проекта (архив проекта грузить не стал, так как проект стандартный, добавлены только системные библиотеки - CmpLog, ComponentManager, CmpErrors).
Среда разработки - Codesys V3.5 SP17 Patch 3 (32 bit).
СПК - СПК М01 (3.5.17.31).

Собственно, вопросы:
1. Почему никаких следов о причина возникновения ошибки?
2. Как в целом грамотно обрабатывать исключения в Codesys V3.5?
3. Как понимать, что компонент уже удален? Только самому следить за этим фактом? Тут нужно пояснение. После вызова CMRemoveComponent ни указатель не обнуляется, ни номер компонента, которые были созданы функцией CMAddComponent2.

Спасибо.

Евгений Кислов
13.08.2025, 18:59
Добрый день.

0. Ситуация, которую вы описываете - это баг.

85291

1. Последствия некоторых ошибок настолько разрушительны, что другие компоненты (например, логгер) уже могут просто не отработать.
2. Для начала следует определить критерии "грамотности". Можете связаться со мной через телеграм, чтобы подискутировать на эту тему.
3.


Как понимать, что компонент уже удален?

Возможно (не проверял), CMGetComponentByName поможет.


После вызова CMRemoveComponent ни указатель не обнуляется, ни номер компонента, которые были созданы функцией CMAddComponent2.

И не должны - это же ваши переменные.
Можете обнулить их сами, если вызов CMRemoveComponent вернул ERR_OR.

Спорягин Кирилл
14.08.2025, 11:51
Евгений, спасибо за ответ.

В целом все понятно.


2. Для начала следует определить критерии "грамотности". Можете связаться со мной через телеграм, чтобы подискутировать на эту тему.
Вы лучше статью напишите на эту тему, а мы (форумчане) прочтем!