Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 34

Тема: Функциональный блок для работы ПЛК100_24_Р_М и аналитическими весами

  1. #21

    По умолчанию

    Цитата Сообщение от 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;

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

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

  2. #22

    По умолчанию

    Уважаемый In_Da_Cher_A. Я не пытаюсь стать «тру-программистом» и не выдаю чужие работы как за свои (мое руководство в курсе того, откуда и благодаря кому я пытаюсь реализовать свой проект). Я бы реализовал бы всё через CFC, если бы не было необходимости парсить текст. Я признаю, что у меня есть пробелы и, как вы выразились, «за бесплатно» не пытаюсь навязать работу. Я лишь прошу о помощи тех, у кого есть желание и возможность внести корректировки. И ваше язвительное мнение держите при себе, если бы не нашлось желающих оказать помощь, то я бы не стал навязываться и пытался бы решить проблему другими способами.

  3. #23

    По умолчанию

    Спасибо вам!

  4. #24
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,157

    По умолчанию

    не наблюдаю в примере + (плюса)

  5. #25

    По умолчанию

    Понял, Спасибо!

  6. #26
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,157

    По умолчанию

    У вас весы на руках то есть? Прослушки порта на ПК и смотрите что шлет в реальности.

  7. #27

    По умолчанию

    Цитата Сообщение от What_is_up Посмотреть сообщение
    Доброго времени. У меня есть вопрос по выбору библиотеке для программирование ПЛК и аналитическим весами. У меня есть сам ПЛК преобразователь АС3-М-220 и весы с портом rs-232. Сами весы работают по простому протоколу ASCII( не RTU или MASTER) это значит, что нужно парсить строку вручную. Весы передают данные в ПЛК и на основе этого они принимаю решения разомкнуть релейный выход или нет. То есть, после достижения заданного веса он должен разомкнуть выход. Я пытаюсь реализовать на языке CFC. Подскажите пожалуйста, какая библиотека( функциональный блок) лучше подайте для реализации моей задачи?
    Точное название весов какое ?

  8. #28
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,082

    По умолчанию

    Цитата Сообщение от What_is_up Посмотреть сообщение
    [Префикс][Знак][Значение][Единица] N - неттон; Знак - +/-; Значение - выравнено пробелами: 2.190; Единица - g. ПРИМЕР: N1__2.190_g Запрашивать данные по кнопке PRINT
    Отделено и выравнено?

  9. #29

    По умолчанию

    Здравствуйте! К сожалению, пока такой возможности нет. Но мы использовали весы с принтером. И принтер именно такие значения передавал.

  10. #30

    По умолчанию

    Здравствуйте. ACCULAB ATL 220D4-l

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Похожие темы

  1. функциональный блок CTU
    от АлексейI в разделе Среда программирования OWEN Logic
    Ответов: 4
    Последнее сообщение: 05.12.2023, 16:17
  2. Функциональный блок PID
    от Hemann в разделе Программируемые реле
    Ответов: 78
    Последнее сообщение: 04.05.2017, 08:57
  3. LD + функциональный блок
    от дрю в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 26.04.2014, 08:47
  4. Пользовательский функциональный блок
    от fill-forty в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 17.08.2009, 08:49
  5. Программа и функциональный блок
    от Geniu$ в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 27.05.2008, 20:25

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •