当前位置:网站首页>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,解决行业痛点.
边栏推荐
猜你喜欢
随机推荐
PS2手柄通讯协议解析—附资料和源码「建议收藏」
轮询以及webSocket与socket.io原理
router.afterEach()
win11安装deepin20.6双系统(双硬盘)
sprintboot验证码kaptcha 自定义图片样式
JNDI与RMI、LDAP
Error creating bean with name ‘sqlSessionFactory‘ defined in class path reso「建议收藏」
v-if指令:操作dom元素(标签)的显示与隐藏
【科研】常见火灾数据集
LeetCode-1. Two Sum
挑战用五行代码轻松集成登录系统,实现单点登录
超宽带uwb精准定位,厘米级室内定位技术,实时高精度方案应用
The sword refers to OfferⅡ 045. The bottommost leftmost value of the binary tree dfs
【QT VS项目名称修改】
JWT 实现登录认证 + Token 自动续期方案
Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
华为-求int型正整数在内存中存储时1的个数
3 年 CRUD 从 8K 涨到 28K,谁知道这4个月我到底经历了什么?
烟雾、空气质量、温湿度...自己徒手做个环境检测设备
How to use bitwise operators in C language