Страница 13 из 19 ПерваяПервая ... 31112131415 ... ПоследняяПоследняя
Показано с 121 по 130 из 203

Тема: ПЛК63 + SysLibCom, потеря байтов

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Ладно всем спасибо за участие, извините за потраченное на меня время

  2. #2

    По умолчанию

    Всегда ответ надо читать по 1 байту и сразу анализировать. Ожидать что пришли все байты и только нужное количество байт нельзя. По 1 байту считываем, каждый анализируем на корректность и принимаем решение о конце пачки/бракованной пачке.

    Пример с таким чтением в 2 приёма я проверю, но не скоро.
    Тролль-наседка, добрый, нежный и ласковый

  3. #3

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Всегда ответ надо читать по 1 байту и сразу анализировать. Ожидать что пришли все байты и только нужное количество байт нельзя. По 1 байту считываем, каждый анализируем на корректность и принимаем решение о конце пачки/бракованной пачке.

    Пример с таким чтением в 2 приёма я проверю, но не скоро.
    Если библиотека позволяет вести пакетный обмен, то и надо этим пользоваться. Вероятно, проблемы при обмене по RS-485 при использовании SysLibCom связаны с не совсем корректным управлением шиной сети. Порядок обмена по RS-485 должен быть такой:
    1) Master сети захватывает шину (сразу после подачи питание на устройство, выполняющего роль Maser);
    2) Master делает небольшую паузу и загружает выходной буфер пакетом байт, данные посылаются в сеть;
    3) Master после загрузки буфера держит шину пока весь пакет данных не будет выпихнут в сеть и не дойдет до Slave;
    4) Slave после приема пакета должен сразу захватить шину и только после этого Master отпускает шину и становится на прием.
    Передача от Slave к Master должна происходить аналогично. После приема пакета от Slave Master захватывает шину делает паузу и далее процедура повторяется.
    Очень важным моментом при обмене по RS-485 является то, что шина в каждый момент времени должна быть захвачена хотя бы с одной стороны, ну и процедура перехвата шины должна быть скоординирована. Если не учесть эти моменты (касается того, кто писал программу прошивки для ПЛК63), то может происходить то с чем столкнулся многострадальный monteg.
    Последний раз редактировалось IVM; 22.03.2012 в 11:08.

  4. #4

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Если библиотека позволяет читать пакет байт, то и надо читать пакет. Вероятно, проблемы при обмене по RS-485 при использовании SysLibCom связаны с не совсем корректным управлением шиной сети. Порядок обмена по RS-485 должен быть такой:
    1) Master сети захватывает шину (сразу после подачи питание на устройство, выполняющего роль Maser);
    2) Master делает небольшую паузу и загружает выходной буфер пакетом байт, данные посылаются в сеть;
    3) Master после загрузки буфера держит шину пока весь пакет данных не будет выпихнут в сеть и не дойдет до Slave;
    4) Slave после приема пакета должен сразу захватить шину и только после этого Master отпускает шину и становится на прием.
    Передача от Slave к Master должна происходить аналогично. После приема пакета от Slave Master захватывает шину делает паузу и далее процедура повторяется.
    Очень важным моментом при обмене по RS-485 является то, что шина в каждый момент времени должна быть захвачена хотя бы с одной стороны, ну и процедура перехвата шины должна быть скоординирована. Если не учесть эти моменты (касается того, кто писал SysLibCom), то может происходить то с чем столкнулся многострадальный monteg.
    Интересная теория. Ну так в ком проблема ПЛК63?

  5. #5

    По умолчанию

    Цитата Сообщение от monteg Посмотреть сообщение
    Интересная теория. Ну так в ком проблема ПЛК63?
    Эта теория многократно и успешно проверена на практике. В свое время я очень плотно занимался этими делами. В обмене по RS-485 в прстейшем случае учавствуют два устройства - Master и Slave. Проблемы могут возникнуть если некорректно работают с сетью или тот или другой или оба вместе.
    Если "железо" у ПЛК100 и ПЛК63 сделано совершенно одинаково, то, возможно, у Вас неисправен ПЛК63.
    А о каком коде речь, тот что написали Вы или тот, что зашит в ПЛК63 ?
    Последний раз редактировалось IVM; 22.03.2012 в 11:27.

  6. #6

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Всегда ответ надо читать по 1 байту и сразу анализировать. Ожидать что пришли все байты и только нужное количество байт нельзя. По 1 байту считываем, каждый анализируем на корректность и принимаем решение о конце пачки/бракованной пачке.

    Пример с таким чтением в 2 приёма я проверю, но не скоро.
    Так точно. Но почему тогда именно чтение по 1 байт на ПЛК63 глючит.
    Чтение по 1 байту можно же считать частным случаем чтением двумя блоками.
    Заменя
    Код:
    byte_read:=SysComRead(port_number, ADR(buf_otvet), 8, 0);
    на
    Код:
    byte_read:=SysComRead(port_number, ADR(buf_otvet[ 0 ]), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 1 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 2 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 3 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 4 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 5 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 6 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 7 ] ), 1, 0);
    приводит к ошибкам, про которые я говорил

  7. #7

    По умолчанию

    Цитата Сообщение от monteg Посмотреть сообщение
    Так точно. Но почему тогда именно чтение по 1 байт на ПЛК63 глючит.
    Чтение по 1 байту можно же считать частным случаем чтением двумя блоками.
    Заменя
    Код:
    byte_read:=SysComRead(port_number, ADR(buf_otvet), 8, 0);
    на
    Код:
    byte_read:=SysComRead(port_number, ADR(buf_otvet[ 0 ]), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 1 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 2 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 3 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 4 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 5 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 6 ] ), 1, 0);
    byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 7 ] ), 1, 0);
    приводит к ошибкам, про которые я говорил
    Если чтение пакета байт на ПЛК63 идет нормально, то и пользуйтесь этим, что Вы уперлись в чтение по одному байту. Чтение пакетом и быстрее и надежнее (сбоев при обмене будет меньше).

  8. #8

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Если чтение пакета байт на ПЛК63 идет нормально, то и пользуйтесь этим, что Вы уперлись в чтение по одному байту. Чтение пакетом и быстрее и надежнее (сбоев при обмене будет меньше).
    а здесь другое говорят

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Всегда ответ надо читать по 1 байту и сразу анализировать. Ожидать что пришли все байты и только нужное количество байт нельзя. По 1 байту считываем, каждый анализируем на корректность и принимаем решение о конце пачки/бракованной пачке.

    Пример с таким чтением в 2 приёма я проверю, но не скоро.

  9. #9

    По умолчанию

    Цитата Сообщение от monteg Посмотреть сообщение
    а здесь другое говорят
    Глупость это. Еще раз повторяю: обмениваться пакетами байт и быстрее и надежнее. Это благо, что в SysLibCom такая возможность есть.
    Последний раз редактировалось IVM; 22.03.2012 в 11:53.

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,575

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Всегда ответ надо читать по 1 байту и сразу анализировать. Ожидать что пришли все байты и только нужное количество байт нельзя.
    А реализация какова? Читать по байту за цикл, это не серьёзно. Перебором через WHILE, можно нарваться на "злую собаку". Пошагово, как предлагает создатель темы, зачем писать "портянку" когда есть WHILE.

Страница 13 из 19 ПерваяПервая ... 31112131415 ... ПоследняяПоследняя

Похожие темы

  1. плк63-пм01 потеря байт
    от Elka в разделе ПЛК63/73
    Ответов: 35
    Последнее сообщение: 06.11.2012, 14:26
  2. потеря байтов в ответной посылке с периодом 4-5 с.
    от Смирнов Роман в разделе ПЛК1хх
    Ответов: 44
    Последнее сообщение: 23.04.2009, 07:16
  3. SysLibCom
    от demon в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 20.03.2009, 13:08
  4. ПЛК 150 и SysLibCom.lib.
    от Анатолий в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 13.12.2008, 13:48
  5. SysLibCom 16#FF
    от powerind в разделе ПЛК1хх
    Ответов: 28
    Последнее сообщение: 28.10.2008, 13:41

Ваши права

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