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




Ответить с цитированием