PDA

Просмотр полной версии : СПК207: RS-232 мастер



Солнечный заяц
31.01.2013, 17:29
У меня небыло опыта работы СПК по RS-232. Но вот, появилась необходимость чтения регистров из теплосчетчика Взлет, по этому интерфейсу.
У меня уже была работающая программа опроса этого счетчика, использующая библиотеку ModulsOwenLib, но для RS-485-го порта.
Решил пойти простым путем:
1. Переключить 2-й порт СПК в режим работы RS-232 через его меню. Применил, перезагрузился.
2. Заменил переменные ComConn.Port_Mode:=2->0 и ComConn.Port_ModeOn:=false->true
3. Блоки UniRead не трогал. Вроде все должно остаться как есть.

Вроде ничего не изменил, кроме типа интерфейса, а не работает. Индикатор порта 2 мигает. Может я что-то упустил?

И еще. Вроде как можно подключиться через гипертерминал и послушать порт СПК. Подключался, вводил настройки частоты, а в окне пусто... Может снова что-то не так делаю?

Ниже привожу кусок кода опроса. Надеюсь все будет понятно.


// Открытие порта 1
Opn_port_1: ComConn;
// режим работы порта 1
mode_com1: BYTE;
// Блок чтения расхода со взлета 1
Read_Vzlet_1: UniRead_Input_Regs; // UniRead_Input_Regs это то же UniRead, только использует команду чтения входных регистров (0x04 вместо 0x03) (особенности размещения данных в вычислителе Взлет)



//!!! Для теста, в самом деле, я использовал порт 2 !!!

//Работаем с портом 1
//открываем порт 1
IF NOT Opn_port_1.Done THEN
Opn_port_1(
enable:=TRUE ,
PortNum:=3 ,
PortBaudrate:=9600 ,
PortParity:=0 ,
PortStopBits:=1 ,
PortByteSize:=8 ,
Port_Mode:=0 ,
Port_ModeOn:=TRUE ,
Port_CloseOn:= ,
Handle=> ,
Done=> ,
ErrCode=> );
END_IF
CASE mode_com1 OF
0:
IF Opn_port_1.Done THEN
mode_com1:=mode_com1+1;
Read_Vzlet_1.Enabl:=TRUE;
END_IF
1:
IF Read_Vzlet_1.done THEN
Read_Vzlet_1.Enabl:=FALSE;
Read_Vzlet_2.Enabl:=TRUE;
mode_com1:=mode_com1+1;
END_IF
2:
IF Read_Vzlet_2.done THEN
Read_Vzlet_2.Enabl:=FALSE;
Read_Sum_Vzlet_1.Enabl:=TRUE;
mode_com1:=mode_com1+1;
END_IF
3:
IF Read_Sum_Vzlet_1.done THEN
Read_Sum_Vzlet_1.Enabl:=FALSE;
Read_Sum_Vzlet_2.Enabl:=TRUE;
mode_com1:=mode_com1+1;
END_IF
4:
IF Read_Sum_Vzlet_2.done THEN
Read_Sum_Vzlet_2.Enabl:=FALSE;
mode_com1:=mode_com1+1;
END_IF
ELSE
mode_com1:=0;
END_CASE

Read_Vzlet_1(
Handle:=Opn_port_1.Handle ,
Enabl:= ,
Modd:= ,
Addr:=33(**) ,
RegAddr:=49242 ,
TimeOut:=T#300MS ,
ErCL:= ,
VarAdr:=ADR(Tube_Discharge[1].Value) ,
VarType:=2 , //если не пойдет - поставить тип 2
wErrCode=>Tube_Discharge[1].Error ,
done=> );

Read_Vzlet_2(
Handle:=Opn_port_1.Handle ,
Enabl:= ,
Modd:= ,
Addr:=33(**) ,
RegAddr:=49244 ,
TimeOut:=T#300MS ,
ErCL:= ,
VarAdr:=ADR(Tube_Discharge[2].Value) ,
VarType:=2 ,
wErrCode=>Tube_Discharge[2].Error ,
done=> );
//и т.д

kgsh82
01.02.2013, 20:22
Может не проходит переключение? Прослушайте и 485 и 232 - станет ясно

Солнечный заяц
04.02.2013, 10:27
Да, похоже что не происходит переключения. Через меню СПК настроил оба порта на 232, думал может перепутаны местами. Ничего не изменилось: гипертерминал фиксирует запросы только по 485-му порту (через АС3-М), подключаю кабель (КС-1) к 232-му - там тишина.
При этом, не важны настройки ComConn.Port_Mode и ComConn.Port_ModeOn, все равно запросы идут по RS-485.

a.tkachenko
08.02.2013, 10:45
Заяц, добрый день.
Для решения вашей проблемы зайдите в реализацию функционального блока ComConn.
Добавьте перед условием:

(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF (handle <> 16#FFFFFFFF ) THEN //если условие не выполняется то порт занят
done:=TRUE;
trig(RESET1:=true);
ELSE
done:=FALSE;
END_IF

Следующую строчку:


res:=RS_mode_Setup(handle,RS_485);

Указав тип. RS_232. Есть описание на этот блок. Рекомендую прочитать.

Солнечный заяц
11.02.2013, 16:37
a.tkachenko, здравствуйте.
Решил воспользоваться Вашим советом, и во время подключения ПК к СПК, с помощью кабеля КС1, понял, что СОМ2 СПК имеет разъем под RJ45, а КС1 - RJ25! :D Вот это промах! Хотя, если не присматриваться, он хорошо защелкивается и отлично держится. Хм, нет защиты от дурака, учитывая, что каждый СПК комплектуется подробным кабелем...

a.tkachenko
13.02.2013, 14:05
RJ25 от RJ45 отличается одной перемычкой. В РЭ это все указано.

Солнечный заяц
14.02.2013, 10:06
Не соглашусь: RJ25(RJ12) - 6-и контактный коннектор; RJ45 - 8-и контактный коннектор.
Но даже если считать что 1-й контакт RJ25 попадает на 2-й контакт RJ45, то получаются соединения: RTS<->RxD, GND<->TxD, CTS<->GND. Это явно не то, что нам нужно.