PDA

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



Jumo
10.11.2011, 07:52
Доброго времени суток, возникает следующая проблема при попытке открыть порт COM, COM_SERVICE1.ready постоянно возвращает FALSE, код программы следующий(практически такой же, как и из примера):
PROGRAM PLC_PRG
VAR
GetTemp: MB_RD_HOLD_REGS;
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
port_opened: BYTE := 0;
cmpl: BOOL;
Init: BOOL; (* признак инициализации пользовательской программы *)
Settings: ModBus.SysCom.COM_Settings;(* настройки последовательного порта *)
SettingsEx: ModBus.SysCom.COM_SettingsEx;
com_num: ModBus.COM_Ports:=1;
enabl: BOOL:=1; (*состояние работы блока*)
err: INT; (*номер ошибки*)
TimeOut: TIME:=T#500ms;(*таймаут*)
Exception: BYTE;
DataSize: WORD;
master1: BYTE:= 1;

t: DWORD; (*переменная для организации счетчика*)
A: WORD := 0; (*счетчик*)
x: WORD; (*считанное значение*)
x1: WORD; (*переменная для записи по сети*)
x2: WORD; (*переменная для записи по сети*)
x3: WORD; (*переменная для записи по сети*)
d: REAL; (*считанное значение*)
ptr_D:POINTER TO BYTE;

COM_SERVICE1: COM_SERVICE;
//Res : ModBus.SysCom.RTS_IEC_RESULT;

END_VAR



(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.sPort:=com_num;
Settings.ulBaudRate:=19200;
Settings.byParity:=0;
Settings.ulTimeOut:=0;
Settings.byStopBits:=3;
Settings.ulBufferSize:=0;
//SettingsEx.byByteSize:=8;
//SettingsEx.bBinary:=TRUE;
END_IF
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings,(*sets_ex:=Setting*****) Task:=OPEN_TSK);
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
//ELSE
//COM_SERVICE1.Enable:=FALSE;
END_IF

IF port_opened=2 THEN
GetTemp(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=1 , (*адрес*)
FirstAddr:=1 , (*номер регистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=Settings.sPort , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#500ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
END_IF;

capzap
10.11.2011, 10:02
com_num: ModBus.COM_Ports:=1; (*0 - RS-485, 1 - RS-232*)

На эту строчку кто будет смотреть?

Jumo
10.11.2011, 11:52
На эту строчку кто будет смотреть?

А что не так с этой строчкой?

capzap
10.11.2011, 12:01
ну прочту за Вас, в Вашем коде переменной ModBus.COM_Ports присвоена единица, смотрим комментарий и видим, что единице соответствует порт RS232, а Вы пытаетесь соединится по RS485, т.е. необходимо присвоить (нуль,ноль) - по вкусу

Jumo
10.11.2011, 12:16
Надо комментарий убрать (он старый), не важно какой порт я пытаюсь открыть результат один и тот же.

Jumo
10.11.2011, 14:21
Все проблема решена, нужно было стучаться в com-порт много раз, через определенное количество попыток порт открывается. Теперь возникла следующая проблема: при приеме данных через com-порт по интерфейсу rs-485 постоянно появляется ошибка передачи данных 255, как с этим бороться? Данные естественно не передаются.

capzap
10.11.2011, 14:25
Вы и так стучались в порт несколько раз, пока порт не откроется
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings,(*sets_ex:=Setting*****) Task:=OPEN_TSK);
увеличивайте таймаут, пока не пропадет ошибка 255

ЗЫ еще не прокомментируете, что за оборудование обладает тремя стоповыми битами
Settings.byStopBits:=3;или опять устарелая информация

Евгений Сергеевич
10.11.2011, 14:40
по работе с компортом посмотрите вот этот пример
http://www.owen.ru/forum/showpost.php?p=55455&postcount=7
так же проверьте правильно ли выбран режим работы порта (т.е. перемычки)

для работы по 485 интерфейсу все в положении off

Евгений Сергеевич
10.11.2011, 14:45
Settings.byStopBits:=1; это один стоп бит,
Settings.byStopBits:=2; это полтора стоп бита,
Settings.byStopBits:=3; это два стоп бита,

Вообще-то порт открывается с первой попытки

для использования первого порта P1 необходимо указывать номер ком порта 2, нумерация получилась сдвинутой из-за того, что 1 это консоль.

capzap
10.11.2011, 14:55
Settings.byStopBits:=1; это один стоп бит,
Settings.byStopBits:=2; это полтора стоп бита,
Settings.byStopBits:=3; это два стоп бита,

Вообще-то порт открывается с первой попытки

для использования первого порта P1 необходимо указывать номер ком порта 2, нумерация получилась сдвинутой из-за того, что 1 это консоль.

:) Оказывается как не просто переходить с КДС 2.3, там то
(*
byParity - Режим проверки четности 0 = нет, 1 = нечет, 2 = четн
byStopBits - Кол-во стоповых бит 0 =один, 1=полтора, 2=два
номер порта 0 - RS-485, 1 - RS-232, 4 - RS-232 DEBUG
*)

Jumo
11.11.2011, 07:01
Возникает вопрос: если есть такие сложности с открытием порта com, то как тогда подключить к данному контроллеру панель оператора, например ИП320?
Приведенный выше пример рассмотрю сегодня, заранее спасибо.

Jumo
11.11.2011, 10:15
Попробовал сделать все как описано в примере, com порт открывается, светодиод P1 гаснет, все в принципе как и было раньше, только с первой попытки. Данные по интерфейсу rs-485 все равно не считываются - ошибка 255. В чем может быть проблема?

capzap
11.11.2011, 10:37
да все по прежнему, таймаут может возникнуть из-за не правильной адресации, из-за неправильного соединения А и Б и т.д.

Yury Evgenev
16.10.2013, 10:53
Здравствуйте!

Проясните пожалуйста, кто знает.
Есть ПЛК304. Хочу организовать обмен данными с устройством на уровне байтов.
Где найти справку о том, как управлять (писать в порт и читать из порта) самостоятельно каждый байт? Т.е. реализовать свой протокол. Какую библиотеку брать?
Спасибо.