PDA

Просмотр полной версии : плк63 связь с ним по Rs-232



GAD
10.08.2010, 10:05
в процессе разработки на плк-63 возникла некоторая проблема : появилась необходимость считать значения переменных компьютером по порту Rs-232 , именно этот порт нужен ибо по Rs-485 привязана панель и тензометрия , так вот вопрос , какие есть наиболее приемлемые варианты это сделать (чужая Scada не вариант...).

Николаев Андрей
10.08.2010, 12:20
если Scada не вариант - что значит необходимость считывать? и что с этими данными делать? это нужно на этапе отладки или постоянно?

GAD
10.08.2010, 15:29
нужно это будет скорее всего постоянно , данные ... ну в принципе различные какие понадобиться в процессе разработки (восновном данные моей же программы), а сама трудность заключается в том как использовать Rs-232 для этих целей ... как использовать для этого Rs-485 в целом понятно а как это сделать по 232 порту ? а SCADA ибо ее не одобрит мое начальство (.

ASo
10.08.2010, 16:37
а какая разница какой порт, кроме расстояния.

GAD
10.08.2010, 17:15
разница в том что на Rs-485 уже висит обмен с панелью и темзометрией ... и никуда я его не перенесу . Причем контроллер ПЛК63 -- мастер

lara197a
10.08.2010, 18:12
ставьте преобразователь ас3 и получайте второй Rs485
Rs232 до 3-х метров

GAD
11.08.2010, 09:00
преобразовать Rs-232 в Rs-485 не проблема ... проблема в том как это сказать контроллеру .. ибо там вшит обмен как слейв только по порту Rs-485 ...

Николаев Андрей
11.08.2010, 11:44
последнее мнение ошибочно - контроллер должен ответить по обоим портам запрашиваемые у него данные.

GAD
11.08.2010, 13:39
вопрос не образовался .. на пустом месте ... я пробовал не получилось... ну допустим пробовал читать лектусом , пишет что нет связи с прибором ... настройки , тобишь адрес прибора , настройки ком порта поставил в соответствии с настройками оного в кодесис. попробовал режим и ModBus ASCII и RTU , не могли бы вы скинуть файлик для лектуса .. работающий с плк 63 ? или хотя бы логи обмена между контроллером и компьютером . robingd@mail.ru

lara197a
11.08.2010, 17:11
я пробовал и связывался даже по дебаг, через переходник.

GAD
11.08.2010, 17:18
можно тестовые примеры ? выложите плз

Andy
11.08.2010, 17:37
Rs232 до 3-х метров
Так говорит тот, кто во время оно не запускал локальные сети на компортах.

GAD
13.08.2010, 12:25
огромное спасибо , со всем разобрался ...

GAD
01.09.2010, 13:55
не могу понять причину . меняю скорость с 115200 на 38400 и связь падает в чем проблема?

ASo
01.09.2010, 15:04
скорость и адрес на порту Rs232 фиксированы.

GAD
01.09.2010, 16:38
скорость и адрес на порту Rs232 фиксированы.

ээ ... а что менять эту радость вообще нельзя? .... слабо вериться ....

Филоненко Владислав
01.09.2010, 22:20
Не совсем так. Скорость связи с CoDeSys фиксирована.
Если же хочется изменить скорость работы slave - небольшое шаманство поможет:

Открыть порт библиотекой Syslibcom.lib,
настроить нужные параметры и
закрыть порт - до новой загрузки ПЛК/программы скорость поменяется.

GAD
02.09.2010, 09:52
Не совсем так. Скорость связи с CoDeSys фиксирована.
Если же хочется изменить скорость работы slave - небольшое шаманство поможет:

Открыть порт библиотекой Syslibcom.lib,
настроить нужные параметры и
закрыть порт - до новой загрузки ПЛК/программы скорость поменяется.

Мож я че не так понял ... но не получается ... делаю следующие действия . Код выглядит гдето так
IF port_opened2=0 THEN
Settings1.Port:=1;
Settings1.dwBaudRate:=38400;
Settings1.byParity:=0;
Settings1.dwTimeout:=0;
Settings1.byStopBits:=0;
Settings1.dwBufferSize:=0;
Settings1.dwScan:=0;
END_IF


COM_SERVICE2(Enable:=(port_opened2=0) , Settings:=Settings1 ,
Task:=OPEN_TSK );

IF COM_SERVICE2.ready AND port_opened2=0THEN
port_opened2:=1;
END_IF;

COM_SERVICE2(Enable:=(port_opened2=1), Settings:=Settings1 ,Task:=CLOSE_TSK );
IF port_opened2=1 THEN
port_opened2:=2;
END_IF;

я правильно вас понял?
если да то этот путь не работает ... а если нет то поршу исправить меня ...

И еще маленький вопрос .... адрес менять можно ? или он так и остается адресом по умолчанию?

GAD
02.09.2010, 16:57
хотелось бы также услышать ответ разработчиков .. если это возможно .

Николаев Андрей
02.09.2010, 17:43
Господа Гайворонский и Филоненко и есть разрботчики. Теперь Вы знаете их в лицо:cool:

Филоненко Владислав
02.09.2010, 17:55
Адрес менять можно лишь на 485. Для 232 это лишено смысла, т.к. соединение peer-to-peer.
Я, конечно, понимаю, можно поставить конвертор 232-485, но ресурсы не бесконечные.

COM_SERVICE я не рекомендую использовать. Классический пример открытия, настройки и закрытия порта дан в примерах и на диске.

GAD
03.09.2010, 09:27
Адрес менять можно лишь на 485. Для 232 это лишено смысла, т.к. соединение peer-to-peer.
Я, конечно, понимаю, можно поставить конвертор 232-485, но ресурсы не бесконечные.

COM_SERVICE я не рекомендую использовать. Классический пример открытия, настройки и закрытия порта дан в примерах и на диске.

В принципе если адрес нельзя менять то и скорость мне безразлична .
Вот а на счет COM_SERVICE ... взят из ваших примеров ... хз ... дисков скопилось множество ... на каком что и как есть уже просмотреть долго .... до тех что добрался используются те же COM_SERVICE , если можно либо вышлите пример ... либо выложите прям тут ... надо ж совершенствовать свой код ;) . мыло robingd@yandex.ru

ЗЫ: Приятно познакомиться с разработчиками ). Чувствую скоро у меня появяться вопросы по использованию вашего модуля для тензодатчиков ...

Филоненко Владислав
03.09.2010, 11:59
(*Открываем порт*)
IF NOT port_opened THEN
com_handle:=SysComOpen(com_num);
IF com_handle<>16#FFFFFFFF THEN
port_init:=TRUE;
ELSE
SysComClose( com_num);
com_handle:=SysComOpen( com_num);
port_init:=TRUE;

END_IF
(*
(*Настраиваем скорость*)
com_set.Port:=com_num;
com_set.dwBaudRate:=115200;
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
port_opened:=TRUE;
END_IF

*)
com_setEx.Size:=SIZEOF(com_setEx);
com_setEx.Port:=com_num;
com_setEx.dwBaudRate:=9600;

com_setEx.byStopBits:=0;
(*
byStopBits:BYTE; Кол-во стоповых бит 0 =один, 1=полтора , 2=два
*)
com_setEx.byParity:=0;
(*
byParity:BYTE; Режим проверки четности 0 = нет, 1 = нечет, 2 = чет
*)

com_setEx.dwTimeout:=0;(*
DWORD; Не используется должно быть =0
*)
com_setEx.dwBufferSize:=0;
(*DWORD; Не используется должно быть =0
*)
com_setEx.dwScan:=0;(*DWORD; Не используется должно быть =0
*)

com_setEx.cByteSize :=7;
(* BYTE; Длина символа в битах 5-8 бит.
*)
(*
fOutxCtsFlow : BOOL; Определяет состояние вывода CTS в PLC-100 не распаян

fDtrControl : BYTE; Определяет состояние вывода DTR в PLC-100 не распаян

fDsrSensitivity : BOOL; Определяет чувствительность к состоянию вывода DTR в PLC-
100 не распаян
f RtsControl : BYTE; Определяет состояние вывода RTS в PLC-100 не распаян

fOutxDsrFlow : BOOL; Определяет состояние вывода DSR в PLC-100 не распаян
*)

res:=SysComSetSettingsEx(com_num,ADR(com_setEx));

(*Успешно открыли*)
IF NOT res THEN
port_opened:=TRUE;
END_IF
END_IF

IF NOT port_opened THEN
RETURN;
END_IF

ton1(In:=start_tmr,pt:=t#1s);
start_tmr:=TRUE;
tr1(clk:=ton1.Q);
IF tr1.Q THEN
SysComWrite(com_num,ADR(snd_str),LEN(snd_str),0);
start_tmr:=FALSE;
END_IF

sz:=SysComRead(com_num,ADR(rcvBUF),1024,0);

Игорь_К
19.07.2019, 07:57
Здравствуйте!

Прошу помощи в решении следующей проблемы

Есть контроллер ПЛК63. Порт RS-485 занят под передачу данных по ModBUS в скаду (работает как Slave). Потребовалось подключить СМИ2. Для этого задействовал порт RS-232 с преобразователем АС3-М. Запустил. Все работает, но не долго. Для мониторинга, параллельно со СМИ2 подключил АС4 и увидел что после запуска программы пакеты передаются. СМИ2 получает и отображает данные. Но потом вижу в терминале, начинают появляться пакеты не похожие на все остальные. Другой длины. Потом опять все нормально. И после 5-10 мин передача останавливается. Пакеты перестают передаваться, при том программа продолжает работать. Это я вижу на дисплее контроллера. На нем выведены показания, которые при работе программы меняются.

Не могу понять, в какую сторону смотреть. Почему RS-232 так себя ведет?

Вот код, который я использую для передачи MODBUS пакетов в СМИ2, через RS-232/ Код взят из примера. Своего не придумывал, кроме параметров связи.


IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );


IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF

IF port_opened=2 THEN

write_modbus(
Enable:= Enabl ,
Mode:=MB_ASCII ,
DevAddr:=17,
RegAddr:=25 ,
Value:=skip1_d ,
ComHandle:=Settings.Port,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err
);

IF Enabl = FALSE THEN
Enabl := TRUE;
END_IF

IF err <> 0 THEN
Enabl := FALSE;
END_IF

END_IF

ASo
19.07.2019, 09:28
Каким кабелем подключен АС3?

Игорь_К
19.07.2019, 09:54
Самодельный. с одной стороны RJ, с другой DB9. Подключены линии TX RX и GND (2,3,5). Три линии распаяны.

Игорь_К
19.07.2019, 13:40
а какой кабель из готовых нужно использовать для конвертации RS-232 на ПЛК63 в RS-485 через АС3-М?

увидел есть кабели КС2 и КС3

ASo
19.07.2019, 14:46
У Вас правильный кабель но не правильный код. Вы не даете блоку работать.

Игорь_К
19.07.2019, 14:58
а как же я тогда вижу в терминале передачу данных? Просто она останавливается со временем. Значит я даю блоку разрешение на работу. Или я Ваш ответ не понял?

Игорь_К
19.07.2019, 15:01
Заметил. Что связь устойчивее, когда подключены линии TX и GND. Надобности в линии RX не вижу, т.к. контроллер работает, только на передачу. Но все равно вижу искаженные пакеты.