На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > GrayBox OPC Server кто работал? , помогите разобраться с написанием простенького OPC сервера под GrayBox
      Здравствуйте. Стоит задача написать простенький OPC-сервер в который каждые 100ms будут сыпаться 4 переменных, для того чтобы Power Graph мог строить графики по ним. Сейчас это работает через нуль ком-порт, но это не комильфо. )) Для этих целей порекомендовали GrayBox OPC Server Toolkit Demo. Поковыряв всё там имеющиеся примеры и доки, на скорую руку накидал вот такую тестовую программку:
      Скрытый текст
      ExpandedWrap disabled
        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 и всё рисуется корректно. Вроде по этому же примеру и писал (выбирая то что нужно), но видать что то пропустил... Подскажите пожалуйста кто разбирается.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0171 ]   [ 16 queries used ]   [ Generated: 24.04.24, 23:31 GMT ]