IronLogic СКУД
Адаптеры & Конвертеры => Z-397 WEB => Тема начата: Alexander Vasilyev от 05 Января 2018, 15:43
-
Добрый день!
Хочу спросить совета у разработчиков, как организовать отказоустойчивую схему?
Речь идёт о контроле доступа для предприятия с самодельным ПО для учёта времени.
В конфигурации имеется:
Конвертер Z-397 Web, 1 шт
Контроллеры Matrix-II Net, 2 шт
В своей программе я использую функцию ZG_Ctr_SetNotification из SDK для получения событий входа-выхода от контроллеров:
ZG_CTR_NOTIFY_SETTINGS rNS = new ZG_CTR_NOTIFY_SETTINGS(ZGIntf.ZG_NF_CTR_NEW_EVENT,
_eventMonitor.SafeWaitHandle,
IntPtr.Zero, 0,
_appReadEventIdx,
300, 0);
hr = ZGIntf.ZG_Ctr_SetNotification(_hCtr, rNS);
И далее, во время выполнения программы, SDK сигнализирует мне о новых событиях через объект синхронизации:
while (_isThreadActive)
{
if (_eventMonitor.WaitOne())
{
_eventMonitor.Reset();
if (_hCtr != IntPtr.Zero)
{
ReadEvents();
}
}
}
Вопрос следующий, если ли возможность средствами SDK организовать отказоустойчивость на случай временной потери линка от ПК до конвертера?
Я пробовал управлять структурой ZP_WAIT_SETTINGS:
ZG_CVT_INFO rInfo = new ZG_CVT_INFO();
ZG_CVT_OPEN_PARAMS rOp = new ZG_CVT_OPEN_PARAMS
{
nCvtType = ZG_CVT_TYPE.ZG_CVT_Z397_WEB,
nPortType = ZP_PORT_TYPE.ZP_PORT_IP,
nSpeed = ZG_CVT_SPEED.ZG_SPEED_19200,
pszName = _cvt,
nStopBits = 1
};
ZP_WAIT_SETTINGS pWait = new ZP_WAIT_SETTINGS(
_nReplyTimeout: 4000,
_nMaxTries: 10,
_hAbortEvent: IntPtr.Zero,
_nReplyTimeout0: 500,
_nCheckPeriod: 0,
_nConnectTimeout: 4000,
_nRestorePeriod: 3000);
rOp.pWait = Marshal.AllocHGlobal(Marshal.SizeOf(pWait));
Marshal.StructureToPtr(pWait, rOp.pWait, true);
var hr = ZGIntf.ZG_Cvt_Open(ref _hCvt, ref rOp, rInfo);
Вижу утилитой netstat, что tcp/ip связь восстанавливается
dev@DESKTOP-S7PPUM8 MINGW64 /c/SDK Guard
$ netstat -ban | grep 75
TCP 192.168.15.241:52041 192.168.15.75:1000 ESTABLISHED
Но экземпляр _eventMonitor перестает получать сигналы.
С уважением
-
Добрый день
Постараюсь исправить этот баг.
Пока можно решить проблему 2 способами:
1) Включить уведомление об изменении состояния порта ZG_NF_CVT_PORTSTATUS и когда придёт сообщение ZG_N_CVT_PORTSTATUS если ZG_Cvt_GetConnectionStatus() = ZP_CS_DISCONNECTED, то закрыть все дескрипторы (handle) конвертера и его контроллеров и открыть снова;
2) Включить уведомление об ошибках ZGIntf.ZG_NF_CTR_ERROR или ZG_NF_CVT_ERROR когда придёт сообщение ZG_N_CTR_ERROR, то закрыть все дескрипторы конвертера и его контроллеров и открыть снова.
p.s. На всякий случай информирую, что есть возможность общаться с контроллерами без Sdk с помощью протокола обмена, описанного на http://posix.con.ru
-
Пожалуйста, держите меня в курсе событий этой темы
-
Не нашел такого уведомления (ZG_N_CVT_PORTSTATUS) в документации. Или вы имеете в виду: ZG_CVTNF_CONNECTION_CHANGE? Хотя, даже оно не приходит мне.
Добрый день
Постараюсь исправить этот баг.
Пока можно решить проблему 2 способами:
1) Включить уведомление об изменении состояния порта ZG_NF_CVT_PORTSTATUS и когда придёт сообщение ZG_N_CVT_PORTSTATUS если ZG_Cvt_GetConnectionStatus() = ZP_CS_DISCONNECTED, то закрыть все дескрипторы (handle) конвертера и его контроллеров и открыть снова;
2) Включить уведомление об ошибках ZGIntf.ZG_NF_CTR_ERROR или ZG_NF_CVT_ERROR когда придёт сообщение ZG_N_CTR_ERROR, то закрыть все дескрипторы конвертера и его контроллеров и открыть снова.
p.s. На всякий случай информирую, что есть возможность общаться с контроллерами без Sdk с помощью протокола обмена, описанного на http://posix.con.ru
-
Не нашел такого уведомления (ZG_N_CVT_PORTSTATUS) в документации. Или вы имеете в виду: ZG_CVTNF_CONNECTION_CHANGE? Хотя, даже оно не приходит мне.
Да. Чтобы приходило нужно вызвать ZG_Cvt_SetNotification с установленным ZG_CVT_NOTIFY_SETTINGS.nNMask = ZG_CVTNF_CONNECTION_CHANGE (=0x0008). Тогда будет приходить сообщение ZG_CVTN_CONNECTION_CHANGE (=5) из ZG_Cvt_GetNextMessage.