-
СПК207: RS-232 мастер
У меня небыло опыта работы СПК по 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=> );
//и т.д
-
Может не проходит переключение? Прослушайте и 485 и 232 - станет ясно
-
Да, похоже что не происходит переключения. Через меню СПК настроил оба порта на 232, думал может перепутаны местами. Ничего не изменилось: гипертерминал фиксирует запросы только по 485-му порту (через АС3-М), подключаю кабель (КС-1) к 232-му - там тишина.
При этом, не важны настройки ComConn.Port_Mode и ComConn.Port_ModeOn, все равно запросы идут по RS-485.
-
Заяц, добрый день.
Для решения вашей проблемы зайдите в реализацию функционального блока 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. Есть описание на этот блок. Рекомендую прочитать.
-
a.tkachenko, здравствуйте.
Решил воспользоваться Вашим советом, и во время подключения ПК к СПК, с помощью кабеля КС1, понял, что СОМ2 СПК имеет разъем под RJ45, а КС1 - RJ25! :D Вот это промах! Хотя, если не присматриваться, он хорошо защелкивается и отлично держится. Хм, нет защиты от дурака, учитывая, что каждый СПК комплектуется подробным кабелем...
-
RJ25 от RJ45 отличается одной перемычкой. В РЭ это все указано.
-
Вложений: 2
Не соглашусь: RJ25(RJ12) - 6-и контактный коннектор; RJ45 - 8-и контактный коннектор.
Но даже если считать что 1-й контакт RJ25 попадает на 2-й контакт RJ45, то получаются соединения: RTS<->RxD, GND<->TxD, CTS<->GND. Это явно не то, что нам нужно.