PDA

Просмотр полной версии : ПЛК 63 и RS-485 - вопросы



Safron
29.04.2022, 16:39
Всем доброго дня. Возникли вопросы по поводу использования RS -485 в контроллере ПЛК 63. Не открывается порт. По документации RS-485 - это Com0, RS-232 - COM1, RS-232 debag - Com4.
Так вот. Указываю Com4 - нет проблем. Порт открывается. А Com0 - возвращает ошибку.
60526
Использовал библиотеки и SysLibCom и ComServis - без разницы. Нулевой порт не открывается..

Safron
29.04.2022, 16:46
Вот код:
PROGRAM PLC_PRG
VAR
com_num:PORTS:=0; (*Номер порта для работы с модемом*)
port_opened: BOOL := FALSE; (*Признак открытия порта*)
com_handle: DWORD; (*Дискриптор порта*)
com_set: COMSETTINGS;
port_init:BOOL:=FALSE;
res:BOOL;
END_VAR

(*Открываем порт*)
IF NOT port_opened THEN
com_handle:=SysComOpen(com_num);
IF com_handle <> 16#FFFFFFFF THEN (*Если дискриптор равен 16#FFFFFFF , то ошибка*) (*Можно сравнить com_handle с 0- потому что ОВЕН *)
port_init:=TRUE;
ELSE
SysComClose(com_num);
port_init:=FALSE; (*Признак открытия порта*)
END_IF;
IF port_init THEN
(*Настраиваем скорость*)
com_set.Port:=com_num;
com_set.dwBaudRate:=1200;
com_set.byParity:=0;
com_set.dwTimeout:=0;
com_set.byStopBits:=0; (* *)
com_set.dwBufferSize:=0;
com_set.dwScan:=0;
res:=SysComSetSettings(com_num,ADR(com_set));
(*Успешно открыли*)
IF NOT res THEN (* ИЛИ Наоборот если res = TRUE, то все параметры установились???*)
port_opened:=TRUE;
END_IF;
END_IF;
END_IF;

melky
29.04.2022, 20:24
Возвращает ошибку, но работает да? Если вы конечно ее не подключили к запрету опроса.
Кто-то на форуме выкладывал отредактированную библиотеку работы с портом, где все порты начинаются с 1-цы и следовательно данной ошибки нет.

Safron
29.04.2022, 22:39
Да я вроде уже решил эту проблему. Не знаю как работать будет, но теперь хоть компилируется. Пришлось в исходной библиотеке SysLibCom в типах данных, где перечисляются порты изменить на (COM0, COM1, COM2,COM3,COM4,COM5,COM6,COM7). Было (COM1:=1, COM2,COM3,COM4,COM5,COM6,COM7, COM8). Т.е прописал COM0, а COM8 удалил как лишний. Видимо больше 8 портов нельзя..
Теперь не могу понять с функцией SysComSetSettings. Вроде она должна возвращать TRUE при успешной записи параметров, но по ходу всё наоборот. Но как удостовериться и проверить - записались на самом деле или нет - пока не знаю как..Да и одна из входных переменных у ней DWORD (написано, что это дискриптор возвращаемый SysComOpen, а по факту в примерах почему то указывают порт...В общем пока не знаю как правильно поступить..Проверить надо как то реальные параметры порта...записались или нет.

kondor3000
30.04.2022, 11:13
Можете не обращать внимания, с "Инвалидом" на самом деле всё работает. Это просто надо знать.

Safron
30.04.2022, 12:41
Интересно. Буду знать.
Вот тут наблюдаю странную картину. Получается, что функция syslibopen в каждом цикле возвращает то 1 то 16#ffffffff ( ошибку). Я почему то считал, что раз отрылся порт, то и состояние порта должно быть однозначным. В общем как то работает со странностями библиотека. Для порта сом4 возвращает 0, для сом0 возвращает 1. По разному..