Если работа восстанавливается - железо работает, где то косяк программирования.

Проверьте отсутствие блокирующихся операций.... начинающие частенько пытаются дождаться результата длинных операций, скажем - обмена с модемом внутри одного цикла. А для работы ПЛК следует лишь проверять флаг окончания операции, не в коем случае не ожидать завершения....

В общем случае это не правильно, но для обучения неблокирующимся операциям можно порекомендовать перевести алгоритм на условное время. Т.е. операции выполнять по внутренним тактам, формируемым скажем циклами TON, а эти такты периодически синхронизировать с аппаратными часами. (в случае ошибок с синхронизацией - продолжаем внутренние отсчеты) Таким образом у вас не выпадут операции с случае проблем с отсчетами реального времени )))

А периодические зависания модема - это у всех, раз в сутки его рекомендуется перезапускать по питанию, даже в случае нормальной работы.

Добавьте в конфигурацию модуль статистики и смотрите свободное время цикла (попробуйте вести лог его, или хотя бы фиксировать моменты перегрузки по времени)