Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Базы данных > GrayBox OPC Server кто работал?


Автор: VV0lk 09.12.13, 12:32
Здравствуйте. Стоит задача написать простенький OPC-сервер в который каждые 100ms будут сыпаться 4 переменных, для того чтобы Power Graph мог строить графики по ним. Сейчас это работает через нуль ком-порт, но это не комильфо. )) Для этих целей порекомендовали GrayBox OPC Server Toolkit Demo. Поковыряв всё там имеющиеся примеры и доки, на скорую руку накидал вот такую тестовую программку:
Скрытый текст
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void CMy_OPCServerDlg::OnBnClickedOk()
    {
        srv.GBInitialize(&guid, 50, 50, GB_SRV_NOACCESSPATH, L'.', 100, 1, 2, 3, L"My_OPC_server"); //Инициализируем сервер
        srv.GBRegisterServer(&guid, L"DFCT", L"My first OPC Server", L"OPC_Server_Sample", L"1.0"); //регистрация сервера в системе
        srv.GBSetState(OPC_STATUS_RUNNING); //запуск
     
        DWORD  i;
        VARIANT val;
        val.vt = VT_UI4;
     
        for (i = 0; i<TAGDESCRCOUNT; i++)  //создаем 4 тега (значения Double)
        {
            wchar_t opcid[32];
            wsprintfW(opcid, L"Tag%02i", i);
            val.ulVal = i;
            srv.GBCreateItemAnalog(&m_puTagIds[i], i, opcid, OPC_READABLE, GB_TAG_NOVALCMP, &val, 0, 6000);
        }
        srv.GBRegisterClassObject(); //Функция регистрирует объект класса OPC-сервера
     
        
        for (int i = 0; i<TAGDESCRCOUNT; i++) //обнуляем массив данных , присваиваем тип...
        {
            Value[i].dblVal=0;
            Value[i].vt = VT_R8;
            Error[i] = S_OK;
            Quality[i] = OPC_QUALITY_GOOD;
        }
        m_nTimer=SetTimer(1, 200, 0); //Запустить таймер
    }
     
    void CMy_OPCServerDlg::OnTimer(UINT_PTR nIDEvent)
    {
        unsigned i, c = 0;
        int k, l;
        
        FILETIME Timestamp[TAGDESCRCOUNT], ft;
        
        Value[0].dblVal++;
        Value[1].dblVal+=0.7;
        Value[2].dblVal+=10;
        Value[3].dblVal+=20;
     
        for (c = 0; c<TAGDESCRCOUNT; c++)
        {
            GetSystemTimeAsFileTime(&ft); //получаем системное время
            Timestamp[c] = ft;            //копируем его в массив
        }
        srv.GBUpdateItems(c, m_puTagIds, Value, Quality, Timestamp, Error, TRUE); //синхронно обновляем значения тегов
     
     
        CDialog::OnTimer(nIDEvent);
    }

И вроде PowerGraph видит сервер подключается, но рисует 4 прямых со значениями которые были в момент старта. Если нажимаешь "стоп", потом опять "старт" то значение меняется скачкообразно и опять идут прямые. Если нажать в PowerGraph "настройки OPC Сервера" и там постоянно клацать "Reade Value" то видно что значения тегов изменяются по тому закону который описан. Т.е. закрадывается ощущение, что клиент запрашивает данные только при нажатии "Старт" или "Reade Value". Думал, что косяк в PowerGraph-е, но запустил вот этот пример из Graybox Toolkit Пример от GrayBox потом PowerGraph и всё рисуется корректно. Вроде по этому же примеру и писал (выбирая то что нужно), но видать что то пропустил... Подскажите пожалуйста кто разбирается.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)