Коды дня года SLC 5/04 для принтеров этикеток
Создание проверяемого производственного кода YYYYDDD в SLC 5/04. В этом руководстве порядковый день отделён от юлианского дня, а также рассматриваются считывание показаний часов, високосные годы, п...
Многие упаковочные предприятия просят SLC 5/04 создать для принтера этикеток «юлианскую дату». В большинстве случаев требуется не астрономическое юлианское число дня, а порядковый день, также называемый днём года: 1 января — это 001, а 31 декабря — 365 или 366. Это различие следует зафиксировать в спецификации интерфейса до создания лестничной логики.
Код вроде 2026243 обычно означает 2026 год, за которым следует порядковый день 243. Он удобен для отслеживания партий, поскольку имеет фиксированную длину и естественным образом сортируется в пределах года. Он не определяет время суток, часовой пояс, производственную смену или глобально уникальную партию. Если для прослеживаемости требуются эти сведения, ими необходимо управлять отдельно.

До выбора целочисленного или строкового хранения определите запрашиваемый код как год плюс трёхзначный порядковый день.
Сначала проверьте источник времени контроллера
Не копируйте адреса файла состояния из другого проекта, не проверив установленный процессор, серию, версию микропрограммы и официальную документацию по таблице данных. Файл состояния SLC содержит информацию о часах, но точные слова и поведение обновления необходимо проверить для целевого контроллера. Неправильные псевдонимы могут выдавать правдоподобные значения, пока переход на новый месяц или год не выявит ошибку.
Копируйте год, месяц и день в рабочие регистры как один согласованный снимок. Если значения считываются в момент полуночи, подпрограмма может объединить вчерашний месяц с сегодняшним днём. Один из подходов — выполнить считывание дважды и принять данные только при совпадении обоих наборов. Другой — обновлять дату производства в заданный короткий интервал после полуночи.
Часы контроллера также необходимо обслуживать. Правильная формула не исправит разряженную батарею, неверно установленные часы или несанкционированную корректировку. Подавайте сигнал тревоги, если дата выходит за утверждённый диапазон, и документируйте, кто имеет право устанавливать часы после технического обслуживания.
Используйте понятный метод смещения по месяцам
Порядковый день равен дню месяца плюс количеству дней во всех предшествующих месяцах. Храните накопленные смещения для невисокосного года в целочисленном файле: январь — 0, февраль — 31, март — 59, апрель — 90, май — 120, июнь — 151, июль — 181, август — 212, сентябрь — 243, октябрь — 273, ноябрь — 304, декабрь — 334.
Проверяйте месяц до индексации этого файла. Нулевое, отрицательное или превышающее 12 значение не должно адресовать непреднамеренный регистр. Также проверяйте день с учётом выбранного месяца. Контроллер должен устанавливать бит недействительной даты, блокировать печать и отображать отклонённые поля, а не создавать правдоподобный, но ошибочный код партии.
Получив смещение, вычислите порядковый день как сумму смещения и дня месяца. Если год високосный, а месяц позже февраля, прибавьте единицу. Храните промежуточные значения в отдельных регистрах, чтобы они оставались видимыми. Компактное выражение может сэкономить одну ступень, но усложняет диагностику в онлайн-режиме.
Реализуйте правило високосного года по григорианскому календарю
Обычная проверка «делится на четыре» неполна для столетних годов. По григорианскому правилу год является високосным, если делится на четыре, за исключением годов, делящихся на 100, которые не считаются високосными, если также не делятся на 400. Поэтому 2000 год был високосным, 2100 год таковым не будет, а 2400 год будет.
NIST объясняет, что григорианский календарь исключает три високосных года в каждом 400-летнем цикле. Это правило стоит реализовать, поскольку повторно используемый код часто работает дольше, чем ожидается. См. объяснение NIST о високосном годе.
Стройте проверку на явных сравнениях остатков, поддерживаемых набором инструкций установленного контроллера. Комментируйте каждую ветвь. Избегайте выражения, которое будущие специалисты не смогут проверить онлайн. Если в спецификации предприятия намеренно используется упрощённое правило, документируйте диапазон дат, в котором оно действительно.
Следите за диапазоном целочисленной арифметики
Порядковый день помещается в 16-разрядное знаковое целое число. Объединённое числовое значение, такое как YYYYDDD, — нет. Например, 2026243 превышает 32 767. Не пытайтесь поместить полный код этикетки в обычный целочисленный регистр SLC.
Храните год и порядковый день как отдельные целые числа, а затем формируйте строку. Это предотвращает переполнение и сохраняет ведущие нули. Если принтер принимает отдельные поля, передавайте их раздельно. Если действительно требуется астрономическое юлианское число дня, используйте отдельно проверенный алгоритм и формат данных; не переименовывайте эту подпрограмму порядкового дня.
Формируйте строку фиксированной длины для принтера
Производственная строка всегда должна содержать четыре цифры года и три цифры порядкового дня. День 7 должен отображаться как 007. Формируйте результат в буфере ASCII или строковом буфере с помощью инструкций, поддерживаемых процессором и проектом. Перед запуском печати проверьте длину назначения и перезаписывайте весь буфер, чтобы в нём не оставались символы от предыдущего сообщения.

Формат фиксированной длины сохраняет ведущие нули и обеспечивает выравнивание полей штрихкода.
Используйте с принтером квитирование по схеме «запрос — подтверждение». Зафиксируйте готовую строку даты в момент выдачи запроса. Не допускайте изменения буфера свободно работающей подпрограммой даты, пока сообщение активно. Регистрируйте успешную передачу, тайм-аут и отклонение принтером как отдельные состояния.
Проверяйте границы, а не только обычные даты
Проверьте 1 января, 28 февраля, 29 февраля в високосном году, 1 марта в високосном и невисокосном годах, 31 декабря и переход на новый год. Если код может оставаться в эксплуатации или переноситься на будущее, включите 31.12.2099, 28.02.2100 и 01.03.2100. Сравнивайте результаты с независимым календарём.
Намеренно подайте некорректные данные: месяц 0, месяц 13, день 0, 31 апреля и 29 февраля в невисокосном году. Убедитесь, что подпрограмма отказывается печатать. Выполните выключение и включение питания процессора непосредственно перед переходом даты и проверьте часы, рабочие регистры, поведение при первом сканировании и квитирование с принтером.
Интегрируйте код с учётом принадлежности партии
Подпрограмма даты должна выдавать проверенное значение, но упаковочная последовательность определяет, когда оно становится частью партии. Партии, начавшейся до полуночи, может потребоваться исходная дата производства после смены календарного дня. Зафиксируйте утверждённое значение в начале партии и храните его до закрытия партии.
Храните документированную подпрограмму вместе с записями предприятия о миграции систем PLC и PAC. Укажите точные слова источника времени, используемые на этой машине. Обеспечьте отображение активного кода даты и статуса проверки через уровень HMI и промышленной вычислительной техники.
Инженерный взгляд
Главное улучшение — концептуальная ясность. Называйте это значение порядковым днём или кодом дня года, проверяйте часы и календарные поля, используйте полное григорианское правило, не допускайте выхода арифметики за диапазон и фиксируйте строку фиксированной длины на время передачи. Эти решения предотвращают скрытые ошибки прослеживаемости, которые могут проявиться только в високосный день, на границе года или после замены контроллера.