当前位置:网站首页>The DGIOT platform displays the whole process code analysis of OPC reporting data in real time
The DGIOT platform displays the whole process code analysis of OPC reporting data in real time
2022-08-10 17:18:00 【DGIOT Platform】
[小 迪 导读]:OPCSoftware is the most widely used software in the field of industrial automation,It is deeply loved by industrial controllers.But there are many cases,OPCThe software does not meet the actual needs of use:
使用场景
1.OPCOnly works on the intranet,It is hoped that the data can be transmitted to the external network,随时随地查看
2.OPCData is difficult to store
3.Hope to show the data better,进行数据分析
整体交互图
1. dgiot_dtu从kepserver获取数据
在opc与kepserver完成连接之后,dgiot_dtu通过调用GetOpcDaService函数连接kepserverImplement data callback
public OpcDaService GetOpcDaService(string host, string serviceProgId)
{
var service = hostCollection.Where(a => a.ServiceIds.Contains(serviceProgId) && a.Host == host)
.FirstOrDefault();
if (service == null)
{
return null;
}
OpcDaService service1 = null;
if (CheckServiceExisted(service, serviceProgId))
{
service1 = opcDaServices.Find(item => { return item.Host == service.Host && item.ServiceId == serviceProgId; });
}
else
{
OpcDaServer daService = new OpcDaServer(serviceProgId, service.Host);
service1 = new OpcDaService()
{
Host = service.Host,
ServiceId = serviceProgId,
Service = daService,
OpcDaGroupS = new Dictionary<string, OpcDaGroup>()
};
opcDaServices.Add(service1);
}
if (service1.Service.IsConnected == false)
{
try
{
service1.Service.ConnectionStateChanged += new EventHandler<OpcDaServerConnectionStateChangedEventArgs>(ConnectionStateChanged);
service1.Service.Connect();
}
catch (Exception e)
{
LogHelper.Log("Connect " + service1.Host + ", ServiceId " + service1.ServiceId + "error!!" + e.Message);
}
}
return service1;
}
COPY
2. dgiot_dtu数据发布
dgiot_dtuAfter data collection is complete,和dgiotPlatform connection is throughmqtt来进行连接,dgiot_dtuPublish as device side、dgiotThe platform acts as a server to subscribe
public void ValueChangedCallBack(OpcDaGroup group, OpcDaItemValue[] values)
{
string groupKey = "";
JsonObject properties = new JsonObject();
values.ToList().ForEach(v =>
{
if (v.Item != null && v.Value != null)
{
properties.Add(v.Item.ItemId, v.Value);
groupKey = v.Item.UserData as string;
OpcDa.setItems(groupKey, v.Item.ItemId, properties);
}
});
string topic = "$dg/thing/" + productId + "/" + devAddr + "/properties/report";
MqttClientHelper.Publish(topic, Encoding.UTF8.GetBytes(properties.ToString()));
return;
}
COPY
3.平台通过dlinkConvert data points
在dgiotWhen receiving subscription information,在dink中调用on_message_publish来匹配topictype for point-to-point conversion
on_message_publish(Message = #message{topic = <<"$dg/thing/", Topic/binary>>, payload = Payload, from = _ClientId, headers = _Headers}, _State) ->
case re:split(Topic, <<"/">>) of
[ProductId, DevAddr, <<"properties">>, <<"report">>] ->
dgiot_dlink_proctol:properties_report(ProductId, DevAddr, get_payload(Payload));
[ProductId, DevAddr, <<"firmware">>, <<"report">>] ->
dgiot_dlink_proctol:firmware_report(ProductId, DevAddr, get_payload(Payload));
_ ->
pass
end,
{ok, Message};
COPY
4. 平台通过task将数据存入TD,并使用mqttReport to the object model
After completing the point conversion,将数据存入TD数据库、At the same time, the data is also reported to the object model display
save_td(ProductId, DevAddr, Ack, AppData) ->
case length(maps:to_list(Ack)) of
0 ->
#{};
_ ->
NewAck = dgiot_task:get_collection(ProductId, [], Ack, Ack),
NewData = dgiot_task:get_calculated(ProductId, NewAck),
Keys = 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 = maps:keys(AllData),
case Keys -- AllDataKey of
List when length(List) == 0 andalso length(AllDataKey) =/= 0 ->
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),
Channel = dgiot_product:get_taskchannel(ProductId),
dgiot_bridge:send_log(Channel, ProductId, DevAddr, "~s ~p save td => ProductId ~p DevAddr ~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),
AllData
end
end.
COPY
5.Platform configuration object model and data display
[小 迪 点评]
- 鉴此,dgiotSpecifically provided based onOPC通讯的OPC接口,以实现OPCSimple transfer of data,解决行业痛点.
边栏推荐
猜你喜欢
随机推荐
glui.h无法找到描述+解决+测试
取Json中的数组进行遍历
JWT 实现登录认证 + Token 自动续期方案
剑指OfferⅡ 045.二叉树最底层最左边的值 dfs
glut库更新旧程序无法完成编译问题描述
从宠爱到嫌弃,蒸发1500亿后,这家明星企业为何陨落?
Yi Gene|In-depth review: epigenetic regulation of m6A RNA methylation in brain development and disease
C语言各种符号如何使用
符合信创要求的堡垒机有哪些?支持哪些系统?
C专家编程 第10章 再论指针 10.6 使用指针从函数返回一个数组
烟雾、空气质量、温湿度...自己徒手做个环境检测设备
promise笔记(四)
百日刷题挑战--错题01day
fastjson链分析(1.2.22-47)
聚焦企业流程智能化发展新趋势,中国信通院2022 RPA创新产业峰会即将开启
3 年 CRUD 从 8K 涨到 28K,谁知道这4个月我到底经历了什么?
超宽带uwb精准定位,厘米级室内定位技术,实时高精度方案应用
【云原生| Docker】 部署 Django & mysql 项目
JNDI与RMI、LDAP
神经网络全连接层的作用,各种神经网络的优缺点