Автор Тема: Oтказоустойчивость  (Прочитано 5251 раз)

Alexander Vasilyev

  • Пользователь
  • *****
  • Сообщений: 7
Oтказоустойчивость
« : 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 перестает получать сигналы.

С уважением

gsa

  • Пользователь
  • *****
  • Сообщений: 269
Re: Утказоустойчивость
« Ответ #1 : 09 Января 2018, 14:47 »
Добрый день

Постараюсь исправить этот баг.
Пока можно решить проблему 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

Alexander Vasilyev

  • Пользователь
  • *****
  • Сообщений: 7
Re: Утказоустойчивость
« Ответ #2 : 12 Января 2018, 18:50 »
Пожалуйста, держите меня в курсе событий этой темы

Никита

  • Пользователь
  • *****
  • Сообщений: 1
Re: Oтказоустойчивость
« Ответ #3 : 14 Мая 2018, 18:14 »
Не нашел такого уведомления (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

« Последнее редактирование: 14 Мая 2018, 18:17 от Никита »

gsa

  • Пользователь
  • *****
  • Сообщений: 269
Re: Oтказоустойчивость
« Ответ #4 : 14 Мая 2018, 19:08 »
Не нашел такого уведомления (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.