
Сообщение от
julkhud
Евгений, спасибо за совет! Попытались найти информацию по настройке прибора в документации, но не нашли в ней ничего связанного с выбором протокола(
Пока ждем ответа от техподдержки по этому поводу.
Подскажите, пожалуйста, видели ли вы руководство, где объяснялось, как переключать данные протоколы на ВТ?
В ТВИ-24 нет "6.43", там только "Тензо-М". Из настроек навскидку нужно выставить адрес (16) и скорость (13). Все настройки нужно искать не в руководстве по эксплуатации, а в руководстве по юстировке. В интернете их не найти - с каждой головой эти руководства приходят в комплекте
По поводу опроса: библиотекой не пользовался. Точнее, когда я всё своё писал - библиотеки ещё не было
Безымянный.png
Безымянный2.png
Безымянный3.png
Безымянный4.png
Безымянный5.png
Функции:
Код:
FUNCTION GetVesFromTensoM: REAL //Получение веса из массива байтов, прочитанного с COM-порта
//Входные параметры
VAR_INPUT
MassivIn : POINTER TO BYTE; //Указатель на нулевой элемент массива буфера ответа
MassivInKolVo : UINT; //Количество значимых байтов в буфере ответа
END_VAR
//Внутренние параметры
VAR
//Буфер ответа - 100 байтов
MassivFromTenso: ARRAY[0..99] OF BYTE := [100(16#00)];
//Длина буфера ответа
MassivFromTenso_KolVo: UINT := 0;
//Переменная цикла
i: UINT;
//Контрольная сумма
CRC: BYTE := 16#00;
//ВрЕменные указатели
MassivInTemp1: POINTER TO BYTE; //i-й элемент
MassivInTemp2: POINTER TO BYTE; //(i - 1)-й элемент
END_VAR
Код:
//Выход функции
GetVesFromTensoM := -999999.0;
//Проверим, что хоть что-то есть
IF (MassivInKolVo >= 10) THEN
//Копируем весь массив к себе
FOR i := 0 TO (MassivInKolVo - 1) DO
//При копировании сразу выкидываем все 0xFE
//Чтобы выкинуть 0xFE - предыдущий байт должен обязательно равен 0xFF
IF (i = 0) THEN
//Указатель
MassivInTemp1 := MassivIn + i; //i-й элемент //В данном случае - нулевой
//Присваиваем
MassivFromTenso[MassivFromTenso_KolVo] := MassivInTemp1^;
MassivFromTenso_KolVo := MassivFromTenso_KolVo + 1;
ELSE
//Указатели
MassivInTemp1 := MassivIn + i; //i-й элемент
MassivInTemp2 := MassivIn + i - 1; //(i - 1)-й элемент
//Проверяем, что текущий байт 16#FE, а предыдущий 16#FF. Если это всё не так - то копируем текущий байт
IF NOT (MassivInTemp1^ = 16#FE AND MassivInTemp2^ = 16#FF) THEN
MassivFromTenso[MassivFromTenso_KolVo] := MassivInTemp1^;
MassivFromTenso_KolVo := MassivFromTenso_KolVo + 1;
END_IF
END_IF
END_FOR
//Идём по массиву, прочитанному с Com-Порта, назад
FOR i := (MassivFromTenso_KolVo - 1) TO 9 BY (-1) DO
//Проверка, что пакет имеет структуру "FF XX C3/C2 XX XX XX XX XX FF FF" 'C3 - Брутто, C2 - Нетто
IF MassivFromTenso[i - 9] = 16#FF AND (MassivFromTenso[i - 7] = 16#C3 OR MassivFromTenso[i - 7] = 16#C2) AND MassivFromTenso[i - 1] = 16#FF AND MassivFromTenso[i] = 16#FF THEN
//Контрольная сумма и её проверка
CRC := GetCRC(7, MassivFromTenso[i - 8], MassivFromTenso[i - 7], MassivFromTenso[i - 6], MassivFromTenso[i - 5], MassivFromTenso[i - 4], MassivFromTenso[i - 3], MassivFromTenso[i - 2], 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00);
//Если всё ОК, то вычисляем итоговый вес и выходим из цикла
IF CRC = 16#00 THEN
//Значение
GetVesFromTensoM := 1.0 * STRING_TO_REAL(OSCAT_BASIC.BYTE_TO_STRH(MassivFromTenso[i - 6])) + 100.0 * STRING_TO_REAL(OSCAT_BASIC.BYTE_TO_STRH(MassivFromTenso[i - 5])) + 10000.0 * STRING_TO_REAL(OSCAT_BASIC.BYTE_TO_STRH(MassivFromTenso[i - 4]));
//Позиция запятой в байте CON: 0й бит
IF MassivFromTenso[i - 3].00 THEN
GetVesFromTensoM := GetVesFromTensoM / 10.0;
END_IF
//Позиция запятой в байте CON: 1й бит
IF MassivFromTenso[i - 3].01 THEN
GetVesFromTensoM := GetVesFromTensoM / 100.0;
END_IF
//Позиция запятой в байте CON: 2й бит
IF MassivFromTenso[i - 3].02 THEN
GetVesFromTensoM := GetVesFromTensoM / 1000.0;
END_IF
//Знак минус в байте CON: 7й бит
IF MassivFromTenso[i - 3].07 THEN
GetVesFromTensoM := GetVesFromTensoM * (-1.0);
END_IF
//Выход из цикла
EXIT;
END_IF
END_IF
END_FOR
END_IF
Код:
FUNCTION GetCRC: BYTE //Расчёт контрольной суммы Тензо-М
VAR_INPUT
KolVo : BYTE; //Количество байтов для проверки
Byte00 : BYTE; //Байт №00
Byte01 : BYTE; //Байт №01
Byte02 : BYTE; //Байт №02
Byte03 : BYTE; //Байт №03
Byte04 : BYTE; //Байт №04
Byte05 : BYTE; //Байт №05
Byte06 : BYTE; //Байт №06
Byte07 : BYTE; //Байт №07
Byte08 : BYTE; //Байт №08
Byte09 : BYTE; //Байт №09
Byte10 : BYTE; //Байт №10
Byte11 : BYTE; //Байт №11
Byte12 : BYTE; //Байт №12
Byte13 : BYTE; //Байт №13
Byte14 : BYTE; //Байт №14
Byte15 : BYTE; //Байт №15
Byte16 : BYTE; //Байт №16
Byte17 : BYTE; //Байт №17
Byte18 : BYTE; //Байт №18
Byte19 : BYTE; //Байт №19
END_VAR
//Внутренние параметры
VAR
//Входной массив
MassivIn: ARRAY[0..19] OF BYTE := [20(16#00)];
//Переменные цикла
i, j: INT;
//i-й байт
Data: BYTE := 16#00;
//Выход функции
GetCRC_Result: BYTE := 16#00;
END_VAR
//Константы
VAR CONSTANT
//Примитивный неприводимый порождающий полином в 8-й степени P(X)-101101001b (младшая часть 69h)
Polynom: BYTE := 16#69; //105
END_VAR
Код:
//Входной массив
MassivIn[00] := Byte00;
MassivIn[01] := Byte01;
MassivIn[02] := Byte02;
MassivIn[03] := Byte03;
MassivIn[04] := Byte04;
MassivIn[05] := Byte05;
MassivIn[06] := Byte06;
MassivIn[07] := Byte07;
MassivIn[08] := Byte08;
MassivIn[09] := Byte09;
MassivIn[10] := Byte10;
MassivIn[11] := Byte11;
MassivIn[12] := Byte12;
MassivIn[13] := Byte13;
MassivIn[14] := Byte14;
MassivIn[15] := Byte15;
MassivIn[16] := Byte16;
MassivIn[17] := Byte17;
MassivIn[18] := Byte18;
MassivIn[19] := Byte19;
//Обход входного массива
FOR i := 0 TO (KolVo - 1) DO
//Берём i-й байт
Data := MassivIn[i];
//8 раз сдвигаем наш байт и XOR-им его. Спасибо https://www.linux.org.ru/forum/development/16306501
FOR j := 0 TO 7 DO
//Проверяем самый левый бит
IF GetCRC_Result.07 THEN
//Сдвигаем один бит влево
GetCRC_Result := GetCRC_Result * 2; //GetCRC_Result = (GetCRC_Result << 1)
//Проверяем самый левый бит. Если он есть - делаем "+1" к CRC
IF Data.07 THEN
GetCRC_Result := GetCRC_Result + 1;
END_IF
//XOR-им
GetCRC_Result := GetCRC_Result XOR Polynom;
ELSE
//Сдвигаем один бит влево
GetCRC_Result := GetCRC_Result * 2; //GetCRC_Result = (GetCRC_Result << 1)
//Проверяем самый левый бит. Если он есть - делаем "+1" к CRC
IF Data.07 THEN
GetCRC_Result := GetCRC_Result + 1;
END_IF
END_IF
//Сдвигаем один бит влево
Data := Data * 2; //Data = (Data << 1)
END_FOR
END_FOR
//Выход функции
GetCRC := GetCRC_Result;