Esta sección muestra un programa de ejemplo de un PLC TwinCAT de Beckhoff que se comunica con el servidor OPC UA de RoboDK.
PROGRAMA PRINCIPAL
VAR
bConectado :BOOL;
StationPointer :DINT;
iPaso :INT;
bStart :BOOL;;
i :INT;
TON :TON
bReset :BOOL;
bEscribir :BOOL;
TON2 :TON
bShow :BOOL:=TRUE;
bVis :BOOL:=Verdadero;
FIN_VAR
VAR
Nombre_robot :CADENA(80):='ABB_RB1';
ID_artículo :ULINT;
arrJoints :ARRAY[0..11]DE LREAL;
strJoints :CADENA(80):='';
arrJointsFromStr:ARRAY[1..11]OF LREAL;
sSeparador :CADENA(1) := ',';
arrJointsComando:ARRAY[1..11]OF LREAL;
strJointsComando:STRING(80);
FIN_VAR
VAR CONSTANTE
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;
FIN_VAR
VAR
aSplit :ARRAY[1..11] OF STRING(80);
bResultadoSplit :BOOL;
depurar :BOOL;
URL :STRING:='http://192.168.3.42:8091';
FIN_VAR
bConectado:=OPCUA_VirtualClient_RoboDK_Station.bConectado;
CASO iStep DE
cStepWaitCmd:
IF bStart THEN
iPaso:=cPasoInicio;
bInicio:=FALSE;
FIN_IF
cStepInit:
PunteroEstación:=0;
FOR i :=1 TO 11 DO
arrJoints[i]:=0,0;
arrJointsFromStr[i]:=0.0;
aSplit[i]:='';
FIN_FOR
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJoints.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJoints.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
ENTONCES
iPaso:=cPasoGetItem;
FIN_IF
iPaso:=cPasoGetItem;
cStepGetItem:
IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone THEN
iPaso:=cPasoGetItemReset;
Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError THEN
iStep:=cStepGetItemError;
FIN_IF
cStepGetItemReset:
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
ENTONCES
iPaso:=cPasoGetJoints;
FIN_IF
cStepGetJoints:
IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy
ENTONCES
iStep:=cStepGetJointsReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError THEN
iPaso:=991;
FIN_IF
cStepGetJointsReset:
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
ENTONCES
iStep:=cStepGetJointsStr;
FIN_IF;
cStepGetJointsStr:
IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
ENTONCES
iStep:=cStepGetJointsStrReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError THEN
iStep:=cStepGetJointsStrError;
FIN_IF
cStepGetJointsStrReset:
IF NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
ENTONCES
iPaso:=cPasoSetJointStrDelay;
FIN_IF;
cStepSetJointStrDelay:
strJointsComando:=''; strJointsComando:=CONCAT(LREAL_TO_STRING(arrJointsComando[1]),strJointsComando);
strJointsComando:=CONCAT(strJointsComando,',');
strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[2]));
strJointsComando:=CONCAT(strJointsComando,',');
strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[3]));
strJointsComando:=CONCAT(strJointsComando,',');
strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[4]));
strJointsComando:=CONCAT(strJointsComando,',');
strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[5]));
strJointsComando:=CONCAT(strJointsComando,',');
strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[6]));
TON2(IN:=VERDADERO,PT:=T#0,2S);
IF TON2.Q THEN
TON2(IN:=FALSO);
iPaso:=cPasoSetJointsStr;
FIN_IF
cStepSetJointsStr:
SI (
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone
Y NO
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
)
OR NOT bEscribir
ENTONCES
iPaso:=cPasoSetJointsStrReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
ENTONCES
iStep:=cStepSetJointsStrError;
FIN_IF
cStepSetJointsStrReset:
bEscribir:=FALSE;
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bExecute:=FALSE;
IF NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
ENTONCES
iPaso:=cFinPaso;
FIN_IF;
cStepEnd:
TON(IN:=VERDADERO,PT:=T#0,1S);
IF TON.Q THEN
TON(IN:=FALSE);
IF NOT debug THEN
iPaso:=10;
ELSE
iPaso:=cPasoSetJointStrDelay;
FIN_IF;
FIN_IF
cStepGetItemError:
Item_ID:=0;
iPaso:=cPasoEsperarReinicio;
cStepGetJointsError:
FOR i :=0 TO 11 DO
arrJoints[i]:=-99999.99;
FIN_FOR
iPaso:=cPasoEsperarReinicio;
cStepGetJointsStrError:
strJoints:='';
iPaso:=cPasoEsperarReinicio;
cStepWaitReset:
IF bReset THEN
iPaso:=cPasoInicio;
bReinicio:=FALSE;
FIN_IF;
FIN_CASE
aSplit[1] := strJoints;
FOR i:=1 TO 7 DO
bResultadoSplit := BuscarYSplit(
pSeparador := ADR(sSeparador)
,pSrcString := ADR(aSplit[i])
,pCadenaIzquierda:= ADR(aSplit[i])
,nTamañoIzquierda := TAMAÑO(aSplit[i])
,pCadenaDerecha:= ADR(aSplit[i+1])
,nTamañoDerecho := SIZEOF(aSplit[i+1])
,bBuscarDesdeDerecha := FALSE );
IF NOT bResultadoSplit THEN
SALIDA
FIN_IF
FIN_FOR
PARA i :=1 A 6 HACER
arrJointsFromStr[i]:=STRING_TO_LREAL(aSplit[i]);
FIN_FOR;
//
OPCUA_VirtualClient_RoboDK_Station.getItem(
bExecute:=iStep=cStepGetItem
,Nombre_del_artículo:=Nombre_del_robot
);
OPCUA_VirtualClient_RoboDK_Station.getJoints(
bEjecutar:=iPaso=cPasoGetJoints
,Item_ID:=Item_ID,Juntas=>arrJuntas
);
OPCUA_VirtualClient_RoboDK_Station.getJointsStr(
bExecute:=iStep=cStepGetJointsStr
,Nombre_robot:=Nombre_robot,Juntas=>strJuntas
);
IF bWrite THEN
OPCUA_VirtualClient_RoboDK_Station.setJointsStr(
bEjecutar:=TRUE
,Nombre_robot:=Nombre_robot,Juntas:=strComandoJuntas);
FIN_IF;