CDiscoverTags(PCNODE_KEY node, PCGROUP_KEY grp, __uint timeout) { RTK_ADDR dest; ONLINE_CONFIG oc; oc.d_tags.ack_guid = Guid; oc.d_tags.group = *grp; c_items = 0; add_transaction(vbus_config, this); node_to_host(node, &dest.host ); dest.port = PORT_ALL_SERVER; gk = *grp; nk = *node; hint = std::string("正在接收 ") + (char*)CNodeName(nk) + "." + (char*)CGroupName(gk) + " 上的数据库标签信息..."; send_rtk_data( vbus_config, &dest, PT_DiscoverTags, &oc.d_tags, sizeof(oc.d_tags) ); Wait(timeout, TRUE); if(!c_items){ OnTimeout(); } }
virtual void OnTimeout() { if(!WaitResult()){ std::string s; s = std::string((char*)CNodeName(nk)) + "." + (char*)CGroupName(gk) + " 上的数据库标签信息接收超时."; rtk_queue_event(PT_Progress, 1, 0, s.data()); } }
virtual void OnEvent(PCRTK_PACKET packet) { c_items = packet->data_size / (sizeof(ONLINE_CONFIG::reload_tags_ack)); SetEvent(); _on_add_edit_tags(packet, false); std::string s; s = std::string((char*)CNodeName(nk)) + "." + (char*)CGroupName(gk) + " 上的数据库标签信息接收完成."; rtk_queue_event(PT_Progress, packet->total_frag, 0, s.data()); }
static __uint _on_add_edit_groups(PCRTK_PACKET p) { RTK_CURSOR hNode, hGroup; PRTK_GROUP png, pg=0; __bool bEdit; __uint count; if(p->data_size % sizeof(RTK_GROUP)){ return 0; } if( !lock_rtdb(__true, 100) ){ return 0; } hNode = HNODE_LOCAL_MACHINE; count = p->data_size / sizeof(RTK_GROUP); png = (PRTK_GROUP)p->data; bEdit = PACKET_TYPE(p) == PT_EditGroup? __true : __false; for(__uint i=0; i<count; i++, png++){ hGroup = open_group(hNode, &png->key); pg = (PRTK_GROUP)cursor_get_item(hGroup); if(pg){ memcpy( pg->description, png->description, sizeof(pg->description) ); pg->period = png->period; fire_rtdb_event(EV_ModifyGroup, pg); }else{ hGroup = create_group(hNode, png); pg = (PRTK_GROUP)cursor_get_item(hGroup); } if(pg){ pg->d.flags = png->d.flags; } DEBUG_PRINTF(( "Got group %s, flag=%08x\n", (char *)CGroupName(png->key), png->d.flags )); close_handle(hGroup); } unlock_rtdb(); return count; }
/* 功能:将TAG_VALUE实时值写入设备。 参数: name 待写入实时值对应的 组名.标签名 value 待写入的实时值 返回:即设备驱动导出函数write_device()的返回值 */ IO_API __bool PMC_API io_write_device( PCSHORT_TAG_NAME name, PCTAG_VALUE value ) { __bool retval = __false; //1 锁定 if(!lock_rtdb(__false, 100)){ return __false; } //2 找到本地节点中的指定标签点的RTK_TAG,其中存有该标签点对应的设备信息 PRTK_TAG p = query_tag(HNODE_LOCAL_MACHINE, name); //3 将单点单实时值写入设备 if(p && !(p->d.Value.Flags & TF_ReadOnly)){ #if 0 { char valbuf[32]; if(get_value_type(p->s.Flags) == dt_real4){ sprintf(valbuf, "%f", value->fltValue); }else{ sprintf(valbuf, "%s", value->iValue? "On" : "Off"); } utils_debug( "WriteDevice(%s.%s)=%s\n", (char *)CGroupName(name->group), (char *)CTagName(name->tag), valbuf ); } #endif //调用设备驱动导出函数,将单点单实时值写入设备 retval = _writeDevice(p, value); } //4 解锁 unlock_rtdb(); return retval; }
PROXY_API __uint PMC_API update_changed_data( PCRTK_PACKET packet, __bool bThisIsAServer ) { CHANGED_DATA_ENTRY * t; CHANGED_DATA * cd; __uint i, nMissing; RTK_CURSOR hNode, hGroup, hTag; TAG_NAME name; PRTK_TAG pTag; __uint retcount = 0; TAG_NAME missing[MAX_MISSING_PERMITED]; if(packet->data_size <= sizeof(CHANGED_DATA)){ return 0; } cd = (CHANGED_DATA*)packet->data; t = (CHANGED_DATA_ENTRY*)&cd[1]; if(packet->data_size != cd->count * sizeof(CHANGED_DATA_ENTRY) + sizeof(CHANGED_DATA) ){ return 0; } #if 0 for(i=0; i<cd->count; i++){ utils_debug("%s.%s.%s=%f\n", (char*)CHostName(packet->src.host), (char*)CGroupName(cd->group), (char*)CTagName(t[i].name), t[i].value.Value.fltValue ); } #endif memset(&name, 0, sizeof(name)); host_to_node(&packet->src.host, &name.node); name.sname.group = cd->group; if(!lock_rtdb(__false, 100)){ return 0; } if(bThisIsAServer){ if(!(packet->src.host == g_ThisNode->key)){ unlock_rtdb(); return 0; } hNode = HNODE_LOCAL_MACHINE; }else{ hNode = open_node(&name.node); } if(!hNode){ unlock_rtdb(); return 0; } hGroup = open_group(hNode, &cd->group); if(!hGroup){ if(!bThisIsAServer){ close_handle(hNode); } unlock_rtdb(); if(g_Worker){ g_Worker->inform_load(&name, 1); } // 2003/5/27, in current implementation all following // tags are guaranteed to be in the same group, so there // is no need to proceed. return 0; } nMissing = 0; for(i=0; i<cd->count; i++){ hTag = open_tag_g(hGroup, &t[i].name); if(hTag){ pTag = (PRTK_TAG)cursor_get_item(hTag); pTag->d.Value = t[i].value; // pTag->d.Value.Flags = t[i].value.Flags; mark_fresh(pTag); close_handle(hTag); retcount++; }else{ if(g_Worker && nMissing < MAX_MISSING_PERMITED){ name.sname.tag = t[i].name; missing[nMissing] = name; nMissing++; } } } close_handle(hGroup); if(!bThisIsAServer){ close_handle(hNode); } unlock_rtdb(); if(nMissing && g_Worker){ if(nMissing > 16){ memset(&missing[0].sname.tag, 0, sizeof(TAG_KEY)); g_Worker->inform_load(missing, 1); }else{ g_Worker->inform_load(missing, nMissing); } } return retcount; }
__uint _on_add_edit_groups(PCRTK_PACKET p, bool /* bGenerateEvents */) { RTK_CURSOR hNode, hGroup; NODE_KEY nk; PRTK_GROUP png, pg=0; __uint count; if(p->data_size % sizeof(RTK_GROUP)){ return 0; } if(!lock_rtdb(__true, 100)){ return 0; } host_to_node(&p->src.host, &nk); hNode = open_node(&nk); if(!hNode){ unlock_rtdb(); return 0; } count = p->data_size / sizeof(RTK_GROUP); png = (PRTK_GROUP)p->data; for(__uint i=0; i<count; i++, png++){ hGroup = open_group(hNode, &png->key); pg = (PRTK_GROUP)cursor_get_item(hGroup); if(pg){ memcpy( pg->description, png->description, sizeof(pg->description) ); pg->period = png->period; }else{ hGroup = create_group(hNode, png); pg = (PRTK_GROUP)cursor_get_item(hGroup); } if(pg){ pg->d.flags = png->d.flags; } DEBUG_PRINTF(( "Got group %s, flag=%08x\n", (char *)CGroupName(png->key), png->d.flags )); close_handle(hGroup); if(pg /* && bGenerateEvents */){ TAG_NAME name; name.node = nk; name.sname.group = png->key; rtk_queue_event( PT_AddGroup, &name, &p->src ); } } close_handle(hNode); unlock_rtdb(); return count; }