PDA

Просмотр полной версии : RS-232 и Modbus



Klik
17.10.2007, 13:23
Возможно ли соединение RS-232 (ПЛК100-24.К-М) и СОМ2 на компьютере.
Пробовала воспользоваться программой com_port_test поставляемую вместе с диском, ни чего не получается. Проверка передачи данных проверяется с помощью программы Terminal. Передачу не видит, т.е. её не происходит.:confused: :confused: :confused:

Филоненко Владислав
17.10.2007, 13:29
1. Используйте нуль-модемный кабель.
2. На ПЛК нужно создать проект, в котором будет ModBus/ОВЕН slave и хотя бы 1 переменная.
+ настройте порт 232 на ту-же скорость, четность и режим (RTU/ASCII), как на компьютере

Klik
17.10.2007, 14:49
1. Используйте нуль-модемный кабель.
2. На ПЛК нужно создать проект, в котором будет ModBus/ОВЕН slave и хотя бы 1 переменная.
+ настройте порт 232 на ту-же скорость, четность и режим (RTU/ASCII), как на компьютере

По второму пункту: ModBus/ОВЕН slave задавать в PLC Configuration???

Николаев Андрей
17.10.2007, 23:54
Вы хотите связываться через СОМ порт для программирования, или для чего?

Klik
18.10.2007, 12:59
Для проверки связи по Modbus. Modbus устройство симулирую с помошью программы ModSim32.

Филоненко Владислав
18.10.2007, 13:00
По второму пункту: ModBus/ОВЕН slave задавать в PLC Configuration???
Да, в конфигурации

Klik
18.10.2007, 14:00
Спасибо за своевременные ответы.

Klik
22.10.2007, 10:14
Возникли еще вопросы по функции приема блока байтов. Программой Terminal отсылаю данные. В случае успеха функция должна возвращать количество байт, считанных из циклического буфера приемника. Возвращает все время =0. Порт открыт. Данные из контроллера отсылаются корректно.:confused: :confused: :confused:

Филоненко Владислав
22.10.2007, 11:33
Проект, плиз.

Klik
22.10.2007, 12:09
PROGRAM PLC_PRG
VAR
port_opened: BOOL := FALSE;
com_handle: DWORD;
com_num: PORTS := 1;
com_set: COMSETTINGS;
com_setEx: COMSETTINGSEX;
res: BOOL;
tOn1: TON;
start_tmr: BOOL := FALSE;
tr1: R_TRIG;
snd_str: STRING := '01 04 0FB7 0004 42C8';
port_init: BOOL;
rcvbuf: ARRAY [0..100] OF BYTE;
sz: DWORD;
END_VAR

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_setEx.Size:=SIZEOF(com_setEx);
com_setEx.Port:=com_num;
com_setEx.dwBaudRate:=9600;
com_setEx.byStopBits:=0;
com_setEx.byParity:=0;
com_setEx.dwTimeout:=0;
com_setEx.dwBufferSize:=0;
com_setEx.dwScan:=0;
com_setEx.cByteSize :=7;

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#5s);
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),100,0);

Филоненко Владислав
22.10.2007, 12:21
А как вы контролируете, что пришел байт? Визуально - ничего не увидите, т.к. sz<>0 будет только 1 мс! Поставьте ловушку

Klik
22.10.2007, 13:32
Поставила обычную ловушку
IF sz<>0 THEN i:=2;
ELSE i:=1;
END_IF;
Все равно значение не изменяется (i=1).
Через Terminal отсылаю сообщение: 02 04 01 0001
В rcvbuf следующая картина:
rcvbuf[0]=49
rcvbuf[1]=49
rcvbuf[2]=0
дальше нули.

Филоненко Владислав
22.10.2007, 14:39
Так все правильно.
Ловушка должна выглядеть иначе!

sz:=SysComRead(com_num,ADR(rcvbuf)+i,100,0);
i:=i+sz;
Тогда байты будут складываться в буфер по мере прихода, а i - покажет число принятых байтов!

Klik
22.10.2007, 15:06
Спасибо, все заработало:) :) :)

Филоненко Владислав
22.10.2007, 16:34
Замечательно! Всегда рад помочь ;)

Capiton
04.05.2011, 13:12
Спасибо, все заработало:) :) :)

А можно примерчик выложить чтоб можно было полностью посмотреть меня тоже интересует этот вопрос.