Так вы не написали, если подключиться к линии при помощи ПК, то какие наборы байт вы видите в посылках ?
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
И опять спрошу, не проще читать буфером в 1 байт ловя 0x0A и потом читать буфер в 14 байт с полноценным ответом и далее его разбирать, проверив и первый и второй и последние байты в уверенности целостности пакета ? Или потом читать уже постоянно по 14 байт, а в случае нарушения пакета переходить к поиску нужного байта ?
почему у вас дважды идут одни и те же байты? в документации вроде такого нет ? первые 0x77 0x6E то есть 119 110 а у вас 4 раза подряд повторы
В конце 53 10 есть а должно быть 13 10 (0x0D 0x0A)
похоже что-то со скоростями не складуха или еще с чем-то. У вас там контроль четности не включен случайно ?
хотя контроль четности должен только старший бит менять, а у вас лажа какая-то
Последний раз редактировалось melky; 28.09.2021 в 09:33.
Написал новый код.
PROGRAM PLC_PRG
VAR
portReady:BOOL;
port:COMSETTINGS:=(Port:=COM1,dwBaudRate:=9600,byS topBits:=0,byParity:=1,dwBufferSize:=28);
buf:ARRAY[0..27]OF BYTE;(*данные из весов через RS232*)
bufCopy:ARRAY[0..27]OF BYTE;
buf1:ARRAY[0..7]OF BYTE;(*массив веса*)
bufzero:ARRAY[0..27]OF BYTE:=28(0);
i:INT:=0;
i1:INT:=0;
i3:INT:=0;
dIWWORD:=0;
END_VAR
WHILE dIW<>5000000 DO
dIW:=dIW+1;
END_WHILE
dIW2:=dIW2+1;
IF portReady=FALSE THEN(* Сразу открываем и настраиваем порт *)
portReady:=TRUE;
SysComOpen(port.Port);
SysComSetSettings(port.Port,ADR(port));
SysComRead(port.Port, ADR(buf),28,0);
ELSE(* Работаем с открытым портом *)
SysComRead(port.Port, ADR(buf),28,0);
END_IF
bufCopy:=buf;
WHILE (i<=27)AND(i3=0)DO
IF bufCopy[i]=119 THEN
i3:=1;
FOR i1:=0 TO 7 DO
buf1[i1]:=bufCopy[i+i1+2];
END_FOR
END_IF
i:=i+1;
END_WHILE
i:=0;
i3:=0;
buf:=bufzero;
dIW:=0;
В нем я изменил скорость обмена на 9600, добавил обнуление буфера перед чтением данных.
Сразу принимаю 28 байт, делаю его копию и ищу код 119, затем сохраняю в массив buf1 чисто данные веса.
Еще добавил выдержку времени ( простой счетчик через WHILE, через таймер TON у меня не получилось).
Данные идут, но логики в них нет.