Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DE LA
UNIVERSIDAD DE BUENOS AIRES
Tesis de Grado
en
Ingeniera Informtica
SEPTIEMBRE 2011
Facultad de Ingeniera
Universidad de Buenos Aires
SEPTIEMBRE 2011
Resumen
Desde hace aos para mejorar las prestaciones de dispositivos que cada vez presentan ms
cantidad de componentes electrnicos las interconexiones dedicadas estn siendo reemplazadas por
buses de datos. Un mbito en donde esto sucede es en la industria automotriz, en donde los
vehculos actuales trabajan con redes como CAN [Bosch91], J1850 [SAE94], entre otras; en donde
los dispositivos electrnicos comparten informacin por medio de un nico cableado para datos.
En los ltimos aos ha surgido la idea de combinar en un nico cableado la energa de
alimentacin y la informacin, lo que se conoce como PLC. Los avances, respecto a la tecnologa
PLC, se encuentran destinados ms que nada a infraestructura edilicia, existiendo una variedad de
estndares de los cuales muchos no implementan todas las capas del modelo OSI [ISO7498-1].
Respecto a los avances de sta tecnologa en el ambiente automotriz, se han desarrollado trabajos
que slo tratan las capas fsica y enlace del modelo OSI.
La idea del presente trabajo es tomar como punto de partida los antecedentes mencionados y
construir un sistema que permita compartir informacin encapsulando toda la complejidad
involucrada en el proceso de comunicacin y brindando una interfaz que sea simple de utilizar para
los dispositivos clientes del sistema.
FernandoArielBeunza79156
FernandoArielBeunza79156
ndice
1. Introduccin....................................................................................................................................15
2. Antecedentes...................................................................................................................................17
2.1. Tecnologa PLC.......................................................................................................................17
2.1.1. X10...................................................................................................................................18
2.1.1.1. Mtodo de transmisin..............................................................................................18
2.1.1.2. Estructura de mensaje................................................................................................19
2.1.1.3. Esquema de direccionamiento...................................................................................19
2.1.2.4. Funciones...................................................................................................................20
2.1.2. CEBus...............................................................................................................................21
2.1.2.1. Mtodo de transmisin..............................................................................................21
2.1.2.2. Estructura de paquete.................................................................................................22
2.1.2.3. Esquema de direccionamiento...................................................................................22
2.1.2.4. Lenguaje de aplicacin..............................................................................................23
2.1.3. CENELEC 50065.............................................................................................................25
2.1.4. UPB..................................................................................................................................26
2.1.4.1. Mtodo de transmisin..............................................................................................27
2.1.4.2. Estructura de paquete.................................................................................................28
2.1.4.3. Esquema de direccionamiento...................................................................................29
2.1.4.4. Comandos..................................................................................................................30
2.1.5. LonWorks.........................................................................................................................31
2.1.5.1. Protocolo CNP...........................................................................................................31
2.1.5.2. Capa fsica.................................................................................................................32
2.1.5.3. Capa de enlace...........................................................................................................33
2.1.5.4. Capa de red................................................................................................................34
2.1.5.5. Capa de transporte.....................................................................................................35
2.1.5.6. Capa de sesin...........................................................................................................36
2.1.5.7. Capa de presentacin.................................................................................................37
2.1.5.8. Capa de aplicacin.....................................................................................................38
2.1.6. HomePlug.........................................................................................................................39
2.1.6.1. HomePlug 1.0............................................................................................................39
2.1.6.2. HomePlug AV...........................................................................................................42
2.1.6.3. HomePlug Green PHY..............................................................................................44
2.2. Redes en automviles..............................................................................................................46
2.2.1. CAN..................................................................................................................................46
2.2.1.1. Modelo de capas........................................................................................................46
2.2.1.2. Capa fsica.................................................................................................................47
2.2.1.3. Capa de enlace...........................................................................................................49
2.2.2. J1850.................................................................................................................................52
2.2.2.1. Modelo de capas........................................................................................................52
2.2.2.2. Capa fsica.................................................................................................................54
2.2.2.3. Capa de enlace...........................................................................................................55
2.2.2.4. Capa de aplicacin.....................................................................................................56
2.2.3. OSEK/VDX......................................................................................................................57
2.2.3.1. Arquitectura...............................................................................................................57
2.2.3.2. Implementacin.........................................................................................................58
2.2.4. LIN....................................................................................................................................58
FernandoArielBeunza79156
FernandoArielBeunza79156
FernandoArielBeunza79156
11
FernandoArielBeunza79156
13
14
FernandoArielBeunza79156
1. Introduccin
Desde hace algunos aos se estn empleando buses de datos en aplicaciones integradas por
diversos dispositivos que necesitan estar intercomunicados entre s para llevar a cabo las tareas para
los cuales fueron diseados. Un ejemplo de esto son los automviles, que debido al aumento de la
cantidad de componentes electrnicos utilizados, cada vez resulta ms dificultoso emplear
interconexiones dedicadas debido al gran volumen de cables requeridos para interconectar todos los
dispositivos entre s.
En la actualidad se trabajan con redes como CAN, J1850, entre otras; por la cual, los
dispositivos se intercomunican enviando mensajes entre s por medio de un bus de datos comn,
eliminando la necesidad de que cada dispositivo tenga una conexin dedicada con cada uno de los
dispositivos con los cuales necesita comunicarse. Esto ya reduce el volumen de conductores
utilizados, pero puede reducirse an ms debido a que todava se encuentran presentes dos redes
diferentes de cableado: una para datos y una para alimentacin.
Esta razn es la que motiva la idea de utilizar comunicaciones PLC, en las cuales la
alimentacin y la informacin comparte un mismo canal: la red de alimentacin; por el cual los
dispositivos que necesariamente deben conectarse a la red de alimentacin para poder funcionar,
pueden aprovechar la misma para intercambiar mensajes entre s.
Existen diversos antecedentes que fundamentan esta idea de los cuales se pueden destacar: el
DC-BUS [Maryanka00] desarrollado por la empresa Yamar Electronics Ltd. y trabajos realizados
sobre comunicaciones PLC por la Facultad de Ingeniera Elctrica de la Universidad Tcnica
Checa de Praga. Estos trabajos ponen su atencin en las capas fsica y de enlace, propuestas por el
modelo OSI, dejando de lado la implementacin de las restantes capas.
EL objetivo de ste trabajo es desarrollar un sistema prototipo que implemente las capas del
modelo OSI no implementadas por los antecedentes mencionados anteriormente, y con esto,
analizar la viabilidad de aplicar la ciencia de la informtica como complemento a la electrnica
existente con la finalidad de aumentar funcionalidad y disminuir costos de implementacin. Para
llevar a cabo dicho anlisis, el presente trabajo se encuentra organizado de la siguiente manera:
En el captulo 2 se realiza un anlisis del estado del arte del tema tratado en ste trabajo.
Se comienza con la descripcin de los orgenes y evolucin de la tecnologa PLC en
general, luego se presentan los estndares de comunicacin utilizados en la actualidad en
aplicaciones para automviles, y finalmente se trata en mayor profundidad la tecnologa
PLC aplicada al ambiente automotriz.
FernandoArielBeunza79156
15
16
FernandoArielBeunza79156
2. Antecedentes
En ste captulo se describe la evolucin de la tecnologa PLC desde sus orgenes hasta la
actualidad. En la primer parte se presentan los estndares utilizados en infraestructura edilicia, que
fueron los destinatarios iniciales de la sta tecnologa. En la segunda parte, se trata especficamente
la adaptacin de la tecnologa PLC al ambiente del automvil. Para finalizar, se presentan los
estndares que utilizan los automviles en la actualidad, que no utilizan la tecnologa PLC, pero
plantean soluciones a problemas propios de ste entorno, que pueden tenerse en cuenta para adaptar
la tecnologa PLC al ambiente automotriz.
FernandoArielBeunza79156
17
2.1.1. X10
ste estndar fue desarrollado para controlar de forma remota dispositivo elctricos en un
hogar u oficina. Para la transmisin de datos utiliza como medio fsico las lneas elctricas presentes
en cualquier establecimiento.
Para permitir el uso del protocolo en instalaciones de red trifsica, se transmiten tres pulsos
que coinciden cada uno de ellos con el cruce por cero de las seales de potencia de cada una de las
fases, como se puede observar en la figura 2.2.
18
FernandoArielBeunza79156
4 bits
4 bits
1 bit
Cada bit mencionado en la figura anterior corresponde a dos semiciclos de la seal de potencia. Un
ejemplo de como se transmite un mensaje puede observarse en la figura 2.4, en donde se muestran
los bits enviados (arriba de la seal) junto con su codificacin (abajo de la seal).
Un comando X10 generalmente involucra dos mensajes: uno para la activacin del
dispositivo destinatario, seguido de otro que le indica al dispositivo destinatario la accin que debe
ejecutar. El comando de la figura anterior corresponde a la activacin del dispositivo 2 ubicado en la
casa A. En el primer mensaje, se identifica la casa y el dispositivo al cual se le desea dar la orden;
en cambio, en el segundo mensaje se indica la orden. El bit final de cada mensaje es utilizado para
indicar que a continuacin se transmitir otro mensaje (bit cero) o para dar fin a la secuencia de
mensajes (bit uno).
FernandoArielBeunza79156
19
0110
0111
1110
1111
0010
0011
1010
1011
0001
0000
1001
1000
0101
0100
1101
1100
2.1.2.4. Funciones
Las funciones que pueden proveer un dispositivo se codifican por medio de 4 bits. Su
codificacin se encuentra detallada en la tabla 2.2, que se encuentra a continuacin:
Cdigo
Funcin
Descripcin
0000
0001
All lights On
0010
On
Conecta un dispositivo.
0011
Off
Desconecta un dispositivo.
0100
Dim
0101
Bright
0111
Extended Code
Cdigo de extensin.
1000
Hail Request
1001
101x
Pre-Set Dim
1100
Extended Data
1101
Status is On
1110
Status is Off
1111
Status Request
Las funciones ms utilizadas son las seis primeras de la tabla anterior. Las funciones Hail Request y
Hail Acknowledge, se utilizan para comunicacin con casas vecinas. Las funciones Extended Code y
20
FernandoArielBeunza79156
2.1.2. CEBus
El estndar CEBus implementa un modelo de comunicaciones punto a punto, en donde
cualquier nodo puede comunicarse con otro en cualquier instante. La comunicacin se realiza a
travs de un nico medio compartido, utilizando un protocolo de control de acceso al medio para
resolver las colisiones cuando dos o ms dispositivos quieren acceder al medio fsico en forma
simultnea.
CEBus fue pensado para trabajar sobre diversos medios fsicos: lneas de potencia, par
trenzado, coaxil, radio e infrarrojo. En el presente trabajo slo se trata el primer medio fsico,
aunque muchos conceptos son aplicables tambin a los otros medios.
ste estndar implementa cuatro de las siete capas definidas por el modelo OSI, que son: la
capa fsica, la capa de enlace, la capa de red y la capa de aplicacin. Sobre la capa de aplicacin se
encuentra CAL, que establece un lenguaje comn para permitir la interoperabilidad entre
dispositivos.
21
FernandoArielBeunza79156
Nombre
Valor
(Hex)
Nombre
01
Node Control
0E
02
Context Control
0F
Meter
03
10
Display
04
11
Medium Transport
05
Binary Switch
13
Dialer
06
Binary Sensor
14
Keypad
07
Analog Control
15
List Memory
08
Analog Sensor
16
Data Memory
09
Multi-position Switch
17
Motor
0A
Multi-state Sensor
19
Synthesizer/Tuner
0B
Matrix Switch
1A
Tone Generator
0C
Multiplane Switch
1C
Counter
0D
1D
Clock
Para acceder a las variables de instancia de cada objeto, CAL define un conjunto de mtodos
enumerados en la tabla 2.4.
FernandoArielBeunza79156
23
Valor
Nombre
Parmetros
Tipos de datos
40
nop
41
setOFF
IV
42
setON
IV
43
getValue
IV
BNC
44
getArray
IV [, [<offset>], <count>]
45
setValue
IV
46
setArray
IV [, [<offset>], <data>]
47
add
48
increment
IV [, <number>]
49
subtract
4A
decrement IV [, <number>]
4B
compare
IV1, IV2
BNCD
4C
comparei
IV1, <data>
BNCD
4D
BNCD
4E
swap
IV1, IV2
BNCD
52
exit
[<error number>]
53
alias
54
inherit
IV, <value>
55
disinherit
IV, <value>
56
if
57
do
58
while
59
repeat
5A
build
D
BNC
Los tipos de datos definidos por CAL son: cadenas de caracteres (strings), datos, nmeros y
booleanos. En la tabla 2.4 se aclaran los tipos de datos que puede manipular cada mtodo.
Por ltimo, CAL tambin define una lista de posibles errores que pueden ocurrir, que se
detallan en la tabla 2.5.
24
FernandoArielBeunza79156
Valor
Descripcin
Valor
Descripcin
Unknown Context ID
10
Inherit Disabled
Unknown Object ID
11
Unknown Method ID
12
Unknown IV Label
13
Power Off
Malformed Expression
14
Invalid Argument
15
IV Read Only
16
No Default
Syntax error
17
Resource in use
18
Precondition Complete
19
Application Busy
Propsito
3 KHz 9 KHz
9 KHz 95 KHz
140 KHz 148.5 KHz Disponible para los consumidores sin restricciones.
FernandoArielBeunza79156
25
Como se observa en la figura 2.7, a diferencia de Europa, Estados Unidos y Japn tienen un
lmite superior para el rango de frecuencias destinado para comunicaciones PLC, debido a que stos
ltimos no utilizan sistemas de radio de onda larga.
La norma tambin define las amplitudes mximas que pueden presentar las seales
utilizadas para transmitir la informacin. A continuacin en la figura 2.8, se pueden observar dichos
niveles para cada una de las bandas establecidas.
Figura 2.8. Lmites mximos de nivel de seal permitidos por CENELEC 50065-1 [PLCEc].
Como se puede apreciar, para la banda A, el nivel mximo permitido alcanza los 134 dBuV en 9
KHz y desciende hasta los 120 dBuV en el lmite superior de la banda en 95 KHz. El resto de las
bandas tiene un nivel mximo permitido de 122 dBuV.
2.1.4. UPB
El estndar UPB es una evolucin de X10, que utiliza la misma tcnica de transmisin de
informacin, agregando a la seal de potencia que alimenta a los dispositivos de la red elctrica, la
26
FernandoArielBeunza79156
Para enviar los dos bits es emplean 800 microsegundos divididos en cuatro fragmentos de 200
microsegundos cada uno. El fragmento en el cual se emite el pulso depende del valor que tome el
grupo de dos bits que se desean transmitir. Con este esquema de codificacin, un byte de
informacin puede ser enviado en cuatro semiciclos de la seal de potencia. La velocidad de
transferencia lograda de sta forma equivale a cuatro veces la frecuencia de la seal de potencia
utilizada para sincronizacin: 200 bps (para 50 Hz) y 240 bps (para 60 Hz).
FernandoArielBeunza79156
27
El prembulo del paquete es utilizado por los receptores para realizar ajustes que le permitan
tener una buena recepcin del resto del paquete.
El encabezado contiene cierta informacin de control, como el dispositivo que dio origen al
paquete, su destinatario, el tamao del mismo, entre otros. La composicin del encabezado se
detalla en la figura 2.11.
El campo CTL tiene una longitud de 2 bytes, y es utilizado para indicar el tamao del paquete, como
debe ser recibido el mismo, como se debe responder al mismo y la cantidad de veces que fue
enviado. El campo NID tiene una longitud de 1 byte, y permite identificar la red en la cual se
encuentra el destinatario del paquete. El campo DID, de 1 byte de longitud, permite identificar al
dispositivo destinatario del paquete. El campo SID, de 1 byte de longitud, indica el dispositivo que
envi el paquete.
Luego del encabezado se encuentra el mensaje cuya longitud puede ser de 0 hasta 18 bytes.
El mensaje se compone (figura 2.12) de dos campos identificados como MDID y MDA.
28
FernandoArielBeunza79156
El campo MDID, de 1 byte de longitud, es utilizado para identificar un comando o una respuesta a
un comando. El campo MDA puede contener hasta 17 bytes y es el encargado de transportar los
argumentos asociados a un comando o una respuesta a un comando.
A continuacin del mensaje, se encuentra la suma de verificacin que es utilizada por el
destinatario del paquete para determinar si el mismo fue recibido correctamente o presenta errores.
Por ltimo, el bit de confirmacin de recepcin, es un bit que deja disponible en dispositivo
que dio origen al paquete, para que el destinatario pueda indicar al origen si el paquete fue recibido
correctamente o no.
FernandoArielBeunza79156
29
2.1.4.4. Comandos
La variedad de comandos que brinda UPB es mucho ms amplia que los proporcionados por
X10. La mxima cantidad de comandos soportados es de 256 (frente a los 16 de X10), aunque no se
utilizan todos los identificadores disponibles. En la tabla 2.7 se hace referencia a los comandos
principales implementados por UPB:
MDID
(Hex)
Comando
MDID
(Hex)
Comando
00
Null
0E - 0F Unused
01
Write Enable
10
02
Write Protect
11
03
12
04
13
05
14
06
Auto-Address
15
07
16
08
17
09
18
0A
19
0B
Add Link
1A
0C
Delete Link
0D
1B - 1F Unused
Tambin existen una serie de comandos y respuestas especiales dedicados a funciones de control,
como se puede ver en la tabla 2.8.
MDID
(Hex)
Comando / Respuesta
MDID
(Hex)
25
Comando / Respuesta
20
Activate Link
Blink
21
Deactivate Link
22
Goto
30
Report State
23
Start Fade
31
Store State
24
Stop Fade
26 - 2F Unused
32 - 3F Unused
Por ltimo, UPB define una serie de respuestas a comandos que se detallan en la tabla 2.9.
30
FernandoArielBeunza79156
MDID
(Hex)
Respuesta
80 -84 Unused
MDID
(Hex)
Respuesta
90
Register Values
85
Setup Time
91
RAM Values
86
Device State
92
Raw Data
87
Device Status
93
Heartbeat
89
Signal Strength
8A
Noise Level
94 - AE Unused
AF
Acknowledgement
8B - 8F Unused
2.1.5. LonWorks
ste estndar se basa en el esquema propuesto por LON, que consisten en un conjunto de
dispositivos que se conectan por medio de uno o varios medios fsicos, y emplean para comunicarse
un protocolo comn. Cada dispositivo tiene la capacidad de generar acciones en respuesta a
mensajes recibidos de otros dispositivos, y/o generar mensajes ante el cumplimiento de
determinadas condiciones.
FernandoArielBeunza79156
31
Capas OSI
Fsica
Enlace
Red
Propsito
Servicios provistos
Interconexin elctrica
Medios fsicos.
Esquemas de modulacin.
Envo de mensajes
Pedido y respuesta.
Autenticacin.
Control
Variables de red.
Mensajes de aplicacin.
Configuracin de red.
Diagnstico de red.
Transferencia de archivos.
Configuracin de aplicaciones.
Especificacin de aplicaciones.
Alarmas.
Registro de datos.
Planificacin.
Aplicacin Compatibilidad
La organizacin de los datos para el transporte de los mismos, en cada una de las capas
presentadas anteriormente se detallan en la tabla 2.11.
Capa
Organizacin de datos
Fsica
Bits en bruto
Enlace
Trama
Red
Datagrama
Transporte
Paquete de transporte
Sesin
Paquete de sesin
Mensaje
32
FernandoArielBeunza79156
Medio
Velocidad
Definicin
IP-852
IP-852 Tunneling
N/A
ISO/IEC 14908-4
PL-20A
2613bps
ISO/IEC 14908-3
PL-20C
CENELEC C-band
Power Line w/access protocol
156.3k/3987bps
ISO/IEC 14908-3
PL-20N
CENELEC C-band
Power Line w/o access protocol
156.3k/3987bps
ISO/IEC 14908-3
TP/FT-10
78.13kbps
ISO/IEC 14908-2
1.25Mbps
LONMARK Interoperability
Guidelines
FernandoArielBeunza79156
33
El prembulo es utilizado por los receptores para sincronicen sus relojes de modo de poder
recibir la trama. ste se compone de dos campos llamados: un bit-sync y un byte sync. El primero
consiste en 6 bits utilizados para sincronizacin, mientras que el segundo consiste en 1 bit que
indica el fin del prembulo.
El encabezado contiene tres campos: priority, path y delta backlog. El primer campo
especifica la prioridad de trama. El segundo campo identifica a la medio fsico por el cual se envi
la trama. Por ltimo, el tercer campo contiene informacin para el ajuste del tiempo de espera del
mecanismo de acceso al medio.
El cdigo de verificacin de errores se compone de un cdigo CRC de 16 bits, utilizado para
determinar si la trama fue recibida sin errores.
34
FernandoArielBeunza79156
Formato de direccin
Destino
Tamao de la
direccin
Multicast
Dominio, Grupo
Unicast
Dominio, Neuron ID
Neuron ID
Dispositivo especfico
La versin especifica la versin del protocolo, y siempre toma el valor cero. El formato del paquete
especifica el formato del contenido del paquete, que puede ser: un paquete de transporte, un paquete
de sesin, un paquete autenticado o un paquete de presentacin. El formato de la direccin indica
que tipo de direccin contiene el paquete, pudiendo existir cuatro variantes: broadcast (subred),
grupo, subred/nodo o grupo con confirmacin de recepcin, o Neuron ID. El tamao del dominio
determina cuantos bytes se destinan para especificar el dominio, existiendo 4 variantes: 0 bytes, 1
byte, 3 bytes o 6 bytes. El campo direccin contiene la direccin del mensaje con el formato
especificado en el formato de direccin.
FernandoArielBeunza79156
35
36
FernandoArielBeunza79156
Descripcin
Bitfield
Bit con o sin signo de 1 a 8 bits de longitud. Slo disponible dentro de una estructura o unin.
Double Float
Enumerated
Float
Reference
Signed Character
Signed Long
Signed Quad
Signed Short
Unsigned Quad
Unsigned Short
Cada uno de los tipos anteriores puede combinarse para formar estructuras compuestas. Existen dos
tipos de estructuras compuestas: estructuras y uniones. Una estructura se compone de cualquiera de
los tipos descriptos en la tabla 2.14. En cambio, una unin puede contener una estructura o
cualquier tipo de dato simple de la tabla 2.14.
FernandoArielBeunza79156
37
El campo direccin es utilizado para indicar la direccin de la variables de red (entrada o salida). El
selector de variable de red es el identificador de variable de red asociado a la variable contenida en
el paquete de sesin.
38
Diagnstico de redes: provee un conjunto de comandos para que las herramientas de red
puedan diagnosticar problemas en la red.
Diagnstico de aplicaciones: provee una interfaz estndar para realizar pruebas sobre
bloques funcionales y dispositivos.
Registro de datos: provee una interfaz estndar para la recoleccin de datos de los
dispositivos, que tambin pueden ser transferidos a otros dispositivos por medio de una
interfaz estndar.
FernandoArielBeunza79156
Administracin de fecha y hora: provee una interfaz estndar para sincronizar la fecha y
hora de los dispositivos dentro de una red.
2.1.6. HomePlug
Homeplug es el nombre para una familia de especificaciones sobre la implementacin de
redes de datos a travs del cableado elctrico existente en un hogar. La primera especificacin
creada de sta familia fue denominada HomePlug 1.0, pensada para reemplazar a las redes de
computadoras cableadas (par trenzado) e inalmbricas, aprovechando la red de electricidad existente
en un hogar. Dicha especificacin evolucion en HomePlug AV, que ampli la velocidad de
transferencia de la primera para permitir el transporte de audio, video y datos. De HomePlug AV,
deriv HomePlug Green PHY, orientada al ahorro de energa y el aumento de la interoperabilidad.
La capa fsica se compone de los bloques detallados en la figura 2.19. Recibe de la capa
superior datos e informacin de control, ambos con diferentes codificaciones. El esquema de
modulacin utilizado es OFDM, independientemente de la codificacin utilizada.
FernandoArielBeunza79156
39
40
FernandoArielBeunza79156
En la figura 2.20 se describe la composicin de una trama utilizada por la capa de control de
acceso al medio, en donde se distinguen tres parte: un delimitador al comienzo, la trama
propiamente dicha y un delimitador final. El delimitador de comienzo comienza con un prembulo,
un indicador de comienzo de trama y 25 bits de informacin de control, en donde se indica entre
otras cosas, el tamao de la trama. La trama comienza con un encabezado de la misma, en donde se
encuentra informacin de control, direccin de origen y destino (48 bits cada una). Inmediatamente
se encuentra el campo donde se transporta los datos provistos por la capa superior, seguido de un
campo de relleno, y una suma de verificacin de 16 bits para deteccin de errores. Separado por un
intervalo de tiempo, se encuentra el delimitador final compuesto por un prembulo e informacin de
control.
Como el canal de comunicacin que brinda las lneas de potencia es nico con varios
dispositivos intentando hacer uso del mismo, es necesario la existencia de un mecanismo de control
de acceso al medio. HomePlug 1.0 utiliza CSMA/CA con un esquema de prioridad para determinar
que dispositivo tiene derecho a utilizar el canal en cada momento. Cuando varios dispositivos
desean enviar una trama, primero se verifica la prioridad de cada uno de ellos, los que posean la
prioridad ms alta entran al perodo de contencin, en donde de forma aleatoria se determina el
quien gana el derecho de utilizar el canal de comunicacin. En la figura 2.21 se puede observar
como transcurre en el tiempo el proceso anterior.
41
2.1.6.2. HomePlug AV
HomePlug AV fue pensado para cubrir los requerimientos de las redes orientadas a
entretenimiento (audio, video y datos) utilizando el cableado de electricidad existente en un hogar.
Al mismo tiempo HomePlug AV brinda la posibilidad de coexistir con HomePlug 1.0 y servicios de
BPL.
La arquitectura de HomePlug AV (figura 2.22) se encuentra preparada para aceptar paquetes
Ethernet por medio de la interfaz H1, lo que permite utilizar adaptar cualquier protocolo basado en
IP a la tecnologa HomePlug AV. Existen dos planos diferentes dentro de la arquitectura: el plano de
datos y el plano de control. El primer plano se conforma siguiendo el modelo tradicional de capas,
capa de control de acceso al medio y capa fsica, con un capa de Convergencia por encima de la
pila de protocolos. El segundo plano se conforma de un Administrador de Conexiones y un
Coordinador Central, aunque l ltimo slo se encuentra activo en una de las estaciones de la red.
La capa fsica trabaja sobre el rango de frecuencias comprendido entre los 2 y 28 MHz,
empleando OFDM con 917 portadoras utilizables, combinado con un cdigo convolucional turbo
TCC. Los mtodos de modulacin empleados para las portadoras varias desde BPSK hasta 1024
QAM . Todas estas caractersticas mencionadas logran una velocidad de transferencia de 200 Mbps.
El transmisor se encuentra ligado a la capa de control de acceso al medio por tres entradas
diferentes: HomePlug 1.0, HomePlug AV (control) y HomePlug AV (datos). La primera existe para
garantizar la compatibilidad con el protocolo HomePlug 1.0. Las dos restantes responden a los dos
42
FernandoArielBeunza79156
FernandoArielBeunza79156
43
La figura anterior muestra como se compone el perodo de sealizacin, existiendo tres regiones:
regin de sealizacin, regin CSMA y regin reservada. El perodo de sealizacin comienza un
instante luego de la deteccin de cruce por cero de la seal de potencia, siendo durante la primer
regin en donde el Coordinador Central transmite la organizacin del perodo de sealizacin. La
siguiente regin se reserva para el trfico que utiliza contencin. Por ltimo, la regin reservada, es
un perodo de tiempo libre de contencin donde se emplea TDMA.
La capa de control de acceso tambin contiene un Administrador de Conexiones encargado
de recibir las especificaciones de calidad de servicio requeridas de la capa superior a HomePlug AV,
y en base a sto determinar que tipo de servicio de los provistos conviene utilizar (CSMA o TDMA).
Tambin debe controlar si la calidad de servicio brindada corresponde a la solicitada, que en caso de
no ser as, el Administrador de Conexiones debe aplicar las correcciones necesarias para cumplir
con lo solicitado.
La capa de Convergencia se encarga de encapsular los paquetes de datos provenientes de la
capa superior a HomePlug AV, agregndoles un encabezado y una suma de verificacin,
conformando un paquete MAC. ste ltimo paquete, para ser transmitido, es particionado en
fragmentos de 512 bytes de longitud. Cada fragmento es encriptado y encapsulado dentro de un
paquete de capa fsica, para luego ser enviado a su destino. En el receptor, se lleva a cabo los pasos
inversos a los anteriores (desencriptacin y reeensamblaje), y el paquete recibido es despachado por
la capa de Convergencia hacia la capa superior.
Sobre la red elctrica de un hogar pueden existir varias redes lgicas conformadas por
distintos dispositivos. Cada una de stas redes lgicas tiene asociado una clave utilizada para el
encriptado de los paquetes que intercambian de forma segura los diferentes dispositivos de la red
lgica.
Otro elemento importante que poseen las redes lgicas es un Coordinador Central. Cada una
de stas redes presenta un coordinador. La funcin de un Coordinador Central es administrar el
ancho de banda de la red al cual pertenece, y controlar la admisin de nuevos dispositivos a la red
lgica.
FernandoArielBeunza79156
Una de las diferencias ms importantes entre redes WAN y HAN, es que en las primeras las
aplicaciones que hacen uso de la red tiene ms libertad para la adopcin de estndares, cosa que no
ocurre en HAN, ya que la amplia gama de dispositivos que pueden estar presentes en un hogar
requieren, para que puedan interoperar sin inconvenientes, la adopcin de estndares ampliamente
aceptados por todos los fabricantes.
Las especificaciones HomePlug Green PHY han sidos diseadas especficamente para
soportar aplicaciones sobre redes del tipo HAN, sin afectar a otras aplicaciones existentes dentro del
hogar. Dichas especificaciones derivan de HomePlug AV, lo que permite la interoperabilidad con el
estndar IEEE P1901 [IEEEP1901].
La capa fsica de Home Plug Green PHY trabaja con un esquema de modulacin OFDM
dentro del rango de frecuencias de 2 a 30 MHz. Las subportadoras empleadas son 1155, con una
separacin entre subportadoras de 24,414 KHz, y moduladas utilizando QPSK. La velocidad
mxima de transferencia que puede alcanzar es de 10 Mbps, implementando varios modos ROBO,
pudiendo bajar dicha velocidad mxima a 5 Mbps y 4 Mbps ganando confiabilidad, con el agregado
del mtodo FEC cdigo turbo . Comparado con Home Plug AV, las caractersticas anteriores
parecen un retroceso (un solo esquema de modulacin de subportadora, velocidad de transferencia
menor, implementacin de un slo mtodo FEC), pero viene de la mano de una reduccin de costos,
de consumo de los dispositivos y de una mayor interoperabilidad.
En cuanto a la capa de enlace de Home Plug Green PHY, resulta bsicamente en una
simplificacin de la versin implementada en Home Plug AV, conservando el mismo mtodo CSMA
y el mecanismo de prioridad, pero perdiendo en mecanismo opcional de TDMA.
FernandoArielBeunza79156
45
2.2.1. CAN
El estndar CAN fue desarrollado por la empresa Robert Bosch GmbH a principios de la
dcada de los 90, con el objeto de proveer un esquema de comunicaciones que soporte sistemas de
control distribuido. ste estndar originalmente se encontraba orientado a la industria automotriz,
pero con el tiempo tambin fue adoptado por la industria en general.
Las especificaciones del estndar CAN se componen de dos partes conocidas como parte A y
parte B. La parte A se encarga de definir el formato estndar de mensaje compatible con versiones
anteriores. La parte B define el formato estndar y extendido de mensaje.
46
FernandoArielBeunza79156
Figura 2.26. Modelo de capas propuesto por CAN A Figura 2.27. Modelo de capas propuesto por CAN B
[Bosch91].
[Bosch91].
Respecto a la capa fsica, CAN no define especficamente el medio fsico utilizado como
canal de comunicacin. De las diferentes variantes existentes, en el presente trabajo se tratar la que
emplea cable par trenzado como canal de comunicacin, en donde las seales son codificadas
utilizando tensin diferencial.
La capa de enlace es la responsable del armado y desarmado de los mensajes, de la deteccin
de errores, de controlar el acceso al medio (resolver el arbitraje), el filtrado de mensajes, entre otras
funciones.
FernandoArielBeunza79156
47
Las redes CAN presentan topologa tipo bus, en donde la longitud del cable y la velocidad de
transferencia se encuentran estrechamente relacionadas. La utilizacin de tensin diferencial sobre
par trenzado le brinda mayor inmunidad al ruido electromagntico aumentando la confiabilidad. El
bus requiere del agregado de dos resistencias de 120 ohms en los extremos del mismo para eliminar
los reflejos de seal. Un bus CAN es capaz de soportar hasta 30 dispositivos. En la figura 2.29 se
puede observar un ejemplo de como se constituye una red CAN.
Las velocidades de transferencia que soporta CAN estn comprendidas en el rango de los 10 Kbps a
1 Mbps. La velocidad est dada por el tiempo de duracin del bit empleado que sta en relacin a la
longitud de bus. En la tabla 2.15 se puede observar la relacin que existe entre la velocidad de
transferencia, la longitud del bus y el tiempo de duracin del bit.
Velocidad de
transferencia
Longitud
del bus
Duracin
del bit
1 Mbps
30 metros
1 microsegundo
800 Kbps
50 metros
1,25 microsegundos
500 Kbps
100 metros
2 microsegundos
250 Kbps
250 metros
4 microsegundos
125 Kbps
500 metros
8 microsegundos
62,5 Kbps
1000 metros
20 microsegundos
20 Kbps
2500 metros
50 microsegundos
10 Kbps
Tabla 2.15. Relacin entre velocidad de transferencia, del longitud del bus y el tiempo de duracin del bit
[Zeltwanger]
48
FernandoArielBeunza79156
Los smbolos utilizados por CAN para codificar los valores de los bits permiten la existencia
de un valor dominante sobre un recesivo. En ste caso particular el smbolo utilizado para el valor
de bit cero corresponde al dominante, mientras que el valor uno corresponde al recesivo. ste
esquema permite que en todo momento se pueda leer un estado vlido del bus (colisin no
destructiva). sto es necesario, ya que CAN basa su sistema de resolucin de colisiones en la
existencia de un estado dominante sobre uno recesivo, como se explicar ms en detalle cuando se
hable sobre la capa de enlace.
49
En la figura 2.31 se puede observar un ejemplo de funcionamiento del mtodo de control de acceso
al medio por prioridad. Como se puede ver existen tres dispositivos transmitiendo en simultneo. El
primer dispositivo en abandonar la contienda es el nmero 2, ya que ste emite un bit de valor uno
mientras que el resto emiten un bit de valor cero. Luego el siguiente en abandonar la contienda es el
dispositivo 1, quedando solamente el dispositivo nmero 3 quien continua transmitiendo hasta el
final de la trama. ste sistema no solamente resuelve las contienda en forma no destructiva, sino que
tambin garantiza un tiempo determinstico para el envo de las tramas, ya que el tiempo que
demora la transmisin de las tramas depende de la prioridad de los mismos.
Una de las caractersticas particulares de CAN que la diferencia de otras redes, es que no
existe el concepto de direccin de dispositivo. Lo nico que existe es el identificador de trama, que
los dispositivos son capaces de filtrar, y de sta forma pueden determinar que tramas procesar. ste
esquema de identificacin permite a CAN ser muy flexible en el agregado de nuevos dispositivos a
la red, ya que no requiere de configuracin de los mismos. Adems el identificador de trama forma
parte del campo de arbitraje de la trama, permitiendo que stas puedan ser asociadas a funciones,
siendo algunas ms crticas que otras, pudiendo asignar mayor prioridad a las funciones crticas.
Puede decirse tambin que cada identificador constituye una direccin de multicast debido a que el
destinatario de una trama puede ser un dispositivo o un grupo de dispositivos, adems de existir una
direccin de broadcast para el envo de tramas a todos los dispositivos del bus.
La estructura de una trama utilizada por CAN para el envo de datos, bsicamente es similar
tanto para la parte A como para la parte B. La diferencia existe en que la parte B implementa una
estructura de mensaje extendido que permite utilizar identificadores de mensaje ms extensos. La
estructura de mensaje propuesta por la parte A se puede observar en la figura 2.32, mientras que las
estructuras definidas por la parte B pueden verse en la figura 2.33 (mensaje estndar) y la figura
2.34 (mensaje extendido).
50
FernandoArielBeunza79156
Figura 2.32. Estructura de trama estndar utilizada por CAN parte A [Reuss93].
Figura 2.33. Estructura de trama estndar utilizada por CAN parte B [Reuss93].
Figura 2.34. Estructura de trama extendida estndar utilizada por CAN parte B [Reuss93].
Una trama comienza con un bit de comienzo de trama (SOF) para indicar el comienzo de la misma,
seguida de un identificador de 11 bits, seguido de un grupo de indicadores (varan segn la
estructura de trama), y 4 bits que indican la cantidad de datos que transporta el mensaje (DLC). A
continuacin se encuentran los datos que pueden ocupar de 0 a 8 bytes, segn lo especificado en el
campo DLC. Luego de los datos se encuentra un cdigo de deteccin de errores CRC de 15 bits, un
bit indicador de fin del cdigo CRC, 2 bits de ACKN utilizado por los receptores para indicar la
correcta recepcin, y por ltimo 7 bits que indica el fin de la trama (EOF). El bit de RTR presente en
todas las estructuras de tramas es utilizado para indicar si la trama es de datos (valor cero) o es una
trama remota (valor uno). El bit de IDE solamente existen en las tramas de la parte B para indicar si
en mensaje es estndar (valor cero) o extendido (valor uno). El bit SRR solamente se encuentra en la
trama extendida de la parte B, y su finalidad debe a razones de compatibilidad con la trama estndar
(reemplaza al bit RTR). Los bits destinados al identificador de trama y el bit RTR constituyen el
campo de arbitraje utilizado para resolver colisiones.
Adems de la trama utilizada para el envo de datos, existen otro tipo de tramas. La trama
remota tiene una estructura similar a la de datos pero sin el campo de datos, y es enviada cuando un
dispositivo requiere que le enven una trama de datos con el mismo identificador. Tambin existen
otras tramas como la trama de error, enviada cuando un dispositivo detecta un error en el bus, y la
trama de sobrecarga, enviada cuando un dispositivo se encuentra sobrecargado y necesita un tiempo
adicional para terminar de procesar la ltima trama recibida.
A cualquier tipo de trama, una vez armada, se le adiciona cada 5 bits consecutivos de igual
valor uno de diferente valor (tcnica de bit stuffing). Luego se le aplica codificacin NRZ (Non
Return to Zero), y finalmente se enva.
Los dispositivos slo procesan tramas recibidas sin error. Cuando un dispositivo enva una
trama, emite una secuencia de dos bits de valor uno en el campo ACKN de la trama. Cuando uno o
varios de los dispositivos receptores detectan un error por medio del cdigo CRC, stos fuerzan una
secuencia de bits 01 que colisionan con la secuencia original indicando la presencia de un error
error de recepcin, forzando a los dems dispositivos receptores a no procesar la trama (aunque la
recepcin haya sido correcta), y a que el emisor vuelva a reenviar la trama. El mecanismo de
confirmacin de recepcin descripto permite que CAN brinde un servicio de comunicacin multicast
FernandoArielBeunza79156
51
2.2.2. J1850
El estndar J1850 fue reconocido por SAE en el ao 1994, como una red para automviles
clase B (segn clasificacin empleada por SAE). La idea de ste estndar es proponer una
arquitectura abierta de bus de datos de topologa simple de bajo costo, que no necesitara de un
dispositivo maestro para administrar el bus.
52
FernandoArielBeunza79156
Como se puede observar en la figura anterior J1850 establece que la capa de aplicacin es la
encargada de definir los tipos de mensajes, cdigos de diagnstico y parmetros; de sta forma
todos los dispositivos interactan por medio de una interfaz nica permitiendo la interoperabilidad
entre diferentes fabricantes de dispositivos. La capa de enlace se encarga de controlar el acceso al
medio, resolviendo los conflictos que puedan existir cuando varios dispositivos intenten hacer uso
del canal de comunicacin, y de permitir el flujo de datos libre de errores. La capa fsica es la
encargada de codificar los datos empaquetados por la capa de enlace a travs de seales elctricas,
existiendo dos variantes posibles, cada una con sus caractersticas fsicas particulares.
FernandoArielBeunza79156
53
Figura 2.36. Codificacin de bit valor cero utilizado Figura 2.37. Codificacin de bit valor uno utilizado
por J1850 VPW [SAE94].
por J1850 VPW [SAE94].
La otra variante llamada PWM, emplea modulacin de ancho de pulso para la codificacin
de los datos. En la figura 2.38 se puede observar el smbolo utilizado para codificar un bit de valor
cero, y en la figura 2.39 se puede observar el smbolo empleado para codificar un bit de valor uno.
En J1850 PWM tambin existe el concepto de dominante y recesivo, en este caso un bit de valor
cero es dominante frente a un bit de valor uno, ya que para el primero se emplea un pulso ms ancho
que para el segundo. Gracias a stos smbolos, J1850 PWM puede transferir datos a una velocidad
de 41,6 Kbps.
Figura 2.38. Codificacin de bit valor cero utilizado Figura 2.39. Codificacin de bit valor uno utilizado
por J1850 PWM [SAE94].
por J1850 PWM [SAE94].
54
FernandoArielBeunza79156
El protocolo de resolucin de colisiones se basa en que los dispositivos pueden enviar bits y
escuchar el canal en forma simultnea. Varios dispositivos pueden comenzar en un determinado
momento a transmitir un mensaje. Cada mensaje tiene un encabezado constitudo por un campo de
prioridad que especifica la prioridad del mensaje. Los bits de prioridad, como el resto de la
informacin, es codificada empleando cualquiera de las variantes propuestas por J1850 (VPW o
PWM). A medida que los dispositivos transmiten y detectan en el canal de comunicacin diferencias
entre lo enviado y recibido, los dispositivos cesan sus transmisiones, hasta que uno ellos quede
transmitiendo hasta el final del mensaje, porque que no detect diferencias. stas diferencias
pueden ser detectadas gracias a que existe un valor de bit que es dominante sobre el otro,
permitiendo en todo momento, que a pesar de la colisin de seales, siempre se pueda establecer el
valor del bit.
Un mensaje se encuentra compuesto por cinco partes: un indicador de comienzo de mensaje
(llamado SOF), un encabezado, un campo de datos, un cdigo de deteccin de errores CRC y un
FernandoArielBeunza79156
55
Los indicadores de comienzo y fin de mensaje son delimitadores que avisan a los receptores cuando
comienza y termina un mensaje. El encabezado de contiene informacin de control detallada en la
figura 2.43.
Prioridad
3bits
Tipode
Modode
Tipode
IFR
encabezado
direccionamiento mensaje
1bit
1bit
1bit
2bits
Tipode
Modode
Tipode Direccin Direccin
IFR
encabezado
direccionamiento mensaje deorigen dedestino
1bit
1bit
1bit
2bits
8bits
8bits
FernandoArielBeunza79156
2.2.3. OSEK/VDX
El proyecto OSEK fue iniciado en el ao 1993 por un conjunto de empresas pertenecientes a
la industria del automvil alemana. El objetivo principal del proyecto es proponer una arquitectura
de control distribuido dentro de los automviles que sea abierta, para que diversos fabricantes
puedan desarrollar dispositivos que sean interoperables entre s. Las empresas francesas PSA y
Renault tambin se encontraban trabajando en un proyecto similar llamado VDX, y se fusionaron al
proyecto OSEK en el ao 1994, conformando un nico estndar llamado OSEK/VDX.
2.2.3.1. Arquitectura
El estndar OSEK/VDX define un conjunto de interfaces que permiten el desarrollo de
componentes de software porttiles y reutilizables. La idea del estndar es abstraer la aplicacin del
hardware utilizado en los dispositivos interconectados a travs de una red. Una aplicacin interacta
con la interfaz, lo que permite el desarrollo del estndar para diversas plataformas y la evolucin del
mismo, sin necesidad de modificar la aplicacin. En la figura 2.45 se puede observar la arquitectura
propuesta por el estndar.
FernandoArielBeunza79156
57
2.2.3.2. Implementacin
OSEK/VDX implementa un entorno de trabajo distribuido dentro de un vehculo, basndose
en los mismos principios utilizados para implementar entornos distribuidos que operan dentro de las
redes de datos de gran tamao. De ste modo se pretende reducir costos en la creacin de software
reutilizable. Pero la flexibilidad de OSEK/VDX requiere de memorias ROM y RAM adicionales,
adems de sobrecargar a los procesadores. La clave del xito de ste modelo depende que los costos
adicionales de hardware sean absorbidos por el ahorro asociado por la implementacin de software
reutilizable.
Tambin OSEK/VDX puede ser visto como un sistema operativo desarrollado para diversas
plataformas de procesador, soportar diversas interfaces de comunicacin y servir a mltiples
aplicaciones. Como todo sistema operativo, OSEK/VDX debe administrar las diferentes tareas que
se encuentren en ejecucin, procesar las diferentes solicitudes de interrupcin, proveer mecanismos
de comunicacin entre procesos en ejecucin y brindar tratamiento a los errores que ocurran.
El estndar por s mismo no especifica como se llevan a cabo las comunicaciones entre
dispositivos, como lo hacen otros estndares, sino que define un esquema multiplataforma que
puede complementarse con distintos estndares de comunicacin existentes como CAN y J1850.
2.2.4. LIN
Las redes LIN fueron pensadas para ser redes de bajo costo, como complemento de otras
redes presentes en un automvil. La idea surge del principio que dentro de un automvil se
disponen de una gran cantidad de dispositivos, siendo algunos de baja complejidad (como por
58
FernandoArielBeunza79156
Los niveles de tensin empleados para codificar los bits de datos se encuentran definidos en
relacin a la tensin de la batera. La figura 2.48 muestra el rango de tensiones utilizado para el
nivel alto y el bajo. El nivel bajo resulta ser dominante frente al alto debido a la configuracin de la
interfaz de la figura 2.47, en un transistor tiene la capacidad de forzar a todo el bus a un estado bajo
sin importar el estado que tengan las interfaces de los otros dispositivos conectados al bus.
FernandoArielBeunza79156
59
Una trama se compone de un encabezado y una respuesta. El encabezado siempre es generado por el
dispositivo maestro, y consiste en un espacio inicial utilizado para marcar el inicio de una trama,
seguido de una secuencia alternada de bits de valor cero y uno para sincronizar los dispositivos
esclavos con el maestro, y finalmente un identificador protegido. ste identificador se conforma de
los campos detallados en la figura 2.51.
60
FernandoArielBeunza79156
Luego de la secuencia de bytes de datos, el dispositivo esclavo emite una suma de verificacin, para
que el dispositivo maestro pueda verificar si los datos recibidos contienen errores o no. En la figura
2.53 se describe un ejemplo de secuencia de envo de encabezado y recepcin de datos.
2.2.5. D2B
ste bus fue desarrollado por la empresa Phillips en los comienzos de la dcada del 80. Su
finalidad era poder interconectar diferentes dispositivos domsticos de audio y video. La empresa
FernandoArielBeunza79156
61
Una red D2B puede soportar hasta 6 dispositivos conectados, siendo uno de ellos el maestro,
y el resto esclavos. La fibra ptima permite que la velocidad de transferencia alcance los 5,65 Mbps,
debido a la inmunidad al ruido electromagntico que ste medio posee. El largo mximo que puede
alcanzar el cable de fibra ptica varia segn la cantidad de acopladores: si no se emplean
acopladores el cable puede tener hasta un largo de 10 metros, si se introduce un acoplador el largo
se reduce a 7 metros, y si se introducen dos acopladores el largo no puede alcanzar los 3,6 metros
[D2B02]. Adems el cable debe tener un radio de curvatura mnimo de 25 milmetros para que no
se dae.
Los beneficios de D2B vienen dados fundamentalmente por las ventajas de que brinda la
fibra ptica (altas velocidades de transferencia e inmunidad al ruido electromagntico), pero
tambin se hacen evidentes las desventajas de sta: las distancias no son extensas (y disminuyen con
el uso de acopladores), los cables son frgiles (y su curvatura se encuentra limitada), y en caso de
rotura la reparacin es costosa.
62
FernandoArielBeunza79156
FernandoArielBeunza79156
63
2.2.6. MOST
MOST constituye una evolucin de D2B desarrollada por las empresas BMW, DaimlerChrysler, Harman/Becker y Oasis. A diferencia de D2B, el uso de ste bus no es exclusivo de
Mercedes Benz, que tambin ha adoptado MOST en reemplazo de D2B. Las mejoras incluyen
velocidad de transferencia, cableado, cantidad de dispositivos soportados, entre otras.
MOST fue diseado para que sea independiente del medio fsico utilizado como canal de
comunicaciones. Puede trabajar sobre cableado elctrico (par trenzado) o fibra ptica. En este
trabajo slo se hablar de fibra ptica, ya que es el medio fsico ms conocido en la industria del
automvil.
FernandoArielBeunza79156
A diferencia de D2B, MOST introduce algunas mejoras con el objetivo de mejorar las
prestaciones. La primer mejora consta en el cableado ptico, que al utilizar fibra ptica plstica,
permite aumentar la longitud mxima permitida (21 metros sin acopladores y 3,962 metros con tres
acopladores), y no tiene el inconveniente del radio de curvatura mnimo que presenta D2B. Adems
la velocidad de transferencia se eleva a 24,8 Mbps y la cantidad mxima de dispositivos soportados
por la red asciende a 64. Respecto a la parte elctrica, introduce mejoras en cuanto al sistema de
activacin de los dispositivos, en lugar de que el dispositivo maestro sea el encargado de proveer la
alimentacin de ste sistema, en MOST todos los dispositivos se encargan de ello.
65
Los mensajes enviados por medio del canal de control son cortos y transfieren informacin de
control requerida por las aplicaciones. Los destinatarios de este tipo de mensajes pueden ser un
dispositivo (unicast), un grupo de ellos (multicast) o todos (broadcast). Cuando se enva este tipo de
mensajes, el arbitraje del medio es realizado por el controlador de interfaz de red MOST,
garantizando que el acceso al medio sea independiente de la carga de la red. ste tipo de mensajes
pueden ser retransmitidos, en caso de error, la cantidad de veces indicada por la aplicacin que los
genera.
Todo tipo de datos no que no son transmitidos por medio del canal de control, pueden ser
paquetes de datos o flujo de datos. Los paquetes de datos son empleados para el envo de rfagas de
datos. La cantidad de datos enviados por medio de paquetes es mayor a los enviados por medio del
canal de control. Los paquetes pueden estructurarse de dos formas segn el tipo de direccin
utilizada, como puede verse en las figuras 2.59 y 2.60.
Encabezado
12 bytes
Direccin Direccin
de destino de origen
2 bytes
2 bytes
CRC
Datos
66
FernandoArielBeunza79156
Encabezado
12 bytes
Direccin Direccin
de destino de origen
6 bytes
6 bytes
CRC
Datos
Ambas estructuras son bsicamente similares en cuanto al encabezado, cdigo detector de errores
CRC, y el campo de datos (su longitud mxima vara segn el tipo de direcciones utilizados). Las
direcciones pueden ser de 16 bits (direcciones MOST) o de 48 bits (direcciones MAC). El mtodo de
acceso al medio utilizado para el envo de paquetes de datos es por medio de la circulacin de
testigo por el anillo de la red.
Los flujos de datos pueden ser de naturaleza sincrnica o iscrona. Los flujos del primer tipo
se refieren a datos en tiempo real como audio, video o datos originados por sensores. El mtodo de
acceso al medio utilizado en este caso es multiplexado por divisin de tiempo TDM. Los flujos del
primer tipo son similares a los del primero, con la diferencia de que su muestreo no se realiza con el
reloj del sistema. El mtodo de acceso al medio empleado es el mismo que para los flujos
sincrnicos.
Figura 2.61. Comunicacin virtual entre dos dispositivos a nivel de capa de aplicacin [MOST10].
Todos los mensajes de la aplicacin son finalmente transferidos a travs del canal de control o el
canal de paquetes de datos provistos por la red MOST. Dependiendo de la cantidad de datos que se
requiere enviar, se puede emplear un mensaje de transferencia nica (telegrama), o de lo contrario
por medio de transferencia segmentada.
FernandoArielBeunza79156
67
El tamao de las direcciones del mensaje son 16 bits. Para la identificacin de los mensajes se
destinan 32 bits, mientras que para identificar el telegrama se emplean 4 bits. Los 12 bits destinados
a almacenar la cantidad de datos transportada. Una transferencia simple puede transporta hasta 45
bytes.
La estructura de mensaje empleada para transferencias segmentadas es similar a la empleada
para los mensajes de transferencia nica. Se diferencian en que los mensajes para transferencias
segmentadas necesitan de un contador de mensaje (ver figura 2.63).
2.2.7. FlexRay
El estndar FlexRay fue desarrollado por el consorcio del mismo nombre, integrado por un
conjunto de empresas fabricantes de automviles y de electrnica, entre los aos 2000 y 2009, para
superar en prestaciones a buses como CAN y MOST.
FernandoArielBeunza79156
Las topologas de red que se permite implementar FlexRay son variadas gracias a la
disposicin de dos canales de comunicacin paralelos. La topologa ms simple que se puede
utilizar es la lineal, en donde los dispositivos de la red puede conectarse a uno de los canales o a los
dos, como se muestra en la figura 2.65.
FernandoArielBeunza79156
69
En la topologa estrella, el cableado su puede ramificar, sin necesidad de depender de una sola lnea
como ocurre con la topologa lineal. Solamente se permite un punto de empalme, y las limitaciones
en cuando al tamao del cable y la cantidad de dispositivos es idntica a la topologa lineal. Para
extender el lmite de longitud del cable, FlexRay permite la utilizacin de elementos activos. En la
figura 2.67 y 2.68 se proponen dos variantes de la topologa estrella activa.
A diferencia de la topologa estrella pasiva, la estrella activa emplea en los puntos de empalme
elementos repetidores. Los repetidores se encargan de regenerar la seal y tiene la capacidad de
desconectar un tramo averiado del cableado, permitiendo el funcionamiento del resto de la red. La
longitud mxima de cable que puede existir entre un dispositivo y un repetidor, o entre dos
repetidores es de 24 metros. Sobre una misma lnea se pueden colocar hasta dos repetidores, lo que
70
FernandoArielBeunza79156
La figura 2.69 muestra una topologa parte estrella y parte lineal, empleando elementos repetidores
en los puntos de empalme de las diversas topologas bsicas utilizadas.
Una trama de capa fsica se compone bsicamente de una secuencia de bytes como se puede
observar en la figura 2.70.
La trama comienza con el envo de una secuencia de bits de valor cero utilizados para indicar el
inicio de una transmisin. Luego de la secuencia anterior, se enva un bit de valor uno para indicar
el comienzo de la trama. A continuacin se transmiten los bytes de la trama, con un encabezado
previo compuesto por un bit de valor uno seguido de un bit de valor cero, utilizado para sincronizar
el receptor. Una vez finalizada la transmisin de todos los bytes de la trama, se enva un bit de valor
cero seguido de un bit de valor uno para indicar el fin de la trama.
71
El segmento esttico se compone de ranuras de tiempo de longitud fija, cada uno asociado a un
determinado identificador de trama, y a su vez cada identificador se encuentra asociado a un nodo
determinado, de ste modo cada nodo conoce en que ranura debe transmitir. El segmento dinmico
se compone de ranuras dinmicas de longitud variables, y el uso se determina en base a la prioridad
de la trama a enviar. El segmento SW es utilizado para evaluar el estado medio. El segmento NT
corresponde a un perodo de tiempo en el cual el canal queda libre. Tanto el segmento esttico como
el segmento NT son obligatorios, en cambio el segmento dinmico y el segmento SW puede estar o
no dentro de un ciclo.
La informacin se enva por medio de tramas conformadas por los campos detallados en la
figura 2.72. Una trama puede dividirse en tres partes: un encabezado, la informacin a enviar y
cdigos de deteccin de errores. El tamao de la trama puede variar entre los 8 y 262 bytes.
El encabezado tiene una longitud de 5 bytes distribuidos en: 5 bits de estado, 11 bits destinados al
identificador nico de trama asociado al nodo que enva la trama, 7 bits para indicar la cantidad de
bytes de informacin enviados en la trama, 11 bits para cdigo de deteccin de errores CRC para el
encabezado y 6 bits para indicar el ciclo de comunicacin corriente. La informacin conformarse
72
FernandoArielBeunza79156
2.3.1. DC-BUS
La empresa Yamar Electronics Ltd. ha desarrollado un sistema propietario para
comunicaciones PLC para automviles. El sistema llamado DC-BUS permite un ahorro en el
cableado que se traduce en una reduccin en el peso total del automvil adems de las ventajas que
brinda la utilizacin de un bus de datos para intercomunicar los diversos dispositivos electrnicos
existentes en el mismo.
DC-BUS propone una opcin por cada categora. Para las aplicaciones multimedia existe una
alternativa que ofrece 1,7 Mbps utilizada, por ejemplo, para transmitir audio de calidad proveniente
del cargador de CD hacia el reproductor de audio. Para aplicaciones de telemtica, la alternativa
existente tiene una velocidad de 250 Kbps que permite la transmisin de voz y datos. Por ltimo,
FernandoArielBeunza79156
73
Figura 2.73. Esquema del DC-BUS desarrollado por Yamar Electronics Ltd.
DC-BUS fue diseado para trabajar en una red constituida con hasta 16 dispositivos. Todos
los canales se encuentran disponibles sobre una misma red de potencia. Solamente un dispositivo a
la vez, puede enviar informacin utilizando cualquiera de los canales.
Cuando varios dispositivos tiene que realizar una transmisin, se emplea un protocolo
CSMA para resolver la contienda entre los dispositivos. Existen variantes del protocolo CSMA,
sobre el tratamiento de las colisiones de mensajes. DC-BUS tiene la particularidad de no poder
transmitir y recibir en forma simultnea, lo cual impide la deteccin de colisin. La solucin
implementada consiste en realizar un arbitraje previo a la transmisin, y resolver la contienda en
base a la emisin y deteccin de una portadora.
74
FernandoArielBeunza79156
2.3.1.3. Implementacin
Un dispositivo de comunicacin DC-BUS se encuentra constituido por los bloques
enumerados en la figura 2.76.
75
76
FernandoArielBeunza79156
Figura 2.78. Esquema bsico de una red de potencia de un automvil y puntos de prueba [Trnka06-2].
En la figura 2.78 se detallan seis puntos de prueba que comprenden todo el automvil, a fin
de obtener la atenuacin promedio en diferentes bandas de frecuencia del canal de comunicaciones
entre cada una de las posibles combinaciones de puntos. Segn las mediciones realizadas en el
trabajo Optimization of the Data Transmissions over DC Power Lines [Trnka06-2], los valores de
atenuacin promedio, para cada una de las diferentes bandas de frecuencia, son los detallados en la
tabla 2.16.
Tabla 2.16. Atenuacin promedio (en dB) en diferentes bandas de frecuencia [Trnka06-2].
77
78
FernandoArielBeunza79156
La pruebas realizadas al modem prototipo, han dado como resultado que de una seal
emitida comprendida en frecuencia entre los 4 y 16 MHz, slo llegan al receptor las
frecuencias comprendidas dentro del rango de los 12 y 16 MHz aproximadamente
(figuras 2.80 y 2.81). sto obedece a lo enunciado en la caracterstica anterior.
FernandoArielBeunza79156
79
FernandoArielBeunza79156
FernandoArielBeunza79156
81
Para aumentar la eficiencia de las tcnicas anteriores pueden utilizarse ms de dos fase para
codificar la informacin, aumentando la capacidad de transporte, pero disminuyendo la inmunidad
al ruido. En el caso particular de las comunicaciones PLC, no se pueden emplear muchas fases
(disminucin de la inmunidad al ruido), y ninguna de las variantes es inmune al desvanecimiento de
frecuencia que si coincide con la portadora, imposibilita la transmisin de informacin a travs del
medio.
Debido a los problemas expuestos en las anteriores tcnicas de modulacin, resulta necesario
transmitir la informacin de forma redundante, trabajando con mltiples portadoras
independientemente de la tcnica de modulacin. sto disminuye la posibilidad de destruccin de la
seal de informacin a mayor cantidad de portadoras se utilicen. La utilizacin de mltiples
portadoras implica una aumento del ancho de banda requerido, por ello, las tcnicas que se
describen a continuacin se denominan tcnicas de modulacin de banda ancha.
La primer tcnica de modulacin de banda ancha es una mejora de la modulacin BPSK
basada en la tcnica de espectro ensanchado de secuencia directa conocida como DSSS. El principio
fundamental de cualquier tcnica de ensanchamiento de espectro se basa en la idea de distribuir la
energa de la seal concentrada en una banda estrecha a lo largo de una banda ms ancha que la
anterior, con lo cual se mejora la inmunidad al ruido y resistencia a la interferencia. En el caso
particular de la tcnica DSSS, dicha distribucin se logra con la introduccin de una secuencia
pseudoaleatoria, con lo cual en lugar de transmitir un bit cero o uno directamente (como en el caso
de BPSK), se transmite una secuencia pseudoaleatoria que representa el bit de informacin. Dicha
secuencia modulan y demodulan de forma idntica a la tcnica BPSK.
La mejora introducida por sta ltima tcnica de modulacin agrega a las caractersticas de
la modulacin BPSK de banda estrecha los beneficios del ensanchamiento en espectro que hace
resistente a la informacin al ruido e interferencia propios del canal de comunicaciones, sin un gran
incremento de la complejidad de implementacin. Pero la atenuacin en funcin de la frecuencia
caracterstica del canal de comunicaciones, estudiada con anterioridad, implica la necesidad de
implementar un esquema de ecualizacin para corregir las deformaciones del espectro de la seal,
para que sta pueda ser demodulada de forma correcta. La desventaja de la tcnica DSSS radica en
que requiere una alto grado de complejidad la implementacin de un ecualizador que permita el
correcto funcionamiento sobre el canal de comunicaciones PLC particular de un automvil. sto
82
FernandoArielBeunza79156
FernandoArielBeunza79156
83
La tcnica BFSK Adaptada logra reunir la simpleza del BFSK con las ventajas de OFDM,
pero la utilizacin del espectro no es del todo eficiente, ya que para cada uno de los smbolos
solamente se utilizan la mitad de las portadoras disponibles. El empleo de ms portadoras se traduce
en una mayor redundancia lo que se traduce en mayor confiabilidad en el proceso de transmisin de
la informacin.
Para lograr el uso de todas las portadoras disponibles, se propone una nueva tcnica basada
en DBPSK, denominada DBPSK Adaptada. Al igual que la anterior, sta tcnica se basa en la
modulacin DBPSK, pero en lugar de trabajar con una sola portadora, utiliza todas las portadoras
disponibles. Bsicamente se dispone de un smbolo sintetizado conformado por todas las portadoras
disponibles a ste se le modifica su fase segn el bit que se transmita. Por lo cual, adems de las
ventajas de BFSK Adaptado, se le suma uso de todas las portadoras (que se traduce en mayor
redundancia y confiabilidad) y la necesidad de tener generado previamente un slo smbolo.
sta tcnica podra adaptarse a BPSK (que es mejor que DBPSK), pero como la primera
requiere de un recuperador de portadora, una tcnica BPSK Adaptada requerira de un recuperador
de todas las portadoras utilizadas lo cual incrementara el costo de implementacin.
84
FernandoArielBeunza79156
85
FernandoArielBeunza79156
87
Dispositivocliente(realovirtual)
Sesin
Transporte
Ncleodelsistema
Red
Enlace
Fsica
ModemPLC
El desarrollo del sistema debe respetar el modelo de capas sugerido por OSI y sus principales
componentes pueden verse distribuidos en la figura 3.1. A diferencia de LonWorks u OSEK/VDX,
todas las capas no se pueden implementar dentro de un nico microcontrolador, ya que se pretende
separar las funcionalidades del dispositivo cliente con las relacionadas con las comunicaciones PLC,
para no aumentar la complejidad del firmware del dispositivo cliente.
El dispositivo cliente es el dispositivo que obtiene informacin suministrada por el sistema,
hace uso de ella, emite alguna accin que puede ser fsica y/o una respuesta hacia el sistema. En este
dispositivo deben implementarse las capas de aplicacin y presentacin debido a que la primera
constituye una interfaz para la funcin especfica del dispositivo, que en caso particular de este
trabajo es una funcionalidad demostrativa del funcionamiento del sistema; y la segunda se relaciona
a la representacin de los datos que depende de la plataforma, por ejemplo se puede tener un
dispositivo que enve un nmero entero a otro y cada uno de stos tiene una forma diferente de
representarlos lo cual requiere de un proceso de adaptacin para la correcta interpretacin del dato
en cuestin.
88
FernandoArielBeunza79156
FernandoArielBeunza79156
89
90
FernandoArielBeunza79156
4. Solucin propuesta
La solucin que se propone en el presente trabajo se compone de siete capas conforme al
modelo planteado por OSI. sta idea se basa en la forma de implementacin de LonWorks, que
tambin implementa las siete capas, y define desde los aspectos fsicos (capa fsica) hasta la interfaz
con los dispositivos usuarios de ste (capa de aplicacin). Aqu se intenta integrar las diversas ideas
propuestas por los antecedentes estudiados e integrarlas conformando cada una de las capas.
Las siete capas no se implementan en un slo microcontrolador, ya que se pretende no
involucrar las funciones propias del dispositivo cliente con las funciones relacionadas con las
comunicaciones PLC. De ste modo se provee un sistema de comunicaciones lo ms independiente
posible de la utilidad que se le de a ste, ya que la separacin absoluta no es posible, debido a que
las dos ltimas capas (capas de presentacin y aplicacin) se encuentran muy vinculadas con la
plataforma que emplea la implementacin del dispositivo cliente. Las restantes capas se
implementan dentro del modem PLC, aunque ste se compone de dos microcontroladores: uno
destinado exclusivamente a la capa fsica, y el resto a las capas de enlace, red, transporte y sesin
FernandoArielBeunza79156
91
Para el caso del modem propuesto en el presente trabajo, a partir de las ideas anteriores, se
propone un mtodo basado en el acoplamiento capacitivo. La idea bsica de ste mtodo es
combinar la simpleza del mtodo de acoplamiento capacitivo con el esquema de filtrado, de forma
tal que el conjunto completo constituya un filtro pasa alto que solamente permita el paso de las
frecuencias de 4 MHz en adelante. Los conjuntos capacitor resistencia (ver figura 4.1) constituyen
un circuito de bloqueo de componente continua y un limitador de corriente, para limitar el consumo
de potencia del transmisor y del receptor. Los inductores cumplen la funcin de bloqueo de la seal
de informacin evitando que dicha seal no sea afectada por la baja impedancia de la batera y
dispositivos de carga considerable.
El filtro pasa alto conformado por los elementos pasivos de la figura 4.2, no se caracteriza
por su selectividad ni tampoco es su principal objetivo, slo se limita a bloquear las frecuencias que
ste debajo de la banda de HF no utilizadas para las comunicaciones PLC en automviles. Por sta
razn, el receptor necesariamente debe contener un filtro ms selectivo que se concentre en dejar
pasar solamente la banda de frecuencias de inters. sto ltimo permite utilizar solamente una
92
FernandoArielBeunza79156
En la figura 4.3, se puede observar los bloques bsicos que conforman el modem prototipo
desarrollado para el presente trabajo similar al modem DBPSK Adaptado descripto anteriormente.
Se conforma de un codificador diferencia integrado por el retardo de un bit y una operacin lgica
o-exclusiva en el transmisor encargada de generar los cambios de fase de las portadoras en funcin
de los datos a enviar. Las portadoras son sintetizadas por un bloque dedicado para tal fin que genera
un nico smbolo que multiplicado por la fase generada por la salida del codificador diferencial
conforman la seal con la informacin que viaja a travs del canal de comunicaciones hasta llegar al
receptor. En el receptor, la mencionada seal, es retardada un tiempo equivalente a la duracin
temporal de un smbolo. La seal recibida y la seal retardada son multiplicadas entre s para poder
FernandoArielBeunza79156
93
Los componentes bsicos del modem PLC prototipo (figura 4.4), se describen a
continuacin:
94
Filtro: consiste en un filtro que rechaza la banda de frecuencias utilizada para transmitir
la informacin. Suministra la seal de potencia utilizada para alimentacin libre de ruido.
FernandoArielBeunza79156
Receptor: recibe informacin por medio de la red alimentacin modulada con la tcnica
DBPSK Adaptada. La implementacin del receptor se describe ms adelante.
Interfaz RS232: brinda una interfaz con el dispositivo cliente del sistema.
95
96
FernandoArielBeunza79156
Figura 4.5. Diagrama de bloques del transmisor y receptor de un modem PLC prototipo.
97
N Seal Cod.
N Seal Cod.
N Seal Cod.
N Seal Cod.
09
17
-4
03
33
0A
49
04
65
0B
-3
04
18
-6
01
34
0C
50
07
66
0A
-6
01
19
-4
03
35
0B
51
08
67
07
-5
02
20
-2
05
36
0B
52
-2
05
68
-3
04
-2
05
21
-2
05
37
0B
53
-2
05
69
-2
05
07
22
-3
04
38
09
54
0A
70
09
07
23
07
39
-4
03
55
0E
71
0B
-1
06
24
0A
40
-6
01
56
0B
72
09
-1
06
25
09
41
-1
06
57
-2
05
73
-3
04
10
-1
06
26
-4
03
42
0D
58
-4
03
74
-3
04
11
07
27
-7
00
43
0D
59
07
75
09
12
08
28
-2
05
44
08
60
0C
76
0E
13
09
29
0C
45
-2
05
61
0D
77
0D
14
09
30
0B
46
-3
04
62
0B
78
0D
15
09
31
07
47
-3
04
63
0B
79
0D
16
07
32
-1
06
48
-4
03
64
0B
80
0D
Frecuencia
Portadora
Frecuencia
Portadora
Frecuencia
138,237 KHz
1105,895 KHz
15
2073,553 KHz
276,474 KHz
1244,132 KHz
16
2211,789 KHz
414,711 KHz
10
1382,368 KHz
17
2350,026 KHz
552,947 KHz
11
1520,605 KHz
18
2488,263 KHz
691,184 KHz
12
1658,842 KHz
19
2626,500 KHz
829,421 KHz
13
1797,079 KHz
967,658 KHz
14
1935,316 KHz
180
-180
-180 -180
180
-180
180
10
11
-135 -180
12
13
14
15
16
17
18
19
-180
45
135
135
180
98
FernandoArielBeunza79156
El microcontrolador AVR ATmega8515 permite emitir una muestra por ciclo de reloj si stas
se encuentran previamente cargadas en registros, ya que la carga a registro de la muestra consume
un ciclo de reloj y la emisin de la muestra requiere de otro ciclo de reloj. Debido a que no se
disponen de 80 registros para almacenar todas las muestras se sintetiza la seal de tal forma que se
repitan frecuentemente los valores de las muestras, lo que permite reducir 80 muestras a un nmero
manejable de 15. Adems las muestras son emitidas cuando su valor cambia, por ejemplo, si existen
dos o ms muestras consecutivas con el mismo valor, se emite slo una vez la muestra en cuestin
ya que el valor de sta queda retenido en el puerto de salida del microcontrolador hasta que sea
modificado nuevamente. sto ltimo permite que el microcontrolador pueda realizar otras tareas
hasta tanto no sea necesario modificar el valor de la muestras. Una de stas tareas es el cambio de
fase del smbolo segn la codificacin diferencial del bit de informacin a enviar.
La codificacin diferencial consiste en generar una nueva seal a partir de los cambios de
estado que sufre la seal con la informacin, y suponiendo que la duracin de cada estado es
constante, no es necesaria la introduccin de una seal de sincronismo para poder recuperar la
informacin. En cambio si es necesario un codificador en el transmisor y un decodificador en el
receptor que son simples de implementar ya que su lgica es la siguiente:
codificador:
c(t)=not(c(t1)xors(t))
decodificador: s(t)=not(c(t)xorc(t1))
Figura 4.8. Expresiones lgicas del codificador y decodificador diferencial.
99
100
FernandoArielBeunza79156
En las figuras 4.9 y 4.10 se muestran los diagramas de flujo correspondientes a los
algoritmos de envo y recepcin, respectivamente. En dichos diagramas se hace mencin al
operaciones principales que involucran cada uno de los algoritmos. Todas las operaciones
relacionadas a la emisin de muestras y recepcin de las mismas, se realizan en tiempo real, lo que
implican que no pueden ser interrumpidas por ningn otra operacin pendiente. Las operaciones que
no requieran ser realizadas en tiempo real se realizan antes o despus del bloque de operaciones que
requieren ser ejecutadas en tiempo real.
FernandoArielBeunza79156
101
Datos
Delimitador
de fin
128 bits
3200 bits
16 bits
16 bytes
400 bytes
2 bytes
Delimitador de inicio: secuencia de bits 128 bits utilizada para marcar el inicio de la
trama. La secuencia se compone de tres partes, una primera parte encargada de marcar la
ocupacin del canal de comunicacin (16 bits de valor uno, seguido de 1 bit de valor
cero, seguido de 23 bits de valor uno), una segunda parte utilizada por el receptor para
ajustar su umbral de deteccin (secuencia 01 repetida 32 veces), y por ltimo una
secuencia indicadora de comienzo del mensaje (secuencia de 16 bits con valor uno
seguida de la secuencia 11011011).
Delimitador de fin: secuencia de 16 bits de valor uno utilizada para marcar el fin de la
trama.
FernandoArielBeunza79156
void phy_init(void):
Inicializa los recursos que comprenden todo el proceso de comunicacin por medio de la
red de potencia. Inicializa el buffer de mensajes, inicializa la interrupcin de recepcin de
mensajes y pone en funcionamiento al circuito receptor.
void phy_release(void):
Libera los recursos que comprenden todo el proceso de comunicacin por medio de la red
de potencia inicializados por la primitiva anterior.
FernandoArielBeunza79156
103
104
int phy_poll(void):
Esta primitiva verifica si se ha capturado una trama. Devuelve como resultado uno si el
buffer contiene una trama capturada a la espera de ser leda mediante la primitiva
phy_getframe. Si no se ha capturado ninguna trama el resultado devuelto es cero. Con
esta primitiva se puede implementar una espera de la llegada de una trama, en
circunstancias en las cuales no sea conveniente utilizar la primitiva anterior.
int phy_rsdsignal(void):
Esta primitiva se similar a phy_sndframe, pero no es necesario especificar la trama a
enviar, ya que repite el ltimo envo realizado. sto permite implementar de forma ms
eficiente la repeticin de envos evitando la transferencia de la trama hacia el mdulo de
procesamiento de seales. Tambin puede utilizarse para reenviar una trama capturada
mediante la primitiva phy_capframe. En caso de haberse podido realizar el reenvo
devuelve como resultado un valor positivo distinto a cero.
int phy_clrbuffer(void):
Esta primitiva permite limpiar el contenido del buffer del mdulo de procesamiento de
seales. En caso de haberse podido realizar dicha operacin devuelve como resultado un
valor positivo distinto a cero.
int phy_gennoisesignal(void):
Esta primitiva permite generar una seal de ruido que ocupe el canal de comunicaciones.
Dicha seal de ruido se genera a partir de una secuencia pseudoaleatoria de bits
modulados en BPSK. La generacin de la seal de ruido puede ser interrumpida en
cualquier momento por la ejecucin de cualquier otra primitiva. En caso de haberse
podido dar comienzo a dicha operacin devuelve como resultado un valor positivo
distinto a cero.
int phy_tstsignal1(void):
Esta primitiva permite generar una seal de prueba. La seal es una onda senoidal de
138,237 KHz, utilizada solamente para realizar pruebas de hardware. La generacin de
dicha seal puede ser interrumpida por la ejecucin de cualquier otra operacin. En caso
de haberse podido dar inicio a la generacin de la seal de prueba devuelve como
resultado un valor positivo distinto a cero.
int phy_tstsignal2(void):
Esta primitiva permite generar una seal de prueba. La seal es una onda senoidal de
552,947 KHz, utilizada solamente para realizar pruebas de hardware. La generacin de
dicha seal puede ser interrumpida por la ejecucin de cualquier otra operacin. En caso
de haberse podido dar inicio a la generacin de la seal de prueba devuelve como
resultado un valor positivo distinto a cero.
int phy_tstreceive(void):
Esta primitiva permite verificar la recepcin de seales por parte del receptor. La prueba
de recepcin puede ser interrumpida por la ejecucin de cualquier otra operacin. En caso
de haberse podido dar inicio a la generacin de la seal de prueba devuelve como
resultado un valor positivo distinto a cero.
FernandoArielBeunza79156
105
106
FernandoArielBeunza79156
107
108
FernandoArielBeunza79156
4.2.1.3. Fragmentacin
La finalidad de implementar un esquema de fragmentacin a nivel de subcapa de control de
acceso al medio principalmente es la de hacer un uso ms eficiente de un medio en donde las tramas
enviadas con frecuencia son destruidas por cambios en el valor de algunos bits. Adems en este caso
particular, la fragmentacin se utiliza para extender la capacidad de envo de informacin con
respecto al lmite impuesto para la capa inferior.
Como ya se trat anteriormente, cuando se habl sobre el medio sobre el cual se est
trabajando, el medio es ruidoso lo que provoca, a pesar de la tcnicas de modulacin implementadas
a nivel de capa fsica, la ocurrencia de errores ocasionan la destruccin de la trama, lo que lleva a
reiteradas retransmisiones de la misma hasta que su recepcin sea correcta. Para el caso de tramas
de pocos bytes, la demora ocasionada por las sucesivas retransmisiones no resulta demasiada; lo que
no se puede decir en el caso de tratar de las tramas que ronden el tamao mximo, en el cual el
cambio de un slo valor de un bit puede destruir la trama completa de 3200 bits (tamao mximo
permitido por la capa inferior). Debido a que reiteradas transmisiones de una trama de tantos bits
puede insumir demasiado tiempo de espera, se hace necesaria la implementacin de un esquema de
fragmentacin para que toda la informacin que se enva, se haga en varias tramas, que en caso de
destruirse una de ellas, solamente sea necesaria la retransmisin de un parte de la informacin
original, demorando menos tiempo la recepcin completa del mensaje. El algoritmo de envo para
una trama corta corresponde al de la figura 4.12, mientras que para una trama larga se emplea una
variante del anterior en donde se enva previamente un pedido de envo de trama (con el tamao de
la trama a enviar), utilizando el algoritmo de la figura 4.12 y cuando se tiene la confirmacin de
recepcin, se comienzan a transmitir los sucesivos fragmentos sin esperas aleatorias de por medio.
Cada fragmento enviado debe esperar la confirmacin de recepcin para poder enviar el siguiente
fragmento. En el caso de no recibirse confirmacin, el tamao del fragmento se disminuye a la
mitad de tamao y se vuelve a intentar la transmisin del mismo, hasta alcanzar el tamao mnimo
permitido de mensaje, en cuyo caso se continua reenviando el mismo fragmento hasta agotar el
lmite de reenvos en cuyo caso el algoritmo termina devolviendo error de transmisin. En la figura
4.13 se muestra el diagrama de flujo correspondiente al algoritmo empleado para el envo de tramas
largas.
FernandoArielBeunza79156
109
La fragmentacin excesiva tambin puede ser perjudicial, ya que resulta en una mayor
demora debido a que la cantidad de informacin de control de cada fragmento puede ser
significativa en comparacin a la informacin que se pretende enviar. El esquema propuesto
siempre comienza intentando enviar la mayor cantidad posible de informacin en cada trama para
minimizar la cantidad de tramas. Igualmente se establece que los fragmentos no pueden tener menor
longitud que la que posee una trama corta. Para la solucin propuesta en ste trabajo, se considera
110
FernandoArielBeunza79156
Direccin
de destino
Direccin
de origen
Tipo de
paquete
Protocolo
Fragmento
Tamao
de
fragmento
Tamao
total
Datos
Cdigo
detector
de errores
8 bits
64 bits
64 bits
8 bits
8 bits
8 bits
16 bits
16 bits
2992 bits
16 bits
1 byte
8 bytes
8 bytes
1 byte
1 byte
1 byte
2 byte
2 byte
374 bytes
2 bytes
FernandoArielBeunza79156
111
Direccin de destino: direccin del modem PLC destinatario del paquete. Si la direccin
es FF:FF:FF:FF:FF:FF:FF:FF (64 bits con valor 1), por ser la direccin reservada para
broadcast, el paquete es para todos los modems PLC conectados a la red.
Direccin de origen: direccin del modem PLC que origin la trama. Esta direccin no
puede ser la de broadcast (FF:FF:FF:FF:FF:FF:FF:FF), por carecer de sentido.
Tipo de paquete: especifica el tipo de paquete que puede ser de control o de datos.
Tamao de fragmento: especifica el tamao del campo de datos, cuya capacidad mxima
es de 374 bytes.
Tamao total: especifica la cantidad total de bytes contenida en uno o mas fragmentos. La
cantidad mxima es de 1024 bytes.
Cdigo detector de errores: es un CRC de 16 bits calculado a partir de todos los bytes que
conforman la trama (excluyendo al cdigo detector de errores).
FernandoArielBeunza79156
FernandoArielBeunza79156
113
114
void mac_init(void):
Inicializa la capa fsica, el buffer de mensajes y la funcin de recepcin de mensajes.
void mac_release(void):
Libera los recursos inicializados por la primitiva anterior.
short int mac_send(mac_addr dest_addr, unsigned char prio, unsigned char prot, const
void *msg, short int msgsize):
Enva un paquete de informacin msg de longitud msgsize con prioridad prio asociado al
protocolo prot al dispositivo cuya direccin es dest_addr. Devuelve como resultado la
cantidad de bytes enviados, que coincide con msgsize si la operacin de envo pudo ser
realizada.
short int mac_receive(mac_addr addr, unsigned char *prot, void *msg, short int
msgsize):
Recibe msgsize bytes que se transfieren a msg, de un paquete asociado al protocolo prot
proveniente del dispositivo cuya direccin es addr. Cuando se recibe una trama desde la
capa fsica, se invoca la funcin dedicada a recepcin y procesamiento de tramas. Si
luego de interpretar dicha trama, sta corresponde a un paquete, ste se almacena en un
buffer. Esta primitiva transfiere msgsize bytes del contenido del buffer a msg y devuelve
la cantidad de bytes transferidos como resultado. Si el buffer se encuentra vaco, queda a
la espera de que llegu un paquete.
void mac_notify(void (*func)(mac_addr addr, unsigned char prot, void *msg, short int
msgsize)):
Esta primitiva brinda la posibilidad de definir una funcin func que se ejecute cuando se
recibe una trama. Dicha funcin debe tener definidos como parmetros addr, prot, msg y
msgsize, que cumplen la misma funcin que en la primitiva de anterior. El objetivo de
sta primitiva es poder procesar la informacin que transporta la trama de forma
inmediata a la recepcin de la misma, sin bloquear el microcontrolador, como ocurre con
la anterior primitiva.
int mac_poll(void):
Esta primitiva verifica el estado del buffer. Devuelve como resultado uno si el buffer
contiene un paquete a la espera de ser recibido mediante la primitiva mac_receive. Si el
buffer se encuentra vaco el resultado devuelto es cero. De sta forma puede
implementarse una espera no bloqueante utilizando la primitiva mac_receive.
int mac_status(void):
Esta primitiva verifica el estado del dispositivo. Devuelve como resultado uno si el
dispositivo se encuentra operativo. Si el dispositivo se encuentra inactivo debido a la
ocurrencia de fallas el resultado devuelto es cero.
115
116
FernandoArielBeunza79156
Cdigo detector
de errores
8176 bits
16 bits
1022 bytes
2 bytes
Cdigo detector de errores: es un cdigo CRC de 16 bits calculado a partir de todos los
bytes que conforman el paquete (excluyendo el cdigo detector de errores).
void llc_init(void):
Inicializa la subcapa de control de acceso al medio, los buffers de mensajes y las
funciones de recepcin de mensajes.
void llc_release(void):
Libera los recursos inicializados por la primitiva anterior.
FernandoArielBeunza79156
117
short int llc_send(int hd, llc_addr dest_addr, unsigned char prio, const void *msg, short
int msgsize):
Enva un paquete de informacin msg de longitud msgsize con prioridad prio al
dispositivo cuya direccin es dest_addr por medio de la conexin asociada al manejador
hd. Devuelve como resultado la cantidad de bytes enviados, que coincide con msgsize si
la operacin de envo pudo ser realizada.
short int llc_receive(int hd, llc_addr addr, void *msg, short int msgsize):
Recibe msgsize bytes que se transfieren a msg, de un paquete proveniente de la conexin
asociada al manejador hd. Cuando se recibe un paquete desde la subcapa de control de
acceso al medio, se invoca la funcin dedicada a recepcin y procesamiento de paquetes.
Si luego de interpretar dicho paquete, ste es vlido, se almacena en el buffer
correspondiente a la conexin. Esta primitiva transfiere msgsize bytes del contenido del
buffer a msg y devuelve la cantidad de bytes transferidos como resultado. Si el buffer se
encuentra vaco, queda a la espera de que llegue un paquete.
void llc_notify(int hd, void (*func)(llc_addr addr, void *msg, short int msgsize):
Esta primitiva brinda la posibilidad de definir una funcin func que se ejecute cuando se
recibe un paquete de la conexin asociada al manejador hd. Dicha funcin debe tener
definidos como parmetros addr, msg y msgsize, que cumplen la misma funcin que en la
primitiva anterior. El objetivo de sta primitiva es poder procesar la informacin que
transporta el paquete de forma inmediata a la recepcin de la misma, sin bloquear el
microcontrolador, como ocurre con la anterior primitiva.
int llc_status(void):
Esta primitiva verifica el estado del dispositivo. Devuelve como resultado un valor
positivo distinto a cero si el dispositivo se encuentra operativo. Si la interfaz fsica se
encuentra inactivo debido a la ocurrencia de fallas el resultado devuelto es cero.
FernandoArielBeunza79156
FernandoArielBeunza79156
119
8 bits
32 bits
1 byte
1 byte
4 byte
120
void arp_init(void):
FernandoArielBeunza79156
void arp_release(void):
Libera los recursos inicializados por la primitiva anterior.
FernandoArielBeunza79156
121
122
short int dl_send(int hd, llc_addr dest_addr, unsigned char prio, const void *msg, short
int msgsize ):
Enva un paquete de informacin msg de longitud msgsize con prioridad prio al
dispositivo cuya direccin es dest_addr por medio de la conexin asociada al manejador
hd. Devuelve como resultado la cantidad de bytes enviados, que coincide con msgsize si
la operacin de envo pudo ser realizada.
short int_t dl_receive(int hd, llc_addr addr, void *msg, short int msgsize):
Recibe msgsize bytes que se transfieren a msg, de un paquete proveniente de la conexin
asociada al manejador hd. Si el buffer se encuentra vaco, queda a la espera de que llegu
un paquete.
void dl_notify(int hd, void (*func)(llc_addr addr, void *msg, short int msgsize):
Esta primitiva brinda la posibilidad de definir una funcin func que se ejecute cuando se
recibe un paquete de la conexin asociada al manejador hd. Dicha funcin debe tener
definidos como parmetros addr, msg y msgsize, que cumplen la misma funcin que en la
primitiva de anterior. El objetivo de sta primitiva es poder procesar la informacin que
transporta el paquete de forma inmediata a la recepcin de la misma, sin bloquear el
microcontrolador, como ocurre con la anterior primitiva.
int dl_getphyaddress(unsigned char iface, unsigned char prot, logaddr laddr, llc_addr
paddr):
Devuelve la direccin fsica paddr de la interfaz fsica iface asociada a la direccin lgica
laddr correspondiente al protocolo de capa de red prot. En caso de xito devuelve como
resultado un valor positivo distinto a cero.
FernandoArielBeunza79156
123
124
FernandoArielBeunza79156
FernandoArielBeunza79156
125
Versin
Identificador
Protocolo Tamao
de mensaje
Datos
8 bits
8 bits
8 bits
16 bits
(capacidad mxima de
capa de enlace - 40) bits
1 byte
1 byte
1 byte
2 bytes
(capacidad mxima de
capa de enlace - 5) bytes
126
void net_init(void):
Inicializa la capa de red, las interfaces fsicas, el buffer de mensajes y la funcin de
recepcin de mensajes.
void net_release(void):
Libera los recursos inicializados por la primitiva anterior.
short int net_send(net_nodeid nodeid, net_msgid msgid, unsigned char prio, unsigned
char prot, const void *msg, short int msgsize):
Enva un mensaje msg de longitud msgsize, cuyo identificador es msgid, con prioridad de
envo prio, por medio de la red al nodo cuyo identificador es nodeid. Adems el mensaje
enviado corresponde a un protocolo de capa superior que puede ser especificado por
medio del parmetro prot. Si el identificador de nodo nodeid tiene valor cero, el mensaje
es enviado a todos los nodos de todas las redes a las que se tiene acceso. Devuelve como
resultado la cantidad de bytes enviados, que coincide con msgsize si la operacin de envo
pudo ser realizada.
short int net_receive(net_msgid *msgid, unsigned char *prot, void *msg, short int
msgsize):
FernandoArielBeunza79156
void net_notify(void (*func)(net_msgid msgid, unsigned char prot, void *msg, short int
msgsize)):
Esta primitiva brinda la posibilidad de definir una funcin func que se ejecute cuando se
recibe un mensaje a travs de la red. Dicha funcin debe tener definidos como parmetros
prot, msg y msgsize, que cumplen la misma funcin que en la primitiva de anterior. El
objetivo de sta primitiva es poder procesar la informacin que transporta el mensaje de
forma inmediata a la recepcin del mismo, sin bloquear el microcontrolador, como ocurre
con la anterior primitiva.
int net_poll(void):
Esta primitiva verifica el estado del buffer. Devuelve como resultado uno si el buffer
contiene un mensaje a la espera de ser recibido mediante la primitiva net_receive. Si el
buffer se encuentra vaco el resultado devuelto es cero. De sta forma puede
implementarse una espera no bloqueante utilizando la primitiva net_receive.
int net_status(void):
Esta primitiva verifica si el nodo posee alguna interfaz fsica activa por la cual pueda
comunicarse con otros nodos. Devuelve como resultado un valor positivo distinto a cero
FernandoArielBeunza79156
127
128
FernandoArielBeunza79156
La propuesta de este trabajo es tomar las ideas de CAN y J1850, e implementar un esquema
de difusin. Dicho esquema responde al modelo de comunicaciones orientado a grupos. En este
modelo los dispositivos conforman grupos de difusin, volviendo al ejemplo anterior, se podra
definir un grupo referente al sistema de iluminacin exterior y los participantes o miembros seran el
mando de accionamiento y los faros exteriores. El mensaje con la orden de encendido o apagado de
los faros es nico con garanta de que la orden le llegue a todos los destinatarios o caso contrario a
ninguno. Esto ltimo es lo que se conoce como difusin confiable (o reliable multicast). LonWorks
tambin implementa un esquema de difusin con confirmacin, pero a diferencia de CAN y J1850,
la confirmacin de recepcin est dada por el primer destinatario que confirme la recepcin, lo cual
no permite garantizar que todos los dispositivos recibieron el mensaje. El modelo de comunicacin
orientado a grupos involucra varios temas adems de la difusin confiable, como la gestin de los
miembros de grupo y ordenamiento de los mensajes.
FernandoArielBeunza79156
129
4.4.3. Mensajes
La capa de transporte presenta dos tipos de mensajes: en secuencia y fuera de secuencia. Los
primeros se tratan de mensajes enviados con baja prioridad, que obligatoriamente deben ser
recibidos por todos los dispositivos miembros de un grupo de difusin, cumpliendo de esta forma
con las condiciones exigidas por un esquema de comunicacin de difusin confiable. Este tipo de
mensaje sacrifica velocidad por confiabilidad de recepcin, y pueden ser utilizados, por ejemplo,
para enviar informacin de configuracin de dispositivos. El otro tipo de mensajes son los que se
enva fuera de secuencia, en donde la capa de transporte hace su mejor esfuerzo para cumplir las
exigencias de una comunicacin por difusin confiable, pero no brinda garanta. Este tipo de
mensaje se enva con alta prioridad a diferencia de los del primer tipo, y su aplicacin est destinada
para enviar rdenes a dispositivos, en donde es ms importante recibir el mensaje en el tiempo
correspondiente, o en su defecto no recibirlo; que recibirlo fuera de tiempo.
Ambos tipos de mensaje emplean una nica estructura de mensaje como la descripta en la
figura 4.22.
130
FernandoArielBeunza79156
Versin Secuencia
Datos
8 bits
8 bits
1 byte
1 byte
void tp_init(void):
Inicializa la capa de transporte, los buffers de mensajes y la funcin de recepcin de
mensajes. Tambin establece el identificador de dispositivo dev.
void tp_release(void):
Libera los recursos inicializados por la primitiva anterior.
short int tp_send(tp_grpid grpid, unsigned char nosec, const void *msg, short int
msgsize):
Enva un mensaje msg de longitud msgsize por el grupo de difusin grpid. Por medio de
la activacin del indicador nosec, el mensaje puede excluirse de la secuencia de mensajes
enviados, lo que significa que ante una eventual resincronizacin del modem PLC, el
mensaje no ser recuperado. Devuelve como resultado la cantidad de bytes enviados, que
coincide con msgsize si la operacin de envo pudo ser realizada.
FernandoArielBeunza79156
131
int tp_poll(void):
Esta primitiva verifica el estado del buffer de la capa de transporte. Devuelve como
resultado uno si el buffer contiene un mensaje a la espera de ser recibido mediante la
primitiva tp_receive. Si el buffer se encuentra vaco el resultado devuelto es cero. De sta
forma puede implementarse una espera no bloqueante utilizando la primitiva tp_receive.
int tp_status(void):
Esta primitiva verifica si la conexin se encuentra activa o no. Devuelve como resultado
un valor positivo distinto a cero si el nodo se encuentra operativo. Si no hay ninguna
interfaz fsica activa el resultado devuelto es cero.
132
FernandoArielBeunza79156
FernandoArielBeunza79156
133
FernandoArielBeunza79156
135
Datos
8 bits
(capacidad mxima de
capa de transporte - 8) bits
1 byte
(capacidad mxima de
capa de transporte - 1) bytes
136
void sp_init(void):
Inicializa la capa de sesin, los buffers de mensajes y la funcin de recepcin de
mensajes.
void sp_release(void):
Libera los recursos inicializados por la primitiva anterior.
short int sp_send(sp_grpid grpid, unsigned char nosec, const void *msg, short int
msgsize):
FernandoArielBeunza79156
int sp_poll(void):
Esta primitiva verifica el estado del buffer de mensajes. Devuelve como resultado uno si
el buffer contiene un mensaje a la espera de ser recibido mediante la primitiva sp_receive.
Si el buffer se encuentra vaco el resultado devuelto es cero. De sta forma puede
implementarse una espera no bloqueante utilizando la primitiva sp_receive.
int sp_status(void):
Esta primitiva verifica si la conexin se encuentra activa o no. Una conexin queda
inactiva cuando la capa de sesin no pudo resincronizar el dispositivo. Devuelve como
resultado un valor positivo distinto a cero si el nodo se encuentra operativo. Si no hay
ninguna interfaz fsica activa el resultado devuelto es cero.
FernandoArielBeunza79156
137
FernandoArielBeunza79156
Enteros de 8 bits: representa un valor entero cuyo rango de valores posibles se encuentra
comprendido entre -128 y 127 (en caso de ser enteros con signo) o entre 0 y 255 (en caso
de tratarse de enteros sin signo).
Enteros de 16 bits: representa un valor entero cuyo rango de valores posibles se encuentra
comprendido entre -32768 y 32767 (en caso de ser enteros con signo) o entre 0 y 65535
(en caso de tratarse de enteros sin signo).
Enteros de 32 bits: representa un valor entero cuyo rango de valores posibles se encuentra
comprendido entre -2147483648 y 2147483647 (en caso de ser enteros con signo) o entre
0 y 4294697296 (en caso de tratarse de enteros sin signo).
Los tipos de datos compuestos pueden ser arreglos, o estructuras que contengan tipos de
datos atmicos o arreglos. Con cada uno los tipos de datos atmicos se pueden conformar arreglos
de datos, para constituir, por ejemplo, una lista de valores enteros o de punto flotante. Con un
arreglo del tipo caracter se puede construir una cadena de caracteres de suma para el envo mensajes
con texto. A su vez se puede crear una estructura de datos compuesta por arreglos de tipos de datos
atmicos. Una estructura adems de poder contener arreglos puede contener tipos de datos atmicos
individuales.
La implementacin de la capa de presentacin define el concepto de mensaje como un
conjunto de campos de datos. A cada uno de stos campos se le puede especificar un tipo asociado
al tipo de dato que se desea almacenar en el mismo. Adems se puede establecer la cantidad de
datos almacenados, permitiendo la conformacin de arreglos de un determinado tipo de dato. De
esta forma, un mensaje conforma una estructura de datos.
FernandoArielBeunza79156
139
Enteros de 16 bits: se representa por medio de dos bytes con la disposicin big endian.
Enteros de 32 bits: se representa por medio de cuatro bytes con la disposicin big endian.
140
FernandoArielBeunza79156
Datos
8 bits
8 bits
1 byte
1 byte
Datos: rea donde se almacenan el o los datos. La capacidad sta limitada por la
capacidad mxima de transporte del mensaje.
FernandoArielBeunza79156
141
142
FernandoArielBeunza79156
FernandoArielBeunza79156
143
FernandoArielBeunza79156
FernandoArielBeunza79156
145
146
FernandoArielBeunza79156
FernandoArielBeunza79156
147
148
modplcapcpp::modplcapcpp(int sid):
Inicializa la capa de aplicacin, la conexin con el modem PLC a travs de la interfaz de
comunicacin serie sid. La interfaz de comunicacin serie se especifica por medio de un
nmero identificatorio que en caso de la plataforma Windows dicho nmero corresponde
al puerto COM (el valor 1 equivale a COM1, el valor 2 equivale a COM2, etc.), y en caso
de la plataforma Linux el nmero de puerto corresponde a la interfaz /dev/ttyS (el valor 1
equivale a /dev/ttyS0, el valor 2 equivale a /dev/ttyS1, etc.). Si la operacin se realiz
correctamente devuelve un nuevo objeto conexin.
modplcapcpp::~ modplcapcpp():
Libera los recursos de la capa de aplicacin asociados al objeto conexin.
int modplcapcpp::poll(void):
FernandoArielBeunza79156
int modplcapcpp::status(void):
Esta primitiva verifica si la conexin con modem PLC se encuentra activa o no. Devuelve
como resultado un valor positivo distinto a cero si el nodo se encuentra activo, caso
contrario devuelve como resultado cero.
De la misma forma que se detallaron los mtodos de la anterior clase, a continuacin se describen
los mtodos que conforman a la clase que maneja los mensajes:
modplcapcpp_msg::modplcapcpp_msg(modplcapcpp_msg *msg):
Crea una copia del mensaje msg. Si esta operacin se realiz correctamente, un nuevo
objeto mensaje que es una copia del mensaje msg.
modplcapcpp_msg::modplcapcpp_msg(modplcapcpp *hd):
Recibe un mensaje por medio de la conexin hd. Si no existe ningn mensaje pendiente
de ser recibido, queda a la espera de la llegada de uno. Si esta operacin se realiz
correctamente, devuelve como resultado un objeto mensaje con la informacin recibida.
modplcapcpp_msg::~modplcapcpp_msg():
Destruye el mensaje liberando todos los recursos utilizados por ste.
int modplcapcpp_msg::sendmsg(void):
Enva un mensaje. Si esta operacin se realiz correctamente, devuelve como resultado el
valor uno, sino devuelve cero.
modplcapcpp_grpid modplcapcpp_msg::getgrpid(void):
FernandoArielBeunza79156
149
modplcapcpp_msgid modplcapcpp_msg::getmsgid(void):
Extrae del mensaje, el identificador del mismo. Si esta operacin se realiz
correctamente, devuelve como resultado el valor uno, sino devuelve cero.
150
FernandoArielBeunza79156
FernandoArielBeunza79156
151
Situacin 5: Seal transmitida por medio de la lnea de potencia. En este caso se utiliza la
seal smbolo utilizada para transmitir informacin.
El comportamiento del mdulo analgico frente a las situaciones planteadas con anterioridad se
puede observar en los grficos que se encuentran a continuacin (en el mismo orden en el que se
enumeraron cada una de las situaciones).
152
FernandoArielBeunza79156
FernandoArielBeunza79156
153
154
FernandoArielBeunza79156
FernandoArielBeunza79156
155
156
FernandoArielBeunza79156
FernandoArielBeunza79156
157
158
FernandoArielBeunza79156
FernandoArielBeunza79156
159
160
FernandoArielBeunza79156
Comparando las figuras anteriores, se puede observar el filtrado a alta frecuencia, ya que como se
puede ver la seal de prueba presenta imperfecciones correspondientes a componentes de alta
frecuencia, que no se observan en la seal de respuesta. Tambin se puede observar un atenuacin
en la seal de respuesta en comparacin a la seal de prueba. Ambas seales deberan ser seales
senoidales perfectas, pero en el caso de la seal de prueba no es as debido al mtodo que se utiliza
para generarla produce ruido de alta frecuencia, y en el caso de la seal de respuesta se debe al
sistema de modulacin VSB que agrega distorsin a baja frecuencia.
Similar prueba realizada con la seal de prueba de 138,237 KHz se realiza con la seal de
552,947 KHz, cuyos resultados se reflejan en las figuras 5.3 y 5.4.
FernandoArielBeunza79156
161
A diferencia de la prueba anterior, aqu se puede observa menor distorsin, y que prcticamente no
existe atenuacin, ya que la frecuencia de la seal de prueba utilizada se encuentra fuera de la regin
crtica.
A continuacin se realizan las mismas pruebas anteriores, pero intercambiando las
funcionalidades de los modems (el que anteriormente transmita ahora recibe, y el que reciba ahora
transmite). Los resultados de la prueba con una seal de 138,237 KHz se pueden observar en las
figuras 5.5 y 5.6:
El resultado obtenido es similar al de la prueba anterior, lo que indica que ambos transmisores y
receptores, se comportan de similar forma. Tambin se repite la prueba con la seal de 552,947
KHz, cuyo resultado se puede ver en las figuras 5.7 y 5.8.
162
FernandoArielBeunza79156
En este caso tambin el resultado es similar a la prueba anterior, por lo cual se puede concluir que
ambos mdulos analgicos presentan respuesta en frecuencia similar, a pesar de las diferencias que
puede contener cada uno de ellos debido a que los componentes no son idnticos.
A partir de sta ltima conclusin, se puede elegir uno de los modems y observar la seal
que genera ste cuando transmite informacin (en este caso se utiliza una secuencia pseudoaleatoria
de bits como trama de prueba). En las figuras 5.9 y 5.10 se pueden observar la seal generada por el
modem a la entrada del mdulo analgico y la seal recibida a la salida del mismo mdulo,
respectivamente.
En la figura 5.9 se puede distinguir claramente el espectro conformado por todas las portadoras
constituyentes del smbolo utilizado para transmitir la informacin cuyo ancho de banda es de
2,7648 MHz. En cambio, en la figura 5.10, producto del ruido y la atenuacin de la lnea de
potencia, no se distingue tan claramente la seal recibida, como en el caso de la figura anterior. sto
ltimo tambin se puede observar en las siguientes figuras, donde se muestra el espectro de la seal
observado en la lnea de potencia.
FernandoArielBeunza79156
163
En la figura 5.11 se puede apreciar la misma seal de la figura 5.9 desplazada en frecuencia por el
modulador del mdulo analgico. Lo observado corresponde a la seal presente a la entrada de
alimentacin del modem PLC. La figura 5.12 corresponde a la misma seal, pero presente a una
distancia de 1,5 metros del modem. Como era de esperar, sta ltima seal se observa ms atenuada
que la primera y con una presencia de mayor nivel de ruido; pero en ambas figuras se puede
distinguir que el espectro de la seal corresponde al de una modulacin VSB-SC, donde la banda
vestigio se encuentra por encima de los 16 MHz, con un ancho de banda levemente mayor a 2,5
MHz.
Comparando las mediciones con las simulaciones, se puede observar que el comportamiento
de la implementacin real del mdulo analgico era el esperado, sin tener en cuenta el ruido y la
atenuacin que no se encontraron presentes en las simulaciones.
164
FernandoArielBeunza79156
FernandoArielBeunza79156
165
166
FernandoArielBeunza79156
FernandoArielBeunza79156
167
En las figuras 5.13 y 5.14, se pueden distinguir tambin los valores de los bits que conforman la
trama.
Los niveles de tensin bajos corresponden a bits de valor uno y los niveles de tensin altos
corresponden a bits de valor cero. Se puede observan en ambas figuras que la trama comienza en un
nivel alto correspondiente a la presencia de seal de informacin, seguido a un espacio
correspondiente a una serie de bits de valor uno, luego se ve un nuevo pico utilizado para marcar el
comienzo de una trama, seguido de un espacio previo a una secuencia de bits cero y uno, utilizada
para ajuste del umbral de deteccin, seguido de un espacio, un delimitador y finalmente la
informacin que corresponde a un byte de valor 01. Por ltimo un espacio y un pico que indica la
ausencia de seal de informacin.
En ambas figuras se puede observar que ambos mdulos de procesamiento de seales se
comportan de forma similar transmitiendo y recibiendo tramas de bits, a pesar de que los
componentes que constituyen cada uno de los mdulos no son idnticos (como ocurre con el
mdulo analgico).
FernandoArielBeunza79156
FernandoArielBeunza79156
169
D2 = 1,5 metros
D2 = 10 metros
D2 = 20 metros
D2 = 30 metros
AB
BA
AB
BA
AB
BA
AB
BA
Bits
enviados
417456
386024
402016
419864
399144
426624
388544
395672
Bits
perdidos
35440
40352
40592
47448
102840
135536
94048
53480
% Bits
perdidos
8,490%
10,453%
10,097%
11,301%
25,765%
31,769%
24,205%
13,519%
Bits
errneos
2639
3163
2048
1520
5010
5719
4655
3097
% Bits
errneos
0,632%
0,819%
0,509%
0,362%
1,255%
1,341%
1,198%
0,783%
Tramas
enviados
250
250
250
250
250
250
250
250
Tramas
perdidas
23
25
27
29
66
80
66
37
9,200%
10,000%
10,800%
11,600%
26,400%
32,000%
26,400%
14,800%
122
40
65
59
62
61
121
91
48,000%
16,000%
26,000%
23,600%
24,800%
24,400%
48,400%
36,400%
% Tramas
perdidas
Tramas
errneas
% Tramas
errneas
Tabla 5.1. Tasa de prdida y error segn el largo del cable utilizado para la configuracin propuesta en la
figura 5.15.
Se puede concluir que el comportamiento de los modems va empeorando a medida que se aumenta
la longitud del cable registrando un pico cuando se trabaja con una de longitud de 20 metros. Desde
el punto de vista del sentido de la transmisin de las tramas, existen diferencias atribuibles a que los
modems no son idnticos y dichas diferencias aumentan a medida que aumenta la longitud del
cable. En la tabla 5.2, se muestra el comportamiento promedio para cada una de las longitudes de
prueba:
D2 = 1,5 metros D2 = 10 metros D2 = 20 metros D2 = 30 metros
% Bits perdidos
9,472%
10,699%
28,767%
18,862%
% Bits errneos
0,726%
0,436%
1,298%
0,991%
% Tramas perdidas
9,600%
11,200%
29,200%
20,600%
% Tramas errneas
32,000%
24,800%
24,600%
42,400%
Tabla 5.2. Tasa promedio de prdida y error segn el largo del cable utilizado para la configuracin
para la configuracin propuesta en la figura 5.15.
El comportamiento promedio marca de igual modo que la tabla 5.1 que el desempeo de los
modems empeora con el aumento de la longitud del cable registrando un pico en 20 metros.
A continuacin se evala el comportamiento segn el tipo de cable, fijando una longitud D2
en 5 metros. Para la prueba se utiliza cable comn y cable coaxil, ste ltimo mucho ms inmune a
ruido que el primero, para ver cuanta influencia tiene el ruido en el empeoramiento anteriormente
visto.
170
FernandoArielBeunza79156
Cable comn
Cable coaxil
AB
BA
AB
BA
Bits
enviados
418552
402536
393904
397848
Bits
perdidos
77744
79136
38488
48664
% Bits
perdidos
18,575%
19,659%
9,771%
12,232%
Bits
errneos
3356
1051
4239
1549
% Bits
errneos
0,802%
0,261%
1,076%
0,389%
Tramas
enviados
250
250
250
250
Tramas
perdidas
44
49
22
32
17,600%
19,600%
8,800%
12,800%
68
53
72
61
27,200%
21,200%
28,800%
24,400%
% Tramas
perdidas
Tramas
errneas
% Tramas
errneas
Tabla 5.3. Tasa de prdida y error segn el tipo de cable utilizado para la configuracin propuesta en la
figura 5.15.
En la tabla anterior se puede observar que el ruido inducido en la lnea es un factor importante ya
que el desempeo de los modems mejora notablemente cuando el tramo de cable utilizado es coaxil.
Tambin se pueden ver diferencias segn el sentido de la transmisin, que no son demasiadas
debido a que la longitud no es muy grande, y sto responde a la expuesto anteriormente a que los
modems no son idnticos. De similar forma que se realiz en las anteriores pruebas, se obtiene el
comportamiento promedio, como se puede observar en la tabla 5.4:
Cable comn Cable coaxil
% Bits perdidos
19,117%
11,002%
% Bits errneos
0,532%
0,733%
% Tramas perdidas
18,600%
10,800%
% Tramas errneas
24,200%
26,600%
Tabla 5.4. Tasa promedio de prdida y error segn el tipo de cable utilizado para la configuracin
propuesta en la figura 5.15.
Aqu tambin de forma mucho ms clara puede observarse la mejora que existe al utilizar cable
coaxil, destacando como factor importante el ruido inducido en la lnea de potencia.
A continuacin se presenta una segunda configuracin de red, que se puede observar en la
figura 5.16, similar a la utilizada anteriormente, pero cambiando la disposicin de los modems.
FernandoArielBeunza79156
171
Con sta configuracin, se realizaron envos de tramas en ambos sentidos, variando la longitud de
cable, y utilizando tipo de cable comn. Los resultados pueden observarse en la tabla 5.5 que se
detalla a continuacin:
D2 = 1,5 metros
D2 = 10 metros
D2 = 20 metros
D2 = 30 metros
AB
BA
AB
BA
AB
BA
AB
BA
Bits
enviados
401344
405976
383784
416048
367512
407312
397952
397096
Bits
perdidos
45408
32160
59848
50712
115408
118640
51960
101360
% Bits
perdidos
11,314%
7,922%
15,594%
12,189%
31,403%
29,128%
13,057%
25,525%
Bits
errneos
5183
4422
2083
2609
4057
6509
3151
3627
% Bits
errneos
1,291%
1,089%
0,543%
0,627%
1,104%
1,598%
0,792%
0,913%
Tramas
enviados
250
250
250
250
250
250
250
250
Tramas
perdidas
25
22
38
29
85
77
29
75
10,000%
8,800%
15,200%
11,600%
34,000%
30,000%
11,600%
30,000%
108
34
68
57
73
46
99
120
43,200%
13,600%
27,200%
22,800%
29,200%
18,400%
39,600%
48,000%
% Tramas
perdidas
Tramas
errneas
% Tramas
errneas
Tabla 5.5. Tasa de prdida y error segn el largo del cable utilizado para la configuracin propuesta en la
figura 5.16.
172
FernandoArielBeunza79156
9,618%
13,892%
30,266%
19,291%
% Bits errneos
1,190%
0,585%
1,351%
0,853%
% Tramas perdidas
9,400%
13,400%
32,000%
20,800%
% Tramas errneas
28,400%
25,000%
23,800%
43,800%
Tabla 5.6. Tasa promedio de prdida y error segn el largo del cable utilizado para la configuracin
propuesta en la figura 5.16.
El comportamiento promedio marca de igual modo que en la tabla 5.5 que el desempeo de los
modems empeora con el aumento de la longitud del cable registrando un pico en 20 metros.
A continuacin se evala el comportamiento segn el tipo de cable, fijando una longitud D2
en 5 metros. Para la prueba se utiliza cable comn y cable coaxil, para analizar la influencia del
ruido inducido en la lnea de potencia.
Cable comn
Cable coaxil
AB
BA
AB
BA
Bits
enviados
370368
407448
402912
397384
Bits
perdidos
53856
69592
43848
37704
% Bits
perdidos
14,541%
17,080%
10,883%
9,488%
Bits
errneos
1326
1405
4241
1546
% Bits
errneos
0,358%
0,345%
1,503%
0,389%
Tramas
enviados
250
250
250
250
Tramas
perdidas
40
42
30
24
16,000%
16,800%
12,000%
9,600%
65
56
71
76
26,000%
22,400%
28,400%
30,400%
% Tramas
perdidas
Tramas
errneas
% Tramas
errneas
Tabla 5.7. Tasa de prdida y error segn el tipo de cable utilizado para la configuracin propuesta en la
figura 5.16.
FernandoArielBeunza79156
173
15,811%
10,186%
% Bits errneos
0,352%
0,721%
% Tramas perdidas
16,400%
10,800%
% Tramas errneas
24,200%
29,400%
Tabla 5.8. Tasa promedio de prdida y error segn el tipo de cable utilizado para la configuracin
propuesta en la figura 5.16.
35,000%
1,600%
30,000%
1,400%
25,000%
1,200%
20,000%
Bits errneos
Bits perdidos
Aqu, de forma mucho ms clara, puede observarse la mejora que existe al utilizar cable coaxil,
destacando tambin como factor importante el ruido inducido en la lnea de potencia.
Luego de realizadas todas las pruebas para las dos configuraciones propuestas, se pueden
comparar los resultados obtenidos y determinar el comportamiento general de los modems
evaluados. Para determinar el comportamiento se tiene en cuenta el porcentaje de bits perdidos (por
prdida de tramas), de bits errneos, de tramas perdidas y de tramas errneas (que deben ser
descartas por presentar algn bit errado). En las figuras 5.17 y 5.18, se muestran las tasas promedio
de perdida de bits y de bits errneos en funcin de la longitud de cable utilizado.
15,000%
10,000%
5,000%
1,000%
0,800%
0,600%
0,400%
0,200%
0,000%
0,000%
0
10
15
Metros
AB
BA
20
25
30
35
10
15
20
25
30
35
Metros
AB
BA
Figura 5.17. Tasa promedio de bits perdidos segn Figura 5.18. Tasa promedio de bits errneos segn
longitud del cable y disposicin de los modems
longitud del cable y disposicin de los modems PLC.
PLC.
Se puede observar en la figura 5.17 que la tasa de prdida de bits se incrementa con la longitud de
cable con la particularidad de haber un pico en 20 metros. En la figura 5.18 se puede ver un tambin
un pico en 1,5 metros, debido a que el ruido inducido no provoca demasiada prdida de tramas
(como se observa en la figura 5.17), pero si altera el valor de los bits recibidos, lo que se traduce en
el aumento de la tasa de bits errneos. Luego la curva del grfico de la figura 5.18 coincide con la
tendencia mostrada en el grfico de la figura 5.17.
174
FernandoArielBeunza79156
35,000%
50,000%
45,000%
40,000%
25,000%
Tramas errneas
Tramas perdidas
30,000%
20,000%
15,000%
10,000%
5,000%
35,000%
30,000%
25,000%
20,000%
15,000%
10,000%
5,000%
0,000%
0,000%
0
10
15
20
25
30
35
Metros
AB
BA
10
15
20
25
30
35
Metros
AB
BA
El grfico de la figura 5.19 es similar al de la figura 5.17 que trata sobre la tasa de bits perdidos.
sto se debe a que cuando se pierde una trama, se pierden todos los bits de ella, por lo cual es de
esperar un comportamiento similar reflejado en los grficos. En cambio, en el grfico de la figura
5.20, se puede observar que la tasa de prdida de tramas se mantiene por debajo del 35% hasta los
20 metros de longitud del cable y luego aumenta. ste comportamiento se debe a varios motivos:
primero, con longitudes bajas (menos de 10 metros), el comportamiento es relativamente bueno;
segundo, superando los 10 metros hasta los 20 metros, es donde hay mucha prdida de tramas por lo
cual no se puede determinar si presentaban algn error (la trama perdida no se cuenta como
errnea); y tercero, con ms de 20 metros es de esperar la prdida de tramas por la longitud por
ruido inducido en la lnea de potencia que corrompe los bits de la tramas. Si se sumaran las tasas de
tramas prdidas con las errneas, que corresponde al ambiente sobre el cual trabaja la capa de
enlace (esta capa no tiene en cuenta si la trama se perdi o es errnea, en ambos casos pide
retransmisin de la misma), en el mejor escenario, la tasa de prdida es superior al 30%.
Una vez comparados los resultados obtenidos en funcin de la longitud del cable, se puede
realizar el mismo anlisis comparativo modificando el tipo de cable utilizado. En este caso, se
toman los mismos parmetros utilizados en la comparacin anterior (porcentaje de bits perdidos, de
bits errneos, de tramas perdidas y tramas errneas). En las figuras 5.21 y 5.22, se muestran las
tasas promedio de perdida de bits y de bits errneos en funcin del tipo de cable utilizado.
FernandoArielBeunza79156
175
0,800%
25,000%
0,700%
0,600%
Bits errneos
Bits perdidos
20,000%
15,000%
10,000%
5,000%
0,500%
0,400%
0,300%
0,200%
0,100%
0,000%
0,000%
cable comn
cable comn
cable coaxil
AB
cable coaxil
Tipo de cable
Tipo de cable
AB
BA
BA
Observando los grficos anteriores se puede concluir que las diferencias entre los resultados
obtenidos en las dos configuraciones de prueba utilizadas son mayores cuando se utiliza cable
comn, dado que las pruebas son ms propensas a ser influidas por el ruido inducido en el cable
utilizado. En el caso particular de la tasa de bits perdidos, se puede decir que el cable coaxil
disminuye la prdida de bits; pero si se observa la tasa de bits errados, la cantidad de bits errneos
es mayor comparada a la obtenida con cable comn. sto se debe a que los bits perdidos no son
considerados como errneos, y que al haber menos prdida aumenta la probabilidad de error. Se
puede concluir que el ruido inducido sobre la lnea de potencia afecta ms al proceso de deteccin
de la trama, que a la informacin contenida en ella.
A continuacin se realiza un anlisis similar al anterior, pero trabajando con tramas y no con
bits. Los resultados analizados se puede observar en las figuras 5.23 y 5.24.
20,000%
35,000%
30,000%
16,000%
Tramas errneas
Tramas perdidas
18,000%
14,000%
12,000%
10,000%
8,000%
6,000%
4,000%
20,000%
15,000%
10,000%
5,000%
2,000%
0,000%
0,000%
cable comn
cable coaxil
Tipo de cable
AB
BA
176
25,000%
cable comn
cable coaxil
Tipo de cable
AB
BA
FernandoArielBeunza79156
9,545%
12,295%
29,516%
19,077%
% Bits errneos
0,958%
0,510%
1,325%
0,922%
% Tramas perdidas
9,500%
12,300%
30,600%
20,700%
% Tramas errneas
30,200%
24,900%
24,200%
43,100%
Tabla 5.9. Tasa promedio de prdida y error segn el largo del cable.
35,000%
1,400%
30,000%
1,200%
25,000%
1,000%
Bits errneos
Bits perdidos
En general se puede decir que ms all de donde se ubiquen los modems el comportamiento
empeora a medida que la longitud del cable entre ellos aumenta, existiendo un pico en el caso de los
20 metros. Los mismos valores pueden verse de otra forma por medio de las figuras 5.25, 5.26, 5.27
y 5.28.
20,000%
15,000%
0,800%
0,600%
10,000%
0,400%
5,000%
0,200%
0,000%
0,000%
0
10
15
20
25
30
35
Metros
FernandoArielBeunza79156
10
15
20
25
30
35
Metros
177
35,000%
50,000%
45,000%
Tramas erroneas
Tramas perdidas
30,000%
25,000%
20,000%
15,000%
40,000%
35,000%
30,000%
25,000%
20,000%
15,000%
10,000%
10,000%
5,000%
5,000%
0,000%
0,000%
0
10
15
20
25
30
35
10
15
20
25
30
35
Metros
Metros
Como en los anlisis comparativos anteriores su pudo observar que las tasas promedio eran
similares independientemente de la configuracin de prueba utilizada, los grficos que se pueden
observar aqu reflejan la misma idea, en donde el desempeo desmejora con el aumento de la
longitud de cable, con un pico de peor desempeo en 20 metros, y se tienen en cuenta las tramas
perdidas y las errneas, se observa que la prdida de tramas por alguno de los dos motivos es
superior al 40%.
Cable comn Cable coaxil
% Bits perdidos
17,464%
10,594%
% Bits errneos
0,442%
0,727%
% Tramas perdidas
17,500%
10,800%
% Tramas errneas
24,200%
28,000%
178
FernandoArielBeunza79156
179
FernandoArielBeunza79156
FernandoArielBeunza79156
181
182
FernandoArielBeunza79156
FernandoArielBeunza79156
183
184
FernandoArielBeunza79156
185
186
FernandoArielBeunza79156
FernandoArielBeunza79156
187
188
FernandoArielBeunza79156
6. Conclusiones
En ste ltimo captulo del presente trabajo se describen las conclusiones que se pueden
extraer a partir del anlisis de los resultados obtenidos de la evaluacin de la solucin propuesta
realizada en el captulo anterior. A partir de los logros obtenidos y de los aspectos mejorables de la
propuesta presentada, se pueden definir futuras lneas de investigacin para trabajos futuros que
quieran contribuir con el desarrollo de las comunicaciones PLC para automviles.
189
FernandoArielBeunza79156
FernandoArielBeunza79156
191
192
FernandoArielBeunza79156
7. Referencias
[Alcar07]
[AlleyAtwood68]
[AmraniRubin]
Amrani O., Rubin A.: A new multiple access scheme for DC power
line communications
http://www.yamar.com/articles/A-new-multiple-access-scheme-forpowerline.pdf
[AT89S52]
[AT89CMemOrg]
[AT89mega8515]
[BenziFacchinettiCaprini08] Benzi F., Facchinetti T., Caprini D.: Powerline Protocols Review,
evaluation and test for automotive applications, 2008
www.etec.polimi.it/emc-chapit/download/slides_Pavia_4_nov_2008.pdf
[Bosch91]
[D2B02]
[D2B04]
[Echelon99]
FernandoArielBeunza79156
193
[HFDrahtfunk]
[HomePlug1.0]
[HomePlugAV]
[HomePlugGP]
[House]
[IEEEP1901]
[IEEE754]
[IEEE802.2]
[ISO74981]
194
FernandoArielBeunza79156
[Kaspar]
[LeenHeffernanDunne]
[LIN10]
[Linjesender]
Wikipedia: Linjesender
http://en.wikipedia.org/wiki/Linjesender
[Maryanka00]
[Montoya06]
[MOST04]
[MOST10]
[Oliver]
[OppenheimWillsky97]
FernandoArielBeunza79156
195
[PLCEc]
[Rey03]
[Reuss93]
[RFC791]
[RFC793]
[RFC826]
[SAE94]
[Stallings97]
[StrangRckl]
196
FernandoArielBeunza79156
[Trnka061]
[Trnka062]
[TrnkaPurkert05]
[Tropeano03]
[UPB]
[VerssimoRodrigues01]
[Wense00]
[X10SignalTheory]
[X10TechNote]
[Zeltwanger]
Zeltwanger H.: Introduction into CAN physical and data link layer
http://www.can-expo.ru/files/physical.pdf
FernandoArielBeunza79156
197
198
FernandoArielBeunza79156
Los mdulos constituyentes del modem PLC prototipo (figura A1), se describe a
continuacin:
FernandoArielBeunza79156
199
Se debe notar que no existe ningn mdulo referido a la alimentacin del modem PLC,
debido a que la funcin de fuente de alimentacin se encuentra distribuida entre los distintos
mdulos, es decir que cada mdulo posee su propia fuente de alimentacin para independizar
elctricamente a cada mdulo para evitar interferencias que hagan al mal funcionamiento de los
mismos.
200
FernandoArielBeunza79156
FernandoArielBeunza79156
201
202
FernandoArielBeunza79156
FernandoArielBeunza79156
203
204
FernandoArielBeunza79156
FernandoArielBeunza79156
205
206
FernandoArielBeunza79156
FernandoArielBeunza79156
207
208
FernandoArielBeunza79156
FernandoArielBeunza79156
209
210
FernandoArielBeunza79156
FernandoArielBeunza79156
211
212
FernandoArielBeunza79156
FernandoArielBeunza79156
213
0x0000
0x1FFF
0x2000
0x7FFF
0x8000
Firmware
Modem PLC
0xFFFF
Figura A2. Organizacin del banco de memoria (vista por el firmware cargador).
214
FernandoArielBeunza79156
0x0000
RAM de
datos
0x7FFF
0x8000
Firmware
Modem PLC
0xFFFF
Figura A3. Organizacin del banco de memoria (vista por el firmware del modem PLC).
FernandoArielBeunza79156
215
216
FernandoArielBeunza79156
FernandoArielBeunza79156
217
218
FernandoArielBeunza79156
FernandoArielBeunza79156
219
220
FernandoArielBeunza79156
FernandoArielBeunza79156
221
222
FernandoArielBeunza79156
FernandoArielBeunza79156
223
224
FernandoArielBeunza79156
FernandoArielBeunza79156
225
226
FernandoArielBeunza79156
FernandoArielBeunza79156
227
228
FernandoArielBeunza79156
FernandoArielBeunza79156
229
230
FernandoArielBeunza79156
FernandoArielBeunza79156
231
232
FernandoArielBeunza79156
FernandoArielBeunza79156
233
234
FernandoArielBeunza79156
FernandoArielBeunza79156
235
236
FernandoArielBeunza79156
FernandoArielBeunza79156
237
238
FernandoArielBeunza79156
FernandoArielBeunza79156
239
Capa de aplicacin
(varia segn plataforma)
Capa de presentacin
(varia segn plataforma)
Interfaz RS232 (mdulo de procesamiento)
serial.h serial.c modem.c
Capa de sesin
sp.h sp.c
Capa de transporte
tp.h tp.c
Capa de red
net.h net.c
Capa de enlace
Resolucin de direcciones
(ARP)
arp.h arp.c
llc.h llc.c
Capa fsica (mdulo de procesamiento de seales)
phy.h phy.c main.c
En la figura C1 se detalla la distribucin de cada uno de los archivos del cdigo fuente
dentro del modelo de capas. Se puede observar que las capas se encuentran distribuidas en tres
grupos asociados al lugar donde se encuentran implementadas (mdulo de procesamiento de
seales, mdulo de procesamiento y dispositivo cliente).
Capa de aplicacin
ap.h ap.c
Capa de presentacin
pp.h pp.c
Figura C2. Diagrama de organizacin de cdigo del dispositivo cliente para plataforma AT89X5X.
En la figura C2 se puede observar la distribucin de cada uno de los archivos del cdigo
fuente correspondiente a la capa de presentacin y la capa de aplicacin para la plataforma
240
FernandoArielBeunza79156
Capa de presentacin
modplcpp.h modplcpp.c
modplcdl.h modplcdl.c
modplcphy.h modplcphy.c
Figura C3. Diagrama de organizacin de cdigo del dispositivo cliente para plataformas Windows y Linux.
En la figura C3 se detalla la distribucin de cada uno de los archivos del cdigo fuente
correspondiente a la capa de presentacin y la capa de aplicacin para las plataformas Windows y
Linux; adems de las interfaces de acceso a la capa de enlace y a la capa fsica. Tanto la pila de
capas de presentacin y aplicacin, como las interfaces a capa de enlace y capa fsica se comunican
con el modem PLC por medio del driver del mismo.
FernandoArielBeunza79156
241
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
'#'
'?'
'$'
'>'
/* Tipos de reset. */
#define MODPLC_NORMRESET
#define MODPLC_PARAMRESET
'0'
'$'
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER
#define MODPLC_DATALINKLAYER
#define MODPLC_SESSIONLAYER
'1'
'2'
'3'
/* Capa de sesin. */
/* Intervalo de tiempo en milisegundos de verificacin de mensaje recibido. */
#define MODPLCSP_POLLINTERVAL
250
/* Cdigo de operaciones de la capa de sesin. */
#define MODPLCSP_RESET
#define MODPLCSP_PUBLISH
#define MODPLCSP_SUBSCRIBE
#define MODPLCSP_LEAVE
#define MODPLCSP_SEND
#define MODPLCSP_RECEIVE
#define MODPLCSP_POLL
#define MODPLCSP_GETPAYLOADSIZE
'0'
'1'
'2'
'3'
'4'
'5'
'6'
'7'
#endif
242
FernandoArielBeunza79156
#if !defined(__MODPLCAP_H__)
#define __MODPLCAP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcap_grpid;
/* Identificador de mensaje. */
typedef unsigned short int modplcap_msgid;
/* Tipo de campo. */
typedef unsigned char modplcap_ftype;
/* Tipo mensaje. */
typedef struct
{
modplcap_msgid msgid;
modplcpp_msg msg;
} modplcap_msg;
/* Manejador de capa de aplicacin. */
#if defined SDCC_MODEL_SMALL
typedef struct
{
__data modplcpp_hd *modpphd;
__data modplcap_msg *recvbuff;
void (*recfun)
(__data void *,
__data modplcap_msg *,
__data void *) __reentrant;
__data void *param;
} modplcap_hd;
#else
typedef struct
{
modplcpp_hd *modpphd;
FernandoArielBeunza79156
/* Identificador de mensaje. */
/* Mensaje. */
243
/* Puntero al buffer de
recepcin. */
} modplcap_hd;
#endif
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAP_NULLTYPE
#define MODPLCAP_CHARTYPE
#define MODPLCAP_SINT8TYPE
#define MODPLCAP_UINT8TYPE
#define MODPLCAP_SINT16TYPE
#define MODPLCAP_UINT16TYPE
#define MODPLCAP_SINT32TYPE
#define MODPLCAP_UINT32TYPE
#define MODPLCAP_FLOATTYPE
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
244
FernandoArielBeunza79156
FernandoArielBeunza79156
245
246
FernandoArielBeunza79156
#endif
/* Variables globales. */
volatile modplcap_hd __modplcap_hd__;
FernandoArielBeunza79156
247
248
FernandoArielBeunza79156
FernandoArielBeunza79156
249
250
FernandoArielBeunza79156
FernandoArielBeunza79156
251
252
FernandoArielBeunza79156
FernandoArielBeunza79156
253
254
FernandoArielBeunza79156
FernandoArielBeunza79156
255
256
FernandoArielBeunza79156
FernandoArielBeunza79156
257
258
FernandoArielBeunza79156
FernandoArielBeunza79156
259
#if !defined(__MODPLCPP_H__)
#define __MODPLCPP_H__
260
FernandoArielBeunza79156
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcpp_grpid;
/* Tipo de mensaje. */
typedef unsigned char modplcpp_mtype;
/* Tipo de campo. */
typedef unsigned char modplcpp_ftype;
/* Tipo mensaje. */
typedef struct
{
unsigned short int startoffset;
unsigned short int endoffset;
modplcpp_grpid grpid;
modplcpp_mtype mtype;
#if defined SDCC_MODEL_SMALL
__data void *pphd;
/*
/*
/*
/*
/* Manejador de capa de
presentacin. */
#else
void *pphd;
/* Manejador de capa de
presentacin. */
#endif
unsigned char dat[MODPLCPP_MSGSIZE];
} modplcpp_msg;
#else
modplcsp_hd *modsphd;
modplcpp_msg *recvbuff;
void (*recfun)
(void *, modplcpp_msg *, void *)
__reentrant;
void *param;
#endif
} modplcpp_hd;
FernandoArielBeunza79156
261
0x00
0x01
/* Tipos de datos. */
#define MODPLCPP_NULLTYPE
#define MODPLCPP_CHARTYPE
#define MODPLCPP_SINT8TYPE
#define MODPLCPP_UINT8TYPE
#define MODPLCPP_SINT16TYPE
#define MODPLCPP_UINT16TYPE
#define MODPLCPP_SINT32TYPE
#define MODPLCPP_UINT32TYPE
#define MODPLCPP_FLOATTYPE
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
262
FernandoArielBeunza79156
FernandoArielBeunza79156
263
#endif
264
FernandoArielBeunza79156
/* Variables globales. */
volatile modplcpp_hd __modplcpp_hd__;
FernandoArielBeunza79156
265
266
FernandoArielBeunza79156
FernandoArielBeunza79156
267
268
FernandoArielBeunza79156
FernandoArielBeunza79156
269
270
FernandoArielBeunza79156
FernandoArielBeunza79156
271
272
FernandoArielBeunza79156
FernandoArielBeunza79156
273
274
FernandoArielBeunza79156
FernandoArielBeunza79156
275
276
FernandoArielBeunza79156
FernandoArielBeunza79156
277
278
FernandoArielBeunza79156
FernandoArielBeunza79156
279
#if !defined(__MODPLCSP_H__)
#define __MODPLCSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcsp_grpid;
/* Manejador de interfaz con la capa de sesin del modem PLC. */
typedef struct
{
int status;
/* Estado del modem PLC. */
short int msgsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
short int buffsize;
/* Tamao del buffer de
recepcin. */
short int polltimer;
/* Temporizador de verificacin de
recepcin de mensaje. */
short int payloadsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
#if defined SDCC_MODEL_SMALL
__data unsigned char *recvbuff;
/* Puntero al buffer de
280
FernandoArielBeunza79156
#else
unsigned char *recvbuff;
void (*recfun)
(void *, modplcsp_grpid, void *,
short int, void *) __reentrant;
void *param;
/* Puntero al buffer de
recepcin. */
#endif
} modplcsp_hd;
FernandoArielBeunza79156
281
282
FernandoArielBeunza79156
#endif
/* Variables globales. */
volatile modplcsp_hd __modplcsp_hd__;
FernandoArielBeunza79156
283
284
FernandoArielBeunza79156
FernandoArielBeunza79156
285
286
FernandoArielBeunza79156
FernandoArielBeunza79156
287
288
FernandoArielBeunza79156
FernandoArielBeunza79156
289
290
FernandoArielBeunza79156
FernandoArielBeunza79156
291
292
FernandoArielBeunza79156
FernandoArielBeunza79156
293
/* Caracter recibido. */
294
FernandoArielBeunza79156
FernandoArielBeunza79156
295
/* Contador. */
/* Respuesta. */
/* Caracter recibido. */
296
FernandoArielBeunza79156
/* Resultado de la solicitud. */
/* Byte recibido. */
FernandoArielBeunza79156
297
298
FernandoArielBeunza79156
/* Contador. */
/* Dgito. */
FernandoArielBeunza79156
299
300
FernandoArielBeunza79156
FernandoArielBeunza79156
301
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
302
FernandoArielBeunza79156
#endif
/*
Funcin inituart:
Inicializa la UART del microcontrolador.
*/
void inituart(unsigned char t1_reload)
{
/* Inicializa la UART. */
SIO_SCON = 0x50;
SIO_TR1 = 0;
SIO_TMOD = (SIO_TMOD & 0x0f) | 0x20;
SIO_PCON |= 0x80;
SIO_TH1 = t1_reload;
SIO_TR1 = 1;
SIO_TI = 1;
}
FernandoArielBeunza79156
303
/* Caracter recibido. */
304
FernandoArielBeunza79156
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
FernandoArielBeunza79156
305
#if !defined(__MODPLCSP_H__)
#define __MODPLCSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcsp_grpid;
/* Manejador de interfaz con la capa de sesin del modem PLC. */
typedef struct
{
HANDLE hq;
/* Manejador de cola de
mensajes. */
HANDLE hm;
/* Semforo de exclusin mtua. */
HANDLE detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
size_t payloadsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
void (*recfun)
(void *, modplcsp_grpid, void *,
size_t, void *);
/* Funcin manejadora de mensajes
recibidos. */
void *param;
/* Parmetros para la funcin
manejadora de mensajes
recibidos. */
} modplcsp_hd;
306
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
307
/* Identificador de operacin. */
/* Capa a la que se quiere
accerder. */
/* Resultado de la solicitud. */
/* Cantidad mxima de bytes que
puede contener un mensaje. */
/* Manejador de interfaz con la
capa de sesin del modem PLC. */
/* Nombre de la cola de
mensajes. */
308
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
309
/* Identificador de operacin. */
/* Resultado de la operacin. */
310
FernandoArielBeunza79156
FernandoArielBeunza79156
311
312
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
313
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Identificador de operacin. */
/* Cantidad de bytes que puede
contener un mensaje. */
314
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Indicador de recepcin de un
mensaje. */
/* Tamao del mensaje. */
/* Identificador de grupo. */
/* Manejador de interfaz con la
capa de sesin del modem PLC. */
/* Funcin manejadora de mensajes
recibidos. */
/* Puntero al mensaje. */
FernandoArielBeunza79156
315
316
FernandoArielBeunza79156
#if !defined(__MODPLCPP_H__)
#define __MODPLCPP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcpp_grpid;
/* Tipo de mensaje. */
typedef unsigned char modplcpp_mtype;
/* Tipo de campo. */
typedef unsigned char modplcpp_ftype;
/* Estructura del mensaje. */
typedef struct
{
unsigned short int startoffset;
unsigned short int endoffset;
modplcpp_grpid grpid;
modplcpp_mtype mtype;
void *pphd;
unsigned char *dat;
/*
/*
/*
/*
/*
} modplcpp_msg;
/* Manejador de capa de presentacin. */
typedef struct
{
size_t payloadsize;
modplcpp_grpid grpid;
modplcsp_hd *modsphd;
void (*recfun)
(void *, modplcpp_msg *, void *);
void *param;
modplcpp_msg buffer;
} modplcpp_hd;
/* Definicin de constantes. */
/* Tipo de mensaje. */
#define MODPLCPP_SECMSG
#define MODPLCPP_NOSECMSG
0x00
0x01
/* Tipos de datos. */
#define MODPLCPP_NULLTYPE
#define MODPLCPP_CHARTYPE
#define MODPLCPP_SINT8TYPE
#define MODPLCPP_UINT8TYPE
#define MODPLCPP_SINT16TYPE
0x00
0x01
0x02
0x03
0x04
FernandoArielBeunza79156
317
MODPLCPP_UINT16TYPE
MODPLCPP_SINT32TYPE
MODPLCPP_UINT32TYPE
MODPLCPP_FLOATTYPE
0x05
0x06
0x07
0x08
318
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
319
/* Manejador de capa de
presentacin. */
320
FernandoArielBeunza79156
FernandoArielBeunza79156
321
322
FernandoArielBeunza79156
FernandoArielBeunza79156
323
324
FernandoArielBeunza79156
FernandoArielBeunza79156
325
326
FernandoArielBeunza79156
#if !defined(__MODPLCAP_H__)
#define __MODPLCAP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcap_grpid;
/* Identificador de mensaje. */
typedef unsigned short int modplcap_msgid;
/* Tipo de campo. */
typedef unsigned char modplcap_ftype;
/* Estructura del mensaje. */
typedef struct
{
modplcap_msgid msgid;
void *msg;
} modplcap_msg;
/* Manejador de capa de aplicacin. */
typedef struct
{
int msgflag;
modplcap_grpid grpid;
void *pphd;
void (*recfun)
(void *, modplcap_msg *, void *);
void *param;
modplcap_msg buffer;
FernandoArielBeunza79156
/* Identificador de mensaje. */
/* Puntero al mensaje. */
/* Indicador de mensaje en el
buffer. */
/* Identificador de grupo del
mensaje almacenado en el
buffer. */
/* Puntero al manejador de capa de
presentacin. */
/* Funcin manejadora de mensajes
recibidos. */
/* Parmetros para la funcin
manejadora de mensajes
recibidos. */
/* Puntero al buffer de campos
327
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAP_NULLTYPE
#define MODPLCAP_CHARTYPE
#define MODPLCAP_SINT8TYPE
#define MODPLCAP_UINT8TYPE
#define MODPLCAP_SINT16TYPE
#define MODPLCAP_UINT16TYPE
#define MODPLCAP_SINT32TYPE
#define MODPLCAP_UINT32TYPE
#define MODPLCAP_FLOATTYPE
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
328
FernandoArielBeunza79156
FernandoArielBeunza79156
/* Manejador de biblioteca
dinmica. */
329
330
FernandoArielBeunza79156
#endif
/* Manejador de capa de
aplicacin. */
FernandoArielBeunza79156
331
332
FernandoArielBeunza79156
FernandoArielBeunza79156
333
334
FernandoArielBeunza79156
FernandoArielBeunza79156
335
Recibe el mensaje. */
(!modplcpp_getfield(msg, &type, &count, &msgid)) return;
(type != MODPLCPP_UINT16TYPE) return;
(count != 1) return;
336
FernandoArielBeunza79156
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCDL_H__)
#define __MODPLCDL_H__
FernandoArielBeunza79156
337
/* Definicin de tipos. */
/* Direccin fsica del modem PLC. */
typedef unsigned char modplcdl_phyaddr[8];
/* Direccin lgica del modem PLC. */
typedef unsigned long int modplcdl_logaddr;
/* Manejador de interfaz con la capa de enlace del modem PLC. */
typedef struct
{
HANDLE hq;
/* Manejador de cola de
mensajes. */
HANDLE hm;
/* Semforo de exclusin mtua. */
unsigned char sid;
/* Identificador de interfaz de
comunicacin por puerto
serie. */
unsigned long int conncounter;
/* Contador de conexiones
abiertas. */
} modplcdl_hd;
/* Manejador de conexin por medio de la capa de enlace del modem PLC. */
typedef struct
{
HANDLE hq;
/* Manejador de cola de
mensajes. */
HANDLE detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
size_t payloadsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
modplcdl_hd *dlhd;
/* Manejador de interfaz con la
capa de enlance del modem
PLC. */
void (*recfun)
(void *, modplcdl_phyaddr, void *,
size_t, void *);
/* Funcin manejadora de mensajes
recibidos. */
void *param;
/* Parmetros para la funcin
manejadora de mensajes
recibidos. */
} modplcdlconn_hd;
338
FernandoArielBeunza79156
FernandoArielBeunza79156
339
/* Manejador de biblioteca
dinmica. */
/* Carga la biblioteca. */
hlib = NULL;
modplcdl_init = NULL;
modplcdl_release = NULL;
modplcdl_open = NULL;
modplcdl_close = NULL;
modplcdl_send = NULL;
modplcdl_receive = NULL;
modplcdl_notify = NULL;
modplcdl_poll = NULL;
modplcdl_getaddress = NULL;
modplcdl_addlogaddress = NULL;
modplcdl_dellogaddress = NULL;
modplcdl_getphyaddress = NULL;
modplcdl_status = NULL;
modplcdl_getpayloadsize = NULL;
hlib = LoadLibrary("MODPLCDL");
if (!hlib) return 0;
modplcdl_init = (modplcdl_hd * (*)(int))
GetProcAddress(hlib, "modplcdl_init");
modplcdl_release = (int (*)(modplcdl_hd *))
GetProcAddress(hlib, "modplcdl_release");
modplcdl_open = (modplcdlconn_hd * (*)(modplcdl_hd *, unsigned char,
unsigned char))
GetProcAddress(hlib, "modplcdl_open");
modplcdl_close = (int (*)(modplcdlconn_hd *))
GetProcAddress(hlib, "modplcdl_close");
modplcdl_send = (size_t (*)(modplcdlconn_hd *, modplcdl_phyaddr,
unsigned char, const void *, size_t))
GetProcAddress(hlib, "modplcdl_send");
modplcdl_receive = (size_t (*)(modplcdlconn_hd *, modplcdl_phyaddr, void *,
size_t))
GetProcAddress(hlib, "modplcdl_receive");
modplcdl_notify = (int (*)(modplcdlconn_hd *, void (*func)(void *,
modplcdl_phyaddr, void *, size_t, void *),
void *))
GetProcAddress(hlib, "modplcdl_notify");
modplcdl_poll = (int (*)(modplcdlconn_hd *))
GetProcAddress(hlib, "modplcdl_poll");
modplcdl_getaddress = (int (*)(modplcdl_hd *, unsigned char,
modplcdl_phyaddr))
GetProcAddress(hlib, "modplcdl_getaddress");
modplcdl_addlogaddress = (int (*)(modplcdl_hd *, unsigned char,
unsigned char, modplcdl_logaddr))
GetProcAddress(hlib, "modplcdl_addlogaddress");
modplcdl_dellogaddress = (int (*)(modplcdl_hd *, unsigned char,
unsigned char, modplcdl_logaddr))
GetProcAddress(hlib, "modplcdl_dellogaddress");
modplcdl_getphyaddress = (int (*)(modplcdl_hd *hd, unsigned char,
unsigned char, modplcdl_logaddr,
modplcdl_phyaddr))
340
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
341
342
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la solicitud. */
FernandoArielBeunza79156
343
344
/* Identificador de operacin. */
/* Resultado de la solicitud. */
FernandoArielBeunza79156
FernandoArielBeunza79156
345
un mensaje. */
346
FernandoArielBeunza79156
FernandoArielBeunza79156
347
/* Identificador de operacin. */
/* Resultado de la operacin. */
348
FernandoArielBeunza79156
FernandoArielBeunza79156
349
350
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
351
void (*func)
(void *, modplcdl_phyaddr, void *,
size_t, void *);
unsigned char *msg;
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Indicador de captura de un
mensaje. */
/* Tamao del mensaje. */
/* Direccin de origen. */
/* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
352
FernandoArielBeunza79156
FernandoArielBeunza79156
353
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
354
FernandoArielBeunza79156
#if !defined(__MODPLCPHY_H__)
#define __MODPLCPHY_H__
/* Definicin de tipos. */
/* Manejador de interfaz con la capa fsica del modem PLC. */
typedef struct
{
HANDLE hq;
/* Manejador de cola de
mensajes. */
HANDLE hm;
/* Semforo de exclusin mtua. */
struct
{
DWORD threadid;
/* Identificador de hilo de
deteccin. */
HANDLE detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
void (*recfun)(void *, void *);
/* Funcin manejadora de tramas
capturadas. */
void *param;
/* Parmetros para la funcin
manejadora de tramas
recibidas. */
} iface[256];
/* Tabla de interfaces fsicas. */
} modplcphy_hd;
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPLCPHY_NOISESIGNAL
#define MODPLCPHY_TESTSIGNAL1
#define MODPLCPHY_TESTSIGNAL2
0x01
0x02
0x03
FernandoArielBeunza79156
355
356
FernandoArielBeunza79156
/* Manejador de biblioteca
dinmica. */
/* Carga la biblioteca. */
hlib = NULL;
modplcphy_init = NULL;
modplcphy_release = NULL;
modplcphy_sndframe = NULL;
modplcphy_capframe = NULL;
modplcphy_getframe = NULL;
modplcphy_notify = NULL;
modplcphy_poll = NULL;
modplcphy_rsdframe = NULL;
modplcphy_clrbuffer = NULL;
modplcphy_sensechannel = NULL;
modplcphy_gensignal = NULL;
modplcphy_tstreceive = NULL;
modplcphy_status = NULL;
modplcphy_getpayloadsize = NULL;
hlib = LoadLibrary("MODPLCPHY");
if (!hlib) return 0;
modplcphy_init = (modplcphy_hd * (*)(int))
GetProcAddress(hlib, "modplcphy_init");
modplcphy_release = (int (*)(modplcphy_hd *))
GetProcAddress(hlib, "modplcphy_release");
modplcphy_sndframe = (size_t (*)(modplcphy_hd *, unsigned char,
const void *, size_t))
GetProcAddress(hlib, "modplcphy_sndframe");
modplcphy_capframe = (int (*)(modplcphy_hd *, unsigned char, size_t))
GetProcAddress(hlib, "modplcphy_capframe");
modplcphy_getframe = (size_t (*)(modplcphy_hd *, unsigned char, void *,
size_t))
GetProcAddress(hlib, "modplcphy_getframe");
modplcphy_notify = (int (*)(modplcphy_hd *, unsigned char,
void (*func)(modplcphy_hd *, void *), void *))
GetProcAddress(hlib, "modplcphy_notify");
modplcphy_poll = (int (*)(modplcphy_hd *, unsigned char))
GetProcAddress(hlib, "modplcphy_poll");
modplcphy_rsdframe = (int (*)(modplcphy_hd *, unsigned char))
GetProcAddress(hlib, "modplcphy_rsdframe");
modplcphy_clrbuffer = (int (*)(modplcphy_hd *, unsigned char))
GetProcAddress(hlib, "modplcphy_clrbuffer");
modplcphy_sensechannel = (int (*)(modplcphy_hd *, unsigned char,
unsigned char, long int))
GetProcAddress(hlib, "modplcphy_sensechannel");
modplcphy_gensignal = (int (*)(modplcphy_hd *, unsigned char, int))
GetProcAddress(hlib, "modplcphy_gensignal");
modplcphy_tstreceive = (int (*)(modplcphy_hd *, unsigned char))
GetProcAddress(hlib, "modplcphy_tstreceive");
modplcphy_status = (int (*)(modplcphy_hd *))
GetProcAddress(hlib, "modplcphy_status");
modplcphy_getpayloadsize = (size_t (*)(modplcphy_hd *, unsigned char))
GetProcAddress(hlib,
"modplcphy_getpayloadsize");
/* Verifica que todas las funciones de la biblioteca se hayan cargado. */
if ((!modplcphy_init) || (!modplcphy_release) || (!modplcphy_sndframe) ||
(!modplcphy_capframe) || (!modplcphy_getframe) ||
(!modplcphy_notify) || (!modplcphy_poll) || (!modplcphy_rsdframe) ||
(!modplcphy_clrbuffer) || (!modplcphy_sensechannel) ||
(!modplcphy_gensignal) || (!modplcphy_tstreceive) ||
FernandoArielBeunza79156
357
#endif
358
FernandoArielBeunza79156
fsicas. */
/* Manejador de interfaz con la
capa fsica del modem PLC. */
/* Nombre de la cola de
mensajes. */
/* Crea un nuevo manejador de interfaz con la capa fsica del modem PLC. */
handle = (modplcphy_hd *) malloc(sizeof(modplcphy_hd));
if (!handle) return NULL;
/* Inicializa el manejador de interfaz con la capa fsica del modem PLC. */
while(1)
{
/* Abre una conexin con la cola de mensajes del driver del modem
PLC. */
sprintf(qname, "\\\\.\\pipe\\modemplc%i", sid);
handle->hq = CreateFile(qname, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (handle->hq == INVALID_HANDLE_VALUE) break;
/* Inicializa el manejador de tramas capturadas de cada una de las
interfaces fsicas. */
for(iface = 0; iface < 256; iface ++)
{
handle->iface[iface].recfun = NULL;
handle->iface[iface].param = NULL;
}
/* Inicializa semforo de exclusin mtua. */
handle->hm = CreateSemaphore(NULL, 1, 1, NULL);
if (handle->hm == INVALID_HANDLE_VALUE) break;
/* Solicita acceder a la capa fsica del modem PLC. */
layer = 1;
if (!__modplcphy_sendrecv__(handle, &result, sizeof(result), &layer,
sizeof(layer)))
break;
if (!result) break;
/* Devuelve el manejador creado. */
return handle;
}
/* No se pudo inicializar la interfaz con la capa fsica del modem PLC. */
CloseHandle(handle->hm);
CloseHandle(handle->hq);
free(handle);
return NULL;
}
/*
Funcin modplcphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modplcphy_release(modplcphy_hd *hd)
{
/* Variables. */
int op;
int result;
short int iface;
/* Operacin. */
/* Resultado de la operacin. */
/* Identificadores de interfaces
fsicas. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Libera el manejador de captura de tramas. */
for(iface = 0; iface < 256; iface ++)
modplcphy_notify(hd, (unsigned char) (iface & 0x00ff), NULL, NULL);
FernandoArielBeunza79156
359
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Enva una trama. */
while(1)
{
/* Solicita el envo de una trama. */
op = MODDRVPHY_SNDFRAME;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &iface, sizeof(iface))) break;
/* Enva el tamao de la trama. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &framesize,
sizeof(framesize)))
break;
/* Enva la trama. */
if (!__modplcphy_sendrecv__(hd, &framesize, sizeof(framesize), frame,
framesize))
break;
/* Permite a otro hilos poder comunicarse con el driver del modem
PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve la cantidad de bytes enviados. */
return framesize;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* No se pudo realizar el envo. */
return 0;
}
/*
360
FernandoArielBeunza79156
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Solicita la captura una trama. */
result = 0;
while(1)
{
/* Solicita la captura de una trama. */
op = MODDRVPHY_CAPFRAME;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &iface, sizeof(iface))) break;
/* Enva el tamao de la trama. */
__modplcphy_sendrecv__(hd, &result, sizeof(result), &framesize,
sizeof(framesize));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve el resultado de la solicitud. */
return result;
}
/*
Funcin modplcphy_getframe:
Obtiene una trama capturada previamente.
*/
size_t modplcphy_getframe(modplcphy_hd *hd, unsigned char iface, void *frame,
size_t framesize)
{
/* Variables. */
int op;
/* Identificador de operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Obtiene una trama capturada previamente. */
while(1)
{
/* Solicita la leer una trama. */
op = MODDRVPHY_GETFRAME;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &iface, sizeof(iface))) break;
/* Enva el tamao de la trama y obtiene la trama. */
if (!__modplcphy_sendrecv__(hd, frame, framesize, &framesize,
FernandoArielBeunza79156
361
362
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Verifica la captura de una trama. */
result = 0;
while(1)
{
/* Solicita verificar la captura de una trama. */
op = MODDRVPHY_POLL;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
__modplcphy_sendrecv__(hd, &result, sizeof(result), &iface,
sizeof(iface));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve el resultado de la solicitud. */
return result;
}
/*
Funcin modplcphy_rsdframe:
Reenva una trama.
*/
int modplcphy_rsdframe(modplcphy_hd *hd, unsigned char iface)
{
/* Variables. */
int op;
/* Identificador de operacin. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
FernandoArielBeunza79156
363
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Limpia el buffer de captura de tramas. */
result = 0;
while(1)
{
/* Solicita limpiar el buffer de captura de tramas. */
op = MODDRVPHY_CLRBUFFER;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
__modplcphy_sendrecv__(hd, &result, sizeof(result), &iface,
sizeof(iface));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve el resultado de la limpieza del buffer. */
return result;
}
/*
Funcin modplcphy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int modplcphy_sensechannel(modplcphy_hd *hd, unsigned char iface,
unsigned char level, long int waittime)
{
/* Variables. */
int op;
/* Identificador de operacin. */
int result;
/* Resultado de la operacin. */
364
FernandoArielBeunza79156
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Solicita el sensado del canal de comunicacin. */
result = 0;
while(1)
{
/* Solicita el sensado del estado del canal de comunicacin. */
op = MODDRVPHY_SENSECHANNEL;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &iface, sizeof(iface))) break;
/* Enva el nivel de seal. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &level, sizeof(level))) break;
/* Enva el tiempo de espera. */
__modplcphy_sendrecv__(hd, &result, sizeof(result), &waittime,
sizeof(waittime));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve el resultado del sensado del estado del canal de
comunicacin. */
return result;
}
/*
Funcin modplcphy_gensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modplcphy_gensignal(modplcphy_hd *hd, unsigned char iface, int sig)
{
/* Variables. */
int op;
/* Identificador de operacin. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Solicita la generacin de la seal especificada. */
result = 0;
while(1)
{
/* Solicita la generacin de una seal. */
op = MODDRVPHY_GENSIGNAL;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
if (!__modplcphy_sendrecv__(hd, NULL, 0, &iface, sizeof(iface))) break;
/* Enva el tipo de seal. */
__modplcphy_sendrecv__(hd, &result, sizeof(result), &sig, sizeof(sig));
break;
}
FernandoArielBeunza79156
365
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Realiza una prueba de recepcin. */
result = 0;
while(1)
{
/* Solicita realizar una prueba de recepcin. */
op = MODDRVPHY_TSTRECEIVE;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
__modplcphy_sendrecv__(hd, &result, sizeof(result), &iface,
sizeof(iface));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve el resultado de la prueba de recepcin. */
return result;
}
/*
Funcin modplcphy_status:
Devuelve el estado del modem PLC.
*/
int modplcphy_status(modplcphy_hd *hd)
{
/* Variables. */
int op;
int result;
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Obtiene el estado del modem PLC. */
op = MODDRVPHY_STATUS;
if (!__modplcphy_sendrecv__(hd, &result, sizeof(result), &op, sizeof(op)))
result = 0;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
366
FernandoArielBeunza79156
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
payloadsize = 0;
while(1)
{
/* Obtiene la cantidad mxima de bytes que puede contener una trama. */
op = MODDRVPHY_GETPAYLOADSIZE;
if (!__modplcphy_sendrecv__(hd, NULL, 0, &op, sizeof(op))) break;
/* Enva el identificador de interfaz fsica. */
__modplcphy_sendrecv__(hd, &payloadsize, sizeof(payloadsize), &iface,
sizeof(iface));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/* Devuelve la cantidad mxima de bytes que puede contener una trama. */
return payloadsize;
}
FernandoArielBeunza79156
367
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Enva la operacin. */
sent = 0;
while((indata) && (sent < insize))
368
FernandoArielBeunza79156
Archivo config.h: en este archivo se definen parmetros de configuracin del driver del
del modem PLC que no pueden ser modificados en tiempo de ejecucin.
FernandoArielBeunza79156
369
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
'#'
'?'
'$'
'>'
/* Tipos de reset. */
#define MODPLC_NORMRESET
#define MODPLC_PARAMRESET
'0'
'$'
MODPLC_NORMRESET
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'a'
/* Tipos de seal. */
#define MODPLCPHY_NOISESIGNAL
#define MODPLCPHY_TESTSIGNAL1
#define MODPLCPHY_TESTSIGNAL2
0x01
0x02
0x03
MODPLC_NORMRESET
370
FernandoArielBeunza79156
MODPLCDL_OPEN
MODPLCDL_CLOSE
MODPLCDL_SEND
MODPLCDL_RECEIVE
MODPLCDL_POLL
MODPLCDL_GETADDRESS
MODPLCDL_ADDLOGADDRESS
MODPLCDL_DELLOGADDRESS
MODPLCDL_GETPHYADDRESS
MODPLCDL_GETPAYLOADSIZE
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'a'
MODPLC_NORMRESET
'1'
'2'
'3'
'4'
'5'
'6'
'7'
4096
FernandoArielBeunza79156
371
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
/* Definicin de tipos. */
/* Manejador de interfaz de comunicacin por puerto serie. */
typedef struct
{
HANDLE serialhd;
/* Manejador de interfaz de puerto
serie. */
HANDLE stopsem;
/* Semforo de finalizacin de
recepcin. */
HANDLE readersem;
/* Semforo lector del buffer de
recepcin. */
HANDLE writersem;
/* Semforo escritor del buffer de
recepcin. */
HANDLE recvthread;
/* Manejador de hilo receptor. */
int stopflag;
/* Indicador de fin de
recepcin. */
size_t size;
/* Tanao del buffer de
recepcin. */
size_t received;
/* Cantidad de bytes recibidos sin
leer. */
char *buffer;
/* Puntero al buffer de
recepcin. */
} serial_hd;
372
FernandoArielBeunza79156
#endif
COMMTIMEOUTS cto;
serial_hd *handle;
char iname[256];
/* Identificador de hilo. */
/* Configuracin de la interfaz de
comunicacin por puerto
serie. */
/* Configuracin de los tiempos de
espera. */
/* Manejador de la interfaz. */
/* Nombre de la interfaz. */
FernandoArielBeunza79156
373
374
FernandoArielBeunza79156
FernandoArielBeunza79156
375
376
FernandoArielBeunza79156
/* Resultado de la espera. */
/* Cantidad de bytes recibidos. */
/* Manejador de comunicacin
asincrnica. */
/* Manejadores en espera. */
/* Manejador de la interfaz por
puerto serie. */
FernandoArielBeunza79156
377
#if !defined(__MODPLC_H__)
#define __MODPLC_H__
/* Definicin de tipos. */
/* Direccin fsica del modem PLC. */
typedef unsigned char modplc_dlphyaddr[8];
/* Direccin lgica del modem PLC. */
typedef unsigned long int modplc_dllogaddr;
/* Identificador de grupo. */
typedef unsigned char modplc_spgrpid;
/* Manejador de interfaz con el modem PLC. */
typedef struct
{
serial_hd *serialhd;
int layer;
int status;
int debugmode;
} modplc_hd;
/* Manejador de interfaz de
comunicacin por puerto
serie. */
/* Capa del modem PLC utilizada. */
/* Estado del modem PLC. */
/* Indicador de modo depuracin. */
/* Definicin de constantes. */
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER
#define MODPLC_DATALINKLAYER
#define MODPLC_SESSIONLAYER
0x01
0x02
0x03
/* Tipos de seales. */
#define MODPLC_PHYNOISESIGNAL
#define MODPLC_PHYTESTSIGNAL1
#define MODPLC_PHYTESTSIGNAL2
0x01
0x02
0x03
378
FernandoArielBeunza79156
FernandoArielBeunza79156
379
380
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
381
/* Smbolo de la lnea de
comando. */
/* Manejador de interfaz con el
modem PLC. */
/* Lnea de comando. */
/* Lnea de respuesta de
comando. */
382
FernandoArielBeunza79156
FernandoArielBeunza79156
383
"s",
}
/*
Funcin modplc_phycapframe:
Captura una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phycapframe(modplc_hd *hd, unsigned char iface, size_t framesize)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[2];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
"b",
}
/*
Funcin modplc_phygetframe:
Obtiene una trama capturada previamente por medio de la capa fsica del
modem PLC.
*/
size_t modplc_phygetframe(modplc_hd *hd, unsigned char iface, void *frame,
384
FernandoArielBeunza79156
"s",
}
/*
Funcin modplc_phypoll:
Verifica la captura de una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phypoll(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned char result;
void *inparam[1];
void *outparam[1];
"b",
}
/*
Funcin modplc_phyrsdframe:
Reenva una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phyrsdframe(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
FernandoArielBeunza79156
385
"b",
}
/*
Funcin modplc_phyclrbuffer:
Limpia el buffer de captura de tramas de la capa fsica del modem PLC.
*/
int modplc_phyclrbuffer(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
"b",
}
/*
Funcin modplc_physensechannel:
Sensa el estado del canal de comunicacin por medio de la capa fsica del
modem PLC.
*/
int modplc_physensechannel(modplc_hd *hd, unsigned char iface,
unsigned char level, long int waittime)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[3];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
386
FernandoArielBeunza79156
"b",
}
/*
Funcin modplc_phytstreceive:
Realiza una prueba de recepcin de la capa fsica del modem PLC.
*/
int modplc_phytstreceive(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
"b",
}
/*
Funcin modplc_phygetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modplc_phygetpayloadsize(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned short int payloadsize;
/* Cantidad mxima de bytes que
FernandoArielBeunza79156
387
"s",
}
/*
Funcin modplc_dlclose:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlclose(modplc_hd *hd, int handle)
{
/* Variables. */
unsigned char result;
void *inparam[2];
void *outparam[1];
388
FernandoArielBeunza79156
"b",
}
/*
Funcin modplc_dlsend:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlsend(modplc_hd *hd, int handle, modplc_dlphyaddr addr,
unsigned char prio, const void *msg, size_t msgsize)
{
/* Variables. */
void *inparam[4];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
"s",
}
/*
Funcin modplc_dlreceive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlreceive(modplc_hd *hd, int handle, modplc_dlphyaddr addr,
void *msg, size_t msgsize)
{
/* Variables. */
void *inparam[2];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
FernandoArielBeunza79156
"as",
389
"b",
}
/*
Funcin modplc_dlgetaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int modplc_dlgetaddress(modplc_hd *hd, unsigned char iface,
modplc_dlphyaddr paddr)
{
/* Variables. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
390
FernandoArielBeunza79156
FernandoArielBeunza79156
391
392
"b",
FernandoArielBeunza79156
"b",
}
/*
Funcin modplc_spleave:
Desvincula el dispositivo del grupo de difusin especificado de la capa de
sesin del modem PLC.
*/
int modplc_spleave(modplc_hd *hd, modplc_spgrpid grpid)
{
/* Variables. */
unsigned char result;
void *inparam[1];
void *outparam[1];
FernandoArielBeunza79156
393
"s",
}
/*
Funcin modplc_spreceive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spreceive(modplc_hd *hd, modplc_spgrpid *grpid, void *msg,
size_t msgsize)
{
/* Variables. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
void *outparam[2];
/* Parmetros de salida del
comando. */
"bs",
}
/*
Funcin modplc_sppoll:
Verifica la llegada de un nuevo mensaje por medio de la capa de sesin del
modem PLC.
*/
int modplc_sppoll(modplc_hd *hd)
{
/* Variables. */
unsigned char result;
void *outparam[1];
394
FernandoArielBeunza79156
"b", outparam,
}
/*
Funcin modplc_spgetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
size_t modplc_spgetpayloadsize(modplc_hd *hd)
{
/* Variables. */
unsigned short int payloadsize;
void *outparam[1];
FernandoArielBeunza79156
395
396
= op;
= '\n';
= 0;
inparam)
FernandoArielBeunza79156
FernandoArielBeunza79156
397
398
FernandoArielBeunza79156
#if !defined(__MODSP_H__)
#define __MODSP_H__
FernandoArielBeunza79156
399
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modsp_grpid;
/* Manejador de interfaz con la capa de sesin del modem PLC. */
typedef struct
{
HANDLE mutexsem;
/* Semforo de finalizacin de
deteccin de recepcin. */
HANDLE detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
size_t payloadsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
modplc_hd *modplchd;
/* Manejador de interfaz con el
modem PLC. */
void (*recfun)
(void *, modsp_grpid, void *,
size_t, void *);
/* Funcin manejadora de mensajes
recibidos. */
void *param;
/* Parmetros para la funcin
manejadora de mensajes
recibidos. */
} modsp_hd;
400
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
401
/* Resultado de la operacin. */
402
FernandoArielBeunza79156
/* Resultado de la operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
403
404
FernandoArielBeunza79156
/* Resultado de la operacin. */
FernandoArielBeunza79156
405
/* Resultado de la operacin. */
406
/* Indicador de recepcin de un
mensaje. */
/* Tamao del mensaje recibido. */
/* Identificador de grupo. */
FernandoArielBeunza79156
/* Manejador de mensajes
recibidos. */
/* Puntero al mensaje recibido. */
#if !defined(__MODDL_H__)
#define __MODDL_H__
FernandoArielBeunza79156
407
408
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
409
410
FernandoArielBeunza79156
FernandoArielBeunza79156
411
412
FernandoArielBeunza79156
FernandoArielBeunza79156
413
/* Resultado de la operacin. */
414
FernandoArielBeunza79156
FernandoArielBeunza79156
415
/* Resultado de la operacin. */
416
FernandoArielBeunza79156
void (*func)
(void *, moddl_phyaddr, void *,
size_t, void *);
char *msg;
/* Indicador de recepcin de un
mensaje. */
/* Tamao del mensaje recibido. */
/* Direccin fsica de origen del
mensaje. */
/* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
/* Manejador de mensajes
recibidos. */
/* Puntero al mensaje recibido. */
FernandoArielBeunza79156
417
#if !defined(__MODPHY_H__)
#define __MODPHY_H__
/* Definicin de tipos. */
/* Manejador de interfaz con la capa fsica del modem PLC. */
typedef struct
{
HANDLE mutexsem;
/* Semforo de finalizacin de
deteccin de recepcin. */
modplc_hd *modplchd;
/* Manejador de interfaz con el
modem PLC. */
struct
{
DWORD threadid;
/* Identificador de hilo de
deteccin. */
HANDLE detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
void (*recfun)(void *, void *);
/* Funcin manejadora de tramas
capturadas. */
void *param;
/* Parmetros para la funcin
manejadora de tramas
recibidas. */
} iface[256];
/* Tabla de interfaces fsicas. */
} modphy_hd;
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPHY_NOISESIGNAL
#define MODPHY_TESTSIGNAL1
#define MODPHY_TESTSIGNAL2
0x01
0x02
0x03
418
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
419
/* Identificadores de interfaces
fsicas. */
/* Manejador de interfaz con la
capa fsica del modem PLC. */
/* Crea un nuevo manejador de interfaz con la capa fsica del modem PLC. */
handle = (modphy_hd *) malloc(sizeof(modphy_hd));
if (!handle) return NULL;
/* Inicializa el manejador de interfaz con la capa fsica del modem PLC. */
while(1)
{
/* Inicializa el manejador de interfaz con el modem PLC. */
handle->modplchd = modplc_init(sid, MODPLC_PHYSICALLAYER, debugmode);
if (!handle->modplchd) break;
/* Inicializa el manejador de tramas capturadas de cada una de las
interfaces fsicas. */
for(iface = 0; iface < 256; iface ++)
{
handle->iface[iface].recfun = NULL;
handle->iface[iface].param = NULL;
}
/* Inicializa semforo. */
handle->mutexsem = CreateSemaphore(NULL, 1, 1, NULL);
if (handle->mutexsem == INVALID_HANDLE_VALUE) break;
/* Devuelve el manejador creado. */
return handle;
}
/* No se pudo inicializar la interfaz con la capa fsica del modem PLC. */
modplc_release(handle->modplchd);
free(handle);
return NULL;
}
/*
420
FernandoArielBeunza79156
/* Identificadores de interfaces
fsicas. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Libera el manejador de captura de tramas. */
for(iface = 0; iface < 256; iface ++)
modphy_notify(hd, (unsigned char) (iface & 0x00ff), NULL, NULL);
/* Libera la interfaz con el modem PLC. */
modplc_release(hd->modplchd);
/* Libera los recursos utilizados por la interfaz con la capa fsica del
modem PLC. */
CloseHandle(hd->mutexsem);
free(hd);
/* xito. */
return 1;
}
/*
Funcin modphy_sndframe:
Enva una trama.
*/
size_t modphy_sndframe(modphy_hd *hd, unsigned char iface, const void *frame,
size_t framesize)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Enva una trama. */
framesize = modplc_physndframe(hd->modplchd, iface, frame, framesize);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve la cantidad de bytes envados. */
return framesize;
}
/*
Funcin modphy_capframe:
Captura una trama.
*/
int modphy_capframe(modphy_hd *hd, unsigned char iface, size_t framesize)
{
/* Variables. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
FernandoArielBeunza79156
421
422
FernandoArielBeunza79156
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Verifica la captura de una trama. */
result = modplc_phypoll(hd->modplchd, iface);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve el resultado de la verificacin de la captura de una trama. */
return result;
}
/*
Funcin modphy_rsdframe:
Reenva una trama.
*/
int modphy_rsdframe(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Reenva una trama. */
FernandoArielBeunza79156
423
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Limpia el buffer de captura de tramas. */
result = modplc_phyclrbuffer(hd->modplchd, iface);
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve el resultado de la limpieza del buffer de captura de tramas. */
return result;
}
/*
Funcin modphy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int modphy_sensechannel(modphy_hd *hd, unsigned char iface,
unsigned char level, long int waittime)
{
/* Variables. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Sensa el estado del canal de comunicacin. */
result = modplc_physensechannel(hd->modplchd, iface, level, waittime);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve el resultado del sensado del canal de comunicacin. */
return result;
}
/*
Funcin modphy_gensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modphy_gensignal(modphy_hd *hd, unsigned char iface, int sig)
{
/* Variables. */
424
FernandoArielBeunza79156
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Genera la seal especificada. */
result = modplc_phygensignal(hd->modplchd, iface, sig);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve el resultado de la generacin de la seal. */
return result;
}
/*
Funcin modphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modphy_tstreceive(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Realiza una prueba de recepcin. */
result = modplc_phytstreceive(hd->modplchd, iface);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve el resultado de la prueba de recepcin. */
return result;
}
/*
Funcin modphy_status:
Devuelve el estado del modem PLC.
*/
int modphy_status(modphy_hd *hd)
{
/* Variables. */
int result;
/* Resultado de la operacin. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Obtiene el estado del modem PLC. */
result = modplc_status(hd->modplchd);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve el resultado del modem PLC. */
FernandoArielBeunza79156
425
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* Espera el permiso para poder acceder a la interfaz con el modem PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
/* Obtiene la cantidad mxima de bytes que puede contener una trama. */
payloadsize = modplc_phygetpayloadsize(hd->modplchd, iface);
/* Permite a otro hilos el acceso a la interfaz del modem PLC. */
ReleaseSemaphore(hd->mutexsem, 1, NULL);
/* Devuelve la cantidad mxima de bytes que puede contener una trama. */
return payloadsize;
}
426
FernandoArielBeunza79156
#if !defined(__MODDRV_H__)
#define __MODDRV_H__
/* Definicin de tipos. */
/* Estructura del manejador del driver del modem PLC. */
typedef struct
{
int port;
int layer;
int debugmode;
int stopflag;
/*
/*
/*
/*
/*
/*
moddl_hd *dlhd;
/*
modphy_hd *phyhd;
/*
Identificador de puerto. */
Capa del modem PLC utilizada. */
Indicador de modo depuracin. */
Indicador de detencin de
ejecucin del driver del modem
PLC. */
Cantidad de clientes activos. */
Manejador de interfaz con la
capa de sesin del modem PLC. */
Manejador de interfaz con la
capa de enlace del modem PLC. */
Manejador de interfaz con la
capa fsica del modem PLC. */
} moddrv_hd;
FernandoArielBeunza79156
427
#endif
/* Definicin de tipos. */
/* Estructura de informacin compartida entre hilos de ejecucin. */
typedef struct
{
HANDLE hq;
/* Manejador
mensajes.
HANDLE hm;
/* Manejador
exclusin
moddrv_hd *hd;
/* Manejador
PLC. */
} __moddrv_shareinf__;
de cola de
*/
de semforo de
mutua. */
del driver del modem
428
FernandoArielBeunza79156
sinf;
/* Identificador de hilo. */
/* Manejador de cola de
mensajes. */
/* Manejador de semforo de
exclusin mutua. */
/* Manejador de hilo. */
/* Nombre de la cola de
mensajes. */
/* Informacin compartida. */
FernandoArielBeunza79156
429
/* Manejador de cola de
mensajes. */
/* Capa que se solicita
utilizar. */
/* Respuesta a la solicitud. */
/* Nombre de la cola de
mensajes. */
430
FernandoArielBeunza79156
/* Manejador de cola de
mensajes. */
/* Manejador de semforo de
exclusin mutua. */
/* Capa que se solicita
utilizar. */
/* Respuesta a la solicitud. */
/* Manejador del driver del modem
PLC. */
/* Informacin compartida. */
FernandoArielBeunza79156
431
432
FernandoArielBeunza79156
FernandoArielBeunza79156
433
434
FernandoArielBeunza79156
FernandoArielBeunza79156
435
436
FernandoArielBeunza79156
FernandoArielBeunza79156
437
438
FernandoArielBeunza79156
FernandoArielBeunza79156
439
/*
/*
/*
/*
Respuesta a la solicitud. */
Cantidad de bytes. */
Identificador de grupo. */
Indicador de mensaje fuera de
secuencia. */
/* Puntero al mensaje recibido. */
440
FernandoArielBeunza79156
FernandoArielBeunza79156
441
442
FernandoArielBeunza79156
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port;
int debug;
moddrv_hd *hd;
char *option;
FernandoArielBeunza79156
443
444
FernandoArielBeunza79156
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCSP_H__)
#define __MODPLCSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcsp_grpid;
/* Manejador de interfaz con la capa de sesin del modem PLC. */
typedef struct
{
int hq;
/* Manejador de cola de
mensajes. */
pthread_mutex_t hm;
/* Semforo de exclusin mtua. */
pthread_t detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
size_t payloadsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
void (*recfun)
(void *, modplcsp_grpid,
void *, size_t, void *);
/* Funcin manejadora de mensajes
recibidos. */
void *param;
/* Parmetros para la funcin
manejadora de mensajes
FernandoArielBeunza79156
445
446
FernandoArielBeunza79156
#endif
/* Identificador de operacion. */
/* Capa a la que se quiere
accerder. */
/* Resultado de la solicitud. */
/* Cantidad mxima de bytes que
puede contener un mensaje. */
/* Manejador de interfaz con la
capa de sesin del modem PLC. */
/* Direccin del servidor. */
FernandoArielBeunza79156
447
/* Identificador de operacin. */
/* Resultado de la operacin. */
448
FernandoArielBeunza79156
FernandoArielBeunza79156
449
/* Identificador de operacin. */
/* Resultado de la operacin. */
450
FernandoArielBeunza79156
FernandoArielBeunza79156
451
452
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
453
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Identificador de operacin. */
/* Cantidad de bytes que puede
contener un mensaje. */
454
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Indicador de recepcin de un
mensaje. */
/* Tamao del mensaje. */
/* Identificador de grupo. */
/* Manejador de interfaz con la
capa de sesin del modem PLC. */
FernandoArielBeunza79156
455
/* Enva la operacin. */
sent = 0;
while((indata) && (sent < insize))
{
last = write(hq, indata + sent, insize - sent);
sent += last;
}
/* Recibe la respuesta. */
received = 0;
while((outdata) && (received < outsize))
{
last = read(hq, outdata + received, outsize - received);
received += last;
}
/* xito. */
return 1;
}
456
FernandoArielBeunza79156
#if !defined(__MODPLCPP_H__)
#define __MODPLCPP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcpp_grpid;
/* Tipo de mensaje. */
typedef unsigned char modplcpp_mtype;
/* Tipo de campo. */
typedef unsigned char modplcpp_ftype;
/* Estructura del mensaje. */
typedef struct
{
unsigned short int startoffset;
unsigned short int endoffset;
modplcpp_grpid grpid;
modplcpp_mtype mtype;
void *pphd;
unsigned char *dat;
/*
/*
/*
/*
/*
} modplcpp_msg;
/* Manejador de capa de presentacin. */
typedef struct
{
size_t payloadsize;
modplcpp_grpid grpid;
modplcsp_hd *modsphd;
void (*recfun)
(void *, modplcpp_msg *,
void *);
void *param;
modplcpp_msg buffer;
} modplcpp_hd;
/* Definicin de constantes. */
/* Tipo de mensaje. */
#define MODPLCPP_SECMSG
#define MODPLCPP_NOSECMSG
0x00
0x01
/* Tipos de datos. */
#define MODPLCPP_NULLTYPE
#define MODPLCPP_CHARTYPE
#define MODPLCPP_SINT8TYPE
#define MODPLCPP_UINT8TYPE
#define MODPLCPP_SINT16TYPE
#define MODPLCPP_UINT16TYPE
0x00
0x01
0x02
0x03
0x04
0x05
FernandoArielBeunza79156
457
0x06
0x07
0x08
458
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
459
/* Manejador de capa de
presentacin. */
460
FernandoArielBeunza79156
FernandoArielBeunza79156
461
462
FernandoArielBeunza79156
FernandoArielBeunza79156
463
464
FernandoArielBeunza79156
FernandoArielBeunza79156
465
466
FernandoArielBeunza79156
#if !defined(__MODPLCAP_H__)
#define __MODPLCAP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcap_grpid;
/* Identificador de mensaje. */
typedef unsigned short int modplcap_msgid;
/* Tipo de campo. */
typedef unsigned char modplcap_ftype;
/* Estructura del mensaje. */
typedef struct
{
modplcap_msgid msgid;
void *msg;
} modplcap_msg;
/* Manejador de capa de aplicacin. */
typedef struct
{
int msgflag;
modplcap_grpid grpid;
void *pphd;
FernandoArielBeunza79156
/* Identificador de mensaje. */
/* Puntero al mensaje. */
/* Indicador de mensaje en el
buffer. */
/* Identificador de grupo del
mensaje almacenado en el
buffer. */
/* Puntero al manejador de capa de
467
modplcap_msg buffer;
} modplcap_hd;
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAP_NULLTYPE
#define MODPLCAP_CHARTYPE
#define MODPLCAP_SINT8TYPE
#define MODPLCAP_UINT8TYPE
#define MODPLCAP_SINT16TYPE
#define MODPLCAP_UINT16TYPE
#define MODPLCAP_SINT32TYPE
#define MODPLCAP_UINT32TYPE
#define MODPLCAP_FLOATTYPE
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
468
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
469
/* Manejador de capa de
aplicacin. */
470
FernandoArielBeunza79156
FernandoArielBeunza79156
471
472
FernandoArielBeunza79156
FernandoArielBeunza79156
473
474
FernandoArielBeunza79156
Recibe el mensaje. */
(!modplcpp_getfield(msg, &type, &count, &msgid)) return;
(type != MODPLCPP_UINT16TYPE) return;
(count != 1) return;
FernandoArielBeunza79156
475
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCDL_H__)
#define __MODPLCDL_H__
/* Definicin de tipos. */
/* Direccin fsica del modem PLC. */
typedef unsigned char modplcdl_phyaddr[8];
/* Direccin lgica del modem PLC. */
typedef unsigned long int modplcdl_logaddr;
/* Manejador de interfaz con la capa de enlace del modem PLC. */
typedef struct
{
int hq;
/* Manejador de cola de
mensajes. */
pthread_mutex_t hm;
/* Semforo de exclusin mtua. */
unsigned char sid;
/* Identificador de interfaz de
comunicacin por puerto
serie. */
unsigned long int conncounter;
/* Contador de conexiones
abiertas. */
} modplcdl_hd;
476
FernandoArielBeunza79156
FernandoArielBeunza79156
477
#endif
478
FernandoArielBeunza79156
FernandoArielBeunza79156
479
/* Identificador de operacin. */
/* Resultado de la solicitud. */
480
FernandoArielBeunza79156
FernandoArielBeunza79156
481
/* Identificador de operacin. */
/* Resultado de la solicitud. */
482
FernandoArielBeunza79156
FernandoArielBeunza79156
483
484
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
485
486
FernandoArielBeunza79156
FernandoArielBeunza79156
487
488
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
489
void (*func)
(void *, modplcdl_phyaddr,
void *, size_t, void *);
unsigned char *msg;
/* Identificador de operacin. */
/* Resultado de la operacin. */
/* Indicador de captura de un
mensaje. */
/* Tamao del mensaje. */
/* Direccin de origen. */
/* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
490
FernandoArielBeunza79156
/* Enva la operacin. */
sent = 0;
while((indata) && (sent < insize))
{
last = write(hq, indata + sent, insize - sent);
sent += last;
}
/* Recibe la respuesta. */
received = 0;
while((outdata) && (received < outsize))
{
last = read(hq, outdata + received, outsize - received);
received += last;
}
/* xito. */
return 1;
}
FernandoArielBeunza79156
491
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCPHY_H__)
492
FernandoArielBeunza79156
/* Definicin de tipos. */
/* Manejador de interfaz con la capa fsica del modem PLC. */
typedef struct
{
int hq;
/* Manejador de cola de
mensajes. */
pthread_mutex_t hm;
/* Semforo de exclusin mtua. */
struct
{
pthread_t detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
void (*recfun)(void *,
void *);
/* Funcin manejadora de tramas
capturadas. */
void *param;
/* Parmetros para la funcin
manejadora de tramas
recibidas. */
} iface[256];
/* Tabla de interfaces fsicas. */
} modplcphy_hd;
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPLCPHY_NOISESIGNAL
#define MODPLCPHY_TESTSIGNAL1
#define MODPLCPHY_TESTSIGNAL2
0x01
0x02
0x03
FernandoArielBeunza79156
493
#endif
494
FernandoArielBeunza79156
"config.h"
<stdio.h>
<stdlib.h>
<unistd.h>
<string.h>
<pthread.h>
<sys/socket.h>
<sys/types.h>
<sys/un.h>
"modplcphy.h"
FernandoArielBeunza79156
495
/* Operacin. */
/* Resultado de la operacin. */
/* Identificadores de interfaces
fsicas. */
496
FernandoArielBeunza79156
FernandoArielBeunza79156
497
498
FernandoArielBeunza79156
FernandoArielBeunza79156
499
/* Identificador de operacin. */
/* Resultado de la operacin. */
500
FernandoArielBeunza79156
FernandoArielBeunza79156
501
502
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
503
504
FernandoArielBeunza79156
/* Identificador de operacin. */
/* Indicador de captura de una
trama. */
/* Contador. */
/* Identificadores de interfaces
fsicas. */
/* Manejador de interfaz con la
capa fsica del modem PLC. */
/* Manejador de captura de
tramas. */
FernandoArielBeunza79156
505
506
Archivo config.h: en este archivo se definen parmetros de configuracin del driver del
del modem PLC que no pueden ser modificados en tiempo de ejecucin.
FernandoArielBeunza79156
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
'#'
'?'
'$'
'>'
/* Tipos de reset. */
#define MODPLC_NORMRESET
#define MODPLC_PARAMRESET
'0'
'$'
FernandoArielBeunza79156
507
MODPLC_NORMRESET
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'a'
/* Tipos de seal. */
#define MODPLCPHY_NOISESIGNAL
#define MODPLCPHY_TESTSIGNAL1
#define MODPLCPHY_TESTSIGNAL2
0x01
0x02
0x03
MODPLC_NORMRESET
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'a'
MODPLC_NORMRESET
'1'
'2'
'3'
'4'
'5'
'6'
'7'
508
FernandoArielBeunza79156
4096
#endif
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
/* Definicin de tipos. */
/* Manejador de interfaz de comunicacin por puerto serie. */
typedef struct
{
int serialhd;
/* Manejador de interfaz de puerto
serie. */
struct termios oldtio;
/* Antigua configuracin de la
interfaz de puerto serie. */
struct termios newtio;
/* Nueva configuracin de la
interfaz de puerto serie. */
} serial_hd;
FernandoArielBeunza79156
509
#endif
/* Manejador de la interfaz. */
/* Nombre de la interfaz. */
510
FernandoArielBeunza79156
FernandoArielBeunza79156
511
#if !defined(__MODPLC_H__)
#define __MODPLC_H__
/* Definicin de tipos. */
/* Direccin fsica del modem PLC. */
512
FernandoArielBeunza79156
int layer;
int status;
int debugmode;
} modplc_hd;
/* Manejador de interfaz de
comunicacin por puerto
serie. */
/* Capa del modem PLC utilizada. */
/* Estado del modem PLC. */
/* Indicador de modo depuracin. */
/* Definicin de constantes. */
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER
#define MODPLC_DATALINKLAYER
#define MODPLC_SESSIONLAYER
0x01
0x02
0x03
/* Tipos de seales. */
#define MODPLC_PHYNOISESIGNAL
#define MODPLC_PHYTESTSIGNAL1
#define MODPLC_PHYTESTSIGNAL2
0x01
0x02
0x03
FernandoArielBeunza79156
513
514
FernandoArielBeunza79156
FernandoArielBeunza79156
515
#endif
/* Smbolo de la lnea de
comando. */
/* Manejador de interfaz con el
modem PLC. */
/* Lnea de comando. */
/* Lnea de respuesta de
comando. */
516
FernandoArielBeunza79156
FernandoArielBeunza79156
517
518
FernandoArielBeunza79156
FernandoArielBeunza79156
519
comando. */
/* Parmetros de salida del
comando. */
"b",
}
/*
Funcin modplc_phyrsdframe:
Reenva una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phyrsdframe(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
520
FernandoArielBeunza79156
FernandoArielBeunza79156
521
522
FernandoArielBeunza79156
"s", outparam,
}
/*
Funcin modplc_dlclose:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlclose(modplc_hd *hd, int handle)
{
/* Variables. */
unsigned char result;
void *inparam[2];
void *outparam[1];
"b", outparam,
}
/*
Funcin modplc_dlsend:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlsend(modplc_hd *hd, int handle, modplc_dlphyaddr addr,
unsigned char prio, const void *msg, size_t msgsize)
{
/* Variables. */
void *inparam[4];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
FernandoArielBeunza79156
523
"s", outparam,
}
/*
Funcin modplc_dlreceive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlreceive(modplc_hd *hd, int handle, modplc_dlphyaddr addr,
void *msg, size_t msgsize)
{
/* Variables. */
void *inparam[2];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
"as", outparam,
}
/*
Funcin modplc_dlpoll:
Verifica la llegada de un nuevo mensaje por medio de la capa de enlace del
modem PLC.
*/
int modplc_dlpoll(modplc_hd *hd, int handle)
{
/* Variables. */
unsigned char result;
void *inparam[1];
void *outparam[1];
"b", outparam,
}
/*
Funcin modplc_dlgetaddress:
524
FernandoArielBeunza79156
"a", outparam,
}
/*
Funcin modplc_dladdlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int modplc_dladdlogaddress(modplc_hd *hd, unsigned char iface,
unsigned char prot, modplc_dllogaddr laddr)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[3];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
"b", outparam,
}
/*
Funcin modplc_dldellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int modplc_dldellogaddress(modplc_hd *hd, unsigned char iface,
unsigned char prot, modplc_dllogaddr laddr)
{
/* Variables. */
unsigned char result;
/* Resultado del comando. */
void *inparam[3];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
FernandoArielBeunza79156
525
"b", outparam,
}
/*
Funcin modplc_dlgetphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa
de enlace del modem PLC.
*/
int modplc_dlgetphyaddress(modplc_hd *hd, unsigned char iface,
unsigned char prot, modplc_dllogaddr laddr,
modplc_dlphyaddr paddr)
{
/* Variables. */
void *inparam[3];
/* Parmetros de entrada del
comando. */
void *outparam[1];
/* Parmetros de salida del
comando. */
526
FernandoArielBeunza79156
FernandoArielBeunza79156
527
"s", outparam,
}
/*
Funcin modplc_spreceive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spreceive(modplc_hd *hd, modplc_spgrpid *grpid, void *msg,
size_t msgsize)
{
/* Variables. */
void *inparam[1];
/* Parmetros de entrada del
comando. */
528
FernandoArielBeunza79156
"bs", outparam,
}
/*
Funcin modplc_sppoll:
Verifica la llegada de un nuevo mensaje por medio de la capa de sesin
del modem PLC.
*/
int modplc_sppoll(modplc_hd *hd)
{
/* Variables. */
unsigned char result;
void *outparam[1];
}
/*
Funcin modplc_spgetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de sesin del modem PLC.
*/
size_t modplc_spgetpayloadsize(modplc_hd *hd)
{
/* Variables. */
unsigned short int payloadsize;
void *outparam[1];
FernandoArielBeunza79156
529
530
FernandoArielBeunza79156
FernandoArielBeunza79156
531
532
FernandoArielBeunza79156
FernandoArielBeunza79156
533
#if !defined(__MODSP_H__)
#define __MODSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modsp_grpid;
/* Manejador de interfaz con la capa de sesin del modem PLC. */
typedef struct
{
pthread_mutex_t mutexsem;
/* Semforo de exclusin mtua. */
pthread_t detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
size_t payloadsize;
/* Cantidad mxima de bytes que
puede contener un mensaje. */
modplc_hd *modplchd;
/* Manejador de interfaz con el
modem PLC. */
void (*recfun)
(void *, modsp_grpid,
void *, size_t, void *);
/* Funcin manejadora de mensajes
recibidos. */
void *param;
/* Parmetros para la funcin
manejadora de mensajes
recibidos. */
} modsp_hd;
534
FernandoArielBeunza79156
FernandoArielBeunza79156
535
#endif
536
FernandoArielBeunza79156
/* Resultado de la operacin. */
FernandoArielBeunza79156
537
/* Resultado de la operacin. */
/* Resultado de la operacin. */
538
FernandoArielBeunza79156
FernandoArielBeunza79156
539
/* Resultado de la operacin. */
/* Resultado de la operacin. */
540
FernandoArielBeunza79156
/* Indicador de recepcin de un
mensaje. */
/* Tamaoo del mensaje recibido. */
/* Identificador de grupo. */
/* Manejador de interfaz con la
capa de sesin del modem PLC. */
/* Manejador de mensajes
recibidos. */
/* Puntero al mensaje recibido. */
FernandoArielBeunza79156
541
#if !defined(__MODDL_H__)
#define __MODDL_H__
/* Definicin de tipos. */
/* Direccin fsica del modem PLC. */
typedef unsigned char moddl_phyaddr[8];
/* Direccin lgica del modem PLC. */
542
FernandoArielBeunza79156
FernandoArielBeunza79156
543
#endif
544
FernandoArielBeunza79156
FernandoArielBeunza79156
545
546
FernandoArielBeunza79156
FernandoArielBeunza79156
547
548
FernandoArielBeunza79156
/* Resultado de la operacin. */
FernandoArielBeunza79156
549
550
FernandoArielBeunza79156
/* Resultado de la operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
551
void (*func)
(void *, moddl_phyaddr,
void *, size_t, void *);
unsigned char *msg;
/* Indicador de recepcin de un
mensaje. */
/* Tamao del mensaje recibido. */
/* Direccin fsica de origen del
mensaje. */
/* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
/* Manejador de mensajes
recibidos. */
/* Puntero al mensaje recibido. */
552
FernandoArielBeunza79156
#if !defined(__MODPHY_H__)
#define __MODPHY_H__
/* Definicin de tipos. */
/* Manejador de interfaz con la capa fsica del modem PLC. */
typedef struct
{
pthread_mutex_t mutexsem;
/* Semforo de exclusin mtua. */
modplc_hd *modplchd;
/* Manejador de interfaz con el
modem PLC. */
struct
{
pthread_t detectthread;
/* Manejador de hilo de deteccin
de recepcin. */
void (*recfun)
(void *, void *);
/* Funcin manejadora de tramas
capturadas. */
void *param;
/* Parmetros para la funcin
manejadora de tramas
recibidos. */
} iface[256];
/* Tabla de interfaces fsicas. */
} modphy_hd;
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPHY_NOISESIGNAL
#define MODPHY_TESTSIGNAL1
#define MODPHY_TESTSIGNAL2
0x01
0x02
0x03
FernandoArielBeunza79156
553
554
FernandoArielBeunza79156
#endif
/* Identificadores de interfaces
fsicas. */
/* Manejador de interfaz con la
capa fsica del modem PLC. */
FernandoArielBeunza79156
555
/* Identificadores de interfaces
fsicas. */
556
FernandoArielBeunza79156
FernandoArielBeunza79156
557
/* Resultado de la operacin. */
558
FernandoArielBeunza79156
/* Resultado de la operacin. */
/* Resultado de la operacin. */
FernandoArielBeunza79156
559
/* Resultado de la operacin. */
560
FernandoArielBeunza79156
/* Resultado de la operacin. */
FernandoArielBeunza79156
561
562
FernandoArielBeunza79156
#if !defined(__MODDRV_H__)
#define __MODDRV_H__
/* Definicin de tipos. */
/* Estructura del manejador del driver del modem PLC. */
typedef struct
{
int port;
int layer;
int debugmode;
int stopflag;
/*
/*
/*
/*
/*
/*
moddl_hd *dlhd;
/*
modphy_hd *phyhd;
/*
Identificador de puerto. */
Capa del modem PLC utilizada. */
Indicador de modo depuracin. */
Indicador de detencin de
ejecucin del driver del modem
PLC. */
Cantidad de clientes activos. */
Manejador de interfaz con la
capa de sesin del modem PLC. */
Manejador de interfaz con la
capa de enlace del modem PLC. */
Manejador de interfaz con la
capa fsica del modem PLC. */
} moddrv_hd;
#endif
FernandoArielBeunza79156
563
/* Definicin de tipos. */
/* Estructura de informacin compartida entre hilos de ejecucin. */
typedef struct
{
int hq;
/* Manejador
mensajes.
pthread_mutex_t hm;
/* Manejador
exclusin
moddrv_hd *hd;
/* Manejador
PLC. */
} __moddrv_shareinf__;
de cola de
*/
de semforo de
mutua. */
del driver del modem
564
FernandoArielBeunza79156
/* Manejador de espera de
conexin. */
/* Manejador de cola de
mensajes. */
/* Manejador de semforo de
exclusin mutua. */
/* Manejador de hilo. */
/* Nombre de la cola de
mensajes. */
/* Informacin compartida. */
/* Longitud de direccin del
cliente. */
/* Direccin del cliente. */
/* Direccin del servidor. */
FernandoArielBeunza79156
565
/* Manejador de cola de
mensajes. */
/* Capa que se solicita
utilizar. */
/* Respuesta a la solicitud. */
/* Direccin del servidor. */
566
FernandoArielBeunza79156
/* Manejador de cola de
mensajes. */
/* Manejador de semforo de
exclusin mutua. */
/* Capa que se solicita
utilizar. */
/* Respuesta a la solicitud. */
/* Manejador del driver del modem
PLC. */
/* Informacin compartida. */
FernandoArielBeunza79156
567
568
FernandoArielBeunza79156
FernandoArielBeunza79156
569
570
FernandoArielBeunza79156
FernandoArielBeunza79156
571
572
FernandoArielBeunza79156
FernandoArielBeunza79156
573
574
FernandoArielBeunza79156
FernandoArielBeunza79156
575
576
FernandoArielBeunza79156
FernandoArielBeunza79156
577
578
FernandoArielBeunza79156
FernandoArielBeunza79156
579
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port;
int debug;
moddrv_hd *hd;
char *option;
580
FernandoArielBeunza79156
/* Cadena de salida. */
/* Puntero a la cadena de
entrada. */
/* Puntero a la cadena de
salida. */
FernandoArielBeunza79156
581
582
Archivo llc.h: en este archivo se declaran las primitivas referentes a la subcapa de control
de lgica de enlace (subcapa LLC), perteneciente a la capa de enlace. Dichas primitivas
brindan la capacidad de enviar y recibir mensajes manteniendo el control de flujo de los
mismos.
FernandoArielBeunza79156
Archivo dl.h: en este archivo se declaran las primitivas referentes a la interfaz de la capa
de enlace. Dichas primitivas renen las funcionalidades provistas por la subcapa de
control de lgica de enlace (subcapa LLC) y el protocolo de resolucin de direcciones
(ARP).
FernandoArielBeunza79156
583
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
11059200UL
/* Capa de fsica. */
/* Mxima cantidad de bytes que puede almacenar el buffer. */
#define PHY_PAYLOADSIZE
400
/* Cdigo de operacin de envo de trama. */
#define PHY_SNDFRMOP
0xa9
0xab
0xac
0xaf
0xba
0xbb
0xbc
0x7e
20
(MAC_UNITTIME * 100)
10
100
584
0xff
FernandoArielBeunza79156
MAC_BROADCASTADDR_1
MAC_BROADCASTADDR_2
MAC_BROADCASTADDR_3
MAC_BROADCASTADDR_4
MAC_BROADCASTADDR_5
MAC_BROADCASTADDR_6
MAC_BROADCASTADDR_7
0xff
0xff
0xff
0xff
0xff
0xff
0xff
0x01
0x02
/* Protocolos. */
#define LLC_ARPPROT
#define LLC_UNUSEDPROT
0x01
0x02
20
0x01
0x02
/* Protocolos. */
#define ARP_UNUSEDPROT
0x01
/* Capa de red. */
/* Mxima cantidad de bytes que puede contener un mensaje. */
#define NET_PAYLOADSIZE
1500
/* Identificador de protocolo de red. */
#define NET_PROTID
0x01
/* Capa de transporte. */
/* Tamao del buffer de mensajes. */
#define TP_BUFFERSIZE
(14 * 1024)
0x01
FernandoArielBeunza79156
585
20
/* Capa de sesin. */
/* Versin del protocolo de transporte. */
#define SP_VERSION
80
'#'
'?'
'$'
'>'
/* Tipos de reset. */
#define MODPLC_NORMRESET
#define MODPLC_PARAMRESET
"0"
'$'
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER
#define MODPLC_DATALINKLAYER
#define MODPLC_SESSIONLAYER
"1"
"2"
"3"
MODPLC_NORMRESET
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"a"
/* Tipos de seal. */
#define MODPLCPHY_NOISESIGNAL
#define MODPLCPHY_TESTSIGNAL1
#define MODPLCPHY_TESTSIGNAL2
0x01
0x02
0x03
MODPLC_NORMRESET
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"a"
MODPLC_NORMRESET
"1"
"2"
"3"
"4"
"5"
"6"
"7"
586
FernandoArielBeunza79156
#endif
#if !defined(___COMMON_H__)
#define ___COMMON_H__
#endif
FernandoArielBeunza79156
;
;
;
;
;
;
;
587
#include "../common/serial.h"
#include "../common/serial.c"
#if !defined(__PHY_H__)
#define __PHY_H__
588
FernandoArielBeunza79156
FernandoArielBeunza79156
589
#endif
/* Variables globales. */
/* Buffer de envo de un byte. */
static __data unsigned char __phy_buffbyte__;
/* Funcin manejadora de tramas capturadas. */
static void (*__phy_recfun__)(void) __reentrant;
590
FernandoArielBeunza79156
FernandoArielBeunza79156
;
;
591
592
FernandoArielBeunza79156
FernandoArielBeunza79156
593
;
;
594
FernandoArielBeunza79156
FernandoArielBeunza79156
595
;
;
}
wait_usecs(1000);
/* Espera durante el tiempo especificado la ocupacin del canal
comunicacin. */
while(P3 & 0x04)
{
wait_usecs(66);
if (usecs < ((66 * F_CPU) / 11059200UL)) break;
usecs -= ((66 * F_CPU) / 11059200UL);
}
busych = 2;
if (P3 & 0x04) busych = 1;
__phy_sendop__(0x00);
/* Restaura el estado de las interrupciones. */
EA = ea;
/* No se detect ocupacin del canal de comunicacin. */
return busych;
}
/*
Funcin phy_gennoisesignal:
Genera una seal de ruido.
*/
int phy_gennoisesignal(void)
{
return __phy_sendop__(PHY_GENNOISEOP);
}
/*
Funcin phy_tstsignal1:
Genera una seal de prueba 1.
*/
int phy_tstsignal1(void)
{
return __phy_sendop__(PHY_TSTSIGOP1);
}
/*
Funcin phy_tstsignal2:
Genera una seal de prueba 2.
*/
int phy_tstsignal2(void)
{
return __phy_sendop__(PHY_TSTSIGOP2);
}
/*
Funcin phy_tstreceive:
Realiza una prueba de recepcin.
*/
int phy_tstreceive(void)
{
return __phy_sendop__(PHY_TSTRCVOP);
}
596
FernandoArielBeunza79156
/* Contador. */
/* Sincronizacin. */
P1 &= 0xfd;
for(i = 0; i < 0x4000; i++)
{
__asm
mov
_WDTRST, #0x1e
mov
_WDTRST, #0xe1
__endasm;
if (!(P3 & 0x04)) break;
}
if (P3 & 0x04) return 0;
/* Envo del byte. */
__asm
push
push
nop
mov
clr
rlc
mov
setb
nop
acc
psw
a, ___phy_buffbyte__
P1.1
a
P1.0, C
P1.1
FernandoArielBeunza79156
/* Contador. */
;
;
;
;
;
; Carga el byte a enviar.
; Enva el bit 0.
;
;
;
;
597
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0, C
P1.1
C, P3.4
P1.1
a
P1.0
___phy_buffbyte__, a
psw
acc
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Enva el bit 1.
Enva el bit 2.
Enva el bit 3.
Enva el bit 4.
Enva el bit 5.
Enva el bit 6.
Enva el bit 7.
Fin.
__endasm;
return 1;
}
/*
Funcin __phy_sendop__:
Enva una solicitud de ejecucin de una operacin.
*/
static int __phy_sendop__(unsigned char op)
{
/* Variables. */
register unsigned char ea;
/* Reinicia el watchdog. */
reset_watchdog();
/* Desactiva las interruciones. */
ea = EA;
EA = 0;
598
FernandoArielBeunza79156
#if !defined(__MAC_H__)
#define __MAC_H__
/* Definicin de tipos. */
/* Direccin fsica de dispositivo. */
typedef unsigned char mac_addr[8];
/* Encabezado del mensaje. */
typedef struct
{
unsigned char delimiter;
mac_addr src_addr;
mac_addr dest_addr;
unsigned char type;
unsigned char protocol;
unsigned char fragment;
unsigned short int size;
unsigned short int total_size;
} __mac_header__;
/*
/*
/*
/*
/*
/*
/*
/*
/*
/* Definicin de constantes. */
#define MAC_HEADERSIZE
#define MAC_FCSSIZE
sizeof(__mac_header__)
sizeof(unsigned short int)
Comienzo de mensaje. */
Direccin de origen. */
Direccin de destino. */
Tipo de mensaje. */
Identificador de protocolo. */
Nmero de fragmento. */
Tamao del mensaje. */
Tamao total. */
Encabezado del mensaje. */
/* Direccin de broadcast. */
static __code mac_addr __mac_broadcastaddr__ = {
MAC_BROADCASTADDR_0, MAC_BROADCASTADDR_1,
MAC_BROADCASTADDR_2, MAC_BROADCASTADDR_3,
MAC_BROADCASTADDR_4, MAC_BROADCASTADDR_5,
FernandoArielBeunza79156
599
#endif
600
FernandoArielBeunza79156
/* Definicin de constantes. */
/* Tamao de un mensaje corto. */
#define MAC_SMSGSIZE
(2 * (MAC_HEADERSIZE + \
MAC_FCSSIZE))
(PHY_PAYLOADSIZE - \
MAC_HEADERSIZE - MAC_FCSSIZE)
/* Variables globales. */
/* Tamao del mensaje almacenado en el primer buffer. */
static volatile short int __mac_msg_size1__;
/* Tamao del mensaje almacenado en el segundo buffer. */
static volatile short int __mac_msg_size2__;
/* ltimo nmero de fragmento recibido. */
static volatile short int __mac_msg_last_frag__;
/* Tamao del ltimo fragmento recibido. */
static volatile short int __mac_msg_last_frag_size__;
/* Direccin de origen del mensaje recibido. */
static volatile mac_addr __mac_msg_address__;
/* Contador de errores ocurridos. */
static volatile unsigned char __mac_errors__;
/* Identificador de protocolo del mensaje recibido. */
static volatile unsigned char __mac_msg_protocol__;
/* Valor del ltimo nmero pseudoaleatorio generado. */
static unsigned char __mac_randnum__;
/* Tabla de bloqueo de protocolos. */
static volatile __mac_prot_block__[32];
/* Primer buffer de recepcin de mensajes. */
static volatile unsigned char __mac_msg_buffer1__[MAC_PAYLOADSIZE];
/* Segundo buffer de recepcin de mensajes. */
static volatile unsigned char __mac_msg_buffer2__[MAC_PAYLOADSIZE];
/* Funcin manejadora de mensajes recibidos. */
static void (*__mac_recfun__)(mac_addr, unsigned char, void *, short int)
FernandoArielBeunza79156
601
602
FernandoArielBeunza79156
/* Indicador de reenvo. */
/* Resultado del envo. */
/* Estado del canal de
comunicacin. */
/* Espera. */
/* Cantidad de bytes a enviar. */
/* Tamao del fragmento. */
/* Nmero de fragmento. */
/* Cantidad de reintentos de
envo. */
/* Puntero al mensaje a enviar. */
FernandoArielBeunza79156
603
604
FernandoArielBeunza79156
FernandoArielBeunza79156
605
606
FernandoArielBeunza79156
/* Indicador de error. */
/* Resultado de la recepcin del
mensaje. */
/* Tamao del mensaje recibido. */
/* Tamao total del mensaje. */
/* Tipo del mensaje recibido. */
/* Identificador de protocolo. */
/* Nmero de fragmento. */
/* Direccin de origen del
mensaje. */
/* Direccin de destino del
mensaje. */
FernandoArielBeunza79156
607
608
FernandoArielBeunza79156
FernandoArielBeunza79156
609
610
FernandoArielBeunza79156
#if !defined(__LLC_H__)
#define __LLC_H__
/* Definicin de tipos. */
/* Direccin fsica de dispositivo. */
typedef mac_addr llc_addr;
/* Definicin de constantes. */
#define LLC_FCSSIZE
#define LLC_PAYLOADSIZE
#define __llc_broadcastaddr__
FernandoArielBeunza79156
611
#endif
612
FernandoArielBeunza79156
<string.h>
"common.h"
"mac.h"
"llc.h"
/* Variables globales. */
/* Tabla de conexiones. */
static volatile struct llc_table
{
unsigned char protocol;
llc_addr src_addr;
short int size;
unsigned char buffer[LLC_PAYLOADSIZE];
void (*recfun)
(llc_addr, void *, short int)
__reentrant;
/* Protocolo. */
/* Direccin de origen. */
/* Tamao del mensaje almacenado en
el buffer. */
/* Buffer de recepcin de
mensajes. */
} __llc_table__[LLC_CONNECTIONS];
/* Nmero de conexin. */
/* Nmero de conexin. */
FernandoArielBeunza79156
613
614
FernandoArielBeunza79156
FernandoArielBeunza79156
615
/* Nmero de conexin. */
616
FernandoArielBeunza79156
#if !defined(__ARP_H__)
#define __ARP_H__
/* Definicin de tipos. */
typedef unsigned long int arp_logaddr;
#endif
FernandoArielBeunza79156
617
/* Definicin de tipos. */
/* Mensaje ARP. */
typedef struct
{
unsigned char type;
unsigned char protocol;
arp_logaddr address;
} __arp_msg__;
/* Tipos de mensaje. */
/* Protocolo. */
/* Direccin lgica. */
/* Variables globales. */
/* Manejador de conexin para ARP. */
static volatile int __arp_conn__;
/* Tabla de direcciones. */
static volatile struct arp_table
{
unsigned char protocol;
arp_logaddr address;
} __arp_table__[ARP_ADDRESS];
/* Protocolo. */
/* Direccin. */
/* Nmero de direccin. */
618
FernandoArielBeunza79156
/* Nmero de direccin. */
/* Nmero de direccin. */
FernandoArielBeunza79156
619
llc_addr src_addr;
llc_addr llc_address;
__arp_msg__ msg;
/* Nmero de direccin. */
/* Resultado de la solicitud de
direccin fsica. */
/* Cantidad de reintentos de
solicitud de direccin
fsica. */
/* Direccin de origen del mensaje
de respuesta. */
/* Direccin del dispositivo. */
/* Mensaje ARP. */
620
FernandoArielBeunza79156
#if !defined(__DL_H__)
#define __DL_H__
FernandoArielBeunza79156
621
/* Definicin de tipos. */
/* Direccin fsica de dispositivo. */
typedef llc_addr dl_addr;
/* Direccin lgica de dispositivo. */
typedef arp_logaddr dl_logaddr;
/* Definicin de constantes. */
#define DL_PAYLOADSIZE
LLC_PAYLOADSIZE
622
FernandoArielBeunza79156
#endif
FernandoArielBeunza79156
623
624
FernandoArielBeunza79156
#if !defined(__NET_H__)
#define __NET_H__
/* Definicin de tipos. */
/* Identificador de mensaje. */
typedef unsigned char net_msgid;
/* Identificador de nodo. */
typedef unsigned long int net_nodeid;
/* Encabezado del mensaje. */
typedef struct
{
unsigned char version;
net_msgid msgid;
unsigned char protocol;
unsigned short int size;
} __net_header__;
/* Definicin de constantes. */
#define NET_HEADERSIZE
#define NET_FCSSIZE
/* Versin de protocolo. */
/* Identificador de mensaje. */
/* Protocolo del contenido del
mensaje. */
/* Tamao del mensaje. */
sizeof(__net_header__)
sizeof(unsigned short int)
FernandoArielBeunza79156
625
#endif
626
FernandoArielBeunza79156
/* Variables globales. */
/* Tamao del mensaje almacenado en el primer buffer. */
static volatile short int __net_msg_size__;
/* Identificador de mensaje recibido. */
static net_msgid __net_msg_id__;
/* Protocolo del mensaje almacenado recibido. */
static volatile unsigned char __net_msg_protocol__;
/* Tabla de interfaces. */
static struct net_interfacetable
{
int hd;
unsigned char msgfilter[32];
} __net_interfacetable__[NET_PHYINTERFACES];
/* Manejador de conexin. */
/* Filtro de mensajes. */
/* Identificador de interface. */
/* ndice de filtro de mensajes. */
FernandoArielBeunza79156
627
/* Identificador de interface. */
628
FernandoArielBeunza79156
=
=
=
=
=
=
=
0xff;
0xff;
0xff;
0xff;
0xff;
0xff;
0xff;
}
/* Verifica el tamao del mensaje. */
if (msgsize > (dl_getpayloadsize(iface) - NET_HEADERSIZE NET_FCSSIZE))
continue;
/* Enva el fragmento del mensaje. */
if (__net_send__(iface, dest_addr, msgid, prio, prot, msgsize, msg) ==
msgsize)
ack = 1;
}
/* Devuelve el tamao del mensaje enviado. */
if (ack) return msgsize;
return 0;
}
/*
Funcin net_receive:
Recibe un mensaje por medio de la capa de red.
*/
short int net_receive(net_msgid *msgid, unsigned char *prot, void *msg,
short int msgsize)
{
/* Variables. */
unsigned char iface;
/* Identificador de interface. */
FernandoArielBeunza79156
629
/* Identificador de interface. */
/* Identificador de interface. */
/* Resultado. */
/* Identificador de interface. */
630
FernandoArielBeunza79156
/* Resultado. */
/* Identificador de interface. */
/* Identificador de interface. */
FernandoArielBeunza79156
631
632
FernandoArielBeunza79156
#if !defined(__TP_H__)
#define __TP_H__
FernandoArielBeunza79156
633
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char tp_grpid;
/* Encabezado del mensaje. */
typedef struct
{
unsigned char version;
char sequence;
} __tp_header__;
/* Definicin de constantes. */
#define TP_HEADERSIZE
#define TP_PAYLOADSIZE
sizeof(__tp_header__)
(NET_PAYLOADSIZE - TP_HEADERSIZE)
634
FernandoArielBeunza79156
#endif
/* Definicin de tipos. */
/* Tipo cola de mensajes. */
typedef struct
{
void *next;
tp_grpid grpid;
short int size;
} __tp_msg_fifo__;
/* Variables globales. */
/* Estado del nodo. */
static volatile unsigned char __tp_status__;
/* Tabla de grupos del cual el nodo es propietario. */
static volatile unsigned char __tp_ownergrptable__[32];
/* Buffer de recepcin de mensajes. */
static volatile unsigned char __tp_msg_buffer__[TP_BUFFERSIZE];
/* Puntero al mensaje a despachar. */
static volatile __tp_msg_fifo__ *__tp_msg__;
/* Tabla de nmeros de secuencia. */
static volatile char __tp_sectable__[256];
FernandoArielBeunza79156
635
/* Contador. */
636
FernandoArielBeunza79156
FernandoArielBeunza79156
637
638
FernandoArielBeunza79156
FernandoArielBeunza79156
639
640
FernandoArielBeunza79156
#if !defined(__SP_H__)
#define __SP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char sp_grpid;
/* Encabezado del mensaje. */
typedef struct
{
unsigned char version;
} __sp_header__;
/* Definicin de constantes. */
#define SP_HEADERSIZE
#define SP_PAYLOADSIZE
sizeof(__sp_header__)
(TP_PAYLOADSIZE - SP_HEADERSIZE)
FernandoArielBeunza79156
641
#endif
/* Variables globales. */
/* Tamao del mensaje almacenado en el buffer. */
static volatile short int __sp_msg_size__;
/* Identificador de grupo al que pertenece el mensaje recibido. */
static sp_grpid __sp_msg_grpid__;
/* Buffer de recepcin de mensajes. */
static volatile unsigned char __sp_msg_buffer__[SP_PAYLOADSIZE];
/* Funcin manejadora de mensajes recibidos. */
static void (*__sp_recfun__)(sp_grpid, void *, short int) __reentrant;
642
FernandoArielBeunza79156
FernandoArielBeunza79156
643
644
FernandoArielBeunza79156
FernandoArielBeunza79156
645
/*
Funcin main:
Funcin principal.
*/
void main(void)
{
/* Variables. */
char line[MODPLC_CMDLINESIZE];
/* Lnea de comandos. */
646
FernandoArielBeunza79156
/*
/*
/*
/*
/*
FernandoArielBeunza79156
647
648
FernandoArielBeunza79156
FernandoArielBeunza79156
/*
/*
/*
/*
/*
/*
/*
Manejador de conexin. */
Tamao del mensaje. */
Direccin DL. */
Direccin lgica. */
Prioridad del mensaje. */
Identificador de protocolo. */
Identificador de interfaz
fsica. */
/* Puntero a la direccin
lgica. */
/* Lnea de comandos. */
649
/* Mensaje de prueba. */
650
FernandoArielBeunza79156
FernandoArielBeunza79156
651
652
FernandoArielBeunza79156
FernandoArielBeunza79156
653
654
FernandoArielBeunza79156
FernandoArielBeunza79156
655
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
11059200UL
/* Capa de fsica. */
/* Mxima cantidad de bytes que puede almacenar el buffer. */
#define PHY_PAYLOADSIZE
400
/* Cdigo de operacin de envo de trama. */
#define PHY_SNDFRMOP
0xa9
0xab
0xac
0xaf
0xba
0xbb
0xbc
#endif
#if !defined(__PHY_H__)
#define __PHY_H__
656
FernandoArielBeunza79156
#endif
/* Definicin de constantes. */
/* Nivel de tensin por defecto del generador de seal. */
#define PHY_SIGGENLEVEL
0x07
/* Nivel de tensin por defecto del umbral de deteccin. */
#define PHY_THGENLEVEL
0x09
/* Tiempo mximo de espera entre bytes recibidos. */
#define PHY_TIMEOUTBITS
24
FernandoArielBeunza79156
657
/* Variables globales. */
/* Cdigo de operacin. */
static volatile uint8_t __phy_buffop__;
/* Cantidad de bytes almacenados en el buffer. */
static volatile uint16_t __phy_buffsize__;
/* Puntero al contenido del buffer. */
static volatile uint8_t *__phy_buffdata__;
/* Buffer de trama. */
static volatile uint8_t __phy_buffer__[PHY_PAYLOADSIZE +
sizeof(__phy_startpattern__) +
sizeof(__phy_endpattern__)];
658
FernandoArielBeunza79156
FernandoArielBeunza79156
659
660
FernandoArielBeunza79156
/* Byte recibido. */
/* Recibe un byte. */
asm volatile("\
push
push
push
push
clr
ldi
L_wait1%=:
in
andi
out
sbis
rjmp
nop
;
;
;
;
;
;
;
;
;
;
;
;
r16
r17
r18
r19
r19
r18, 0x08
r16, %0
r16, (1 << %1) | (1 << %2)
%3, r16
%0, %1
L_wait1%=
FernandoArielBeunza79156
Inicializa el buffer de
bits recibidos.
Espera comienzo de pulso
de sincronismo
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
661
L_wait2%=:
L_end0%=:
L_end1%=:
in
andi
nop
nop
nop
out
andi
lsr
or
clz
ldi
nop
nop
nop
nop
nop
nop
breq
dec
nop
nop
nop
nop
nop
nop
sbic
rjmp
dec
breq
lsl
rjmp
st
ldi
out
pop
pop
pop
pop
:
:
r16, %0
r16, (1 << %1) | (1 << %2)
%3, r16
r16, (1 << %2)
r16
r19, r16
r17, %4
L_end0%=
r17
%0, %1
L_wait2%=
r18
L_end1%=
r19
L_wait1%=
x, r19
r16, (1 << %1) | (1 << %2)
%3, r16
r19
r18
r17
r16
"I"
"I"
"I"
"I"
"M"
"x"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Verifica si se completo
el byte.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
_SFR_IO_ADDR(PINE),
(0),
(1),
_SFR_IO_ADDR(PORTB),
((PHY_TIMEOUTBITS * 5)),
(&dat)
);
/* Devuelve el byte recibido. */
return dat;
}
/*
Funcin __phy_sendbyte__:
Enva un byte al mdulo procesamiento.
*/
static uint8_t __phy_sendbyte__(uint8_t b)
{
/* Variables. */
static uint8_t dat;
/* Byte a enviar. */
/* Enva un byte. */
dat = b;
asm volatile("\
push
push
push
push
ld
ldi
L_wait1%=:
in
;
;
;
;
;
;
;
662
r16
r17
r18
r19
r19, x
r18, 0x08
r16, %0
Inicializa el buffer de
bits recibidos.
Espera comienzo de pulso
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_sndbit0%=:
L_wait2%=:
L_end0%=:
L_end1%=:
andi
out
sbis
rjmp
nop
in
andi
rol
brcc
ori
out
clz
ldi
nop
nop
nop
nop
nop
nop
nop
nop
breq
dec
nop
nop
nop
nop
nop
nop
sbic
rjmp
dec
breq
nop
rjmp
ldi
out
pop
pop
pop
pop
:
:
L_end0%=
r17
%0, %1
L_wait2%=
r18
L_end1%=
L_wait1%=
r16, (1 << %1) | (1 << %2)
%3, r16
r19
r18
r17
r16
"I"
"I"
"I"
"I"
"M"
"x"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
de sincronismo
Verifica si se completo
el byte.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
_SFR_IO_ADDR(PINE),
(0),
(1),
_SFR_IO_ADDR(PORTB),
((PHY_TIMEOUTBITS * 5)),
(&dat)
);
/* Devuelve el byte envado. */
return dat;
}
/*
Funcin __phy_sndframe__:
Enva la trama almacenada en el buffer.
*/
static void __phy_sndframe__(void)
{
asm volatile("\
push
r2
push
r3
push
r4
push
r5
push
r6
push
r7
push
r8
push
r9
push
r10
push
r11
FernandoArielBeunza79156
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
663
L_init%=:
664
push
push
push
push
push
push
push
push
push
in
mov
andi
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
or
cp
cpc
brne
rjmp
ldi
ld
sbi
nop
nop
nop
nop
nop
nop
nop
nop
r12
r13
r14
r15
r16
r17
r18
r19
r20
r19, %0
r20, r19
r19, 0x0f
r16, 0x90
r2, r16
r2, r19
r16, 0x40
r3, r16
r3, r19
r16, 0x10
r4, r16
r4, r19
r16, 0x20
r5, r16
r5, r19
r16, 0x50
r6, r16
r6, r19
r16, 0x70
r7, r16
r7, r19
r16, 0x60
r8, r16
r8, r19
r16, 0x80
r9, r16
r9, r19
r16, 0x30
r10, r16
r10, r19
r16, 0xa0
r11, r16
r11, r19
r16, 0x00
r12, r16
r12, r19
r16, 0xc0
r13, r16
r13, r19
r16, 0xb0
r14, r16
r14, r19
r16, 0xd0
r15, r16
r15, r19
r16, 0xe0
r16, r19
r30, r26
r31, r27
L_init%=
L_end%=
r17, 0x07
r18, z+
%1, %2
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Carga los valores de las
\n\t\
muestras.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Verifica si ya se
\n\t\
procesaron todos los datos \n\t\
almacenados en el buffer.
\n\t\
\n\t\
\n\t\
\n\t\
Activa el transmisor.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_sndbit0_06_0%=:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sbrc
rjmp
nop
out
r18, 7
L_sndbit1_06_0%=
%0, r8
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Enva los primeros 7 bits
; de un byte de los datos.
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
665
L_sndbit0_06_1%=:
666
out
out
out
out
out
nop
out
nop
nop
out
out
out
lsl
dec
out
out
out
out
out
nop
out
out
out
out
out
out
out
out
out
out
out
out
out
out
nop
nop
out
out
out
out
out
nop
out
out
out
nop
out
out
out
out
out
nop
out
out
out
out
out
out
out
out
out
cpi
breq
nop
out
out
out
out
out
out
out
%0,
%0,
%0,
%0,
%0,
r14
r16
r15
r11
r9
%0, r2
%0,
%0,
%0,
r18
r17
%0,
%0,
%0,
%0,
%0,
r9
r7
r8
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r14
r9
r6
r8
r13
r16
r11
r10
r3
r9
r2
r6
r10
r3
%0,
%0,
%0,
%0,
%0,
r8
r13
r16
r2
r5
r9
r13
r16
r13
r11
%0, r7
%0, r11
%0, r14
%0,
%0,
%0,
%0,
%0,
r13
r14
r9
r7
r11
%0, r6
%0, r12
%0, r3
%0, r11
%0, r13
%0, r9
%0, r10
%0, r5
%0, r3
r17, 0x00
L_sndbit0_06_2%=
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r6
r9
r14
r11
r8
r3
r8
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_sndbit0_06_2%=:
L_sndbit1_06_0%=:
L_sndbit1_06_1%=:
out
nop
out
out
out
sbrs
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
out
out
out
out
out
out
out
out
nop
out
out
out
sbrs
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
out
out
out
out
out
out
nop
out
nop
nop
out
out
out
lsl
dec
out
out
out
out
out
nop
out
out
out
out
out
out
out
out
out
%0, r14
%0, r8
%0, r4
%0, r5
r18, 7
L_sndbit1_06_0%=
%0,
%0,
%0,
%0,
%0,
%0,
r8
r14
r16
r15
r11
r9
%0, r2
L_sndbit0_06_1%=
%0, r6
%0, r9
%0, r14
%0, r11
%0, r8
%0, r3
%0, r8
%0, r14
%0, r8
%0, r4
%0, r5
r18, 7
L_sndbit1_7_0%=
%0,
%0,
%0,
%0,
%0,
%0,
r8
r14
r16
r15
r11
r9
%0, r2
L_sndbit0_7_1%=
%0, r2
%0, r3
%0, r4
%0, r5
%0, r6
%0, r7
%0, r8
%0,
%0,
%0,
r18
r17
%0,
%0,
%0,
%0,
%0,
r7
r9
r2
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r3
r7
r11
r2
r10
r12
r6
r13
r14
FernandoArielBeunza79156
r7
r10
r4
r10
r6
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
667
L_sndbit1_06_2%=:
668
out
out
out
out
out
nop
nop
out
out
out
out
out
nop
out
out
out
nop
out
out
out
out
out
nop
out
out
out
out
out
out
out
out
out
cpi
breq
nop
out
out
out
out
out
out
out
out
nop
out
out
out
sbrs
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
out
out
out
out
out
out
out
out
nop
out
out
out
%0,
%0,
%0,
%0,
%0,
r7
r8
r11
r13
r14
%0,
%0,
%0,
%0,
%0,
r2
r10
r4
r8
r15
%0, r9
%0, r6
%0, r3
%0,
%0,
%0,
%0,
%0,
r10
r3
r7
r9
r6
%0, r11
%0, r16
%0, r14
%0, r6
%0, r10
%0, r7
%0, r13
%0, r15
%0, r14
r17, 0x00
L_sndbit1_06_2%=
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r11
r7
r3
r6
r2
r14
r2
r3
%0, r2
%0, r16
%0, r15
r18, 7
L_sndbit0_06_0%=
%0,
%0,
%0,
%0,
%0,
%0,
r2
r3
r4
r5
r6
r7
%0, r8
L_sndbit1_06_1%=
%0, r11
%0, r7
%0, r3
%0, r6
%0, r2
%0, r14
%0, r2
%0, r3
%0, r2
%0, r16
%0, r15
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_sndbit0_7_0%=:
L_sndbit0_7_1%=:
sbrs
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
out
out
out
out
out
out
nop
out
nop
nop
out
out
out
ld
out
out
out
out
out
ldi
out
out
out
out
out
out
out
out
out
out
out
out
out
out
nop
nop
out
out
out
out
out
nop
out
out
out
cp
out
out
out
out
out
cpc
out
out
out
out
out
out
out
r18, 7
L_sndbit0_7_0%=
%0,
%0,
%0,
%0,
%0,
%0,
r2
r3
r4
r5
r6
r7
%0, r8
L_sndbit1_7_1%=
%0, r8
%0, r14
%0, r16
%0, r15
%0, r11
%0, r9
%0, r2
%0, r9
%0, r7
%0, r8
r18, z+
%0, r9
%0, r13
%0, r16
%0, r13
%0, r11
r17, 0x07
%0, r14
%0, r9
%0, r6
%0, r8
%0, r13
%0, r16
%0, r11
%0, r10
%0, r3
%0, r9
%0, r2
%0, r6
%0, r10
%0, r3
%0,
%0,
%0,
%0,
%0,
r8
r13
r16
r2
r5
%0, r7
%0, r11
%0, r14
r30, r26
%0, r13
%0, r14
%0, r9
%0, r7
%0, r11
r31, r27
%0, r6
%0, r12
%0, r3
%0, r11
%0, r13
%0, r9
%0, r10
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
; Enva el ltimo bit de un
; byte de los datos.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
669
L_sndbit0_7_2%=:
L_sndbit1_7_0%=:
L_sndbit1_7_1%=:
670
out
out
breq
nop
nop
out
out
out
out
out
out
out
out
nop
out
out
out
sbrs
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
nop
out
out
out
out
out
out
out
out
nop
out
out
out
nop
rjmp
out
out
out
out
out
out
nop
out
nop
nop
out
out
out
ld
out
out
out
out
out
ldi
out
out
out
out
out
out
out
%0, r5
%0, r3
L_sndbit0_7_2%=
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r6
r9
r14
r11
r8
r3
r8
r14
%0, r8
%0, r4
%0, r5
r18, 7
L_sndbit1_06_0%=
%0,
%0,
%0,
%0,
%0,
%0,
r8
r14
r16
r15
r11
r9
%0, r2
L_sndbit0_06_1%=
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r6
r9
r14
r11
r8
r3
r8
r14
%0, r8
%0, r4
%0, r5
L_end%=
%0, r2
%0, r3
%0, r4
%0, r5
%0, r6
%0, r7
%0, r8
%0, r7
%0, r9
%0, r2
r18, z+
%0, r7
%0, r10
%0, r4
%0, r10
%0, r6
r17, 0x07
%0, r3
%0, r7
%0, r11
%0, r2
%0, r10
%0, r12
%0, r6
;
;
; Verifica si ya se
; procesaron todos los datos
; almacenados en el buffer.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_sndbit1_7_2%=:
out
out
out
out
out
out
out
nop
nop
out
out
out
out
out
nop
out
out
out
cp
out
out
out
out
out
cpc
out
out
out
out
out
out
out
out
out
breq
nop
nop
out
out
out
out
out
out
out
out
nop
out
out
out
sbrs
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
nop
out
out
out
out
out
out
out
out
nop
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r13
r14
r7
r8
r11
r13
r14
%0,
%0,
%0,
%0,
%0,
r2
r10
r4
r8
r15
%0, r9
%0, r6
%0, r3
r30, r26
%0, r10
%0, r3
%0, r7
%0, r9
%0, r6
r31, r27
%0, r11
%0, r16
%0, r14
%0, r6
%0, r10
%0, r7
%0, r13
%0, r15
%0, r14
L_sndbit1_7_2%=
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r11
r7
r3
r6
r2
r14
r2
r3
%0, r2
%0, r16
%0, r15
r18, 7
L_sndbit0_06_0%=
%0,
%0,
%0,
%0,
%0,
%0,
r2
r3
r4
r5
r6
r7
%0, r8
L_sndbit1_06_1%=
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
FernandoArielBeunza79156
r11
r7
r3
r6
r2
r14
r2
r3
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Verifica si ya se
; procesaron todos los datos
; almacenados en el buffer.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
671
L_end%=:
:
:
%0, r2
%0, r16
%0, r15
%1, %2
%0, r19
r20
r19
r18
r17
r16
r15
r14
r13
r12
r11
r10
r9
r8
r7
r6
r5
r4
r3
r2
;
;
;
;
;
;
; Desactiva el transmisor.
;
; Recupera contenido de los
; registros utilizados.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
"I"
"I"
"I"
"x"
_SFR_IO_ADDR(PORTA),
_SFR_IO_ADDR(PORTE),
(2),
(__phy_buffer__ + sizeof(__phy_startpattern__) +
__phy_buffsize__ + sizeof(__phy_endpattern__)),
"z" (__phy_buffer__)
);
}
/*
Funcin __phy_calthreshold__:
Calibra el umbral de deteccin utilizado para determinar el valor de los
bits recibidos.
*/
static void __phy_calthreshold__(void)
{
/* Variables. */
uint8_t b;
uint8_t thl;
uint8_t sbyte;
uint8_t thlevel;
uint8_t thlevels;
/* Inicializa el integrador. */
PORTD = 0x00;
PORTB |= 0x80;
PORTB &= 0x7f;
asm volatile("\
push
r16
ldi
r16, 0x19
L_continue%=:
dec
r16
brne
L_continue%=
nop
pop
r16
:
:
);
/*
/*
/*
/*
Cantidad de bits. */
Umbral de deteccin. */
Valor del byte sensado. */
Acumulador de umbrales
vlidos. */
/* Cantidad de umbrales vlidos. */
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
672
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
L_continue%=:
}
/* Verifica si el umbral es vlido. */
if (sbyte == PHY_CALTHRBYTE)
{
thlevel += thl;
thlevels ++;
}
}
/* Ajusta el umbral de deteccin. */
if (thlevels)
thlevel /= thlevels;
else
thlevel = PHY_THGENLEVEL;
PORTA = ((PHY_SIGGENLEVEL & 0x0f) << 4) | thlevel;
/* Reinicia el integrador. */
PORTB |= 0x80;
PORTB &= 0x7f;
}
FernandoArielBeunza79156
673
674
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Inicializa la lnea de
retardo.
Inicializa el integrador.
Sensa el canal de
comunicacin a la espera
de registrar actividad.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_calth_rx_0%=:
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
nop
sbis
rjmp
nop
in
com
out
nop
sbis
rjmp
rjmp
in
eor
out
mov
sbis
clr
sbic
inc
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%4, %5
L_calth_rx_0%=
r16, %0
r16
%1, r16
%6, %7
L_end_0%=
L_sense_rx%=
r16, %0
r2, r16
%1, r2
r2, r16
%4, %5
r19
%4, %5
r19
FernandoArielBeunza79156
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
; Inicia reajuste del umbral \n\t\
; de deteccin.
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
675
L_calth_rx_1%=:
676
in
eor
out
mov
lsl
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
cpi
brlo
ori
clr
in
eor
out
mov
nop
sbis
rjmp
nop
in
eor
out
mov
cpse
rjmp
nop
nop
in
eor
out
mov
ldi
out
rjmp
r16, %0
r3, r16
%1, r3
r3, r16
r17
r16, %0
r4, r16
%1, r4
r4, r16
r16, %0
r5, r16
%1, r5
r5, r16
r16, %0
r6, r16
%1, r6
r6, r16
r16, %0
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_calth_rx_1%=
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
%6, %7
L_end_0%=
r16, %0
r10, r16
%1, r10
r10, r16
r17, r18
L_calth_rx_2%=
r16, %0
r11, r16
%1, r11
r11, r16
r20, 0x0f
%8, r20
L_calth_rx_3%=
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Detecta el valor del bit
; recibido.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_calth_rx_3%=:
L_calth_rx_4%=:
nop
in
eor
out
mov
nop
nop
rjmp
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
lsl
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
cpi
brlo
ori
clr
in
eor
out
mov
nop
nop
nop
r16, %0
r11, r16
%1, r11
r11, r16
L_calth_rx_0%=
r16, %0
r2, r16
%1, r2
r2, r16
%4, %5
r19
%4, %5
r19
r16, %0
r3, r16
%1, r3
r3, r16
r17
r16, %0
r4, r16
%1, r4
r4, r16
r16, %0
r5, r16
%1, r5
r5, r16
r16, %0
r6, r16
%1, r6
r6, r16
r16, %0
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_calth_rx_4%=
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
677
678
r16, %0
r10, r16
%1, r10
r10, r16
r16, %0
r11, r16
%1, r11
r11, r16
r16, %0
r2, r16
%1, r2
r2, r16
%4, %5
r19
%4, %5
r19
r16, %0
r3, r16
%1, r3
r3, r16
r17
r16, %0
r4, r16
%1, r4
r4, r16
r16, %0
r5, r16
%1, r5
r5, r16
r16, %0
r6, r16
%1, r6
r6, r16
r20, 0x00
L_calth_rx_7%=
r16, %0
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_calth_rx_5%=
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Detecta el valor del bit
; recibido.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_calth_rx_6%=:
L_calth_rx_7%=:
L_calth_rx_8%=:
ori
clr
in
eor
out
mov
nop
sbis
rjmp
nop
in
eor
out
mov
cpse
rjmp
nop
nop
in
eor
out
mov
nop
out
rjmp
nop
in
eor
out
mov
mov
out
rjmp
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
cpi
brlo
ori
clr
in
eor
out
mov
nop
sbis
rjmp
nop
in
eor
out
mov
cpse
rjmp
nop
nop
eor
out
mov
dec
out
rjmp
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
%6, %7
L_end_0%=
r16, %0
r10, r16
%1, r10
r10, r16
r17, r18
L_calth_rx_6%=
r16, %0
r11, r16
%1, r11
r11, r16
%8, r20
L_calth_rx_10%=
r16, %0
r11, r16
%1, r11
r11, r16
r20, r21
%8, r20
L_init_rx%=
r16, %0
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_calth_rx_8%=
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
%6, %7
L_end_0%=
r16, %0
r10, r16
%1, r10
r10, r16
r17, r18
L_calth_rx_9%=
r11, r16
%1, r11
r11, r16
r20
%8, r20
L_calth_rx_10%=
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Verifica si el ajuste es
vlido.
Verifica si el ajuste es
vlido.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
679
L_calth_rx_10%=:
L_calth_rx_11%=:
680
nop
in
eor
out
mov
dec
out
rjmp
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
lsl
ldi
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
cpi
brlo
ori
clr
in
eor
out
mov
nop
sbis
rjmp
r16, %0
r11, r16
%1, r11
r11, r16
r20
%8, r20
L_calth_rx_3%=
r16, %0
r2, r16
%1, r2
r2, r16
%4, %5
r19
%4, %5
r19
r16, %0
r3, r16
%1, r3
r3, r16
r17
r18, 0xff
r16, %0
r4, r16
%1, r4
r4, r16
r16, %0
r5, r16
%1, r5
r5, r16
r16, %0
r6, r16
%1, r6
r6, r16
r16, %0
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_calth_rx_11%=
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
%6, %7
L_end_0%=
;
;
;
;
;
;
;
;
; Fin de reajuste.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Detecta el valor del bit
; recibido.
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_calth_rx_12%=:
L_calth_rx_13%=:
L_start_rx_0%=:
nop
in
eor
out
mov
cpse
rjmp
nop
nop
in
eor
out
mov
inc
out
rjmp
nop
in
eor
out
mov
nop
nop
rjmp
sbi
ldi
nop
nop
nop
cbi
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
lsl
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
r16, %0
r10, r16
%1, r10
r10, r16
r17, r18
L_calth_rx_12%=
r16, %0
r11, r16
%1, r11
r11, r16
r20
%8, r20
L_calth_rx_13%=
r16, %0
r11, r16
%1, r11
r11, r16
L_calth_rx_10%=
%2, %3
r18, %10
%2, %3
r16, %0
r2, r16
%1, r2
r2, r16
%4, %5
r19
%4, %5
r19
r16, %0
r3, r16
%1, r3
r3, r16
r17
r16, %0
r4, r16
%1, r4
r4, r16
r16, %0
r5, r16
%1, r5
r5, r16
r16, %0
r6, r16
%1, r6
r6, r16
r16, %0
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Reinicia el integrador.
Espera el delimitador.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
681
L_setbit_rx_0%=:
L_cont_rx_0%=:
L_start_rx_1%=:
682
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
cpi
brlo
ori
clr
in
eor
out
mov
nop
sbis
rjmp
nop
in
eor
out
mov
cpse
rjmp
nop
nop
in
eor
out
mov
nop
ldi
rjmp
nop
in
eor
out
mov
nop
nop
rjmp
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
lsl
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_setbit_rx_0%=
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
%6, %7
L_end_0%=
r16, %0
r10, r16
%1, r10
r10, r16
r17, r18
L_cont_rx_0%=
r16, %0
r11, r16
%1, r11
r11, r16
r18, 0x08
L_start_rx_1%=
r16, %0
r11, r16
%1, r11
r11, r16
L_start_rx_0%=
r16, %0
r2, r16
%1, r2
r2, r16
%4, %5
r19
%4, %5
r19
r16, %0
r3, r16
%1, r3
r3, r16
r17
r16, %0
r4, r16
%1, r4
r4, r16
r16, %0
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
; Detecta el valor del bit
\n\t\
; recibido.
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
; Recibe los bytes restantes \n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
;
\n\t\
FernandoArielBeunza79156
L_setbit_rx_1%=:
L_cont_rx_1%=:
L_cont_rx_2%=:
L_end_0%=:
L_end_1%=:
L_end_2%=:
L_wait_rx_2%=:
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
nop
nop
nop
nop
in
eor
out
mov
sbis
clr
sbic
inc
in
eor
out
mov
cpi
brlo
ori
clr
in
eor
out
mov
cp
cpc
brne
rjmp
in
eor
out
mov
dec
brne
ldi
nop
in
eor
out
mov
st
rjmp
nop
in
eor
out
mov
nop
nop
rjmp
clt
rjmp
set
ldi
out
sbi
nop
ldi
dec
brne
r5, r16
%1, r5
r5, r16
r16, %0
r6, r16
%1, r6
r6, r16
r16, %0
r7, r16
%1, r7
r7, r16
%4, %5
r19
%4, %5
r19
r16, %0
r8, r16
%1, r8
r8, r16
r19, 0x01
L_setbit_rx_1%=
r17, 0x01
r19
r16, %0
r9, r16
%1, r9
r9, r16
r30, r26
r31, r27
L_cont_rx_1%=
L_end_1%=
r16, %0
r10, r16
%1, r10
r10, r16
r18
L_cont_rx_2%=
r18, 0x08
r16, %0
r11, r16
%1, r11
r11, r16
z+, r17
L_start_rx_1%=
r16, %0
r11, r16
%1, r11
r11, r16
L_start_rx_1%=
L_end_2%=
r16, 0x00
%1, r16
%2, %3
r16, 0x1a
r16
L_wait_rx_2%=
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Verifica si la captura se
encuentra completa.
Interrupcin de captura.
Fin de captura.
Reinicia el integrador.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
683
"I"
"I"
"I"
"I"
"I"
"I"
"I"
"I"
"I"
"M"
"M"
"x"
"z"
%2, %3
r21
r20
r19
r18
r17
r16
r11
r10
r9
r8
r7
r6
r5
r4
r3
r2
;
;
; Recupera contenido de los
; registros utilizados.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
_SFR_IO_ADDR(PINC),
_SFR_IO_ADDR(PORTD),
_SFR_IO_ADDR(PORTB),
(7),
_SFR_IO_ADDR(ACSR),
(5),
_SFR_IO_ADDR(PINE),
(0),
_SFR_IO_ADDR(PORTA),
(PHY_CALTHRBYTE),
(PHY_DELBYTE),
(__phy_buffdata__ + __phy_buffsize__),
(__phy_buffdata__)
);
/* Obtiene el resultado de la captura. */
capstatus = 0;
if (SREG & 0x40) capstatus = 1;
/* Recupera el contenido del registro de estado. */
SREG = sreg;
/* Devuelve el resultado de la captura. */
return capstatus;
}
/*
Funcin __phy_sensechannel__:
Sensa la actividad del canal de comunicacin.
*/
static int __phy_sensechannel__(uint8_t thrlevel)
{
/* Variables. */
uint8_t sreg;
uint8_t thrstatus;
int capstatus;
684
\n\t\
FernandoArielBeunza79156
L_wait_0%=:
L_sense_ch%=:
ldi
out
sbi
ldi
dec
brne
cbi
ldi
in
com
out
nop
sbis
rjmp
nop
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
nop
nop
nop
r16, 0x00
%1, r16
%2, %3
r16, 0x1a
r16
L_wait_0%=
%2, %3
r17, 0xff
r16, %0
r16
%1, r16
%4, %5
L_end_1%=
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Inicializa el integrador.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Inicia el sensado de canal \n\t\
de comunicacin.
\n\t\
\n\t\
\n\t\
Verifica el alcance del
\n\t\
umbral de deteccin.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
685
L_end_0%=:
L_end_1%=:
L_end_2%=:
L_wait_1%=:
nop
in
com
out
nop
nop
nop
nop
nop
in
com
out
nop
sbis
rjmp
rjmp
clt
rjmp
set
ldi
out
sbi
nop
ldi
dec
brne
nop
cbi
pop
:
:
r16, %0
r16
%1, r16
r16, %0
r16
%1, r16
%6, %7
L_end_0%=
L_sense_ch%=
L_end_2%=
r16, 0x00
%1, r16
%2, %3
r16, 0x1a
r16
L_wait_1%=
%2, %3
r16
"I"
"I"
"I"
"I"
"I"
"I"
"I"
"I"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Verifica solicitud de fin
\n\t\
de sensado de canal de
\n\t\
comunicacin.
\n\t\
Interrupcin de captura.
\n\t\
\n\t\
Deteccin de ocupacin del \n\t\
canal de comunicacin.
\n\t\
\n\t\
Reinicia el integrador.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
_SFR_IO_ADDR(PINC),
_SFR_IO_ADDR(PORTD),
_SFR_IO_ADDR(PORTB),
(7),
_SFR_IO_ADDR(ACSR),
(5),
_SFR_IO_ADDR(PINE),
(0)
);
/* Restaura el umbral de deteccin anterior. */
PORTA = thrstatus;
/* Obtiene el resultado de la captura. */
capstatus = 0;
if (SREG & 0x40) capstatus = 1;
/* Recupera el contenido del registro de estado. */
SREG = sreg;
/* Devuelve el resultado de la captura. */
return capstatus;
}
/*
Funcin __phy_gennoisesignal__:
Genera una seal de ruido.
*/
static void __phy_gennoisesignal__(void)
{
asm volatile("\
push
r2
push
r3
push
r4
push
r5
push
r6
push
r7
push
r8
push
r9
push
r16
push
r17
686
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
r18
r19
r17, %0
r20, r17
r17, 0x0f
r16, 0x90
r2, r16
r2, r17
r16, 0x40
r3, r16
r3, r17
r16, 0x10
r4, r16
r4, r17
r16, 0x20
r5, r16
r5, r17
r16, 0x50
r6, r16
r6, r17
r16, 0x70
r7, r16
r7, r17
r16, 0x60
r8, r16
r8, r17
r16, 0x80
r9, r16
r9, r17
r16, 0x30
r10, r16
r10, r17
r16, 0xa0
r11, r16
r11, r17
r16, 0x00
r12, r16
r12, r17
r16, 0xc0
r13, r16
r13, r17
r16, 0xb0
r14, r16
r14, r17
r16, 0xd0
r15, r16
r15, r17
r16, 0xe0
r16, r17
r18, 0x00
%1, %2
r19, r18
r19, 0x80
r19
r19
r18, r19
r18
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Inicializa la semilla.
Activa el transmisor.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
687
L_genbit0_0%=:
L_genbit0_1%=:
688
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sbrc
rjmp
nop
out
out
out
out
out
out
nop
out
nop
nop
out
out
out
r18, 7
L_genbit1%=
%0,
%0,
%0,
%0,
%0,
%0,
r8
r14
r16
r15
r11
r9
%0, r2
%0, r9
%0, r7
%0, r8
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Genera la seal de ruido
; pseudoaleatorio.
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_genbit1%=:
mov
ori
out
out
out
out
out
clc
out
out
out
out
out
out
out
out
out
out
out
out
out
out
ror
ror
out
out
out
out
out
eor
out
out
out
ror
out
out
out
out
out
nop
out
out
out
out
out
out
out
out
out
nop
sbis
rjmp
out
out
out
out
out
out
out
out
nop
out
out
out
sbrs
rjmp
nop
out
out
out
out
r19, r18
r19, 0x80
%0, r9
%0, r13
%0, r16
%0, r13
%0, r11
%0, r14
%0, r9
%0, r6
%0, r8
%0, r13
%0, r16
%0, r11
%0, r10
%0, r3
%0, r9
%0, r2
%0, r6
%0, r10
%0, r3
r19
r19
%0, r8
%0, r13
%0, r16
%0, r2
%0, r5
r18, r19
%0, r7
%0, r11
%0, r14
r18
%0, r13
%0, r14
%0, r9
%0, r7
%0, r11
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r6
r12
r3
r11
r13
r9
r10
r5
r3
%3, %4
L_end%=
%0, r6
%0, r9
%0, r14
%0, r11
%0, r8
%0, r3
%0, r8
%0, r14
%0, r8
%0, r4
%0, r5
r18, 7
L_genbit0_0%=
%0,
%0,
%0,
%0,
FernandoArielBeunza79156
r2
r3
r4
r5
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Verifica solicitud de fin
; de generacin de ruido.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
689
690
%0, r6
%0, r7
%0, r8
%0, r7
%0, r9
%0, r2
r19, r18
r19, 0x80
%0, r7
%0, r10
%0, r4
%0, r10
%0, r6
%0, r3
%0, r7
%0, r11
%0, r2
%0, r10
%0, r12
%0, r6
%0, r13
%0, r14
%0, r7
%0, r8
%0, r11
%0, r13
%0, r14
r19
r19
%0, r2
%0, r10
%0, r4
%0, r8
%0, r15
r18, r19
%0, r9
%0, r6
%0, r3
r18
%0, r10
%0, r3
%0, r7
%0, r9
%0, r6
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
%0,
r11
r16
r14
r6
r10
r7
r13
r15
r14
%3, %4
L_end%=
%0, r11
%0, r7
%0, r3
%0, r6
%0, r2
%0, r14
%0, r2
%0, r3
%0, r2
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Verifica solicitud de fin
; de generacin de ruido.
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_end%=:
out
out
sbrc
rjmp
nop
out
out
out
out
out
out
nop
out
rjmp
cbi
out
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
:
:
%0, r16
%0, r15
r18, 7
L_genbit1%=
%0,
%0,
%0,
%0,
%0,
%0,
r8
r14
r16
r15
r11
r9
%0, r2
L_genbit0_1%=
%1, %2
%0, r17
r19
r18
r17
r16
r9
r8
r7
r6
r5
r4
r3
r2
"I"
"I"
"I"
"I"
"I"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Desactiva el transmisor.
;
; Recupera contenido de los
; registros utilizados.
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
_SFR_IO_ADDR(PORTA),
_SFR_IO_ADDR(PORTE),
(2),
_SFR_IO_ADDR(PINE),
(0)
);
}
/*
Funcin __phy_tstsignal1__:
Genera una seal de prueba.
*/
static void __phy_tstsignal1__(void)
{
asm volatile("\
push
r2
push
r3
push
r4
push
r5
push
r6
push
r7
push
r8
push
r9
push
r16
push
r17
push
r18
in
r17, %0
mov
r18, r17
andi
r17, 0x0f
ldi
r16, 0x00
mov
r2, r16
or
r2, r17
ldi
r16, 0x10
mov
r3, r16
or
r3, r17
ldi
r16, 0x20
mov
r4, r16
or
r4, r17
ldi
r16, 0x30
mov
r5, r16
or
r5, r17
ldi
r16, 0x40
FernandoArielBeunza79156
691
L_continue%=:
692
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
sbi
out
nop
out
nop
nop
nop
out
nop
nop
nop
nop
out
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
out
nop
nop
nop
nop
out
nop
nop
nop
out
nop
nop
out
nop
nop
nop
out
nop
nop
nop
nop
out
nop
nop
nop
nop
nop
nop
nop
r6, r16
r6, r17
r16, 0x50
r7, r16
r7, r17
r16, 0x60
r8, r16
r8, r17
r16, 0x70
r9, r16
r9, r17
%1, %2
%0, r6
%0, r7
%0, r8
%0, r9
%0, r8
%0, r7
%0, r6
%0, r5
%0, r4
%0, r3
;
;
;
;
;
;
;
;
;
;
;
; Activa el transmisor.
; Genera la seal de prueba.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
FernandoArielBeunza79156
L_end%=:
nop
out
out
nop
nop
nop
nop
nop
nop
nop
nop
out
nop
nop
nop
nop
out
sbis
rjmp
nop
out
rjmp
out
cbi
out
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
:
:
%0, r2
%0, r3
%0, r4
%0, r5
%3, %4
L_end%=
%0, r6
L_continue%=
%0, r6
%1, %2
%0, r18
r18
r17
r16
r9
r8
r7
r6
r5
r4
r3
r2
"I"
"I"
"I"
"I"
"I"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Detiene la seal de prueba \n\t\
si hay una nueva solicitud \n\t\
de operacin.
\n\t\
\n\t\
\n\t\
\n\t\
Desactiva el transmisor.
\n\t\
\n\t\
Recupera contenido de los
\n\t\
registros utilizados.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
_SFR_IO_ADDR(PORTA),
_SFR_IO_ADDR(PORTE),
(2),
_SFR_IO_ADDR(PINE),
(0)
);
}
/*
Funcin __phy_tstsignal2__:
Genera una seal de prueba.
*/
static void __phy_tstsignal2__(void)
{
asm volatile("\
push
r2
push
r3
push
r4
push
r5
push
r6
push
r7
push
r8
push
r9
push
r16
push
r17
push
r18
in
r17, %0
mov
r18, r17
andi
r17, 0x0f
ldi
r16, 0x00
mov
r2, r16
or
r2, r17
ldi
r16, 0x10
mov
r3, r16
FernandoArielBeunza79156
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
693
L_continue%=:
L_end%=:
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
ldi
mov
or
sbi
out
out
out
out
nop
nop
sbis
rjmp
out
out
out
out
out
out
out
out
out
out
out
out
out
out
out
out
rjmp
cbi
out
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
:
:
r3, r17
r16, 0x20
r4, r16
r4, r17
r16, 0x30
r5, r16
r5, r17
r16, 0x40
r6, r16
r6, r17
r16, 0x50
r7, r16
r7, r17
r16, 0x60
r8, r16
r8, r17
r16, 0x70
r9, r16
r9, r17
%1, %2
%0, r6
%0, r7
%0, r8
%0, r9
%3, %4
L_end%=
%0, r8
%0, r7
%0, r6
%0, r5
%0, r4
%0, r3
%0, r3
%0, r2
%0, r3
%0, r3
%0, r4
%0, r5
%0, r6
%0, r7
%0, r8
%0, r9
L_continue%=
%1, %2
%0, r18
r18
r17
r16
r9
r8
r7
r6
r5
r4
r3
r2
"I"
"I"
"I"
"I"
"I"
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Activa el transmisor.
\n\t\
Genera la seal de prueba. \n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Detiene la seal de prueba \n\t\
si hay una nueva operacin \n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
Desactiva el transmisor.
\n\t\
\n\t\
Recupera contenido de los
\n\t\
registros utilizados.
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
\n\t\
"
_SFR_IO_ADDR(PORTA),
_SFR_IO_ADDR(PORTE),
(2),
_SFR_IO_ADDR(PINE),
(0)
);
}
/*
Funcin __phy_tstreceive__:
Realiza una prueba de recepcin.
*/
694
FernandoArielBeunza79156
;
;
;
;
;
;
;
;
;
\n\t\
Repite en el integrador la \n\t\
seal recibida.
\n\t\
\n\t\
Detiene la prueba si hay
\n\t\
una nueva operacin.
\n\t\
\n\t\
\n\t\
"
/*
Funcin main:
Funcin principal.
*/
int main(void)
{
/* Inicializa los recursos utilizados por la capa fsica. */
phy_init();
/* Espera y ejecuta la operaciones solicitadas a la capa fsica. */
phy_exec();
/* Fin. */
return 0;
}
FernandoArielBeunza79156
695
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
80
696
0xffff
FernandoArielBeunza79156
#include "../common/common.h"
#include "../common/common.c"
#include "../common/serial.h"
#include "../common/serial.c"
#if !defined(__INTERRUPTS__H__)
#define __INTERRUPTS_H__
FernandoArielBeunza79156
697
#endif
698
FernandoArielBeunza79156
#if !defined(__MEMORY_H__)
#define __MEMORY_H__
FernandoArielBeunza79156
699
#endif
700
FernandoArielBeunza79156
/* Posicin de memoria. */
FernandoArielBeunza79156
701
/* Cantidad de errores
encontrados. */
/* Posicin de memoria. */
/* Dato original de la posicin de
memoria. */
/* Dato ledo de la posicin de
memoria. */
702
FernandoArielBeunza79156
hex2val(char *v)
*/
i;
val;
/* Dgito. */
/* Cantidad de digitos. */
/* Valor numrico. */
FernandoArielBeunza79156
703
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
Contador de errores. */
Direccin de memoria. */
Tamao del registro. */
Nmero de bytes del registro. */
Valor ledo. */
Longitud de la cadena
ingresada. */
Tipo de registro. */
Puntero a registro. */
Puntero a registro. */
Suma de verificacin. */
Registro recibido. */
704
FernandoArielBeunza79156
FernandoArielBeunza79156
705
/*
Funcin main:
Funcin principal.
*/
void main(void)
{
char str[LINE_SIZE];
/* Lnea de comandos. */
706
FernandoArielBeunza79156
al inicio de la
a la reinicializacin
a la lectura del
a la escritura del
a la verificacin del
}
}
FernandoArielBeunza79156
707
#if !defined(__COMMON_H__)
#define __COMMON_H__
/* Definicin de tipos. */
/* Tipo longitud. */
typedef short int length_t;
708
FernandoArielBeunza79156
FernandoArielBeunza79156
709
#endif
/* Definicin de constantes. */
#define WATCHDOG_PERIOD
0x000f
/* Variables globales. */
/* Estado del watchdog. */
static unsigned char __wdt_status__;
710
FernandoArielBeunza79156
/* Suma de verificacin. */
/* Puntero a los datos. */
FernandoArielBeunza79156
711
/*
/*
/*
/*
Resultado de la comparacin. */
Contador. */
Caracter de la primer cadena. */
Caracter de la segunda
cadena. */
712
FernandoArielBeunza79156
/* Resultado de la comparacin. */
/* Caracter de la cadena en memoria
de datos. */
/* Caracter de la cadena en memoria
de cdigo. */
/* Contador. */
/* Longitud de la cadena de
caracteres. */
FernandoArielBeunza79156
713
/* Longitud de la cadena de
caracteres. */
p0,
p1,
p2,
p3,
#0xff
#0xff
#0xff
#0xff
;
;
;
;
__endasm;
}
/*
Funcin init_watchdog:
Inicializa el watchdog del microcontrolador.
*/
void init_watchdog(unsigned char s)
{
if (!s)
{
__wdt_status__ = 0;
return;
}
__wdt_status__ = 1;
__asm
push
IE
clr
EA
orl
_WDTPRG, #0x07
mov
_WDTRST, #0x1e
mov
_WDTRST, #0xe1
pop
IE
__endasm;
}
;
;
;
;
;
;
/*
Funcin reset_watchdog:
Reinicia el watchdog del microcontrolador.
714
FernandoArielBeunza79156
;
;
;
;
;
/*
Funcin status_watchdog:
Devuelve el estado del watchdog del microcontrolador.
*/
unsigned char status_watchdog(void)
{
if (__wdt_status__) return 1;
return 0;
}
/* Calcula el CRC-16. */
crc ^= a;
for (i = 0; i < 8; i++)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
/* Devuelve el CRC-16. */
return crc;
}
/*
Funcin memcpy3:
Copia el contenido de la memoria de datos.
*/
void memcpy3(unsigned char *dest, length_t sdest, const unsigned char *src,
length_t ssrc)
{
/* Variables. */
length_t i;
/* Contador. */
FernandoArielBeunza79156
715
716
FernandoArielBeunza79156
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
FernandoArielBeunza79156
717
#endif
/* Variables globales. */
/* Contador de reinicio del watchdog. */
static unsigned char __watchdog_counter__;
/*
Funcin inituart:
Inicializa la UART del microcontrolador.
*/
void inituart(unsigned char t1_reload)
{
/* Inicializa la UART. */
SIO_SCON = 0x50;
SIO_TR1 = 0;
718
FernandoArielBeunza79156
/* Caracter recibido. */
FernandoArielBeunza79156
719
720
FernandoArielBeunza79156
D.1. Descripcin
La interfaz C++ es una extensin de la capa de aplicacin que permite proveer a las
aplicaciones orientadas a objetos desarrolladas en lenguaje C++, los mismos servicios brindados a
aplicaciones escritas en lenguaje C. El sistema se encuentra desarrollado en lenguaje C, ya que
permite implementar los distintos componentes del sistema de comunicaciones en diversas
plataformas de forma eficiente. De todas formas, el sistema se encuentra diseado para aceptar el
agregado de interfaces que permitan adaptar la interfaz de la capa de aplicacin a otros entornos y
lenguajes de programacin. En ste caso se hace referencia al lenguaje C++, porque es el
implementado en el presente trabajo, y utilizado para mostrar la caracterstica anterior de diseo,
pero nada impide que en un futuro se desarrollen extensiones a otros lenguajes.
La interfaz se encuentra desarrollada tanto para Windows como para Linux, del mismo modo
que las capas de aplicacin y presentacin. No se encuentra desarrollada una plataforma para
AT89X5X ya que resulta poco prctica para el microcontrolador propuesto para el dispositivo
cliente, pero nada impide que en el futuro tambin se desarrolle una interfaz C++ para determinados
tipos de microcontroladores cuyo poder de computo absorban el costo adicional de C++.
#if !defined(__MODPLCAPCPP_H__)
#define __MODPLCAPCPP_H__
FernandoArielBeunza79156
721
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcapcpp_grpid;
/* Identificador de mensaje. */
typedef unsigned short int modplcapcpp_msgid;
/* Tipo de campo. */
typedef unsigned char modplcapcpp_ftype;
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAPCPP_NULLTYPE
#define MODPLCAPCPP_CHARTYPE
#define MODPLCAPCPP_SINT8TYPE
#define MODPLCAPCPP_UINT8TYPE
#define MODPLCAPCPP_SINT16TYPE
#define MODPLCAPCPP_UINT16TYPE
#define MODPLCAPCPP_SINT32TYPE
#define MODPLCAPCPP_UINT32TYPE
#define MODPLCAPCPP_FLOATTYPE
MODPLCAP_NULLTYPE
MODPLCAP_CHARTYPE
MODPLCAP_SINT8TYPE
MODPLCAP_UINT8TYPE
MODPLCAP_SINT16TYPE
MODPLCAP_UINT16TYPE
MODPLCAP_SINT32TYPE
MODPLCAP_UINT32TYPE
MODPLCAP_FLOATTYPE
/* Variables globales. */
/* Indicador de carga de biblioteca dinmica. */
int __modplcapcpp_loadlib__ = 0;
/* Declaracin de clases. */
/* Clases declaradas. */
class modplcapcpp;
class modplcapcpp_msg;
/*
Clase modplcapcpp
*/
class modplcapcpp
{
/* Atributos y mtodos privados. */
private:
modplcap_hd *handle;
/* Manejador de capa de
aplicacin. */
/* Mtodos pblicos. */
public:
/*
Constructor:
Inicializa los recursos utilizados por la capa de aplicacin del
modem PLC.
*/
modplcapcpp(int);
/*
Destructor:
Libera los recursos utilizados por la capa de aplicacin del modem
PLC.
*/
~modplcapcpp();
/*
Mtodo publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
722
FernandoArielBeunza79156
/* Manejador de mensaje. */
/* Mtodos pblicos. */
public:
/*
Constructor:
Crea un nuevo mensaje.
*/
modplcapcpp_msg(modplcapcpp *, modplcapcpp_grpid, modplcapcpp_msgid);
/*
Constructor:
Crea un copia de un mensaje.
*/
modplcapcpp_msg(modplcapcpp_msg *msg);
/*
Constructor:
Recibe un mensaje por medio de la capa de aplicacin.
*/
modplcapcpp_msg(modplcapcpp *hd);
/*
Destructor:
Destruye un mensaje.
*/
~modplcapcpp_msg();
/*
Mtodo putfield:
Agrega un nuevo campo al mensaje.
*/
FernandoArielBeunza79156
723
724
FernandoArielBeunza79156
FernandoArielBeunza79156
725
726
FernandoArielBeunza79156
#if !defined(__MODPLCAPCPP_H__)
#define __MODPLCAPCPP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcapcpp_grpid;
/* Identificador de mensaje. */
typedef unsigned short int modplcapcpp_msgid;
/* Tipo de campo. */
typedef unsigned char modplcapcpp_ftype;
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAPCPP_NULLTYPE
#define MODPLCAPCPP_CHARTYPE
#define MODPLCAPCPP_SINT8TYPE
#define MODPLCAPCPP_UINT8TYPE
#define MODPLCAPCPP_SINT16TYPE
#define MODPLCAPCPP_UINT16TYPE
#define MODPLCAPCPP_SINT32TYPE
#define MODPLCAPCPP_UINT32TYPE
#define MODPLCAPCPP_FLOATTYPE
MODPLCAP_NULLTYPE
MODPLCAP_CHARTYPE
MODPLCAP_SINT8TYPE
MODPLCAP_UINT8TYPE
MODPLCAP_SINT16TYPE
MODPLCAP_UINT16TYPE
MODPLCAP_SINT32TYPE
MODPLCAP_UINT32TYPE
MODPLCAP_FLOATTYPE
/* Declaracin de clases. */
/* Clases declaradas. */
class modplcapcpp;
class modplcapcpp_msg;
/*
Clase modplcapcpp
*/
class modplcapcpp
{
/* Atributos y mtodos privados. */
private:
modplcap_hd *handle;
/* Manejador de capa de
aplicacin. */
/* Mtodos pblicos. */
FernandoArielBeunza79156
727
/* Manejador de mensaje. */
/* Mtodos pblicos. */
public:
/*
Constructor:
Crea un nuevo mensaje.
*/
modplcapcpp_msg(modplcapcpp *, modplcapcpp_grpid,
modplcapcpp_msgid);
/*
728
FernandoArielBeunza79156
FernandoArielBeunza79156
729
730
FernandoArielBeunza79156
FernandoArielBeunza79156
731
#endif
732
FernandoArielBeunza79156
E.1. Descripcin
La interfaz para el entorno Simulink es una extensin de la capa de aplicacin que permite un
uso ms interactivo de las comunicaciones a travs de la red PLC. La capa de aplicacin provee una
interfaz apropiada para entornos de programacin en donde se implementan algoritmos que hacen
uso de la red PLC, lo que resulta cmodo para usuarios con conocimientos de programacin. Para
usuario sin ste tipo de conocimiento resulta ms adecuado la utilizacin de un entorno grfico que
permita representar algoritmos en forma de modelos grficos. Simulink es una herramienta incluida
dentro de MATLAB que permite la modelizacin grfica de sistemas de control mediante la
interconexin de bloques funcionales. La interfaz Simulink diseada en el presente trabajo provee
una biblioteca de bloques Simulink que permiten agregar las funcionalidades de comunicacin por
medio de redes PLC a cualquier modelo de control realizado en Simulink.
FernandoArielBeunza79156
733
El segundo bloque al cual se hace referencia se denomina Modem PLC Create Message,
utilizado para crear un nuevo mensaje. Con este bloque funcional se inicializa un mensaje en donde
se especifica el identificador de grupo de difusin que se utiliza para el envo del mensaje, y un
734
FernandoArielBeunza79156
Figura E3. Parmetros configurables correspondientes al bloque Modem PLC Create Message.
El bloque denominado Modem PLC Put Field, es utilizado para agregar un campo de datos a
un mensaje previamente creado con el bloque descripto anteriormente. El nico parmetro
configurable que presenta hace referencia al tipo de datos que contiene el campo como se puede
observar en la figura E4. La multiplicidad de los datos de campo est dada por la entrada de datos
del bloque, si la entrada se compone de una seal, la multiplicidad del campo sera uno; y si se tratan
de varias seales concentradas por ejemplo por el bloque Multiplexor provisto por Simulink, la
multiplicidad del campo la determinar la cantidad de seales que ingresan al multiplexor.
Figura E4. Parmetros configurables correspondientes al bloque Modem PLC Put Field.
El bloque denominado Modem PLC Send Message, es utilizado para enviar un mensaje
armado por medio de los dos bloques anteriormente descriptos. No presenta ningn parmetro
configurable ya que todo lo referente al mensaje se especifica por medio de los dos bloques
anteriores.
El bloque denominado Modem PLC Receive Message, es utilizado recibir un mensaje por
medio del grupo de difusin especificado como parmetro, y asociado a un determinado
identificador de mensaje opcionalmente tambin especificado como parmetro, como se muestra en
la figura E5. El identificador de grupo es obligatorio especificarlo, mientras que el identificador de
mensaje, con slo especificar el valor -1 se indica que se acepta cualquier mensaje
independientemente del identificador de mensaje que posean.
FernandoArielBeunza79156
735
Figura E5. Parmetros configurables correspondientes al bloque Modem PLC Receive Message.
El bloque denominado Modem PLC Get Field, es utilizado para extraer un campo de datos
de un mensaje recibido. Como parmetro configurable (figura E6) posee la cantidad de datos del
campo que se desea recibir que no es necesario que conocida con la cantidad de datos recibidos. Si
la cantidad especificada es mayor a la recibida, el bloque devuelve en su salida la cantidad de datos
recibida; y si es menor, devuelve la cantidad especificada.
Figura E6. Parmetros configurables correspondientes al bloque Modem PLC Get Field.
El bloque denominado Modem PLC Real Time, brinda la posibilidad aproximar el tiempo de
simulacin al tiempo real transcurrido, para poder simular modelos en un tiempo similar al real.
Este bloque no presenta parmetros configurables pero posee una salida que devuelve el tiempo real
que se debe agregar en cada paso de simulacin para aproximar el tiempo de simulacin al tiempo
real. Cuando devuelve un valor negativo, indica que el tiempo real transcurrido supera al tiempo de
simulacin.
FernandoArielBeunza79156
Bloques Simulink
modem_plc_interface.dllmodem_plc_create_message.dllmodem_plc_put_field.dll
modem_plc_send_message.dllmodem_plc_receive_message.dll
modem_plc_get_field.dll
modplc_simulink.dll
Capa de aplicacin
modplcap.dll
/* Definicin de tipos. */
/* Estructura de nodo de lista de mensajes recibidos. */
typedef struct
{
modplcap_msg *msg;
void *next;
} listmsg_node;
/* Mensaje. */
/* Puntero al prximo nodo. */
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCSIMULINK_CHARTYPE
#define MODPLCSIMULINK_SINT8TYPE
#define MODPLCSIMULINK_UINT8TYPE
#define MODPLCSIMULINK_SINT16TYPE
#define MODPLCSIMULINK_UINT16TYPE
#define MODPLCSIMULINK_SINT32TYPE
FernandoArielBeunza79156
1
2
3
4
5
6
737
7
8
/* Contador. */
/* Manejador de comunicacin entre
bloques Simulink del Modem
PLC. */
/* Inicializa el bloque. */
handle = NULL;
while(1)
{
/* Carga la biblioteca. */
if (!modplcap_loadlib()) break;
/* Inicializa el manejador de comunicacin entre bloques Simulink del
Modem PLC. */
handle = (modplcsimulink_hd *) malloc(sizeof(modplcsimulink_hd));
if (!handle) break;
/* Inicializa el manejador de capa fsica del modem PLC.. */
handle->hd = modplcap_init(port);
if (!handle->hd) break;
/* Inicializa el puntero al mensaje a enviar o recibido. */
handle->msg = NULL;
/* Inicializa la tabla de suscripciones a grupos. */
for(i = 0; i < 255; i++) handle->groups[i] = 0;
/* Inicializa la lista de mensajes recibidos. */
handle->frecvmsg = NULL;
handle->lrecvmsg = NULL;
/* xito. */
return handle;
}
if (handle)
{
modplcap_release(handle->hd);
free(handle);
handle = NULL;
}
return handle;
}
/*
Funcin ModemPlcInterface_Output:
Ejecuta el bloque Modem PLC Interface.
*/
int ModemPlcInterface_Output(void *handle)
{
/* Variables. */
listmsg_node *node;
738
FernandoArielBeunza79156
FernandoArielBeunza79156
739
740
FernandoArielBeunza79156
FernandoArielBeunza79156
741
742
FernandoArielBeunza79156
FernandoArielBeunza79156
743
744
FernandoArielBeunza79156
FernandoArielBeunza79156
745
746
FernandoArielBeunza79156
FernandoArielBeunza79156
747
748
FernandoArielBeunza79156
Modem_PLC_Interface
2
/* Variables globales. */
static void *handle;
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* Define la cantidad de parmetros que requiere el bloque Simulink. */
ssSetNumSFcnParams(S, 1);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) return;
/* Define la cantidad de entradas que requiere el bloque Simulink. */
if (!ssSetNumInputPorts(S, 0)) return;
/* Define la cantidad de salidas que requiere el bloque Simulink. */
if (!ssSetNumOutputPorts(S, 2)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 1);
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, DYNAMICALLY_SIZED);
ssSetNumIWork(S, DYNAMICALLY_SIZED);
ssSetNumPWork(S, DYNAMICALLY_SIZED);
ssSetNumModes(S, DYNAMICALLY_SIZED);
/* */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
FernandoArielBeunza79156
749
/* Puntero al indicador de
resultado de ejecucin de la
presente operacin. */
/* Puntero al manejador de conexin
de salida. */
750
FernandoArielBeunza79156
Modem_PLC_Create_Message
2
/* Variables globales. */
static int grpid;
static int msgid;
static void *msg;
/* Identificador de grupo. */
/* Identificador de mensaje. */
/* Puntero al mensaje. */
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
FernandoArielBeunza79156
751
752
FernandoArielBeunza79156
int *flag_out;
FernandoArielBeunza79156
753
Modem_PLC_Put_Field
2
/* Variables globales. */
static int type;
/* Identificador de tipo de
dato. */
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* Define la cantidad de parmetros que requiere el bloque Simulink. */
ssSetNumSFcnParams(S, 1);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) return;
/* Define la cantidad de entradas que requiere el bloque Simulink. */
if (!ssSetNumInputPorts(S, 3)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortRequiredContiguous(S, 0, 1);
ssSetInputPortWidth(S, 1, 1);
ssSetInputPortDirectFeedThrough(S, 1, 1);
ssSetInputPortRequiredContiguous(S, 1, 1);
ssSetInputPortWidth(S, 2 , DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S, 2, 1);
/* Define la cantidad de salidas que requiere el bloque Simulink. */
if (!ssSetNumOutputPorts(S, 2)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 1);
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, DYNAMICALLY_SIZED);
ssSetNumIWork(S, DYNAMICALLY_SIZED);
ssSetNumPWork(S, DYNAMICALLY_SIZED);
754
FernandoArielBeunza79156
int *flag_out;
/* Datos de entrada. */
/* Puntero al indicador de entrada
de ejecucin de la presente
operacin. */
/* Puntero al indicador de salida
de ejecucin de la presente
operacin. */
/* Puntero al manejador de conexin
de entrada. */
/* Puntero al manejador de conexin
de salida. */
FernandoArielBeunza79156
755
Modem_PLC_Send_Message
2
756
FernandoArielBeunza79156
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* Define la cantidad de parmetros que requiere el bloque Simulink. */
ssSetNumSFcnParams(S, 0);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) return;
/* Define la cantidad de entradas que requiere el bloque Simulink. */
if (!ssSetNumInputPorts(S, 2)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortRequiredContiguous(S, 0, 1);
ssSetInputPortWidth(S, 1, 1);
ssSetInputPortDirectFeedThrough(S, 1, 1);
ssSetInputPortRequiredContiguous(S, 1, 1);
/* Define la cantidad de salidas que requiere el bloque Simulink. */
if (!ssSetNumOutputPorts(S, 2)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 1);
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, DYNAMICALLY_SIZED);
ssSetNumIWork(S, DYNAMICALLY_SIZED);
ssSetNumPWork(S, DYNAMICALLY_SIZED);
ssSetNumModes(S, DYNAMICALLY_SIZED);
/* */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
/*
Funcin mdlInitializeSampleTimes:
Establece el tiempo de muestreo utilizado durante la simulacin.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
/* Variables. */
struct HINSTANCE__ *hlib;
FernandoArielBeunza79156
757
int *flag_out;
758
FernandoArielBeunza79156
Modem_PLC_Receive_Message
2
/* Variables globales. */
static int grpid;
static int msgid;
static void *msg;
/* Identificador de grupo. */
/* Identificador de mensaje. */
/* Puntero al mensaje. */
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* Define la cantidad de parmetros que requiere el bloque Simulink. */
ssSetNumSFcnParams(S, 2);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) return;
/* Define la cantidad de entradas que requiere el bloque Simulink. */
if (!ssSetNumInputPorts(S, 2)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortRequiredContiguous(S, 0, 1);
ssSetInputPortWidth(S, 1, 1);
FernandoArielBeunza79156
759
int *flag_out;
760
FernandoArielBeunza79156
de entrada. */
/* Puntero al manejador de conexin
de salida. */
FernandoArielBeunza79156
Modem_PLC_Get_Field
2
761
/* Variables globales. */
static int count;
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* Define la cantidad de parmetros que requiere el bloque Simulink. */
ssSetNumSFcnParams(S, 1);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) return;
/* Define la cantidad de entradas y salidas que requiere el bloque
Simulink. */
if (!ssSetNumInputPorts(S, 2)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortRequiredContiguous(S, 0, 1);
ssSetInputPortWidth(S, 1, 1);
ssSetInputPortDirectFeedThrough(S, 1, 1);
ssSetInputPortRequiredContiguous(S, 1, 1);
if (!ssSetNumOutputPorts(S, 3)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 1);
ssSetOutputPortWidth(S, 2, (int) ceil(*mxGetPr(ssGetSFcnParam(S, 0))));
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, DYNAMICALLY_SIZED);
ssSetNumIWork(S, DYNAMICALLY_SIZED);
ssSetNumPWork(S, DYNAMICALLY_SIZED);
ssSetNumModes(S, DYNAMICALLY_SIZED);
/* */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
/*
Funcin mdlInitializeSampleTimes:
Establece el tiempo de muestreo utilizado durante la simulacin.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
/* Variables. */
struct HINSTANCE__ *hlib;
762
FernandoArielBeunza79156
int *flag_out;
FernandoArielBeunza79156
763
Modem_PLC_Real_Time
2
/* Variables globales. */
static int priority_thread;
static DWORD priority_process;
unsigned long int start_rtime;
/* Implementacin de funciones. */
/*
Funcin mdlInitializeSizes:
Establece las dimensiones de las entradas y salidas del bloque Simulink y
la cantidad de parmetros que requiere.
764
FernandoArielBeunza79156
/* Frecuencia de reloj. */
/* Cantidad de ticks
transcurridos. */
/* Tiempo real transcurrido. */
/* Tiempo de simulacin
transcurrido. */
/* Puntero a la direrencia entre
tiempo de simulacin y tiempo
real. */
FernandoArielBeunza79156
765
766
FernandoArielBeunza79156
FernandoArielBeunza79156
767
768
FernandoArielBeunza79156
FernandoArielBeunza79156
769
770
FernandoArielBeunza79156
/* Variables globales. */
/* Estado de las luces. */
unsigned char lights;
/* Posicin de las luces. */
unsigned char side;
/* Buffer de mensajes recibidos. */
modplcap_msg buffer;
/*
Funcin func:
Procesa los mensajes recibidos por medio de la conexin.
*/
void func(__data modplcap_hd *hd, __data modplcap_msg *msg, __data void *param)
__reentrant
{
/* Variables. */
modplcap_msg rmsg;
/* Mensaje de respuesta. */
modplcap_ftype type;
/* Tipo de parmetro. */
modplcap_msgid msgid;
/* Identificador de mensaje. */
unsigned char val;
/* Parmetro. */
unsigned char port;
/* Puerto. */
unsigned char count;
/* Multiplicidad del parmetro. */
FernandoArielBeunza79156
771
0x01;
0x02;
& 0x08))) val |= 0x04;
0x08;
MODPLCAP_UINT8TYPE, 1, &val);
}
/* Encendido/apagado de luz de guio derecho. */
else if ((msgid == 0x8001) && (side))
{
lights &= 0xf7;
if (val) lights |= 0x08;
}
/* Encendido/apagado de luz de guio izquierdo. */
else if ((msgid == 0x8002) && (!side))
{
lights &= 0xf7;
if (val) lights |= 0x08;
}
/* Encendido/apagado de luces de posicin, bajas y altas. */
else if (msgid == 0x8003)
{
lights &= 0xf8;
lights |= (val & 0x07);
}
/* Identificador de mensaje desconocido. */
else
break;
/* Devuelve estado de las luces. */
if ((msgid >= 0x8001) && (msgid <= 0x8003))
modplcap_putfield(&rmsg, MODPLCAP_UINT8TYPE, 1, &lights);
/* Enva respuesta. */
modplcap_sendmsg(&rmsg);
break;
}
/* Reestrablece el estado original de las luces. */
P1 = port;
param;
}
/*
Funcin main:
Funcin principal.
*/
void main(void)
{
/* Variables. */
unsigned short i;
__data modplcap_hd *hd;
/*
P1
P0
P2
P3
/* Contador. */
/* Manejador de conexin. */
Inicializa puertos. */
= 0xf8;
= 0xff;
= 0xff;
= 0xff;
772
FernandoArielBeunza79156
Inicializa la conexin. */
= modplcap_init(1);
(!hd) break;
(!modplcap_setbuffer(hd, &buffer)) break;
(!modplcap_notify(hd, func, NULL)) break;
(!modplcap_publish(hd, 2)) break;
(!modplcap_subscribe(hd, 1)) break;
FernandoArielBeunza79156
773
774
FernandoArielBeunza79156
G.1. Descripcin
Para evaluar el funcionamiento del sistema propuesto en el presente trabajo se implementa
una red compuesta por dos modems PLC, un dispositivo cliente real y un dispositivo cliente virtual.
El dispositivo cliente real se conecta a uno de los modems, mientras que el dispositivo cliente
virtual consiste en una aplicacin que se ejecuta en una PC que se conecta al otro modem. Gracias a
que el driver de la interfaz RS232 (ver Apndice C) presenta una funcin de depuracin que permite
ver el trfico de mensajes, y a que el modem PLC por medio de una conexin especial permite
visualizar por medio de una PC el trfico de mensajes entre el dispositivo cliente real y el modem
PLC; no es necesario implementar un dispositivo especial de diagnstico (que requerira de otro
modem PLC), ni una aplicacin de diagnstico corriendo en paralelo al la aplicacin que simula al
dispositivo cliente virtual en la PC, para supervisar el funcionamiento de la red de prueba.
La evaluacin al sistema se realiza a dos niveles: nivel capa fsica y nivel capa de aplicacin.
El objetivo de la evaluacin a nivel de capa fsica es evaluar el desempeo de los aspectos fsicos de
los modems PLC implementados. En cambio, la evaluacin a nivel de capa de aplicacin se
concentra en evaluar el comportamiento del sistema desarrollado en forma conjunta.
Para realizar la evaluacin a nivel de capa fsica se desarrolla una aplicacin de prueba que
permite determinar la tasa de bits errados y la calidad del canal de comunicacin.
Las aplicaciones de prueba para evaluar el sistema a nivel de capa de aplicacin
corresponden a los dispositivos clientes virtuales. Una de las aplicaciones de prueba consiste en un
modelo Simulink, la otra consiste en una aplicacin desarrollada en lenguaje C y C++ para
plataforma Windows y Linux.
FernandoArielBeunza79156
775
Como se puede ver en la figura anterior, a la derecha se puede observar el dispositivo cliente real
junto con su modem PLC. A la izquierda, hacia el fondo, se puede observar el otro modem PLC que
se conecta a la PC. A la izquierda, hacia adelante se puede observar la fuente de alimentacin que
simula la batera conectada al filtro de rechazo de banda. ste filtro de rechazo de banda puede
observarse ms en detalle en la figura G2.
FernandoArielBeunza79156
FernandoArielBeunza79156
777
778
FernandoArielBeunza79156
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port1;
int port2;
int badframe;
size_t i;
size_t size;
size_t framesize;
unsigned long int
unsigned long int
unsigned long int
unsigned long int
unsigned long int
unsigned long int
unsigned long int
c;
dist;
frames;
badbits;
lostbits;
sentbits;
badframes;
FernandoArielBeunza79156
779
/* Manejador de interfaz
capa fsica del modem
/* Manejador de interfaz
capa fsica del modem
/* Trama de prueba, */
/* Trama de prueba. */
modplcphy_hd *hd2;
unsigned char *frame1;
unsigned char *frame2;
con la
PLC. */
con la
PLC. */
/* Carga parmetros. */
if (argc < 4) return -1;
port1 = atoi(argv[1]);
port2 = atoi(argv[2]);
frames = atoi(argv[3]);
/* Carga biblioteca. */
if (!modplcphy_loadlib()) return 0;
/* Prueba. */
while(1)
{
/* Inicializa conexiones con capa fsica. */
hd1 = modplcphy_init(port1);
if (!hd1) break;
hd2 = modplcphy_init(port2);
if (!hd2) break;
/* Obtiene el tamao mximo de trama. */
framesize = modplcphy_getpayloadsize(hd1, 0);
if (framesize > modplcphy_getpayloadsize(hd2, 0))
framesize = modplcphy_getpayloadsize(hd2, 0);
/* Reserva memoria para almacenar las tramas de prueba. */
frame1 = (unsigned char *) malloc(sizeof(unsigned char) * framesize);
if (!frame1) break;
frame2 = (unsigned char *) malloc(sizeof(unsigned char) * framesize);
if (!frame2) break;
/* Inicializa contadores. */
badbits = 0;
lostbits = 0;
sentbits = 0;
badframes = 0;
lostframes = 0;
/* Inicia la secuencia pseudoaleatoria. */
srand((unsigned) time(NULL));
/* Prueba de envo y recepcin de tramas. */
for(c = 1; c <= frames; c++)
{
/* Genera trama de prueba. */
printf("ciclo %li - ", c);
size = (rand() % framesize) + 1;
switch(rand() % 14)
{
/* Patrn 00000000. */
case 0:
printf("patrn 00000000 - ");
for(i = 0; i < size; i++) frame1[i] = 0x00;
break;
/* Patrn 11111111. */
case 1:
printf("patrn 11111111 - ");
for(i = 0; i < size; i++) frame1[i] = 0xff;
break;
/* Patrn 01010101. */
case 2:
printf("patrn 01010101 - ");
for(i = 0; i < size; i++) frame1[i] = 0x55;
780
FernandoArielBeunza79156
FernandoArielBeunza79156
781
782
FernandoArielBeunza79156
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port;
unsigned char count;
unsigned char status;
modplcap_ftype type;
modplcap_msg msg;
modplcap_hd *hd;
/*
/*
/*
/*
/*
/*
/* Carga parmetros. */
if (argc < 2) return -1;
port = atoi(argv[1]);
/* Carga biblioteca. */
if (!modplcap_loadlib()) return 0;
/* Prueba. */
while(1)
{
/* Inicializa la conexin con capa de aplicacin. */
hd = modplcap_init(port);
if (!hd) break;
/* Suscripcin a grupos de difusin. */
if (!modplcap_publish(hd, 1)) break;
if (!modplcap_subscribe(hd, 2)) break;
/* Verifica el estado de los focos. */
printf("Verificacin de estado de focos\r\n\n");
modplcap_newmsg(hd, &msg, 1, 0x8000);
modplcap_sendmsg(&msg);
modplcap_destroymsg(&msg);
if (!modplcap_receivemsg(hd, &msg)) break;
modplcap_getfield(&msg, &type, &count, &status);
modplcap_destroymsg(&msg);
FernandoArielBeunza79156
783
: ");
: ");
: ");
: ");
784
FernandoArielBeunza79156
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port;
unsigned char count;
unsigned char status;
modplcapcpp_ftype type;
modplcapcpp_msg *msg;
modplcapcpp *hd;
FernandoArielBeunza79156
/*
/*
/*
/*
/*
/*
785
/* Carga parmetros. */
if (argc < 2) return -1;
port = atoi(argv[1]);
/* Prueba. */
while(1)
{
/* Inicializa la conexin con capa de aplicacin. */
hd = new modplcapcpp(port);
if (!hd) break;
/* Suscripcin a grupos de difusin. */
if (!hd->publish(1)) break;
if (!hd->subscribe(2)) break;
/* Verifica el estado de los focos. */
cout << "Verificacin de estado de focos" << endl << endl;
msg = new modplcapcpp_msg(hd, 1, 0x8000);
if (!msg) break;
msg->sendmsg();
delete msg;
msg = new modplcapcpp_msg(hd);
if (!msg) break;
msg->getfield(&type, &count, &status);
delete msg;
cout << "* Estado luz de posicin : ";
if (status & 0x01)
cout << "OK" << endl;
else
cout << "Falla" << endl;
cout << "* Estado luz de baja
: ";
if (status & 0x02)
cout << "OK" << endl;
else
cout << "Falla" << endl;
cout << "* Estado luz de alta
: ";
if (status & 0x04)
cout << "OK" << endl;
else
cout << "Falla" << endl;
cout << "* Estado luz de guio
: ";
if (status & 0x08)
cout << "OK" << endl;
else
cout << "Falla" << endl;
/* Encendido de luz de guio derecho. */
cout << endl << "Encendido de luz de guio derecho ";
cout << "(presione una tecla para continuar)" << endl << endl;
cin.get();
msg = new modplcapcpp_msg(hd, 1, 0x8001);
if (!msg) break;
status = 0x01;
msg->putfield(MODPLCAPCPP_UINT8TYPE, 1, &status);
msg->sendmsg();
delete msg;
/* Apagado de luz de guio derecho. */
cout << "Apagado de luz de guio derecho ";
cout << "(presione una tecla para continuar)" << endl << endl;
cin.get();
msg = new modplcapcpp_msg(hd, 1, 0x8001);
if (!msg) break;
status = 0x00;
msg->putfield(MODPLCAPCPP_UINT8TYPE, 1, &status);
msg->sendmsg();
delete msg;
786
FernandoArielBeunza79156
FernandoArielBeunza79156
787
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port1;
int port2;
int badframe;
size_t i;
size_t size;
size_t framesize;
unsigned long int
unsigned long int
unsigned long int
unsigned long int
unsigned long int
unsigned long int
unsigned long int
c;
dist;
frames;
badbits;
lostbits;
sentbits;
badframes;
/* Carga parmetros. */
if (argc < 4) return -1;
port1 = atoi(argv[1]);
788
FernandoArielBeunza79156
FernandoArielBeunza79156
789
790
FernandoArielBeunza79156
FernandoArielBeunza79156
791
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port;
unsigned char count;
unsigned char status;
modplcap_ftype type;
modplcap_msg msg;
modplcap_hd *hd;
/*
/*
/*
/*
/*
/*
/* Carga parmetros. */
if (argc < 2) return -1;
port = atoi(argv[1]);
/* Prueba. */
while(1)
{
/* Inicializa la conexin con capa de aplicacin. */
hd = modplcap_init(port);
if (!hd) break;
/* Suscripcin a grupos de difusin. */
if (!modplcap_publish(hd, 1)) break;
if (!modplcap_subscribe(hd, 2)) break;
/* Verifica el estado de los focos. */
printf("Verificacin de estado de focos\r\n\n");
792
FernandoArielBeunza79156
FernandoArielBeunza79156
793
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
794
FernandoArielBeunza79156
/*
/*
/*
/*
/*
/*
/* Carga parmetros. */
if (argc < 2) return -1;
port = atoi(argv[1]);
/* Prueba. */
while(1)
{
/* Inicializa la conexin con capa de aplicacin. */
hd = new modplcapcpp(port);
if (!hd) break;
/* Suscripcin a grupos de difusin. */
if (!hd->publish(1)) break;
if (!hd->subscribe(2)) break;
/* Verifica el estado de los focos. */
cout << "Verificacin de estado de focos" << endl << endl;
msg = new modplcapcpp_msg(hd, 1, 0x8000);
if (!msg) break;
msg->sendmsg();
delete msg;
msg = new modplcapcpp_msg(hd);
if (!msg) break;
msg->getfield(&type, &count, &status);
delete msg;
cout << "* Estado luz de posicin : ";
if (status & 0x01)
cout << "OK" << endl;
else
cout << "Falla" << endl;
cout << "* Estado luz de baja
: ";
if (status & 0x02)
cout << "OK" << endl;
else
cout << "Falla" << endl;
cout << "* Estado luz de alta
: ";
if (status & 0x04)
cout << "OK" << endl;
else
cout << "Falla" << endl;
cout << "* Estado luz de guio
: ";
if (status & 0x08)
cout << "OK" << endl;
else
cout << "Falla" << endl;
/* Encendido de luz de guio derecho. */
cout << endl << "Encendido de luz de guio derecho ";
cout << "(presione una tecla para continuar)" << endl << endl;
cin.get();
msg = new modplcapcpp_msg(hd, 1, 0x8001);
if (!msg) break;
status = 0x01;
msg->putfield(MODPLCAPCPP_UINT8TYPE, 1, &status);
msg->sendmsg();
delete msg;
/* Apagado de luz de guio derecho. */
cout << "Apagado de luz de guio derecho ";
cout << "(presione una tecla para continuar)" << endl << endl;
cin.get();
FernandoArielBeunza79156
795
796
FernandoArielBeunza79156
FernandoArielBeunza79156
797
798
FernandoArielBeunza79156
Glosario
ACKN
Acknowledgement
Conjunto de bits utilizado en las tramas CAN para indicar si la trama fue recibida
correctamente por los destinatarios de la misma.
ADC
APDU
ARM
ARM9
ARP
ARQ
ASK
AVR
BFSK
FernandoArielBeunza79156
799
BPSK
CAL
CAN
CEBus
Chirp
Seal conformada por un barrido en frecuencia dentro de un determinado rango de
una seal senoidal.
CNP
CRC
CSMA
800
FernandoArielBeunza79156
ConTroL Word
Campo de control de un paquete de UPB utilizado para especificar informacin de
control acerca del paquete (tamao del paquete, etc.).
D2B
DAC
DBPSK
DC-BUS
DC-BUS
Red de datos desarrollada por la empresa Yamar Electronics Ltd. que emplea como
medio fsico la red elctrica del automvil
DFT
DID
Destination ID
Campo de un paquete UPB utilizado para especificar al dispositivo destinatario.
FernandoArielBeunza79156
801
DQPSK
DSSS
EEPROM
EOF
End Of Frame
Conjunto de bits utilizado en las tramas CAN y J1850 para indicar el final de la
misma.
FEC
FPGA
FSK
HAN
HF
High Frecuency
Banda del espectro de frecuencias utilizada para las comunicaciones PLC
comprendida entre 1 y 30 MHz.
802
FernandoArielBeunza79156
IDentifier Extension
Bit utilizado en las tramas extendidas de CAN parte B, para diferenciarlas de las
tramas estndar.
IDFT
IFR
In Frame Response
Bit utilizado en las tramas J1850 para indicar que el destinatario de la misma puede
emitir una trama de respuesta a continuacin de la primera.
IP
Internet Protocol
Protocolo de comunicaciones entre redes que forma parte de la capa de red del
modelo OSI, encargado de la identificacin de nodos y del encaminado de paquetes
de informacin.
ISO
J1850
LIN
LLC
LON
FernandoArielBeunza79156
803
MAC
MDA
MDID
Message Data ID
Campo de un paquete UPB reservado para especificar el comando, o la respuesta a
ste.
MOST
Network ID
Campo de un paquete UPB utilizado para especificar la red en donde se encuentra el
dispositivo destinatario.
NPDU
NRZ
NT
OFDM
804
FernandoArielBeunza79156
OSI
PAR
PLC
PPM
PWM
PSK
QAM
QPSK
RAM
FernandoArielBeunza79156
805
ROBO
ROBust OFDM
Es mecanismo para enviar informacin repetida por medio de la tcnica OFDM, para
aumentar la confiabilidad a costas de una reduccin en la velocidad de transferencia.
ROM
RS232
RTR
SAE
SID
Source ID
Campo de un paquete UPB utilizado para especificar al dispositivo que dio origen al
paquete.
SOF
Start Of Frame
Bit utilizado en las tramas CAN y J1850 para indicar el comienzo de la misma.
SRR
SW
Symbol Window
Segmento opcional de tiempo del ciclo de comunicacin recurrente de FlexRay
utilizado para evaluar el estado del medio.
806
FernandoArielBeunza79156
TDM
TDMA
TCP
TTL
UART
UPB
USB
VDX
VPW
FernandoArielBeunza79156
807
WAN
WiFi
Wireless Fidelity
Es un tipo de red que permite interconectar computadoras de forma inalmbrica.
X10
X10
Es un estndar de comunicaciones para el control remoto de dispositivos elctricos.
808
FernandoArielBeunza79156