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


Алгоритм
- Два датчика (
sensor1
иsensor2
) определяют положение объекта. - Класс
Counter
анализирует последовательность состояний датчиков (от “оба выключены” до “оба включены” и обратно), чтобы понять, в каком направлении движется объект. - Если объект прошел в прямом направлении (состояние 0 → 1 → 2 → 3 → 0), увеличивается счетчик входов (
reg_in
). - Если объект прошел в обратном направлении (состояние 0 → 3 → 2 → 1 → 0), увеличивается счетчик выходов (
reg_out
). - Данные обновляются в реальном времени с интервалом 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)