В ИИ
https://chat.deepseek.com/
Набрал код из FC20 относящийся к маслонасосу
Запрос:
Что означает код ниже и как сделать чтобы "Cч_наработки".MaslonasosHr" суммировался как длинное целое число? Приведи полный доработанный код.
NOP 0
AN #FrZ3
JC N061
L "Cч_наработки".MaslonasosMin
INC 1
T "Cч_наработки".MaslonasosMin
L W#16#3C
<I
JC N061
L W#16#0
T "Cч_наработки".MaslonasosMin
L "Cч_наработки".MaslonasosHr
L DW#16#1
+I
T "Cч_наработки".MaslonasosHr
N061: NOP 0
Код предназначен для подсчёта времени наработки маслонасоса в минутах и часах. Вот его пошаговое объяснение:
NOP 0 - Пустая операция (заглушка)
AN #FrZ3 - Проверка сигнала отключения (если FrZ3=0, условие выполняется)
JC N061 - Выход из цикла при активном сигнале FrZ3
Инкремент минутной метки:
STL
L "Cч_наработки".MaslonasosMin // Загрузить минуты
INC 1 // +1 минута
T "Cч_наработки".MaslonasosMin // Сохранить
L W#16#3C <I - Сравнение с 60 (0x3C = 60)
JC N061 - Пропуск сброса, если меньше 60
Сброс минут и инкремент часов:
STL
L 0 // Обнулить
T "Cч_наработки".MaslonasosMin
L "Cч_наработки".MaslonasosHr // Загрузить часы
L DW#16#1 +I // +1 час (16-битное сложение)
T "Cч_наработки".MaslonasosHr
Чтобы "MaslonasosHr" суммировался как 32-битное число:
Ответ
Исходный код реализует счетчик времени работы насоса с переводом минут в часы. Каждую минуту увеличивается переменная MaslonasosMin, при достижении 60 минут она сбрасывается, и увеличивается MaslonasosHr.
Проблема: Для работы с большими значениями часов (более 32767) нужно использовать 32-битный тип данных (DInt) вместо 16-битного (Int).
Исправления:
Замена операции +I (сложение Int) на +D (сложение DInt).
Использование 32-битной константы L#1 вместо DW#16#1.
Объявление переменной MaslonasosHr как DInt в структуре данных.
Доработанный код:
STL
NOP 0
AN #FrZ3 // Проверка условия активации счетчика
JC N061 // Переход к метке N061, если условие ложно
L "Cч_наработки".MaslonasosMin // Загрузка минут
INC 1 // Увеличить минуты на 1
T "Cч_наработки".MaslonasosMin // Сохранить минуты
L 60 // Верхний предел минут (W#16#3C = 60)
<I // Сравнение минут с 60
JC N061 // Если меньше 60, переход к N061
L 0 // Сброс минут
T "Cч_наработки".MaslonasosMin
L "Cч_наработки".MaslonasosHr // Загрузка часов
L L#1 // Загрузка 32-битной единицы
+D // Сложение DInt (32-битное)
T "Cч_наработки".MaslonasosHr // Сохранение часов
N061: NOP 0 // Конец ветвления
Настройки структуры данных:
Убедитесь, что MaslonasosHr объявлен как DInt (Double Integer) в структуре "Cч_наработки".
MaslonasosMin должен быть типа Int (Word), так как диапазон 0-59 влезает в 16 бит.
Запрос:
Объясни также исходный код с пояснением каждой инструкции
Ответ:
Вот построчное объяснение оригинального кода с комментариями на русском языке:
Исходный код с пояснениями:
stl
NOP 0 // Пустая операция (No Operation)
AN #FrZ3 // Проверить бит #FrZ3 (логическое И НЕ)
JC N061 // Если #FrZ3 = 0, перейти к метке N061 (пропустить счет)
L "Cч_наработки".MaslonasosMin // Загрузить значение минут в аккумулятор
INC 1 // Увеличить аккумулятор на 1 (минуты++)
T "Cч_наработки".MaslonasosMin // Сохранить новое значение минут
L W#16#3C // Загрузить число 60 (W#16#3C = 60 в WORD)
<I // Сравнить аккумулятор (минуты) с 60 (16-битное сравнение)
JC N061 // Если минуты < 60, перейти к N061 (не сбрасывать счетчик)
L W#16#0 // Загрузить 0 (сброс минут)
T "Cч_наработки".MaslonasosMin // Обнулить минуты
L "Cч_наработки".MaslonasosHr // Загрузить текущие часы
L DW#16#1 // Загрузить 1 (32-битное число, но в оригинале ошибка: DW#16#1 = DWord, но +I работает с Int)
+I // Сложить часы и 1 (16-битное сложение)
T "Cч_наработки".MaslonasosHr // Сохранить новые часы
N061: NOP 0 // Конец логики (метка для переходов)
Ключевые моменты работы кода:
Условие активации счетчика (AN #FrZ3):
Счетчик работает только если сигнал #FrZ3 активен (логика AN инвертирует сигнал: если #FrZ3 = 0, счетчик увеличивается).
Инкремент минут:
Каждый цикл, когда условие выполняется, минуты увеличиваются на 1 (INC 1).
Проверка на 60 минут:
Если минуты достигают 60, происходит:
Сброс минут в 0.
Увеличение часов на 1.
Проблема в оригинальном коде:
Для часов используется 16-битное сложение (+I), что ограничивает максимальное значение часов до 32767 (Int).
Константа DW#16#1 несовместима с +I (должна быть W#16#1 для 16-бит).
Как работает доработанный код (32-битный):
stl
L "Cч_наработки".MaslonasosHr // Загрузить часы (32-битный DInt)
L L#1 // Загрузить 32-битную единицу (L#1 = DInt)
+D // 32-битное сложение (DInt + DInt)
T "Cч_наработки".MaslonasosHr // Сохранить часы (теперь до 2,147,483,647)
Пояснение типов данных:
Переменная Тип Диапазон Описание
MaslonasosMin Int 0–32767 Минуты (0–59, хватит 16 бит)
MaslonasosHr DInt −2,147,483,648 – 2,147,483,647 Часы (32 бита)