Настройка COM-считывателей в CRM
Введение
В системе R-Keeper CRM возможны следующие варианты добавления (или поиска) карты в Редакторе карт:
1. В ручном режиме (справочник "Выпуск карт");
2. В полуручном режиме (с ипользованием COM-считывателя карт).
Для реализации варианта №2 необходимо подключить считыватель к машине, на которой происходит работа в редакторе карт и настроить данный считыватель в конфигураторе(рис.1), а также настроить маску (рис.2). Для примера, использовался бесконтактный считыватель EM-Marine.
Рис.1
Рис.2
Формула необходима, чтобы корректно обработать данные, записанные на карте. Примеры формул описаны в пункте 2 данной статьи.
1. Функции и операции
1.1. Базовые операции
Операция | Реализация |
---|---|
Арифметические | x + y , x - y , x * y, x / y, x ^ y |
Сравнение | x > y, x < y, x >= y, x <= y, x = y, x <> y |
Сравнение строк | s > t, s < t, s >= t, s <= t, s = t, s <> t |
Логические | (1/0) a AND b, a OR b, NOT(a), x in [...] // Пример: 12 in [22, 12, 3] |
1.2. Работа с переменными
Операция | Формула |
---|---|
Установка | x:=formula (or value); |
Уничтожение | FreeVar(s); //s = имя переменной |
Проверка существования | ExistVar(s) // s = имя переменной |
1.3. Преобразование из одного типа в другой
Функция | Пояснение | Пример |
---|---|---|
Logic(x) | Переводит значение x в логический тип (0 или 1) | Logic(0) = 0 или Logic(2) = 1 |
Numeric(s) | Переводит значение из строки в цифровой | Numeric("10.23") = 10.23 |
String(x) | Переводит значение из числа в строку | String(10.23) = "10.23" |
Char(x) | Переводит число в символ | Char(65) = "A" |
Ascii(s) | Переводит символ в число | Ascii("A") = 65 |
Eval(f) | Вычисляет формулу | Eval("2+1+4") = 7 |
NumBase(x, base) | Переводит число в строку в другой системе исчисления, где base - система исчисления от 2 до 16 | NumBase(254, 16) = "FE" |
BaseNum(s, base) | Функция обратная функции NumBase(x, base) |
1.4. Математические операции
x Div y целочисленное деление числа x на число y
x Mod y модуль от целочисленного деления числа x на число y
1.5. Математические функции
Abs(x) возвращает абсолютное значение числа x
Frac(x) возвращает дробную часть числа x
Trunc(x) отбрасывает дробную часть числа x
Sign(x) определяет знак числа Sign(0) = 0; Sign(2) = 1; Sign(-2) = -1
Sqrt(x) возвращает квадратный корень числа x
Ln(x) возвращает натуральный логарифм числа x
Exp(x) возвращает экспоненту степени x
Cos(x) возвращает косинус числа x
Ctg(x) возвращает котангенс числа x
Ch(x) возвращает гиперболический косинус числа x
Cth(x) возвращает гиперболический котангенс числа x
Sin(x) возвращает синус числа x
Sh(x) возвращает гиперболический синус числа x
Tg(x) возвращает тангенс числа x
Th(x) возвращает гиперболический тангенс числа x
ArcSin(x) возвращает арксинус числа x
ArcCos(x) возвращает арккосинус числа x
ArcTg(x) возвращает арктангенс числа x
ArcCtg(x) возвращает аркотангенс числа x
MaxVal(x [,y, ...]) возвращает максимальное число из списка MaxVal(1,2,3,4,0,7+2,2) = 9
MinVal(x [,y, ...]) возвращает минимальное число из списка MinVal(1,2,3,4,0,-5,2) = -5
SumVal(x [,y, ...]) возвращает сумму списка SumVal(1,2,3,4,0,7,2) = 19
AvgVal(x [,y, ...]) возвращает среднее значение чисел из списка AvgVal(1,2,3,4,0,7,2) = 2.714
1.6. Операции со строками
s || t конкатенация строк
s Like t определяет есть ли подстрока в строке (%,_) "www.tsoft.szm.com" Like "%szm%" = "1"
s Wildcard t определяет подходит ли маска (*,?) "jan.tungli@seznam.cz" Wildcard "*@*.?z" = "1"
1.7. Функции работы со строками
Length(s) возвращает длину строки
Pos(t, s) возвращает позицию вхождения подстроки t в строке s
Trim(s) удаляет пробельные символы в начала и в конце строки
TrimLeft(s) удаляет пробельные символы в начале строки
TrimRight(s) удаляет пробельные символы в конце строки
Upper(s) переводит строку в верхний регистр
Lower(s) переводит строку в нижний регистр
Copy(s, x, [y]) копирует из строки s символы с позиции x, если задано значение y, то копирует только y символов
CopyTo(s, x, [y]) копирует из строки s символы с позиции x, если задано значение y, то копирует только до символа в позиции y
Delete(s, x, [y]) удаляет из строки s символы с позиции x, если задано значение y, то удаляет только y символов
Insert(s, t, x) вставляет в строку s подстроку t в позиции x
IFF(a, s, t) ветвление, если a>=1 возвращается значение s иначе - t
Replace(s, t, v, заменяет в строке s подстроку t на подстроку v,
[1/0=ReplaceAll, если указан параметр ReplaceAll=1, то заменяет все найденные подстроки t на подстроку v,
[1/0=IgnoreCase]]) если задан параметр IgnoreCase=1, то при поиске подстроки t регистр учитываться не будет
1.8. Функции работы с датой и временем
Year(s) возращает год Year("2008/03/20") = 2008
Month(s) возращает месяц Month("2008/03/20") = 3
Day(s) возращает день Day("2008/03/20") = 20
WeekDay(s) возращает день недели WeekDay("2008/03/20") = 4
Hour(s) возращает час Hour("23:55:34") = 23
Minute(s) возращает минуты Minute("23:55:34") = 55
Sec(s) возращает секунды Sec("23:55:34") = 34
StrToStamp(d) преобразует строковое представление даты и времени в числовое
StampToStr(x) преобразует числовое представление даты и времени в строковое
StampToDateStr(x) преобразует числовое представление даты в строковое
StampToTimeStr(x) преобразует числовое представление времени в строковое
Date возвращает текущую дату
Time возвращает текущее время
Now возвращает текущую дату и время
2. Примеры формул
Пример 1. Нужно настроить использование карт, которые раньше определялись маской 778=99999998=####
В строке формула в конфигураторе (см. рис.1) надо написать такое выражение: =Numeric(IFF(Copy(Value, 5, 8) = "99999998", Copy(Value, 14, 4), "0"))
Если с карты считается код, например 778=12345678=0102, то результатом вычисления будет 0, а если считается код 778=99999998=1234, то результатом вычисления будет 1234.
Если код карты после вычисления будет 0, то это значит, что карта не определена.
Ниже два примера для преобразования данных с карт бесконтактными считывателями.
Пример 2. Использование сложных формул. Вычисление идет слева направо.
=v1:=Pos("] ",Value);v2:=Copy(Value,v1+2,255);v1:=Pos(",",v2); v3:=Copy(v2,1,v1);v4:=Copy(v2,v1+1,255);Numeric(v3+v4)
Пример 3. Преобразование шестнадцатиричного вида в десятичный.
=V1:=String(BaseNum(Copy(Value, 1, 2), 16));V2:=String(BaseNum(Copy(Value,3,4), 16));V2:=IFF(Length(V2) < 5, "0"||V2, V2);V2:=IFF(Length(V2) < 5, "0"||V2, V2);V2:=IFF(Length(V2) < 5, "0"||V2, V2);V2:=IFF(Length(V2) < 5, "0"||V2, V2);result:=Numeric(V1 || V2)
Маска: 778=199999999=########
3. Работа со считывателем СРЧ-125 фирмы UCS
Пример считывателя и карты.
Рис.3
Настраиваем в конфигураторе считываетель (указываем № COM-порта, скорость и код организации (необязательно), см.рис.4) и маску (см. рис. 5).
Рис.4 Настройка считывателя
Прописываем маску в виде формулы, например: =V:=Value;V:=Delete(V,1,Pos("=",V));V:=Delete(V,1,Pos("=",V));result:=Numeric(V) или маски, например: 778=199990099=#######.
Данная формула выделяет подстроку (после 2-го знака "=") в строке (параметр Message** в лог-файле) после преобразования данных с карты, т.е. возвращает номер карты. При применении формулы код организации(см.рис.4) можно не указывать.
Маска так же возвращает номер карты, но число знаков "#" должно соответствовать числу цифр в серии карт (см.рис.3, первая группа цифр).
Проанализировать работу драйвера можно по записям в лог-файле iod_MCR_Serial.01.log после прикладывания карты к считывателю при запущенном Редакторе карт.
14.05.2014 15:23:23.355> Enable Reader
14.05.2014 15:23:24.261> Buffer : 750=2364000162753731310 // прошито на карте (можно проверить с помощью утилиты HyperTerminal)
14.05.2014 15:23:24.261> Message : 778=199990099=1702866 // ** 199990099 - код организации (прописывается в свойствах драйвера, см.рис.4); 1702866 - номер карты (результат преобразования 750=2364000162753731310)
Рис.5 Настройка маски
4. Работа со считывателем RFID RDM530
Для данного устройства написан специальный драйвер (прикреплен к статье). Для работы данного считывателя достаточно подкинуть данный драйвер и настроить в конфигураторе маску =Numeric(Value)