И еще раз про UNM.lib ...
Приветствую всех, кто не прошел мимо!
Тема неоднократно здесь обсуждалась, но подходящей, касаемо своего вопроса, не нашлось. Да простят меня все...
Имеем ПЛК160, требуется осуществить обмен через порт RS-232 Debug с ПК по стандартному протоколу Modbus. ПЛК - slave.
Используется библиотека UNM.lib, функция GetByte и все остальное.
Загвоздка в том, что обмен через обычный порт RS-232 идет. Ошибок нет, проблем нет. А тот же код, но по RS-232 Debug, не работает.
Режим отладки говорит о том, что не обнаруживается конец сообщения Modbus и не осуществляется переход к следующему состоянию автомата, где сообщение разбирается.
Код:
PROGRAM ModbusSlave
VAR CONSTANT
...
E_NOT: BYTE := 0;
F_FRM: BYTE := 16#08;
E_OVR: BYTE := 16#20;
E_FRM: BYTE := 16#40;
E_PRT: BYTE := 16#80;
...
CASE state OF
...
ST_INIT_UMN_STATE: (* инициализация модуля *)
IF( LockDevice( UNM_MODULE ) = 1 ) THEN
state := ST_BEGIN_WAIT_STATE;
ELSE
state := ST_ERROR_COMM;
END_IF;
ST_BEGIN_WAIT_STATE: (* запуск цикла приема *)
error := ER_NOT_ERROR;
n_wr := 0;
n_rd := 0;
rbflags^ := 0;
state := ST_WAIT_CMD_STATE;
ST_WAIT_CMD_STATE: (* прием команды *)
rbdata := GetByte( UNM_MODULE );
IF( rbdata > 0 ) THEN
rbflags := rbdata+1;
IF( ( rbflags^ AND E_OVR ) <> 0 OR (* переполнение *)
( rbflags^ AND E_FRM ) <> 0 OR (* формат *)
( rbflags^ AND E_PRT ) <> 0 ) THEN (* четность *)
error := ER_COMM_ERROR;
state := ST_ERROR_COMM;
ELSE
rbbyte := rbdata;
mb_request[n_rd] := rbbyte^;
n_rd := n_rd+1;
END_IF;
ELSE
IF( ( rbflags^ AND F_FRM ) <> 0 ) THEN (*конец сообщения*)
state := ST_CHK_CMD_VALID; (* состояние, в котором идет разбор сообщения *)
END_IF;
END_IF;
...
где флаги анализируются согласно документации на библиотеку UNM.lib
Код HTML:
Описание структуры RBDATA: STRUCT
data: BYTE; – принятый байт
flags: BYTE; – флаги
Флаги
unsigned char reserved: 1; – не используется
unsigned char noktime: 1; – время между байтами >1.5 символов
unsigned char new_frame: 1; – для внутреннего использования
unsigned char end_frame: 1; – время между байтами >3.5 символов
unsigned char temp_el_full: 1; – для внутреннего использования
unsigned char overrun: 1; – ошибка переполнения буфера
unsigned char frame_error: 1; – ошибка стоп бита
unsigned char parity_error: 1; – ошибка четности
То есть, согласно коду, выход из состояния должен произойти, когда флаг - время между байтами >3.5 символов, будет выставлен.
Но этого не происходит. И только на RS-232 Debug.
Про ограничения порта Debug читал, там такого вроде как нет.
Ошибка в коде?