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

Тема: Вопрос по применению библиотеки UNM

  1. #1
    Пользователь
    Регистрация
    21.03.2011
    Адрес
    Киров
    Сообщений
    176

    По умолчанию Вопрос по применению библиотеки UNM

    Добрый день. Изучил несколько примеров, прочитал наверное все темы где встречается слово "unm", но у меня так и не получается опросить устройство (лазерный датчик). Запрос отправляется, это я отследил portmon'ом, приходит всякая ересь, где-то что-то я делаю не так. Нет ли самого простого примерчика (желательно на CFC), где отправка запроса, и прием ответа, состоящего из нескольких байт(у меня 4), чтобы получилась строка принятых байт? Покажите, если несложно, а то я скоро мозг себе сломаю.
    Вот что у меня пока получилось:
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	unm.jpg 
Просмотров:	297 
Размер:	61.2 Кб 
ID:	4894  

  2. #2

    По умолчанию

    Здравствуйте!
    Посмотрите пример опрса параметров электросчетчика с помощью библиотеки UNM.lib или пример реализации протокола с помощью библиотеки SysLibCom.lib http://www.owen.ru/forum/showthread.php?t=11279 .

  3. #3
    Пользователь
    Регистрация
    21.03.2011
    Адрес
    Киров
    Сообщений
    176

    По умолчанию

    Все равно не совсем понятно. Правильно ли думаю, последовательность должна быть такая: посылка запроса, пауза, прием одного байта с помощью GetByte, преобразование принятого байта в строку с помощью RBDATA_TO_STRING, прием следующего байта GetByte, преобразование в строку и т.д. пока не будет принято нужное количество байт, потом склеивание строк в одну. Так? Если так то как осуществляется прием следующего байта? Нужно использовать указатели?

  4. #4

    Post

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

    Работа с портом очень проста на самом деле.

    Для корректной работы очень рекомендую использовать оператор Case. Он позволяет каждое новое условие обрабатывать в следующем цикле.

    Теперь к делу. Немного об операторе CASE:
    PHP код:
    Инструкция CASE
    C помощью CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции.

    Синтаксис:

    CASE <
    Var1OF

    <Value1>: <Instruction 1>

    <
    Value2>: <Instruction 2>

    <
    Value3Value4Value5>: <Instruction 3>

    <
    Value6 .. Value10>: <Instruction 4>

    ... 

    <
    Value n>: <Instruction n>

    ELSE <ELSE 
    instruction>

    END_CASE;

     

    Если переменная <Var1имеет значение <Value i>, то выполняется инструкция <Instruction i

     
    Если  <Var1не принимает ни одного из  указанных значенийто выполняется  <ELSE Instruction>.

     
    Чтобы одна и та же инструкция выполнялась при различных значениях  переменной <Var1>, необходимо перечислить эти значения через запятую.

     
    Чтобы одна и та же инструкция выполнялась для целого диапазона значенийнеобходимо указать начальное и конечное значенияразделенные двумя точками.

    Пример:

     

    CASE 
    INT1 OF
    1
    5BOOL1 := TRUE;
          
    BOOL3 := FALSE;
    2:  BOOL2 := FALSE;
        
    BOOL3 := TRUE;
    10..20BOOL1 := TRUE;
            
    BOOL3:= TRUE;
    ELSE
     
    BOOL1 := NOT BOOL1;
     
    BOOL2 := BOOL1 OR BOOL2;
    END_CASE 
    Теперь поговорим о портах.

    1) Необходимо сформировать посылку.
    Посылка может быть строкой определенного формата или заданной последовательностью байт.
    Самое главное на этом этапе - расчет контрольной суммы. Она есть практически у всех устройств, она позволяет защитить отсылаемые команды от помех и предотвратить передачу ложной информации.
    2) Далее команду нужно отослать. Делаете запись в порт. Не зависимо от того какой вы библиотекой будете пользоваться - UNM или SysLibCom все команды записи возвращают число отправленных байт.
    Данную команду необходимо выполнять до тех пор, пока возвращаемое число байт не сравняется с длиной команды.
    Как только число байт будет верным необходимо запустить таймер. Данный таймер нужен, для того, чтобы задать время ожидания ответа.
    3) Теперь начинаем опрос порта. Каждый цикл команда чтения порта возвращает число принятых байт. Если за цикл ни чего не пришло число байт будет равняться 0.
    С этого момента начинается все самое интересное. В зависимости от навыков программирования, можно сходу анализировать информацию, которая приходит в порт. Но я рекомендую собирать принятую информацию в некоторый буфер и работать с буфером.

    После выполнения команды чтения порта опрашиваем таймер. Если он еще не закончил работу необходимо анализировать принятую информацию. Это зависит от конкретного протокола и ваших потребностей.

    Если таймер закончил работу, а ответа нет или он не той длины или он не того содержания, или CRC не корректная ответ считается ошибочным. Сбрасываем таймер, чистим буфер, переходим в начало программы.

    Если ответ пришел раньше чем закончил работу таймер переходим в стадию расшифровки.

    Инога очень полезно делать паузы между запросами, чтобы не перегружать интерфейс.

  5. #5
    Пользователь
    Регистрация
    21.03.2011
    Адрес
    Киров
    Сообщений
    176

    По умолчанию

    Спасибо, с этим вопросом я разобрался, помог пример с опросом счетчика меркурий.

  6. #6
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,116

    По умолчанию

    Может что типа этого http://sesorov.narod.ru/que.html
    электронщик до мозга костей и не только

  7. #7
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,116

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Как можно перегрузить-то ? Или куча мастеров ?
    думаю только в этом случае можно что-то перегрузить Это типа когда пять человек хотят с одним поговорить одновременно.
    электронщик до мозга костей и не только

  8. #8

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Загадочная фраза
    Как его можно перегрузить ?
    Я так понимаю речь о тайм-ауте следующей посылки.
    После того, как не пришел\пришел не ликвидный ответ - не выставляйте порт на передачу и не шлите сразу, сделайте временную выдержку - вдруг ответ или мусор от предыдущего спрошенного устройства еще будет, посылки встретившись потеряются.

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Загадочная фраза
    Как его можно перегрузить ?
    Очень просто, например, какое нибудь древнее устройство с большим интервалом ответа. Если Такому устройству слать очень много запросов, и при этом интервал ожидания ответа будет установлен небольшим, то мастер будет слать запросы, но ответы не будет успевать успевать.
    А теперь представим, что таких устройств не одно а десяток. И если постоянно будут запросы, запросы и запросы, то в итоге вы получите кашу. Поэтому, чтобы ответы от всех устройств пришли и не накладывались с остальными неплохо делать паузу.

  10. #10

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    От он. (Со-аффтар ?)
    PS PS
    И нафига вообще - эти задержки ответа. Везде делаю 0, и не имею проблем
    Дело вкуса и вопрос надежности.
    1) Если объект имеет статус важный необходимо убедиться, что посылка устройству ушла и оно его прожевало.
    Потому сразу после отправки взводится таймер. Ели ответ придет раньше чем таймер отработал, то его можно сбросить. Если таймер завершил работу, то нужно сделать посылку еще раз.

    2) Про задержки ответа (именно задержки ответа, а не что-то другое) могу сказать, что их я тоже не использую. Но! в некоторых случаях они реально бывают нужны. Вот недалече столкнулся с такой проблемой, когда наш клиент СП270 использовал как ПЛК. Когда на всех модулях стояли задержки ответа 0, RS-485 все время обваливался, как только данный параметр устанавливался в 1 или 2 связь налаживалась.

    3) Еще паузы между запросами очень полезны в отладочном режиме, кода протокол пытаетесь свой написать. Если задержки не будет, то просмотреть огромный поток цифр крайне сложно. А установив паузу в 1 секунду можно проводить эксперименты. К тому же появляется возможно проверить нагрузочную способность сети.

Похожие темы

  1. Про библиотеки
    от aven в разделе ПЛК1хх
    Ответов: 26
    Последнее сообщение: 22.04.2016, 00:19
  2. ПЛК 304/308 - Библиотеки к ним
    от vlkv в разделе ПЛК3хх
    Ответов: 3
    Последнее сообщение: 25.02.2011, 16:55
  3. Cad библиотеки
    от незарегистрированный в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 29.07.2007, 23:10
  4. Вопрос по использованию библиотеки UNM
    от SergeyNG в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 21.03.2007, 10:49

Ваши права

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