Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: Проблема с библиотекой modbus

  1. #1

    По умолчанию Проблема с библиотекой modbus

    Здравствуйте.
    Использую библиотеку modbus. ПЛК мастер. Версия codesys 2.3.9.26. Возникли следующие вопросы:

    1) Куда в буфер записывается ответ от устройства slave? Такое ощущение что при каждом запуске запись происходит рандомом. На первом скрине видно что запись произошла в buffer[24]..buffer[29], причем в каждом следующем цикле происходит сдвиг.

    2) Видно что ответ принимается, но почему то функция показывает ошибку таймаута (второй скрин). В чем может быть проблема?
    Прилагаю скрин программы.

    Заранее спасибо за помощь.

    Посылка.JPG

    Таймаут.JPG

    Прога.JPG

  2. #2

    По умолчанию

    Таймаут имеет право быть из-за рассинхронизации. То есть когда получаете таймаут в приемном буфере мусор, если cmpl & err=0 - забираете данные. Как-то так. Успехов.

  3. #3

    По умолчанию

    Алексей Дмитриев, В буфере не мусор, а адекватный ответ от slave устройства, но в неадекватном месте буфера А err всегда равно 255, то есть ошибка таймаута. Даже не знаю что делать, хоть брать и писать свои функции modbus

  4. #4

    По умолчанию

    Я пользовал на ПЛК63, работает. err=255 не всегда. Интересно, что когда читаешь из регистров ввода, то данные в буфере верные только когда err=0.
    И с чего Вы взяли, что данные не там, где должны быть это не мусор? Похоже у Вас всегда таймаут, то есть слейв не понимает запрос, подумайте над этим (скорость, четность и т. п.).

    Вот кусок кода чтения входов с МДВВ:

    1:
    (*Чтение маски значений входов МДВВ *)

    RD_REGS(
    Enable:= ENABL, (* разрешение работы блока *)
    Mode:= MB_RTU, (*режим приема*)
    DevAddr:= SLAVE_ADDR, (*адрес*)
    FirstAddr:= 51, (*номер первого регистра*)
    Quantity:= 1, (*количество читаемых регистров*)
    ComHandle:=Settings.Port , (*номер сом-порта*)
    TimeOut:=TimeOut, (*таймаут*)
    Buffer:=RD_Buffer , (* буфер данных *)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err , (* скопировать регистр ошибок *)
    ByteCnt=> DataSize); (*кол-во считанных байтов *)

    IF CMPL AND ERR=0 THEN
    INP_WORD:=BYTE_TO_WORD(RD_BUFFER[1]) OR SHL(BYTE_TO_WORD(RD_BUFFER[0]),8);
    WORK_IDENT:=0;
    END_IF

    Успехов!
    Последний раз редактировалось Алексей Дмитриев; 25.05.2011 в 14:50.

  5. #5

    По умолчанию

    Цитата Сообщение от Алексей Дмитриев Посмотреть сообщение
    И с чего Вы взяли, что данные не там, где должны быть это не мусор? Похоже у Вас всегда таймаут, то есть слейв не понимает запрос, подумайте над этим (скорость, четность и т. п.).
    В том то и дело, я не знаю в каком месте массива buffer должен быть ответ от slave, при каждом запуске ответ появляется в разных местах, а потом при каждом новом цикле инкрементируется, slave запрос понимает и отвечает на него, потому что приходит адекватный ответ, на первом скрине я указал этот ответ slave. И да, действительно, таймаут у меня всегда.

    Для проверки настроек порта (скорость, четность) просто формировал посылку (без использования библиотеки modbus) и принимал ответ от slave, все работает.

    И все таки интересно, ответ надо смотреть в buffer[], правильно? а где его там надо смотреть? buffer[0]..buffer[5] ?

  6. #6

    По умолчанию

    Ответ надо читать, конечно, с нуля буфера!
    Вот же - читаем один регистр и преобразуем в 16-ти разрядный (word) формат!
    IF CMPL AND ERR=0 THEN
    INP_WORD:=BYTE_TO_WORD(RD_BUFFER[1]) OR SHL(BYTE_TO_WORD(RD_BUFFER[0]),8);

  7. #7

    По умолчанию

    Алексей Дмитриев, к сожалению ничего не получается с этой библиотекой Начал писать свою, написал одну функцию, работает
    Спасибо за помощь

  8. #8

    По умолчанию

    Валенок, на третьем скрине ВСЯ программа, там все указано. Могу сказать, что сейчас с теми же настройками порта все работает с моей функцией.

  9. #9

    По умолчанию

    Evgenn, вы небоглибы выложить здесь вашу функцию.

  10. #10

    По умолчанию

    Королёв Максим, пока написана только функция modbus 0x01, всего буду делать еще 3 функции, в понедельник постарюсь выложить

    Еще забыл добавить, ПЛК у меня BECK SC143 - master и панель СП-270 - slave.
    Последний раз редактировалось Evgenn; 27.05.2011 в 16:48.

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

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