У меня небыло опыта работы СПК по 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=> );
//и т.д