А кстати, в чем смысл:

IF stateTimer.ET > T#1s AND state < C_ERROR THEN
state := C_ERROR + state;
END_IF
?

И сокет не закрывается потому, что пинг бесконечный?