如何利用Socket和OPC UA实现非标通讯设备的工业互联?

本文发布的主要目的是为了解决工业互联网过程中,对于非标通讯协议(私有协议)的通讯设备如何物联或互联的问题。首先,让我们看一下下边这张图:

                         图 1 基于工业组态架构的监控系统

    图1中,传统的PLC、DCS等装置通过modbus等标准协议实现与组态软件的数据交换,但是对于部分非标准协议的监控装置,组态软件想要实现与设备的数据交换就显得尤其困难,尤其对老旧改造型的项目,因此如何实现低成本、快速接入这些非标通讯协议的设备数据是很多人头疼的问题。

    SocketOPC中间件正是为了解决该类问题应运而生的,它能够实现对非标通讯设备的基于Socket、com等方式的数据接入,并写到现场的OPC Server中,现场工程师能够快速组态,完成对这些扩展设备的监控。与此同时,我们只需要这些私有通讯协议的厂家提供数据交换格式即可。

   SocketOPC采集的数据通过OPC Server与现场组态平台实现数据交换,同时,它也能够结合用户的实际需要,独立开发系统,采用互联网架构方式将设备直连云端,真正实现了设备到云的物联网架构。这样做有如下几个优势:

(1) SocketOPC是对SCADA组件的功能扩充,灵活度大;

(2) 设备通过SocketOPC的MQTT功能直接上云,如阿里的IOT平台;

(3) 工业互联化的进程中,设备物联化的过程中最头疼的问题就是各种协议的不适配, SocketOPC只需要少量的开发就能解决私有协议通讯设备基于OPC统一架构的物联化;

(4)应用系统支持云平台及混合模式开发(C/S、B/S、移动APP等),灵活性高于组态软件。

KepOPCV2.4.9试用及下载地址:https://pan.baidu.com/s/1_JoEmRnM0Q8xCljbDKx6dw  提取码:ma25(或百度搜索python opc)

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的Java代码示例,可以使用Java语言和Spring框架实现WebSocket结合OPC UA实现订阅并返回数据给前端: ```java // 导入相关依赖 import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaMonitoredItem; import org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaSubscription; import org.eclipse.milo.opcua.sdk.client.subscriptions.UaSubscription; import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue; import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription; import org.eclipse.milo.opcua.stack.core.types.structured.MonitoredItemCreateRequest; import org.eclipse.milo.opcua.stack.core.types.structured.MonitoredItemCreateResult; import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @Component public class OpcUaWebSocketSubscriptionHandler { // 注入WebSocket消息发送模板 private final SimpMessagingTemplate simpMessagingTemplate; // 保存已订阅的OPC UA监控项 private final List<UaMonitoredItem> monitoredItemList = new ArrayList<>(); // OPC UA连接信息 private final EndpointDescription endpoint; // WebSocket会话对象 private WebSocketSession webSocketSession; // OPC UA订阅对象 private UaSubscription subscription; // 构造函数 public OpcUaWebSocketSubscriptionHandler(SimpMessagingTemplate simpMessagingTemplate) { this.simpMessagingTemplate = simpMessagingTemplate; // TODO: 初始化OPC UA连接信息 } // 处理WebSocket订阅请求 public void handleWebSocketSubscription(WebSocketSession session, String nodeId) { this.webSocketSession = session; // 创建OPC UA订阅 CompletableFuture<UaSubscription> future = createOpcUaSubscription(); future.thenAccept(subscription -> { this.subscription = subscription; // 创建OPC UA监控项 CompletableFuture<MonitoredItemCreateResult> monitoredItemFuture = createOpcUaMonitoredItem(nodeId); monitoredItemFuture.thenAccept(result -> { if (result.getStatusCode().isGood()) { UaMonitoredItem monitoredItem = result.getMonitoredItem(); monitoredItemList.add(monitoredItem); } }); }); } // 处理WebSocket取消订阅请求 public void handleWebSocketUnsubscription(WebSocketSession session, String nodeId) { if (this.webSocketSession != null && webSocketSession.equals(session)) { for (UaMonitoredItem monitoredItem : monitoredItemList) { if (monitoredItem.getReadValueId().getNodeId().getIdentifier().toString().equals(nodeId)) { subscription.removeItem(monitoredItem); monitoredItemList.remove(monitoredItem); break; } } } } // 创建OPC UA订阅 private CompletableFuture<UaSubscription> createOpcUaSubscription() { CompletableFuture<UaSubscription> future = new CompletableFuture<>(); // 创建OPC UA订阅 OpcUaSubscription subscription = new OpcUaSubscription(this.endpoint.getClient(), 1000.0); subscription.addNotificationListener(this::onSubscriptionValue); subscription.addStatusListener(this::onSubscriptionStatusChanged); subscription.setPublishingEnabled(true); subscription.setLifetimeCount(1000); subscription.setMaxKeepAliveCount(10); subscription.setPriority((byte) 0); // 启动OPC UA订阅 CompletableFuture<Void> future1 = subscription.connect(); future1.thenAccept(v -> { if (subscription.getSession().isPresent()) { future.complete(subscription); } }); return future; } // 创建OPC UA监控项 private CompletableFuture<MonitoredItemCreateResult> createOpcUaMonitoredItem(String nodeId) { CompletableFuture<MonitoredItemCreateResult> future = new CompletableFuture<>(); // 创建OPC UA监控项 ReadValueId readValueId = new ReadValueId( new NodeId(0, nodeId), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE); MonitoredItemCreateRequest request = new MonitoredItemCreateRequest( readValueId, MonitoringMode.Reporting, new MonitoringParameters( 0.0, 10.0, null, 10, true ) ); // 添加OPC UA监控项 CompletableFuture<List<MonitoredItemCreateResult>> future1 = subscription.createMonitoredItems( TimestampsToReturn.Both, Lists.newArrayList(request) ); future1.thenAccept(resultList -> { if (resultList.size() > 0) { future.complete(resultList.get(0)); } }); return future; } // 处理OPC UA订阅值变化事件 private void onSubscriptionValue(UaMonitoredItem item, DataValue value) { String nodeId = item.getReadValueId().getNodeId().getIdentifier().toString(); String message = value.getValue().getValue().toString(); simpMessagingTemplate.convertAndSendToUser( webSocketSession.getId(), "/topic/opcua/value/" + nodeId, message ); } // 处理OPC UA订阅状态变化事件 private void onSubscriptionStatusChanged(UaSubscription subscription, StatusCode statusCode) { if (!statusCode.isGood()) { simpMessagingTemplate.convertAndSendToUser( webSocketSession.getId(), "/topic/opcua/status", "OPC UA subscription status changed: " + statusCode ); } } } ``` 这段代码实现了WebSocket结合OPC UA实现订阅,并将数据发送给前端的功能。在代码中,我们使用了Spring框架的SimpMessagingTemplate组件,用于发送WebSocket消息。我们通过创建UaMonitoredItem对象实现OPC UA变量值的监控,并在变量值变化时,通过SimpMessagingTemplate将变量值发送给前端。同时,我们也实现了处理WebSocket取消订阅请求的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值