Java和PLC(可編程邏輯控制器)是自動化系統中非常常見的兩個組件。在某些應用場景下,需要直接從Java程序訪問PLC以獲取或設置數據。這篇文章將介紹如何使用Java和OPC UA(開放式基礎架構聯盟)標準協議實現與PLC的通訊。
OPC UA是一種跨平臺、可伸縮和安全的通訊協議,可使不同供應商的數據源之間實現通訊。OPC UA的實現需要服務器和客戶端兩部分組件,在這個例子中,我們將假設PLC是服務器。
第一步是安裝OPC UA的Java庫。我們使用Eclipse Milo,一個開源Java庫,它實現了OPC UA標準協議。下載Milo的jar包并將其添加到Java項目的類路徑中。
<dependency> <groupId>com.digitalpetri.opcua</groupId> <artifactId>opc-ua-stack</artifactId> <version>0.4.0</version> </dependency>
接下來,我們需要連接到PLC并讀取/寫入數據。我們將假設PLC服務器的地址為“opc.tcp://localhost:4840/freeopcua/server”,并且我們要讀取節點“ns=2;s=Temperature”,它代表了PLC的溫度傳感器。
EndpointDescription[] endpoints = UaTcpStackClient.getEndpoints("opc.tcp://localhost:4840/freeopcua/server").get(); EndpointDescription endpoint = Arrays.stream(endpoints).filter(e -> e.getSecurityPolicyUri().equals(SecurityPolicy.None.getSecurityPolicyUri())).findFirst().orElseThrow(() -> new Exception("no desired endpoints returned")); OpcUaClientConfig config = OpcUaClientConfig.builder() .setEndpoint(endpoint) .build(); OpcUaClient client = new OpcUaClient(config); client.connect().get(); NodeId nodeId = new NodeId(2, "Temperature"); DataValue value = client.readValue(0, TimestampsToReturn.Both, nodeId).get(); System.out.println(value.getValue());
以上代碼通過OPC UA連接了PLC服務器,并從節點“ns=2;s=Temperature”讀取了數據。讀取的數據類型為DataValue,可以將其轉換成需要的數據類型(例如int、float等)。
寫入數據與讀取數據類似:
int intValue = 42; DataValue dataValue = new DataValue(new Variant(intValue)); client.writeValue(0, nodeId, dataValue).get();
以上代碼將整數42寫入節點“ns=2;s=Temperature”。DataValue對象可以根據需要設置為不同的數據類型。
總結:使用Java和OPC UA,可以輕松地與PLC進行通訊。 Eclipse Milo是一個方便易用的Java庫,可用于實現OPC UA協議。上述代碼可以用于讀取/寫入OPC UA服務器中的節點值。