i
Equa ion Chap e 1 Sec ion 1
P oyec o Fin de Ca e a
Ingenie ía de Telecomunicación (Telemá ica)
Con ol emo o del b azo obó ico RX90
Dep. Ingenie ía de Sis emas y Au omá ica
Escuela Técnica Supe io de Ingenie ía
Uni e sidad de Se illa
Au o : Azaha a Mª Po as Tejada
Tu o : Ángel Rod íguez Cas año
Se illa, 2017
ii
iii
P oyec o Fin de G ado
Ingenie ía de Telecomunicación
Con ol emo o del b azo obó ico RX90
Au o :
Azaha a Mª Po as Tejada
Tu o :
Ángel Rod íguez Cas año
P o eso i ula
Dep. de Ingenie ía de Sis emas y Au omá ica
Escuela Técnica Supe io de Ingenie ía
Uni e sidad de Se illa
Se illa, 2017
i
P oyec o Fin de G ado: Con ol emo o del b azo obó ico RX90
Au o :
Azaha a Mª Po as Tejada
Tu o :
Ángel Rod íguez Cas año
El ibunal nomb ado pa a juzga el P oyec o a iba indicado, compues o po los siguien es miemb os:
P esiden e:
Vocales:
Sec e a io:
Acue dan o o ga le la cali icación de:
Se illa, 2017
El Sec e a io del T ibunal
i
ii
A mi amilia
A mi pa eja
iii
ix
Ag adecimien os
Es e abajo no hubie a sido posible sin la o ien ación de mi u o D. Ángel Rod íguez Cas año, al cual le
p opuse el ema y ha ido guiando los a ances del mismo. Menciona ambién a los p o eso es y alumnos del
labo a o io que me han ayudado cuando su gía algún con a iempo.
Ag adece ambién el apoyo incondicional de mi amilia y mi pa eja. Sin ellos no hab ía sopo ado an as ho as
de du o abajo.
Azaha a Mª Po as Tejada
Se illa, 2017
x i
5.2.2 Pues a en ma cha del se ido 17
5.2.3 Pues a en ma cha del clien e 18
5.3 Depu ación y p uebas de uncionamien o 18
5.3.1 Comp obación de la comunicación se ie 18
5.3.2 Comp obación de la comunicación Modbus-TCP 18
5.3.3 Comp obación de la sinc onización 19
6 Resul ados y conclusiones 21
6.1 Obje i os conseguidos 21
6.2 Fu u as líneas de abajo 22
Anexo A: Código implemen ado en el clien e 23
Anexo B: Código implemen ado en el se ido 37
Re e encias 57
x ii
ÍNDICE DE TABLAS
Tabla 1. Pines más impo an es del conec o RS-232 4
Tabla 2. Lis ado de egis os del se ido 12
x iii
xix
ÍNDICE DE FIGURAS
Figu a 1. T ama Modbus [5] 5
Figu a 2. Encapsulación de los da os [7] 6
Figu a 3. Fo ma o de ama TCP (RFC 793) 7
Figu a 4. T ama Modbus- TCP sob e IP 10
Figu a 5. RX90 16
Figu a 6. Escena io de p uebas 18
Figu a 7. Cap u a Wi esha k 19
xx
1
1 INTRODUCCIÓN
“El es ue zo de u iliza las máquinas pa a emula el pensamien o humano
siemp e me ha pa ecido bas an e es úpido. P e e i ía usa las pa a emula
algo mejo ”
Edsge Dijks a
a indus ia 4.0 es á en pleno auge. A pesa del ecelo de las emp esas de in oduci nue os a ances
ecnológicos en su núcleo p oduc i o, cada ez son más las que inco po an écnicas de compu ación
dis ibuida y análisis de g andes can idades de da os. Es os sis emas se usan en o os en o nos pa a
amplia las uncionalidades de los equipos, así como aumen a el endimien o de los mismos, haciendo su uso
anspa en e al usua io.
En es e p oyec o se desa olla á una p ác ica de compu ación dis ibuida basada en una es uc u a de clien e-
se ido pa a maneja un b azo obó ico den o de una ed IP [1]. Se ha á posible su con ol manual a a és
del eclado y ambién se pod á dispone de los da os apo ados po el RX90 pa a conoce su es ado en odo
momen o.
1.1 Mo i ación del p oyec o
Ac ualmen e la mayo ía de indus ias suelen es a conec adas median e g andes buses de campo y pa a el
con ol y man enimien o de cualquie máquina, el ope a io debe desplaza se has a el si io pa a cambia la
con igu ación. El con ol emo o se es á in oduciendo len amen e en el mundo de la indus ia pa a con ola
aquellas máquinas que son di ícilmen e accesibles po un ope a io, o bien pa a ene una isión más
gene alizada de la emp esa. Con es e in han su gido disposi i os Scada que pe mi en una moni o ización
con inua de las máquinas y pe mi e a a cie os pun os de la con igu ación.
En es e p oyec o se a a a anza más hacia un modelo de con ol emo o de una máquina, p oponiendo
encapsula los sis emas de ansmisión de in o mación adicionales en paque es que puedan se en iados
inalámb icamen e, como puede se un p o ocolo TCP. Es o nos a a apo a más lexibilidad a la ho a de c ea
los paque es y el canal en el que se ansmi a puede se muy a iado, pues o que usamos un p o ocolo
no malizado y ampliamen e a ado en edes ue a del en o no indus ial. El uso del p o ocolo TCP nos
L
2
apo a a iabilidad en la comunicación sin ene que cambia el lenguaje usado po las maquinas has a aho a.
Es o nos p opo ciona á mayo in eg ación con las máquinas ya exis en es sin necesidad de sus i ui las, pues o
que solo se á necesa io conec a las a un se ido pa a hace las unciona .
1.2 Alcance y obje i os
El obje i o p incipal de es e p oyec o es es ablece una comunicación Modbus TCP en e un equipo clien e y
un equipo que ha á de se ido pa a es ablece la comunicación en e un ope ado y una maquina emo a. Es a
se á con olada po el ope a io si uado en la misma ed IP y no se á necesa ia la p oximidad pa a que la
máquina pueda abaja . Además, pod emos supe isa su es ado en odo momen o y comp oba que ealiza
co ec amen e sus a eas.
El p oyec o pa ía de un p og ama ya en uncionamien o pa a el RX90, en el que a a és de un e minal se
in oducían los comandos que que íamos ejecu a en dicho b azo obó ico. Dicho ejecu able se basaba en la
lib e ía libmodbus pa a el co ec o a amien o de los da os.
Po o o lado, se desa olló un clien e-se ido TCP que ecibía las pe iciones del clien e y modi icaba, en su
caso, los egis os que e an necesa ios pa a su pos e io lec u a po el se ido .
A con inuación, se pasó a la in eg ación de ambos se icios, consiguiendo que a a és del clien e
an e io men e p opues o se manda an las o denes pe inen es y el se ido las in e p e a a y een ia a en
lenguaje V+ al RX90. Pa a ello se u ie on que ealiza modi icaciones como el ipo de da os que leía el
se ido , así como inse a en los egis os la posición co espondien e del b azo obó ico. También se
in oduje on mejo as como pode p opo ciona la IP del clien e po eclado y la posición del obo median e el
mismo.
1.3 Es uc u a del documen o
En es a memo ia se abo da á la pa e concep ual del p oyec o, dejando pa a los anexos el código empleado en
su pues a en uncionamien o. Se in en a á, en la medida de lo posible, jus i ica el ex o median e imágenes y
g á icas, con el in de acla a el con enido.
En el p ime capí ulo comenzamos plan eando el en o no de desa ollo y las ideas gene ales del p oyec o. Se
explica b e emen e los emas a a a y su es uc u a.
En el segundo capí ulo e emos los concep os p incipales que undamen an la ansmisión de da os desde el
ope a io, que abaja con el clien e TCP has a la ansmisión inal al b azo obó ico median e comunicación
se ie.
En los siguien es capí ulos se abo da án las implemen aciones del clien e y el se ido con más de alle. Se
jus i ica án sus pa es y se desa olla án las uncionalidades de cada uno de ellos.
El quin o capí ulo habla emos de las he amien as de desa ollo u ilizadas. Pond emos en alo los equipos que
hemos usado y explica emos sus ca ac e ís icas écnicas básicas.
Po úl imo, en el sex o capí ulo analiza emos las conclusiones de nues o es udio. Se plan ea án ambién las
posibles mejo as en un u u o y como es as pueden ayuda en desa ollo indus ial.
Ce a emos el p oyec o con los códigos añadidos en los anexos de las implemen aciones del clien e y se ido .
3
2 PROTOCOLOS
"Los es ánda es son siemp e obsole os. Eso es lo que los hace
es ánda es"
Alan Benne
A comunicación desde el usua io has a el b azo obó ico RX90 se ha ealizado en di e en es capas, ya
que cada pieza soluciona p oblemas di e en es. Asimismo, se han u ilizado di e en es p o ocolos en cada
una de ellas que encapsulan a los p o ocolos supe io es, quedando una o e de p o ocolos especial pa a
la comunicación en es e en o no indus ial.
Con el in de pode explica el uncionamien o comple o es necesa io que se conozca el abajo que ealiza
cada uno de los p o ocolos po sepa ado. Pa a es ablece la es uc u a y o den de los da os en cada capa es
indispensable emi i se a la no ma i a especial de cada p o ocolo, de inidos po la au o idad co espondien e.
2.1. Comunicación po Pue o se ie
La comunicación se ial es un mé odo de comunicación sencillo de ansmisión de da os. se basa en el en ío y
ecepción de la in o mación bi a bi en e el ansmiso y el ecep o . Habi ualmen e la comunicación se ial se
usa pa a la ansmisión de da os en o ma o ASCII.
His ó icamen e se ha usado es e ipo de comunicación en odos los o denado es pa a conec a los dis in os
componen es, así como pa a enlaza disposi i os ex e nos al mismo. Ac ualmen e las conexiones se ie han
quedado elegadas a en o nos indus iales y, en gene al, los o denado es han dejado de inco po a es e ipo de
pue o. En es e sen ido, la conexión del RX90 con el po á il se ealiza a a és de un adap ado que con ie e
un pue o USB cualquie a a pue o se ie.
El es ánda más ex endido pa a la comunicación se ie iene dado po el RS-232 [2] (Recommended S anda d
232) que es ablece el p o ocolo de la ansmisión de da os, el cableado, las señales eléc icas y los conec o es
en los que debe basa se la conexión. Pa a que pueda es ablece se la comunicación es necesa io que las
ca ac e ís icas de los pue os a cada ex emo sean iguales. Algunas de ellas son:
- Velocidad de ansmisión: Núme o de bi s po segundo que se en ían.
- Bi s de da os: can idad de bi s que se ansmi en en un paque e. Depende del ipo de in o mación que se
ans ie e, pe o debe conco da el núme o que se espe a en la ansmisión y en la ecepción.
- Bi s de pa ada: úl imos bi s de un paque e que indican el inal del mismo. Debido a que la comunicación es
asínc ona, los elojes del ansmiso y el ecep o no es án sinc onizados y dichos bi s indican el in de la
ansmisión de un paque e.
- Pa idad: si e pa a comp oba e o es en la ansmisión que a ec en nega i amen e a la comunicación.
L
4
2.1.1 Ven ajas e incon enien es de Pue o se ie
La p incipal en aja de la comunicación se ie es su simplicidad. Únicamen e se usa pa a la comunicación
pun o a pun o y simplemen e usa pulsos de ensión en la línea pa a ansmi i los da os.
Como incon enien es podemos ci a que las conexiones son las len as que en o as comunicaciones pun o a
pun o como USB, pe o en nues o caso no nos hace al a esa elocidad. O o incon enien e es que no odos los
o denado es poseen un pue o RS-232, pe o podemos soluciona lo median e adap ado es dedicados a con e i
cualquie pue o USB en un pue o se ie. Po ejemplo, el adap ado que se ha u ilizado du an e el desa ollo
del mismo que es del ab ican e Magic Con ol Technology Co p.
2.1.2 T ama
Al se un pue o ísico, el RS-232 no posee una ama como al. Lo que encon amos en el conec o es el
conjun o de pines po los que es á compues o.
Físicamen e se dispone de un conec o DB9 hemb a en el lado del se ido y un conec o DB9 macho en el
lado del b azo.
Tabla 1. Pines más impo an es del conec o RS-232
Pa a ealiza la comunicación se u ilizan es líneas de ansmisión: una pa a ie a (o e e encia), o a pa a
ansmi i y una e ce a pa a ecibi . Debido a que la ansmisión es asínc ona, es posible en ia da os po una
línea mien as se eciben da os po o a.
2.2. Comunicación Modbus
Modbus [3] es un p o ocolo indus ial que su gió en el año 1973 an e la necesidad de es ablece un in e cambio
de in o mación en e au óma as p og amables. An e io men e las conexiones en e los apa a os se ealizaban
median e lógica cableada. La apa ición de Modbus supuso un g an a ance y mejo a de las ins alaciones ya que
no e a p eciso modi ica el cableado pa a cambia el uncionamien o de un au óma a. Es o pe mi ió elimina
g an pa e del cableado exis en e has a en onces po que sólo bas aba la línea de comunicación en e máquinas
pa a hace las unciona .
El p ime sis ema que hizo uso de es e sis ema de comunicación ue Modicon [4] (Modula Digi al
Con olle ), in en ado po la emp esa Bed o d Associa es, y se ha con e ido en un es ánda de ac o g acias
su la publicación de o ma abie a y lib e de cánones en 1979.
Modbus es un p o ocolo a ni el de aplicación que es ablece un ipo de comunicación maes o-escla o.
Gene almen e el maes o lo asociamos a un disposi i o in e az humano-máquina y el escla o lo ligamos a un
disposi i o lógico p og amable.
5
2.1.3 Ven ajas e incon enien es de Modbus
La en aja p incipal consis e en su capacidad de adap abilidad a cualquie disposi i o. Todos los ipos de
apa a os indus iales (PLC, HMI, paneles de con ol, D i e s, con oles de mo imien o, disposi i os de
en ada/salida…) son suscep ibles de comunica se median e el uso de Modbus. Además, se puede lle a a
cabo sob e cualquie ipo de ed, an o en la comunicación se ie como sob e IP en edes E he ne o Wi i.
Uno de los incon enien es es el amaño de la ama. La capacidad de su PDU es á limi ada, po que iene
he edada de la p ime a implemen ación Modbus sob e comunicación se ie. Es e p oblema podemos
soluciona lo ealizando una asociación de comandos a núme os en e os, an o en el maes o como en el
escla o, a in de que en el mensaje únicamen e engamos que manda un núme o. La asociación debe se la
misma en uno y o o ex emo, ya que si no los comandos se án in e p e ados e óneamen e.
2.1.4 T ama Modbus
Como hemos adelan ado an e io men e, la ama Modbus iene un amaño limi ado debido a la he encia dejada
po el uso de es e p o ocolo sob e líneas de comunicación se ie. La capacidad máxima de es as líneas enía
dada po el RS485, que iene es ablecido en 256 by es.
Si calculamos a pa i de esa dimensión el amaño máximo de la PDU Modbus ob enemos que:
256 - Di ección del se ido (1 by e) - CRC (2 by es) = 253 by es
Figu a 1. T ama Modbus [5]
La Unidad de da os de p o ocolo (PDU) es á o mada po un código de unción y el conjun o de da os que
necesi a la misma. Cada código de unción exp esa un compo amien o p ede inido en e el maes o y el
escla o y es es e úl imo el que lo implemen a en base a su p opia p og amación.
2.3. Comunicación TCP
El p o ocolo TCP u o sus o ígenes en los años 70. En la Agencia de In es igación de P oyec os A anzados
de De ensa de Es ados Unidos se desa olló un p o ocolo de comunicaciones que pe mi i ía asegu a la
iabilidad de la ed ex emo a ex emo sin emo de pé dida de paque es en e las es aciones de comunicación.
El p o ocolo de con ol de ansmisión es un conjun o de eglas de la capa de anspo e del modelo OSI. Es á
de inido en el es ánda RFC 793 [6] y iene un uso muy ex endido. Es u ilizado ecuen emen e po mul i ud
de aplicaciones pa a apo a iabilidad al canal ex emo a ex emo.
Las ca ac e ís icas p incipales de es e es ánda son:
- O ien ado-a-conexión: se equie e el es ablecimien o de un ínculo en e los p ocesos clien e y se ido an es
del in e cambio de mensajes
- Pun o-a-pun o: la ansmisión se ealiza en e un equipo emiso y un ecep o , siendo el es o de la ed
anspa en e a és os.
- Flujo de by es, iable y o denado: se es ablece un núme o de secuencia pa a que los paque es que iajen po
dis in os caminos puedan se o denados en el des ino
- Full-dúplex: se puede ene un lujo de da os bi-di eccional en la misma conexión.
- Con ol de Flujo: conoce en odo momen o el es ado del bu e de ecepción, debido a que se eciben
asen imien os de cada paque e que ha llegado co ec amen e.
- Con ol de Conges ión: el p o ocolo decide en cada momen o si los paque es pueden ansmi i se po la ed.
12
En el momen o de analiza la consul a comp oba emos el ipo de egis o al que que emos accede . Po de ec o
odos los egis os son de lec u a y esc i u a pa a el se ido . En el caso del clien e, puede lee odos los
egis os, pe o de inimos un ango en el que pode esc ibi an o la o den en iada al se ido como las
posiciones de o ación del b azo obó ico. Si el clien e in en a esc ibi en o os egis os, el se ido no se lo
pe mi i á. Es o se ealiza así pa a p ese a la segu idad y la in eg idad de odos los egis os c í icos y no
pe mi i que se modi iquen a lib e albed io.
4.1.2 Recepción de la ama
Pa a que la comunicación TCP uncione, p e iamen e se ha enido que es ablece un ínculo en e clien e y
se ido . Es o lo ealiza au omá icamen e el p o ocolo TCP cuando el clien e in en a conec a se po p ime a
ez al se ido .
Cuando el se ido ecibe un mensaje, p ime o comp ueba si la di ección IP de des ino es pa a él. Después,
desencapsula los da os de la ama IP y comp ueba que es una ama TCP sin e o es, calculando el
complemen o a uno de dicha ama y compa ándola con el código de e o que ae es a al inal. Si odo es á
co ec o, ex aemos el mensaje Modbus que es á inc us ado en los da os del p o ocolo TCP. Po úl imo, se
copia la ins ucción en el egis o co espondien e, así como la nue a posición del b azo.
4.1.3 In e p e ación de comandos
La aducción de lenguaje se ealiza median e los egis os de los que dispone el se ido . En es os egis os
quedan ano adas las al e aciones que se ealizan en el b azo a pe ición del clien e, así como las ano aciones que
el se ido ealiza pa a su co ec o uncionamien o. Los egis os, o denados po el luga que ocupan en la
memo ia del disposi i o, son:
Di ección
Desc ipción
Esc i o po
0x0000
Núme o de conexiones de clien es
se ido
0x0001
Es ado del iche o de egis o (0: ce ado / 1: abie o)
se ido
0x0002
Es ado del RX90
se ido
0x0003
Comando ecibido po el clien e
clien e
0x0004
Posición de o ación de la base del RX90 (eje 1)
clien e
0x0005
Posición de o ación de la 1ª a iculación RX90 (eje 2)
clien e
0x0006
Posición de o ación de la 2ª a iculación RX90 (eje 3)
clien e
0x0007
Posición de o ación de la base de la a iculación pinza del RX90 (eje 4)
clien e
0x0008
Posición de o ación de la a iculación de la pinza del RX90 (eje 5)
clien e
0x0009
Posición de o ación de la base de la pinza del RX90 (eje 6)
clien e
0x000A
Es ado de la pinza (0: abie a / 1: ce ada)
clien e
0x000B
Código de e o
se ido
Tabla 2. Lis ado de egis os del se ido
13
4.1.4 En ío po pue o se ie
Pa a pode en ia un comando po el pue o se ie es imp escindible que el clien e haya en iado un comando.
El se ido po sí sólo no con ola á al b azo obó ico.
Pa a en ia una o den de ejecución al RX90, el se ido debe e isa los egis os y ex ae de ellos el
comando que ha esc i o el clien e, así como la nue a posición a la que se a a en ia . Como los egis os son
de ipo en e o sin signo, debemos ealiza una con e sión o zada y con e i los alo es nega i os al o ma o
en e o con signo que es el que in e p e a nues o au óma a.
El mensaje aho a se cons uye en lenguaje V+. Pa a ello se in e p e a el comando y se esc iba la posición
como una cadena de ca ac e es p ecedida de su co espondien e comando en V+, que se á in e p e ado po el
RX90 cuando és e lo eciba.
14
15
5 DESARROLLO DE LA IMPLEMENTACIÓN DEL
PROYECTO
“Cuando alguien diga: ‘quie o un lenguaje de p og amación al que sólo
enga que deci le lo que quie o hace ’, denle una pi ule a”.
Alan J. Pe lis
n es e capí ulo amos a desc ibi los dis in os elemen os que hemos necesi ado pa a lle a a cabo la idea
del con ol emo o. De un lado, pa íamos del in eg an e ísico indus ial, el b azo obó ico RX90. Po
o a pa e, no hab ía sido posible lle a lo a cabo sin el es udio en p o undidad de los lenguajes de
p og amación V+ y C++.
El comienzo de es e ex enso abajo se ealizó con la p ueba del uncionamien o del RX90 con un es de
uncionamien o ealizado po F ancisco Royal. Le siguió la comp ensión de los comandos más gene ales del
lenguaje V+, así como su implemen ación y en ío hacia el b azo. Po o a pa e, se p o undizó en el es udio de
los se ido es Modbus-TCP, comp obando cómo se ealizaban las comunicaciones median e es os p o ocolos
y los mensajes que debían de in e cambia clien e y se ido pa a el es ablecimien o de la conexión. Po
úl imo, se p ocedió a la in eg ación de los mismos y al desa ollo de las uncionalidades de ambos se icios
desc i as en los apa ados an e io es.
5.1 Pla a o ma de desa ollo
El desa ollo del p oyec o se ha lle ado a cabo sob e sis emas Linux de 64 bi s. En conc e o, se ha usado la
dis ibución de Ubun u 16.04 [8]. Como el o denado sob e el que se ha abajado sólo disponía de una
pa ición Windows, se ha abajado sob e una máquina i ual mon ada con VMwa e 12 [9].
Se ha elegido es a dis ibución po que e a la e sión más nue a y es able cuando se comenzó el p oyec o,
aunque no necesa iamen e deben es a los equipos ac ualizados pa a pode u iliza el se icio, ya que el
se icio se ejecu a sob e los e minales del clien e y se ido co espondien e.
La Uni e sidad de Se illa ya dispone de una ed IP pa a los alumnos de la misma, po lo que se han u ilizado
las di ecciones IP asignadas po la misma pa a la con igu ación de los equipos. Al u iliza se un único equipo
como se ido y los demás como clien es del mismo, se ob iene una ed en es ella. Es a es la con igu ación
más adecuada en es e caso, pues o que, en un supues o en o no eal, cada máquina dispond á de su pequeño
se ido al que se conec a án a ios ope a ios que ayan e isando los apa a os.
El edi o de ex o u ilizado en la elabo ación de los iche os ha sido Gedi , debido a su simplicidad y a la
u ilización de colo es que és e ealiza pa a una mejo isualización de elemen os p opios del lenguaje C++,
como pueden se los ipos de a iables o de unciones, las es uc u as de con ol (condiciones, bucles), e c.
El elemen o elegido pa a se moni o izado ha sido un b azo obó ico RX90 disponible en el labo a o io de
au omá ica de la Escuela de Ingenie os de la Uni e sidad de Se illa. Es a máquina u iliza el lenguaje V+ pa a
ecibi ó denes desde el equipo se ido . Es un modelo pa ecido al que podemos encon a en un en o no eal,
po lo que esul a con enien e a la ho a de ex apola los esul ados del p oyec o a la indus ia exis en e.
E
16
5.1.1 RX90
El b azo obó ico RX90 [10] ha sido ab icado po la compañía S äubli en el año 1996. Es un modelo
ul a ápido, ijado al suelo, con un alcance de ap oximadamen e 0,9 m. Dispone de una pinza con una
capacidad máxima de ca ga de has a 11kg, po lo que esul a adecuado pa a el anspo e de pequeños obje os
de un pun o a o o den o de su alcance.
Posee 6 ejes de o ación. Los g ados de o ación de cada eje, comenzando desde el suelo hacia a iba son:
- Eje 1: 320º
- Eje 2: 275º
- Eje 3: 285º
- Eje 4: 540º
- Eje 5: 225º
- Eje 6: 540º
La comunicación con el se ido se ealiza median e pue o se ie. El sis ema se comunica median e lenguaje
V+, po lo que odas las ins ucciones se han de aduci a dicho lenguaje pa a su co ec a in e p e ación en la
máquina.
5.1.2 Lenguajes de p og amación
Es e p oyec o es un buen eje cicio de in eg ación de lenguajes, donde hemos enido que aduci ó denes de un
lenguaje a o o pa a es ablece una comunicación ex emo a ex emo. E iden emen e no es posible aduci
odas y cada una de las unciones que pueden implemen a se. Simplemen e hemos aducido aquellas que se
eque ían en cada momen o.
La comunicación en e máquinas se ealiza en los lenguajes especí icos pa a cada come ido. Los p og amas en
C++ ayudan a una mejo comp ensión y o ganización de las ideas. El lenguaje V+ puede se simila a o os
lenguajes que se pueden encon a en en o nos indus iales.
5.1.2.1 V+
V+ [11] [12] es un lenguaje de p og amación ex ual de medio ni el al amen e es uc u ado. Fue c eado po la
i ma Adep Technologies. Dicho lenguaje u iliza palab as y es uc u as p ede inidas pa a es ablece acciones
y la con igu ación del obo . Es un lenguaje basado en Pascal, que acili a la p og amación es uc u ada.
Algunas ca ac e ís icas que lo de inen son:
- In eligibilidad: es ácilmen e legible po cualquie pe sona ya que las palab as usadas adquie en signi icado.
- Adap abilidad: podemos eesc ibi y mejo a los p og amas sin es ue zo. Se pueden c ea unciones que
ealicen una a ea conc e a y epe i i a. Es o mejo a la es uc u a del código y su eu ilización.
- Fiabilidad: se a a de un lenguaje pensado pa a eacciona an e imp e is os, muy ú il en en o nos indus iales
donde un allo puede esul a c í ico.
- T anspo abilidad: se pueden c ea p og amas en o os o denado es y aslada se luego a la máquina que a a
ejecu a los comandos.
Eje 1
Eje 2
Eje 3
Eje 4
Eje 5
Eje 6
Figu a 5. RX90
17
5.1.2.2 C++
C++ [13] es un lenguaje de p og amación de al o ni el, ex ual, es uc u ado y compilado. Fue c eado po
Bja ne S ous up en los labo a o ios de A &T en 1983. Es un lenguaje de i ado de C que inco po a concep os
de la p og amación o ien ada a obje os. Es a nue a pe cepción de la p og amación di idida en clases y obje os
pe mi ía al p og amado ene más con ol sob e sus unciones y pode abs ae se a la ho a de lexibiliza el
código.
Pa a pode hace uso de los p og amas esc i os en C++ es necesa io compila el código, es deci , aduci el
código a lenguaje máquina. Exis en nume osos compilado es, pe o el usado en Linux es g++.
Las p incipales ca ac e ís icas que lo de inen son:
- Lenguaje o ien ado a obje os: nos pe mi e c ea en idades que poseen a iables y unciones p opias con las
que desa ollan un de e minado compo amien o den o de nues o p og ama
- Es uc u ado: el código se puede di idi en unciones y es as a su ez en iche os.
- Reu ilización de código: las clases pueden se ins anciadas múl iples eces pa a la c eación de obje os
di e en es.
5.2 Sinc onización en e máquinas
Pa a que el p og ama uncione co ec amen e es impo an e segui un o den a la ho a de inicia nues as
he amien as, ya que si cambiamos el o den las dependencias en e ellos nos impedi án segui el p oceso.
Debemos comenza siemp e iniciando el b azo obó ico y una ez es é mon ado a ancamos nues o se ido .
Pos e io men e, a ancamos el clien e.
Si el RX90 no es á iniciado p e iamen e, el se ido nos da á allo al in en a ab i una ins ancia pa a
comunica se con él. Lo mismo ocu e al inicia el clien e, pues o que necesi a la con i mación de
es ablecimien o de la conexión con el se ido pa a pode da comienzo a la comunicación.
5.2.1 Pues a en ma cha del RX90
Pa a hace unciona nues o b azo obó ico, p ime o debemos acciona el in e up o que da suminis o
eléc ico al equipo. Pos e io men e, comp obamos que no es á bloqueado el b azo y pulsamos el bo ón
COMP|PWR del mando de con ol del RX90. Se encende á en el panel cen al una luz e de co espondien e a
ARM POWER ON. P esiona emos ese bo ón pa a a ma nues o b azo obó ico. A pa i de en onces
con a emos con una luz e de en ARM POWER que nos indica á que el RX90 es á lis o pa a usa se.
En caso de se necesa io, se dispone de un pulsado ojo en el panel cen al pa a de ene el uncionamien o del
RX90. Vol iendo a ene que ealiza odos los pasos pa a ol e a pone lo en uncionamien o.
5.2.2 Pues a en ma cha del se ido
Pa a inicia el se ido Modbus-TCP p e iamen e debemos habe ins alado la lib e ía libmodbus-3.0.6 como
se ha desc i o an e io men e. Una ez hecho es o, debemos mi a en el e minal del equipo se ido con
i con ig la di ección IP asociada a nues a máquina. Debemos sus i ui po es a di ección, en el caso de no se
la misma, la di ección IP que iene ijada en el iche o se e .cpp. Es impo an e que se ealicen es os pasos
p e ios, de no se así nues a comunicación no se e ec ua á.
Una ez es én gua dados los iche os p ocede emos a ejecu a el comando make en el di ec o io donde se
encuen an los a chi os modi icados. Es o c ea á un ejecu able que pod á inicia se simplemen e con esc ibi
./se e en el e minal.
18
5.2.3 Pues a en ma cha del clien e
Pa a inicia el clien e Modbus-TCP, nue amen e hemos de ins ala la lib e ía libmodbus-3.0.6 an es de su
ejecución. Además, enemos que mi a igualmen e la di ección IP asociada a nues o equipo. Es o no se ía
necesa io si ejecu amos el clien e en el mismo equipo del se ido . En es e caso, usa emos la di ección local
pa a es ablece la comunicación con el mismo.
Una ez que conocemos nues a IP a ancamos el clien e sencillamen e esc ibiendo ./clien en el e minal del
equipo clien e. En onces nos p egun a á si que emos cambia la di ección IP. Si nos encon amos en un equipo
dis in o al se ido , in oduci emos la IP ob enida an e io men e y queda á iniciado nues o clien e Modbus-
TCP.
5.3 Depu ación y p uebas de uncionamien o
El escena io escogido pa a ealiza las p uebas comp ende un b azo obó ico conec ado a un se ido po
pue o se ie y dos clien es conec ados al se ido median e Modbus-TCP, como se mues a en la igu a:
Pa a es a comple amen e en la ce eza del co ec o uncionamien o del conjun o p ime o debe emos
comp oba cada comunicación po sepa ado median e sc ip s sencillos.
5.3.1 Comp obación de la comunicación se ie
Pa a comp oba la comunicación se ie con el RX90 no necesi amos la pa e de comunicación Modbus.
C ea emos un sencillo p og ama que simplemen e in oduciendo los mo imien os (a iba, abajo, izquie da,
de echa y coge con la pinza) po eclado comp obemos inmedia amen e la eacción del au óma a.
5.3.2 Comp obación de la comunicación Modbus-TCP
Pa a es e apa ado p escindimos de la comunicación se ie y nos cen amos en el in e cambio de mensajes en e
el clien e y se ido . Nos bas a á con c ea un p og ama en el que asigna emos un alo a cada comando, los
mismos en el clien e y en el se ido . Pos e io men e, en ia emos dichos comandos a a és de Modbus-TCP,
que comple a án los egis os con los alo es en iados.
Podemos c ea una unción, además, que nos mues e el alo de los egis os esc i os pa a isualiza así que
los alo es en iados se co esponden e ec i amen e con los que se han gua dado en los egis os.
O a he amien a pa a comp oba los campos de las cabece as TCP es Wi esha k. Wi esha k es un analizado
de ed, que cap u a los paque es de la in e az asignada.
Pue o se ie
Modbus-TCP
sob e IP
Figu a 6. Escena io de p uebas
19
Podemos ealiza a modo de ejemplo una cap u a de paque es:
Figu a 7. Cap u a Wi esha k
Como se puede obse a , los paque es se han ealizado en una p ueba local. Podemos obse a cómo se en ía
un paque e de pe ición desde el clien e, con el pue o TCP 57616 hacia el se ido , con el pue o TCP 1502. Si
accedemos a la in o mación adicional de dicha cap u a pod emos obse a en el apa ado da os el mensaje
comple o en iado.
De la misma o ma, podemos e cómo el se ido en ía un mensaje de asen imien o en sen ido opues o como
ó mula pa a indica al clien e que no se han p oducido e o es en la ansmisión. De es a o ma el clien e no
iene que ol e a een ia el mismo mensaje.
5.3.3 Comp obación de la sinc onización
Pa a es e apa ado debe emos usiona los dos apa ados an e io es. Se debe anida la o den mandada po el
clien e e insc i a en los egis os del se ido con las ó denes que inalmen e se mandan al RX90.
De la misma o ma, se debe á comp oba que los alo es gua dados en los egis os son los que e ec i amen e
el clien e, y que a pa i de és os el se ido es capaz de ex ae los da os y enlaza los pa a en ia los po pue o
se ie. Si odo unciona co ec amen e, el b azo obó ico RX90, ealiza á las acciones que el clien e desea.
20
21
6 RESULTADOS Y CONCLUSIONES
“Hay es mane as de adqui i sabidu ía: p ime o, po la e lexión, que
es la más noble; segundo, po imi ación, que es la más sencilla; y e ce o,
po la expe iencia, que es la más ama ga”.
Con ucio
n es e capí ulo se p esen a án las consecuencias de la ealización del p oyec o. Es udia emos cómo el
uso de se ido es Modbus-TCP pueden mejo a las a eas ealizadas en en o nos eales den o de la
indus ia.
De la misma o ma, analiza emos los obje i os cumplidos y cuál puede se la línea de mejo a del p oyec o con
el in de adap a lo aún más a las demandas eales.
6.1 Obje i os conseguidos
La in oducción de la comunicación Modbus-TCP en á eas en las que se u ilizaban el cableado de o ma
adicional han is o mejo a su alcance y consolida su uso al aba a a obje os, conec i idad y almacenaje de
da os de o ma abie a. Sis emas de con ol y ele-medida adicionalmen e desa ollados en en o nos ce ados
y de al o p ecio pueden se sus i uidos po soluciones de más bajo cos e y a qui ec u a de p o ocolos y
ep esen ación de da os abie os.
Con su uso se gene a una in e acción y ecolección de da os que, as el consiguien e análisis, puede
p opo ciona nue as in o maciones que pe mi an mejo a cos es en di e en es á eas, jus i icando la
en abilidad y el e o no de la in e sión (ROI) de o ma di ec a.
El uso de es os p incipios básicos pe mi i á a la indus ia del u u o pode pe sonaliza la ab icación sin deja
a ás la p oducción en masa, posibili ando ambién el au o diagnós ico, el au o ajus e y la au o op imización de
los p ocesos, siendo ambién cla e pa a asis i a los abajado es en la mejo a de sus condiciones labo ales y en
la ealización de su ac i idad.
Con elación a los obje i os pe sonales conseguidos, a i mo que he log ado domina unos lenguajes, C++ y
V+, has a aho a desconocidos pa a mí. He sen ido la sa is acción de e cómo he manejado he amien as
ajenas a los es udios ealizados y cómo és as pueden se de u ilidad en en o nos eales.
E
28
p in ("La posición ob enida es: ");
imp imePosicion(posi ion);
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
/*****************/
sleep(4);
// Coge el obje o (ce amos la pinza)
i (modbus. ead_only_ egis e (ADDR_PINZA,& alue))
{
i ( alue==OPEN_PINCERS){
p in ("La pinza es aba abie a n");
alue= ROBOT_CATCH;
i (modbus.w i e_only_ egis e (COMMAND_ADDR, alue)){
p in ("Valo egis o Esc i o en %04X es:
%d n ROBOT_CATCH n",COMMAND_ADDR&0xFFFF, alue);
}
}
else{
p in ("La pinza es aba ce ada n");
}
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
/*****************/
sleep(4);
// Desplazamos el obje o a la nue a posicion
alue= ROBOT_AUTOMOVE;
posi ion[0]= alue;
posi ion[1]=posi ion[1]+90;
i (modbus.w i e_many_ egis e s(COMMAND_ADDR,numReg,posi ion))
{
o (in i=0;i<numReg;i++)
p in ("Regis o %04X cambia a:
%d n",(COMMAND_ADDR+i)&0xFFFF,uin ToIn (posi ion[i]));
}
else
p in ("E o en ESCRITURA DE POSICION n");
/*****************/
i (modbus. ead_many_ egis e s(COMMAND_ADDR,numReg,posi ion))
{
p in ("La posición ob enida es: ");
imp imePosicion(posi ion);
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
/*****************/
sleep(4);
// Ab imos la pinza
29
i (modbus. ead_only_ egis e (ADDR_PINZA,& alue))
{
i ( alue==CLOSE_PINCERS){
p in ("La pinza es aba ce ada n");
alue= ROBOT_CATCH;
i (modbus.w i e_only_ egis e (COMMAND_ADDR, alue)){
p in ("Valo egis o Esc i o en %04X es:
%d n ROBOT_CATCH n",COMMAND_ADDR&0xFFFF, alue);
}
}
else{
p in ("La pinza es aba abie a n");
}
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
/*****************/
sleep(4);
// Se mue e has a un poco an es de la posición del obje o
alue= ROBOT_AUTOMOVE;
posi ion[0]= alue;
posi ion[1]=posi ion[1]-10;
i (modbus.w i e_many_ egis e s(COMMAND_ADDR,numReg,posi ion))
{
o (in i=0;i<numReg;i++)
p in ("Regis o %04X cambia a:
%d n",(COMMAND_ADDR+i)&0xFFFF,uin ToIn (posi ion[i]));
}
else
p in ("E o en ESCRITURA DE POSICION n");
/*****************/
i (modbus. ead_many_ egis e s(COMMAND_ADDR,numReg,posi ion))
{
p in ("La posición ob enida es: ");
imp imePosicion(posi ion);
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
/*****************/
}
// Vol e a la posición inicial
i (op ion=='i'){
alue= ROBOT_AUTOMOVE;
posi ion[0] = alue;
posi ion[1] = 0;
posi ion[2] = 0;
posi ion[3] = 10;
posi ion[4] = -90;
posi ion[5] = -90;
posi ion[6] = 0;
p in ("Mo e a posicion: ");
imp imePosicion(posi ion);
30
i (modbus.w i e_many_ egis e s(COMMAND_ADDR,numReg,posi ion))
{
o (in i=0;i<numReg;i++)
p in ("Regis o %04X cambia a:
%d n",(COMMAND_ADDR+i)&0xFFFF,uin ToIn (posi ion[i]));
}
else
p in ("E o en ESCRITURA DE POSICION n");
}
//Lec u a de odos los egis os del sis ema
else i (op ion==' ')
{
p in ("REGISTROS DEL SISTEMA n");
numReg=20;// o al de egis os pa a mos a odos po
pan all
i (modbus. ead_many_ egis e s(ADDR_INI,numReg, ab))
{
o (in i=0;i<numReg;i++)
p in ("El alo del egis o leido en 0x%04X
es: %d n",(ADDR_INI+i)&0xFFFF,uin ToIn ( ab[i]));
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
}
else i (op ion=='p')
{
p in ("POSICION ACTUAL n");
numReg=7;// o al de egis os pa a mos a odos po pan all
i (modbus. ead_many_ egis e s(COMMAND_ADDR,numReg,posi ion))
{
p in ("La posición ob enida es: ");
imp imePosicion(posi ion);
}
else
p in ("E o en ope acion LECTURA DE VARIOS
REGISTROS n");
}
else i (op ion!='q'&& op ion!='0'){
p in ("E o : Op ion %c doesn' exis n",op ion);
}
}
e u n 0;
}
in uin ToIn (uin 16_ alue) {
in en e o;
i ( alue>65176)
en e o=-(65536- alue);
31
else
en e o= alue;
e u n en e o;
}
oid cha 2in (cha newPosi ion[29],uin 16_ posi ion[6]){
cha copia[29];
cha * pos;
in i=1;
s cpy(copia, newPosi ion);
//p in ("Spli ing s ing "%s " in o okens: n",newPosi ion);
pos = s ok (newPosi ion," ,"); // Aqui deja solo la coma
while (pos != NULL)
{
//p in ("%s n",pos); // Aqui debe ias gua da u da o en el
a ay!
posi ion[i]=a oi(pos);
//p in ("%d n",posi ion[i]);
pos = s ok (NULL, " ,"); // Aca ambien i ia solo la coma.!!
i++;
}
//p in ("Posi ion:
%d,%d,%d,%d,%d,%d n",uin ToIn (posi ion[1]),uin ToIn (posi ion[2]),uin ToIn (
posi ion[3]),uin ToIn (posi ion[4]),uin ToIn (posi ion[5]),uin ToIn (posi ion
[6]));
s cpy(newPosi ion, copia);
}
oid imp imePosicion(uin 16_ posi ion[6]){
p in ("%d,%d,%d,%d,%d,%d n",uin ToIn (posi ion[1]),uin ToIn (posi ion[
2]),uin ToIn (posi ion[3]),uin ToIn (posi ion[4]),uin ToIn (posi ion[5]),uin
ToIn (posi ion[6]));
}
Clien Modbus.cpp
/***********************************************************************/
/* */
/* CLIENTE MODBUS PARA RX90 */
/* */
/***********************************************************************/
#include "Clien ModBUS.h"
/**Cons uc o : Recibe como a gumen os la IP y el pue o en los que se a a
ealiza la conexión**/
Clien ModBUS::Clien ModBUS(cha * ip,sho po ,in ime )
{
c x = modbus_new_ cp(ip, po );
s uc ime al esponse_ imeou ;
/* De ine a new and oo sho imeou ! */
esponse_ imeou . _sec = ime ;
esponse_ imeou . _usec = 0;
modbus_se _ esponse_ imeou (c x, & esponse_ imeou );
}
32
Clien ModBUS::~Clien ModBUS()
{
}
/**connec : Conec a el clien e con el se ido ModBUS
Recibe: Nada
De uel e:
ue: conexión ealizada co ec amen e
alse: Fallo al conec a se con el se ido
**/
bool Clien ModBUS::connec ()
{
i (modbus_connec (c x) == -1)
{
p in (s de , "Connec ion ailed: %s n",modbus_s e o (e no));
modbus_ ee(c x);
e u n alse;
}
else
e u n ue;
}
/**disconnec : Realiza la desconexión con el se ido ModBUS con el se ido
ModBUS
Recibe:Nada
De uel e: Nada
**/
oid Clien ModBUS::disconnec ()
{
modbus_close(c x);
}
/**w i e_only_ egis e : Realiza la esc i u a de un solo egis o
Recibe:
add : Di ección del egis o a esc ibi
alue: Valo que se le quie e asigna a dicho egis o
De uel e:
ue: Todo co ec o
alse: No se pudo ealiza la ope ación
**/
bool Clien ModBUS::w i e_only_ egis e (in add , in alue)
{
in c;
c=modbus_w i e_ egis e (c x, add , alue);
i ( c != 1)
{
p in (s de , "w i e_only_ egis e : %s n",modbus_s e o (e no));
e u n alse;
}
else
e u n ue;
}
33
/**w i e_many_ egis e s: Realiza la esc i u a de a ios egis os
Recibe:
add : Di ección del p ime egis o a esc ibi
num_ egis e s: Nume o de egis os a esc ibi
alue: Tabla de alo es pa a dichos egis os
De uel e:
ue: Todo co ec o
alse: No se pudo ealiza la ope ación
**/
bool Clien ModBUS::w i e_many_ egis e s(in add ,in num_ egis e s,uin 16_
alues[])
{
in c;
c=modbus_w i e_ egis e s(c x, add , num_ egis e s, alues);
i ( c != num_ egis e s)
{
p in (s de , "w i e_many_ egis e s:
%s n",modbus_s e o (e no));
e u n alse;
}
else
e u n ue;
}
/** ead_only_ egis e : Realiza la lec u a de un solo egis o
Recibe:
add : Di ección del egis o a lee
alue: Pa ame o po e e encia donde se gua da a el da o leído
De uel e:
ue: Todo co ec o
alse: No se pudo ealiza la ope ación
**/
bool Clien ModBUS:: ead_only_ egis e (in add ,uin 16_ * alue)
{
in c;
c=modbus_ ead_ egis e s(c x, add , 1, alue);
i ( c != 1)
{
p in (s de , " ead_only_ egis e : %s n",modbus_s e o (e no));
e u n alse;
}
else
e u n ue;
}
/** ead_many_ egis e s: Realiza la lec u a de a ios egis os
Recibe:
add : Di ección del p ime egis o a lee
num_ egis e s: Nume o de egis os a lee
alue: Tabla donde se gua da án los alo es de los egis os
leídos
De uel e:
ue: Todo co ec o
alse: No se pudo ealiza la ope ación
**/
34
bool Clien ModBUS:: ead_many_ egis e s(in add ,in num_ egis e s,uin 16_
alues[])
{
in c;
c=modbus_ ead_ egis e s(c x, add ,num_ egis e s, alues);
i ( c != num_ egis e s)
{
p in (s de , " ead_many_ egis e s: %s n",modbus_s e o (e no));
e u n alse;
}
else
e u n ue;
}
Clien Modbus.h
#include <s dio.h>
#include <unis d.h>
#include <s ing.h>
#include <s dlib.h>
#include <e no.h>
#include <modbus/modbus.h>
#include "cons an .h"
class Clien ModBUS
{
p i a e:
modbus_ *c x;
public:
Clien ModBUS(cha * ip,sho po ,in imeou );
~Clien ModBUS();
bool connec ();
oid disconnec ();
bool w i e_only_ egis e (in add , in alue);
bool w i e_many_ egis e s(in add ,in num_ egis e s,uin 16_
alues[]);
bool ead_only_ egis e (in add ,uin 16_ *);
bool ead_many_ egis e s(in add ,in num_ egis e s,uin 16_ []);
};
cons an .h
/***********************************************************************/
/* */
/* CONSTANTES DEL CLIENTE DEL RX90 */
/* */
/***********************************************************************/
35
#de ine ADDR_RX90_STATE 0x0002 // ADDR_RX90_STATE y ADDR_CLIENT deben
coincidi al ejecu a un comando
#de ine ADDR_CLIENT 0x0003
// Las di ecciones 4, 5, 6, 7, 8 y 9 se usan pa a gua da el ángulo de
o ación (posicion) de los ejes del RX90
#de ine ADDR_INI_POSITION 0x0004
#de ine ADDR_FIN_POSITION 0x0009
#de ine ADDR_PINZA 0x000A
// Es ado pinza (ADDR_PINZA)
#de ine OPEN_PINCERS 0
#de ine CLOSE_PINCERS 1
// Tipos de egis os
#de ine READ_ONLY 0
#de ine WRITE_ONLY 1
#de ine READ_WRITE 2
#de ine NOT_PERMITTED 3
// Comandos Modbus
#de ine READ_REGISTERS 0x03 // Valo que indica el comando pa a lee
egis os
#de ine WRITE_MULTIPLE_REGISTERS 0x10 // Valo que indica el comando pa a
esc ibi a ios egis os
#de ine WRITE_ONLY_REGISTER 0x06 // Valo que indica el comando pa a
esc ibi un único egis o
#de ine READ_WRITE_REGISTERS 0x17 // Valo que indica el comando pa a
lee /esc ibi egis os
#de ine WRITE_MASK_REGISTER 0X16
#de ine READ_FIFO 0x18 // Valo que indica el comando pa a lee
egis os de la pila
//Es ado del sis ema (ADDR_RX90_STATE)
#de ine DISCONNECT -1
#de ine RX90_COMMAND 1
#de ine NO_COMMAND 0
#de ine STATE_POWERINGON 101
#de ine STATE_POWERINGOFF 102
//Robo command (ADDR_CLIENT)
#de ine COMMAND_START 501
#de ine COMMAND_FINISH 502
#de ine ROBOT_UP 908
#de ine ROBOT_DOWN 902
#de ine ROBOT_LEFT 904
#de ine ROBOT_RIGHT 906
#de ine ROBOT_BACKWARD 907
#de ine ROBOT_FORWARD 909
#de ine ROBOT_CATCH 905
#de ine ROBOT_DROP 0
#de ine ROBOT_AUTOMOVE 307
//E o es
#de ine ERROR_NO_ERROR 800
#de ine ERROR_UNKNOW 801
#de ine ERROR_SENSOR 802
#de ine ERROR_ACTUADOR 803
#de ine ERROR_MODBUS 804
36
Make ile
all: clien
m - *.o
clien : clien .o Clien ModBUS.o
g++ clien .o Clien ModBUS.o -o clien -lmodbus
clien .o: clien .cpp
g++ -c clien .cpp
Clien ModBUS.o: Clien ModBUS.cpp
g++ -c Clien ModBUS.cpp
clean:
m - *o clien
ins all-libmodbus:
cp libmodbus-3.0.6/lib/libmodbus.* /us /lib
37
ANEXO B: CÓDIGO IMPLEMENTADO EN EL
SERVIDOR
se e .cpp
/***********************************************************************/
/* */
/* SERVIDOR TCP PARA RX90 */
/* */
/***********************************************************************/
#include "se e ModBUS.h"
#include "cons an .h"
#include "Rx90.h"
oid mo e (se e ModBUS se e , in eg, Rx90 x90);
oid pinza (se e ModBUS se e , in eg, Rx90 x90);
in main()
{
// B azo obó ico Rx90
cha disposi i o[]="/de / yUSB0";
//cha posicion[]="122,-77,-43,55,45,-43";
cha posicion[]="150,-150,10,-90,-90,0";
cha ipSe e [16]="192.168.109.148"; // 127.0.0.1
in pue o=1502;
in nClien =1;
in eg=0; //en e o en el que se gua da el ipo de comando ecibido
uin 16_ add ;
// Se ido modbus
se e ModBUS se e ;
p in ("Iniciando se ido ... n");
//Se inicia el se ido
in sini =se e .ini (ipSe e ,pue o,NUM_REG); //ip, pue o, nume o de
egis os pa a c ea
/*
REGISTROS DEL SISTEMA:
0x0000: Núme o de conexiones de clien es (se ido )
0x0001: Es ado del iche o de egis o (0:ce ado/1:abie o) (se ido )
0x0002: Es ado del RX90 (se ido )
0x0003: Comando ecibido po el clien e (clien e)
0x0004: Posicion de o acion de la base del RX90 (clien e)
0x0005: Posicion de o acion de la 1ª a iculacion RX90 (clien e)
0x0006: Posicion de o acion de la 2ª a iculacion RX90 (clien e)
0x0007: Posicion de o acion de la base de la a iculación
pinza del RX90 (clien e)
0x0008: Posicion de o acion de la a iculacion de la pinza
del RX90 (clien e)
0x0009: Posicion de o acion de la base de la pinza del RX90 (clien e)
0x000A: Es ado de la pinza (0: abie a / 1: ce ada) (se ido )
44
/* ecei e_command: Se queda espe ando has a ecibi una se ie de
*/
/* comandos conc e os */
/* */
/* */
/* Recibe: Nada */
/* */
/* De uel e:(in ) */
/* Comandos posibles: */
/* ROBOT COMMAND 1 (Comando hacia el obo )
*/
/* BREAKER COMMAND ACTION 2 (Comando de b eake )
*/
/* ROBOT BREAKER COMMAND ACTION 3 (Comando de obo y b eake )
*/
/* DISCONNECT 4 (Clien e desconec ado) */
/* */
/* */
/****************************************************************************
****/
in se e ModBUS:: ecei eCommand()
{
in ype_ eques ;
in applyCommand= alse;
bool lagRX90= alse;
cha ecla='0';
do
{
c = modbus_ ecei e(c x, que y);
//i (kbhi ())
// ecla = ge ch();
i ( c != -1)
{
ype_ eques =analizeReques ();
//p in ("Comando ipo %d n", ype_ eques );
i ( ype_ eques !=READ_ONLY && ype_ eques !=NOT_PERMITTED)
{
//p in ("Di eccion clien e:
0x%04X:%d n",clien Ope a ion.add _w i e);
in add ;
add =clien Ope a ion.add _w i e/*+i*/;
i (add ==ADDR_CLIENT)
lagRX90= ue;
i ( lagRX90)
{
lagRX90= alse;
applyCommand=RX90_COMMAND;
}
else
{
applyCommand==NO_COMMAND;
sendCon i ma ion();
}
}
else
45
{
i ( ype_ eques ==NOT_PERMITTED)
sendExcep ion(1);
else
sendCon i ma ion();
applyCommand == NO_COMMAND;
}
p in ("Pulse 'C +C' si desea sali ...");
}
else
{
applyCommand=DISCONNECT;
}
}while(applyCommand == NO_COMMAND && ecla!='q');
e u n applyCommand;
}
/****************************************************************************
****/
/* sendCon i ma ion: en ía una con i mación de que la pe ición se ha
*/
/* ealizado co ec amen e */
/* */
/* */
/* Recibe: Nada */
/* De uel e:Nada */
/* */
/****************************************************************************
****/
oid se e ModBUS::sendCon i ma ion()
{
modbus_ eply(c x, que y, c, mb_mapping);
}
/****************************************************************************
****/
/* sendCon i ma ion: en ía una excepción si la pe ición no se ha */
/* ealizado co ec amen e */
/* */
/* */
/* Recibe: Nada */
/* De uel e:Nada */
/* */
/****************************************************************************
****/
oid se e ModBUS::sendExcep ion(in excep ion)
{
modbus_ eply_excep ion(c x,que y,excep ion);
}
/****************************************************************************
****/
/* close: Cie a el se ido modBUS y libe a la abla de egis os
*/
/* */
46
/* Recibe: Nada */
/* De uel e:Nada */
/* */
/****************************************************************************
****/
oid se e ModBUS::close()
{
modbus_mapping_ ee(mb_mapping);
modbus_close(c x);
modbus_ ee(c x);
}
/****************************************************************************
****/
/* analizeReques : Analiza el ipo de pe ición */
/* */
/* Recibe: Nada */
/* De uel e:(in ) */
/* READ_ONLY 0 (solo lec u a) */
/* WRITE_ONLY 1 (solo esc i u a) */
/* READ_WRITE 2 (lec u a y esc i u a) */
/* NOT_PERMITTED 3 (pe ición echazada) */
/* */
/****************************************************************************
****/
in se e ModBUS::analizeReques ()
{
in ype;
clien Ope a ion. unc ion=que y[7];
swi ch(clien Ope a ion. unc ion)
{
case READ_REGISTERS:
ype=READ_ONLY;
clien Ope a ion.add _ ead=(que y[8]<<8) +que y[9];
clien Ope a ion.numReg_ ead=(que y[10]<<8) + que y[11];
b eak;
case WRITE_ONLY_REGISTER:
ype=WRITE_ONLY;
clien Ope a ion.add _w i e=(que y[8]<<8) +que y[9];
clien Ope a ion.numReg_w i e=1;
b eak;
case WRITE_MULTIPLE_REGISTERS:
ype=WRITE_ONLY;
clien Ope a ion.add _w i e=(que y[8]<<8) +que y[9];
clien Ope a ion.numReg_w i e=(que y[10]<<8) + que y[11];
b eak;
case READ_WRITE_REGISTERS:
ype=READ_WRITE;
clien Ope a ion.add _ ead=(que y[8]<<8) +que y[9];
clien Ope a ion.numReg_ ead=(que y[10]<<8) + que y[11];
clien Ope a ion.add _w i e=(que y[12]<<8) +que y[13];
clien Ope a ion.numReg_w i e=(que y[14]<<8) + que y[15];
b eak;
case READ_FIFO:
ype=READ_ONLY;
clien Ope a ion. eques W i ing= alse;
clien Ope a ion.add _ ead=(que y[8]<<8) +que y[9];
clien Ope a ion.numReg_ ead=(que y[10]<<8) + que y[11];
47
b eak;
case WRITE_MASK_REGISTER:
ype=WRITE_ONLY;
clien Ope a ion.numReg_w i e=1;
clien Ope a ion.add _w i e=(que y[8]<<8) +que y[9];
clien Ope a ion.mask_and=(que y[10]<<8) +que y[11];
clien Ope a ion.mask_o =(que y[12]<<8) + que y[13];
b eak;
de aul :
b eak;
}
// odos los egis os son de lec u a y esc i u a, aqui comp ueba que donde
in en a esc ibi es un egis o de esc i u a
i ( ype!=READ_ONLY)
{
o (in i=0;i < clien Ope a ion.numReg_w i e;i++)
{
in eg=clien Ope a ion.add _w i e+i;
//p in ("Regis o del clien e: 0x%04X n", eg);
i ( eg<ADDR_CLIENT && eg>ADDR_FIN_POSITION) //comp ueba
que solo se puede esc ibi en los egis os asignados
{
e u n NOT_PERMITTED;
}
}
e u n ype;
}
else
e u n READ_ONLY;
}
Se e Modbus.h
#include <s dio.h>
#include <unis d.h>
#include <s ing.h>
#include <s dlib.h>
#include <e no.h>
#include <ios eam>
#include < ec o >
#include <modbus/modbus.h>
#include "cons an .h"
using namespace s d;
//Es uc u a donde se gua dan los da os del comando ecibido
ypede s uc da a_modBUS
{
uin 16_ unc ion;
uin 16_ add _ ead;
uin 16_ numReg_ ead;
uin 16_ add _w i e;
uin 16_ numReg_w i e;
uin 16_ mask_and;
uin 16_ mask_o ;
uin 16_ eques W i ing;
}Ope a ion;
48
class se e ModBUS
{
p i a e:
modbus_ *c x; //Con ex o TCP del
se ido Modbus
modbus_mapping_ *mb_mapping; //Tabla de egis os del
se ido Modbus
uin 8_ que y[MODBUS_TCP_MAX_ADU_LENGTH]; //Cadena de by es con la
pe icion del clien e
in c;
Ope a ion clien Ope a ion; //Da os de la pe ición
ecibida
in socke ; //Socke po el que
escucha el se ido
p i a e:
in analizeReques (); //Funcion que analiza la
espues a y ellena clien Ope a ion
public:
se e ModBUS(); //Cons uc o
de la clase
bool ini (cha * ip,uin 16_ po ,in num_holding_ egis e s);
//Inicia el se ido y la abla de egis o
oid wai Clien ();
in ead_only_ egis e (uin 16_ add );
//Función pa a lee un solo egis o
ec o <in > ead_many_ egis e s(uin 16_ add ,in num_ egis e s);
//Función pa a lee a ios egis os
bool w i e_many_ egis e s(uin 16_ add ,in num_ egis e s,
ec o <in > alues); //Función pa a esc ibi a ios egis os
bool w i e_only_ egis e (uin 16_ add ,in alue); //Función pa a
esc ibi en un solo egis o
in ecei eCommand(); //Función que ecibe
los comandos del clien e
oid sendCon i ma ion(); //Función que en ía la
con i mación de una pe ición
oid sendExcep ion(in excep ion); //Función que en ía
una excepción a una pe ición
oid close();
};
RX90.cpp
//
// C++ Implemen a ion: Rx90
//
// Desc ip ion:
//
//
// <[email p o ec ed]>
//
//
#include "Rx90.h"
#include <ss eam>
#include <cma h>
#include <s dexcep >
49
using namespace LibSe ial;
// Inicio del p og ama
Rx90::Rx90(cons s d::s ing& se ialPo , cons s d::s ing& o iginPoin ) {
ini (se ialPo , o iginPoin );
x = 0.0;
y = 0.0;
z = 0.0;
}
Rx90::~Rx90() {
close();
}
// De inimos las a iables
oid Rx90::ini (cons s d::s ing& se ialPo , cons s d::s ing&
o iginPoin ) {
se ial.Open( se ialPo .c_s () );
se ial.Se BaudRa e( Se ialS eamBu ::BAUD_9600 );
se ial.Se Pa i y( Se ialS eamBu ::PARITY_NONE );
se ial.Se Cha Size( Se ialS eamBu ::CHAR_SIZE_8 );
se ial.Se FlowCon ol( Se ialS eamBu ::FLOW_CONTROL_NONE );
se ial.Se NumO S opBi s( 1 );
se ial.unse ( s d::ios_base::skipws ) ;
// Se o igin p ecision poin
s d::s ings eam command_o igin;
command_o igin << "DO SET #ORIGIN=#PPOINT(" << o iginPoin .c_s () <<
")";
sendCommand(command_o igin.s ());
sendCommand("SPEED 30");
sendCommand("DO ABOVE");
sendCommand("DO MOVE #ORIGIN");
sendCommand("HERE ORIGIN", ue);
sendCommand("DO OPENI");
sendCommand("DO ENABLE CP");
}
oid Rx90::close() {
se ial.Close();
}
oid Rx90::sendCommand(cons s d::s ing& command, bool wai Ques ionMa k) {
i (se ial.IsOpen()) {
se ial << command << END;
i (wai Ques ionMa k) {
cha qm;
do { se ial >> qm; } while(qm != '?');
se ial << END;
}
cha ;
do {
se ial >> ; s d::cou << ;
} while ( != '.');
50
}
else {
s d::cou << "Se ial po no opened" << s d::endl;
}
}
oid Rx90::panic() {
sendCommand("PANIC");
}
oid Rx90::mo e(cons Ac ion& ac ion) {
swi ch(ac ion) {
case NONE:
b eak;
case UP:
z += DELTA_VH;
b eak;
case DOWN:
z -= DELTA_VH;
b eak;
case RIGHT:
x -= DELTA_VH;
b eak;
case LEFT:
x += DELTA_VH;
b eak;
case BACKWARD:
y += DELTA_VH;
b eak;
case FORWARD:
y -= DELTA_VH;
b eak;
case CATCH:
ca chI ();
b eak;
case DROP:
d opI ();
b eak;
de aul :
;
}
// send he command
send(x, y, z);
}
oid Rx90::send(double x, double y, double z){
s d::s ings eam posi ion;
posi ion << "DO SET P" << "=SHIFT(ORIGIN BY " << (in )x << "," <<
(in )y << "," << (in )z << ")";
s d::s ing command = posi ion.s ();
sendCommand(command);
sendCommand("DO MOVE P");
}
oid Rx90::ca chI () {
sendCommand("DO CLOSEI");
}
oid Rx90::d opI () {
sendCommand("DO OPENI");
51
}
oid Rx90::au omo e( ec o <in > leePos) {
os ings eam pos;
pos << '"'<<uin ToIn (leePos[0])<<','<<uin ToIn (leePos[1])<<','<<
uin ToIn (leePos[2])<<','<<uin ToIn (leePos[3])<<','<<uin ToIn (leePos[4])<<'
,'<<uin ToIn (leePos[5])<<'"';
p in ("RX90 MOVES TO ");
cou << pos.s ();
s d::cou << ' n';
//cha cadenaPosicion[]="160,-150,10,-90,-90,0";
s d::s ings eam posicion;
posicion << "DO SET P=#PPOINT(" << pos.s () << ")";
//??????????????????
//sendCommand(posicion.s ());
sendCommand("DO MOVE P");
}
oid Rx90::p in Ac ion(cons Ac ion& ac ion) {
s d::cou << "Rx90::p in Ac ion: ";
swi ch(ac ion) {
case NONE:
s d::cou << "none!";
b eak;
case UP:
s d::cou << "up!";
b eak;
case DOWN:
s d::cou << "down!";
b eak;
case RIGHT:
s d::cou << " igh !";
b eak;
case LEFT:
s d::cou << "le !";
b eak;
/*case UP_RIGHT:
s d::cou << "up- igh !";
b eak;
case UP_LEFT:
s d::cou << "up-le !";
b eak;
case DOWN_LEFT:
s d::cou << "down-le !";
b eak;
case DOWN_RIGHT:
s d::cou << "down- igh !";
b eak;*/
case BACKWARD:
s d::cou << "backwa d!";
b eak;
case FORWARD:
s d::cou << " o wa d!";
b eak;
case CATCH:
s d::cou << "ca ch!";
b eak;
case DROP:
s d::cou << "d op!";
52
b eak;
case AUTOMOVE:
s d::cou << "au omo e!";
b eak;
de aul :
s d::cou << "unexpec ed!";
}
s d::cou << s d::endl;
}
in Rx90::uin ToIn (uin 16_ alue) {
in en e o;
i ( alue>65176)
en e o=-(65536- alue);
else
en e o= alue;
e u n en e o;
}
RX90.h
//
// C++ In e ace: Rx90
//
// Desc ip ion:
//
//
// <[email p o ec ed]>
//
//
#i nde RX90_H
#de ine RX90_H
#include <Se ialS eam.h>
#include <ios eam>
#include < ec o >
#include <s din .h>
#de ine DELTA_VH 50
#de ine END " n"
using namespace s d;
class Rx90 {
public:
Rx90(cons s d::s ing& se ialPo , cons s d::s ing& o iginPoin );
~Rx90();
enum Ac ion { NONE, UP, DOWN, LEFT, RIGHT, UP_LEFT, UP_RIGHT,
DOWN_LEFT, DOWN_RIGHT, BACKWARD, FORWARD, CATCH, DROP, AUTOMOVE };
ec o <in > leePos;
s a ic oid p in Ac ion(cons Ac ion& ac ion);
oid mo e(cons Ac ion& ac ion);
oid au omo e( ec o <in > leePos);
oid panic();
p i a e:
oid ini (cons s d::s ing& se ialPo , cons s d::s ing&
o iginPoin );
53
oid close();
oid ca chI ();
oid d opI ();
oid send(double x, double y, double z);
oid sendCommand(cons s d::s ing& command, bool wai Ques ionMa k =
alse);
in uin ToIn (uin 16_ alue);
LibSe ial::Se ialS eam se ial;
double x, y, z;
uin 16_ alue;
};
#endi // RX90_H
Cons an .h
/***********************************************************************/
/* */
/* CONSTANTES DEL SERVIDOR DEL RX90 */
/* */
/***********************************************************************/
#de ine NUM_REG 20
/*
REGISTROS DEL SISTEMA: (Usado po )
0x0000: Núme o de conexiones de clien es (se ido )
0x0001: Es ado del iche o de egis o (0:ce ado/1:abie o) (se ido )
0x0002: Es ado del RX90 (se ido )
0x0003: Comando ecibido po el clien e (clien e)
0x0004: Posicion de o acion de la base del RX90 (clien e)
0x0005: Posicion de o acion de la 1ª a iculacion RX90 (clien e)
0x0006: Posicion de o acion de la 2ª a iculacion RX90 (clien e)
0x0007: Posicion de o acion de la base de la a iculación
pinza del RX90 (clien e)
0x0008: Posicion de o acion de la a iculacion de la pinza
del RX90 (clien e)
0x0009: Posicion de o acion de la base de la pinza del RX90 (clien e)
0x000A: Es ado de la pinza (0: abie a / 1: ce ada) (se ido )
0x000B: Código de e o (se ido )
*/
#de ine NCLIENT 0x0000
#de ine F_REGISTRO 0x0001
#de ine ADDR_RX90_STATE 0x0002 // ADDR_RX90_STATE y ADDR_CLIENT deben
coincidi al ejecu a un comando
#de ine ADDR_CLIENT 0x0003
// Las di ecciones 4, 5, 6, 7, 8 y 9 se usan pa a gua da el ángulo de
o ación (posicion) de los ejes del RX90
#de ine ADDR_INI_POSITION 0x0004
#de ine ADDR_FIN_POSITION 0x0009
#de ine ADDR_PINZA 0x000A
// Es ado pinza (ADDR_PINZA)
#de ine OPEN_PINCERS 0
#de ine CLOSE_PINCERS 1