Вход

Просмотр полной версии : ПЛК73 Чтение МВ110-16Д через Modbus



Зинец Олег
04.11.2020, 22:10
Подскажите, что делаю не так? Данные читает, но как то нестабильно, большую часть времени чтение завершается ошибкой.

Кусок кода:

(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=9600; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=1;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

IF cmpl THEN
enabl :=TRUE;
END_IF

tErr(IN:=m, PT := t#100ms);
IF tErr.Q THEN
m := FALSE;
enabl := TRUE;
END_IF

readInputs(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 51,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= T#100ms,
Buffer:= readBuffer, (*таймаут T#50ms*)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err);

IF enabl AND NOT cmpl THEN
enabl := FALSE;
END_IF

(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные типа INT из буфера*)
x:=BYTE_TO_WORD(readBuffer[1]) OR SHL(BYTE_TO_WORD(readBuffer[0]),8);
readQuantity := readQuantity+1;
END_IF
END_IF

IF err <> 0 THEN
enabl := FALSE;
m := TRUE;
END_IF
END_IF

A.Simonov
05.11.2020, 12:34
Подскажите, что делаю не так? Данные читает, но как то нестабильно, большую часть времени чтение завершается ошибкой.

Кусок кода:

(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=9600; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=1;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF

IF port_opened=2 THEN (*Удачно проинициализировали*)

IF cmpl THEN
enabl :=TRUE;
END_IF

tErr(IN:=m, PT := t#100ms);
IF tErr.Q THEN
m := FALSE;
enabl := TRUE;
END_IF

readInputs(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 51,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= T#100ms,
Buffer:= readBuffer, (*таймаут T#50ms*)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err);

IF enabl AND NOT cmpl THEN
enabl := FALSE;
END_IF

(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные типа INT из буфера*)
x:=BYTE_TO_WORD(readBuffer[1]) OR SHL(BYTE_TO_WORD(readBuffer[0]),8);
readQuantity := readQuantity+1;
END_IF
END_IF

IF err <> 0 THEN
enabl := FALSE;
m := TRUE;
END_IF
END_IF

Добрый день.
Если прибор иногда все же отвечает, то скорее всего проблема с:
1) Физическим подключением (не витая пара, отсутствие терминальных резисторов и т.п.)
2) Судя по коду, в случае успеха прибор не выжидает никаких пауз и тут же высылает следующую посылку.
попробуйте добавить некоторую задержку.

Прикладываю многократно проверенный и рабочий пример.

Зинец Олег
05.11.2020, 18:12
Зачем вам схема? Подключено всё напрямую ПЛК-МВ110 витой парой с резисторами (120Ом). Частотника и всего, что можем мешать нет! tErr прилеплен для того, чтобы выжидать время после ошибки. Прилепил в надежде, что буде лучше, но ничего не изменилось. А так, обосрать можно всё, что угодно. Я тут помощи прощу. Тут вроде бы технический форум а не "вечер саркастической шутки".

Зинец Олег
05.11.2020, 18:13
A.Simonov. Спасибо буду пробовать.