PDA

Просмотр полной версии : Вопрос по UNM.lib



Pieecore
26.09.2018, 11:07
Здравствуйте.
Есть такая проблема, при использовании 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

приборист
26.09.2018, 20:09
Для начала - зачем вызывать эту строку в каждом цикле?

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 - смотрите данные.

Pieecore
27.09.2018, 06:34
Спасибо большое, все заработало