Назначение 

С версии decodecards.dll 1.29 доступен новый способ декодирования (выдержка из version.txt):
1. Добавлен новый алгоритм декодирования
  CardDecodeType = FastScript
  Алгоритм декодирования программируется в функции decodecard во внешнем файле, задаваемым параметром fsUnit в секции [frf].
  В секции [frf] появился параметр
    fsUnit=fsdecodecard.upas
Таким образом, появилась возможность максимально тонкой настройки принципов декодирования как для Абонемент-TCPCardReader так и для gkhostconnect-GKHOST.
 
Содержимое файла fsdecodecard.upas (болванка из поставки):
function fsUnitVersion:integer;
begin
  result := 1;
end;

function DecodeCard(Track:string; var Code:integer):string;
begin
  Result := Track;
end;

begin

end.
Т.е. при считывании идентификатора, для его декодирования будет вызвана функция DecodeCard() из данного файла.
 
Входные параметры функции:
Track - полный трек полученный от считывателя (типа string),
Code - код типа идентификатора (типа integer, подлежит изменению в теле функции);
Выходные параметры функции:
Result - номер идентификатора представленный строкой, после получения должен безошибочно конвертироваться в Int64 (типа string).
 
В файле скрипта доступны все функции доступные в печатных формах абонемента, что позволяет облегчить написание и отладку скрипта.
Пример печатной формы для тестирования разрабатываемого скрипта см. в приложениях к статье.
 
 

Пример

Пример скрипта декодирования для считывателя штрихкодов подключечённого к контроллеру UCS, для работы со штрихкодами абонементов, возвращающего контрольный символ штрихкода в виде "<контрольный_символ>F":
function fsUnitVersion:integer;
begin
  result := 1;
end;

function DecodeCard(Track:string; var Code:integer):string;
var                                         //Объявление локальных переменных
i,summa,ltt:integer;
ttr:string;                        
symbolz:array of string;                                                          
begin

ttr:=trim(Track);                          //Обрезание трека, в случае попадания пробелов в начало или конец
ltt:=Length(trim(Track));                  //Получение длины обрезанного трека
 

  if(Uppercase(Track)='F5012345678900')    //Проверка на совпадение со спец штрихкодом - картой полного доступа
  then 
  begin
  result:='5012345678900';                 //Возвращается номер карты полного доступа прописанный в gkhostconnect
  Exit;
  end;            
  if(not (Uppercase(Copy(ttr,ltt,1))='F'))  //Если последний символ полученного трека не "F", т.е. штрихкод считался без контрольного символа Code39
  then
   begin              
     if (Copy(ttr,ltt-2,3)=MDCHECKSUM(Copy(ttr,1,ltt-3),1)) //Сравниваем предпологаемую контрольную сумму абонемента с имеющейся в треке
     then result:=Copy(ttr,1,ltt-3)                         //Если совпадают, то возвращаем номер абонемента
     else result:=track;                                    //Если не совпадают, то возвращаем номер как есть (например, если штрихкод - идентификатор специалиста)  
   end               
  else                                      //Если последний символ полученного трека - "F", то сравниваем предпоследний с контрольным символом согласно гост на штрихкод Code39
   begin
      symbolz:=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','-','.',' ','$','/','+','%'];   //Таблица контрольных символов Code39
      i:=1; summa:=0;                 
      while (i<ltt-1) do                   //высчитываем данные для получения контрольного символа
      begin
        summa:=summa+strtoint(Copy(ttr,i,1));
        inc(i);                                
      end;
   if (Uppercase(Copy(ttr,ltt-1,1))=symbolz[(summa mod 43)])   //Производим сравнение символа полученного в треке и высчитанного контрольного символа
   then
   begin               
     if (Copy(ttr,ltt-4,3)=MDCHECKSUM(Copy(ttr,1,ltt-5),1))    //Если совпадают, сравниваем контрольную сумму абонемента
     then
     result:=Copy(ttr,1,ltt-5)                                //Если действительно, данный штрихкод -номер абонемента с контрольной суммой абонемента и с контрольным символом Code39, возвращаем номер абонемента
     else
     result:=Copy(ttr,1,ltt-2)                                //Иначе возвращаем номер как есть, без контрольного символа Code39 (например, если штрихкод - идентификатор специалиста)
   end                  
   else             
   result:='0';                                              //Если контрольный символ не совпадает с рассчитаным по госту, возвращаем пустой трек (пресекаем дальнейшую обработку)                         
   end;
   
end;

begin

end.
 
ВложениеРазмер
Печатная форма для отладки разрабатываемого скрипта декодирования1.63 КБ