XFS-сервис класса CDM. Модель LG ezCDM-3200¶
Реализация сервис-провайдера XFS соответствует версии 3.00 CEN/XFS для сервиса CDM.
Файлы¶
shqPS.CDM.ez3200.exe;
shqSPCDM.dll.
Настройки XFS-провайдера¶
Все нижеперечисленные настройки хранятся в файле конфигурации ez3200_configuration.xml в каталоге установки физического сервиса. Файл содержит информацию в представлении XML, например:
<?xml version="1.0" encoding="windows-1251" ?>
<CDMSettings>
<package capacity="100"/><!-- Емкость пачки банкнот -->
<MaxRetract val="31" /><!-- Максимум ретрактов -->
<MaxReject val="12" /><!-- Максимум реджектов -->
<DispenseSmartRetryMode val="true" />
<exp_table> <!-- Таблица валютных экспонент -->
<currency id="RUR" exp="0"/>
<currency id="EUR" exp="1"/>
<currency id="USD" exp="0"/>
</exp_table>
<cassettes> <!-- Настройка длины и плотности банкнот -->
<cassette length="92" thickness="30"/>
<cassette length="92" thickness="35"/>
<cassette length="92" thickness="40"/>
</cassettes>
</CDMSettings>
package capacity — максимальная емкость пачки банкнот. В соответствии с аппаратными ограничениями не рекомендуется вставлять больше 100 банкнот. При необходимости данное значение может быть изменено в интервале от
0
до100
.MaxRetract — максимум ретрактов, т.е. количество ретрактов, по достижении которого RETRACT-кассета перейдет в состояние FULL.
MaxReject — максимальное количество rejected-банкнот, по достижении которого REJECT-кассета перейдет в состояние FULL.
DispenseSmartRetryMode — режим DISPENSE SMART RETRY (см. WFS_CMD_CDM_DISPENSE).
exp_table — таблица валютных экспонент. Значение данного параметра используется для предоставления в рамках информационного запроса WFS_INF_CDM_CURRENCY_EXP.
cassettes — настройка длины и плотности банкнот. На устаревших прошивках, отсутствует функция трассировки параметров банкнот. Требуется ручная установка данной функции. Необходимо указать плотность (thickness) и вертикальную длину (length). Для каждой кассеты, характеристики банкнот описываются в файле конфигурации ez3200_configuration.xml.
Обработка ошибок в конфигурационном обеспечении¶
В случае испорченных данных в файлах конфигурации, предусмотрена следующая реакция ПО:
запросы WFS_INF_CDM_STATUS и WFS_INF_CDM_CAPABILITIES отрабатываются в полной мере, с учетом всех ошибок в файлах конфигурации + в дополнение генерируется событие WFS_SYSE_SOFTWARE_ERROR;
остальные запросы завершаются с кодом WFS_ERR_SOFTWARE_ERROR.
Память кассет¶
Исходные данные:
Cashout-кассеты оснащены внутренней памятью (EPROM), которую можно использовать для хранения ниже следующей информации:
идентификатор кассеты cUnitID[5];
идентификатор валюты cCurrencyID[3];
номинал [4 байта];
reference values (length/thickness).
Решаемые задачи:
размещение в EPROM + дальнейшее использование результатов калибровки (reference values);
хранение данных о номиналах непосредственно в кассете,
с целью предотвращения выдачи банкнот одного достоинства под видом другого (такое может произойти в случае некорректного размещения кассет по позициям в ходе проведения инкассации).
В силу алгоритмической и понятийной, сложности мы не будем решать задачи:
автоматического изменения привязок физических кассет;
автоматической смены номинала логической кассеты на основе содержимого EPROM вновь предъявленной физической.
Причины:
На уровне XFS-сервиса, невозможно выявить различие между операцией инкассации и операцией конфигурирования: обе решаются командами START_EXCHANGE и END_EXCHANGE.
Возможны коллизии при расхождении количества логических и физических кассет. В качестве неудачного примера таких манипуляций со структурой кассет можно упомянуть реализацию сервиса WN.prodevice.CDM – попытка решить задачу автоматической настройки, зачастую приводит к возникновению «фантомных» кассет.
Реализация:
Структура кассет (привязки + номинал) остается в неизменном виде: данные хранятся в xml-файле и модифицируются только клиентским ПО (в ходе исполнения команды END_EXCHANGE). Привязка физических кассет, как и прежде, осуществляется по номеру позиции.
По завершении операции калибровки, в EPROM физической кассеты вписывается номинал логической кассеты и reference values: length и thickness.
Вносим изменение в алгоритм вычисления статусов физических кассет. В каждый момент времени физическая кассета pcu, привязанная (через номер позиции) к логической кассете lcu и не содержащая в EPROM данных номинала или reference values (например, вновь вводимая в оборот) или содержащая в EPROM номинал, отличный от номинала логической кассеты, получает статус NOREF. Данный статус обязывает произвести калибровку кассеты. Без проведения калибровки, выдача из кассеты со статусом NOREF невозможна.
Эффект:
На этапе инкассации, если в позицию с ожидаемым номиналом (определяется логической кассетой), ошибочно вставить физическую кассету, EPROM которой содержит иной номинал, то она получит статус NOREF.
На этапе конфигурирования, кассеты, как это было описано выше, получают статус NOREF, и это, в свою очередь, не мешает успешному завершению операции. После этого — калибровка.
Калибровка, фактически, сводится к следующему:
замер эталонных значений length/thickness, запись их в EPROM;
запись в EPROM номинала логической кассеты, к которой привязана данная физическая.
Режим SkipCountersCheckWithinDenominateIndividual¶
Данный режим не учитывает показания счетчиков при индивидуальном наборе банкнот.
Текущие значения, сохраняющиеся при перезапуске драйвера (persistent values)¶
После перезапуска драйвера сохраняются:
настройки конфигурации кассет (currency, values, имена, привязки логических и физических кассет);
счетчики кассет (как логических, так и физических). Следует заметить, что аппарат ezCDM-3200 не имеет аппаратных счетчиков банкнот;
состояние последней выдачи (используется в WFS_INF_CDM_PRESENT_STATUS);
(+ дополняем) состояние EXCHANGE.
Все указанные данные хранятся в файле ez3200_persistents.xml в рабочем каталоге сервис-провайдера. Используется механизм защиты файла от несанкционированного изменения данных. В случае выявления модификаций, блокируется работа сервиса (статус fwDevice принимает значение WFS_CDM_DEVNODEVICE, генерируется событие WFS_SYSE_SOFTWARE_ERROR с подробным описанием причины блокировки).
Особенности реализации запросов и событий¶
Неподдерживаемые запросы¶
В связи с тем, что диспенсер является самообслуживаемым, исключаем поддержку Teller-функций WFS_INF_CDM_TELLER_INFO и WFS_CMD_CDM_SET_TELLER_INFO. На каждый из запросов, возвращаем WFS_ERR_UNSUPP_CATEGORY и WFS_ERR_UNSUPP_COMMAND соответственно.
Исключаем поддержку функций WFS_CMD_CDM_COUNT и WFS_CMD_CDM_OPEN_SAFE_DOOR. В обоих случаях, возвращаем WFS_ERR_UNSUPP_COMMAND.
В силу невостребованности функционала, связанного с таблицами разбивок номиналов «MIX TABLES», на запрос WFS_CMD_CDM_SET_MIX_TABLE всегда будет отвечать WFS_ERR_CDM_INVALIDMIXNUMBER.
Состав полей lpszExtra в ответах STATUS и CAPABILITIES¶
VENDOR =
DORS [SYSTEMA]
;PRODUCT =
ProAtm/Xfs
;CONFIGURATION_ERROR: описываются ошибки, выявленные в конфигурационном обеспечении ПО;
CDM_ERROR: уточняется состав ошибок оборудования CDM;
SIU_ERROR: уточняется состав ошибок контроллера спец. электроники;
FW_RELEASE: релиз прошивки (YY/MM/DD);
FW_FEATURES: поддержка функций
eprom
иcalibrate
.
Инициализация оборудования на момент старта сервис-провайдера¶
На момент старта сервис-провайдера, необходимо провести RETRACT. Если в презентере обнаружена оставленная пачка банкнот, осуществляем ее сброс в кассету RETRACT. В данной ситуации мы не в состоянии отвечать за состав пачки и проводить REJECT-операцию: мы не знаем, из каких кассет она была набрана, была ли в прямом доступе пользователя.
Политика проведения LOCK/UNLOCK по CASHOUT-кассетам¶
Будем подавать UNLOCK по всем CASHOUT-кассетам в момент отработки START_EXCHANGE. Будем подавать LOCK по всем задействованным CASHOUT-кассетам в момент отработки END_EXCHANGE. В случае обнаружения UNLOCKED-кассеты вне рамок транзакции EXCHANGE, принудительного запирания не осуществляем.
Трансляция статусов кассеты (применительно к LOCK/UNLOCK граничным состояниям):
Физ.состояние |
Exchange-сессия EXCHANGE IS NOT ACTIVE |
Exchange-сессия EXCHANGE IS ACTIVE |
---|---|---|
UNLOCKED |
STATE=MANIPULATED |
STATE=OK |
UNLOCKED+exchanged |
STATE=MANIPULATED |
STATE=NOVAL |
Состояние наполнения кассет OK/HIGH/LOW/EMPTY/FULL¶
Для логических CASHOUT кассет: актуально значение logical.ulMinimum. В случае, если значение ненулевое, по достижении счетчиком указанного значения, состояние кассеты изменяется на LOW.
Состояние EMPTY достигается двумя путями: при обнулении счетчика либо при окончании банкнот во всех физических кассетах при ненулевом счетчике.
Поле physical.ulMaximum не может быть установлено приложением, не используется для вычисления статуса кассеты и носит исключительно информационный характер.
Для логических RETRACT/REJECT кассет: актуально значение logical.ulMaximum. Устанавливается прикладным уровнем. В случае если оно ненулевое, по достижении счетчиком указанного значения, состояние кассеты изменяется на HIGH. Состояние FULL достигается двумя путями: фиксирование FULL при достижении счетчиками конфигурационных максимумов (ez3200_configuration.xml: элементы MaxRetract, MaxReject), либо при заполнении всех физических кассетах.
Поле physical.ulMaximum не может быть установлено приложением, не используется для вычисления статуса кассет и носит чисто информационный характер: в нашем случае, оно будет дублировать конфигурационные максимумы, по которым вычисляются статусы FULL.
Физические кассеты RT/RJ не имеют состояний HIGH/LOW: только OK/EMPTY/FULL. Физические кассеты CASHOUT, при соответствующей опции компиляции, могут отражать состояние NEAR EMPTY в XFS-статус LOW.
Структура RETRACT и REJECT-кассет¶
Аппарат ezCDM-3200 оснащен одной физической REJECT-кассетой с двумя отсеками: в первый отсек попадают все отвергнутые в процессе набора банкноты, во второй — сброшенные с BUNDLE PRESENTER-а. В силу того, что в общем случае требуется статистически разделять деньги, которые были оставлены клиентом (RETRACTED) и деньги банка (REJECTED на этапе набора, а также REJECTED со стэкера), предлагается разделить RETRACT-кассету на три условных отсека:
REJECT_rejected. Отбракованные банкноты. Физический отсек #1, логическая REJECT-кассета;
RETRACT_rejected. Банкноты, отправленные в REJECT -кассету по команде REJECT. Физический отсек #2, логическая REJECT-кассета;
RETRACT_retracted. Банкноты, отправленные в REJECT -кассету по команде RETRACT. Физический отсек #2, логическая RETRACT-кассета.
Вычисление кумулятивного статуса логической кассеты¶
В случае если логическая кассета состоит более чем из одной физической, статус кассеты вычисляется следующим образом:
если статус хотя бы одной физической кассеты — OK, вычисляем общий статус логической кассеты, как OK с поправкой на HIGH/LOW;
иначе, если статус хотя бы одной физической кассеты — FULL/EMPTY, используем как общий статус логической кассеты;
иначе, если статус хотя бы одной физической кассеты — NOVAL, используем как общий статус логической кассеты;
иначе, если статус хотя бы одной физической кассеты — NOREF, используем как общий статус логической кассеты;
иначе, если статус хотя бы одной физической кассеты — MANIP, используем как общий статус логической кассеты;
иначе, если статус хотя бы одной физической кассеты — MISSING, используем как общий статус логической кассеты;
иначе, записываем статус INOP.
Поправка для логической REJECT-кассеты: общее состояние FULL записывается в случае достижения данного состояния одной из двух физических REJECT-кассет.
Дополнительная информация о полях¶
- WFSCDMCASHUNIT
Структура WFSCDMCASHUNIT используется для предъявления характеристик/состояния отдельной логической кассеты в рамках операций и событий:
WFS_CMD_CDM_SET_CASH_UNIT_INFO;
WFS_INF_CDM_CASH_UNIT_INFO;
WFS_CMD_CDM_START_EXCHANGE;
WFS_CMD_CDM_END_EXCHANGE;
WFS_SRVE_CDM_CASHUNITINFOCHANGED;
WFS_USRE_CDM_CASHUNITTHRESHOLD;
WFS_EXEE_CDM_CASHUNITERROR.
WFSCDMCASHUNIT:
Поле
Комментарий
usNumber
1
— RETRACT,2
— REJECT,3
..N
— CASHOUT-кассеты.fixed
usType
в соответствии со спецификацией.
fixed
lpszCashUnitName
фиксированные значения:
RETRACTBOX
,REJECTBOX
,CASHOUTn
.fixed
cUnitID
значение устанавливается на прикладном уровне.
var
cCurrencyID
значение имеет смысл только для CASHOUT-кассет. Устанавливается на прикладном уровне.
var
ulValues
значение имеет смысл только для CASHOUT-кассет. Устанавливается на прикладном уровне.
var
ulInitialCount
значение устанавливается на прикладном уровне.
var
ulCount
текущее количество банкнот/ретрактов в кассете. Устанавливается (либо для RETRACT/REJECT – сбрасывается в ноль) прикладным уровнем. Инкрементируется/декрементируется сервисом в соответствии со спецификацией. Соответствует сумме ulCount по физическим кассетам.
var
ulRejectCount
значение имеет смысл только для CASHOUT-кассет. Сбрасывается в ноль прикладным уровнем. Инкрементируется сервисом в соответствии со спецификацией.
var
ulMinimum
значение имеет смысл только для CASHOUT-кассет. По достижении счетчика ulCount данного значения, кассета получает статус LOW. Если установлено значение 0, состояние LOW будет выставляться по LOW-состояниям физических кассет.
var
ulMaximum
значение имеет смысл только для REJECT/RETRACT кассет. По достижении счетчика ulCount данного значения, кассета получает статус HIGH.
var
bAppLock
значение имеет смысл только для CASHOUT-кассет.
var
usStatus
вычисляется сервисом.
usNumPhysicalCUs
для RETRACT — строго
1
, для REJECT — строго2
.WFSCDMCASHUNIT.lppPhysical[i]:
Поле
Комментарий
lpPhysicalPositionName
REJECT
— физический отсек RETRACT, подсчет retracted-денег;REJECT
— физический отсек RETRACT, подсчет rejected-денег (по команде REJECT);REJECT
— физический отсек REJECT, подсчет rejected-денег на этапе отбраковки (в рамках отработки DESPENSE);CASHOUTn
, n = 1..6 — физические CASHOUT-кассеты. Единице соответствует самая верхняя.cUnitID
значение устанавливается на прикладном уровне (для RETRACT/REJECT кассет — дублируется значение cUnitID логической кассеты).
ulInitialCount
для CASHOUT-кассет — значение используется и может быть любым. Для RETRACT/REJECT кассеты — дублируется значение ulInitialCount логической кассеты.
ulCount
текущее количество банкнот/ретрактов в кассете. Не поддерживается особенность данного счетчика, оговоренного спецификацией: If the fields ulCount, and ulRejectCount of lppPhysical are set to 0 by command END EXCHANGE / SET CASH UNIT INFO, the application is indicating that it does not wish counts to be maintained for the physical cash units.
ulRejectCount
для CASHOUT-кассет — количество банкнот из данного модуля,находящиеся в REJECT-отсеке.
ulMaximum
для CASHOUT-кассет не имеет смысла. Фиксированное значение — здесь записываются конфигурационные максимумы REJECT/RETRACT кассет, определяющие состояние
FULL
.usPStatus
вычисляется сервисом. Примечание для cashout — принимает значение EMPTY только в случае аппаратного состояния EMPTY (нулевое значение программного счетчика не влияет на статус физической кассеты).
bHardwareSensor
всегда
TRUE
.- WFS_INF_CDM_STATUS
Поле fwDevice:
Состояние
Комментарий
WFS_CDM_DEVONLINE
устройство готово.
WFS_CDM_DEVOFFLINE
буквально в соответствии со спецификацией: the operator has taken the device offline by pulling it out. При прочих работоспособных условиях, данное состояние выставляется в том случае, если оператор выдвигает диспенсер из сейфа. В данном состоянии доступны: все INF-операции, а также операции инкассации START/END EXCHANGE и операция DENOMINATE. По остальным операциям сообщается WFS_ERR_DEV_NOT_READY.
WFS_CDM_DEVPOWEROFF
выставляется в случае потери связи с модулем CDM (таймауты при опросе статуса), в случае изначальной невозможности открыть COM-порт, к которому подключен CDM, в случае потери связи с сервисом SIU.
WFS_CDM_DEVNODEVICE
буквально в соответствии со спецификацией: The device is not intended to be there, e.g. this type of self service machine does not contain such a device or it is internally not configured.
WFS_CDM_DEVHWERROR
механическая неисправность одного из узлов сервиса, препятствующая дальнейшей работе устройства: CDM либо SIU. В случае ошибки конфигурационного либо внешнего информационного обеспечения (в частности, НСД в отношении файла, содержащего persistent values), выставляется данное состояние. Разрешены только две INF-операции: STATUS и CAPABILITIES. В extra-поле в ответе STATUS, под ключом CONFIGURATION_ERROR записывается причина, повлекшая переход в данное состояние. При попытке исполнить любую другую операцию, возвращается WFS_ERR_SOFTWARE_ERROR. Любой запрос к сервису сопровождается генерацией события WFS_SYSE_SOFTWARE_ERROR.
WFS_CDM_DEVUSERERROR
не поддерживается.
WFS_CDM_DEVBUSY
устройство в состоянии инициализации (в момент запуска), либо занято отработкой CMD-запроса. Любые CMD-запросы, требующие эксклюзивного доступа к аппаратному обеспечению, ставятся в очередь на исполнение, остальные запросы (такие как INF-STATUS и пр.) исполняются немедленно. В ходе инициализации, CMD-запросы отвергаются с кодом ошибки WFS_ERR_DEV_NOT_READY.
Поле fwSafeDoor:
Состояние
Комментарий
WFS_CDM_DOOROPEN
дверь сейфа открыта. В данном состоянии запрещены операции набора и выдачи наличных.
WFS_CDM_DOORCLOSED
дверь сейфа закрыта.
WFS_CDM_DOORUNKNOWN
в силу поломки/недоступности сервиса SIU, невозможно определить состояние двери.
WFS_CDM_DISPOK
все кассеты в состоянии OK. Набор и выдача разрешены.
WFS_CDM_DISPCUSTATE
одна или несколько кассет имеют состояние, отличное от OK. Набор и выдача разрешены.
WFS_CDM_DISPCUSTOP
все CASHOUT-кассеты имеют состояние EMPTY или «хуже», либо одна из RT/RJ кассет имеет состояние FULL. Набор и выдача запрещены.
WFS_CDM_DISPCUUNKNOWN
в силу поломки/недоступности аппарата CDM, невозможно определить состояние.
Поле fwIntermediateStacker:
Состояние
Комментарий
WFS_CDM_ISEMPTY
в состоянии выдачи EMPTY и PRESENTED.
WFS_CDM_ISNOTEMPTY
в состоянии выдачи DISPENSED.
WFS_CDM_ISNOTEMPTYCUST
в состоянии выдачи RETRACTED_SA.
WFS_CDM_ISUNKNOWN
в силу поломки/недоступности аппарата CDM (или отдельно модуля BUNDLE PRESENTER) невозможно определить состояние.
Поле lppPositions[0] -> fwShutter:
Состояние
Комментарий
WFS_CDM_SHTOPEN
шаттер открыт.
WFS_CDM_SHTCLOSED
шаттер закрыт.
WFS_CDM_SHTUNKNOWN
в силу поломки/недоступности сервиса SIU (или отдельно контроллера шаттера) невозможно определить состояние.
Поле lppPositions[0] -> fwPositionStatus:
Состояние
Комментарий
WFS_CDM_PSEMPTY
в состояниях выдачи, отличных от PRESENTED.
WFS_CDM_PSNOTEMPTY
в состоянии выдачи PRESENTED.
WFS_CDM_PSUNKNOWN
в силу поломки/недоступности аппарата CDM (или отдельно модуля BUNDLE PRESENTER) невозможно определить состояние.
Поле lppPositions[0] -> fwTransport:
Состояние
Комментарий
WFS_CDM_TPOK
состояние транспорта OK. Только в этом случае, значение поля fwTransportStatus содержит актуальное значение.
WFS_CDM_TPINOP
состояние CDM в целом, OK, однако BUNDLE PRESENSER, по совокупности датчиков/статусов имеет ABNORMAL состояние.
WFS_CDM_TPUNKNOWN
в силу поломки/недоступности аппарата, невозможно определить состояние.
Поле lppPositions[0] -> fwTransportStatus
Состояние
Комментарий
WFS_CDM_TPSTATEMPTY
в состоянии выдачи EMPTY и RETRACTED_SA.
WFS_CDM_TPSTATNOTEMPTY
в состоянии выдачи DISPENSED.
WFS_CDM_TPSTATNOTEMPTYCUST
в состоянии выдачи PRESENTED.
- WFS_INF_CDM_PRESENT_STATUS
Информация по полям lpDenomination -> lpulValues представлена по состоянию, актуальному на момент проведения выдачи (порядок следование логических кассет). В частности, если после выдачи провести реконфигурирование кассет (END_EXCHANGE), в ходе которого перепутать ранее установленные номиналы,вычисленная сумма по lpDenomination -> lpulValues будет отличаться от реально выданной. В действительности, потребность в применении WFS_INF_CDM_PRESENT_STATUS для выяснения состава последней выдачи, проведенной до реконфигурирования кассет, видится сомнительной. В случае если на вход подается неподдерживаемая позиция (любая позиция, отличная от
NULL
илиFRONT
), завершается с результатом WFS_ERR_CDM_UNSUPPOSITION.
События CASHUNIT: THRESHOLD и INFOCHANGED¶
События THRESHOLD и INFOCHANGED по кассетам генерируются в следующих случаях:
в ходе фонового опроса состояния оборудования (изменения usStatus/usPStatus полей, в т.ч. переходы через THRESHOLD-значения usStatus);
при завершении END EXCHANGE (отслеживаются изменения всех полей, вместо THRESHOLD-событий, генерируются INFOCHANGED);
при завершении SET CASHUNIT INFO (отслеживаются изменения всех полей, вместо THRESHOLD-событий, генерируются INFOCHANGED);
при завершении CALIBRATE;
при достижении счетчиками кассет соответствующих пороговых значений (в рамках исполнения DISPENSE, PRESENT, RETRACT, REJECT, TEST).
Команды¶
- WFS_CMD_CDM_START_EXCHANGE
Для проведения инкассации, требуется, чтобы оборудование было в состоянии fwDevice =
ONLINE
илиOFFLINE
.Дополнительно: если состояние выдачи отлично от EMPTY или RETRACTED_SA, то возвращается код ошибки WFS_ERR_DEV_NOT_READY.
В соответствии со спецификацией, один из указанных usNumber содержит идентификатор несуществующего модуля, то отправляется событие WFS_EXEE_CDM_CASHUNITERROR, в аргументах которого:
WFSCDMCUERROR.wFailure =
WFS_CDM_CASHUNITINVALID
;WFSCDMCUERROR.lpCashUnit =
0
.
Примечание
Приложение CDM300.exe от WN при получении события WFS_EXEE_CDM_CASHUNITERROR с нулевым lpCashUnit, аварийно завершается (ошибочная отработка результата).
В ходе отработки запроса START EXCHANGE, сервис разблокирует все физические кассеты, установленные на диспенсере, независимо от кассет, указанных в WFSCDMSTARTEX.lpusCUNumList.
В случае неуспешной разблокировки одной или нескольких кассет отправляется событие WFS_EXEE_CDM_CASHUNITERROR, в аргументах которого:
WFSCDMCUERROR.wFailure =
WFS_CIM_CASHUNITERROR
;WFSCDMCUERROR.lpCashUnit — логическая кассета, повлекшая ошибку.
Запрос в этом случае завершается с кодом ошибки WFS_ERR_CDM_CASHUNITERROR.
- WFS_CMD_CDM_END_EXCHANGE
В рамках отработки данной команды:
безусловным образом, закрывается EXCHANGE сессия;
валидируются входные аргументы;
в случае успешной валидации, устанавливаются новые значения WFSCDMCUINFO;
блокируются все физические кассеты, фигурирующие в WFSCDMCUINFO.
Результат hResult вычисляется следующим образом:
WFS_SUCCESS, если все шаги пройдены успешно;
WFS_ERR_CDM_CASHUNITERROR, если входные параметры не прошли валидацию (по каждой логической кассете, содержащей невалидные данные) + в сопровождении события WFS_EXEE_CDM_CASHUNITERROR(wFailure= WFS_CDM_CASHUNITINVALID);
WFS_ERR_HARDWARE_ERROR, независимо от результатов валидации, если в ходе блокировки хотя бы одной кассеты произошла ошибка.
Валидация входных данных: lppList[0] — д.б. RETRACT-кассета
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
= 1. Строгое равенство.
usType
да
= WFS_CDM_TYPERETRACTCASSETTE. Строгое равенство.
lpszCashUnitName
игнорируется
cUnitID
любое
Значение используется и может быть любым.
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
да
Значение используется. Должно совпадать с суммой по физическим кассетам.
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
Значение используется и может быть любым.
bAppLock
игнорируется
usStatus
игнорируется
usNumPhysicalCUs
да
= 1. Строгое равенство.
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
любое
Значение используется и может быть любым
ulInitialCount
игнорируется
ulCount
любое
Значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
usPStatus
игнорируется
bHardwareSensor
игнорируется
Валидация входных данных: lppList[1] — д.б. REJECT-кассета
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
= 2. Строгое равенство.
usType
да
= WFS_CDM_TYPEREJECTCASSETTE. Строгое равенство.
lpszCashUnitName
игнорируется
cUnitID
любое
Значение используется и может быть любым.
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
да
Значение используется. Должно совпадать с суммой по физическим кассетам.
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
Значение используется и может быть любым.
bAppLock
игнорируется
usStatus
игнорируется
usNumPhysicalCUs
да
= 2. Строгое равенство.
Валидация входных данных: WFSCDMCASHUNIT.lppPhysical[2..N-1] — CASHOUT-кассеты
Общие требования и допущения:
должно быть представлено не менее одной логической cashout-кассеты;
представленные логические cashout-кассеты не должны иметь более чем одну связь с каждой из физических кассет;
не обязательно привязывание всех существующих физических кассет.
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
любое
Значение используется и может быть любым.
ulInitialCount
игнорируется
ulCount
любое
Значение используется и может быть любым.
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
WFSCDMCASHUNIT.lppPhysical[1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
любое
Значение используется и может быть любым.
ulInitialCount
игнорируется
ulCount
да
Значение используется и может быть любым.
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
3
..N
. Номера логических кассет должны следовать строго по порядку.usType
да
= WFS_CDM_TYPEBILLCASSETTE. Строгое равенство.
lpszCashUnitName
игнорируется
cUnitID
любое
Значение используется и может быть любым.
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
да
Проверяется строгое равенство сумме счетчиков по физическим кассетам.
ulRejectCount
да
Проверяется строгое равенство сумме счетчиков по физическим кассетам.
ulMaximum
игнорируется
ulMinimum
любое
Значение используется и может быть любым.
bAppLock
любое
Значение используется и может быть любым.
usStatus
игнорируется
usNumPhysicalCUs
да
>
0
. Список должен быть непустым.WFSCDMCASHUNIT.lppPhysical[0 .. usNumPhysicalCUs - 1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
да
Строго в диапазоне
CASHOUT1
..CASHOUTn
.cUnitID
любое
Значение используется и может быть любым.
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
любое
Значение используется и может быть любым, в т.ч. нулевым.
ulRejectCount
любое
Значение используется и может быть любым.
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
- WFS_CMD_CDM_SET_CASH_UNIT_INFO
В рамках отработки данной команды:
валидируются входные аргументы;
в случае успешной валидации, устанавливаются новые значения WFSCDMCUINFO.
Результат hResult вычисляется следующим образом:
WFS_SUCCESS, если все шаги пройдены успешно;
WFS_ERR_CDM_CASHUNITERROR, если входные параметры не прошли валидацию (по каждой логической кассете, содержащей невалидные данные) + в сопровождении события WFS_EXEE_CDM_CASHUNITERROR(wFailure = WFS_CDM_CASHUNITINVALID).
Примечание
Входной параметр LPWFSCDMCUINFO lpCUInfo может содержать выборочные модули, подлежащие обновлению. Связывающим полем служит usNumber.
Валидация входных данных: RETRACT-кассета
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
1
. Строгое равенство.usType
да
= WFS_CDM_TYPERETRACTCASSETTE. Строгое равенство.
lpszCashUnitName
игнорируется
cUnitID
игнорируется
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
да
Значение должно совпадать с суммой счетчиков по физическим кассетам
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
Значение используется и может быть любым.
bAppLock
любое
Значение используется и может быть любым.
usStatus
игнорируется
usNumPhysicalCUs
да
=
1
. Строгое равенство.WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
любое
Значение используется и может быть любым.
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
Валидация входных данных: usNumber = 2 : д.б. REJECT-кассета
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
2
. Строгое равенство.usType
да
= WFS_CDM_TYPEREJECTCASSETTE. Строгое равенство.
lpszCashUnitName
игнорируется
cUnitID
игнорируется
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
да
Значение должно совпадать с суммой счетчиков по физическим кассетам
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
Значение используется и может быть любым.
bAppLock
любое
Значение используется и может быть любым.
usStatus
игнорируется
usNumPhysicalCUs
да
=
2
. Строгое равенство.WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
Значение используется и может быть любым.
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
WFSCDMCASHUNIT.lppPhysical[1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
Значение используется и может быть любым.
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
Валидация входных данных: usNumber = 3..N : должны быть CASHOUT-кассеты
Общие требования и допущения:
структура логических кассет должна полностью совпадать с ранее установленной в рамках END EXCHANGE;
в случае расхождения количества логических кассет usCount с ранее установленным, возвращается код ответа WFS_ERR_INVALID_DATA.
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
3
..N
. Номера логических кассет должны следовать строго по порядку.usType
да
= WFS_CDM_TYPEBILLCASSETTE. Строгое равенство.
lpszCashUnitName
игнорируется
cUnitID
игнорируется
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
да
Проверяется строгое равенство сумме счетчиков по физическим кассетам.
ulRejectCount
да
Проверяется строгое равенство сумме счетчиков по физическим кассетам.
ulMinimum
любое
Значение используется и может быть любым
ulMaximum
игнорируется
bAppLock
любое
Значение используется и может быть любым.
usStatus
игнорируется
usNumPhysicalCUs
да
Количество физических кассет должно строго совпадать с ранее установленным.
WFSCDMCASHUNIT.lppPhysical[0 .. usNumPhysicalCUs - 1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
да
Строго в диапазоне
CASHOUT1
..CASHOUTn
.cUnitID
игнорируется
ulInitialCount
любое
Значение используется и может быть любым.
ulCount
любое
Значение используется и может быть любым.
ulRejectCount
любое
Значение используется и может быть любым.
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
- WFS_CMD_CDM_OPEN_SHUTTER
В любой момент времени, если спец.электроника доступна, мы, в соответствии со спецификацией, отрабатываем данную команду.
Примечание
В режиме EXCHANGE операция не разрешена (WFS_ERR_CDM_EXCHANGEACTIVE). Если состояние выдачи отлично от EMPTY, то операция не разрешена (WFS_ERR_CDM_SHUTTERNOTOPEN).
- WFS_CMD_CDM_CLOSE_SHUTTER
В любой момент времени, если спец.электроника доступна, мы, в соответствии соспецификацией, отрабатываем данную команду.
Примечание
В режиме EXCHANGE, операция не разрешена (WFS_ERR_CDM_EXCHANGEACTIVE). Если состояние выдачи отлично от EMPTY, то операция не разрешена (WFS_ERR_CDM_SHUTTERNOTCLOSED).
- WFS_CMD_CDM_DENOMINATE
Входные аргументы:
usMixNumber — WFS_CDM_INDIVIDUAL, либо один из поддерживаемых алгоритмов;
cCurrencyID[3] — значение » » (три пробела) или валюта по выдаваемой сумме ulAmount;
ulAmount — значение
0
или выдаваемая сумма;usCount — значение
0
или количество логических кассет;lpulValues — индивидуальная разбивка по логическим кассетам.
Общая валидация состояния/параметров:
если активна EXCHANGE сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE;
не допускается работа в случае сбойного состояния оборудования (в частности, для отработки разбивки, важно знать физические статусы кассет);
если usMixNumber не входит в подмножество поддерживаемых, то возвращается WFS_ERR_CDM_INVALIDMIXNUMBER;
если поле cCurrencyID содержит неподдерживаемую валюту, то возвращается WFS_ERR_CDM_INVALIDCURRENCY;
если входная структура содержит индивидуальную разбивку, в ее составе должно быть представлено не меньше одной банкноты, в противном случае будет возвращаться WFS_ERR_INVALID_DATA.
Предусмотрено три режима функционирования:
Подтверждение возможности набора суммы по индивидуально предоставленной разбивке.
{ usMixNumber = WFS_CDM_INDIVIDUAL; ulAmount = 0; cCurrencyID = " " или выдаваемая валюта; usCount != 0; lpulValues = индивидуальная разбивка. }
В случае если usCount и lpulValues не соответствуют структуре логических кассет, возвращается WFS_ERR_INVALID_DATA.
В случае, когда пачка к выдаче разбита по касетам, но выдана быть не может (в силу недостатка банкнот по указанным кассетам, или из-за того, что предпринимается выдача логических REJECT/RETRACT кассет), возвращается WFS_ERR_CDM_INVALIDDENOMINATION.
Если указанная разбивка может быть набрана, но из-за ограничения емкости выдаваемой пачки, не может быть выдана, возвращается WFS_ERR_CDM_TOOMANYITEMS.
Если задана определенная валюта разбивки cCurrencyID, а одна из кассет содержит валюту, отличную от указанной, возвращается WFS_ERR_CDM_NOCURRENCYMIX.
Подтверждение возможности набора суммы по индивидуально предоставленной разбивке с проверкой соответствия указанной сумме.
{ usMixNumber = WFS_CDM_INDIVIDUAL; ulAmount > 0 ; cCurrencyID != " "; usCount != 0; lpulValues = индивидуальная разбивка. }
Если указанная сумма не может быть набрана, возвращается WFS_ERR_CDM_NOTDISPENSABLE.
Дальнейшая процедура валидации — аналогично п.1, с добавлением проверки соответствия указанной сумме: если указанная сумма не совпадает с указанной разбивкой, возвращается WFS_ERR_CDM_INVALIDDENOMINATION.
Подтверждение возможности набора указанной суммы.
{ usMixNumber = {подмножество поддерживаемых разбивок}; ulAmount > 0 ; cCurrencyID = {поддерживаемая валюта}; usCount = 0; lpulValues = 0. }
Если usMixNumber не входит в подмножество поддерживаемых, возвращается WFS_ERR_CDM_INVALIDMIXNUMBER.
Если ulAmount = 0, возвращается WFS_ERR_INVALID_DATA.
Если cCurrencyID представлена значением » » (три пробела), возвращается WFS_ERR_INVALID_DATA.
Если cCurrencyID не входит в текущую конфигурацию кассет, возвращается WFS_ERR_CDM_INVALIDCURRENCY.
Если usCount отлично от нуля, возвращается WFS_ERR_INVALID_DATA.
Если указанная сумма не может быть набрана, возвращается WFS_ERR_CDM_NOTDISPENSABLE.
- WFS_CMD_CDM_DISPENSE
Специфика аппарата ezCDM-3200: в случае, если не удается полностью набрать указанную разбивку по кассетам (в силу досрочно закончившихся средств, расхождения программных счетчиков с реальными, большого числа реджектов в рамках транзакции и пр.), добрать деньги в стэкер, путем подачи очередной команды MOVE FORWARD — технически невозможно! Перед подачей команды MOVE FORWARD, стэкер должен быть пустым. Если стэкер не пустой, диспенсер автоматически сбрасывает его содержимое в RETRACT, и только после этого приступает к исполнению запроса.
Вводим настройку сервиса — флаг DISPENSE_SMART_RETRY_MODE, принимающий значения
TRUE
/FALSE
. В соответствии с настройкой, реализуем логику принятия решений, представленную в таблице:Значение «dispense smart retry mode»
Досрочное (непредвиденное) исчерпание банкнот в физической или логической кассете
TRUE
Если запрос DISPENSE не специфицирует строгую разбивку по кассетам, пытаемся провести повторную деноминацию. Если успешно – повторяем попытку набора (в общем случае, набор пойдет с участием других физических/логических кассет). Если разбивка строго специфицирована и повторная деноминация по ней не проходит – возвращаем ошибку CASH UNIT ERROR по сбойной логической кассете (+рассылаем соответствующее событие).
Повторный набор ВСЕГДА сопровождается сбросом предыдущей частично набранной пачки в RJ_RT отсек (технически: если набор осуществлен неуспешно, частично набранная пачка сразу же направляется в RJ_RT отсек).
В обоих случаях, по факту выхода кассеты из строя (EMPTY/INOP) — рассылка события INFO CHANGED.
FALSE
Возвращаем ошибку CASH UNIT ERROR по сбойной логической кассете (+генерируем соответствующее событие). По факту выхода кассеты из строя (EMPTY/INOP) — рассылка события INFO CHANGED.
Логические и физические счетчики кассет ulCount не могут принимать отрицательные значения. Если в ходе набора из кассеты будет получено большее количество банкнот, чем прописано в счетчике (такое может произойти, если часть банкнот отбраковывается), счетчик примет значение ноль.
Если на момент исполнения команды шаттер открыт, непосредственно перед набором банкнот, предпринимается попытка его закрытия: в случае ошибки, происходит досрочное завершение операции с кодом ошибки WFS_ERR_HARDWARE_ERROR.
Примечание
Аппарат ezCDM3200 не предоставляет динамическую информацию об отбраковываемых в ходе набора банкнотах. Кроме этого, невозможно получить информацию о причинах отбраковки. В силу этих двух причин, сервис не поддерживает генерацию событий WFS_EXEE_CDM_NOTEERROR.
- WFS_CMD_CDM_REJECT
Примечание
Аппарат ezCDM-3200 имеет особенность: если в процессе отработки команды RETRACT изъять RETRACT-кассету, результат операции будет успешный. Отследить факт изъятия невозможно.
Проверка состояния среды исполнения (в порядке исполнения):
Если состояние выдачи отлично от DISPENSED, то возвращается WFS_ERR_CDM_NOITEMS.
Если активна EXCHANGE-сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE.
Если состояние оборудования отлично от работоспособного, то возвращается соответствующий код ошибки. Коды ошибок размещены в XFS-спецификациях (APISPI.CWA15748.pdf).
Если состояние REJECT-кассеты отлично от работоспособного (OK/HIGH) — возвращается WFS_ERR_CDM_CASHUNITERROR в сопровождении с соответствующим событием.
Если проверка пройдена успешно, предпринимается попытка провести операцию RETRACT. Специфика начисления счетчиков:
REJECT.ulCount — начисляется только в случае успешного проведения RETRACT’а или, если возникла аппаратная ошибка, связанная с невозможностью закрыть крышку RETRACT-кассеты.
CASHOUT(i).ulRejectCount — Reject-cсчетчики CASHOUT-кассет начисляются независимо от исхода операции REJECT, в т.ч. если произошла аппаратная ошибка в ходе исполнения.
- WFS_CMD_CDM_PRESENT
Проверка состояния среды исполнения (в порядке исполнения):
Если состояние выдачи отлично от DISPENSED или RETRACTED_SA, то возвращается WFS_ERR_CDM_NOITEMS.
Если активна EXCHANGE-сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE.
Если шаттер на момент подачи запроса находится в открытом состоянии, возвращается код ошибки WFS_ERR_CDM_SHUTTEROPEN.
Если состояние оборудования отлично от работоспособного, возвращается соответствующий код ошибки.
Если проверка пройдена успешно, предпринимается попытка провести операцию выдачи.
- WFS_CMD_CDM_RETRACT
Примечание
Аппарат ezCDM-3200 имеет особенность: если в процессе отработки команды RETRACT изъять RETRACT-кассету, результат операции будет успешный. Отследить факт изъятия невозможно.
Валидация входных аргументов описана в таблице:
Параметр
Исходное состояние выдачи PRESENTED
Исходное состояние выдачи RETRACTED_SA
fwOutputPosition
Cодержит корректное значение позиции выдачи: NULL либо FRONT. Если условие не выполняется, то код ошибки — WFS_ERR_CDM_UNSUPPOSITION.
Игнорируется
usRetractArea
Содержит значение WFS_CDM_RA_RETRACT или WFS_CDM_RA_STACKER. Если условие не выполняется, то код ошибки — WFS_ERR_CDM_NOTRETRACTAREA.
Содержит значение WFS_CDM_RA_RETRACT. Если содержит значение WFS_CDM_RA_STACKER, то возвращается код ошибки WFS_ERR_CDM_NOITEMS. Для остальных неподдерживаемых позиций код ошибки — WFS_ERR_CDM_NOTRETRACTAREA.
usIndex
Игнорируется
Игнорируется
Проверка состояния среды исполнения (в порядке исполнения):
Если состояние выдачи отлично от PRESENTED или RETRACTED_SA, то возвращается WFS_ERR_CDM_NOITEMS.
Если активна EXCHANGE-сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE.
Если состояние оборудования отлично от работоспособного, возвращается соответствующий код ошибки.
В случае RETRACT’а в кассету, проверка доступности кассеты.
Ход исполнения операции приведен в таблице:
PRESENTED -> LRETRACT:
Перемещение BP в позицию HOME.
Закрытие шаттера.
*Изменение состояния выдачи на RETRACTED_SA.
Сброс банкнот в RETRACT.
**Изменение состояния выдачи на EMPTY, инкремент счетчика RETRACT-кассеты.
* После закрытия шаттера анализируется датчик банкнот стэкера. В случае значения EMPTY, считается, что клиент удержал банкноты на момент проведения RETRACT’а: операция завершается с кодом ошибки WFS_ERR_CDM_ITEMSTAKEN.
** Только в случае успешного сброса банкнот в RETRACT.
PRESENTED -> STACKER:
Перемещение BP в позицию HOME.
Закрытие шаттера.
*Изменение состояния выдачи на RETRACTED_SA.
* После закрытия шаттера анализируется датчик банкнот стэкера. В случае значения EMPTY, считается, что клиент удержал банкноты на момент проведения RETRACT’а: операция завершается с кодом ошибки WFS_ERR_CDM_ITEMSTAKEN, а состояние выдачи принимает значение EMPTY.
STACKER -> LRETRACT:
Сброс банкнот в RETRACT.
*Изменение состояния выдачи на EMPTY, инкремент счетчика RETRACT-кассеты.
* Только в случае успешного сброса банкнот в RETRACT.
- WFS_CMD_CDM_RESET
В силу специфики аппаратного обеспечения (в ходе проведения RESET, банкноты, обнаруженные на стэкере, сбрасываются в RETRACT-отсек), поддерживаются только RETRACT и REJECT позиции размещения обнаруженной во время исполнения запроса пачки банкнот.
Ход проведения операции следующий:
Если активна EXCHANGE сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE.
Запрос статусной информации CDM. В случае невозможности получить ответ, операция завершается с кодом ошибки WFS_ERR_HARDWARE_ERROR.
Запрос статусной информации SIU.
В случае расхождения реального состояния BUNDLE PRESENTER (наличие/отсутствие банкнот), а также открытого/закрытого состояния шаттера с текущим состоянием выдачи, осуществляется корректировка последней.
Если состояние выдачи —
EMPTY
, значения входных аргументов игнорируются.В случае если состояние выдачи отлично от ‘EMPTY’, проводится валидация входных аргументов usnumber/fwposition/lpretractarea на соответствие позиции назначения. В первую очередь, отсекаются невалидные и неподдерживаемые позиции (как то: OUT-позиции выдачи, CASHOUT-кассеты, и т.п. Поддерживаются только позиции REJECT и RETRACT/RETRACT_CASSETTE). Далее: если позиция, указываемая комбинацией значений противоречит состоянию выдачи (например, REJECT для банкнот, которые были в прямом доступе у клиента), возвращается WFS_ERR_CDM_INVALIDCASHUNIT + рассылается событие WFS_SRVE_CDM_MEDIADETECTED с пустым полем данных lpitemposition =
0
.Производится перемещение обнаруженных на стэкере банкнот в указанную позицию.
Если ранее перечисленные действия успешны, производится аппаратный сброс CDM.
По завершении операции, генерируется WFS_SRVE_CDM_MEDIADETECTED, если были обнаружены банкноты + с непустым полем данных lpitemposition, если банкноты были успешно помещены в конечную позицию.
Примечание
При использовании WN-утилиты CDM300.exe, следует учитывать, что при формировании команды WFS_CMD_CDM_RESET с проставленной в диалоговом окне опцией lpResetIn =
NULL
, реально готовится запрос с ненулевым указателем на структуру WFSCDMITEMPOSITION + со следующими значениями:usNumber:
0
;lpRetractArea:
NULL
;fwOutputPosition:
WFS_CDM_POSNULL (0x0000)
.
Легко заметить, что в ходе валидации, при непустом состоянии набора/выдачи, такой запрос будет отвергнут с соответствующим кодом ошибки.
- WFS_CMD_CDM_TEST_CASH_UNITS
Валидация входных аргументов и среды исполнения:
Если активна EXCHANGE сессия, запрос отклоняется с кодом ошибки WFS_ERR_CDM_EXCHANGEACTIVE.
Если состояние оборудования отлично от рабочего – возвращается соответствующий код ошибки.
Если текущее состояние набора/выдачи отлично от
EMPTY
, запрос отклоняется с кодом ошибки WFS_ERR_DEV_NOT_READY.Независимо от значений входных аргументов: если состояние REJECT либо RETRACT-кассеты отлично от OK/HIGH, возвращается код ошибки WFS_ERR_CDM_CASHUNITERROR.
Проверка состава входных аргументов на предмет валидных позиций перемещения набранных банкнот. Поддерживаются следующие позиции: usnumber =
0 [out position]
, usnumber =1
[retract –> retract cassette], usnumber =2
[reject — сброс успешно набранных банкнот в RETRACT-отсек логической REJECT-кассеты].Проверка состояния шаттера. В случае если незакрыт – предпринимается однократная попытка привести его в закрытое положение. В случае если это невозможно — соответствующий код ошибки.
Примечание
В случае отсутствующих входных аргументов, предусматривается отработка запроса с перемещением набранных банкнот в RETRACT-отсек логической REJECT-кассеты.
Ход проведения операции следующий:
Проход по всем логическим CASHOUT-кассетам. Если статус usstatus — OK или LOW, запоминаются все физические CASHOUT-кассеты, имеющие OK/LOW статусы. В противном случае (статус логической кассеты отличен от OK/LOW либо взведен флаг bapplock) — генерируется событие WFS_EXEE_CDM_CASHUNITERROR.
Возможно два варианта:
если список физических кассет, набранных на предыдущем шаге ненулевой, проводится набор из каждой кассеты по одной банкноте. В случае ошибки набора, генерируется событие WFS_EXEE_CDM_CASHUNITERROR, набор приостанавливается (в силу аппаратной специфики);
если список физических кассет пустой — операция досрочно завершается с кодом ошибки WFS_ERR_CDM_CASHUNITERROR.
В случае неполного набора, содержимое BUNDLE PRESENTER автоматически сбрасывается в RETRACT-отсек логической REJECT-кассеты (начиная с версии прошивки 08.08.14).
Результат операции определяется как WFS_SUCCESS только в том случае, если был произведен полный набор. В противном случае — WFS_ERR_CDM_CASHUNITERROR.
Примечание
Аналогично тому, как это происходит в рамках отработки DISPENSE, банкноты, слистываемые из CASHOUT-кассет в процессе TEST CASH UNITS, могут быть отбракованы и помещены в REJECT-отсек. Факт отбраковки одной или более банкнот, не является причиной неуспешности тестирования отдельно взятой физической кассеты, отбраковка банкнот не является причиной остановки тестирования кассет.
- WFS_CMD_CDM_CALIBRATE_CASH_UNIT
Данная операция завершается с кодом ошибки WFS_ERR_UNSUPP_COMMAND, если аппарат имеет устаревшую прошивку (до 15.03.2009).
Валидация входных аргументов и среды исполнения:
Если активна EXCHANGE сессия, запрос отклоняется с кодом ошибки WFS_ERR_CDM_EXCHANGEACTIVE.
Если состояние оборудования отлично от рабочего, то возвращается соответствующий код ошибки.
Если текущее состояние набора/выдачи отлично от
EMPTY
, то запрос отклоняется с кодом ошибки WFS_ERR_DEV_NOT_READY.Независимо от значений входных аргументов: если состояние REJECT либо RETRACT-кассеты отлично от
OK
/HIGH
, возвращается код ошибки WFS_ERR_CDM_CASHUNITERROR.Валидация входных аргументов: указанная логическая кассета должна иметь тип
CASHOUT
(в противном случае — код ошибки WFS_ERR_CDM_INVALIDCASHUNIT), статусOK
/LOW
(+ количество банкнот не меньше десяти) и не иметь взведенного флага блокировки bapplock. Позиция выдачи — строго REJECT-кассета. Данные, предъявленные в структуре WFSCDMITEMPOSITION, игнорируются. Количество банкнот usnumofbills игнорируется.В дополнение к специфицированным кодам ошибок проверяется состояние шаттера. Если шаттер не закрыт, то предпринимается однократная попытка привести его в закрытое положение. Если это невозможно, то возвращается соответствующий код ошибки.
Ход проведения операции следующий:
Калибровке подвергаются все работоспособные физические кассеты, входящие в состав указанной логической, независимо от того, имеют они статус NOREF или нет.
Фактическая калибровка банкнот осуществляется только начиная с прошивки ezcdm3200adv(0908russysa66).HEX и старше:
если список физических кассет, набранных на предыдущем шаге ненулевой, то независимо по каждой кассете проводится калибровка. Из каждой кассеты по очереди слистывается usnumofbills банкнот + с поправкой на попадание в диапазон [10..100]. Ошибки набора сопровождаются событиями WFS_EXEE_CDM_CASHUNITERROR;
если список физических кассет пустой, то операция досрочно завершается с кодом ошибки WFS_ERR_CDM_CASHUNITERROR.
По результатам: в каждую физическую кассету, в случае успешного проведения калибровки, записываются reference values, а также присваивается валюта соответствующей логической кассеты.