PDA

Просмотр полной версии : И еще раз про UNM.lib ...



DENth
18.04.2016, 22:10
Приветствую всех, кто не прошел мимо!

Тема неоднократно здесь обсуждалась, но подходящей, касаемо своего вопроса, не нашлось. Да простят меня все...

Имеем ПЛК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

Описание структуры 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 читал, там такого вроде как нет.
Ошибка в коде?

Филоненко Владислав
19.04.2016, 08:58
Приветствую всех, кто не прошел мимо!
Про ограничения порта Debug читал, там такого вроде как нет.
Ошибка в коде?

Как раз там ограничение и есть. Debug не может аппаратно обрабатывать RTU! И соответственно, флагов не будет. Обрабатывайте конец пачки в программе, по таймауту и/или CRC

DENth
19.04.2016, 19:45
Хм. Спасибо за помощь, Владислав!
Однако, в Руководстве по программированию ПЛК пишется: Внимание! Порт Debug RS-232 в модуле Modbus (Master) может работать только в режиме ASCII, работа в режиме RTU невозможна.
Это все, что встречается в тексте. Но у меня Slave и RTU функционирует, правда, получается, с оговорками.

Просто для моего собственного понимания - это подсказала Вам практика или какой-то документ? В явном виде я нигде не встретил описания этого ограничения, хотя читал все внимательно. Тем более не стал бы закладываться в своей реализации на эту библиотеку, так как нужен именно порт Debug, чтобы иметь возможность обмена и перепрограммирования, повесив перемычку.

Филоненко Владислав
20.04.2016, 21:01
Это не у Вас работает, а мы подстелили соломки :) Но лучше ASCII. Или как я описывал выше.
А подсказал мне pdf на процессор, где черными англицкими буквами это было написано.