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

Тема: Вопрос по UNM.lib

  1. #1

    По умолчанию Вопрос по UNM.lib

    Здравствуйте.
    Есть такая проблема, при использовании UNM.lib происходит как будто периодическое смещение байтов при опросе или при записи байтов в переменную. По RS232 приходит сообщение состоящее из 14 байт, все читается, информация приходит правильная, но периодически происходит смещение. Должно приходить сообщение 77 6E 30 30 30 30 30 30 30 30 6B 67 0D 0A, но иногда байты записываются 6E 30 30 30 30 30 30 30 30 6B 67 0D 0A 77. Первые 2 байта всегда должны быть 77 6E, а последние два 0D 0A.
    Может быть я не правильно обнуляю счетчик байтов? Пробовал обнулять его при помощи самых разных условий, пробовал менять строчки местами, изменял время цикла.

    Чтение идет с весового терминала.

    В конфигурации добавлен Universal Network Module. 8n1 9600.

    Код программы:

    qef:=LockDevice(0);


    otvet_RB:=GetByte(0);

    IF otvet_RB>0 THEN

    IF p^=16#0A THEN count:=0;
    END_IF;

    IF count=1 THEN str0:=BYTE_TO_STRING(otvet[0]);
    END_IF;
    IF count=2 THEN str1:=BYTE_TO_STRING(otvet[1]);
    END_IF;
    IF count=3 THEN str2:=BYTE_TO_STRING(otvet[2]);
    END_IF;
    IF count=4 THEN str3:=BYTE_TO_STRING(otvet[3]);
    END_IF;
    IF count=5 THEN str0:=BYTE_TO_STRING(otvet[4]);
    END_IF;
    IF count=6 THEN str1:=BYTE_TO_STRING(otvet[5]);
    END_IF;
    IF count=7 THEN str2:=BYTE_TO_STRING(otvet[6]);
    END_IF;
    IF count=8 THEN str3:=BYTE_TO_STRING(otvet[7]);
    END_IF;
    IF count=9 THEN str0:=BYTE_TO_STRING(otvet[8]);
    END_IF;
    IF count=10 THEN str1:=BYTE_TO_STRING(otvet[9]);
    END_IF;
    IF count=11 THEN str2:=BYTE_TO_STRING(otvet[10]);
    END_IF;
    IF count=12 THEN str3:=BYTE_TO_STRING(otvet[11]);
    END_IF;
    IF count=13 THEN str2:=BYTE_TO_STRING(otvet[12]);
    END_IF;
    IF count=14 THEN str3:=BYTE_TO_STRING(otvet[13]);
    END_IF;
    p:=ADR(otvet)+count;
    p^:=otvet_RB^.data;
    count:=count+1;

    END_IF

  2. #2
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    883

    По умолчанию

    Для начала - зачем вызывать эту строку в каждом цикле?
    qef:=LockDevice(0);


    А дальше - для чего при каждом принятом байте проверять результат?
    Примите все по таймауту и разберите ответ.
    Ну либо проверяйте на последний байт после принятия самого байта, а не до.
    Например так:
    p:=ADR(otvet)+count;
    p^:=otvet_RB^.data;
    if otvet[count] = 16#0A then
    count:=0
    else
    count:=count+1;
    END_IF;
    А по событию count=0 - смотрите данные.

  3. #3

    По умолчанию

    Спасибо большое, все заработало

Метки этой темы

Ваши права

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