1) сделайте проверку перед shutdown и close что handle <> 0. возможно вы в какой то момент времени закроете закрытый сокет, что приведет к watchdog.
2) Вы работаете в режиме блокирующих сокетов т.е. все функции сокета блокируют выполнение кода до момента пока операция не завершится. в этот момент (коннект, send, recv ) код просто встаёт на месте, а таймер собаки продолжает тикать. если сервер Вам не ответит на запрос, привет ребут по watchdog. попробуйте перейти на неблокирующий сокет SysSockSetOption( SOCK, SOCKET_SOL, SOCK_NBIO, 0, 0 ) ;
3) рекомендация вместо условий if step = 1 then и if step = 4 then используйте конструкцию case step of 0: код; 1:код; ююю N: код; end_case
будет легче организовывать ветвление по одной переменной.
4) во вложении пример работы с модбас TCP , может он Вам подскажет в каком направлении двигаться




