当前位置: 首页 > Web前端 > HTML

DGIOT平台实时展示OPC上报数据全过程的代码解析

时间:2023-03-28 15:46:05 HTML

【小迪攻略】:OPC软件是工业自动化领域应用最广泛的软件,深受工业控制器的喜爱。但也有很多情况OPC软件不能满足实际使用需求:使用场景1.OPC只在内网运行,希望能随时随地将数据传输到外网查看2.OPC数据存储困难在数据库中3.希望可以更好的数据展示和数据分析整体交互图1.dgiot_dtu从kepserver获取数据opc和kepserver连接完成后,dgiot_dtu通过调用GetOpcDaService函数连接kepserver,实现数据回调publicOpcDaServiceGetOpcDaService(stringhost,stringserviceProgId){varservice=hostCollection.Where(a=>a.ServiceIds.Contains(serviceProgId)&&a.Host==host).FirstOrDefault();如果(服务==空){返回空;}OpcDaServiceservice1=null;if(CheckServiceExisted(service,serviceProgId)){service1=opcDaServices.Find(item=>{returnitem.Host==service.Host&&item.ServiceId==serviceProgId;});}else{OpcDaServerdaService=newOpcDaServer(serviceProgId,service.Host);service1=newOpcDaService(){Host=service.Host,ServiceId=serviceProgId,Service=daService,OpcDaGroupS=newDictionary()};opcDaServices.Add(service1);}if(service1.Service.IsConnected==false){try{service1.Service.ConnectionStateChanged+=newEventHandler(ConnectionStateChanged);service1.Service.Connect();}catch(Exceptione){LogHelper.Log("Connect"+service1.Host+",ServiceId"+service1.ServiceId+"error!!"+e.Message);}}返回服务1;}2。dgiot_dtu数据发布dgiot_dtu完成数据采集后,通过mqtt与dgiot平台连接,dgiot_dtu作为device端发布,dgiot平台作为server订阅publicvoidValueChangedCallBack(OpcDaGroupgroup,OpcDaItemValue[]values){stringgroupKey="";JsonObject属性=newJsonObject();values.ToList().ForEach(v=>{if(v.Item!=null&&v.Value!=null){properties.Add(v.Item.ItemId,v.Value);groupKey=v.Item.UserData作为字符串;OpcDa.setItems(groupKey,v.Item.ItemId,properties);}});stringtopic="$dg/thing/"+productId+"/"+devAddr+"/properties/report";MqttClientHelper.Publish(主题,Encoding.UTF8.GetBytes(properties.ToString()));返回;}3.平台通过dlink进行数据点转换。dgiot收到订阅信息后,调用dink中的on_message_publish匹配主题类型进行点数转换on_message_publish(Message=#message{topic=<<"$dg/thing/",Topic/binary>>,payload=Payload,from=_ClientId,headers=_Headers},_State)->casere:split(Topic,<<"/">>)of[ProductId,DevAddr,<<"properties">>,<<"报告">>]->dgiot_dlink_proctol:properties_report(ProductId,DevAddr,get_payload(Payload));[ProductId,DevAddr,<<"firmware">>,<<"report">>]->dgiot_dlink_proctol:firmware_report(ProductId,DevAddr,get_payload(Payload));_->passend,{ok,Message};4.平台通过task将数据存入TD,并使用mqtt上报给对象模型完成积分转换,然后将数据存入TD数据库,同时也将数据上报给对象模型以显示save_td(ProductId,DevAddr,Ack,AppData)->caselength(maps:to_list(Ack))of0->#{};_->NewAck=dgiot_task:get_collection(ProductId,[],Ack,Ack),NewData=dgiot_task:get_calculated(ProductId,NewAck),键=dgiot_product:get_keys(ProductId),DeviceId=dgiot_parse_id:get_deviceid(ProductId,DevAddr),Interval=maps:get(<<"interval">>,AppData,3),AllData=merge_cache_data(DeviceId,NewData,Interval),AllDataKey=地图:keys(AllData),caseKeys--当length(List)==0和length(AllDataKey)=/=0时List的AllDataKey->ChannelId=dgiot_parse_id:get_channelid(dgiot_utils:to_binary(?BRIDGE_CHL),<<"DGIOTTOPO">>,<<"TOPO组态通道"/utf8>>),dgiot_channelx:do_message(ChannelId,{topo_thing,ProductId,DeviceId,AllData}),dgiot_tdengine_adapter:save(ProductId,DevAddr,AllData),通道=dgiot_product:get_taskchannel(ProductId),dgiot_bridge:send_log(Channel,ProductId,DevAddr,"~s~psavetd=>ProductId~pDevAddr~p~ts",[?FILE,?LINE,ProductId,DevAddr,unicode:characters_to_list(jsx:encode(AllData))]),dgiot_metrics:inc(dgiot_task,<<"task_save">>,1),NotificationTopic=<<"$dg/user/alarm/",ProductId/binary,"/",DeviceId/binary,"/properties/report">>,dgiot_mqtt:publish(DeviceId,NotificationTopic,jsx:encode(AllData)),AllData;_->save_cache_data(DeviceId,AllData),AllDataendend.5.平台配置对象模型,展示数据【小迪点评】有鉴于此,dgiot特地提供了基于OPC通信的OPC接口,实现OPC数据的简单传输,解决行业痛点。想了解dgiot的更多详情,欢迎查看GitHub上的相关源码。