gifts2017

Компонента работы с RFID-считывателем (на примере Impinj R420)

Опубликовал Алексей Карпов (karpov) в раздел Программирование - Внешние компоненты

Простенькая компонента 1С для работы с RFID-считывателем Impinj R420.
Тем, кто занимается темой RFID-зации, будет интересно как реальный пример работы.
Компонента успешно работает на одном подмосковном складе.

Принцип работы

Компонента генерирует два события при работе:

  1. IN - при попадании метки в поле видимости антенны;
  2. OUT - при выходе метки из поля видимости антенны.

При этом нужно помнить, что OUT сработает в том случае, если метка не будет видна антенне более времени, указанного в методе SetInOutTimeout (см. ниже). Т.е. физически метка может остаться на антенне, но антенна может ее не увидеть и сгенерировать событие OUT.

Таким образом, например, решается классическая задача проверки заказа/накладной, когда необходимо проверить правильность сборки заранее известного списка товаров. Так же на базе этих событий можно сделать инвентаризацию, поиск товара и т.д.

Компонента написана на C#. Использует .NET 3.5.


Описание интерфейса компоненты

Регистрация компоненты

Перед началом работы компоненты необходимо зарегистрировать ее с ключом tlb: 

RegAsm.exe "PATH\RFIDConnector.dll" /tlb

Или запустить register.bat (см. вложение), указав в нем путь до файла RegAsm

Инициализация компоненты

Имя класса: AddIn.RFIDConnector

Пример работы:

 

// Инициализация класса...

ИмяКласса = "AddIn.RFIDConnector";
Попытка
 ПодключитьВнешнююКомпоненту(ИмяКласса);
 Объект = Новый COMОбъект (ИмяКласса);
Исключение
 Сообщить("Ошибка загрузки внешней компоненты " + ИмяКласса + ". " + ОписаниеОшибки());
 Закрыть(); 
КонецПопытки;


Подключение/отключение устройства

SetInOutTimeout(Timeout) - установка периода видимости метки, после которого генерируется событие OUT (в мс.);

SetInOutPeriod(Period) - установка периода таймера: с какой частотой опрашивать метки на антеннах (в мс.);

Connect(IP) - подключиться к устройству с указанием IP-адреса устройства.

Пример работы:

// Задаем таймаут исчезания меток...
Объект.SetInOutTimeout(500);
// Задаем период проверки меток...
Объект.SetInOutPeriod(150);
// Подключаемся к устройству...
Объект.Connect("192.168.3.89");


Disconnect() - отключиться от устройства

Пример работы:

// Отключаем устройство...
Объект.Disconnect();


Запуск/остановка таймера опроса антенны

Start() - запуск таймера: начало работы с устройством

Пример работы: 

Попытка
 Объект.Start();
 Сообщить("Сканирование запущено!");
Исключение
 Сообщить("Ошибка запуска сканирования! Текст ошибки: " + ОписаниеОшибки());
КонецПопытки;


Stop() - остановка таймера

Пример работы: 

Попытка
 Объект.Stop();
 Сообщить("Сканирование остановлено!");
Исключение
 Сообщить("Ошибка остановки сканирования! Текст ошибки: " + ОписаниеОшибки());
КонецПопытки;


Обработка внешнего события

ВнешнееСобытие(Источник, Событие, Данные) - стандартное событие 1С

Источник - всегда "RFIDConnector"

Событие - всегда "InOutEvent"

Данные - данные в формате: "In/Out:Tag:Antenna", например: IN:302DBB7711C0004000000034:1;


Пример работы (спсМетки - список значений, спсРазвернуть_ - функция, разбирающая строку на подстроки через разделитель - см. пример RFIDConnectorTest.epf во вложении):

// фрмВнешнееСобытие - внешнее событие... 
Процедура фрмВнешнееСобытие(Источник, Событие, Данные)

 // Для отладки...
 Сообщить("Внешнее событие: " + Источник + ", " + Событие + ", " + Данные);

 // Получаем данные в виде списка...
 спсДанные = спсРазвернуть_(Данные, ";");
 // Идем по элементам списка...
 Для Каждого спсЭлемент Из спсДанные Цикл
  // Получаем параметры из каждой строки...
  спсПараметры = спсРазвернуть_(спсЭлемент.Значение, ":");
  // Если количество параметров 3 - обрабатываем данные...
  Если спсПараметры.Количество() = 3 Тогда
   ТипСобытия = СокрЛП(спсПараметры[0]);
   Метка = СокрЛП(спсПараметры[1]);
   Антенна = СокрЛП(спсПараметры[2]);

   прМетка = Метка + ":" + Антенна;

   // В зависимости от типа события...
   Если ВРег(ТипСобытия) = "IN" Тогда
    спсМетки.Добавить(прМетка);
   ИначеЕсли ВРег(ТипСобытия) = "OUT" Тогда
    спсМетка = спсМетки.НайтиПоЗначению(прМетка);
    Если спсМетка <> Неопределено Тогда
     спсМетки.Удалить(спсМетка);
    КонецЕсли;
   КонецЕсли;
  КонецЕсли;
 КонецЦикла;
КонецПроцедуры


Контакты:

Если у Вас возникли вопросы или пожелания по доработке/внедрению данной системы, а также любые другие вопросы, связанные с RFID (метки, считыватели, интеграция, разработка, внедрение, обслуживание, консультации и т.д.), Вы можете обратиться в компанию Кей-Софт (denisenko@keysoft.su.

Скачать файлы

Наименование Файл Версия Размер
Архив с компонентой и примером работы с ней 21
.zip 220,08Kb
20.11.14
21
.zip 1.00 220,08Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Alex Gaiduk (AlexSunS) 24.12.14 16:52
Автор а можно в личку, очень нужна помощь в проекте.
2. Алексей Карпов (karpov) 24.12.14 18:23
Без проблем
Можно на почту: karpov@keysoft.su
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа