Да, судя по всему RESET_TASK помогает, код программы такой, полный код:

t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
t := 0;
IF A > 999 THEN
A := 0;
END_IF
END_IF


(*Óñòàíàâë èâàåì íàñòðîéê&# 232; COM-ïîðòà*)
IF port1_opened =0 THEN
Settings.Port:=0; (*íîìåð COM-ïîðòà*)
Settings.dwBaudRate:=115200; (*ñêîðîñòü *)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port1_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Åñëè COM-ïîðò îòêðûò, òî ïåðåõîäè&# 236; ê ïðèåìó è ïåðåäà÷&#232 ; äàííûõ *)
IF COM_SERVICE1.ready THEN
port1_opened:=2;
END_IF

IF port1_opened=2 THEN (*Óäà÷íî ïðîèíèöè&# 224;ëèçèðîâ&#22 4;ëè*)

CASE master1 OF

0: (* ôóíêöèÿ 03 èíò - ÔÁ ñ÷èòûâàå&# 242; çíà÷åíè&#229 ; ïàðàìåòð&# 224; òèïà int èç ïðèáîðà ñ àäðåñîì 10 èç ðåãèñòð&#224 ; ñ íîìåðîì 51 ïî ïðîòîêîë&# 243; Modbus-RTU*)
get1_modbus(
Enable:=enabl , (* ðàçðåøåí&# 232;å ðàáîòû áëîêà *)
Mode:=MB_RTU , (*ðåæèì ïåðåäà÷&#232 ;*)
DevAddr:=150 , (*àäðåñ*)
FirstAddr:=520 , (*íîìåð ðåãèñòð&#224 ;*)
Quantity:=1, (*êîëè÷åñò âî ðåãèñòðî&# 226;*)
ComHandle:=Settings.Port , (*íîìåð COM-ïîðòà*)
TimeOut:=TimeOut , (*Òàéìàóò T#50ms*)
Buffer:=Buffer , (* áóôåð äàííûõ *)
Complete=>cmpl , (* ñêîïèðîâ&# 224;òü ïðèçíàê çàâåðøåí&# 232;ÿ îïåðàöè&#232 ; *)
Exception=>err , (* ñêîïèðîâ&# 224;òü ðåãèñòð îøèáîê *)
ByteCnt=>DataSize ); (*êîë-âî ñ÷èòàííû&# 245; áàéòîâ *)
(*åñëè óñòàíîâë&# 229;í ïðèçíàê çàâåðøåí&# 232;ÿ îïåðàöè&#232 ;, òî *)
IF cmpl THEN
IF err=0 THEN (*Åñëè íåò îøèáîê, òî ïîëó÷àå&#236 ; äàííûå èç áóôåðà òèïà INT*)
x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
master1:=1; (*ïåðåõîäè ì ê âûïîëíåí&# 232;þ ñëåäóþùå&# 227;î ÔÁ*)
END_IF

1: (* ôóíêöèÿ 16 - çàïèñü ïàðàìåòð&# 238;â òèïà Int (ðåãèñòð 4) è Real (ðåãèñòð 6) â ïðèáîð ñ àäðåñîì 2 *)
(*çàïèñü â áóôôåð ïàðàìåòð&# 224; òèïà INT*)
Buffer[1] := DINT_TO_BYTE(A);
Buffer[0] := DINT_TO_BYTE( SHR(A,8));
Buffer[3] := DINT_TO_BYTE( SHR(A,16));
Buffer[2] := DINT_TO_BYTE( SHR(A,24));

send2_modbus(
Enable:= enabl, (* ðàçðåøåí&# 232;å ðàáîòû áëîêà *)
Mode:=MB_RTU , (*ðåæèì ïåðåäà÷&#232 ;*)
DevAddr:=150 , (*àäðåñ*)
FirstAddr:= 520, (*íîìåð ðåãèñòð&#224 ;*)
Quantity:= 1, (*êîëè÷åñò âî çàïèñûâà&# 229;ìûõ ðåãèñòðî&# 226;*)
ComHandle:=Settings.Port ,(*íîìåð ñîì-ïîðòà*)
TimeOut:=TimeOut , (*òàéìàóò T#50ms*)
Buffer:=Buffer , (* áóôåð äàííûõ *)
Complete=>cmpl , (* ñêîïèðîâ&# 224;òü ïðèçíàê çàâåðøåí&# 232;ÿ îïåðàöè&#232 ; *)
Exception=>err , (* ñêîïèðîâ&# 224;òü ðåãèñòð îøèáîê *)
RegCnt=> DataSize); (*êîë-âî ñ÷èòàííû&# 245; áàéòîâ *)
(*åñëè óñòàíîâë&# 229;í ïðèçíàê çàâåðøåí&# 232;ÿ îïåðàöè&#232 ;, òî *)
IF cmpl THEN
master1:=2;(*ïåðåõî& #228;èì ê âûïîëíåí&# 232;þ ñëåäóþùå&# 227;î áëîêà*)
END_IF
2:
Settings.Port:=0; (*íîìåð COM-ïîðòà*)
Settings.dwBaudRate:=19200; (*ñêîðîñòü *)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;

port1_opened:=0;

COM_SERVICE1(Enable:=(port1_opened=0) , Settings:=Settings , Task:=RESET_TSK );
(*Åñëè COM-ïîðò îòêðûò, òî ïåðåõîäè&# 236; ê ïðèåìó è ïåðåäà÷&#232 ; äàííûõ *)
IF COM_SERVICE1.ready THEN
port1_opened:=2;
END_IF

get1_modbus(
Enable:=enabl , (* ðàçðåøåí&# 232;å ðàáîòû áëîêà *)
Mode:=MB_RTU , (*ðåæèì ïåðåäà÷&#232 ;*)
DevAddr:=10 , (*àäðåñ*)
FirstAddr:=51 , (*íîìåð ðåãèñòð&#224 ;*)
Quantity:=1, (*êîëè÷åñò âî ðåãèñòðî&# 226;*)
ComHandle:=Settings.Port , (*íîìåð COM-ïîðòà*)
TimeOut:=TimeOut , (*Òàéìàóò T#50ms*)
Buffer:=Buffer , (* áóôåð äàííûõ *)
Complete=>cmpl , (* ñêîïèðîâ&# 224;òü ïðèçíàê çàâåðøåí&# 232;ÿ îïåðàöè&#232 ; *)
Exception=>err , (* ñêîïèðîâ&# 224;òü ðåãèñòð îøèáîê *)
ByteCnt=>DataSize ); (*êîë-âî ñ÷èòàííû&# 245; áàéòîâ *)
(*åñëè óñòàíîâë&# 229;í ïðèçíàê çàâåðøåí&# 232;ÿ îïåðàöè&#232 ;, òî *)
IF cmpl THEN
IF err=0 THEN (*Åñëè íåò îøèáîê, òî ïîëó÷àå&#236 ; äàííûå èç áóôåðà òèïà INT*)
x2:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
master1:=3; (*ïåðåõîäè ì ê âûïîëíåí&# 232;þ ñëåäóþùå&# 227;î ÔÁ*)
END_IF

IF enabl = FALSE THEN
enabl := TRUE;
END_IF

IF err <> 0 THEN
enabl := FALSE;
END_IF
3:
port1_opened:=0;
master1:=0;
END_CASE
IF enabl = FALSE THEN
enabl := TRUE;
END_IF
IF err <> 0 THEN
enabl := FALSE;
END_IF
END_IF

но работает нестабильно, опрос модуля на 19200 стабилен, а запись и чтения модуля на 115200 проходит один раз в несколько десятков секунд. Не могу понять в чём причина, вроде везде есть подтверждение включения порта и только потом работа с ним, явные задержки времени не требуются, но не работает стабильно.