이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
현재 OPC UA 서버 데이터 읽기 및 쓰기
이 예제는 OPC UA 서버에서 데이터를 읽고 쓰는 방법을 보여줍니다.
MATLAB® 세션에서 이 예제를 실행하려면 Prosys OPC UA Simulation Server를 설치하고 시작해야 합니다. 자세한 내용은 Industrial Communication Toolbox™ 문서의 시작하기 섹션을 참조하십시오.
클라이언트를 생성하고 서버에 연결하기
opcuaserverinfo를 사용하여 로컬 디스커버리 서비스에 대한 쿼리 결과를 활용하거나, 연결하려는 서버의 호스트 이름과 포트 번호를 직접 사용하여 client 객체를 생성할 수 있습니다. 이 경우에는 호스트와 포트 번호를 사용하는 구문을 사용하십시오.
uaClient = opcua('localhost',53530);
connect(uaClient)
StaticData 네임스페이스에서 DoubleDataItem, FloatDataItem, Int16DataItem 노드를 찾으십시오.
staticNode = findNodeByName(uaClient.Namespace,'StaticData','-once'); dataItemsNode = findNodeByName(staticNode,'DataItems','-once'); doubleNode = findNodeByName(dataItemsNode,'DoubleDataItem'); floatNode = findNodeByName(dataItemsNode,'FloatDataItem'); int16Node = findNodeByName(dataItemsNode,'Int16DataItem'); nodes = [doubleNode,floatNode,int16Node]
nodes =
1x3 OPC UA Node array:
index Name NsInd Identifier NodeType Children
----- -------------- ----- -------------- -------- --------
1 DoubleDataItem 3 DoubleDataItem Variable 1
2 FloatDataItem 3 FloatDataItem Variable 1
3 Int16DataItem 3 Int16DataItem Variable 1
노드로부터 값 읽어오기
노드의 현재 값을 읽으려면 readValue를 사용하십시오. 값과 값이 업데이트될 때의 타임스탬프, 그리고 값이 기록될 당시의 품질 정보를 조회할 수 있습니다.
[v,t,q] = readValue(uaClient,nodes)
v =
3×1 cell array
{[0]}
{[0]}
{[0]}
t =
3×1 datetime array
19-Mar-2019 02:52:35
19-Mar-2019 02:52:35
19-Mar-2019 02:52:35
q =
OPC UA Quality ID:
'Good'
'Good'
'Good'
여러 노드에서 값을 읽을 경우, 값은 셀형 배열로 반환됩니다. 서버에 저장된 데이터의 클래스는 가능한 한 보존됩니다.
valClasses = cellfun(@class,v,'UniformOutput',false)
valClasses =
3×1 cell array
{'double'}
{'single'}
{'int16' }
타임스탬프는 MATLAB® datetime형 변수로 반환됩니다. 이는 소스가 서버에 값을 제공한 시점을 나타냅니다.
t
t = 3×1 datetime array 19-Mar-2019 02:52:35 19-Mar-2019 02:52:35 19-Mar-2019 02:52:35
품질 정보는 OPC UA 품질 형식으로 반환되며, 텍스트 설명으로 표시됩니다.
q
q = OPC UA Quality ID: 'Good' 'Good' 'Good'
반환된 품질의 특성을 확인하기 위해 품질을 질의할 수 있습니다. 이 예제에서는 품질이 양호합니다.
isGood(q)
ans = 3×1 logical array 1 1 1
해당 값은 보간되지 않은 원시 값(즉, 서버가 센서에서 직접 가져와 저장한 값)입니다.
interpolated = isInterpolated(q) raw = isRaw(q)
interpolated = 3×1 logical array 0 0 0 raw = 3×1 logical array 1 1 1
노드에 데이터 쓰기
어떤 스칼라 노드에도 데이터를 쓸 수 있습니다. 여러 노드에 데이터를 쓰려면, 데이터를 쓸 각 노드에 대한 값으로 구성된 셀형 배열을 전달해야 합니다.
newValues = {12,65,-4};
writeValue(uaClient,nodes,newValues);
값이 정확하게 쓰였는지 확인하고, 해당 값을 다시 가져옵니다.
serverValues = readValue(uaClient,nodes)
serverValues =
3×1 cell array
{[12]}
{[65]}
{[-4]}
셀형 배열 내의 값을 직접 업데이트하고 서버에 다시 쓸 수 있습니다.
serverValues{2} = serverValues{2} + 1;
writeValue(uaClient,nodes,serverValues);
단일 노드에서 값 읽기 및 쓰기
단일 노드를 사용할 때는 셀형 배열을 사용하지 않고도 값을 직접 수신하고 전달할 수 있습니다.
dblValue = readValue(uaClient, doubleNode) writeValue(uaClient, doubleNode, dblValue+15.6) newDbl = readValue(uaClient, doubleNode)
dblValue =
12
newDbl =
27.6000
노드에서 직접 읽기 및 쓰기
클라이언트에서 노드를 생성했거나(Namespace 속성 또는 browseNamespace 사용) 노드 변수를 생성할 때 opcuanode 함수에 클라이언트를 전달한 경우, 해당 노드 변수에서 직접 읽고 쓸 수 있습니다.
[vals,ts,qual] = readValue(nodes) writeValue(nodes,v)
vals =
3×1 cell array
{[27.6000]}
{[ 66]}
{[ -4]}
ts =
3×1 datetime array
19-Mar-2019 02:52:36
19-Mar-2019 02:52:36
19-Mar-2019 02:52:36
qual =
OPC UA Quality ID:
'Good'
'Good'
'Good'
서버와의 연결 끊기
서버와의 통신이 완료되면 클라이언트와 서버 간의 연결을 끊으십시오. 이는 MATLAB에서 클라이언트 변수가 유효 범위를 벗어날 때에도 자동으로 수행됩니다.
disconnect(uaClient);