Показано с 1 по 4 из 4

Тема: И еще раз про UNM.lib ...

  1. #1
    Пользователь
    Регистрация
    24.12.2014
    Адрес
    Санкт-Петербург
    Сообщений
    26

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

  2. #2

    По умолчанию

    Цитата Сообщение от DENth Посмотреть сообщение
    Приветствую всех, кто не прошел мимо!
    Про ограничения порта Debug читал, там такого вроде как нет.
    Ошибка в коде?
    Как раз там ограничение и есть. Debug не может аппаратно обрабатывать RTU! И соответственно, флагов не будет. Обрабатывайте конец пачки в программе, по таймауту и/или CRC
    Тролль-наседка, добрый, нежный и ласковый

  3. #3
    Пользователь
    Регистрация
    24.12.2014
    Адрес
    Санкт-Петербург
    Сообщений
    26

    По умолчанию

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

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

  4. #4

    По умолчанию

    Это не у Вас работает, а мы подстелили соломки Но лучше ASCII. Или как я описывал выше.
    А подсказал мне pdf на процессор, где черными англицкими буквами это было написано.
    Тролль-наседка, добрый, нежный и ласковый

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •