Странно, что ПЛК работает-то.
Это не ПК, тут нет гектаров памяти и гигагерцовых процессоров.
Тут есть watchdog, и если кусок программы работает слишком долго - ПЛК должен перегрузится.
Вопросы по программе:
1. Зачем Вы ДИНАМИЧЕСКИ выделяете куски памяти по 64кБайта? При этом кода для освобождения её при перезаливке новой программы нет.
2. В программе множество обращений по указателю, прямого доступа к памяти, ее копирования и т.п. Тут простор для опечаток. Рекомендую пошагово пройти по программе и проверить ликвидность всех указателей и адресов.
3. При чтении 65кБайт из сокета, функция может возвратить максимум 1,5кБайта, размер 1 посылки. Т.к. запрос бывает и длиннее - его надо собрать из 1 или нескольких пакетов. Хотя бы чтением из сокета до победного конца.