Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 45

Тема: потеря байтов в ответной посылке с периодом 4-5 с.

  1. #11
    Пользователь
    Регистрация
    28.04.2008
    Адрес
    Обнинск
    Сообщений
    12

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Трудно что-либо сказать, не видя кода "драйвера".
    Ну, что знал, то сказал. Кода драйвера сам не имею.
    Отправил письмо клиенту со ссылкой на Ваш форум. Надеюсь, он появится в форуме.

  2. #12

    По умолчанию

    Да, действительно мы обнаружили в ПЛК100 и ПЛК150 проблему с портом RS485. Проблема состоит в том, что при посылке запроса на Slave-устройство из-за паразитных связей его часть может попасть в приемный буфер порта (причем ситуация нестабильна и проявляется не при каждой посылке). Из-за этого могут портиться или теряться первые 1-2 байта ответа Slave-устройства или наоборот к ответу добавляться в начале несколько бит или один байт.
    Проблему можно решить аппаратной доработкой контроллера (необходимо допаять один резистор). Это можно сделать самостоятельно (материалы по доработке готовяться и будут скоро выложены на форуме) или обратившись в наш сервис-центр. Также мы в данный момент работаем над программным исправлением проблемы. Но здесь однозначного решения пока не найдено. О результатах также будет размещена информация на нашем сайте.
    Приносим свои извинения.

  3. #13
    Пользователь
    Регистрация
    28.04.2008
    Адрес
    Обнинск
    Сообщений
    12

    Thumbs up

    Цитата Сообщение от Разаренов Федор Посмотреть сообщение
    Да, действительно мы обнаружили в ПЛК100 и ПЛК150 проблему с портом RS485. Проблема состоит в том, что при посылке запроса на Slave-устройство из-за паразитных связей его часть может попасть в приемный буфер порта (причем ситуация нестабильна и проявляется не при каждой посылке). Из-за этого могут портиться или теряться первые 1-2 байта ответа Slave-устройства или наоборот к ответу добавляться в начале несколько бит или один байт.
    Проблему можно решить аппаратной доработкой контроллера (необходимо допаять один резистор). Это можно сделать самостоятельно (материалы по доработке готовяться и будут скоро выложены на форуме) или обратившись в наш сервис-центр. Также мы в данный момент работаем над программным исправлением проблемы. Но здесь однозначного решения пока не найдено. О результатах также будет размещена информация на нашем сайте.
    Приносим свои извинения.
    Спасибо, за столь скорый и качественный ответ!
    Моё уважение к качеству Вашей поддержки продуктов!

  4. #14

    По умолчанию

    У клиента байты теряются. А тут "находятся". Дело явно не в этом. Ждем код.

  5. #15

    По умолчанию

    Добрый день Владислав.

    Беспокоит Вас Александр из Краснодара по совету
    Андрея из МЕТРА г. Обниск.
    В написанном мною драйвере для ПЛК-100 на языке CodeSys, который общается тензопреобразователем М0803 по RS485 пропадают первые
    байты. Прчем количество пропущенных байт нестабильно от 2-х до 5-ти.
    Пример драйвера приведен ниже.
    Подскажите пожалуйста в чем тут может быть причина.
    С уважением Александр.

    PROGRAM PLC_PRG
    VAR
    (*УСТАВКИ ВО FLASH ПАМЯТИ*)
    RETAIN

    TAB_KS: ARRAY [0..255] OF BYTE := 16#00, 16#5E, 16#BC, 16#E2, 16#61, 16#3F, 16#DD, 16#83, 16#C2, 16#9C, 16#7E, 16#20, 16#A3, 16#FD, 16#1F, 16#41,
    16#9D, 16#C3, 16#21, 16#7F, 16#FC, 16#A2, 16#40, 16#1E, 16#5F, 16#01, 16#E3, 16#BD,16#3E, 16#60, 16#82, 16#DC,
    16#23, 16#7D, 16#9F, 16#C1, 16#42, 16#1C, 16#FE, 16#A0, 16#E1, 16#BF, 16#5D, 16#03, 16#80, 16#DE, 16#3C, 16#62,
    16#BE, 16#E0, 16#02, 16#5C, 16#DF, 16#81, 16#63, 16#3D, 16#7C, 16#22, 16#C0, 16#9E, 16#1D, 16#43, 16#A1, 16#FF,
    16#46, 16#18, 16#FA, 16#A4, 16#27, 16#79, 16#9B, 16#C5, 16#84, 16#DA, 16#38, 16#66, 16#E5, 16#BB, 16#59, 16#07,
    16#DB, 16#85, 16#67, 16#39, 16#BA, 16#E4, 16#06, 16#58, 16#19, 16#47, 16#A5, 16#FB, 16#78, 16#26, 16#C4, 16#9A,
    16#65, 16#3B, 16#D9, 16#87, 16#04, 16#5A, 16#B8, 16#E6, 16#A7, 16#F9, 16#1B, 16#45, 16#C6, 16#98, 16#7A, 16#24,
    16#F8, 16#A6, 16#44, 16#1A, 16#99, 16#C7, 16#25, 16#7B, 16#3A, 16#64, 16#86, 16#D8, 16#5B, 16#05, 16#E7, 16#B9,
    16#8C, 16#D2, 16#30, 16#6E, 16#ED, 16#B3, 16#51, 16#0F, 16#4E, 16#10, 16#F2, 16#AC, 16#2F, 16#71, 16#93, 16#CD,
    16#11, 16#4F, 16#AD, 16#F3, 16#70, 16#2E, 16#CC, 16#92, 16#D3, 16#8D, 16#6F, 16#31, 16#B2, 16#EC, 16#0E, 16#50,
    16#AF, 16#F1, 16#13, 16#4D, 16#CE, 16#90, 16#72, 16#2C, 16#6D, 16#33, 16#D1, 16#8F, 16#0C, 16#52, 16#B0, 16#EE,
    16#32, 16#6C, 16#8E, 16#D0, 16#53, 16#0D, 16#EF, 16#B1, 16#F0, 16#AE, 16#4C, 16#12, 16#91, 16#CF, 16#2D, 16#73,
    16#CA, 16#94, 16#76, 16#28, 16#AB, 16#F5, 16#17, 16#49, 16#08, 16#56, 16#B4, 16#EA, 16#69, 16#37, 16#D5, 16#8B,
    16#57, 16#09, 16#EB, 16#B5, 16#36, 16#68, 16#8A, 16#D4, 16#95, 16#CB, 16#29, 16#77, 16#F4, 16#AA, 16#48, 16#16,
    16#E9, 16#B7, 16#55, 16#0B, 16#88, 16#D6, 16#34, 16#6A, 16#2B, 16#75, 16#97, 16#C9, 16#4A, 16#14, 16#F6, 16#A8,
    16#74, 16#2A, 16#C8, 16#96, 16#15, 16#4B, 16#A9, 16#F7, 16#B6, 16#E8, 16#0A, 16#54, 16#D7, 16#89, 16#6B, 16#35 ;
    END_VAR

    VAR
    tOn1:TON;
    start_tmr:BOOL:=FALSE;
    tr1:R_TRIG;
    scet3: TIME;

    rcvbuf: ARRAY [0..128] OF BYTE; (* ПРИЕМНЫЙ БУФЕР *)
    KS: BYTE;
    SEND: ARRAY [0..128] OF BYTE;
    INDEX: BYTE; (* ПЕРЕМЕННАЯ ДЛЯ ВЫЧИСЛЕНИЯ КОНТРОЛЬНОЙ СУММЫ *)
    I: INT;
    J: INT;
    K: INT;
    L: INT;
    M: INT;
    N: INT;
    O: INT;
    KOMAND: STRING:='TT';
    NOMER_PRIB: BYTE; (* НОМЕР ПРИБОРА М0801-1 В СЕТИ *)

    END_VAR


    ton1(In:=start_tmr,pt:=t#450ms); (*ЗАПУСКАЕМ ИЗМЕРИТЕЛЬНЫЙ ТАЙМЕР *)
    start_tmr:=TRUE;
    tr1(clk:=ton1.Q);
    SCET3:=ton1.ET;

    IF tr1.Q THEN

    NOMER_PRIB:=16#1B; (* ЗАДАЕМ НОМЕР ПРИБОРА М0801-4 - 0F *)
    SEND[0]:=16#FF;
    SEND[1]:=16#20+NOMER_PRIB;
    SEND[2]:=16#20;
    SEND[3]:=16#48; (*команда ВЫДАТЬ ВЕС *)
    SEND[4]:=16#13; (*ПОДкоманда *)

    (*РАСЧИТЫВАЕМ КОНТРОЛЬНУЮ СУММУ *)
    KS:=0;
    FOR I:=0 TO 4 BY 1 DO
    INDEX:=TAB_KS[KS XOR SEND[I]];
    KS:=INDEX;
    END_FOR
    SEND[5]:=KS;
    SEND[6]:=16#03;

    (*ОБНУЛЯЕМ БУФЕР ПРИЕМА ЧТОБЫ ЗНАТЬ ЧТО НЕ БЫЛО ДАННЫХ *)
    FOR I:=0 TO 32 BY 1 DO
    RCVBUF[I]:=0;
    END_FOR

    (* СОЕДИНЯЕМСЯ С ТЕНЗОПРЕОБРАЗОВАТЕЛЕМ М0801 ПО ПРОТОКОЛУ METRABUS* ВСЕ ИДЕТ НОРМАЛЬНО*)
    SysComWrite(0,ADR(SEND),7,0);

    sz:=SysComRead(0,ADR(rcvBUF),18,0); (* ЗДЕСЬ ТЕРЯЮТСЯ ПРИНЯТЫЕ БАЙТЫ ОТ 2-Х ДО 5-ТИ *)

    start_tmr:=FALSE;
    END_IF

  6. #16

    По умолчанию

    Итак.
    1.Идёт команда на запись и сразу команда на чтение. Странно, что он вообще что - то принимает - скорее это след. от предидущей посылки.
    Все функции порта неблокирующие.
    Раньше чем (время на посылку+время подготовки ответа прибором+время посылки ответа) ответа в приёмном буфере не будет.
    2. Перед отправкой считывайте весь несчитанный мусор из приёмного буфера порта командой Read до результата==0.
    3. Вы пытаетесь прочитать сразу 18 байт. Оптимизм - штука хорошая, но не в программировании. Читайте по 1. Анализируйте на начало пачки, складывайте сколько нужно байт в ответе, считайте CRC и только при выполнении всех условий - пачка ликвидна и идёт в анализ.

    Кстати, использование п.3. с РЕЛИГИОЗНЫМ смирением и ФАНАТИЧНОЙ точностью гарантирует отсутствие проблем, описанных в п.1. и п.2.
    Другого пути для RS-а лучшие умы планеты не придумали.

    P.S. А зачем таблицу для CRC в retain засунули. Сделайте её CONST и всё.
    Последний раз редактировалось Филоненко Владислав; 26.02.2009 в 16:21.

  7. #17
    Пользователь
    Регистрация
    28.04.2008
    Адрес
    Обнинск
    Сообщений
    12

    По умолчанию

    Дополню описанием протокола обмена Metrabus прибора М0803.
    Протокольный уровень одинаков для М0801.
    Александр использует приборы М0801 и подключает сейчас М0803 к ПЛК-100.
    Вложения Вложения

  8. #18

    По умолчанию

    Вот наворотили. Дали студенту задание, наверное. Съэкономили. А людям мучайся.
    А важных вещей нет. CRC для 256 байт слабая, числа байт в посылке нет (доп. проверка).

    А к моему посту тут добавить нечего. Описанные выше проблемы к протоколу никакого отношения не имеют.

  9. #19

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Трудно что-либо сказать, не видя кода "драйвера".
    Кодд драйвера приведен ниже.
    Поскажите в чем тут может быть ошибка.

    PROGRAM PLC_PRG
    VAR
    (*УСТАВКИ ВО FLASH ПАМЯТИ*)
    RETAIN

    TAB_KS: ARRAY [0..255] OF BYTE := 16#00, 16#5E, 16#BC, 16#E2, 16#61, 16#3F, 16#DD, 16#83, 16#C2, 16#9C, 16#7E, 16#20, 16#A3, 16#FD, 16#1F, 16#41,
    16#9D, 16#C3, 16#21, 16#7F, 16#FC, 16#A2, 16#40, 16#1E, 16#5F, 16#01, 16#E3, 16#BD,16#3E, 16#60, 16#82, 16#DC,
    16#23, 16#7D, 16#9F, 16#C1, 16#42, 16#1C, 16#FE, 16#A0, 16#E1, 16#BF, 16#5D, 16#03, 16#80, 16#DE, 16#3C, 16#62,
    16#BE, 16#E0, 16#02, 16#5C, 16#DF, 16#81, 16#63, 16#3D, 16#7C, 16#22, 16#C0, 16#9E, 16#1D, 16#43, 16#A1, 16#FF,
    16#46, 16#18, 16#FA, 16#A4, 16#27, 16#79, 16#9B, 16#C5, 16#84, 16#DA, 16#38, 16#66, 16#E5, 16#BB, 16#59, 16#07,
    16#DB, 16#85, 16#67, 16#39, 16#BA, 16#E4, 16#06, 16#58, 16#19, 16#47, 16#A5, 16#FB, 16#78, 16#26, 16#C4, 16#9A,
    16#65, 16#3B, 16#D9, 16#87, 16#04, 16#5A, 16#B8, 16#E6, 16#A7, 16#F9, 16#1B, 16#45, 16#C6, 16#98, 16#7A, 16#24,
    16#F8, 16#A6, 16#44, 16#1A, 16#99, 16#C7, 16#25, 16#7B, 16#3A, 16#64, 16#86, 16#D8, 16#5B, 16#05, 16#E7, 16#B9,
    16#8C, 16#D2, 16#30, 16#6E, 16#ED, 16#B3, 16#51, 16#0F, 16#4E, 16#10, 16#F2, 16#AC, 16#2F, 16#71, 16#93, 16#CD,
    16#11, 16#4F, 16#AD, 16#F3, 16#70, 16#2E, 16#CC, 16#92, 16#D3, 16#8D, 16#6F, 16#31, 16#B2, 16#EC, 16#0E, 16#50,
    16#AF, 16#F1, 16#13, 16#4D, 16#CE, 16#90, 16#72, 16#2C, 16#6D, 16#33, 16#D1, 16#8F, 16#0C, 16#52, 16#B0, 16#EE,
    16#32, 16#6C, 16#8E, 16#D0, 16#53, 16#0D, 16#EF, 16#B1, 16#F0, 16#AE, 16#4C, 16#12, 16#91, 16#CF, 16#2D, 16#73,
    16#CA, 16#94, 16#76, 16#28, 16#AB, 16#F5, 16#17, 16#49, 16#08, 16#56, 16#B4, 16#EA, 16#69, 16#37, 16#D5, 16#8B,
    16#57, 16#09, 16#EB, 16#B5, 16#36, 16#68, 16#8A, 16#D4, 16#95, 16#CB, 16#29, 16#77, 16#F4, 16#AA, 16#48, 16#16,
    16#E9, 16#B7, 16#55, 16#0B, 16#88, 16#D6, 16#34, 16#6A, 16#2B, 16#75, 16#97, 16#C9, 16#4A, 16#14, 16#F6, 16#A8,
    16#74, 16#2A, 16#C8, 16#96, 16#15, 16#4B, 16#A9, 16#F7, 16#B6, 16#E8, 16#0A, 16#54, 16#D7, 16#89, 16#6B, 16#35 ;
    END_VAR

    VAR
    tOn1:TON;
    start_tmr:BOOL:=FALSE;
    tr1:R_TRIG;
    scet3: TIME;

    rcvbuf: ARRAY [0..128] OF BYTE; (* ПРИЕМНЫЙ БУФЕР *)
    KS: BYTE;
    SEND: ARRAY [0..128] OF BYTE;
    INDEX: BYTE; (* ПЕРЕМЕННАЯ ДЛЯ ВЫЧИСЛЕНИЯ КОНТРОЛЬНОЙ СУММЫ *)
    I: INT;
    J: INT;
    K: INT;
    L: INT;
    M: INT;
    N: INT;
    O: INT;
    KOMAND: STRING:='TT';
    NOMER_PRIB: BYTE; (* НОМЕР ПРИБОРА М0801-1 В СЕТИ *)

    END_VAR


    ton1(In:=start_tmr,pt:=t#450ms); (*ЗАПУСКАЕМ ИЗМЕРИТЕЛЬНЫЙ ТАЙМЕР *)
    start_tmr:=TRUE;
    tr1(clk:=ton1.Q);
    SCET3:=ton1.ET;

    IF tr1.Q THEN

    NOMER_PRIB:=16#1B; (* ЗАДАЕМ НОМЕР ПРИБОРА М0801-4 - 0F *)
    SEND[0]:=16#FF;
    SEND[1]:=16#20+NOMER_PRIB;
    SEND[2]:=16#20;
    SEND[3]:=16#48; (*команда ВЫДАТЬ ВЕС *)
    SEND[4]:=16#13; (*ПОДкоманда *)

    (*РАСЧИТЫВАЕМ КОНТРОЛЬНУЮ СУММУ *)
    KS:=0;
    FOR I:=0 TO 4 BY 1 DO
    INDEX:=TAB_KS[KS XOR SEND[I]];
    KS:=INDEX;
    END_FOR
    SEND[5]:=KS;
    SEND[6]:=16#03;

    (*ОБНУЛЯЕМ БУФЕР ПРИЕМА ЧТОБЫ ЗНАТЬ ЧТО НЕ БЫЛО ДАННЫХ *)
    FOR I:=0 TO 32 BY 1 DO
    RCVBUF[I]:=0;
    END_FOR

    (* СОЕДИНЯЕМСЯ С ТЕНЗОПРЕОБРАЗОВАТЕЛЕМ М0801 ПО ПРОТОКОЛУ METRABUS* ВСЕ ИДЕТ НОРМАЛЬНО*)
    SysComWrite(0,ADR(SEND),7,0);

    sz:=SysComRead(0,ADR(rcvBUF),18,0); (* ЗДЕСЬ ТЕРЯЮТСЯ ПРИНЯТЫЕ БАЙТЫ ОТ 2-Х ДО 5-ТИ *)

    start_tmr:=FALSE;
    END_IF

  10. #20

    По умолчанию

    Уважаемый pms160!
    Вы посты не читаете? См. 4-ия постами выше.

Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя

Ваши права

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