Цитата Сообщение от What_is_up Посмотреть сообщение
Здравствуйте! Я пытался найти этот файл, но к сожалению с этим есть трудности. Жду ответа от своего друга из Германии, где в течении месяца попытается связаться с местными представителями и заполучить необходимую информацию. Я попробовал через GPT получить приемлемый код на языке ST чтоб опробовать, но у меня есть большие сомнения, так как он вероятно неправильно написал код. Если вас это не затруднит, не могли бы вы проверить и указать на ошибки, чтоб я смог исправить?
Для аккуратности, в расширенном режиме редактирования сообщения оборачивайте код в теги [CODE].
И можете ещё спойлером закрыть длинную простыню.
спойлер с кодом:

Код:
// ===== FB_WeightParser_ATL =====
FUNCTION_BLOCK FB_WeightParser_ATL

TYPE E_PARSE_STATE :
(
    WAIT_N,
    WAIT_SIGN,
    SKIP_SPACES,
    READ_INT_PART,
    READ_FRAC_PART,
    WAIT_UNIT_G
);
END_TYPE

VAR_INPUT
    Enable       : BOOL;      // Включить парсинг
    InputChar    : BYTE;      // Символ от GETBYTE
    CharValid    : BOOL;      // TRUE, если пришёл новый символ
END_VAR

VAR_OUTPUT
    WeightValue     : REAL;   // Принятое значение (в граммах)
    NewWeightValid  : BOOL;   // Триггер: TRUE на 1 цикл при успешном приёме
    State           : E_PARSE_STATE; // Для отладки
END_VAR

VAR
    Sign            : REAL := 1.0;
    WeightInt       : REAL := 0.0;
    WeightFrac      : REAL := 0.0;
    FracDiv         : REAL := 10.0;
    LastCharTime    : TIME := T#0ms;
END_VAR

// --- Тело FB ---
NewWeightValid := FALSE;

IF NOT Enable THEN
    State := WAIT_N;
    RETURN;
END_IF;

// Обновление таймера активности (предполагается вызов каждые ~1 мс)
IF CharValid THEN
    LastCharTime := T#0ms;
ELSE
    LastCharTime := LastCharTime + T#1ms;
END_IF;

// Тайм-аут: если >5 мс без символов — сброс
IF LastCharTime > T#5ms THEN
    State := WAIT_N;
    RETURN;
END_IF;

// Обработка только при наличии нового символа
IF NOT CharValid THEN
    RETURN;
END_IF;

// --- Конечный автомат ---
CASE State OF

    WAIT_N:
        IF InputChar = 78 (* 'N' *) THEN
            State := WAIT_SIGN;
            Sign := 1.0;
            WeightInt := 0.0;
            WeightFrac := 0.0;
            FracDiv := 10.0;
        END_IF;

    WAIT_SIGN:
        IF InputChar = 43 (* '+' *) THEN
            Sign := 1.0;
            State := SKIP_SPACES;
        ELSIF InputChar = 45 (* '-' *) THEN
            Sign := -1.0;
            State := SKIP_SPACES;
        END_IF;

    SKIP_SPACES:
        IF (InputChar >= 48) AND (InputChar <= 57) THEN
            // Цифра — сразу начало числа
            WeightInt := WORD_TO_REAL(InputChar - 48);
            State := READ_INT_PART;
        ELSIF InputChar = 32 (* пробел *) THEN
            // остаёмся в состоянии
        ELSE
            State := WAIT_N;
        END_IF;

    READ_INT_PART:
        IF (InputChar >= 48) AND (InputChar <= 57) THEN
            WeightInt := WeightInt * 10.0 + WORD_TO_REAL(InputChar - 48);
        ELSIF InputChar = 46 (* '.' *) THEN
            State := READ_FRAC_PART;
        ELSE
            State := WAIT_N;
        END_IF;

    READ_FRAC_PART:
        IF (InputChar >= 48) AND (InputChar <= 57) THEN
            WeightFrac := WeightFrac + WORD_TO_REAL(InputChar - 48) / FracDiv;
            FracDiv := FracDiv * 10.0;
        ELSIF InputChar = 32 (* пробел *) THEN
            State := WAIT_UNIT_G;
        ELSE
            State := WAIT_N;
        END_IF;

    WAIT_UNIT_G:
        IF InputChar = 103 (* 'g' *) THEN
            WeightValue := Sign * (WeightInt + WeightFrac);
            NewWeightValid := TRUE; // триггер!
            State := WAIT_N;
        ELSE
            State := WAIT_N;
        END_IF;

END_CASE;

На первый взгляд именно обработка строки выглядит убедительно.

Создайте тестовую программу и вместо принятых из порта байт отправляйте символы из подготовленной строки - так и взаимодействие и корректность проверите.
Когда мне нужно проверить регулятор - пишу тестовые программы с моделями задвижек, резервуаров, насосов, теплосетей (инерционных температурных объектов).
И Вы так поступайте.