RFID система VI-88F — различия между версиями
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | RFID системы являются популярным решением для | + | [[Файл:VI89F.jpg | 280 px | right]] |
+ | RFID системы являются популярным решением для отслеживания продукциии и других объектов в складской логистике и др. RFID системы как правило имеют последовательный порт, который работает в 2-х режимах: | ||
*терминала, когда при появлении метки в поле видимости в последовательный порт отправляется строка с данными о метки. | *терминала, когда при появлении метки в поле видимости в последовательный порт отправляется строка с данными о метки. | ||
*режим опроса , или командный режим, когда RFID отдает код метки по запросу от хоста | *режим опроса , или командный режим, когда RFID отдает код метки по запросу от хоста | ||
Строка 8: | Строка 9: | ||
Дальнейшую обработку полученного кода метки: применение "словаря", повторные чтения для уверенного приема конкретной метки и др. - можно реализовать в пользовательских скриптах. | Дальнейшую обработку полученного кода метки: применение "словаря", повторные чтения для уверенного приема конкретной метки и др. - можно реализовать в пользовательских скриптах. | ||
Пример пользовательского протокола обмена с RFID системой VI-88/86/89F (без обработки CRC) : | Пример пользовательского протокола обмена с RFID системой VI-88/86/89F (без обработки CRC) : | ||
+ | <syntaxhighlight lang="Lua"> | ||
+ | function createDevices () -- функция создания регистров | ||
+ | addDevice({name = "H", base = 16}); -- в документации регистры в шестнадацтиричной системе | ||
+ | end | ||
+ | |||
+ | local errorCount = 0; -- error counter | ||
+ | local req_array = {0x40, 0x06, 0xEE, 0x01, 0x00, 0x00, 0x00, 0xCB}; -- шаблон строки запроса Get tag list | ||
+ | local no_tag_mask = {0xf4, 0x03, 0xEE, 0x02, 0x19}; -- маска нет меток | ||
+ | |||
+ | -- СРАВНЕНИЕ 2-х таблиц на совпадение | ||
+ | function cmpTables (t1,t2) | ||
+ | local cmp_expression = false; | ||
+ | for i,v in ipairs (t1) | ||
+ | do | ||
+ | cmp_expression = (v == t2[i]); | ||
+ | if not cmp_expression then return false; end | ||
+ | end | ||
+ | return true; | ||
+ | end | ||
+ | -- ПРЕОБРАЗОВАНИЕ ТАБЛИЦЫ В СТРОКУ -- | ||
+ | function Table2string(t) | ||
+ | local result = ""; | ||
+ | for i,v in ipairs(t) do | ||
+ | result = result..string.format("%x",v) | ||
+ | end | ||
+ | return result | ||
+ | end | ||
+ | ------------------------------------- | ||
+ | function readRegister (reg, device, unitId) --ФУНКЦИЯ ЧТЕНИЯ | ||
+ | |||
+ | local res = sendBytes(req_array); -- отправка запроса | ||
+ | INFO("Request was sent!"); | ||
+ | if (res == false) then | ||
+ | DEBUG("Can't send bytes"); | ||
+ | return false; | ||
+ | end | ||
+ | |||
+ | local response = readBytes(5); -- прием ответа | ||
+ | local response2 = {}; | ||
+ | if (response == false) then | ||
+ | ERROR("Can't read response") ; | ||
+ | return false; | ||
+ | end | ||
+ | if cmpTables(no_tag_mask, response) | ||
+ | then | ||
+ | INFO("NO tag"); | ||
+ | return 0;-- метка не присутствует | ||
+ | else | ||
+ | -- дочитываем остаток | ||
+ | response2 = readBytes(13); -- прием ответа | ||
+ | if (response == false) | ||
+ | then | ||
+ | ERROR("Can't read response") ; | ||
+ | return false; | ||
+ | end | ||
+ | -- склеить обе части | ||
+ | for i,v in ipairs(response2) | ||
+ | do | ||
+ | table.insert(response, v) | ||
+ | end | ||
+ | |||
+ | end | ||
+ | |||
+ | -- посчитать контрольную сумму, если нужно | ||
+ | local CRC = table.remove(response); -- убрать символ контрольной суммы | ||
+ | local string_out = Table2string(response); | ||
+ | local last_four = string_out:sub(#string_out - 3) | ||
+ | -- убрать контрольую сумму | ||
+ | |||
+ | INFO("Tag was "..last_four); | ||
+ | return tonumber(last_four,16); | ||
+ | |||
+ | -- КОНЕЦ Ф. ЧТЕНИЯ-- | ||
+ | end | ||
+ | |||
+ | function writeRegister () | ||
+ | -- Add your code here | ||
+ | return false; | ||
+ | end | ||
+ | </syntaxhighlight> |
Текущая версия на 09:23, 6 сентября 2016
RFID системы являются популярным решением для отслеживания продукциии и других объектов в складской логистике и др. RFID системы как правило имеют последовательный порт, который работает в 2-х режимах:
- терминала, когда при появлении метки в поле видимости в последовательный порт отправляется строка с данными о метки.
- режим опроса , или командный режим, когда RFID отдает код метки по запросу от хоста
В WebHMI поддержка RFID системы VI-88/86/89F реализована через пользовательский протокол, когда RFID настроена в "командном режиме" на выдачу только одной метки за 1 раз для упрощения обработки ответов (в случае наличия нескольких меток в поле действия - они становятся в очередь LIFO). Алгоритм пользовательского протокола в этом случае такой:
- отправить команду - "получить ID меток в поле действия"
- проверить ответ - прочитать 5 байт и сравнить с ответом "нет меток"
- если ответ другой, дочитать оставшиеся байты, проверить контрольную сумму и при правильной сумме взять подстроку из ID метки, преобразовать в число и вернуть как значениие регистра
Дальнейшую обработку полученного кода метки: применение "словаря", повторные чтения для уверенного приема конкретной метки и др. - можно реализовать в пользовательских скриптах. Пример пользовательского протокола обмена с RFID системой VI-88/86/89F (без обработки CRC) :
function createDevices () -- функция создания регистров
addDevice({name = "H", base = 16}); -- в документации регистры в шестнадацтиричной системе
end
local errorCount = 0; -- error counter
local req_array = {0x40, 0x06, 0xEE, 0x01, 0x00, 0x00, 0x00, 0xCB}; -- шаблон строки запроса Get tag list
local no_tag_mask = {0xf4, 0x03, 0xEE, 0x02, 0x19}; -- маска нет меток
-- СРАВНЕНИЕ 2-х таблиц на совпадение
function cmpTables (t1,t2)
local cmp_expression = false;
for i,v in ipairs (t1)
do
cmp_expression = (v == t2[i]);
if not cmp_expression then return false; end
end
return true;
end
-- ПРЕОБРАЗОВАНИЕ ТАБЛИЦЫ В СТРОКУ --
function Table2string(t)
local result = "";
for i,v in ipairs(t) do
result = result..string.format("%x",v)
end
return result
end
-------------------------------------
function readRegister (reg, device, unitId) --ФУНКЦИЯ ЧТЕНИЯ
local res = sendBytes(req_array); -- отправка запроса
INFO("Request was sent!");
if (res == false) then
DEBUG("Can't send bytes");
return false;
end
local response = readBytes(5); -- прием ответа
local response2 = {};
if (response == false) then
ERROR("Can't read response") ;
return false;
end
if cmpTables(no_tag_mask, response)
then
INFO("NO tag");
return 0;-- метка не присутствует
else
-- дочитываем остаток
response2 = readBytes(13); -- прием ответа
if (response == false)
then
ERROR("Can't read response") ;
return false;
end
-- склеить обе части
for i,v in ipairs(response2)
do
table.insert(response, v)
end
end
-- посчитать контрольную сумму, если нужно
local CRC = table.remove(response); -- убрать символ контрольной суммы
local string_out = Table2string(response);
local last_four = string_out:sub(#string_out - 3)
-- убрать контрольую сумму
INFO("Tag was "..last_four);
return tonumber(last_four,16);
-- КОНЕЦ Ф. ЧТЕНИЯ--
end
function writeRegister ()
-- Add your code here
return false;
end