주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

현재 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);