XFS-сервис класса CDM. Модель Talaris NMD100¶
Файлы¶
shqPS.CDM.NMD100.exe;
shqSPCDM.dll.
Настройки XFS-провайдера¶
Все нижеперечисленные настройки хранятся в файле конфигурации nmd100_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="RUB" exp="0"/>
<currency id="EUR" exp="1"/>
<currency id="USD" exp="0"/>
</exp_table>
<items> <!-- Конфигурируемые аппаратные настройки NMD100 -->
<item no="104" value="100" />
<item no="201" value="2" />
<item no="223" value="0" />
<item no="225" value="1" />
<item no="233" value="2000" />
<item no="235" value="2" />
<item no="241" value="0" />
<item no="249" value="0" />
<item no="399" value="50" />
</items>
<revisions> <!-- Ревизии банкнот -->
<cassette no=”1” rev=”A” />
<cassette no=”2” rev=”B” />
</revisions>
</CDMSettings>
package capacity — максимальная емкость пачки банкнот. В соответствии с аппаратными ограничениями не рекомендуется вставлять больше 100 банкнот. При необходимости данное значение может быть изменено в интервале от
0
до100
.MaxRetract — максимум ретрактов, т.е. количество ретрактов, по достижении которого RETRACT-кассета перейдет в состояние FULL. Число ретрактов определяется физической емкостью кассет и ограничено типом данных ULONG.
MaxReject — максимальное количество rejected-банкнот, по достижении которого REJECT-кассета перейдет в состояние FULL. Число rejected-банкнот определяется физической емкостью кассет и ограничено типом данных ULONG.
Режим DISPENSE SMART RETRY (см. WFS_CMD_CDM_DISPENSE).
Таблица валютных экспонент (exp_table) — значение данного параметра используется для предоставления в рамках информационного запроса WFS_INF_CDM_CURRENCY_EXP.
Конфигурируемые аппаратные настройки NMD100 (items).
Опциональный список NMD100 data items (см. «NMD 100 Communication & Command Reference Manual», стр.79). Перечисленные пары items (no и value) будут записаны в диспенсер при старте сервиса.
Обработка ошибок в конфигурационном обеспечении.
В случае испорченных данных в файлах конфигурации, предусмотрена нижеследующая реакция ПО:
запросы WFS_INF_CDM_STATUS и WFS_INF_CDM_CAPABILITIES отрабатываются в полной мере, с учетом всех ошибок в файлах конфигурации + в дополнение генерируется событие WFS_SYSE_SOFTWARE_ERROR;
остальные запросы завершаются с кодом WFS_ERR_SOFTWARE_ERROR.
Ревизии банкнот (revisions).
Во избежание конфликтов при проведении калибровки банкнот, обладающих одним и тем же номиналом, но имеющим различную плотность (разный выпуск, разная степень износа и т.п.), и, таким образом, распределенных по разным кассетам, вводится опциональный параметр “revision”, который спецификацией XFS никак не предусмотрен. Данный параметр, привязывается к позиции кассеты и используется при кодировании характеристик кассет, при проведении операции WFS_CMD_CDM_END_EXCHANGE. Определение разных ревизий гарантирует, что для каждой кассеты с идентичным номиналом, будет проведена свой собственный обучающий набор, и его результаты не распространятся на соседние кассеты с таким же номиналом, но разными ревизиями.
Формат: char[1].
Возможные значения: латинские буквы и цифры.
Значение по умолчанию: «
_
» (подчеркивание).
Текущие значения, сохраняющиеся при перезапуске драйвера¶
К persistent values (текущие значения, сохраняющиеся после перезапуска драйвера) относятся:
настройки конфигурации кассет (currency, values, имена, привязки логических и физических кассет);
счетчики кассет (как логических, так и физических). Следует заметить, что аппарат NMD100 не имеет аппаратных счетчиков банкнот;
состояние последней выдачи (используется в WFS_INF_CDM_PRESENT_STATUS);
состояние EXCHANGE (не является требованием стандарта XFS).
Все указанные данные хранятся в файле nmd100_persistents.xml в рабочей директории сервис-провайдера.
Файл имеет механизм защиты от несанкционированного изменения данных. В случае выявления модификаций происходит следующее: блокируется работа сервиса (статус fwDevice принимает значение WFS_CDM_DEVNODEVICE, генерируется событие WFS_SYSE_SOFTWARE_ERROR с подробным описанием причины блокировки).
Примечание
Хотя, фактически, кассеты в состоянии хранить внутри себя такие параметры, как currency и values, данный механизм сервисом не используется. Причина — каждый раз, при смене одного из параметров кассеты, последняя переводится в специальное состояние, когда требуется дополнительно извлечь и вставить кассету, кроме этого, в дальнейшем аппарат самовольно проведет калибровку при первом же наборе из этой кассеты.
Особенности реализации запросов и событий¶
Неподдерживаемые запросы¶
В связи с тем, что диспенсер является устройством самообслуживания, необходимо исключить поддержку 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;
MODEL = NMD100;
CONFIGURATION_ERROR: описываются ошибки, выявленные в конфигурационном обеспечении ПО;
CDM_ERROR: уточняется состав ошибок оборудования CDM;
SIU_ERROR: уточняется состав ошибок контроллера спец. электроники.
Инициализация оборудования на момент старта сервис-провайдера¶
Если в презентере обнаружена оставленная пачка банкнот, осуществляем ее сброс в кассету RETRACT. В данной ситуации мы не в состоянии отвечать за состав пачки и проводить REJECT-операцию: мы не знаем, из каких кассет она была набрана, была ли в прямом доступе пользователя.
Политика проведения LOCK/UNLOCK по CASHOUT-кассетам¶
Необходимо подать UNLOCK по всем CASHOUT-кассетам в момент отработки START_EXCHANGE. Необходимо подать LOCK по всем задействованным CASHOUT-кассетам в момент отработки END_EXCHANGE. На момент старта сервиса, в соответствии с текущей EXCHANGE-сессией, производится запирание/отпирание кассет. Процесс инициирует XFS-драйвер.
Трансляция статусов кассеты (применительно к 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. Состояние LOGICAL.FULL достигается двумя путями: фиксирование FULL при достижении счетчиками конфигурационных максимумов ((nmd100_configuration.xml: элементы MaxRetract, MaxReject), либо при заполнении всех физических кассетах.
Поле physical.ulMaximum не может быть установлено приложением, не используется для вычисления статуса кассет и носит чисто информационный характер: в нашем случае, оно будет дублировать конфигурационные максимумы, по которым вычисляются статусы FULL.
Физические кассеты RT/RJ имеют датчик HIGH и могут отражать состояние ALMOST FULL в статус HIGH, если logical.ulMaximum установлено на ноль.
Физические кассеты CASHOUT, могут отражать состояние NEAR EMPTY в статус LOW, в том случае, если logical.ulMinimum установлено на ноль.
Для CASHOUT-кассет, вычисление физического статуса EMPTY происходит только после неудачной попытки набора из кассеты. После извлечения пустой кассеты, аппарат сбрасывает статус EMPTY. Следствие: вновь вставленная пустая кассета никогда не будет иметь первоначальный статус EMPTY.
Структура RETRACT и REJECT-кассет¶
Аппарат NMD100 оснащен одной физической REJECTBOX-кассетой с двумя отсеками: в первый отсек (т.н. SINGLE_REJECT) попадают все одиночные отбракованные в процессе набора банкноты, во второй — сброшенные с промежуточного стэкера (BUNDLE PRESENTER), как по команде REJECT/RETRACT, так и автоматически в силу срабатывания INTERNAL_REJECT. Поскольку, в общем случае, требуется статистически разделять деньги, которые были оставлены клиентом (RETRACTED), и деньги банка (REJECTED на этапе набора, а также REJECTED со стэкера), предлагается разделить RETRACT-кассету на три условных отсека:
SINGLE REJECT — отбракованные банкноты. Физический отсек #1, логическая REJECT-кассета.
BUNDLE REJECT — банкноты, отправленные в REJECT-кассету по команде REJECT, а также INTERNAL BUNDLE REJECTED банкноты (в частности, к таким банкнотам относится обучающая выборка в рамках исполнения CALIBRATE_CASHUNIT). Физический отсек #2, логическая REJECT-кассета.
RETRACT — банкноты, отправленные в 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
.CEN/XFS 3.10:
ulDispensedCount
= ulInitialCount - ulCount. Для REJECT/RETRACT — строго 0. Соответствует сумме ulDispensedCount по физическим кассетам.
ulPresentedCount
= ulDispensedCount - ulRejectCount. Для REJECT/RETRACT — строго 0. Соответствует сумме ulPresentedCount по физическим кассетам.
ulRetractedCount
Количество удержанных банкнот в кассете. Для CASHOUT/REJECT — строго 0. Соответствует сумме ulRetractedCount по физическим кассетам.
WFSCDMCASHUNIT.lppPhysical[i]:
Поле
Комментарий
lpPhysicalPositionName
REJECT
— физический отсек RETRACT, подсчет retracted-денег;REJECT
— физический отсек RETRACT, подсчет rejected-денег (по команде REJECT);REJECT
— физический отсек REJECT, подсчет rejected-денег на этапе отбраковки (в рамках отработки DESPENSE);CASHOUTn
, n = 1..6 — физические CASHOUT-кассеты. Единице соответствует самая верхняя.UnitID
значение считывается из кассеты (readonly).
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
.CEN/XFS 3.10:
ulDispensedCount
= ulInitialCount - ulCount. Для REJECT/RETRACT — строго 0.
ulPresentedCount
= ulDispensedCount - ulRejectCount. Для REJECT/RETRACT — строго 0.
ulRetractedCount
количество удержанных банкнот в кассете. Для CASHOUT/REJECT — строго 0.
Привязка физических кассет к логическим определяется размещением кассет в отсеках, а не по идентификаторам физических кассет.
- 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. В случае ошибки конфигурационного либо внешнего информационного обеспечения (в частности, НСД в отношении файла, содержащего persistent values) выставляется данное состояние. Разрешены только две INF-операции: STATUS и CAPABILITIES. В extra-поле в ответе STATUS, под ключом CONFIGURATION_ERROR записывается причина, повлекшая переход в данное состояние. При попытке исполнить любую другую операцию, возвращается WFS_ERR_SOFTWARE_ERROR. Любой запрос к сервису сопровождается генерацией события WFS_SYSE_SOFTWARE_ERROR.
WFS_CDM_DEVHWERROR
механическая неисправность одного из узлов сервиса, препятствующая дальнейшей работе устройства: CDM либо SIU.
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, невозможно определить состояние двери.
Поле fwDispenser:
Состояние
Комментарий
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
Поле wDevicePosition:
Состояние
Комментарий
WFS_CDM_DEVICEPOSUNKNOWN
Позиция устройства неизвестна
WFS_CDM_DEVICEINPOSITION
Устройство в исходной (рабочей) позиции
WFS_CDM_DEVICENOTINPOSITION
Устройство вытащено из исходной позиции (инкассация и т.д.)
- WFS_INF_CDM_PRESENT_STATUS
Информация по полям lpDenomination -> lpulValues представлена исходя из состояния, актуального на момент проведения выдачи (порядок следования логических кассет). В частности, если после выдачи провести реконфигурирование кассет (END_EXCHANGE), в ходе которого перепутать ранее установленные номиналы, вычисленная сумма по lpDenomination -> lpulValues будет отличаться от реально выданной.
В действительности, потребность в применении WFS_INF_CDM_PRESENT_STATUS для выяснения состава последней выдачи, проведенной до реконфигурирования кассет, сомнительна.
В случае если на вход подается неподдерживаемая позиция (любая позиция, отличная от NULL или FRONT), произойдет завершение с ошибкой WFS_ERR_CDM_UNSUPPOSITION.
- 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.
События 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_END_EXCHANGE
В рамках отработки данной команды:
безусловным образом, закрывается EXCHANGE сессия;
валидируются входные аргументы;
в случае успешной валидации, устанавливаются новые значения WFSCDMCUINFO;
блокируются все физические кассеты, фигурирующие в WFSCDMCUINFO;
если вновь установленные валюта и номинал логической кассеты отличаются от валюты и номинала физических, то происходит кодирование физических кассет, которое приводит к появлению статуса NOREF + необходимости проведения операции калибровки.
Результат hResult вычисляется следующим образом:
WFS_SUCCESS, если все шаги пройдены успешно;
WFS_ERR_CDM_CASHUNITERROR, если входные параметры не прошли валидацию (по каждой логической кассете, содержащей невалидные данные) + в сопровождении события WFS_EXEE_CDM_CASHUNITERROR (wFailure = WFS_CDM_CASHUNITINVALID).
В случае отсутствия REJECT VAULT кассеты, на момент исполнения команды блокировка остальных кассет, в силу специфики оборудования, не производится. В любом случае, это не является ошибочной ситуацией, и операция завершается с кодом WFS_SUCCESS.
Если на момент исполнения данной операции присутствуют кассеты со статусом NOREF, их блокировка, в силу аппаратной специфики, произведена не будет. По каждой кассете будет разослано соответствующее событие WFS_EXEE_CDM_CASHUNITERROR. Для восстановления работы кассеты со статусом NOREF, требуется проведение операции калибровки.
Если:
на момент подачи команды WFS_CMD_CDM_START_EXCHANGE, присутствовали кассеты со статусом NOREF;
перед подачей команды WFS_CMD_CDM_END_EXCHANGE, эти кассеты извлекались, то статус NOREF у этих кассет будет потерян. В любом случае, если валюта этих кассет для аппарата является новой, при первом же наборе, кассеты будут автоматически откалиброваны (см. WFS_CMD_CDM_CALIBRATE_CASH_UNIT).
Валидация входных данных:
lppList[0] — д.б. RETRACT-кассета.
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
1
(строгое равенство)usType
да
= WFS_CDM_TYPERETRACTCASSETTE (строгое равенство)
lpszCashUnitName
игнорируется
cUnitID
любое
значение используется и может быть любым
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
да
значение используется. Должно совпадать с суммой по физическим кассетам
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
значение используется и может быть любым
bAppLock
игнорируется
usStatus
игнорируется
usNumPhysicalCUs
да
=
1
(строгое равенство)ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
lppList[1] — д.б. REJECT-кассета.
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
2
(строгое равенство)usType
да
= WFS_CDM_TYPEREJECTCASSETTE (строгое равенство)
lpszCashUnitName
игнорируется
cUnitID
любое
значение используется и может быть любым
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
да
значение используется. Должно совпадать с суммой по физическим кассетам
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
значение используется и может быть любым
bAppLock
игнорируется
usStatus
игнорируется
usNumPhysicalCUs
да
=
2
(строгое равенство)ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[2..N-1] — CASHOUT-кассеты.
Общие требования и допущения:
должно быть представлено не менее одной логической cashout-кассеты;
представленные логические cashout-кассеты не должны иметь более чем одну связь с каждой из физических кассет;
не обязательно привязывание всех существующих физических кассет.
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
3
..N
(номера логических кассет должны следовать строго по порядку)usType
да
= WFS_CDM_TYPEBILLCASSETTE. Строгое равенство
lpszCashUnitName
игнорируется
cUnitID
любое
значение используется и может быть любым
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
да
проверяется строгое равенство сумме счетчиков по физическим кассетам
ulRejectCount
да
проверяется строгое равенство сумме счетчиков по физическим кассетам
ulMaximum
игнорируется
ulMinimum
любое
значение используется и может быть любым
bAppLock
любое
значение используется и может быть любым
usStatus
игнорируется
usNumPhysicalCUs
да
>
0
. Список должен быть непустымulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[0 .. usNumPhysicalCUs - 1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
да
строго в диапазоне
CASHOUT1
..CASHOUTn
cUnitID
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
любое
значение используется и может быть любым, в т.ч. нулевым
ulRejectCount
да
значение используется и может быть любым
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
- 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.
Валидация входных данных:
usNumber = 1 : д.б. RETRACT-кассета.
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
1
(строгое равенство)usType
да
= WFS_CDM_TYPERETRACTCASSETTE (строгое равенство)
lpszCashUnitName
игнорируется
cUnitID
игнорируется
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
да
значение должно совпадать с суммой счетчиков по физическим кассетам
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
значение используется и может быть любым
bAppLock
игнорируется
usStatus
игнорируется
usNumPhysicalCUs
да
=
1
(строгое равенство)ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
значение используется и может быть любым
ulCount
да
значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
usNumber = 2 : д.б. REJECT-кассета.
WFSCDMCASHUNIT:
Поле
Проверка
Комментарий
usNumber
да
=
2
строгое равенствоusType
да
= WFS_CDM_TYPEREJECTCASSETTE (строгое равенство)
lpszCashUnitName
игнорируется
cUnitID
игнорируется
cCurrencyID
игнорируется
ulValues
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
да
значение должно совпадать с суммой счетчиков по физическим кассетам
ulRejectCount
игнорируется
ulMinimum
игнорируется
ulMaximum
любое
значение используется и может быть любым
bAppLock
игнорируется
usStatus
игнорируется
usNumPhysicalCUs
да
=
2
(строгое равенство)ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[0]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
игнорируется
cUnitID
игнорируется
ulInitialCount
игнорируется
ulCount
да
значение используется и может быть любым
ulRejectCount
игнорируется
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
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
да
проверяется строгое равенство сумме счетчиков по физическим кассетам
ulMaximum
игнорируется
ulMinimum
любое
значение используется и может быть любым
bAppLock
любое
значение используется и может быть любым
usStatus
игнорируется
usNumPhysicalCUs
да
количество физических кассет должно строго совпадать с ранее установленным
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
WFSCDMCASHUNIT.lppPhysical[0 .. usNumPhysicalCUs - 1]:
Поле
Проверка
Комментарий
lpPhysicalPositionName
да
строго в диапазоне
CASHOUT1
..CASHOUTn
cUnitID
игнорируется
ulInitialCount
любое
значение используется и может быть любым
ulCount
любое
значение используется и может быть любым, в т.ч. нулевым
ulRejectCount
да
значение используется и может быть любым
ulMaximum
игнорируется
usPStatus
игнорируется
bHardwareSensor
игнорируется
ulDispensedCount
игнорируется
ulPresentedCount
игнорируется
ulRetractedCount
игнорируется
- 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_SHUTTERNOTOPEN).
- WFS_CMD_CDM_DENOMINATE
Входные аргументы представлены в ниже
- WFS_CMD_CDM_DISPENSE
Специфика аппарата NMD100: в случае если не удается полностью набрать указанную разбивку по кассетам (в силу досрочно закончившихся средств, расхождения программных счетчиков с реальными, большого числа операций reject в рамках транзакции и пр.), добрать деньги в стэкер путем подачи очередной команды MOVE FORWARD технически невозможно! Перед подачей команды MOVE FORWARD стэкер должен быть пустым. Если стэкер не пустой, диспенсер автоматически сбрасывает его содержимое в RETRACT, и только после этого приступает к исполнению запроса.
Вводится настройка сервиса — флаг DISPENSE_SMART_RETRY_MODE, принимающий значения
TRUE
/FALSE
. В соответствии с настройкой, реализуется логика принятия решений:Значение
Досрочное (непредвиденное) исчерпание банкнот в физической или логической кассете
TRUE
Если запрос DISPENSE не специфицирует строгую разбивку по кассетам, проводится повторная деноминация. Если успешно, повторяется попытка набора* (в общем случае, набор пойдет с участием других физических/логических кассет). Если разбивка строго специфицирована и повторная деноминация по ней не проходи, возвращается ошибка CASH UNIT ERROR по сбойной логической кассете (+рассылается соответствующее событие). В обоих случаях, по факту выхода кассеты из строя (EMPTY/INOP), производится рассылка события INFO CHANGED
FALSE
Возвращается ошибка CASH UNIT ERROR по сбойной логической кассете (+генерируем соответствующее событие). По факту выхода кассеты из строя (EMPTY/INOP), производится рассылка события INFO CHANGED.
* повторный набор ВСЕГДА сопровождается сбросом предыдущей частично набранной пачки в RJ_RT отсек (технически: если набор осуществлен неуспешно, частично набранная пачка сразу же направляется в RJ_RT отсек).
Логические и физические счетчики кассет ulCount не могут принимать отрицательные значения. Если в ходе набора из кассеты будет набрано большее количество банкнот, чем прописано в счетчике (такое может произойти, если часть банкнот отбраковывается), счетчик примет значение ноль.
Если на момент исполнения команды шаттер открыт, непосредственно перед набором банкнот, предпринимается попытка его закрытия: в случае ошибки, происходит досрочное завершение операции с кодом ошибки WFS_ERR_HARDWARE_ERROR.
Аппарат NMD100 не предоставляет динамическую информацию об отбраковываемых в ходе набора банкнотах. Кроме этого, невозможно получить информацию о причинах отбраковки. В силу этих двух причин, сервис не поддерживает генерацию событий WFS_EXEE_CDM_NOTEERROR.
- WFS_CMD_CDM_REJECT
Проверка состояния среды исполнения (в порядке исполнения):
если состояние выдачи отлично от DISPENSED, возвращается WFS_ERR_CDM_NOITEMS;
если активна EXCHANGE-сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE;
если состояние оборудования отлично от работоспособного, возвращается код соответствующей ошибки;
если состояние REJECT-кассеты отлично от работоспособного (OK/HIGH), то возвращается WFS_ERR_CDM_CASHUNITERROR в сопровождении с соответствующим событием.
Если проверка пройдена успешно, предпринимается попытка провести операцию RETRACT.
¶ Счетчик
Условия начисления
REJECT.ulCount
Начисляется только в случае успешного проведения операции RETRACT, либо если возникла аппаратная ошибка, связанная с невозможностью закрыть крышку RETRACT-кассеты.
CASHOUT(i).ulRejectCount
Reject-счетчики 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
Валидация входных аргументов:
Параметр
Исходное состояние выдачи 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-кассеты.
* В случае неуспешного выполнения операции (несогласованности датчика изъятия банкнот с положением стэкера), считается, что клиент удержал банкноты на момент проведения операции RETRACT: операция завершается с кодом ошибки WFS_ERR_CDM_ITEMSTAKEN.
PRESENTED -> STACKER:
Перемещение BP в позицию HOME.
Закрытие шаттера.
*Изменение состояния выдачи на RETRACTED_SA.
*В случае неуспешного выполнения операции (несогласованности датчика изъятия банкнот с положением стэкера), считается, что клиент удержал банкноты на момент проведения операции RETRACT: операция завершается с кодом ошибки WFS_ERR_CDM_ITEMSTAKEN, а состояние выдачи принимает значение EMPTY.
STACKER -> LRETRACT:
Сброс банкнот в RETRACT;
*Изменение состояния выдачи на EMPTY, инкремент счетчика RETRACT-кассеты;
* Только в случае успешного сброса банкнот в RETRACT.
** Только в случае успешного сброса банкнот в RETRACT.
- WFS_CMD_CDM_RESET
В силу специфики аппаратного обеспечения (NOTE STACKER, в ходе проведения RESET, в обязательном порядке заезжает в REJECT VAULT и сбрасывает туда пачку; независимо от того, есть она или нет), поддерживаются только RETRACT и REJECT позиции размещения обнаруженной во время исполнения запроса пачки банкнот.
В силу специфики NOTE STACKER (см. Особенности NOTE STACKING AREA NMD100) сервис-провайдер может генерировать событие WFS_SRVE_CDM_MEDIADETECTED только при подаче RESET в условиях позиции выдачи «BS_PRESENTED». Как следствие, для остальных позиций выдачи (BS_DISPENSED и BS_RETRACTED_SA), событие генерироваться не будет, статистика REJECTED/RETRACTED банкнот учитываться не будет.
Порядок проведения операции:
Если активна EXCHANGE сессия, возвращается WFS_ERR_CDM_EXCHANGEACTIVE.
Запрос статусной информации CDM. В случае невозможности получить ответ, операция завершается с кодом ошибки WFS_ERR_HARDWARE_ERROR.
Запрос статусной информации SIU.
Если состояние выдачи EMPTY, DISPENSED, RETRACTED_SA, то значения входных аргументов игнорируются.
В случае если состояние выдачи PRESENTED, проводится валидация входных аргументов usnumber/fwposition/lpretractarea на соответствие позиции назначения. Поддерживается только RETRACT_CASSETTE. В остальных случаях, операция завершается с кодом ошибки WFS_ERR_CDM_INVALIDCASHUNIT + рассылается событие WFS_SRVE_CDM_MEDIADETECTED с пустым полем данных lpitemposition = 0.
Производится перемещение банкнот в REJECT VAULT.
Если ранее перечисленные действия успешны, производится аппаратный сброс CDM.
Если BUNDLE OUTPUT UNIT сигнализировал о наличии банкнот, по завершении операции генерируется WFS_SRVE_CDM_MEDIADETECTED.
Аппаратная команда RESET, в ходе проведения операции WFS_CMD_CDM_RESET, будет подаваться только в случае необходимости (fwDevice = WFS_CDM_DEVHWERROR).
При использовании 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-кассеты].
В случае отсутствующих входных аргументов, по умолчанию предусматривается отработка запроса с перемещением набранных банкнот в BUNDLE_REJECT отсек логической REJECT-кассеты.
Процесс проведения операции:
Проход по всем логическим CASHOUT-кассетам. Если статус usstatus — OK или LOW, запоминаются все физические CASHOUT-кассеты в составе логической, имеющие OK/ LOW статусы. В противном случае (если статус логической кассеты отличен от OK/LOW либо установлен флаг bapplock) — генерируется событие WFS_EXEE_CDM_CASHUNITERROR.
Проверяется список физических кассет:
если список физических кассет, набранных на предыдущем шаге ненулевой, проводится набор из каждой кассеты по одной банкноте. В случае ошибки набора, генерируется событие WFS_EXEE_CDM_CASHUNITERROR, набор приостанавливается (в силу аппаратной специфики);
если список физических кассет пустой, то операция досрочно завершается с кодом ошибки WFS_ERR_CDM_CASHUNITERROR.
В случае если хотя бы из одной кассеты не удастся осуществить набор, аппарат автоматически сбросит недобор в REJECT VAULT.
Если удалось протестировать ВСЕ кассеты, подлежащие тестированию в соответствии с п.1, результат операции – WFS_SUCCESS, а также набранная пачка попадает в указанную позицию. В противном случае, результат операции — WFS_ERR_CDM_CASHUNITERROR, по сбойной кассете рассылается соответствующее событие, а недобор со стэкера перемещается в REJECT VAULT.
Аналогично тому, как это происходит в рамках отработки DISPENSE, банкноты, набираемые из CASHOUT-кассет в процессе TEST CASH UNITS, могут быть отбракованы и помещены в REJECT-отсек. Факт отбраковки одной или более банкнот не является причиной безуспешности тестирования отдельно взятой физической кассеты.
- WFS_CMD_CDM_CALIBRATE_CASH_UNIT
В силу специфики оборудования, в ходе проведения данной операции, требуется извлечение и вставка калибруемых кассет.
То есть, механизма калибровки кассет, как такового, для NMD100 не существует. Процесс калибровки строится на привязке результатов обучающих наборов к уникальным характеристикам банкнот в кассетах (валюта, номинал, ревизия и т.п.); при этом: характеристики предоставляются каждой кассетой; результаты обучения — хранятся в диспенсере. Другая особенность состоит в том, что аппарат NMD100 не предусматривает явного наличия команды калибровки. Обучающая выборка проводится неявно, при первом наборе из кассеты, уникальный набор характеристик которой для данного экземпляра аппарата встречается впервые.
Из этих особенностей вытекают два следствия.
Если кассета с уникальными характеристиками была откалибрована на одном экземпляре диспенсера, при ее установке в другой не исключено проведение неявного обучающего набора, в рамках операции WFS_CMD_CDM_DISPENSE.
Если диспенсер уже обучен на банкнотах с заданным набором характеристик, повторное обучение проводиться не будет, и, в случае необходимости, возможно только после сброса настроек.
Если требуется эксплуатация нескольких кассет с одинаковыми номиналами, но различными физическими характеристиками, для таких кассет в конфигурационном файле имеется возможность определить различные ревизии банкнот (см. ревизия банкнот в настройках XFS-провайдера).
Фактическая подготовка к калибровке (кодирование параметров кассет) производится в рамках операции END_EXCHANGE. Физические кассеты с новыми параметрами получают статусы NOREF, и именно такие кассеты, в дальнейшем подлежат калибровке.
В силу особенностей оборудования, не представляется возможным проведение калибровки только некоторой части физических кассет из всего подмножества кассет, подлежащих калибровке: аппаратура блокирует любые действия, связанные с набором банкнот, если хотя бы одна кассета имеет состояние NOREF. По этой причине, реализация операции калибровки отличается от того, как это описано в спецификации CEN/XFS: в рамках ее проведения, калиброваться будут те и только те физические кассеты, которые имеют статус NOREF, а не только из состава логической кассеты, указанной во входном параметре usNumber.
Валидация входных аргументов и среды исполнения:
Если активна EXCHANGE сессия, запрос отклоняется с кодом ошибки WFS_ERR_CDM_EXCHANGEACTIVE.
Если состояние оборудования отлично от рабочего, возвращается код соответствующей ошибки.
Если текущее состояние набора/выдачи отлично от EMPTY, запрос отклоняется с кодом ошибки WFS_ERR_DEV_NOT_READY.
Независимо от значений входных аргументов: если состояние REJECT либо RETRACT-кассеты отлично от OK/HIGH, возвращается код ошибки WFS_ERR_CDM_CASHUNITERROR.
Необходимым условием для проведения калибровки, является наличие хотя бы одной физической кассеты, статус которой – NOREF. В противном случае, операция калибровки будет прервана с кодом WFS_ERR_DEV_NOT_READY.
Если хотя бы одна физическая кассета NOREF входит в состав логической с флагом bapplock, равным TRUE, операция калибровки будет отклонена с кодом ошибки WFS_ERR_CDM_CASHUNITERROR.
Проверка состава входных аргументов на предмет валидных позиций перемещения набранных банкнот. Поддерживается только позиция usnumber=2 [сброс банкнот в REJECT].
Процесс проведения операции:
Разблокировка физических кассет со статусом NOREF.
Ожидание изъятия и вставки кассет со статусом NOREF.
Блокировка кассет. Если в ходе блокировки хотя бы одной кассеты произошла ошибка, возвращается код ошибки WFS_ERR_HARDWARE_ERROR.
Проведение обучающего набора. Фактически, проведение обучающего набора провоцируется путем подачи команды набора одной банкноты из каждого калибруемого модуля. В случае если аппарат ранее не обучался на предъявленных номиналах, производится обучающий набор (~12 банкнот), если обучался, то набирается 1 банкнота.
Особенности NOTE STACKING AREA NMD100¶
Стэкер NMD100 не оборудован датчиком банкнот. Датчик изъятия банкнот размещается на тракте OUTPUT-позиции. Данная особенность приводит к нижеследующим последствиям:
при подаче питания невозможно определить наличие банкнот на стэкере;
в случае возникновения нештатных ситуаций (механические поломки, препятствия на транспорте, замятие банкнот и т.п.), невозможно, в ходе проведения WFS_CMD_CDM_RESET, определить наличие банкнот на стэкере, а также ответственно сгенерировать событие WFS_SRVE_CDM_MEDIADETECTED.
Сброс настроек¶
Для проведения сброса настроек диспенсера, необходимо запустить сервис-провайдер CDM с опцией командной строки DEFAULT_MACHINE_SETTINGS
:
c:\FS365\XFS\shqPS.CDM.NMD100.exe DEFAULT_MACHINE_SETTINGS
c:\FS365\XFS\shqPS.CDM.NMD100.exe DEFAULT_MACHINE_SETTINGS COM8
В первом случае, порт подключения считывается из реестра. Если в силу настроек безопасности, соответствующий ключ реестра недоступен, имеется возможность указать порт подключения диспенсера непосредственно в командной строке.
После успешной отработки, появится диалоговое окно с результатом:
The MACHINE SETTINGS has been successfully set to DEFAULT. Now you have to power off and on the machine.
Для того чтобы настройки вступили в силу, необходимо выключить и включить питание аппарата.