Я так изначально делал, увидел кашу внутри и понял, что нужно менять порядок байтов. Сейчас собрался использовать массив из объединения.
Наверное, просто нужно написать фб, заменяющий значения в массиве, а его отправлять в массив INT
Вид для печати
Я так изначально делал, увидел кашу внутри и понял, что нужно менять порядок байтов. Сейчас собрался использовать массив из объединения.
Наверное, просто нужно написать фб, заменяющий значения в массиве, а его отправлять в массив INT
получилось как-то так...Код:FUNCTION_BLOCK buff2int
VAR_INPUT
Pt_of_buff: POINTER TO ARRAY [1..255] OF BYTE;//
Pt_of_int: POINTER TO ARRAY [1..125] OF INT;//
END_VAR
VAR_INPUT
x_START: BOOL;// Старт пересборки буфера
END_VAR
VAR
i: byte;// шаг FOR/ номер ячейки буфера байт
m: BYTE;// Номер ячейки выходного массива
dut_var: W2ab;// объединение, массив 2 байта + инт
END_VAR
IF x_START THEN i := 0; END_IF
FOR i := 1 TO 20 DO ///20 условно, нужно смотреть или 3 или 7 ячейку для определения размера пакета
m:=i/2; // номер ячейки конечного массива
IF i.0 THEN //смотрим бит. тру значит число нечетное
// присваиваем значение из нечетной ячейки массива в [0] подъячейку объединения
MEM.MemMove(ADR(Pt_of_buff^[i]), ADR(dut_var.ab_digit[0]), SIZEOF(Pt_of_buff^[i]) );
ELSE
//присваиваем значение из четной ячейки массива в [1] подъячейку объединения
MEM.MemMove(ADR(Pt_of_buff^[i]), ADR(dut_var.ab_digit[1]), SIZEOF(Pt_of_buff^[i]) );
//по идее - ИНТ число уже сформировано, его можно записать в массив инт
MEM.MemMove(ADR(dut_var), ADR(Pt_of_int^[m]), SIZEOF(dut_var) );
END_IF END_FOR