이섹션에서는 RoboDK OPC UA 서버와통신하는 Beckhoff TwinCAT PLC의샘플프로그램을보여줍니다.
프로그램 주요 내용
VAR
bConnected :BOOL;
스테이션 포인터 :DINT;
iStep :INT;
bStart :BOOL;;
i INT;
TON TON;
bReset :BOOL;
bWrite :BOOL;
TON2 :TON;
bShow :BOOL:=TRUE;
bVis :BOOL:=True;
END_VAR
VAR
로봇_이름 :문자열(80):='abb_rb1';
Item_ID :ULINT;
arrJoints :array[0..11]의 lreal;
strJoints :문자열(80):='';
arrJointsFromStr:ARRAY[1..11]OF LREAL;
sSeparator :문자열(1) := ',';
arrJointsCommand:ARRAY[1..11]OF LREAL;
strJointsCommand:STRING(80);
END_VAR
VAR 상수
cStepWaitCmd :INT:=0;
cStepInit :INT:=5;
cStepGetItem :INT:=10;
cStepGetItemReset :INT:=20;
cStepGetItemError :INT:=990;
cStepGetJoints :INT:=30;
cStepGetJointsReset :INT:=40;
cStepGetJointsError :INT:=991;
cStepGetJointsStr :INT:=50;
cStepGetJointsStrReset:INT:=60;
cStepGetJointsStrError:INT:=992;
cStepSetJointStrDelay :INT:=69;
cStepSetJointsStr :INT:=70;
cStepSetJointsStrReset:INT:=80;
cStepSetJointsStrError:INT:=993;
cStepEnd :INT:=300;
cStepWaitReset :INT:=999;
END_VAR
VAR
aSplit :ARRAY[1..11] OF STRING(80);
bResultSplit :BOOL;
debug :BOOL;
URL :STRING:='http://192.168.3.42:8091';
END_VAR
bConnected:=OPCUA_VirtualClient_RoboDK_Station.bConnected;
사례 i단계
cStepWaitCmd:
IF bStart THEN
iStep:=cStepInit;
bStart:=FALSE;
END_IF
cStepInit:
StationPointer:=0;
FOR i :=1 TO 11 DO
arrJoints[i]:=0.0;
arrJointsFromStr[i]:=0.0;
aSplit[i]:='';
END_FOR
OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy가 아닌 경우
그리고 OPCUA_VirtualClient_RoboDK_Station.getItem.bError가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.getJoints.bError가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.setJoints.bBusy가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.setJoints.bError가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy가 아닙니다.
그리고 OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError가 아닙니다.
그때
iStep:=cStepGetItem;
END_IF
iStep:=cStepGetItem;
cStepGetItem:
IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone THEN
iStep:=cStepGetItemReset;
Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError THEN
iStep:=cStepGetItemError;
END_IF
cStepGetItemReset:
OPCUA_VirtualClient_RoboDK_Station.getItem.bError가 아닌 경우
그리고 OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy가 아닙니다.
그때
iStep:=cStepGetJoints;
END_IF
cStepGetJoints:
IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone
그리고 OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy가 아닙니다.
그때
iStep:=cStepGetJointsReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError THEN
iStep:=991;
END_IF
cStepGetJointsReset:
OPCUA_VirtualClient_RoboDK_Station.getItem.bError가 아닌 경우
그리고 OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy가 아닙니다.
그때
iStep:=cStepGetJointsStr;
END_IF;
cStepGetJointsStr:
IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone
그리고 OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy가 아닙니다.
그때
iStep:=cStepGetJointsStrReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError THEN
iStep:=cStepGetJointsStrError;
END_IF
cStepGetJointsStrReset:
OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError가 아닌 경우
그리고 OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy가 아닙니다.
그때
iStep:=cStepSetJointStrDelay;
END_IF;
cStepSetJointStrDelay:
strJointsCommand:=''; strJointsCommand:=CONCAT(LREAL_TO_STRING(arrJointsCommand[1]),strJointsCommand);
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[2]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[3]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[4]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[5]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[6]));
TON2(IN:=TRUE,PT:=T#0.2S);
IF TON2.Q THEN
ton2(in:=false);
iStep:=cStepSetJointsStr;
END_IF
cStepSetJointsStr:
IF (
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone
그리고
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
)
또는 bWrite
그때
iStep:=cStepSetJointsStrReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
그때
iStep:=cStepSetJointsStrError;
END_IF
cStepSetJointsStrReset:
bWrite:=FALSE;
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bExecute:=FALSE;
IF NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
그리고 OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy가 아닙니다.
그때
아이스텝:=c스텝엔드;
END_IF;
cStepEnd:
TON(IN:=TRUE,PT:=T#0.1S);
IF TON.Q THEN
ton(in:=false);
디버그하지 않으면
iStep:=10;
기타
iStep:=cStepSetJointStrDelay;
END_IF;
END_IF
cStepGetItemError:
Item_ID:=0;
iStep:=cStepWaitReset;
cStepGetJointsError:
FOR i :=0 TO 11 DO
arrJoints[i]:=-99999.99;
END_FOR
iStep:=cStepWaitReset;
cStepGetJointsStrError:
strJoints:='';
iStep:=cStepWaitReset;
cStepWaitReset:
IF bReset THEN
iStep:=cStepInit;
bReset:=FALSE;
END_IF;
END_CASE
aSplit[1] := strJoints;
FOR i:=1 TO 7 DO
bResultSplit := FindAndSplit(
pSeparator := ADR(sSeparator)
,pSrcString := ADR(aSplit[i])
,pLeftString:= ADR(aSplit[i])
,nLeftSize := SIZEOF(aSplit[i])
,pRightString:= ADR(aSplit[i+1])
,nRightSize := SIZEOF(aSplit[i+1])
,bSearchFromRight := FALSE);
IF NOT bResultSplit THEN
EXIT;
END_IF
END_FOR
FOR i :=1 TO 6 DO
arrJointsFromStr[i]:=STRING_TO_LREAL(aSplit[i]);
END_FOR;
//
OPCUA_VirtualClient_RoboDK_Station.getItem(
bExecute:=iStep=cStepGetItem
,Item_Name:=로봇_이름
);
OPCUA_VirtualClient_RoboDK_Station.getJoints(
bExecute:=iStep=cStepGetJoints
,Item_ID:=Item_ID,Joints=>arrJoints
);
OPCUA_VirtualClient_RoboDK_Station.getJointsStr(
bExecute:=iStep=cStepGetJointsStr
,로봇_이름:=로봇_이름,조인트=>strJoints
);
IF bWrite THEN
OPCUA_VirtualClient_RoboDK_Station.setJointsStr(
bExecute:=TRUE
,로봇_이름:=로봇_이름,조인트:=strJointsCommand);
END_IF;