SLC-5/04 Julian Date Generator Implementation Guide — figure 1

Руководство по реализации генератора юлианских дат SLC-5/04

Реализуйте генератор юлианской даты в SLC-5/04 для вывода в формате ASCII на принтеры этикеток. Пошаговая лестничная логика с инструкциями Compute.

Семейство SLC-5/04, включая такие процессоры, как 1747-L542, не поддерживает встроенную инструкцию для вычисления юлианского номера дня (JDN). На упаковочных линиях, при кодировании партий и работе с принтерами этикеток часто требуется значение дня года или компактная строка YYYYDDD, поэтому логику приходится создавать с помощью обычных математических операций и операций с таблицами данных. В этом руководстве описан удобный для сопровождения подход с использованием выражений CPT, таблицы накопленных количеств дней по месяцам, обработки високосных лет и преобразования в ASCII для данных, передаваемых на принтер. Также рассмотрены ограничения шестнадцатибитной арифметики, которые становятся причиной ошибок во многих первых реализациях.

Руководство по созданию генератора юлианской даты для SLC-5/04 — рисунок 1 Процессоры SLC-5/04 вычисляют день года и коды в юлианском формате в лестничной логике с использованием CPT, целочисленных файлов и тщательно проверенных значений RTC.

В некоторых исходных материалах для года, месяца и дня используются слова файла состояния в области S:50–S:52, тогда как в другой документации упоминается более широкая область часов реального времени вокруг S:37 — в зависимости от модели процессора и версии встроенного ПО. Внимательно работайте с исходными словами RTC: прежде чем создавать псевдонимы тегов, проверьте точную карту файла состояния для установленной модели и серии. Если календарные поля определены верно, сам алгоритм можно переносить между проектами SLC-5/04.

Структура таблицы данных

Продуманная структура целочисленных данных делает подпрограмму понятной для следующего специалиста по обслуживанию. Обычно регистры N7 используются следующим образом: N7:0 — год, N7:1 — месяц, N7:2 — день месяца, N7:3 — результат: день года, N7:4 — флаг високосного года, N7:5 — промежуточное хранение результатов CPT. Накопленные смещения по дням для месяцев следует хранить в фиксированной целочисленной таблице — например, в N10:1–N10:12 со значениями 0, 31, 59, 90, 120, 151, 151, 181, 212, 243, 273, 304 для невисокосного базового года до ноября включительно; обработка февраля выполняется через флаг високосного года, а не путем изменения таблицы во время выполнения. Скорректируйте точную структуру таблицы в соответствии с выбранной индексацией, начиная с нуля или единицы, и задокументируйте ее рядом со ступенями.

Пример подхода к вычислению DOY (концептуально)
Leap = (Y делится на 4) с учетом правил для вековых лет
DOY = Day + Cumulative[Month] + (Leap AND Month>2)
Строка YYYYDDD через форматирование в стиле ASC / AIF для принтеров

Для многих производств достаточно дня года (DOY) в формате YYYYDDD, что позволяет избежать полной сложности астрономического юлианского номера дня. Полные юлианские номера дней, охватывающие столетия, требуют более аккуратной работы с разрядностью целых чисел: операции CPT в SLC с 16-битными целыми переполняются, если промежуточные произведения не сохраняются поэтапно. Предпочтительно вычислять DOY в 16-битном пространстве, а затем объединять год и дополненный ведущими нулями DOY в ASCII-файле для принтера, а не пытаться получить одно слишком большое целое число.

Високосный год и структура CPT

Логика определения високосного года должна соответствовать правилам гражданского календаря, используемым вашей системой контроля качества. Как минимум годы, кратные четырем, считаются високосными; если срок эксплуатации продукции охватывает границы столетий, применяйте полные исключения григорианского календаря: вековые годы являются високосными только при делимости на 400. Установите N7:4 в единицу, если год високосный. При добавлении накопленного смещения месяца прибавляйте дополнительный день только при установленном флаге високосного года и месяце после февраля. Выполняйте это добавление в отдельной инструкции CPT, а не прячьте вложенные условия в плохо читаемом выражении.

Копируйте год, месяц и день из проверенных исходных слов RTC в рабочие регистры N7 с помощью медленной периодической задачи либо при первом сканировании и по ежедневному фронту. Не считывайте слова RTC в каждой свободно выполняемой ступени, если последующее форматирование ASC требует значительных ресурсов; для кодирования даты обычно достаточно обновления раз в минуту.

Руководство по созданию генератора юлианской даты для SLC-5/04 — рисунок 2 Строки DOY с дополнением ведущими нулями надежнее передаются на принтеры этикеток, чем необработанные целые числа, когда длина штрихкода должна оставаться фиксированной.

Форматирование ASCII для принтеров этикеток

Большинство промышленных принтеров ожидают строку фиксированной ширины. После вычисления DOY в N7:3 используйте инструкции работы с ASCII-файлами для создания строки вида YYYYDDD с ведущими нулями в поле дня. Перед запуском рукопожатия печати проверьте длину строки. Если протокол принтера требует разделителей или префиксов, специфичных для предприятия, формируйте их в том же буфере строки, а не полагайтесь на автоматическое дополнение со стороны принтера.

  1. Подтвердите соответствие слов RTC конкретной модели 1747-L542 (или установленного SLC-5/04) и версии встроенного ПО.
  2. Создайте рабочие теги N7 и таблицу накопленных значений по месяцам в целочисленном файле.
  3. Напишите логику CPT для определения високосного года и CPT для вычисления DOY по формуле: день + накопленное значение + поправка на високосный год.
  4. Сформируйте YYYYDDD через ASC и проверьте результат на известных календарных датах, включая 28 февраля и 1 марта в високосные и невисокосные годы.
  5. Защитите систему от переполнения 16-битных значений, если какая-либо подпрограмма вычисляет полные многовековые JDN; разбивайте вычисления на этапы или выполняйте их за пределами SLC.

Проверки високосного года и дополнения нулями для принтера

Для проверки следует использовать даты 2024-02-29, 2024-03-01, 2025-02-28 и переходы на конец года 12-31. Сравните DOY, вычисленный ПЛК, с независимым календарем. К распространенным проблемам относятся использование неправильных адресов файла состояния, отсутствие поправки на високосный февраль, печать DOY без ведущих нулей, из-за чего смещаются поля штрихкода, а также переполнение промежуточных результатов CPT после расширения подпрограммы для вычисления полного JDN. Добавляйте в лестничную логику комментарии с указанием фактически используемых слов RTC для конкретной машины.

Если код даты является частью более крупной упаковочной ячейки, сохраните генератор как повторно используемый файл и стандартизируйте структуру целочисленных данных на всех линиях. Резервные процессоры и документация для этих ПЛК-систем SLC-500 должны включать подпрограмму формирования кода даты, чтобы при замене процессора система незаметно не вернулась к устаревшей и некорректной реализации календаря.

Об авторе

Марк Таунсенд | Ведущий инженер по автоматизации — системы Allen-Bradley

Марк Таунсенд — ведущий инженер по автоматизации с более чем 18-летним опытом работы с платформами Allen-Bradley, включая ControlLogix, CompactLogix и устаревшие системы SLC-500. В его повседневную работу входят разработка логики RSLogix / Studio 5000 и ввод в эксплуатацию HMI FactoryTalk View на устаревших и смешанных парках оборудования.

Руководство по реализации генератора юлианских дат SLC-5/04

Реализуйте генератор юлианской даты в SLC-5/04 для вывода в формате ASCII на принтеры этикеток. Пошаговая лестничная логика с инструкциями Compute.

Семейство SLC-5/04, включая такие процессоры, как 1747-L542, не поддерживает встроенную инструкцию для вычисления юлианского номера дня (JDN). На упаковочных линиях, при кодировании партий и работе с принтерами этикеток часто требуется значение дня года или компактная строка YYYYDDD, поэтому логику приходится создавать с помощью обычных математических операций и операций с таблицами данных. В этом руководстве описан удобный для сопровождения подход с использованием выражений CPT, таблицы накопленных количеств дней по месяцам, обработки високосных лет и преобразования в ASCII для данных, передаваемых на принтер. Также рассмотрены ограничения шестнадцатибитной арифметики, которые становятся причиной ошибок во многих первых реализациях.

Руководство по созданию генератора юлианской даты для SLC-5/04 — рисунок 1 Процессоры SLC-5/04 вычисляют день года и коды в юлианском формате в лестничной логике с использованием CPT, целочисленных файлов и тщательно проверенных значений RTC.

В некоторых исходных материалах для года, месяца и дня используются слова файла состояния в области S:50–S:52, тогда как в другой документации упоминается более широкая область часов реального времени вокруг S:37 — в зависимости от модели процессора и версии встроенного ПО. Внимательно работайте с исходными словами RTC: прежде чем создавать псевдонимы тегов, проверьте точную карту файла состояния для установленной модели и серии. Если календарные поля определены верно, сам алгоритм можно переносить между проектами SLC-5/04.

Структура таблицы данных

Продуманная структура целочисленных данных делает подпрограмму понятной для следующего специалиста по обслуживанию. Обычно регистры N7 используются следующим образом: N7:0 — год, N7:1 — месяц, N7:2 — день месяца, N7:3 — результат: день года, N7:4 — флаг високосного года, N7:5 — промежуточное хранение результатов CPT. Накопленные смещения по дням для месяцев следует хранить в фиксированной целочисленной таблице — например, в N10:1–N10:12 со значениями 0, 31, 59, 90, 120, 151, 151, 181, 212, 243, 273, 304 для невисокосного базового года до ноября включительно; обработка февраля выполняется через флаг високосного года, а не путем изменения таблицы во время выполнения. Скорректируйте точную структуру таблицы в соответствии с выбранной индексацией, начиная с нуля или единицы, и задокументируйте ее рядом со ступенями.

Пример подхода к вычислению DOY (концептуально)
Leap = (Y делится на 4) с учетом правил для вековых лет
DOY = Day + Cumulative[Month] + (Leap AND Month>2)
Строка YYYYDDD через форматирование в стиле ASC / AIF для принтеров

Для многих производств достаточно дня года (DOY) в формате YYYYDDD, что позволяет избежать полной сложности астрономического юлианского номера дня. Полные юлианские номера дней, охватывающие столетия, требуют более аккуратной работы с разрядностью целых чисел: операции CPT в SLC с 16-битными целыми переполняются, если промежуточные произведения не сохраняются поэтапно. Предпочтительно вычислять DOY в 16-битном пространстве, а затем объединять год и дополненный ведущими нулями DOY в ASCII-файле для принтера, а не пытаться получить одно слишком большое целое число.

Високосный год и структура CPT

Логика определения високосного года должна соответствовать правилам гражданского календаря, используемым вашей системой контроля качества. Как минимум годы, кратные четырем, считаются високосными; если срок эксплуатации продукции охватывает границы столетий, применяйте полные исключения григорианского календаря: вековые годы являются високосными только при делимости на 400. Установите N7:4 в единицу, если год високосный. При добавлении накопленного смещения месяца прибавляйте дополнительный день только при установленном флаге високосного года и месяце после февраля. Выполняйте это добавление в отдельной инструкции CPT, а не прячьте вложенные условия в плохо читаемом выражении.

Копируйте год, месяц и день из проверенных исходных слов RTC в рабочие регистры N7 с помощью медленной периодической задачи либо при первом сканировании и по ежедневному фронту. Не считывайте слова RTC в каждой свободно выполняемой ступени, если последующее форматирование ASC требует значительных ресурсов; для кодирования даты обычно достаточно обновления раз в минуту.

Руководство по созданию генератора юлианской даты для SLC-5/04 — рисунок 2 Строки DOY с дополнением ведущими нулями надежнее передаются на принтеры этикеток, чем необработанные целые числа, когда длина штрихкода должна оставаться фиксированной.

Форматирование ASCII для принтеров этикеток

Большинство промышленных принтеров ожидают строку фиксированной ширины. После вычисления DOY в N7:3 используйте инструкции работы с ASCII-файлами для создания строки вида YYYYDDD с ведущими нулями в поле дня. Перед запуском рукопожатия печати проверьте длину строки. Если протокол принтера требует разделителей или префиксов, специфичных для предприятия, формируйте их в том же буфере строки, а не полагайтесь на автоматическое дополнение со стороны принтера.

  1. Подтвердите соответствие слов RTC конкретной модели 1747-L542 (или установленного SLC-5/04) и версии встроенного ПО.
  2. Создайте рабочие теги N7 и таблицу накопленных значений по месяцам в целочисленном файле.
  3. Напишите логику CPT для определения високосного года и CPT для вычисления DOY по формуле: день + накопленное значение + поправка на високосный год.
  4. Сформируйте YYYYDDD через ASC и проверьте результат на известных календарных датах, включая 28 февраля и 1 марта в високосные и невисокосные годы.
  5. Защитите систему от переполнения 16-битных значений, если какая-либо подпрограмма вычисляет полные многовековые JDN; разбивайте вычисления на этапы или выполняйте их за пределами SLC.

Проверки високосного года и дополнения нулями для принтера

Для проверки следует использовать даты 2024-02-29, 2024-03-01, 2025-02-28 и переходы на конец года 12-31. Сравните DOY, вычисленный ПЛК, с независимым календарем. К распространенным проблемам относятся использование неправильных адресов файла состояния, отсутствие поправки на високосный февраль, печать DOY без ведущих нулей, из-за чего смещаются поля штрихкода, а также переполнение промежуточных результатов CPT после расширения подпрограммы для вычисления полного JDN. Добавляйте в лестничную логику комментарии с указанием фактически используемых слов RTC для конкретной машины.

Если код даты является частью более крупной упаковочной ячейки, сохраните генератор как повторно используемый файл и стандартизируйте структуру целочисленных данных на всех линиях. Резервные процессоры и документация для этих ПЛК-систем SLC-500 должны включать подпрограмму формирования кода даты, чтобы при замене процессора система незаметно не вернулась к устаревшей и некорректной реализации календаря.

Об авторе

Марк Таунсенд | Ведущий инженер по автоматизации — системы Allen-Bradley

Марк Таунсенд — ведущий инженер по автоматизации с более чем 18-летним опытом работы с платформами Allen-Bradley, включая ControlLogix, CompactLogix и устаревшие системы SLC-500. В его повседневную работу входят разработка логики RSLogix / Studio 5000 и ввод в эксплуатацию HMI FactoryTalk View на устаревших и смешанных парках оборудования.

Оставить комментарий

Обратите внимание, комментарии должны быть одобрены перед публикацией.