Сценарий отслеживает движение объектов в двух направлениях (например, “вход” и “выход”) на основе последовательности срабатывания оптических датчиков. Сценарий подсчитывает, сколько раз объект прошел через зону датчиков в каждом направлении, и сохраняет результаты в пользовательских регистрах (reg_in и reg_out).

Скриншот панели управления Скриншот панели управления

Алгоритм

  1. Два датчика (sensor1 и sensor2) определяют положение объекта.
  2. Класс Counter анализирует последовательность состояний датчиков (от “оба выключены” до “оба включены” и обратно), чтобы понять, в каком направлении движется объект.
  3. Если объект прошел в прямом направлении (состояние 0 → 1 → 2 → 3 → 0), увеличивается счетчик входов (reg_in).
  4. Если объект прошел в обратном направлении (состояние 0 → 3 → 2 → 1 → 0), увеличивается счетчик выходов (reg_out).
  5. Данные обновляются в реальном времени с интервалом 0.1 секунды.

Возможности

  • Подсчет объектов: Считает количество объектов, проходящих через зону контроля в двух направлениях.
  • Обработка данных в реальном времени: Использует цифровые входы для моментального анализа состояния датчиков.
  • Веб-интерфейс: Позволяет просматривать значения счетчиков (Счетчик входов и Счетчик выходов) через веб-панель управления.
  • Гибкость конфигурации: Поддерживает настройку датчиков и регистров с пользовательскими именами и типами данных.
  • Простота интеграции: Легко адаптируется под другие задачи подсчета с использованием оптических датчиков.

Область применения

Этот сценарий подходит для автоматизации процессов, где требуется подсчет объектов или людей, движущихся в определенных направлениях. Примеры:

  • Контроль доступа: Подсчет входящих и выходящих людей в помещении (например, в магазинах или офисах).
  • Производственные линии: Учет деталей, проходящих через конвейер в разных направлениях.
  • Логистика: Мониторинг движения грузов через контрольные точки.
  • Умные системы: Интеграция в IoT-решения для сбора данных о перемещениях.

Производительность

Замеры осуществлялись на тестовом образце

Время компиляции 22 мс
Среднее время выполнения тела цикла <1 мс
Использование стека 640 байт (7.8%)
Использование кучи 1984 байт (3.2%)

Сценарий

  '''
Счетчик объектов с двумя оптическими датчиками
'''
from dev import Reg, Di, run, count, webconf

class Counter:
    def __init__(self, reg):
        self.lastState = 0
        self.isMoved = False
        self.reg = reg
        # Определение последовательности состояний для отслеживания движения
        self.states = (
            (False, False), # Состояние 0: оба датчика не активны
            (True, False),  # Состояние 1: активен первый датчик
            (True, True),   # Состояние 2: активны оба датчика
            (False, True)   # Состояние 3: активен второй датчик
        )
        
    def process(self, sensor1, sensor2):
        # Определение текущего состояния на основе состояний датчиков
        nowState = None
        for i, state in enumerate(self.states):
            if (sensor1, sensor2) == state:
                nowState = i
                break
        if nowState is None:
            # Если состояние не найдено, игнорируем
            return
        # Если состояние не изменилось, ничего не делаем
        if nowState == self.lastState:
            return
        # Если движение в прямом направлении завершилось (состояние 3 -> 0)
        if self.isMoved and nowState == 0 and self.lastState == 3:
            self.reg.inc()
        # Обновляем направление движения
        self.isMoved = (nowState - self.lastState) == 1
        # Обновляем последнее состояние
        self.lastState = nowState


# Конфигурация количества регистров, аналоговых и цифровых входов/выходов контроллера
count(Reg=2, Ai=0, Do=0, Di=2, Ao=0)

# Конфигурация панели управления веб-интерфейса
webconf(Reg=True, Display=False, Pin=True, Console=False)

# Конфигурация цифровых входов с назначением имён
sensor1 = Di(0).conf(name='Датчик 1')
sensor2 = Di(1).conf(name='Датчик 2')

# Конфигурация пользовательских регистров с именами и типами данных
reg_in = Reg(0).conf(name='Счетчик входов', type='uint', access='r')
reg_out = Reg(1).conf(name='Счетчик выходов', type='uint', access='r')

# Инициализация счетчиков для входов и выходов
counterIn = Counter(reg_in)
counterOut = Counter(reg_out)


def step():
    # Считываем текущие значения датчиков
    val1 = sensor1.val()
    val2 = sensor2.val()
    # Обрабатываем движение в одном направлении (например, вход)
    counterIn.process(val1, val2)
    # Обрабатываем движение в обратном направлении (например, выход)
    counterOut.process(val2, val1)


# Запуск основного цикла с интервалом 0.1 секунды
run(step, 0.1)