Приветствую всех, кто не прошел мимо!
Тема неоднократно здесь обсуждалась, но подходящей, касаемо своего вопроса, не нашлось. Да простят меня все...
Имеем ПЛК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 читал, там такого вроде как нет.
Ошибка в коде?