Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Beunza
Beunza
DE LA
UNIVERSIDAD DE BUENOS AIRES
Tesis de Grado
en
Ingeniera Informtica
SEPTIEMBRE 2011
Tesis de Grado en Ingeniera Informtica
Facultad de Ingeniera
Universidad de Buenos Aires
SEPTIEMBRE 2011
Tesis de Grado en Ingeniera Informtica
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 5
Tesis de Grado en Ingeniera Informtica
6 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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 7
Tesis de Grado en Ingeniera Informtica
8 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 9
Tesis de Grado en Ingeniera Informtica
10 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 11
Tesis de Grado en Ingeniera Informtica
12 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 13
Tesis de Grado en Ingeniera Informtica
14 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
una evaluacin del diseo expuesto en el captulo 4 frente a las alternativas enumeradas
en el captulo 2.
16 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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:
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
Tesis de Grado en Ingeniera Informtica
Extended Data son empleadas para expandir la capacidad de comandos y de enviar datos
adicionales, respectivamente.
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.
FernandoArielBeunza79156 21
Tesis de Grado en Ingeniera Informtica
quien tiene derecho a uso del canal de comunicacin. Luego del prembulo, el transmisor que gan
el derecho de utilizar el canal de comunicacin, transmite un conjunto de seales Chirp para marcar
el comienzo del paquete.
Para recuperar los bits del paquete, los receptores se sincronizan aplicando la operacin de
correlacin a la seal recibida. Cuando la seal recibida coincide con la seal Chirp esperada, la
correlacin devuelve un pulso de sincronismo.
CEBus con el mecanismo de transmisin expuesto, puede lograr velocidad de transmisin de
10 kbps.
22 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Valor Valor
Nombre Nombre
(Hex) (Hex)
01 Node Control 0E Gagned Analog Control
02 Context Control 0F Meter
03 Data Channel Receiver 10 Display
04 Data Channel Transmitter 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 Gagned Analog Control 1D Clock
Tabla 2.3. Objetos definidos por CEBus [House].
Para acceder a las variables de instancia de cada objeto, CAL define un conjunto de mtodos
enumerados en la tabla 2.4.
FernandoArielBeunza79156 23
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 25
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
seal de informacin. ste estndar introduce algunas mejoras respecto a X10, como el mtodo de
modulacin que permite elevar la velocidad de transmisin, y tambin expande la capacidad de
direccionamiento de los dispositivos.
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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 MDID
Comando Comando
(Hex) (Hex)
00 Null 0E - 0F Unused
01 Write Enable 10 Get Register Value
02 Write Protect 11 Set Register Value
03 Start SETUP Mode 12 Copy Register Value
04 Stop SETUP Mode 13 Swap Register Nibbles
05 Get SETUP Time 14 Increment Register Value
06 Auto-Address 15 Decrement Register Value
07 Get Device Status 16 Left Shift Register
08 Set Device Control 17 Right Shift Register
09 Get Signal Strength 18 Set Register Bits
0A Get Noise Level 19 Clear Register Bits
0B Add Link 1A Toggle Register Bits
0C Delete Link 1B - 1F Unused
0D Transmit This Message
Tabla 2.7. Comandos principales implementados por UPB [UPB03].
Tambin existen una serie de comandos y respuestas especiales dedicados a funciones de control,
como se puede ver en la tabla 2.8.
MDID MDID
Comando / Respuesta Comando / Respuesta
(Hex) (Hex)
20 Activate Link 25 Blink
21 Deactivate Link 26 - 2F Unused
22 Goto 30 Report State
23 Start Fade 31 Store State
24 Stop Fade 32 - 3F Unused
Tabla 2.8. Comandos y respuestas especiales implementados por UPB [UPB03].
Por ltimo, UPB define una serie de respuestas a comandos que se detallan en la tabla 2.9.
30 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
MDID MDID
Respuesta Respuesta
(Hex) (Hex)
80 -84 Unused 90 Register Values
85 Setup Time 91 RAM Values
86 Device State 92 Raw Data
87 Device Status 93 Heartbeat
89 Signal Strength 94 - AE Unused
8A Noise Level AF Acknowledgement
8B - 8F Unused
Tabla 2.9. Respuestas implementados por UPB [UPB03].
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
Tesis de Grado en Ingeniera Informtica
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.
32 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
El objetivo del presente trabajo no es tratar todos los medios fsicos sobre los cuales puede
implementarse LonWorks sino que analizar los medios relacionados con las lneas de potencia,
cuyos nombres (segn tabla 2.12) son PL-20A, PL-20C y PL-20N.
Las velocidad de transferencia que se pueden alcanzar depende del medio fsico sobre el cual
se trabaje. Como se puede observar en la tabla 2.12, cuando se trabajan con lneas de potencia, se
obtienen las velocidades de transferencia ms bajas comparadas con los otros medios fsicos
existentes.
LonWorks, sobre lneas de potencia, puede trabajar dentro del rango de frecuencias
pertenecientes a la banda A y a la banda C definidas por CENELEC 50065-1. El sistema de
modulacin utilizado es BPSK combinado con espectro ensanchado de banda estrecha
[Montoya06], que para el caso de la banda A, el rango de frecuencias utilizado se extiende desde
los 75 KHz hasta 86 KHz; mientras que para el caso de la banda C, el rango de frecuencias se
extiende comprende desde los 115 KHz hasta los 132 KHz.
FernandoArielBeunza79156 33
Tesis de Grado en Ingeniera Informtica
adicionales previo a las ranuras utilizados para evitar las colisiones. El nmero de ranuras
destinadas a prioridad puede variar entre 0 y 127.
Una trama se encuentra conformada por los siguientes campos: un prembulo, un
encabezado con informacin de control, los datos (datagrama de capa de red), un cdigo de
deteccin de errores y un indicador de final de trama.
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
fue satisfactorio cuando todos los destinatarios confirman la recepcin, salvo que se trate de un
paquete broadcast en el cual el envo se considera satisfactorio cuando llega solamente una
confirmacin de recepcin. El emisor puede reenviar el paquete varias veces hasta que reciba la
confirmacin de recepcin o hasta que supere el lmite de cantidad de reenvos.
Un envo repetido es similar al anterior, pero en ste caso, los paquetes se envan una
cantidad determinada de veces sin esperar un confirmacin de recepcin. ste tipo de envo es
menos confiable que el primero, pero recomendable en situaciones en donde el cantidad de
miembros del grupo destinatario es mayor a la cantidad de reenvos utilizando el tipo de envo
anterior.
Por ltimo, existe el envo sin confirmacin, en el cual un paquete es enviado una sola vez si
esperar la confirmacin de recepcin. ste tipo de envo es el menos confiable de todos, pero til
cuando la informacin a enviar no es crtica.
El paquete de transporte se compone de los siguientes campos: autenticacin, formato de
paquete de transporte, nmero de transaccin y datos que transporta el paquete.
36 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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.
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.
38 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
40 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
confiable. Por ste motivo, la trama puede transportar entre 46 y 1500 bytes, ya que se adapta al
tamao que pueden tener los paquetes Ethernet.
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.
FernandoArielBeunza79156 41
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
planos mencionados anteriormente, uno referidos a los datos y otro al control. En cambio, el
receptor se encuentra diseado para recibir por un lado todo lo referente a HomePlug 1.0, y por el
otro todo lo referente a HomePlug AV (datos y control) de forma conjunta. Los bloques que
componen tanto el transmisor como el receptor se detallan en la figura 2.23.
FernandoArielBeunza79156 43
Tesis de Grado en Ingeniera Informtica
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.
44 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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.
48 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Segn la clasificacin de redes propuesta por SAE sobre la clasificacin de redes, se puede decir que
los buses de longitud mayor a 500 metros entran dentro de la clase B (aplicaciones de propsito
general), y los de longitud inferior a 500 metros entran dentro de la clase C (aplicaciones de control
en tiempo real). La relacin entre velocidad y longitud muestra un cada exponencial (figura 2.30) a
medida que crece la longitud del cable utilizado en el bus.
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.
FernandoArielBeunza79156 49
Tesis de Grado en Ingeniera Informtica
quede uno, quien es el ganador del arbitraje. Cuando el ganador del arbitraje termina de transmitir
su trama, el resto de los dispositivos que perdieron la contienda, tienen una nueva trama recibida
proveniente del ganador del arbitraje. Los perdedores del arbitraje deben repetir el intento de envo
de sus respectivas tramas hasta que logren ganar el acceso al bus de datos. Para que ste esquema
funcione, cada trama debe comenzar con una secuencia de bits que sea diferente en todas las tramas.
sta secuencia constituye el campo de arbitraje de la trama, y con el esquema de bit dominante y
recesivo, el dispositivo ganador del arbitraje siempre ser quien est enviando la trama de mayor
prioridad (todos los bits con valor cero tienen la mxima prioridad y todos los bits con valor uno
tiene la mnima prioridad).
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
confiable (una trama es recibida de forma correcta por todos los receptores o por ninguno en caso de
error).
Los dispositivos tiene la capacidad de aislar fallas para no afectar el funcionamiento de la
red entera. Cada dispositivo presenta un contador de errores, que cuando supera cierto lmite
preestablecido, provoca la desconexin lgica del dispositivo (no recibe ninguna trama enviada ni
interviene en la confirmacin de recepcin).
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
indicador de fin de mensaje (llamado EOF). stas partes se disponen conforme lo muestra la figura
2.42.
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.
56 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
J2190. Tambin sta capa implementa una serie de cdigos de falla asociados a un conjunto de
averas definidas en el estndar SAE J2012.
Otra funcin que brinda est capa es la de filtrado de mensajes. Debido a que los mensajes
enviados por medio del bus de datos son recibidos en todos los dispositivos, pueden que stos no
estn interesados en todos los mensajes. Para evitar la sobrecarga de trabajo de los dispositivos, se
dispone de un mecanismo de filtrado que permita discriminar los mensajes por medio de un
identificador.
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
Tesis de Grado en Ingeniera Informtica
Si se compara el modelo OSI con la arquitectura de OSEK/VDX, se puede observar que OSEK/VDX
implementa las capa de enlace y de red. La aplicacin interacta por medio de la interfaz de
comunicacin y la interfaz de red, con la capa de interaccin y el Administrador de Red,
respectivamente. La capa de interaccin se encuentra al tope de la pila de capas constituidas por la
capa de red y de enlace. El Administrador de Red interacta con la capa de interaccin y con la capa
de enlace. Finalmente la capa de enlace interacta con el medio fsico de conexin por medio del
hardware de comunicacin (capa fsica del modelo OSI).
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
Tesis de Grado en Ingeniera Informtica
ejemplo, una tecla de levantavidrios); e interconectar este tipo de dispositivos por medio de una red
como CAN o J1850, los haran ms complejos y costosos. Adems stos dispositivos tienden a
agruparse en determinados sectores de un automvil (la tecla de levantavidrios se encuentra en la
puerta muy prxima del motor que ejecuta la accin de subir y bajar el vidrio). Entonces la
propuesta de LIN es crear una red de bajo costo y simple que permita interconectar dispositivos muy
prximos entre s, y que tambin permita las comunicaciones con dispositivos distantes empleando
pasarelas conectadas a una red de cobertura ms amplia como CAN o J1850 (con la tecla de
levantavidrios de una puerta controlar la ventanilla de otra puerta).
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.
Figura 2.48. Rango de tensiones para niveles alto y Figura 2.49. Umbrales para niveles alto y bajo
bajo sobre la lnea de transmisin [Wense00]. soportados por los receptores [Wense00].
FernandoArielBeunza79156 59
Tesis de Grado en Ingeniera Informtica
En la figura 2.49 se puede observar los umbrales que deben soportar los receptores para poder
detectar los distintos niveles del bus. Como es de esperar los rangos comprendidos son ms amplios
que los vistos en la figura 2.48, por cuestiones de compatibilidad.
El ancho de pulso que puede tener cada smbolo utilizado para codificar un bit de datos
depende de la velocidad de transferencia que se utilice. LIN soporta una velocidad de transferencia
mxima de 20 Kbps, lo que se traduce en un ancho de pulso de 50 microsegundos, aunque en la
industria automotriz suele trabajarse con velocidades de 2,4 Kbps; 9,6 Kbps y 19,2 Kbps [Rey03].
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
Mercedes Benz adopt D2B para interconectar los dispositivos de audio y video (radio, cargador de
CD, etc.) de sus automviles.
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 63
Tesis de Grado en Ingeniera Informtica
En un paquete enviado por el dispositivo maestro a un dispositivo esclavo, la direccin del primero
constituye la direccin de origen y la del segunda la direccin de destino. Las direcciones son
codificadas utilizando 12 bits.
2.2.6. MOST
MOST constituye una evolucin de D2B desarrollada por las empresas BMW, Daimler-
Chrysler, 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.
64 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
La red de fibra ptica adopta una topologa anillo y es empleada para el transporte de datos. En
cambio, la red elctrica presenta una topologa estrella y su funcin es la de transporta la seal de
activacin de los transceptores de los dispositivos conectados a la red MOST. En la figura 2.57 se
puede observar un ejemplo de como se conforma una red MOST.
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.
FernandoArielBeunza79156 65
Tesis de Grado en Ingeniera Informtica
maestro recibe el pulso. En ste momento, el dispositivo maestro reconoce que se encuentra
constituido el anillo, entonces enva otro pulso que recorre todo el anillo nuevamente para indicar a
cada dispositivo esclavo que el anillo est listo para la circulacin de informacin a travs de l.
En un anillo constituido, la informacin fluye a travs de l de diversas formas, dependiendo
de la naturaleza de los datos. Cuando no hay necesidad de transmitir informacin, el dispositivo
maestro indica la desactivacin de los transceptores de todos los dispositivos de la red.
Segn la naturaleza de los datos provenientes de la capa de aplicacin, la capa de red provee
una serie de mecanismos de transporte para cada tipo de datos. Dichos mecanismos pueden
observarse en la clasificacin detallada en la figura 2.58.
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.
Direccin Direccin
Encabezado CRC Datos
de destino de origen
12 bytes 2 bytes 2 bytes 4 bytes 6 a 1524 bytes
Figura 2.59. Estructura de paquete para direcciones de 16 bits [MOST10].
66 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Direccin Direccin
Encabezado CRC Datos
de destino de origen
12 bytes 6 bytes 6 bytes 4 bytes 0 a 1506 bytes
Figura 2.60. Estructura de paquete para direcciones de 48 bits [MOST10].
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
Tesis de Grado en Ingeniera Informtica
La estructura de mensaje para una transferencia nica, o telegrama (figura 2.62) se compone
de la direccin de origen del mensaje, la direccin destinataria del mismo, un identificador de
mensaje, un identificador de telegrama, la cantidad de datos transportada y los datos transportados.
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.
68 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
utilizar cable blindaje. sto combinado con el hecho de que cada dispositivo puede trabajar con dos
canales en simultneo a velocidades de transferencia de hasta 10 Mbps, hace que FlexRay sea muy
competitivo frente a soluciones costosas como D2B o MOST que emplean cableado de fibra ptica.
La arquitectura de un dispositivo que cumple con el estndar FlexRay se compone
bsicamente de las siguientes partes (figura 2.64): un microcontrolador (propio de cada dispositivo),
un Controlador de Comunicaciones (que implementa FlexRay), dos transceptores (uno para cada
canal de comunicacin), y una fuente de alimentacin (que suministra energa a todas las partes
anteriores).
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
permitira una distancia mxima entre dispositivos de 72 metros (3 tramos de 24 con dos repetidores
de por medio). A partir de las topologas anteriores, pueden implementarse combinaciones
resultando topologas hbridas, que no son recomendables ya que las limitaciones resultan de la
combinacin de las limitaciones de las topologas bsicas.
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.
FernandoArielBeunza79156 71
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
por 0 y 254 bytes de datos. Los cdigos de deteccin de errores se componen de tres cdigos CRC
de 8 bits cada uno.
FlexRay, como otros sistemas, tambin implementa un mecanismo de ahorro de energa, en
donde los dispositivos se desactivan cuando no llevan a cabo ninguna tarea. Esto implica que antes
de enviar una trama, deben activarse los dispositivos desactivados para que puedan recibir la trama.
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
2.3.1.3. Implementacin
Un dispositivo de comunicacin DC-BUS se encuentra constituido por los bloques
enumerados en la figura 2.76.
FernandoArielBeunza79156 75
Tesis de Grado en Ingeniera Informtica
dispositivo que permite la comunicacin por medio del cableado elctrico del automvil. Dicho
trabajo adems realiza un estudio de las caractersticas del canal de comunicacin utilizado y del
desempeo de diversas tcnicas de modulacin para la transmisin de datos.
El dispositivo mencionado anteriormente consiste en un modem prototipo implementado con
un FPGA como se describe en el trabajo Development System for Communications over DC Power
Lines [TrnkaPurkert05].
Un ltimo trabajo realizado por la misma universidad, Optimization of the Data
Transmissions over DC Power Lines [Trnka06-1] [Trnka06-2], pone nfasis en el mecanismo de
transmisin de los datos. Propone dos tcnicas de modulacin basadas en BFSK y BPSK, las cuales
son adaptadas para funcionar sobre lneas de potencia.
Los trabajos mencionados anteriormente ponen su atencin en implementar con un bajo
nivel de complejidad las capas fsica y de enlace, dejando de lado las restantes capas del modelo
OSI.
76 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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].
FernandoArielBeunza79156 77
Tesis de Grado en Ingeniera Informtica
Figura 2.80. Seal transmitida (arriba) y su Figura 2.81. Seal recibida (arriba) y su
espectro (abajo) [Trnka05]. espectro(abajo) [Trnka05].
78 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Como se observa en las figuras 2.80 y 2.81, de una seal cuyo espectro se encuentra
comprendido entre las frecuencias 4 y 16 MHz, solamente llegan al receptor las frecuencias
comprendidas entre los 12 y 16 MHz, lo que obedece a los valores de atenuacin promedio en
funcin de la frecuencia estudiados con anterioridad (ver tabla 2.16).
Luego de analizar los resultados obtenidos en los trabajos realizados por la Facultad de
Ingeniera Elctrica de la Universidad Tcnica Checa de Praga, se pueden concluir que el canal de
comunicaciones presenta las siguientes caractersticas:
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.
Figura 2.82. Acoplamiento capacitivo [Trnka06-2]. Figura 2.83. Acoplamiento inductivo [Trnka06-2].
FernandoArielBeunza79156 79
Tesis de Grado en Ingeniera Informtica
80 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Debido a que sta tcnica resulta bastante ineficiente se ha desarrollado una mejora que trabaja con
ms niveles de amplitud y tambin trabaja con la fase de la portadora, logrando una mejora en la
eficiencia, que se conoce como QAM. Como se mencion en el estudio de las caractersticas del
canal de comunicaciones, una de ellas es la distorsin de amplitud y fase, que afecta a los esquemas
de modulacin basados en la amplitud, por lo cual resultan alternativas inviables para las
comunicaciones PLC.
Debido a las dificultades existentes en transmitir la informacin por medio de la amplitud de
la portadora, nace la modulacin en frecuencia que consiste en variar las frecuencia de la portadora
de amplitud constante en funcin de la informacin a transmitir. La versin ms simple se la conoce
como BFSK, en donde se destina una frecuencia para codificar un bit de valor cero y otra frecuencia
para codificar un bit de valor uno. sta tcnica resulta se inmune ante las distorsiones de amplitud y
fase enunciada con anterioridad, pero no resuelven otra caracterstica del canal de comunicaciones
que son los desvanecimientos de frecuencia, resultando inadecuada sta tcnica si dicho fenmeno
coincide con una de las frecuencias utilizadas.
FernandoArielBeunza79156 81
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
ltimo es lo que hace descartar sta tcnica a pesar de que es viable para comunicaciones PLC en
otros entornos de aplicacin.
Otra tcnica de modulacin de banda ancha utilizada para comunicaciones PLC es la
OFDM, que consiste en trabajar con mltiples portadoras. sto minimiza los efectos indeseados
sobre la seal de informacin ocasionados por la naturaleza del canal de comunicaciones empleado.
De modo similar a la anterior tcnica, OFDM trabaja junto con alguna de la tcnicas de modulacin
mencionadas en el momento que se trataron las tcnicas de modulacin de banda estrecha; como
por ejemplo variantes de modulacin en fase (BPSK, QPSK, etc.) o QAM. El principio de
funcionamiento bsico se describe en la figura 2.88, que consiste en un modulador y demodulador
de alguna de las tcnicas de banda estrecha, que en lugar de unirse directamente se interpone un
bloque IDFT, encargada de transformar la seal generada por el modulador en un smbolo
compuesto por mltiples portadoras, y un bloque DFT, que toma el smbolo generado y lo convierte
en la seal original generada por el modulador.
FernandoArielBeunza79156 83
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 85
Tesis de Grado en Ingeniera Informtica
transmisin de datos las lneas de energa. Existen tres especificaciones, siendo la primera de ellas
(HomePlug 1.0) la que fue orientada para el propsito descripto anteriormente. La segunda
especificacin (HomePlug AV) introduce un conjunto de mejoras que adems de brindar soporte
para redes IP, permite el transporte de audio y video. Finalmente, la tercer especificacin
(HomePlug Green PHY) se encuentra orientada a control de dispositivos como X10, UPB, CEBus y
LonWorks.
86 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
en ambas redes es anillo para el cableado ptico y estrella para el cableado elctrico, en donde existe
un dispositivo que ejerce el rol de maestro de la red. El control de acceso al medio viene dado en
ambas redes por el mtodo de paso de testigo, que consiste en un testigo que circula por medio del
anillo que indica a cada dispositivo cuando transmitir, creando un canal de comunicacin libre de
colisiones. El mtodo de paso de testigo exigen la existencia de un dispositivo supervisor de la red
que el es dispositivo maestro, por lo cual D2B y MOST son redes del tipo maestro/esclavo. Tanto
D2B como MOST se encuentran orientadas a aplicaciones multimedia donde se requiere gran
capacidad de transporte de datos a alta velocidad.
Las redes FlexRay fueron diseadas para superar los problemas que presentan las redes D2B
y MOST, y proponer una mejora a las redes tradicionales CAN y J1850. De igual forma que las redes
analizadas hasta ahora, FlexRay implementa dos capas equivalentes a la capa fsica y de enlace del
modelo OSI. El medio fsico propuesto en este caso es cable par trenzado, lo cual lo hace una
alternativa ms econmica y sin los inconvenientes presentados por la fibra ptica utilizada en D2B
y MOST: Con respecto a la topologa, FlexRay permite utilizar configuraciones tipo bus, estrella o
combinacin de las anteriores, lo que otorga una gran flexibilidad en este aspecto. Adems es una
red multimaestro como CAN y J1850, eliminando las desventajas presentes en el esquema propuesto
por D2B y MOST. El mtodo para controlar el acceso al medio consiste en ranuras de tiempo fijas
asignadas a cada dispositivo para transmitir tramas de longitud fija, y en ranuras de tiempo variable
empleadas para la transmisin de tramas de longitud variable, en donde se determina que
dispositivo hace uso de ellas en base a la prioridad de la trama. En cuanto a capacidad de transporte
y velocidad, se encuentra entre algo intermedio entre CAN y J1850, y D2B y MOST; resulta una
gran mejora comparado con las capacidades prestadas por los dos primeros, pero no logra superar a
los dos segundos.
FernandoArielBeunza79156 87
Tesis de Grado en Ingeniera Informtica
estudio sobre las caractersticas que presentan las lneas de alimentacin de un automvil, y como
podran usarse stas para transmisin de informacin. Plantean el desarrollo de un prototipo que
implementa las capas fsicas y de enlace, pero no define una interfaz para otras redes, como por
ejemplo CAN, como lo hace DC-BUS. La capacidad de transferencia que brinda corresponde a
aplicaciones de telemtica.
Aplicacin
Dispositivocliente(realovirtual)
Presentacin
Sesin
Transporte Ncleodelsistema
Red
Enlace
ModemPLC
Fsica
Figura 3.1. Modelo de capas del sistema.
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
Tesis de Grado en Ingeniera Informtica
El ncleo del sistema debe comprender las capas de sesin, transporte y red. Es
responsabilidad del sistema establecer, gestionar y finalizar las conexiones entre los dispositivos
clientes (capa sesin). Adems el sistema debe garantizar, con distintos grados de confiabilidad, que
la informacin generada por un dispositivo llegu a los dispositivos destinatarios (capa de
transporte). Por ltimo, es responsabilidad del ncleo del sistema la identificacin de cada uno de
los dispositivos presentes en el bus de datos y el encaminado de los paquetes de informacin (capa
de red).
El modem PLC es el dispositivo fsico encargado de transmitir y recibir informacin por
medio del cableado elctrico (capa fsica) y de implementar el protocolo de acceso al medio fsico
de comunicacin que permita la transmisin de datos sin errores (capa de enlace).
Tanto el ncleo del sistema como el protocolo de enlace deben residir en el microcontrolador
del modem PLC para aprovechar al mximo las funcionalidades de ste dispositivo electrnico
bajando el costo en dinero del sistema.
FernandoArielBeunza79156 89
Tesis de Grado en Ingeniera Informtica
Como el dispositivo cliente virtual y el dispositivo de diagnstico se implementan sobre una PC, se
puede concentrar las tareas de los dispositivos anteriores en uno slo para ahorra la construccin de
uno de los modems.
Tanto para la PC que implemente el dispositivo cliente virtual como para la que supervise la
red necesitan interfaces en lenguaje C/C++ para poder construir aplicaciones que simulen un
dispositivo cliente y permitan visualizar el funcionamiento de la red respectivamente. Adems las
mencionadas interfaces van a permitir la construccin de un biblioteca de bloques Simulink que
permitan construir aplicaciones de prueba mediante modelos grficos.
Para los dispositivos clientes reales, dado que stos necesariamente deben contener un
microcontrolador para acceder al sistema, tambin necesitan una versin de la interfaz anterior para
simplificar el acceso al sistema de intercambio de informacin.
90 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
porcin del espectro destinado para las comunicaciones PLC, dejando libre el resto, para
convivencia con futuras aplicaciones basadas en ste tipo de comunicaciones sin necesidad de
modificar el esquema propuesto en la figura 4.2.
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
Tesis de Grado en Ingeniera Informtica
distinguir la fase de cada smbolo recibido que contiene la informacin. Debido a que la seal
resultante de la multiplicacin resulta tener cierta cantidad de ruido que no permite distinguir
fcilmente el valor de los bits de informacin recibidos, dicha seal es procesada por un bloque
integrador que tiene el efecto de filtro pasa bajo resultando una seal que vara de nivel segn el bit
de informacin recibido. Por ltimo, un bloque detector se encarga de comparar la seal resultante
del integrador contra un valor de referencia utilizado para determinar si el bit de informacin
recibido corresponden a un cero o un uno.
Los componentes bsicos del modem PLC prototipo (figura 4.4), se describen a
continuacin:
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.
94 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
FernandoArielBeunza79156 95
Tesis de Grado en Ingeniera Informtica
96 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Figura 4.5. Diagrama de bloques del transmisor y receptor de un modem PLC prototipo.
FernandoArielBeunza79156 97
Tesis de Grado en Ingeniera Informtica
menor relacin entre pico y promedio de amplitudes (conocido como PAR) del smbolo [Trnka06-2] ,
lo que permite que las amplitudes se encuentren comprendidas dentro de un rango de valores no
muy grande, para que el conversor analgico digital del receptor pueda digitalizar la seal recibida
de forma adecuada.
Con una frecuencia de operacin del microcontrolador de 11,0592 MHz, la duracin en
tiempo del smbolo es de 7,234 microsegundos aproximadamente, lo que implica una velocidad de
transferencia de informacin cercana a los 140 Kbps (dado que cada smbolo representa a un bit).
N Seal Cod. N Seal Cod. N Seal Cod. N Seal Cod. N Seal Cod.
1 2 09 17 -4 03 33 3 0A 49 3 04 65 4 0B
2 -3 04 18 -6 01 34 5 0C 50 0 07 66 3 0A
3 -6 01 19 -4 03 35 4 0B 51 1 08 67 0 07
4 -5 02 20 -2 05 36 4 0B 52 -2 05 68 -3 04
5 -2 05 21 -2 05 37 4 0B 53 -2 05 69 -2 05
6 0 07 22 -3 04 38 2 09 54 3 0A 70 2 09
7 0 07 23 0 07 39 -4 03 55 7 0E 71 4 0B
8 -1 06 24 3 0A 40 -6 01 56 4 0B 72 2 09
9 -1 06 25 2 09 41 -1 06 57 -2 05 73 -3 04
10 -1 06 26 -4 03 42 6 0D 58 -4 03 74 -3 04
11 0 07 27 -7 00 43 6 0D 59 0 07 75 2 09
12 1 08 28 -2 05 44 1 08 60 5 0C 76 7 0E
13 2 09 29 5 0C 45 -2 05 61 6 0D 77 6 0D
14 2 09 30 4 0B 46 -3 04 62 4 0B 78 6 0D
15 2 09 31 0 07 47 -3 04 63 4 0B 79 6 0D
16 0 07 32 -1 06 48 -4 03 64 4 0B 80 6 0D
Tabla 4.1. Valores de las muestras del smbolo.
Portadora
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Fase 180 -180 0 -180 -180 180 -180 0 180 -135 -180 0 -180 0 45 135 135 0 180
Tabla 4.3. Valores de fase de cada portadora del smbolo.
98 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Figura 4.6. Grfico de la seal sintetizada Figura 4.7. Grfico del espectro de la seal
correspondiente a un smbolo. sintetizada correspondiente a un smbolo.
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))
FernandoArielBeunza79156 99
Tesis de Grado en Ingeniera Informtica
100 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
Delimitador Delimitador
Datos
de inicio de fin
128 bits 3200 bits 16 bits
16 bytes 400 bytes 2 bytes
Figura 4.11. Estructura de una trama.
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.
102 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Las anteriores funciones brindan soporte a la subcapa de control de acceso al medio para que
sta pueda implementar el algoritmo que controla el acceso al medio, y el mecanismo de
confirmacin de recepcin.
Adems de las funciones descriptas hasta el momento, existen otras orientadas a la
realizacin de pruebas de funcionamiento, y para evaluacin de los componentes del hardware
descripta en el captulo 5. Las funciones permiten la generacin de seales de prueba utilizadas
verificar el correcto funcionamiento del hardware y evaluar la respuesta en frecuencia del mismo.
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
Tesis de Grado en Ingeniera Informtica
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.
104 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
106 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
posee a enviar un mensaje que circula por todo el anillo hasta volver al dispositivo que lo origin,
quien lo retira de circulacin (en circunstancias de normal funcionamiento). Las redes Token Bus
funcionan de modo similar, pero el anillo no es fsico sino que se crea un anillo lgico sobre una red
fsica tipo bus. Estos mtodos de acceso al medio mencionados y sus derivados pueden garantizar
un tiempo de acceso determinstico porque se puede calcular el tiempo mximo que un dispositivo
que entrega el testigo lo vuelve a obtener en funcin a la cantidad de dispositivos presentes en la
red. sto ltimo puede funcionar de forma eficiente con redes con pocos dispositivos, pero al
aumentar el nmero de dispositivos se eleva el tiempo que tarda el testigo en circular por toda la red
lo que puede provocar que las comunicaciones sean muy lentas. Adems el mantenimiento del
anillo requiere una lgica compleja ya que la cada de un dispositivo provoca que se rompa el anillo,
por lo que deben implementarse mtodos de recuperacin. Algo similar puede ocurrir si se pierde el
testigo, porque se perdi la conexin con el dispositivo que lo posea en ese momento.
Como los mtodos anteriores tiene como punto dbil la cantidad de dispositivos conectados
y el mantenimiento de la estructura lgica de comunicacin, han surgido con xito otros mtodos
que garantizan tiempos de acceso probabilsticos independientes de la cantidad de dispositivos de la
red, y con una lgica ms simple. El primero de ellos es el CSMA/CD [Stallings97] utilizado en las
redes Ethernet que consiste en que un dispositivo que desee transmitir un mensaje, primero debe
escuchar el canal y si se encuentra libre puede transmitir, en caso de que otro dispositivo haya hecho
algo similar ocurrir una colisin que ser detectada por ambos dispositivos; en tal caso cada uno
aplicar un tiempo de espera aleatorio y luego volvern a intentar transmitir. ste proceso puede
derivar en varios reintentos de transmisin que sumado a los tiempos de espera aleatorios hacen que
no se pueda garantizar un tiempo mximo de demora para transmitir un mensaje (carcter
probabilstico), pero ste mtodo de gestionar el medio no necesita de una lgica adicional para
mantener un anillo como ocurra en los mtodos de tiempo determinstico.
El mtodo CSMA/CD puede funcionar bien para transmisin de datos en general, pero no
resulta muy adecuado en aplicaciones de tiempo real en donde se necesita predecir con ms certeza
el tiempo que tarda en enviarse un mensaje a lo largo de la red, ms an sin existen muchos
dispositivos queriendo transmitir, lo que provoca el aumento de la colisiones. Para mejorar estos
inconvenientes han surgido modificaciones a ste mtodo que se centran en resolver las colisiones
para evitar la retransmisiones de mensajes que pueden ocasionar ms colisiones. Uno de ellos es el
utilizado en redes CAN y J1850 que trabaja con el esquema de bit dominante, en el cual cada
mensaje se compone de una cabecera con una secuencia de bits destinada al arbitraje en caso de que
se produzca una colisin. Si existen varios dispositivos transmitiendo en forma simultnea,
continuar transmitiendo el dispositivo cuya cabecera recibida coincida con la emitida, y los
restantes dispositivos detendrn la transmisin. ste mtodo logra establecer un sistema de
prioridad de transmisin lo cual permite un tratamiento diferenciado de los mensajes mejorando el
comportamiento en aplicaciones de tiempo real.
Para el caso particular del modem PLC existen diversos inconvenientes que dificultan o
impiden la implementacin de los mtodos anteriores. La implementacin de un mtodo basado en
el paso de testigos hara muy compleja la lgica de mantenimiento de un estructura lgica con forma
de anillo sobre una red de topologa tipo bus (similar a Token Bus). El mtodo CSMA/CD podra ser
una alternativa vlida, pero el modem PLC no puede escuchar el canal mientras transmite un
mensaje (problema que tambin presentan los dispositivos que trabajan con DC-BUS), porque
resulta muy costosa la implementacin con la tecnologa utilizada en el modem. Tampoco podra
implementarse un mtodo similar a CAN ya que no se puede definir un bit dominante, ya que el bit
dominante slo puede funcionar en esquemas de transmisin en banda base.
Entonces la alternativa surge de un mtodo empleado en redes inalmbricas y en redes
HomePlug que deriva del CSMA/CD, conocido como CSMA/CA [Stallings97], en donde si bien la
colisiones no se eliminan, se intentan evitar por el problema anteriormente expuesto para detectar
FernandoArielBeunza79156 107
Tesis de Grado en Ingeniera Informtica
las colisiones. Adems el mtodo CSMA/CA no requiere de escuchar el medio de forma simultnea
a la transmisin, sino que se transmite el mensaje y el destinatario del mismo es el encargado de
verificar si ste lleg sin errores, y en caso afirmativo le enva la confirmacin de recepcin al
transmisor. En caso de existir algn tipo de interferencia por colisin de mensajes o ruido en el
medio, el mensaje ser retransmitido luego de un tiempo de espera de duracin aleatoria (similar al
utilizado en CSMA/CD).
El mtodo CSMA/CA al igual que el CSMA/CD han sido diseados para redes de datos en
mbitos en donde las aplicaciones que hacen uso de ellas no son de tiempo real. En el caso
particular del presente trabajo se pretende poder determinar el tiempo de envo de un mensaje con
alguna certeza. Por esta razn, a lo largo de ste trabajo se irn introduciendo algunas mejoras que
apuntes a mejorar sta cuestin. Una de las mejoras que se introduce a este nivel, es la
implementacin de un sistema de prioridades para los mensajes. Dichas prioridades influyen en el
tiempo de espera entre las escuchas de canal (figura 4.12), haciendo que el nmero de prioridad sea
proporcional al tiempo de espera. Esto significa que un nmero bajo implica una espera corta y un
nmero alto una espera larga, haciendo que el nmero bajo signifique alta prioridad y un nmero
alto menos prioridad, debido a que el menor tiempo de espera implica ms oportunidades de ganar
el uso del canal para transmitir el mensaje.
108 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
El algoritmo de la figura 4.12 muestra las acciones involucradas en el envo de una trama.
Como se puede ver, cada vez que una trama no es recibida de forma correcta, sta debe
retransmitirse con un cierto costo de tiempo. Por las caractersticas del canal de comunicaciones
utilizado sto puede resultar frecuente, por lo cual no es recomendable enviar mucha informacin en
una trama, porque con slo un bit errado, se pierde toda la informacin contenida en la trama. Para
minimizar las prdidas de informacin, y disminuir el tiempo insumido por retransmisiones, se hace
necesario la implementacin de un esquema de fragmentacin a nivel de la subcapa de control de
acceso al medio.
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
que la longitud de una trama corta no puede superar el doble de la cantidad de bytes utilizados para
informacin de control de una trama (en este caso resulta 26 bytes * 2 = 52 bytes, ver figura 4.14).
Tamao Cdigo
Direccin Direccin Tipo de Tamao
Delimitador Protocolo Fragmento de Datos detector
de destino de origen paquete total
fragmento 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
Figura 4.14. Estructura de una trama.
FernandoArielBeunza79156 111
Tesis de Grado en Ingeniera Informtica
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).
112 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
resolucin de colisin. Cuando uno o varios dispositivos emiten una confirmacin de recepcin,
generan una seal de ruido de ocupacin del canal seguido de un silencio para indicar al transmisor
de la trama, y al resto de los dispositivos conectados, que la trama ha sido correctamente recibida.
Durante el silencio mencionado, los dispositivos escuchan la actividad del canal, debido a que si
alguno de los destinatarios reporta un error de recepcin lo har ocupando el espacio de silencio, y
de esta forma el resto de los dispositivos, aunque hayan recibido correctamente la trama, la
rechazarn. Este mecanismo descripto, logra garantizar que una trama sea recibida de forma
correcta por todos los destinatarios o en su defecto por ninguno, lo que provocar sucesivas
retransmisiones de la misma hasta lograr la correcta recepcin. En caso de no existir ningn
destinatario, luego de la transmisin de la trama habr silencio en el canal, y el transmisor
interpretar este silencio tambin como un error de transmisin.
El mecanismo de confirmacin de recepcin descripto es utilizado tanto para tramas
pequeas, como para fragmentos de una trama ms grande y para la peticin de envo. La no
confirmacin de recepcin de una peticin de envo evita el costo de tiempo de enviar los sucesivos
fragmentos con los datos de la trama. Gracias a ste mecanismo se puede ofrecer un servicio de
multicast confiable a las capas superiores, de una forma menos compleja que si se lo hiciera a nivel
de las capas superiores.
La cantidad de transmisiones que han tenido una falla son contabilizadas por el modem PLC,
y la cuenta es reiniciada al detectarse una transmisin correcta de una trama (sea una trama pequea
individual o todos los fragmentos de una trama mas larga). sta cuenta es independiente a la
utilizada para reportar la falla de envo de trama, y es utilizada para desactivar el dispositivo en caso
de sobrepasar la cantidad mxima de fallas permitidas. Cuando se desactiva el modem PLC, no se
pueden ni enviar ni recibir tramas, dado que se interpreta que por alguna razn el dispositivo no
puede comunicarse con el resto, por lo cual se lo fuerza a abandonar al red. La subcapa de control
de acceso al medio se limita a detectar esta situacin de falla, desactivar el dispositivo y notificarlo
a las capas superiores, para que alguna de estas se encargue de gestionar una posible reconexin a la
red.
FernandoArielBeunza79156 113
Tesis de Grado en Ingeniera Informtica
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.
114 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
FernandoArielBeunza79156 115
Tesis de Grado en Ingeniera Informtica
intermedio entre no tener ningn tipo de garanta (primer caso) y tener un canal dedicado en donde
fluyen los datos (segundo caso). ste tipo de conexin se orienta a mensajes aislados, pero con
confirmacin de recepcin, estableciendo un control de flujo de los mensajes entre el transmisor y
receptor.
Para el caso particular del modem PLC solamente se implementa el tercer tipo de conexin
(no orientado a la conexin con confirmacin de recepcin), como por ejemplo lo hacen CAN y
J1850, debido a que los protocolos que se encuentran por encima de la subcapa de control de lgica
de enlace emplean mensajes individuales y requieren control de flujo para evitar congestin en el
microcontrolador destinatario de los mensajes.
116 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Cdigo detector
Datos
de errores
8176 bits 16 bits
1022 bytes 2 bytes
Figura 4.15. Estructura de un paquete.
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
Tesis de Grado en Ingeniera Informtica
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.
118 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
que complementa al control de errores realizado por la subcapa inferior de control de acceso al
medio).
FernandoArielBeunza79156 119
Tesis de Grado en Ingeniera Informtica
Tipo de Direccin
Protocolo
mensaje lgica
8 bits 8 bits 32 bits
1 byte 1 byte 4 byte
Figura 4.17. Estructura de un mensaje.
void arp_init(void):
120 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
void arp_release(void):
Libera los recursos inicializados por la primitiva anterior.
FernandoArielBeunza79156 121
Tesis de Grado en Ingeniera Informtica
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.
122 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Esta primitiva verifica el estado de la interfaz fsica iface. 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 123
Tesis de Grado en Ingeniera Informtica
caso particular del presente trabajo se busca simpleza y capacidad de difusin, lo que orienta la
eleccin hacia el modelo no orientado a la conexin. Emplear ste modelo de comunicacin implica
que debe buscarse un mecanismo adicional para garantizar la confiabilidad. Por ejemplo, las redes
IP [Stallings97], son redes que hacen su mejor esfuerzo para que los mensajes lleguen a destino,
pero no brindan garanta de sto ltimo, delegando la confiabilidad al protocolo de transporte TCP
[Stallings97]. Un esquema similar presenta LonWorks, en donde la confiabilidad tambin se
traslada a la capa de transporte. En las redes utilizadas en automviles, las comunicaciones tambin
son no orientadas a la conexin, pero a diferencia del modelo IP, no delegan el problema de la
confiabilidad a capas superiores, ya que no implementan todas las capas del modelo OSI, tendiendo
a resolver ste problema a nivel de capa de enlace. Las redes CAN y J1850 implementan un sistema
de confirmacin de recepcin para mensajes de difusin (multicast y broadcast). Las redes D2B y
MOST se basan en una topologa anillo que permite confirmar la recepcin de los mensajes.
En el caso particular del presente trabajo, se sigue el modelo de capas como lo hace el
modelo IP y LonWorks, pero tambin se busca la simpleza y capacidad de difusin de una
comunicacin no orientada a la conexin, con el agregado de confiabilidad, siguiendo tambin las
ideas de las redes de automviles. Como ya se mencion con anterioridad, la capa de enlace
propuesta permite garantizar que mensajes de difusin tengan confirmacin de recepcin (igual que
CAN y J1850), no trasladando el problema a las capas superiores, para simplificar la
implementacin de stas ltimas.
124 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 125
Tesis de Grado en Ingeniera Informtica
Identificador
Versin Protocolo Tamao Datos
de mensaje
(capacidad mxima de
8 bits 8 bits 8 bits 16 bits
capa de enlace - 40) bits
(capacidad mxima de
1 byte 1 byte 1 byte 2 bytes
capa de enlace - 5) bytes
Figura 4.19. Estructura de un mensaje.
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):
126 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Recibe msgsize bytes que se transfieren a msg, de un mensaje recibido a travs de la red
cuyo identificador es msgid. Cuando se recibe un mensaje por medio de la capa de enlace,
se invoca la funcin dedicada a recepcin y procesamiento de paquetes. Si luego de
interpretar un paquete recibido, ste resulta vlido, se almacena el mensaje recibido en el
buffer de la capa de red. El mensaje recibido tiene asociado un protocolo de la capa
superior devuelto a travs de prot. 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 algn mensaje.
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
Tesis de Grado en Ingeniera Informtica
128 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
la informacin durante la existencia de una conexin entre transmisor y receptor, que puede
perderse por diversas situaciones. La capa de sesin es la encargada de brindar a las capas
superiores un servicio de conexin entre dispositivos que gestione de forma automtica las
reconexiones, en caso de que la capa de transporte notifique una prdida de conexin, y que la
informacin enviada por un dispositivo hacia varios destinatarios sea la misma (si un dispositivo
enva varios mensajes, los destinatarios deben recibirlos todos y en el mismo orden).
FernandoArielBeunza79156 133
Tesis de Grado en Ingeniera Informtica
134 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 135
Tesis de Grado en Ingeniera Informtica
Versin Datos
(capacidad mxima de
8 bits
capa de transporte - 8) bits
(capacidad mxima de
1 byte
capa de transporte - 1) bytes
Figura 4.26. Estructura de un mensaje.
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):
136 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Enva un mensaje msg de longitud msgsize del tipo type por medio del grupo de difusin
grpid. El mensaje puede excluirse de la secuencia de mensajes enviados por medio de la
activacin del indicador nosec, que en caso de una resincronizacin 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.
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
Tesis de Grado en Ingeniera Informtica
138 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
La capa de presentacin implementa una forma propia de representar cada uno de los tipos
de datos anteriores que es independiente de la representacin utilizada por la plataforma. sto
ltimo afecta a los tipos de datos atmicos, cuya representacin se describe a continuacin:
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
Tesis de Grado en Ingeniera Informtica
Tipo de Cantidad
Datos
campo de datos
8 bits 8 bits (tamao tipo de dato * cantidad de datos) bits
1 byte 1 byte (tamao tipo de dato * cantidad de datos) bytes
Figura 4.27. Estructura de un campo de datos.
Datos: rea donde se almacenan el o los datos. La capacidad sta limitada por la
capacidad mxima de transporte del mensaje.
FernandoArielBeunza79156 141
Tesis de Grado en Ingeniera Informtica
Establece que el dispositivo es el publicador del grupo de difusin grpid, por medio de la
conexin hd. Si esta operacin se realiz correctamente y devuelve como resultado el
valor uno, sino devuelve cero.
142 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Extrae del mensaje msg el identificador de grupo de difusin por el cual fue recibido. Si
esta operacin se realiz correctamente, devuelve como resultado el valor uno, sino
devuelve cero.
FernandoArielBeunza79156 143
Tesis de Grado en Ingeniera Informtica
144 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 145
Tesis de Grado en Ingeniera Informtica
146 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 147
Tesis de Grado en Ingeniera Informtica
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):
148 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Esta primitiva verifica si hay algn mensaje a la espera de ser recibido. Devuelve como
resultado uno si existe un mensaje a la espera de ser recibido. Caso contrario, el resultado
devuelto es cero.
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
Tesis de Grado en Ingeniera Informtica
Extrae del mensaje, el identificador de grupo de difusin por el cual fue recibido. Si esta
operacin se realiz correctamente, devuelve como resultado el valor uno, sino devuelve
cero.
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 151
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 153
Tesis de Grado en Ingeniera Informtica
154 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 155
Tesis de Grado en Ingeniera Informtica
156 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 157
Tesis de Grado en Ingeniera Informtica
158 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 159
Tesis de Grado en Ingeniera Informtica
160 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Figura 5.1. Portadora de 138,237 KHz transmitida Figura 5.2. Portadora de 138,237KHz recibida por
por A. B.
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
Tesis de Grado en Ingeniera Informtica
Figura 5.3. Portadora de 552,947 KHz transmitida Figura 5.4. Portadora de 552,947 KHz recibida por
por A. B.
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:
Figura 5.5. Portadora de 138,237 KHz transmitida Figura 5.6. Portadora de 138,237KHz recibida por
por B. A.
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
Tesis de Grado en Ingeniera Informtica
Figura 5.7. Portadora de 552,947 KHz transmitida Figura 5.8. Portadora de 552,947 KHz recibida por
por B. A.
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.
Figura 5.9. Seal transmitida y su espectro. Figura 5.10. Seal recibida y su espectro.
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
Tesis de Grado en Ingeniera Informtica
Figura 5.11. Seal presente en la entrada de Figura 5.12. Seal presente en la lnea de potencia.
alimentacin del modem PLC.
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 165
Tesis de Grado en Ingeniera Informtica
166 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 167
Tesis de Grado en Ingeniera Informtica
En los grficos anteriores se pueden observar una trama de bits asociada una la seal de
informacin generada por el mdulo de procesamiento de seales, en donde claramente se pueden
diferenciar los valores de los bits de la trama. A continuacin se muestran dos tramas de bits
generadas y recibidas por los mdulos de procesamiento de seales implementados en la realidad.
La prueba se realiza en ambos sentidos, el modem A transmitiendo y el modem B recibiendo, y
viceversa.
Figura 5.13. Trama de bits transmitida por A Figura 5.14. Trama de bits transmitida por B
recibida por B. recibida por A.
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).
168 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
de 2.2uH, un tramo de cable doble (positivo y negativo), uno de los modems PLC, otro tramo de
cable, y el otro modem PLC. Las pruebas consisten de observar el comportamiento de los modems
variando la ubicacin y el largo del tramo de cable que los separa. El comportamiento de los
modems se evala generando una serie de tramas de contenido y tamao aleatorio, envindolas por
uno de los modems y recibiendo la misma trama por el otro modem, y comparando la trama enviada
con la recibida; para observar la cantidad de bits que se pierden, que se reciben con error, as como
tambin las tramas que se pierden y que se reciben pero deben ser descartadas porque presentan
algn bit errado.
A continuacin se presenta la primer configuracin de red, que se puede observar en la
figura 5.15, en donde el largo del tramo de cable que une el filtro con el Modem PLC designado con
la letra A, denominado D1, es de 1,5 metros, y el tramo de cable que une el Modem PLC A con el
Modem PLC B, denominado D2, vara su longitud.
FernandoArielBeunza79156 169
Tesis de Grado en Ingeniera Informtica
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:
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
Tesis de Grado en Ingeniera Informtica
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:
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
Tesis de Grado en Ingeniera Informtica
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:
172 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
FernandoArielBeunza79156 173
Tesis de Grado en Ingeniera Informtica
En la tabla 5.7 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 la corta longitud del cable utilizado. De similar forma que se realiz en las anteriores
pruebas, se obtiene el comportamiento promedio, como se puede observar en la tabla 5.8.
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.
35,000% 1,600%
30,000% 1,400%
25,000% 1,200%
Bits perdidos
1,000%
20,000%
Bits errneos
0,800%
15,000%
0,600%
10,000%
0,400%
5,000%
0,200%
0,000% 0,000%
0 5 10 15 20 25 30 35 0 5 10 15 20 25 30 35
Metros Metros
AB BA 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
Tesis de Grado en Ingeniera Informtica
A continuacin se realiza el mismo anlisis, pero esta vez se toman en cuenta el porcentaje
de tramas perdidas y errneas. A diferencia de los bits, en el caso de las tramas slo basta un bit
errneo para descartar una trama completa (lo que hace la capa de enlace). Entonces los grficos de
las figuras 5.19 y 5.20, reflejan que tan buenos son los modems transmitiendo informacin, sin tener
en cuenta ningn mtodo que puede mejorar el desempeo de los mismos (como por ejemplo la
fragmentacin de la informacin enviada, etc.).
35,000% 50,000%
45,000%
30,000%
40,000%
25,000%
Tramas errneas
Tramas perdidas
35,000%
20,000% 30,000%
25,000%
15,000% 20,000%
10,000% 15,000%
10,000%
5,000%
5,000%
0,000% 0,000%
0 5 10 15 20 25 30 35 0 5 10 15 20 25 30 35
Metros Metros
AB BA AB BA
Figura 5.19. Tasa promedio de tramas perdidas Figura 5.20. Tasa promedio de tramas errneas
segn longitud del cable y disposicin de los segn longitud del cable y disposicin de los
modems PLC. modems PLC.
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
Tesis de Grado en Ingeniera Informtica
25,000% 0,800%
0,700%
20,000%
0,600%
Bits errneos
0,500%
Bits perdidos
15,000%
0,400%
10,000% 0,300%
0,200%
5,000%
0,100%
0,000% 0,000%
cable comn cable coaxil cable comn cable coaxil
Tipo de cable Tipo de cable
AB BA AB BA
Figura 5.21. Tasa promedio de bits perdidos segn Figura 5.22. Tasa promedio de bits errneos segn
tipo de cable y disposicin de los modems PLC. tipo de cable y disposicin de los modems PLC.
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%
18,000%
30,000%
16,000%
Tramas errneas
Tramas perdidas
14,000% 25,000%
12,000%
20,000%
10,000%
8,000% 15,000%
6,000% 10,000%
4,000%
5,000%
2,000%
0,000% 0,000%
cable comn cable coaxil cable comn cable coaxil
Tipo de cable Tipo de cable
AB BA AB BA
Figura 5.23. Tasa promedio de tramas perdidas Figura 5.24. Tasa promedio de tramas errneas
segn tipo de cable y disposicin de los modems segn tipo de cable y disposicin de los modems
PLC. PLC.
176 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
35,000% 1,400%
30,000% 1,200%
25,000% 1,000%
Bits errneos
Bits perdidos
20,000% 0,800%
15,000% 0,600%
10,000% 0,400%
5,000% 0,200%
0,000% 0,000%
0 5 10 15 20 25 30 35 0 5 10 15 20 25 30 35
Metros Metros
Figura 5.25. Tasa promedio de bits perdidos segn Figura 5.26. Tasa promedio de bits errneos segn
longitud del cable. longitud del cable.
FernandoArielBeunza79156 177
Tesis de Grado en Ingeniera Informtica
35,000% 50,000%
45,000%
30,000%
40,000%
Tramas erroneas
Tramas perdidas
25,000% 35,000%
30,000%
20,000%
25,000%
15,000% 20,000%
10,000% 15,000%
10,000%
5,000%
5,000%
0,000% 0,000%
0 5 10 15 20 25 30 35 0 5 10 15 20 25 30 35
Metros Metros
Figura 5.27. Tasa promedio de tramas perdidas Figura 5.28. Tasa promedio de tramas errneas
segn longitud del cable. segn longitud del cable.
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%.
Con referencia al tipo de cable utilizado, la tasa de perdidas mejora con la calidad del cable,
pero empeora la tasa de error debido a que al ser recibidos ms bits aumenta las probabilidades de
ocurrencia de error.
178 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Tanto en DC-BUS como en la solucin propuesta, el medio fsico utilizado como canal de
comunicacin son las lneas de potencia. Las diferencias se encuentran tcnicas de codificacin de
los bits de datos. DC-BUS codifica los bits empleando dos portadoras, para brindar robustez en las
comunicaciones, sin demasiadas complejidad de implementacin. La solucin propuesta emplea
otra tcnica que permite, de forma no mucho ms costosa, utilizar 19 portadoras moduladas en
DBPSK, lo que otorga mayor robustez que la ofrecida por DC-BUS. La desventaja que presenta ste
ltimo mtodo frente al propuesto por DC-BUS es que ocupa mayor ancho de banda, que no permite
ofrecer diversos tipos de comunicaciones como los ofrece DC-BUS.
La topologa de red empleada por DC-BUS y la solucin propuesta, son idnticas ya que
ambas alternativas trabajan sobre la red de alimentacin presente en un automvil.
El mtodo de control de acceso al medio utilizado por DC-BUS se encuentra preparado para
ser compatible con CAN. Se trata de un protocolo de la familia CSMA, que permite la resolucin de
colisiones por medio de un mecanismo especialmente diseado para funcionar con las
caractersticas de DC-BUS (no tiene la capacidad de deteccin de colisiones). La solucin propuesta
en el presente trabajo, trabaja con una versin del protocolo CSMA/CA mejorado, que se basa en
evitar las colisiones, ya que tambin existe el problema de no poder detectar colisiones. ste
problema se encuentra en las dos alternativas debido a que ambos diseos no son capaces de
transmitir y escuchar en forma simultnea, por razones de complejidad de implementacin.
DC-BUS tiene la capacidad de brindar tres tipos de comunicaciones orientadas a tres tipos de
aplicaciones. Brinda soporte para comunicaciones de baja velocidad utilizadas por aplicaciones de
mecatrnica y uso general, comunicaciones de velocidad media requeridas por aplicaciones de
telemtica, y comunicaciones de alta velocidad destinadas a aplicaciones de multimedia. sto se
debe a lo explicado anteriormente sobre el modo de emplear el medio fsico, la simpleza en la forma
de codificar la informacin y el ancho de banda utilizado, permiten implementar varios canales de
comunicacin para diferentes tipos de comunicaciones. En cambio la solucin propuesta, por
cuestiones de complejidad y ancho de banda utilizado, solamente puede brindar soporte a un solo
tipo de comunicaciones que puede ser utilizado por aplicaciones generales o telemtica (velocidad
de transferencia media a baja).
FernandoArielBeunza79156 179
Tesis de Grado en Ingeniera Informtica
la Facultad de Ingeniera Elctrica sintetiza directamente la seal smbolo con portadoras dentro
del rango entre los 4 a 16 MHz, mientras que las solucin de ste trabajo sintetiza la seal smbolo
en baja frecuencia (por debajo de los 3 MHz), y luego traslada la seal sintetizada por medio de un
convertidor de frecuencias al rango comprendido entre 12 y 16 MHz (aproximadamente).
180 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
similar derivada del CSMA/CA, diseada para evitar las colisiones de mensajes, con el agregado de
un esquema de prioridades. El protocolo no resulta ser determinstico, pero el esquema de
prioridades introduce mejoras respecto a ste tema, comparado con la versin original CSMA/CA.
La independencia de CAN sobre el medio fsico, permite la implementacin de redes con
diversas capacidades. Pueden configurarse redes extensas para interconectar dispositivos que
requieran comunicaciones de baja velocidad de transferencia, o bien redes de longitud limitada pero
que permitan altas velocidades de transferencia de datos para aplicaciones crticas. Las tramas
utilizadas por CAN para el transporte de datos presentan una capacidad limitada de 8 bytes,
suficiente para las aplicaciones a las que se orienta este tipo de red. La propuesta de ste trabajo,
solamente brinda soporte de comunicaciones a aplicaciones de uso general y de telemtica
(velocidades de transferencia baja y media), y para expandir las capacidades se requiere de
modificaciones a la implementacin de la capa fsica. Como ventaja sobre CAN, la solucin
propuesta emplea tramas que pueden contener hasta 1024 bytes, ya que se encuentran orientadas a
aplicaciones generales.
FernandoArielBeunza79156 181
Tesis de Grado en Ingeniera Informtica
182 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 183
Tesis de Grado en Ingeniera Informtica
184 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 185
Tesis de Grado en Ingeniera Informtica
186 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 187
Tesis de Grado en Ingeniera Informtica
188 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
FernandoArielBeunza79156 189
Tesis de Grado en Ingeniera Informtica
automviles. Introducir la tecnologa PLC en los automviles resulta una idea adecuada ya que se
reduce al mnimo el cableado, ya que siempre se va a requerir de alimentacin a los dispositivos por
lo cual la red de alimentacin nunca se podr eliminar. Es un medio fsico con algunas dificultades
adicionales con respecto a las lneas de potencia presentes en infraestructura edilicia, es un medio
mucho ms ruidoso que dificulta las comunicaciones confiables; de hecho las redes utilizadas en la
actualidad se caracterizan por su robustez ante interferencias, y hasta emplean fibra ptica para
transmisiones de alta velocidad. Sin embargo, el poder de los microcontroladores en aumento
permite la implementacin de tcnicas de modulacin y codificacin de la informacin que
permiten comunicaciones de mejor calidad, a pesar del medio sobre el cual se llevan a cabo.
El diseo del prototipo alcanza resultados satisfactorios comparado con el prototipo
propuesto por los trabajos realizados por la Facultad de Ingeniera Elctrica de la Universidad
Tcnica Checa de Praga. Aunque la tecnologa aplicada para la implementacin del prototipo
propuesto por el presente trabajo es inferior a la utilizada en el prototipo propuesto en el antecedente
mencionado anteriormente, cumple con los requerimientos bsicos necesarios para demostrar el
funcionamiento correcto del conjunto que compone la propuesta planteada por ste trabajo. Gracias
a sto se puede decir que en el futuro, se puede proponer un prototipo ms evolucionado
tecnolgicamente, y se van obtener iguales o mejores resultados ya que muchos conceptos
planteados en el presente trabajo continan siendo vlidos independientemente de la tecnologa de
implementacin, porque el modelo de capas adoptado permite sto ltimo.
Aunque el servicio de comunicacin que puede brindar el sistema propuesto en el presente
trabajo no alcance la calidad de estndares comerciales, en cuanto a soluciones determinsticas
como por ejemplo las ofrecidas por CAN y J1850, o altas velocidades de transferencia como D2B,
MOST y FlexRay; se debe recordar que el desarrollo se trata de un prototipo que fundamentalmente
pretende evaluar la viabilidad de la propuesta y servir para la construccin en un futuro de un
sistema comercial que tome como antecedentes los conceptos probados en ste trabajo. La solucin
propuesta tiene inconvenientes similares que el antecedente DC-BUS, a la hora de implementar un
mecanismo de control de acceso al medio, porque a diferencia de muchas de las redes de datos de
automviles que pueden escuchar el medio fsico y transmitir en simultneo, stas no lo pueden
realizar por cuestiones de complejidad en la implementacin. Los mecanismos implementados en
ambos casos fueron diseados especialmente, DC-BUS implementa un mecanismo propio, mientras
que la solucin propuesta en ste trabajo adapta el protocolo CSMA/CA y lo combina con un
esquema de prioridad para acercarlo a una solucin determinstica. De todos modos, el prototipo no
fue pensado para aplicaciones crticas sino para aplicaciones generales y telemtica que requieren
velocidades bajas y medias. El empleo de microcontroladores ms potentes en un futuro podra
mejorar el sistema prototipo propuesto para brindar varios tipos de servicios de comunicaciones
como ofrecen, por ejemplo MOST y FlexRay, paquetes de datos, flujos de datos de multimedia, etc.
La implementacin de las siete capas por parte del solucin propuesta en ste trabajo permite
la introduccin de funcionalidades no encontradas en las alternativas para automviles estudiadas.
Una de ellas es el concepto de redes lgicas, por lo cual se independiza la red fsica asociada al
cableado instalado, de como se organizan los distintos dispositivos conectados a la red anterior. ste
concepto es tomado de las redes IP, donde el protocolo IP de la capa de red implementa un esquema
de direccionamiento y de encaminado de paquetes independiente del soporte fsico utilizado para
comunicaciones. De ste modo se da libertad de evolucin a las capas inferiores (capa fsica y de
enlace), ms vinculadas al hardware y de ms rpida evolucin acompaando a las nuevas
tecnolgicas.
Otro aspecto que merece ser analizado es el transporte de datos, que aunque muchos de los
antecedentes estudiados no implemente una capa de transporte especfica, resuelven de alguna
forma la problemtica relacionada con ste tema. En general, el transporte de datos de forma
confiable, viene garantizado por la capa de enlace, por ejemplo CAN y J1850 implementan un
190 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
mecanismo de multicast confiable, D2B y MOST trabajan con esquema de paso de testigo. sta
manera de encarar el problema resulta las ms simple de implementar, a diferencia de redes IP que
requieren de un protocolo de transporte de una cierta complejidad, aceptable en una computadora,
pero que resulta inadecuada para la implementacin de dispositivos de un automvil. La solucin
propuesta tambin toma la idea de sus antecedentes y fortalece las capacidades de la capa de enlace,
lo que le permite implementar una capa de transporte ms simple que la del modelo TCP/IP. Los
servicios brindados por sta capa de transporte son dos tipos de mensajera, una de mensajes
secuenciados orientadas a transporte de datos de configuracin de dispositivo que no requieren
urgencia pero si garanta de que lleguen a destino y en siguiendo un orden, y otro de mensajes no
secuenciado orientado a rdenes que requieren que lleguen a destino lo ms rpido posible. Como
ya se hizo mencin con anterioridad, la solucin propuesta no ofrece otros tipos de servicios de
comunicacin orientados por ejemplo a multimedia, como si lo ofrece MOST, ya que se trata de un
sistema prototipo cuyo objetivo no es proponer un sistema comercial, aunque el diseo no impide
que en el futuro se puedan proponer nuevas ideas.
El diseo del prototipo de modem PLC implementa las capas fsica, de enlace, red,
transporte y sesin; no puede implementar las capas de presentacin y aplicacin porque dependen
del dispositivo cliente. Si se quisiera implementar las siete capas de forma conjunta debe realizarse
dentro del mismo microcontrolador del dispositivo cliente, por la dependencia mencionada
anteriormente. Las capas de presentacin y aplicacin son dependientes del dispositivo cliente
porque la primera est relacionada como se representan y estructuran los datos (dependiente de la
plataforma), y la segunda es la interfaz con la cual se relaciona la aplicacin cliente con el sistema
de comunicacin. Ninguno de los antecedentes analizados en ste trabajo implementa la capa de
presentacin, salvo el modelo LonWorks que implementa las siete capas pero no se utiliza en
automviles; trasladndose el problema al dispositivo cliente para que lo resuelva de alguna forma.
En cambio la propuesta del presente trabajo, resuelve todos los problemas planteados por cada una
de las siete capas, y disea el prototipo para que la solucin tenga la mejor relacin costo beneficio
para el dispositivo cliente (agrega la implementacin de dos capas, pero el sistema ofrece los
beneficios de las siete).
Un beneficio adicional, a consecuencia de lo anterior, es que se puede implementar una
versin de capa de presentacin y de aplicacin para PC. La propuesta del presente trabajo las
implementa para brindar una herramienta de simulacin de dispositivos clientes, que resulta de gran
utilidad para el diseo y posterior implementacin de los mismos, algo no ofrecido por ninguno de
los antecedentes estudiados. Tambin permite la implementacin de un entorno grfico como
Simulink para el modelado de dispositivos clientes virtuales, que libera a los desarrolladores de
dichos dispositivos de tener conocimientos de programacin
FernandoArielBeunza79156 191
Tesis de Grado en Ingeniera Informtica
maquinaria agrcola, barcos, aviones, etc. La solucin propuesta podra adaptarse a todo mbito en
donde exista el problema de reduccin de cableado como ocurre en los automviles.
Uno de los aspectos mejorables a la solucin propuesta por el presente trabajo se encuentra
relacionado con las tcnicas de modulacin y codificacin de la informacin. La implementacin
propuesta resulta en una solucin bsica orientada a brindar servicios de comunicacin elementales.
Conociendo las opciones que brindan algunos antecedentes estudiados, se puede tomar la idea
planteada por DC-BUS de trabajar con varias bandas de frecuencia para proveer distintos tipos de
canales de comunicacin para aplicaciones generales, telemtica y multimedia. Tambin se puede
mejorar la velocidad de transferencia empleando otras tcnicas de modulacin y codificacin de la
informacin que requieren necesariamente mayor capacidad de computo por parte del
microcontrolador utilizado para implementar el modem PLC.
Algo relacionado con el tema anterior, y tambin mejorable es el protocolo de control de
acceso al medio. Si en el futuro se desea brindar soporte para comunicacin de diversos tipos de
datos, como paquetes de datos, multimedia, etc., como por ejemplo brinda MOST, debe volverse a
plantear el protocolo de acceso al medio; los paquetes de datos pueden contener informacin crtica
o no (por lo cual las caractersticas del protocolo empleado pueden variar), y la informacin
multimedia requiere la asignacin de un ancho de banda constante. Por un razn lgica, para
implementar la sugerencia anterior, necesariamente debe utilizarse un microcontrolador con mayor
poder de computo (como el ofrecido por los micrcocontroladores de la familia ARM) que el
utilizado en la solucin propuesta en el presente trabajo.
Una funcionalidad futura que se puede sugerir es la integracin del sistema propuesto con
otras redes, similar a lo que ocurre con CAN y LIN. La implementacin de dispositivos que
funcionen como puente entre el sistema de comunicaciones PLC y otro tipo de red, contribuye en la
adopcin progresiva de sta tecnologa en aplicaciones comerciales. Adems toda nueva tecnologa
al comienzo es costosa de implementar, por lo cual al comienzo no muchos dispositivos la adoptan,
entonces el disponer de algunos dispositivos puente con otras redes que ofrezcan soluciones de
interconexin ms econmicas resultan en una propuesta razonable.
El modelo de implementacin de cinco capas dentro del modem PLC y dos en el dispositivo
cliente en un futuro puede ser replanteado, disponiendo de microcontroladores con alto poder de
computo (por ejemplo, ARM9) para implementar las siete capas en un slo dispositivo electrnico.
Tambin puede ser viable si el dispositivo cliente es tan complejo que supere en varios rdenes de
complejidad a las siete capas del sistema de comunicacin.
En cuanto a las interfaces de uso del sistema de comunicacin planteado en ste trabajo, la
implementacin incluye una interfaz C/C++ y una biblioteca de bloques Simulink para mostrar que
se puede continuar el desarrollo por encima de la capa de aplicacin. Las interfaces mencionadas
son de utilidad para simulaciones en una PC de dispositivos clientes virtuales, pero se limita a dos
entornos. Una contribucin hacia el futuro puede ser plantear interfaces para distintos lenguajes de
programacin e interfaces grficas para entornos de simulacin similares a Simulink.
192 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
7. Referencias
[Alcar07] Alcar H.: Power Line Communicacion en Argentina Revista
Coordenadas, 2007
[AlleyAtwood68] Alley C., Atwood K.: Ingeniera Electrnica 1ra. Edicin, 1968
[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-for-
powerline.pdf
[BenziFacchinettiCaprini08] Benzi F., Facchinetti T., Caprini D.: Powerline Protocols Review,
evaluation and test for automotive applications, 2008
www.etec.polimi.it/emc-chap-
it/download/slides_Pavia_4_nov_2008.pdf
FernandoArielBeunza79156 193
Tesis de Grado en Ingeniera Informtica
[IEEEP1901] IEEE, IEEE P1901: Standard for Broadband over Power Line
Networks: Medium Access Control and Physical Layer
Specifications, 2010
http://grouper.ieee.org/groups/1901/
194 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
[LeenHeffernanDunne] Leen G., Heffernan D., Dunne A.: Digital Networks in Automotive
Vehicle
http://nicozone.free.fr/206/VAN/fp16.pdf
[OppenheimWillsky97] Oppenheim A., Willsky A.: Seales y Sistemas 2da. Edicin, 1997
FernandoArielBeunza79156 195
Tesis de Grado en Ingeniera Informtica
[Paret05] Paret D.: Multiplexed Networks for Embbeded Systems CAN, LIN,
Flexray, Safe-by-Wire..., 2005
http://books.google.com.ar/books?
id=GfY38U8s3DIC&printsec=frontcover&hl=es#v=onepage&q&f=f
alse
[Reuss93] Reuss H.: Extended Frame Format - A New Option of the CAN
Protocol, 1993
http://cst.mi.fu-
berlin.de/projects/ScatterWeb/moduleComponents/CanBus_CAN2.p
df
[Stallings97] Stallings W.: Data and Computer Comunications 5th. Edition, 1997
[StrangRckl] Strang T., Rckl M.: Vehicle Networks Controller Area Network
(CAN)
http://www.sti-innsbruck.at/fileadmin/documents/vn-ws0809/02-
VN-CAN.pdf
196 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
[Zeltwanger] Zeltwanger H.: Introduction into CAN physical and data link layer
http://www.can-expo.ru/files/physical.pdf
FernandoArielBeunza79156 197
Tesis de Grado en Ingeniera Informtica
198 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Los mdulos constituyentes del modem PLC prototipo (figura A1), se describe a
continuacin:
FernandoArielBeunza79156 199
Tesis de Grado en Ingeniera Informtica
El Filtro consiste en un filtro pasivo que rechaza la banda de frecuencias utilizada para
transmitir la informacin. Entrega por un lado la seal de potencia utilizada para
alimentacin libre de ruido, y por otro, la seal de informacin, en forma separada.
El Transmisor se encuentra constituido por un amplificador de entrada, un convertidor de
frecuencias, un amplificador de salida y un circuito de acoplamiento. La seal de
informacin es filtrada y amplificada por el amplificador de entradas. Luego la seal
resultante es trasladada en frecuencia por el convertidor de frecuencias. La resultante de la
conversin de frecuencias es amplificada por el amplificador de salida que se encarga de
repetir la misma seal de entrada con la fuerza suficiente para propagarse por la red PLC.
El circuito de acoplamiento se encarga de acoplar la salida del amplificador de salida con
la red de potencia.
El Receptor se encuentra constituido por un circuito de desacomplamiento, un
amplificador de entrada, un convertidor de frecuencias y un amplificador de salida. El
circuito de desacomplamiento filtra la seal de potencia, dejando solamente la seal con
la informacin que es amplificada y filtrada por el amplificador de entrada. La seal
resultante es convertida en frecuencia por el convertidor de frecuencias, y la seal de
salida de dicho convertidor es filtrada y amplificada por el amplificador de salida.
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
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 201
Tesis de Grado en Ingeniera Informtica
202 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 203
Tesis de Grado en Ingeniera Informtica
204 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 205
Tesis de Grado en Ingeniera Informtica
206 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 207
Tesis de Grado en Ingeniera Informtica
208 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 209
Tesis de Grado en Ingeniera Informtica
210 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 211
Tesis de Grado en Ingeniera Informtica
212 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 213
Tesis de Grado en Ingeniera Informtica
0x0000
Firmware
Cargador
0x1FFF
0x2000
RAM de
datos
0x7FFF
0x8000
Firmware
Modem PLC
0xFFFF
Figura A2. Organizacin del banco de memoria (vista por el firmware cargador).
214 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
216 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 217
Tesis de Grado en Ingeniera Informtica
218 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 219
Tesis de Grado en Ingeniera Informtica
220 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 221
Tesis de Grado en Ingeniera Informtica
salida del Amplificador de salida, a la vez que permite el paso de la seal generada por el
Amplificador de salida hacia la red de potencia.
222 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 223
Tesis de Grado en Ingeniera Informtica
224 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 225
Tesis de Grado en Ingeniera Informtica
226 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 227
Tesis de Grado en Ingeniera Informtica
228 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 229
Tesis de Grado en Ingeniera Informtica
230 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 231
Tesis de Grado en Ingeniera Informtica
232 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 233
Tesis de Grado en Ingeniera Informtica
234 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 235
Tesis de Grado en Ingeniera Informtica
236 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 237
Tesis de Grado en Ingeniera Informtica
238 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 239
Tesis de Grado en Ingeniera Informtica
Capa de aplicacin
(varia segn plataforma)
Capa de presentacin
(varia segn plataforma)
Interfaz RS232 (dispositivo cliente)
(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 Control de lgica de enlace
(ARP) (LLC)
arp.h arp.c llc.h llc.c
Control de acceso al medio (MAC)
mac.h mac.c
Capa fsica (mdulo de procesamiento)
phy.h phy.c
Capa fsica (mdulo de procesamiento de seales)
phy.h phy.c main.c
Figura C1. Diagrama de organizacin de cdigo.
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
Interfaz RS232 (dispositivo cliente)
serial.h serial.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
Tesis de Grado en Ingeniera Informtica
AT89X5X. Debajo la capa de presentacin existe una interfaz RS232 encargada de las
comunicaciones entre el modem PLC y el dispositivo cliente.
Capa de aplicacin
modplcap.h modplcap.c
Capa de presentacin Interfaz capa de enlace Interfaz capa fsica
modplcpp.h modplcpp.c modplcdl.h modplcdl.c modplcphy.h modplcphy.c
Interfaz capa de sesin
modplcsp.h modplcsp.c
Interfaz RS232 Driver (dispositivo cliente)
serial.h serial.c modplc.h modplc.c modsp.h modsp.c moddl.h moddl.c modphy.h
modphy.c moddrv.h moddrv.c modem_driver.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
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
/* Tipos de reset. */
#define MODPLC_NORMRESET '0'
#define MODPLC_PARAMRESET '$'
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER '1'
#define MODPLC_DATALINKLAYER '2'
#define MODPLC_SESSIONLAYER '3'
/* Capa de sesin. */
#endif
242 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#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; /* Identificador de mensaje. */
modplcpp_msg msg; /* Mensaje. */
} modplcap_msg;
} modplcap_hd;
#else
typedef struct
{
modplcpp_hd *modpphd; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
FernandoArielBeunza79156 243
Tesis de Grado en Ingeniera Informtica
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAP_NULLTYPE 0x00
#define MODPLCAP_CHARTYPE 0x01
#define MODPLCAP_SINT8TYPE 0x02
#define MODPLCAP_UINT8TYPE 0x03
#define MODPLCAP_SINT16TYPE 0x04
#define MODPLCAP_UINT16TYPE 0x05
#define MODPLCAP_SINT32TYPE 0x06
#define MODPLCAP_UINT32TYPE 0x07
#define MODPLCAP_FLOATTYPE 0x08
/*
Funcin modplcap__init:
Inicializa los recursos utilizados por la capa de aplicacin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
__data modplcap_hd *modplcap__init(int, short int);
#else
modplcap_hd *modplcap__init(int, short int);
#endif
/*
Funcin modplcap__init:
Inicializa los recursos utilizados por la capa de aplicacin del modem PLC.
*/
#define modplcap_init(sid)\
modplcap__init(sid, MODPLCAP_MSGSIZE)
/*
Funcin modplcap_release:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_release(__data modplcap_hd *);
#else
int modplcap_release(modplcap_hd *);
#endif
/*
Funcin modplcap_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_publish(__data modplcap_hd *, modplcap_grpid);
#else
int modplcap_publish(modplcap_hd *, modplcap_grpid);
#endif
/*
Funcin modplcap_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
244 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_leave(__data modplcap_hd *, modplcap_grpid);
#else
int modplcap_leave(modplcap_hd *, modplcap_grpid);
#endif
/*
Funcin modplcap_newmsg:
Crea un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_newmsg(__data modplcap_hd *, __data modplcap_msg *,
modplcap_grpid, modplcap_msgid);
#else
int modplcap_newmsg(modplcap_hd *, modplcap_msg *, modplcap_grpid,
modplcap_msgid);
#endif
/*
Funcin modplcap_copymsg:
Crea un copia de un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_copymsg(__data modplcap_msg *, __data modplcap_msg *);
#else
int modplcap_copymsg(modplcap_msg *, modplcap_msg *);
#endif
/*
Funcin modplcap_putfield:
Agrega un nuevo campo al mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_putfield(__data modplcap_msg *, modplcap_ftype, unsigned char,
const __data void *);
#else
int modplcap_putfield(modplcap_msg *, modplcap_ftype, unsigned char,
const void *);
#endif
/*
Funcin modplcap_sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_sendmsg(__data modplcap_msg *);
#else
int modplcap_sendmsg(modplcap_msg *);
#endif
/*
Funcin modplcap_receivemsg:
Recibe un mensaje por medio de la capa de aplicacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_receivemsg(__data modplcap_hd *, __data modplcap_msg *);
#else
int modplcap_receivemsg(modplcap_hd *, modplcap_msg *);
#endif
/*
Funcin modplcap_getfield:
FernandoArielBeunza79156 245
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
modplcap_grpid modplcap_getgrpid(__data modplcap_msg *);
#else
modplcap_grpid modplcap_getgrpid(modplcap_msg *);
#endif
/*
Funcin modplcap_getmsgid:
Devuelve el identificador de mensaje.
*/
#if defined SDCC_MODEL_SMALL
modplcap_msgid modplcap_getmsgid(__data modplcap_msg *);
#else
modplcap_msgid modplcap_getmsgid(modplcap_msg *);
#endif
/*
Funcin modplcap_destroymsg:
Destruye un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_destroymsg(__data modplcap_msg *);
#else
int modplcap_destroymsg(modplcap_msg *);
#endif
/*
Funcin modplcap_setbuffer:
Define el buffer de recepcin.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_setbuffer(__data modplcap_hd *, __data modplcap_msg *);
#else
int modplcap_setbuffer(modplcap_hd *, modplcap_msg *);
#endif
/*
Funcin modplcap_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_notify(__data modplcap_hd *, void (*func)(__data modplcap_hd *,
__data modplcap_msg *, __data void *), __data void *);
#else
int modplcap_notify(modplcap_hd *, void (*func)(modplcap_hd *, modplcap_msg *,
void *), void *);
#endif
/*
Funcin modplcap_poll:
Verifica la llegada de un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_poll(__data modplcap_hd *);
#else
int modplcap_poll(modplcap_hd *);
#endif
246 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_status:
Devuelve el estado del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_status(__data modplcap_hd *);
#else
int modplcap_status(modplcap_hd *);
#endif
#endif
/* Variables globales. */
volatile modplcap_hd __modplcap_hd__;
/*
Funcin modplcap__init:
Inicializa los recursos utilizados por la capa de aplicacin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
__data modplcap_hd *modplcap__init(int sid, short int msgsize)
#else
modplcap_hd *modplcap__init(int sid, short int msgsize)
#endif
{
/* Inicializa la interfaz de la capa de presentacindel modem PLC. */
__modplcap_hd__.modpphd = modplcpp__init(sid, msgsize);
if (!__modplcap_hd__.modpphd) return NULL;
FernandoArielBeunza79156 247
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_release:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_release(__data modplcap_hd *hd)
#else
int modplcap_release(modplcap_hd *hd)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
248 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_publish(__data modplcap_hd *hd, modplcap_grpid grpid)
#else
int modplcap_publish(modplcap_hd *hd, modplcap_grpid grpid)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
/*
Funcin modplcap_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_subscribe(__data modplcap_hd *hd, modplcap_grpid grpid)
#else
int modplcap_subscribe(modplcap_hd *hd, modplcap_grpid grpid)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
FernandoArielBeunza79156 249
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_leave(__data modplcap_hd *hd, modplcap_grpid grpid)
#else
int modplcap_leave(modplcap_hd *hd, modplcap_grpid grpid)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
250 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_newmsg:
Crea un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_newmsg(__data modplcap_hd *hd, __data modplcap_msg *msg,
modplcap_grpid grpid, modplcap_msgid msgid)
#else
int modplcap_newmsg(modplcap_hd *hd, modplcap_msg *msg, modplcap_grpid grpid,
modplcap_msgid msgid)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
/* Inicializa el mensaje. */
msg->msgid = msgid;
if (msgid & 0x8000)
{
if (!modplcpp_newmsg(hd->modpphd, &(msg->msg), grpid,
MODPLCPP_NOSECMSG))
return 0;
}
else
{
if (!modplcpp_newmsg(hd->modpphd, &(msg->msg), grpid, MODPLCPP_SECMSG))
return 0;
}
if (!modplcpp_putfield(&(msg->msg), MODPLCPP_UINT16TYPE, 1, &msgid))
return 0;
return 1;
}
/*
Funcin modplcap_copymsg:
Crea un copia de un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_copymsg(__data modplcap_msg *dest, __data modplcap_msg *src)
FernandoArielBeunza79156 251
Tesis de Grado en Ingeniera Informtica
#else
int modplcap_copymsg(modplcap_msg *dest, modplcap_msg *src)
#endif
{
/* Verifica que el puntero al mensaje original no sea nulo. */
if (!src) return 0;
/*
Funcin modplcap_putfield:
Agrega un nuevo campo al mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_putfield(__data modplcap_msg *msg, modplcap_ftype type,
unsigned char count, const __data void *dat)
#else
int modplcap_putfield(modplcap_msg *msg, modplcap_ftype type,
unsigned char count, const void *dat)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
252 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
*/
/*
Funcin modplcap_sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_sendmsg(__data modplcap_msg *msg)
#else
int modplcap_sendmsg(modplcap_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Enva un mensaje. */
return modplcpp_sendmsg(&(msg->msg));
}
/*
Funcin modplcap_receivemsg:
Recibe un mensaje por medio de la capa de aplicacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_receivemsg(__data modplcap_hd *hd, __data modplcap_msg *msg)
#else
FernandoArielBeunza79156 253
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
while(1)
{
if (!modplcpp_receivemsg(hd->modpphd, &(msg->msg)))
break;
if (!modplcpp_getfield(&(msg->msg), &type, &count, &(msg->msgid)))
break;
if (type != MODPLCPP_UINT16TYPE)
break;
if (count != 1)
break;
return 1;
}
modplcap_destroymsg(msg);
return 0;
}
/*
Funcin modplcap_getfield:
Extrae un campo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_getfield(__data modplcap_msg *msg, __data modplcap_ftype *type,
__data unsigned char *count, __data void *dat)
#else
int modplcap_getfield(modplcap_msg *msg, modplcap_ftype *type,
254 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
modplcap_grpid modplcap_getgrpid(__data modplcap_msg *msg)
#else
modplcap_grpid modplcap_getgrpid(modplcap_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
FernandoArielBeunza79156 255
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_getmsgid:
Devuelve el identificador de mensaje.
*/
#if defined SDCC_MODEL_SMALL
modplcap_msgid modplcap_getmsgid(__data modplcap_msg *msg)
#else
modplcap_msgid modplcap_getmsgid(modplcap_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_destroymsg:
Destruye un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_destroymsg(__data modplcap_msg *msg)
#else
int modplcap_destroymsg(modplcap_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Destruye el mensaje. */
256 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
msg->msgid = 0;
return modplcpp_destroymsg(&(msg->msg));
}
/*
Funcin modplcap_setbuffer:
Define el buffer de recepcin.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_setbuffer(__data modplcap_hd *hd, __data modplcap_msg *buffer)
#else
int modplcap_setbuffer(modplcap_hd *hd, modplcap_msg *buffer)
#endif
{
/* Verifica el estado del modem PLC. */
if (!modplcap_status(hd)) return 0;
FernandoArielBeunza79156 257
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_notify(__data modplcap_hd *hd, void (*func)(__data modplcap_hd *,
__data modplcap_msg *, __data void *), __data void *param)
#else
int modplcap_notify(modplcap_hd *hd, void (*func)(modplcap_hd *,
modplcap_msg *, void *), void *param)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
/*
Funcin __modplcap_procmsg__:
Procesa un mensaje recibido por medio de la capa de presentacin.
*/
#if defined SDCC_MODEL_SMALL
static void __modplcap_procmsg__(__data modplcpp_hd *hd,
__data modplcpp_msg *msg,
__data void *param) __reentrant
#else
static void __modplcap_procmsg__(modplcpp_hd *hd, modplcpp_msg *msg,
void *param) __reentrant
#endif
{
/* Variables. */
#if defined SDCC_MODEL_SMALL
__data modplcap_hd *aphd; /* Manejador de capa de
aplicacin. */
#else
modplcap_hd *aphd; /* Manejador de capa de
258 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
aplicacin. */
#endif
/* Recibe el mensaje. */
if (aphd->recvbuff)
{
if (!modplcap_receivemsg(aphd, aphd->recvbuff)) return;
}
/*
Funcin modplcap_poll:
Verifica la llegada de un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_poll(__data modplcap_hd *hd)
#else
int modplcap_poll(modplcap_hd *hd)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
FernandoArielBeunza79156 259
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_status:
Devuelve el estado del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcap_status(__data modplcap_hd *hd)
#else
int modplcap_status(modplcap_hd *hd)
#endif
{
/* Verifica que el manejador de capa de aplicacin del modem PLC exista. */
if (!hd) return 0;
#if !defined(__MODPLCPP_H__)
#define __MODPLCPP_H__
260 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#define MODPLCPP_MSGSIZE 1
#endif
#define MODPLCSP_MSGSIZE MODPLCPP_MSGSIZE
/* 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; /* Comienzo del mensaje. */
unsigned short int endoffset; /* Fin del mensaje. */
modplcpp_grpid grpid; /* Identificador de grupo. */
modplcpp_mtype mtype; /* Tipo de mensaje. */
#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]; /* Contenido del mensaje. */
} modplcpp_msg;
typedef struct
{
short int msgsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
#if defined SDCC_MODEL_SMALL
__data modplcsp_hd *modsphd; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
__data modplcpp_msg *recvbuff; /* Puntero al buffer de
recepcin. */
void (*recfun)
(__data void *,
__data modplcpp_msg *,
__data void *) __reentrant; /* Funcin manejadora de mensajes
recibidos. */
__data void *param; /* Parmetros para la funcin
manejadora de mensajes
recibidos. */
#else
modplcsp_hd *modsphd; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
modplcpp_msg *recvbuff; /* Puntero al buffer de
recepcin. */
void (*recfun)
(void *, modplcpp_msg *, void *)
__reentrant; /* Funcin manejadora de mensajes
recibidos. */
void *param; /* Parmetros para la funcin
manejadora de mensajes
recibidos. */
#endif
} modplcpp_hd;
FernandoArielBeunza79156 261
Tesis de Grado en Ingeniera Informtica
/* Definicin de constantes. */
/* Tipo de mensaje. */
#define MODPLCPP_SECMSG 0x00
#define MODPLCPP_NOSECMSG 0x01
/* Tipos de datos. */
#define MODPLCPP_NULLTYPE 0x00
#define MODPLCPP_CHARTYPE 0x01
#define MODPLCPP_SINT8TYPE 0x02
#define MODPLCPP_UINT8TYPE 0x03
#define MODPLCPP_SINT16TYPE 0x04
#define MODPLCPP_UINT16TYPE 0x05
#define MODPLCPP_SINT32TYPE 0x06
#define MODPLCPP_UINT32TYPE 0x07
#define MODPLCPP_FLOATTYPE 0x08
/*
Funcin modplcpp__init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
#if defined SDCC_MODEL_SMALL
__data modplcpp_hd *modplcpp__init(int, short int);
#else
modplcpp_hd *modplcpp__init(int, short int);
#endif
/*
Funcin modplcpp_init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
#define modplcpp_init(sid)\
modplcpp__init(sid, MODPLCPP_MSGSIZE)
/*
Funcin modplcpp_release:
Libera los recursos utilizados por la capa de presentacin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_release(__data modplcpp_hd *);
#else
int modplcpp_release(modplcpp_hd *);
#endif
/*
Funcin modplcpp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_publish(__data modplcpp_hd *, modplcpp_grpid);
#else
int modplcpp_publish(modplcpp_hd *, modplcpp_grpid);
#endif
/*
Funcin modplcpp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_subscribe(__data modplcpp_hd *, modplcpp_grpid);
#else
int modplcpp_subscribe(modplcpp_hd *, modplcpp_grpid);
#endif
/*
262 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin modplcpp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_leave(__data modplcpp_hd *, modplcpp_grpid);
#else
int modplcpp_leave(modplcpp_hd *, modplcpp_grpid);
#endif
/*
Funcin modplcpp_newmsg:
Crea un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_newmsg(__data modplcpp_hd *, __data modplcpp_msg *,
modplcpp_grpid, modplcpp_mtype);
#else
int modplcpp_newmsg(modplcpp_hd *, modplcpp_msg *, modplcpp_grpid,
modplcpp_mtype);
#endif
/*
Funcin modplcpp_copymsg:
Crea un copia de un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_copymsg(__data modplcpp_msg *, __data modplcpp_msg *);
#else
int modplcpp_copymsg(modplcpp_msg *, modplcpp_msg *);
#endif
/*
Funcin modplcpp_putfield:
Agrega un nuevo campo al mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_putfield(__data modplcpp_msg *, modplcpp_ftype, unsigned char,
const __data void *);
#else
int modplcpp_putfield(modplcpp_msg *, modplcpp_ftype, unsigned char,
const void *);
#endif
/*
Funcin modplcpp_sendmsg:
Enva un mensaje por medio de la capa de presentacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_sendmsg(__data modplcpp_msg *);
#else
int modplcpp_sendmsg(modplcpp_msg *);
#endif
/*
Funcin modplcpp_receivemsg:
Recibe un mensaje por medio de la capa de presentacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_receivemsg(__data modplcpp_hd *, __data modplcpp_msg *);
#else
int modplcpp_receivemsg(modplcpp_hd *, modplcpp_msg *);
#endif
/*
Funcin modplcpp_getfield:
Extrae un campo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_getfield(__data modplcpp_msg *, __data modplcpp_ftype *,
__data unsigned char *, __data void *);
#else
FernandoArielBeunza79156 263
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
modplcpp_grpid modplcpp_getgrpid(__data modplcpp_msg *);
#else
modplcpp_grpid modplcpp_getgrpid(modplcpp_msg *);
#endif
/*
Funcin modplcpp_destroymsg:
Destruye un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_destroymsg(__data modplcpp_msg *);
#else
int modplcpp_destroymsg(modplcpp_msg *);
#endif
/*
Funcin modplcpp_setbuffer:
Define el buffer de recepcin.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_setbuffer(__data modplcpp_hd *, __data modplcpp_msg *);
#else
int modplcpp_setbuffer(modplcpp_hd *, modplcpp_msg *);
#endif
/*
Funcin modplcpp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_notify(__data modplcpp_hd *, void (*func)(__data modplcpp_hd *,
__data modplcpp_msg *, __data void *), __data void *);
#else
int modplcpp_notify(modplcpp_hd *, void (*func)(modplcpp_hd *, modplcpp_msg *,
void *), void *);
#endif
/*
Funcin modplcpp_poll:
Verifica la llegada de un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_poll(__data modplcpp_hd *);
#else
int modplcpp_poll(modplcpp_hd *);
#endif
/*
Funcin modplcpp_status:
Devuelve el estado del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_status(__data modplcpp_hd *);
#else
int modplcpp_status(modplcpp_hd *);
#endif
#endif
264 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Variables globales. */
volatile modplcpp_hd __modplcpp_hd__;
/*
Funcin modplcpp__init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
#if defined SDCC_MODEL_SMALL
__data modplcpp_hd *modplcpp__init(int sid, short int msgsize)
#else
modplcpp_hd *modplcpp__init(int sid, short int msgsize)
#endif
{
/* Inicializa la interfaz de la capa de sesin del modem PLC. */
__modplcpp_hd__.modsphd = modplcsp__init(sid, msgsize);
if (!__modplcpp_hd__.modsphd) return NULL;
FernandoArielBeunza79156 265
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_release:
Libera los recursos utilizados por la capa de presentacin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_release(__data modplcpp_hd *hd)
#else
int modplcpp_release(modplcpp_hd *hd)
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
/* Libera los recursos utilizados por la capa de sesin del modem PLC. */
return modplcsp_release(hd->modsphd);
}
/*
Funcin modplcpp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_publish(__data modplcpp_hd *hd, modplcpp_grpid grpid)
#else
int modplcpp_publish(modplcpp_hd *hd, modplcpp_grpid grpid)
266 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
/*
Funcin modplcpp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_subscribe(__data modplcpp_hd *hd, modplcpp_grpid grpid)
#else
int modplcpp_subscribe(modplcpp_hd *hd, modplcpp_grpid grpid)
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
FernandoArielBeunza79156 267
Tesis de Grado en Ingeniera Informtica
#include "config.h"
/*
Funcin modplcpp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_leave(__data modplcpp_hd *hd, modplcpp_grpid grpid)
#else
int modplcpp_leave(modplcpp_hd *hd, modplcpp_grpid grpid)
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
/*
Funcin modplcpp_newmsg:
Crea un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_newmsg(__data modplcpp_hd *hd, __data modplcpp_msg *msg,
modplcpp_grpid grpid, modplcpp_mtype mtype)
#else
int modplcpp_newmsg(modplcpp_hd *hd, modplcpp_msg *msg, modplcpp_grpid grpid,
modplcpp_mtype mtype)
268 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
/* Inicializa el mensaje. */
msg->startoffset = 0;
msg->endoffset = 0;
msg->grpid = grpid;
msg->mtype = mtype;
msg->pphd = hd;
return 1;
}
/*
Funcin modplcpp_copymsg:
Crea un copia de un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_copymsg(__data modplcpp_msg *dest, __data modplcpp_msg *src)
#else
int modplcpp_copymsg(modplcpp_msg *dest, modplcpp_msg *src)
#endif
{
/* Variables. */
short int i; /* Contador. */
FernandoArielBeunza79156 269
Tesis de Grado en Ingeniera Informtica
dest->pphd = src->pphd;
for(i = 0; i < dest->endoffset; i++) dest->dat[i] = src->dat[i];
/* xito. */
return 1;
}
/*
Funcin modplcpp_putfield:
Agrega un nuevo campo al mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_putfield(__data modplcpp_msg *msg, modplcpp_ftype type,
unsigned char count, const __data void *dat)
#else
int modplcpp_putfield(modplcpp_msg *msg, modplcpp_ftype type,
unsigned char count, const void *dat)
#endif
{
/* Variables. */
short int msgsize; /* Tamao del mensaje. */
#if defined SDCC_MODEL_SMALL
__data unsigned char *ptr; /* Puntero a los datos. */
#else
unsigned char *ptr; /* Puntero a los datos. */
#endif
270 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 271
Tesis de Grado en Ingeniera Informtica
{
*(msg->dat + msg->endoffset) = *ptr;
ptr += sizeof(float);
msg->endoffset += sizeof(float);
}
}
/* xito. */
return 1;
}
/*
Funcin modplcpp_sendmsg:
Enva un mensaje por medio de la capa de presentacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_sendmsg(__data modplcpp_msg *msg)
#else
int modplcpp_sendmsg(modplcpp_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Enva un mensaje. */
if (modplcsp_send(((modplcpp_hd *) (msg->pphd))->modsphd, msg->grpid,
msg->mtype, msg->dat, msg->endoffset) == msg->endoffset)
return 1;
return 0;
}
272 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_receivemsg:
Recibe un mensaje por medio de la capa de presentacin.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_receivemsg(__data modplcpp_hd *hd, __data modplcpp_msg *msg)
#else
int modplcpp_receivemsg(modplcpp_hd *hd, modplcpp_msg *msg)
#endif
{
/* Verifica el estado del modem PLC. */
if (!modplcpp_status(hd)) return 0;
/* Recibe el mensaje. */
msg->startoffset = 0;
msg->endoffset = modplcsp_receive(hd->modsphd, &(msg->grpid), msg->dat,
hd->msgsize);
return (msg->endoffset != 0);
}
/*
FernandoArielBeunza79156 273
Tesis de Grado en Ingeniera Informtica
Funcin modplcpp_getfield:
Extrae un campo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_getfield(__data modplcpp_msg *msg, __data modplcpp_ftype *type,
__data unsigned char *count, __data void *dat)
#else
int modplcpp_getfield(modplcpp_msg *msg, modplcpp_ftype *type,
unsigned char *count, void *dat)
#endif
{
/* Variables. */
unsigned char c; /* Contador. */
#if defined SDCC_MODEL_SMALL
__data unsigned char *ptr; /* Puntero a los datos. */
#else
unsigned char *ptr; /* Puntero a los datos. */
#endif
274 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
#if defined SDCC_MODEL_SMALL
modplcpp_grpid modplcpp_getgrpid(__data modplcpp_msg *msg)
#else
modplcpp_grpid modplcpp_getgrpid(modplcpp_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
FernandoArielBeunza79156 275
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_destroymsg:
Destruye un mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_destroymsg(__data modplcpp_msg *msg)
#else
int modplcpp_destroymsg(modplcpp_msg *msg)
#endif
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Destruye el mensaje. */
msg->startoffset = 0;
msg->endoffset = 0;
msg->grpid = 0;
msg->mtype = 0;
msg->pphd = NULL;
return 1;
}
276 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_setbuffer:
Define el buffer de recepcin.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_setbuffer(__data modplcpp_hd *hd, __data modplcpp_msg *buffer)
#else
int modplcpp_setbuffer(modplcpp_hd *hd, modplcpp_msg *buffer)
#endif
{
/* Verifica el estado del modem PLC. */
if (!modplcpp_status(hd)) return 0;
/*
Funcin modplcpp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_notify(__data modplcpp_hd *hd, void (*func)(__data modplcpp_hd *,
FernandoArielBeunza79156 277
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcpp_procmsg__:
Procesa un mensaje recibido por medio de la capa de sesin.
*/
#if defined SDCC_MODEL_SMALL
static void __modplcpp_procmsg__(__data modplcsp_hd *hd, modplcsp_grpid grpid,
__data void *msg, short int msgsize,
__data void *param) __reentrant
#else
static void __modplcpp_procmsg__(modplcsp_hd *hd, modplcsp_grpid grpid,
void *msg, short int msgsize,
void *param) __reentrant
#endif
{
/* Variables. */
#if defined SDCC_MODEL_SMALL
__data modplcpp_hd *pphd; /* Manejador de capa de
presentacin. */
#else
modplcpp_hd *pphd; /* Manejador de capa de
presentacin. */
#endif
/* Recibe el mensaje. */
if (pphd->recvbuff)
{
if (!modplcpp_receivemsg(pphd, pphd->recvbuff)) return;
}
278 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
msg;
msgsize;
}
/*
Funcin modplcpp_poll:
Verifica la llegada de un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_poll(__data modplcpp_hd *hd)
#else
int modplcpp_poll(modplcpp_hd *hd)
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
FernandoArielBeunza79156 279
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_status:
Devuelve el estado del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcpp_status(__data modplcpp_hd *hd)
#else
int modplcpp_status(modplcpp_hd *hd)
#endif
{
/* Verifica que el manejador de capa de presentacin del modem PLC
exista. */
if (!hd) return 0;
#if !defined(__MODPLCSP_H__)
#define __MODPLCSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcsp_grpid;
280 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
recepcin. */
void (*recfun)
(__data void *, modplcsp_grpid,
__data void *, short int,
__data void *) __reentrant; /* Funcin manejadora de mensajes
recibidos. */
__data void *param; /* Parmetros para la funcin
manejadora de mensajes
recibidos. */
#else
unsigned char *recvbuff; /* Puntero al buffer de
recepcin. */
void (*recfun)
(void *, modplcsp_grpid, void *,
short int, void *) __reentrant; /* Funcin manejadora de mensajes
recibidos. */
void *param; /* Parmetros para la funcin
manejadora de mensajes
recibidos. */
#endif
} modplcsp_hd;
/*
Funcin modplcsp__init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
__data modplcsp_hd *modplcsp__init(int, short int);
#else
modplcsp_hd *modplcsp__init(int, short int);
#endif
/*
Funcin modplcsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
#define modplcsp_init(sid)\
modplcsp__init(sid, MODPLCSP_MSGSIZE)
/*
Funcin modplcsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_release(__data modplcsp_hd *);
#else
int modplcsp_release(modplcsp_hd *);
#endif
/*
Funcin modplcsp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_publish(__data modplcsp_hd *, modplcsp_grpid);
#else
int modplcsp_publish(modplcsp_hd *, modplcsp_grpid);
#endif
/*
Funcin modplcsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_subscribe(__data modplcsp_hd *, modplcsp_grpid);
#else
int modplcsp_subscribe(modplcsp_hd *, modplcsp_grpid);
#endif
FernandoArielBeunza79156 281
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_leave(__data modplcsp_hd *, modplcsp_grpid);
#else
int modplcsp_leave(modplcsp_hd *, modplcsp_grpid);
#endif
/*
Funcin modplcsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
short int modplcsp_send(__data modplcsp_hd *, modplcsp_grpid, unsigned char,
const __data void *, short int);
#else
short int modplcsp_send(modplcsp_hd *, modplcsp_grpid, unsigned char,
const void *, short int);
#endif
/*
Funcin modplcsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
short int modplcsp_receive(__data modplcsp_hd *, __data modplcsp_grpid *,
__data void *, short int);
#else
short int modplcsp_receive(modplcsp_hd *, modplcsp_grpid *, void *, short int);
#endif
/*
Funcin modplcsp_setbuffer:
Define el buffer de recepcin.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_setbuffer(__data modplcsp_hd *, __data void *, short int);
#else
int modplcsp_setbuffer(modplcsp_hd *, void *, short int);
#endif
/*
Funcin modplcsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_notify(__data modplcsp_hd *, void (*func)(__data modplcsp_hd *,
modplcsp_grpid, __data void *, short int, __data void *),
__data void *);
#else
int modplcsp_notify(modplcsp_hd *, void (*func)(modplcsp_hd *, modplcsp_grpid,
void *, short int, void *), void *);
#endif
/*
Funcin modplcsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_poll(__data modplcsp_hd *);
#else
int modplcsp_poll(modplcsp_hd *);
#endif
/*
Funcin modplcsp_status:
Devuelve el estado del modem PLC.
*/
282 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
short int modplcsp_getpayloadsize(__data modplcsp_hd *);
#else
short int modplcsp_getpayloadsize(modplcsp_hd *);
#endif
/*
Interrupcin INT1:
Procesa el mensaje recibido.
*/
extern void __modplcsp_int1__(void) __interrupt 1;
#endif
/* Variables globales. */
volatile modplcsp_hd __modplcsp_hd__;
FernandoArielBeunza79156 283
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp__init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
__data modplcsp_hd *modplcsp__init(int sid, short int msgsize)
#else
modplcsp_hd *modplcsp__init(int sid, short int msgsize)
#endif
{
/* Variables. */
char c; /* Caracter recibido. */
284 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Interrupcin INT1:
Procesa el mensaje recibido.
*/
void __modplcsp_int1__(void) __interrupt 1
{
/* Variables. */
short int msgsize; /* Tamao del mensaje. */
modplcsp_grpid grpid; /* Identificador de grupo. */
/* Recibe el mensaje. */
grpid = 0;
msgsize = 0;
if (__modplcsp_hd__.recvbuff && __modplcsp_hd__.buffsize)
{
msgsize = modplcsp_receive(&__modplcsp_hd__, &grpid,
__modplcsp_hd__.recvbuff,
__modplcsp_hd__.buffsize);
if (!msgsize) break;
}
FernandoArielBeunza79156 285
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_release(__data modplcsp_hd *hd)
#else
int modplcsp_release(modplcsp_hd *hd)
#endif
{
/* Verifica que el manejador de interfaz con la capa de sesin del modem
PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcsp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
286 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_subscribe(__data modplcsp_hd *hd, modplcsp_grpid grpid)
#else
int modplcsp_subscribe(modplcsp_hd *hd, modplcsp_grpid grpid)
#endif
{
return (__modplcsp_sendcmd1__(hd, MODPLCSP_SUBSCRIBE, grpid) != 0);
}
FernandoArielBeunza79156 287
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_leave(__data modplcsp_hd *hd, modplcsp_grpid grpid)
#else
int modplcsp_leave(modplcsp_hd *hd, modplcsp_grpid grpid)
#endif
{
return (__modplcsp_sendcmd1__(hd, MODPLCSP_LEAVE, grpid) != 0);
}
288 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#else
short int __modplcsp_getresult__(modplcsp_hd *);
#endif
/*
Funcin modplcsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
short int modplcsp_send(__data modplcsp_hd *hd, modplcsp_grpid grpid,
unsigned char nosec, const __data void *msg,
short int msgsize)
#else
short int modplcsp_send(modplcsp_hd *hd, modplcsp_grpid grpid,
unsigned char nosec, const void *msg,
short int msgsize)
#endif
{
/* Variables. */
int i; /* Contador. */
char c; /* Caracter recibido. */
#if defined SDCC_MODEL_SMALL
__data unsigned char *ptr; /* Puntero al mensaje. */
#else
unsigned char *ptr; /* Puntero al mensaje. */
#endif
/* Enva un mensaje. */
__modplcsp_putcmd__(MODPLCSP_SEND);
__modplcsp_putbyte__(grpid);
__modplcsp_putbyte__(nosec);
__modplcsp_putint__(msgsize);
__modplcsp_waitchar__('\n');
i = 0;
#if defined SDCC_MODEL_SMALL
ptr = (__data unsigned char *) msg;
#else
ptr = (unsigned char *) msg;
#endif
while(msgsize)
{
if (i >= 32)
{
putchar('\n');
i = 0;
}
while(!i)
{
c = getchar();
if (c == '>') break;
}
c = *ptr;
if ((c >= 0x20) && (c <= 0x7e) && (c != '\\') &&
(c != MODPLC_INITPROMPT) && (c != MODPLC_LAYPROMPT) &&
(c != MODPLC_NORMPROMPT) && (c != MODPLC_PARAMPROMPT))
putchar(*ptr);
else
__modplcsp_puthex__(*ptr);
msgsize --;
ptr ++;
i ++;
}
if (i) putchar('\n');
FernandoArielBeunza79156 289
Tesis de Grado en Ingeniera Informtica
return __modplcsp_getresult__(hd);
}
/*
Funcin modplcsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
short int modplcsp_receive(__data modplcsp_hd *hd,
__data modplcsp_grpid *grpid, __data void *msg,
short int msgsize)
#else
short int modplcsp_receive(modplcsp_hd *hd, modplcsp_grpid *grpid, void *msg,
short int msgsize)
#endif
{
/* Variables. */
short int recvbyte; /* Byte recibido. */
short int received; /* Cantidad de bytes recibido. */
unsigned char i; /* Contador. */
#if defined SDCC_MODEL_SMALL
__data unsigned char *ptr; /* Puntero al mensaje. */
#else
unsigned char *ptr; /* Puntero al mensaje. */
#endif
290 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
received = 0;
#if defined SDCC_MODEL_SMALL
ptr = (__data unsigned char *) msg;
#else
ptr = (unsigned char *) msg;
#endif
while(1)
{
recvbyte = __modplcsp_getbyte__();
if (recvbyte & 0xff00)
break;
else if ((msgsize) && (received <= hd->msgsize))
{
*ptr = recvbyte & 0x00ff;
received ++;
msgsize --;
ptr ++;
}
}
FernandoArielBeunza79156 291
Tesis de Grado en Ingeniera Informtica
#define MODPLCSP_MSGSIZE 0
#endif
/*
Funcin modplcsp_setbuffer:
Define el buffer de recepcin.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_setbuffer(__data modplcsp_hd *hd, __data void *buffer, short int size)
#else
int modplcsp_setbuffer(modplcsp_hd *hd, void *buffer, short int size)
#endif
{
/* Verifica el estado del modem PLC. */
if (!modplcsp_status(hd)) return 0;
/*
Funcin modplcsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#if defined SDCC_MODEL_SMALL
292 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* xito. */
return 1;
}
FernandoArielBeunza79156 293
Tesis de Grado en Ingeniera Informtica
#else
short int __modplcsp_sendcmd0__(modplcsp_hd *, char);
#endif
/*
Funcin modplcsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_poll(__data modplcsp_hd *hd)
#else
int modplcsp_poll(modplcsp_hd *hd)
#endif
{
return (__modplcsp_sendcmd0__(hd, MODPLCSP_POLL) != 0);
}
/*
Funcin modplcsp_status:
Devuelve el estado del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
int modplcsp_status(__data modplcsp_hd *hd)
#else
int modplcsp_status(modplcsp_hd *hd)
#endif
{
/* Variables. */
char c; /* Caracter recibido. */
294 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
#if defined SDCC_MODEL_SMALL
short int modplcsp_getpayloadsize(__data modplcsp_hd *hd)
#else
short int modplcsp_getpayloadsize(modplcsp_hd *hd)
#endif
{
/* Verifica el estado del modem PLC. */
if (!modplcsp_status(hd)) return 0;
FernandoArielBeunza79156 295
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_getbyte__:
Obtiene un byte recibido por la UART.
*/
short int __modplcsp_getbyte__(void)
{
/* Variables. */
int i; /* Contador. */
short int resp; /* Respuesta. */
char c; /* Caracter recibido. */
296 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_getresult__:
Devuelve el resultado de una solicitud.
*/
#if defined SDCC_MODEL_SMALL
short int __modplcsp_getresult__(__data modplcsp_hd *hd)
#else
short int __modplcsp_getresult__(modplcsp_hd *hd)
#endif
{
/* Variables. */
short int result; /* Resultado de la solicitud. */
short int recvbyte; /* Byte recibido. */
FernandoArielBeunza79156 297
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_putbyte__:
Enva un byte a travs de la UART.
*/
void __modplcsp_putbyte__(unsigned char val)
{
__modplcsp_waitchar__(MODPLC_PARAMPROMPT);
__modplcsp_puthex__(val);
putchar('\n');
}
/*
Funcin __modplcsp_putcmd__:
Enva un comando a travs de la UART.
*/
void __modplcsp_putcmd__(char cmd)
{
putchar(cmd);
__modplcsp_waitchar__(cmd);
putchar('\n');
}
298 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_puthex__:
Enva un byte codificado en hexadecimal a travs de la UART.
*/
void __modplcsp_puthex__(unsigned char ch)
{
/* Variables. */
int i; /* Contador. */
unsigned char dig; /* Dgito. */
FernandoArielBeunza79156 299
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_putint__:
Enva un entero a travs de la UART.
*/
void __modplcsp_putint__(short int val)
{
__modplcsp_waitchar__(MODPLC_PARAMPROMPT);
__modplcsp_puthex__((unsigned char) (val >> 8));
__modplcsp_puthex__((unsigned char) (val & 0x00ff));
putchar('\n');
}
300 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_sendcmd0__:
Enva una solicitud sin parmetros.
*/
#if defined SDCC_MODEL_SMALL
short int __modplcsp_sendcmd0__(__data modplcsp_hd *hd, char cmd)
#else
short int __modplcsp_sendcmd0__(modplcsp_hd *hd, char cmd)
#endif
{
/* Verifica el estado del modem PLC. */
if (!modplcsp_status(hd)) return 0;
/*
Funcin __modplcsp_sendcmd1__:
Enva una solicitud con un parmetro.
*/
#if defined SDCC_MODEL_SMALL
short int __modplcsp_sendcmd1__(__data modplcsp_hd *hd, char cmd,
FernandoArielBeunza79156 301
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_waitchar__:
Espera la recepcin del caracter especificado.
*/
void __modplcsp_waitchar__(char ch)
{
while(getchar() != ch);
}
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
302 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin inituart:
Inicializa la UART del microcontrolador.
*/
void inituart(unsigned char);
/*
Funcin putchar:
Enva un caracter a travs de la UART.
*/
void putchar(char);
/*
Funcin poll:
Devuelve si hay un caracter almacenado en la UART.
*/
int poll(void);
/*
Funcin getchar:
Devuelve un caracter recibido por medio de la UART.
*/
char getchar(void);
#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
Tesis de Grado en Ingeniera Informtica
/*
Funcin putchar:
Enva un caracter a travs de la UART.
*/
void putchar(char c)
{
while(!SIO_TI);
SIO_TI = 0;
SIO_SBUF = c;
__asm nop __endasm;
}
/*
Funcin poll:
Devuelve si hay un caracter almacenado en la UART.
*/
int poll(void)
{
return SIO_RI;
}
/*
Funcin getchar:
Devuelve un caracter recibido por medio de la UART.
*/
char getchar(void)
{
/* Varaibles. */
char c; /* Caracter recibido. */
304 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
FernandoArielBeunza79156 305
Tesis de Grado en Ingeniera Informtica
#endif
#if !defined(__MODPLCSP_H__)
#define __MODPLCSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplcsp_grpid;
/*
Funcin modplcsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modplcsp_hd *modplcsp_init(int);
/*
Funcin modplcsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modplcsp_release(modplcsp_hd *);
/*
Funcin modplcsp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modplcsp_publish(modplcsp_hd *, modplcsp_grpid);
/*
Funcin modplcsp_subscribe:
306 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcsp_leave(modplcsp_hd *, modplcsp_grpid);
/*
Funcin modplcsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_send(modplcsp_hd *, modplcsp_grpid, unsigned char,
const void *, size_t);
/*
Funcin modplcsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_receive(modplcsp_hd *, modplcsp_grpid *, void *, size_t);
/*
Funcin modplcsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcsp_notify(modplcsp_hd *, void (*func)(modplcsp_hd *, modplcsp_grpid,
void *, size_t, void *), void *);
/*
Funcin modplcsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcsp_poll(modplcsp_hd *);
/*
Funcin modplcsp_status:
Devuelve el estado del modem PLC.
*/
int modplcsp_status(modplcsp_hd *);
/*
Funcin modplcsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
size_t modplcsp_getpayloadsize(modplcsp_hd *);
#endif
FernandoArielBeunza79156 307
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modplcsp_hd *modplcsp_init(int sid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
modplcsp_hd *handle; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
char qname[256]; /* Nombre de la cola de
mensajes. */
308 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
PLC. */
CloseHandle(handle->hm);
CloseHandle(handle->hq);
free(handle);
return NULL;
}
/*
Funcin modplcsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modplcsp_release(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Libera los recursos utilizados por la interfaz con la capa de sesin del
modem PLC. */
CloseHandle(hd->hm);
CloseHandle(hd->hq);
free(hd);
/* xito. */
return 1;
}
/*
Funcin modplcsp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modplcsp_publish(modplcsp_hd *hd, modplcsp_grpid grpid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
FernandoArielBeunza79156 309
Tesis de Grado en Ingeniera Informtica
sizeof(grpid));
break;
}
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int modplcsp_subscribe(modplcsp_hd *hd, modplcsp_grpid grpid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcsp_leave(modplcsp_hd *hd, modplcsp_grpid grpid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
310 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
/* Solicita desvincular el dispositivo. */
op = MODDRVSP_LEAVE;
if (!__modplcsp_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op))) break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_send(modplcsp_hd *hd, modplcsp_grpid grpid,
unsigned char nosec, const void *msg, size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Enva un mensaje. */
while(1)
{
/* Solicita el envo de un mensaje. */
op = MODDRVSP_SEND;
if (!__modplcsp_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op))) break;
/* Enva el mensaje. */
if (!__modplcsp_sendrecv__(hd->hq, &msgsize, sizeof(msgsize), msg,
msgsize))
break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
FernandoArielBeunza79156 311
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_receive(modplcsp_hd *hd, modplcsp_grpid *grpid, void *msg,
size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Recibe el mensaje. */
if (!__modplcsp_sendrecv__(hd->hq, msg, msgsize, NULL, 0))
break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcsp_notify(modplcsp_hd *hd, void (*func)(modplcsp_hd *,
modplcsp_grpid, void *, size_t, void *), void *param)
{
/* Variables. */
DWORD tid; /* Identificador de hilo. */
312 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
PLC exista. */
if (!hd) return 0;
/*
Funcin modplcsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcsp_poll(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
FernandoArielBeunza79156 313
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcsp_status:
Devuelve el estado del modem PLC.
*/
int modplcsp_status(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
size_t modplcsp_getpayloadsize(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
size_t payloadsize; /* Cantidad de bytes que puede
contener un mensaje. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
314 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin __modplcsp_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser ledo.
*/
static DWORD WINAPI __modplcsp_detectproc__(LPVOID param)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
int captureflag; /* Indicador de recepcin de un
mensaje. */
size_t msgsize; /* Tamao del mensaje. */
modplcsp_grpid grpid; /* Identificador de grupo. */
modplcsp_hd *hd; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
void (*func)(void *, modplcsp_grpid,
void *, size_t, void *); /* Funcin manejadora de mensajes
recibidos. */
unsigned char *msg; /* Puntero al mensaje. */
/* Recibe el mensaje. */
while(captureflag)
{
/* Solicita la recepcin de un mensaje. */
op = MODDRVSP_RECEIVE;
if (!__modplcsp_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op)))
break;
/* Recibe el mensaje. */
msg = (unsigned char *) malloc(msgsize * sizeof(unsigned char));
if (!msg)
FernandoArielBeunza79156 315
Tesis de Grado en Ingeniera Informtica
{
captureflag = 0;
break;
}
__modplcsp_sendrecv__(hd->hq, msg, msgsize, NULL, 0);
break;
}
/*
Funcin __modplcsp_sendrecv__:
Intercambia datos con el driver del modem PLC.
*/
static int __modplcsp_sendrecv__(HANDLE hq, void *outdata, size_t outsize,
const void *indata, size_t insize)
{
/* Variables. */
size_t last; /* Cantidad de bytes enviados o
recibidos. */
size_t sent; /* Cantidad de bytes enviados. */
size_t received; /* Cantidad de bytes recibidos. */
/* Enva la operacin. */
sent = 0;
while((indata) && (sent < insize))
{
if (!WriteFile(hq, indata, insize, &last, NULL)) return 0;
sent += last;
}
/* Recibe la respuesta. */
received = 0;
while((outdata) && (received < outsize))
{
if (!ReadFile(hq, outdata, outsize, &last, NULL)) return 0;
received += last;
}
/* xito. */
return 1;
}
316 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#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;
/* Definicin de constantes. */
/* Tipo de mensaje. */
#define MODPLCPP_SECMSG 0x00
#define MODPLCPP_NOSECMSG 0x01
/* Tipos de datos. */
#define MODPLCPP_NULLTYPE 0x00
#define MODPLCPP_CHARTYPE 0x01
#define MODPLCPP_SINT8TYPE 0x02
#define MODPLCPP_UINT8TYPE 0x03
#define MODPLCPP_SINT16TYPE 0x04
FernandoArielBeunza79156 317
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
modplcpp_hd *modplcpp_init(int);
/*
Funcin modplcpp_release:
Libera los recursos utilizados por la capa de presentacin del modem PLC.
*/
int modplcpp_release(modplcpp_hd *);
/*
Funcin modplcpp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modplcpp_publish(modplcpp_hd *, modplcpp_grpid);
/*
Funcin modplcpp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int modplcpp_subscribe(modplcpp_hd *, modplcpp_grpid);
/*
Funcin modplcpp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcpp_leave(modplcpp_hd *, modplcpp_grpid);
/*
Funcin modplcpp_newmsg:
Crea un nuevo mensaje.
*/
int modplcpp_newmsg(modplcpp_hd *, modplcpp_msg *, modplcpp_grpid,
modplcpp_mtype);
/*
Funcin modplcpp_copymsg:
Crea un copia de un mensaje.
*/
int modplcpp_copymsg(modplcpp_msg *, modplcpp_msg *);
/*
Funcin modplcpp_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcpp_putfield(modplcpp_msg *, modplcpp_ftype, unsigned char,
const void *);
/*
Funcin modplcpp_sendmsg:
Enva un mensaje por medio de la capa de presentacin.
*/
int modplcpp_sendmsg(modplcpp_msg *);
/*
Funcin modplcpp_receivemsg:
Recibe un mensaje por medio de la capa de presentacin.
*/
int modplcpp_receivemsg(modplcpp_hd *, modplcpp_msg *);
318 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_getfield:
Extrae un campo del mensaje.
*/
int modplcpp_getfield(modplcpp_msg *, modplcpp_ftype *, unsigned char *,
void *);
/*
Funcin modplcpp_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcpp_grpid modplcpp_getgrpid(modplcpp_msg *);
/*
Funcin modplcpp_destroymsg:
Destruye un mensaje.
*/
int modplcpp_destroymsg(modplcpp_msg *);
/*
Funcin modplcpp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcpp_notify(modplcpp_hd *, void (*func)(modplcpp_hd *, modplcpp_msg *,
void *), void *);
/*
Funcin modplcpp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcpp_poll(modplcpp_hd *);
/*
Funcin modplcpp_status:
Devuelve el estado del modem PLC.
*/
int modplcpp_status(modplcpp_hd *);
#endif
/*
Funcin modplcpp_init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
FernandoArielBeunza79156 319
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_release:
Libera los recursos utilizados por la capa de presentacin del modem PLC.
*/
int modplcpp_release(modplcpp_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcpp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modplcpp_publish(modplcpp_hd *hd, modplcpp_grpid grpid)
{
/* Verifica que el manejador de la capa de presentacin exista. */
320 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (!hd) return 0;
/*
Funcin modplcpp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int modplcpp_subscribe(modplcpp_hd *hd, modplcpp_grpid grpid)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcpp_leave(modplcpp_hd *hd, modplcpp_grpid grpid)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_newmsg:
Crea un nuevo mensaje.
*/
int modplcpp_newmsg(modplcpp_hd *hd, modplcpp_msg *msg, modplcpp_grpid grpid,
modplcpp_mtype mtype)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* Inicializa el mensaje. */
msg->startoffset = 0;
msg->endoffset = 0;
msg->grpid = grpid;
msg->mtype = mtype;
msg->pphd = hd;
return 1;
}
/*
Funcin modplcpp_copymsg:
Crea un copia de un mensaje.
*/
int modplcpp_copymsg(modplcpp_msg *dest, modplcpp_msg *src)
{
/* Verifica que el puntero al mensaje original no sea nulo. */
if (!src) return 0;
FernandoArielBeunza79156 321
Tesis de Grado en Ingeniera Informtica
if (!dest) return 0;
/*
Funcin modplcpp_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcpp_putfield(modplcpp_msg *msg, modplcpp_ftype type,
unsigned char count, const void *dat)
{
/* Variables. */
unsigned char *ptr; /* Puntero a los datos. */
size_t msgsize; /* Tamao del mensaje. */
322 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
}
/* Agrega datos tipo entero de 8 bits con signo. */
else if (type == MODPLCPP_SINT8TYPE)
{
while(count--)
{
*(msg->dat + msg->endoffset) = *ptr;
ptr += sizeof(char);
msg->endoffset += sizeof(char);
}
}
/* Agrega datos tipo entero de 16 bits. */
else if ((type == MODPLCPP_SINT16TYPE) || (type == MODPLCPP_UINT16TYPE))
{
while(count--)
{
*(msg->dat + msg->endoffset + 0) = *(ptr + 1);
*(msg->dat + msg->endoffset + 1) = *(ptr + 0);
ptr += sizeof(unsigned short int);
msg->endoffset += sizeof(unsigned short int);
}
}
/* Agrega datos tipo entero de 32 bits. */
else if ((type == MODPLCPP_SINT32TYPE) || (type == MODPLCPP_UINT32TYPE))
{
while(count--)
{
*(msg->dat + msg->endoffset + 0) = *(ptr + 3);
*(msg->dat + msg->endoffset + 1) = *(ptr + 2);
*(msg->dat + msg->endoffset + 2) = *(ptr + 1);
*(msg->dat + msg->endoffset + 3) = *(ptr + 0);
ptr += sizeof(unsigned long int);
msg->endoffset += sizeof(unsigned long int);
}
}
/* Agrega datos tipo punto flotante. */
else if (type == MODPLCPP_FLOATTYPE)
{
while(count--)
{
*(msg->dat + msg->endoffset) = *ptr;
ptr += sizeof(float);
msg->endoffset += sizeof(float);
}
}
/* xito. */
return 1;
}
/*
Funcin modplcpp_sendmsg:
Enva un mensaje por medio de la capa de presentacin.
*/
int modplcpp_sendmsg(modplcpp_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Enva un mensaje. */
if (modplcsp_send(((modplcpp_hd *) (msg->pphd))->modsphd, msg->grpid,
msg->mtype, msg->dat, msg->endoffset) == msg->endoffset)
return 1;
return 0;
}
/*
Funcin modplcpp_receivemsg:
Recibe un mensaje por medio de la capa de presentacin.
*/
int modplcpp_receivemsg(modplcpp_hd *hd, modplcpp_msg *msg)
FernandoArielBeunza79156 323
Tesis de Grado en Ingeniera Informtica
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcpp_getfield:
Extrae un campo del mensaje.
*/
int modplcpp_getfield(modplcpp_msg *msg, modplcpp_ftype *type,
unsigned char *count, void *dat)
{
/* Variables. */
unsigned char c; /* Contador. */
unsigned char *ptr; /* Puntero a los datos. */
324 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcpp_grpid modplcpp_getgrpid(modplcpp_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcpp_destroymsg:
Destruye un mensaje.
*/
int modplcpp_destroymsg(modplcpp_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
FernandoArielBeunza79156 325
Tesis de Grado en Ingeniera Informtica
msg->dat = NULL;
return 1;
}
/*
Funcin modplcpp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcpp_notify(modplcpp_hd *hd, void (*func)(modplcpp_hd *,
modplcpp_msg *, void *), void *param)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcpp_poll(modplcpp_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_status:
Devuelve el estado del modem PLC.
*/
int modplcpp_status(modplcpp_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin __modplcpp_procmsg__:
Procesa un mensaje recibido por medio de la capa de sesin.
*/
static void __modplcpp_procmsg__(modplcsp_hd *hd, modplcsp_grpid grpid,
const void *msg, size_t msgsize,
void *param)
{
/* Variables. */
modplcpp_hd *pphd; /* Manejador de capa de
presentacin. */
326 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (!pphd->buffer.dat) return;
#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;
FernandoArielBeunza79156 327
Tesis de Grado en Ingeniera Informtica
recibidos. */
} modplcap_hd;
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAP_NULLTYPE 0x00
#define MODPLCAP_CHARTYPE 0x01
#define MODPLCAP_SINT8TYPE 0x02
#define MODPLCAP_UINT8TYPE 0x03
#define MODPLCAP_SINT16TYPE 0x04
#define MODPLCAP_UINT16TYPE 0x05
#define MODPLCAP_SINT32TYPE 0x06
#define MODPLCAP_UINT32TYPE 0x07
#define MODPLCAP_FLOATTYPE 0x08
/*
Funcin modplcap_init:
Inicializa los recursos utilizados por la capa de aplicacin del modem PLC.
*/
static modplcap_hd * (*modplcap_init)(int);
/*
Funcin modplcap_release:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
static int (*modplcap_release)(modplcap_hd *);
/*
Funcin modplcap_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
static int (*modplcap_publish)(modplcap_hd *, modplcap_grpid);
/*
Funcin modplcap_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
static int (*modplcap_subscribe)(modplcap_hd *, modplcap_grpid);
/*
Funcin modplcap_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
static int (*modplcap_leave)(modplcap_hd *, modplcap_grpid);
/*
Funcin modplcap_newmsg:
Crea un nuevo mensaje.
*/
static int (*modplcap_newmsg)(modplcap_hd *, modplcap_msg *, modplcap_grpid,
modplcap_msgid);
/*
Funcin modplcap_copymsg:
Crea un copia de un mensaje.
*/
static int (*modplcap_copymsg)(modplcap_msg *, modplcap_msg *);
/*
Funcin modplcap_putfield:
Agrega un nuevo campo al mensaje.
*/
static int (*modplcap_putfield)(modplcap_msg *, modplcap_ftype, unsigned char,
const void *);
328 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
static int (*modplcap_sendmsg)(modplcap_msg *);
/*
Funcin modplcap_receivemsg:
Recibe un mensaje por medio de la capa de aplicacin.
*/
static int (*modplcap_receivemsg)(modplcap_hd *, modplcap_msg *);
/*
Funcin modplcap_getfield:
Extrae un campo del mensaje.
*/
static int (*modplcap_getfield)(modplcap_msg *, modplcap_ftype *,
unsigned char *, void *);
/*
Funcin modplcap_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
static modplcap_grpid (*modplcap_getgrpid)(modplcap_msg *);
/*
Funcin modplcap_getmsgid:
Devuelve el identificador de mensaje.
*/
static modplcap_msgid (*modplcap_getmsgid)(modplcap_msg *);
/*
Funcin modplcap_destroymsg:
Destruye un mensaje.
*/
static int (*modplcap_destroymsg)(modplcap_msg *);
/*
Funcin modplcap_notify:
Define una funcin manejadora de mensajes recibidos.
*/
static int (*modplcap_notify)(modplcap_hd *, void (*func)(modplcap_hd *,
modplcap_msg *, void *), void *);
/*
Funcin modplcap_poll:
Verifica la llegada de un nuevo mensaje.
*/
static int (*modplcap_poll)(modplcap_hd *);
/*
Funcin modplcap_status:
Devuelve el estado del modem PLC.
*/
static int (*modplcap_status)(modplcap_hd *);
/*
Funcin modplcap_loadlib:
Carga la bliblioteca dinmica referente a la capa de aplicacin del modem
PLC.
*/
static int modplcap_loadlib(void)
{
/* Variables. */
struct HINSTANCE__ *hlib; /* Manejador de biblioteca
dinmica. */
FernandoArielBeunza79156 329
Tesis de Grado en Ingeniera Informtica
/* Carga la biblioteca. */
hlib = NULL;
modplcap_init = NULL;
modplcap_release = NULL;
modplcap_publish = NULL;
modplcap_subscribe = NULL;
modplcap_leave = NULL;
modplcap_newmsg = NULL;
modplcap_copymsg = NULL;
modplcap_putfield = NULL;
modplcap_sendmsg = NULL;
modplcap_receivemsg = NULL;
modplcap_getfield = NULL;
modplcap_getgrpid = NULL;
modplcap_getmsgid = NULL;
modplcap_destroymsg = NULL;
modplcap_notify = NULL;
modplcap_poll = NULL;
modplcap_status = NULL;
hlib = LoadLibrary("MODPLCAP");
if (!hlib) return 0;
modplcap_init = (modplcap_hd * (*)(int))
GetProcAddress(hlib, "modplcap_init");
modplcap_release = (int (*)(modplcap_hd *))
GetProcAddress(hlib, "modplcap_release");
modplcap_publish = (int (*)(modplcap_hd *, modplcap_grpid))
GetProcAddress(hlib, "modplcap_publish");
modplcap_subscribe = (int (*)(modplcap_hd *, modplcap_grpid))
GetProcAddress(hlib, "modplcap_subscribe");
modplcap_leave = (int (*)(modplcap_hd *, modplcap_grpid))
GetProcAddress(hlib, "modplcap_leave");
modplcap_newmsg = (int (*)(modplcap_hd *, modplcap_msg *, modplcap_grpid,
modplcap_msgid))
GetProcAddress(hlib, "modplcap_newmsg");
modplcap_copymsg = (int (*)(modplcap_msg *, modplcap_msg *))
GetProcAddress(hlib, "modplcap_copymsg");
modplcap_putfield = (int (*)(modplcap_msg *, modplcap_ftype, unsigned char,
const void *))
GetProcAddress(hlib, "modplcap_putfield");
modplcap_sendmsg = (int (*)(modplcap_msg *))
GetProcAddress(hlib, "modplcap_sendmsg");
modplcap_receivemsg = (int (*)(modplcap_hd *, modplcap_msg *))
GetProcAddress(hlib, "modplcap_receivemsg");
modplcap_getfield = (int (*)(modplcap_msg *, modplcap_ftype *,
unsigned char *, void *))
GetProcAddress(hlib, "modplcap_getfield");
modplcap_getgrpid = (modplcap_grpid (*)(modplcap_msg *))
GetProcAddress(hlib, "modplcap_getgrpid");
modplcap_getmsgid = (modplcap_msgid (*)(modplcap_msg *))
GetProcAddress(hlib, "modplcap_getmsgid");
modplcap_destroymsg = (int (*)(modplcap_msg *))
GetProcAddress(hlib, "modplcap_destroymsg");
modplcap_notify = (int (*)(modplcap_hd *, void (*func)(modplcap_hd *,
modplcap_msg *, void *), void *))
GetProcAddress(hlib, "modplcap_notify");
modplcap_poll = (int (*)(modplcap_hd *))
GetProcAddress(hlib, "modplcap_poll");
modplcap_status = (int (*)(modplcap_hd *))
GetProcAddress(hlib, "modplcap_status");
/* xito. */
330 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return 1;
}
#endif
#endif
/*
Funcin modplcap_init:
Inicializa los recursos utilizados por la capa de aplicacin del modem PLC.
*/
modplcap_hd *modplcap_init(int sid)
{
/* Variables. */
modplcap_hd *handle; /* Manejador de capa de
aplicacin. */
FernandoArielBeunza79156 331
Tesis de Grado en Ingeniera Informtica
/* Inicializa el buffer. */
handle->msgflag = 0;
/*
Funcin modplcap_release:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
int modplcap_release(modplcap_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcap_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modplcap_publish(modplcap_hd *hd, modplcap_grpid grpid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
332 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
*/
int modplcap_subscribe(modplcap_hd *hd, modplcap_grpid grpid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcap_leave(modplcap_hd *hd, modplcap_grpid grpid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_newmsg:
Crea un nuevo mensaje.
*/
int modplcap_newmsg(modplcap_hd *hd, modplcap_msg *msg, modplcap_grpid grpid,
modplcap_msgid msgid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/* Inicializa el mensaje. */
msg->msgid = msgid;
msg->msg = malloc(sizeof(modplcpp_msg));
if (!msg->msg) return 0;
while(1)
{
if (msgid & 0x8000)
{
if (!modplcpp_newmsg((modplcpp_hd *) hd->pphd,
(modplcpp_msg *) (msg->msg), grpid, MODPLCPP_NOSECMSG))
break;
}
else
{
if (!modplcpp_newmsg((modplcpp_hd *) hd->pphd,
(modplcpp_msg *) (msg->msg), grpid, MODPLCPP_SECMSG))
break;
}
if (!modplcpp_putfield((modplcpp_msg *) (msg->msg),
MODPLCPP_UINT16TYPE, 1, &msgid))
break;
return 1;
}
free(msg->msg);
msg->msg = NULL;
return 0;
}
/*
Funcin modplcap_copymsg:
Crea un copia de un mensaje.
*/
int modplcap_copymsg(modplcap_msg *dest, modplcap_msg *src)
{
FernandoArielBeunza79156 333
Tesis de Grado en Ingeniera Informtica
/* Copia el mensaje. */
dest->msgid = src->msgid;
return modplcpp_copymsg((modplcpp_msg *) (dest->msg),
(modplcpp_msg *) (src->msg));
}
/*
Funcin modplcap_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcap_putfield(modplcap_msg *msg, modplcap_ftype type,
unsigned char count, const void *dat)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
int modplcap_sendmsg(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Enva un mensaje. */
return modplcpp_sendmsg((modplcpp_msg *) (msg->msg));
}
/*
Funcin modplcap_receivemsg:
Recibe un mensaje por medio de la capa de aplicacin.
*/
int modplcap_receivemsg(modplcap_hd *hd, modplcap_msg *msg)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* Recibe un mensaje. */
if (msg)
{
msg->msgid = hd->buffer.msgid;
msg->msg = malloc(sizeof(modplcpp_msg));
if (!msg->msg) return 0;
memcpy((modplcpp_msg *) (msg->msg), (modplcpp_msg *) (hd->buffer.msg),
sizeof(modplcpp_msg));
}
modplcpp_destroymsg(hd->buffer.msg);
free(hd->buffer.msg);
hd->msgflag = 0;
return 1;
}
/*
Funcin modplcap_getfield:
Extrae un campo del mensaje.
*/
int modplcap_getfield(modplcap_msg *msg, modplcap_ftype *type,
334 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcap_grpid modplcap_getgrpid(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_getmsgid:
Devuelve el identificador de mensaje.
*/
modplcap_msgid modplcap_getmsgid(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_destroymsg:
Destruye un mensaje.
*/
int modplcap_destroymsg(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Destruye el mensaje. */
free(msg->msg);
msg->msg = NULL;
return 1;
}
/*
Funcin modplcap_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcap_notify(modplcap_hd *hd, void (*func)(modplcap_hd *,
modplcap_msg *, void *), void *param)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcap_poll(modplcap_hd *hd)
FernandoArielBeunza79156 335
Tesis de Grado en Ingeniera Informtica
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_status:
Devuelve el estado del modem PLC.
*/
int modplcap_status(modplcap_hd *hd)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin __modplcap_procmsg__:
Procesa un mensaje recibido por medio de la capa de presentacin.
*/
static void __modplcap_procmsg__(modplcpp_hd *hd, modplcpp_msg *msg, void *param)
{
/* Variables. */
modplcpp_ftype type; /* Tipo de campo. */
modplcap_msgid msgid; /* Identificador de mensaje. */
unsigned char count; /* Contador. */
modplcap_hd *aphd; /* Manejador de capa de
aplicacin. */
/* Recibe el mensaje. */
if (!modplcpp_getfield(msg, &type, &count, &msgid)) return;
if (type != MODPLCPP_UINT16TYPE) return;
if (count != 1) return;
336 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCDL_H__)
#define __MODPLCDL_H__
FernandoArielBeunza79156 337
Tesis de Grado en Ingeniera Informtica
/* Definicin de tipos. */
/*
Funcin modplcdl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
static modplcdl_hd * (*modplcdl_init)(int);
/*
Funcin modplcdl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
static int (*modplcdl_release)(modplcdl_hd *);
/*
Funcin modplcdl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
static modplcdlconn_hd * (*modplcdl_open)(modplcdl_hd *, unsigned char,
unsigned char);
338 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
static int (*modplcdl_close)(modplcdlconn_hd *);
/*
Funcin modplcdl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
static size_t (*modplcdl_send)(modplcdlconn_hd *, modplcdl_phyaddr,
unsigned char, const void *, size_t);
/*
Funcin modplcdl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
static size_t (*modplcdl_receive)(modplcdlconn_hd *, modplcdl_phyaddr, void *,
size_t);
/*
Funcin modplcdl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
static int (*modplcdl_notify)(modplcdlconn_hd *, void (*func)(void *,
modplcdl_phyaddr, void *, size_t, void *),
void *);
/*
Funcin modplcdl_poll:
Verifica la recepcin de un mensaje.
*/
static int (*modplcdl_poll)(modplcdlconn_hd *);
/*
Funcin modplcdl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
static int (*modplcdl_getaddress)(modplcdl_hd *, unsigned char,
modplcdl_phyaddr);
/*
Funcin modplcdl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
static int (*modplcdl_addlogaddress)(modplcdl_hd *, unsigned char,
unsigned char, modplcdl_logaddr);
/*
Funcin modplcdl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
static int (*modplcdl_dellogaddress)(modplcdl_hd *, unsigned char,
unsigned char, modplcdl_logaddr);
/*
Funcin modplcdl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa de
enlace del modem PLC.
*/
static int (*modplcdl_getphyaddress)(modplcdl_hd *hd, unsigned char,
unsigned char, modplcdl_logaddr,
modplcdl_phyaddr);
/*
Funcin modplcdl_status:
Devuelve el estado del modem PLC.
*/
static int (*modplcdl_status)(modplcdl_hd *);
/*
FernandoArielBeunza79156 339
Tesis de Grado en Ingeniera Informtica
Funcin modplcdl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de enlace del modem PLC.
*/
static size_t (*modplcdl_getpayloadsize)(modplcdl_hd *, unsigned char);
/*
Funcin modplcdl_loadlib:
Carga la bliblioteca dinmica referente a la capa de enlace del modem PLC.
*/
static int modplcdl_loadlib(void)
{
/* Variables. */
struct HINSTANCE__ *hlib; /* 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
Tesis de Grado en Ingeniera Informtica
GetProcAddress(hlib, "modplcdl_getphyaddress");
modplcdl_status = (int (*)(modplcdl_hd *))
GetProcAddress(hlib, "modplcdl_status");
modplcdl_getpayloadsize = (size_t (*)(modplcdl_hd *, unsigned char))
GetProcAddress(hlib, "modplcdl_getpayloadsize");
/* xito. */
return 1;
}
#endif
#endif
FernandoArielBeunza79156 341
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
modplcdl_hd *modplcdl_init(int sid)
{
/* Variables. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
modplcdl_hd *handle; /* Manejador de interfaz con la
capa de enlace del modem PLC. */
char qname[256]; /* Nombre de la cola de
mensajes. */
/*
Funcin modplcdl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int modplcdl_release(modplcdl_hd *hd)
{
/* Variables. */
342 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Libera los recursos utilizados por la interfaz con la capa de enlace del
modem PLC. */
CloseHandle(hd->hq);
CloseHandle(hd->hm);
free(hd);
/* xito. */
return 1;
}
/*
Funcin modplcdl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
modplcdlconn_hd *modplcdl_open(modplcdl_hd *hd, unsigned char iface,
unsigned char prot)
{
/* Variables. */
int op; /* Identificador de operacin. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
size_t payloadsize; /* Cantidad de bytes que puede
contener un mensaje. */
modplcdlconn_hd *handle; /* Manejador de conexin de la capa
de enlace del modem PLC. */
char qname[256]; /* Nombre de la cola de
mensajes. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
FernandoArielBeunza79156 343
Tesis de Grado en Ingeniera Informtica
/* Abre una conexin con la cola de mensajes del driver del modem
PLC. */
sprintf(qname, "\\\\.\\pipe\\modemplc%i", hd->sid);
handle->hq = CreateFile(qname, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (handle->hq == INVALID_HANDLE_VALUE) break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcdl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplcdl_close(modplcdlconn_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la solicitud. */
344 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->dlhd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->dlhd->hm, 1, NULL);
/* xito. */
return 1;
}
/*
Funcin modplcdl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplcdl_send(modplcdlconn_hd *hd, modplcdl_phyaddr addr,
unsigned char prio, const void *msg, size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->dlhd->hm, INFINITE);
/* Enva un mensaje. */
while(1)
{
/* Solicita el envo de un mensaje. */
op = MODDRVDL_SEND;
if (!__modplcdl_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op))) break;
FernandoArielBeunza79156 345
Tesis de Grado en Ingeniera Informtica
/* Enva el mensaje. */
if (!__modplcdl_sendrecv__(hd->hq, &msgsize, sizeof(msgsize), msg,
msgsize))
break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->dlhd->hm, 1, NULL);
/*
Funcin modplcdl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplcdl_receive(modplcdlconn_hd *hd, modplcdl_phyaddr addr, void *msg,
size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->dlhd->hm, INFINITE);
/* Recibe un mensaje. */
while(1)
{
/* Solicita la recepcin de un mensaje. */
op = MODDRVDL_RECEIVE;
if (!__modplcdl_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op))) break;
/* Recibe el mensaje. */
if (!__modplcdl_sendrecv__(hd->hq, msg, msgsize, NULL, 0)) break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->dlhd->hm, 1, NULL);
346 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return 0;
}
/*
Funcin modplcdl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcdl_notify(modplcdlconn_hd *hd, void (*func)(void *, modplcdl_phyaddr,
void *, size_t, void *), void *param)
{
/* Variables. */
DWORD tid; /* Identificador de hilo. */
/*
Funcin modplcdl_poll:
FernandoArielBeunza79156 347
Tesis de Grado en Ingeniera Informtica
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->dlhd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->dlhd->hm, 1, NULL);
/*
Funcin modplcdl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int modplcdl_getaddress(modplcdl_hd *hd, unsigned char iface,
modplcdl_phyaddr addr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
348 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int modplcdl_addlogaddress(modplcdl_hd *hd, unsigned char iface,
unsigned char prot, modplcdl_logaddr addr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcdl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int modplcdl_dellogaddress(modplcdl_hd *hd, unsigned char iface,
unsigned char prot, modplcdl_logaddr addr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
FernandoArielBeunza79156 349
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcdl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa de
enlace del modem PLC.
*/
int modplcdl_getphyaddress(modplcdl_hd *hd, unsigned char iface,
unsigned char prot, modplcdl_logaddr laddr,
modplcdl_phyaddr paddr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
350 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (!result) break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcdl_status:
Devuelve el estado del modem PLC.
*/
int modplcdl_status(modplcdl_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcdl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de enlace del modem PLC.
*/
size_t modplcdl_getpayloadsize(modplcdl_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Operacin. */
size_t payloadsize; /* Cantidad de bytes que puede
contener un mensaje. */
/* Espera el permiso para poder comunicarse con el driver del modem PLC. */
WaitForSingleObject(hd->hm, INFINITE);
FernandoArielBeunza79156 351
Tesis de Grado en Ingeniera Informtica
mensaje. */
op = MODDRVDL_GETPAYLOADSIZE;
if (!__modplcdl_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op))) break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin __modplcdl_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser ledo.
*/
static DWORD WINAPI __modplcdl_detectproc__(LPVOID param)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
int captureflag; /* Indicador de captura de un
mensaje. */
size_t msgsize; /* Tamao del mensaje. */
modplcdl_phyaddr addr; /* Direccin de origen. */
modplcdlconn_hd *hd; /* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
void (*func)
(void *, modplcdl_phyaddr, void *,
size_t, void *); /* Funcin manejadora de mensajes
recibidos. */
unsigned char *msg; /* Puntero al mensaje recibido. */
/* Recibe el mensaje. */
while(captureflag)
{
/* Solicita la recepcin de un mensaje. */
op = MODDRVDL_RECEIVE;
if (!__modplcdl_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op)))
break;
352 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
mensaje. */
msgsize = hd->payloadsize;
if (!__modplcdl_sendrecv__(hd->hq, &msgsize, sizeof(msgsize),
&msgsize, sizeof(msgsize)))
break;
if (!msgsize) break;
/* Recibe el mensaje. */
msg = (unsigned char *) malloc(msgsize * sizeof(unsigned char));
if (!msg)
{
captureflag = 0;
break;
}
__modplcdl_sendrecv__(hd->hq, msg, msgsize, NULL, 0);
break;
}
/*
Funcin __modplcdl_sendrecv__:
Intercambia datos con el driver del modem PLC.
*/
static int __modplcdl_sendrecv__(HANDLE hq, void *outdata, size_t outsize,
const void *indata, size_t insize)
{
/* Variables. */
size_t last; /* Cantidad de bytes enviados o
recibidos. */
size_t sent; /* Cantidad de bytes enviados. */
size_t received; /* Cantidad de bytes recibidos. */
/* Enva la operacin. */
sent = 0;
while((indata) && (sent < insize))
{
if (!WriteFile(hq, indata, insize, &last, NULL)) return 0;
sent += last;
}
/* Recibe la respuesta. */
received = 0;
while((outdata) && (received < outsize))
{
if (!ReadFile(hq, outdata, outsize, &last, NULL)) return 0;
FernandoArielBeunza79156 353
Tesis de Grado en Ingeniera Informtica
received += last;
}
/* xito. */
return 1;
}
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
354 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__MODPLCPHY_H__)
#define __MODPLCPHY_H__
/* Definicin de tipos. */
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPLCPHY_NOISESIGNAL 0x01
#define MODPLCPHY_TESTSIGNAL1 0x02
#define MODPLCPHY_TESTSIGNAL2 0x03
/*
Funcin modplcphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
static modplcphy_hd * (*modplcphy_init)(int);
/*
Funcin modplcphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
static int (*modplcphy_release)(modplcphy_hd *);
/*
Funcin modplcphy_sndframe:
Enva una trama.
*/
static size_t (*modplcphy_sndframe)(modplcphy_hd *, unsigned char,
const void *, size_t);
FernandoArielBeunza79156 355
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_capframe:
Captura una trama.
*/
static int (*modplcphy_capframe)(modplcphy_hd *, unsigned char, size_t);
/*
Funcin modplcphy_getframe:
Obtiene una trama capturada previamente.
*/
static size_t (*modplcphy_getframe)(modplcphy_hd *, unsigned char, void *,
size_t);
/*
Funcin modplcphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
static int (*modplcphy_notify)(modplcphy_hd *, unsigned char,
void (*func)(modplcphy_hd *, void *), void *);
/*
Funcin modplcphy_poll:
Verifica la captura de una trama.
*/
static int (*modplcphy_poll)(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_rsdframe:
Reenva una trama.
*/
static int (*modplcphy_rsdframe)(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
static int (*modplcphy_clrbuffer)(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
static int (*modplcphy_sensechannel)(modplcphy_hd *, unsigned char,
unsigned char, long int);
/*
Funcin modplcphy_gensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
static int (*modplcphy_gensignal)(modplcphy_hd *, unsigned char, int);
/*
Funcin modplcphy_tstreceive:
Realiza una prueba de recepcin.
*/
static int (*modplcphy_tstreceive)(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_status:
Devuelve el estado del modem PLC.
*/
static int (*modplcphy_status)(modplcphy_hd *);
/*
Funcin modplcphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
static size_t (*modplcphy_getpayloadsize)(modplcphy_hd *, unsigned char);
356 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_loadlib:
Carga la bliblioteca dinmica referente a la capa fsica del modem PLC.
*/
static int modplcphy_loadlib(void)
{
/* Variables. */
struct HINSTANCE__ *hlib; /* 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");
FernandoArielBeunza79156 357
Tesis de Grado en Ingeniera Informtica
(!modplcphy_status) || (!modplcphy_getpayloadsize))
return 0;
/* xito. */
return 1;
}
#endif
#endif
/*
Funcin modplcphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
modplcphy_hd *modplcphy_init(int sid)
{
/* Variables. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
short int iface; /* Identificadores de interfaces
358 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
fsicas. */
modplcphy_hd *handle; /* Manejador de interfaz con la
capa fsica del modem PLC. */
char qname[256]; /* 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;
/*
Funcin modplcphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modplcphy_release(modplcphy_hd *hd)
{
/* Variables. */
int op; /* Operacin. */
int result; /* Resultado de la operacin. */
short int iface; /* Identificadores de interfaces
fsicas. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
FernandoArielBeunza79156 359
Tesis de Grado en Ingeniera Informtica
/* Libera los recursos utilizados por la interfaz con la capa fsica del
modem PLC. */
CloseHandle(hd->hm);
CloseHandle(hd->hq);
free(hd);
/* xito. */
return 1;
}
/*
Funcin modplcphy_sndframe:
Enva una trama.
*/
size_t modplcphy_sndframe(modplcphy_hd *hd, unsigned char iface,
const 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);
/* 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);
/*
360 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin modplcphy_capframe:
Captura una trama.
*/
int modplcphy_capframe(modplcphy_hd *hd, unsigned char iface, size_t framesize)
{
/* 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);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
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);
FernandoArielBeunza79156 361
Tesis de Grado en Ingeniera Informtica
sizeof(framesize)))
break;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
int modplcphy_notify(modplcphy_hd *hd, unsigned char iface,
void (*func)(modplcphy_hd *, void *), void *param)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
362 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (hd->iface[iface].detectthread == INVALID_HANDLE_VALUE)
{
hd->iface[iface].recfun = NULL;
hd->iface[iface].param = NULL;
ReleaseSemaphore(hd->hm, 1, NULL);
return 0;
}
ReleaseSemaphore(hd->hm, 1, NULL);
return 1;
}
/*
Funcin modplcphy_poll:
Verifica la captura de una trama.
*/
int modplcphy_poll(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);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
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
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modplcphy_clrbuffer(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);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
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
Tesis de Grado en Ingeniera Informtica
/* 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);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
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);
FernandoArielBeunza79156 365
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modplcphy_tstreceive(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);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin modplcphy_status:
Devuelve el estado del modem PLC.
*/
int modplcphy_status(modplcphy_hd *hd)
{
/* 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);
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
366 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modplcphy_getpayloadsize(modplcphy_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Operacin. */
size_t payloadsize; /* Cantidad de bytes que puede
contener una trama. */
/* 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;
/* Permite a otro hilos poder comunicarse con el driver del modem PLC. */
ReleaseSemaphore(hd->hm, 1, NULL);
/*
Funcin __modplcphy_detectproc__:
Verifica la existencia de una trama capturada disponible para ser leda.
*/
static DWORD WINAPI __modplcphy_detectproc__(LPVOID param)
{
/* Variables. */
int op; /* Identificador de operacin. */
int captureflag; /* Indicador de captura de una
trama. */
short int i; /* Contador. */
unsigned char iface; /* Identificadores de interfaces
fsicas. */
modplcphy_hd *hd; /* Manejador de interfaz con la
capa fsica del modem PLC. */
void (*func)(void *, void *); /* Manejador de captura de
tramas. */
FernandoArielBeunza79156 367
Tesis de Grado en Ingeniera Informtica
deteccin de recepcin. */
iface = 0;
WaitForSingleObject(hd->hm, INFINITE);
for(i = 0; i < 256; i++)
{
if (hd->iface[i].threadid != GetCurrentThreadId()) continue;
iface = (unsigned char) (i & 0x00ff);
break;
}
ReleaseSemaphore(hd->hm, 1, NULL);
if (i > 255) return 0;
/*
Funcin __modplcphy_sendrecv__:
Intercambia datos con el driver del modem PLC.
*/
static int __modplcphy_sendrecv__(modplcphy_hd *hd, void *outdata,
size_t outsize, const void *indata,
size_t insize)
{
/* Variables. */
size_t last; /* Cantidad de bytes enviados o
recibidos. */
size_t sent; /* Cantidad de bytes enviados. */
size_t received; /* Cantidad de bytes recibidos. */
/* 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
Tesis de Grado en Ingeniera Informtica
{
if (!WriteFile(hd->hq, indata, insize, &last, NULL)) return 0;
sent += last;
}
/* Recibe la respuesta. */
received = 0;
while((outdata) && (received < outsize))
{
if (!ReadFile(hd->hq, outdata, outsize, &last, NULL)) return 0;
received += last;
}
/* xito. */
return 1;
}
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
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
/* Tipos de reset. */
#define MODPLC_NORMRESET '0'
#define MODPLC_PARAMRESET '$'
/* Tipos de seal. */
#define MODPLCPHY_NOISESIGNAL 0x01
#define MODPLCPHY_TESTSIGNAL1 0x02
#define MODPLCPHY_TESTSIGNAL2 0x03
370 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 371
Tesis de Grado en Ingeniera Informtica
#endif
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
/* Definicin de tipos. */
/*
Funcin serial_init:
Inicializa la interfaz de comunicacin por puerto serie.
*/
serial_hd *serial_init(int, size_t);
/*
Funcin serial_release:
Libera los recursos utilizdos por la interfaz de comunicacin por puerto
serie.
*/
int serial_release(serial_hd *);
/*
Funcin serial_send:
Enva un mensaje a travs de la interfaz de comunicacin por puerto serie.
*/
size_t serial_send(serial_hd *, const void *, size_t);
/*
372 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin serial_receive:
Recibe un mensaje a por medio de la interfaz de comunicacin por puerto
serie.
*/
size_t serial_receive(serial_hd *, void *, size_t);
/*
Funcin serial_poll:
Devuelve si hay un mensaje a la espera de ser recibido.
*/
int serial_poll(serial_hd *);
#endif
/*
Funcin serial_init:
Inicializa la interfaz de comunicacin por puerto serie.
*/
serial_hd *serial_init(int id, size_t buffsize)
{
/* Variables. */
DWORD tid; /* Identificador de hilo. */
DCB icfg; /* Configuracin de la interfaz de
comunicacin por puerto
serie. */
COMMTIMEOUTS cto; /* Configuracin de los tiempos de
espera. */
serial_hd *handle; /* Manejador de la interfaz. */
char iname[256]; /* Nombre de la interfaz. */
FernandoArielBeunza79156 373
Tesis de Grado en Ingeniera Informtica
return NULL;
}
handle->received = 0;
handle->size = buffsize;
/* Inicializa semforos. */
handle->stopflag = 0;
handle->stopsem = CreateSemaphore(NULL, 0, 1, NULL);
if (handle->stopsem == INVALID_HANDLE_VALUE) break;
374 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin serial_release:
Libera los recursos utilizdos por la interfaz de comunicacin por puerto
serie.
*/
int serial_release(serial_hd *hd)
{
/* Verifica la validez del manejador de la interfaz de comunicacin por
puerto serie. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin serial_send:
Enva un mensaje a travs de la interfaz de comunicacin por puerto serie.
*/
size_t serial_send(serial_hd *hd, const void *msg, size_t msgsize)
{
/* Variables. */
int result; /* Resultado de la espera. */
size_t sent; /* Cantidad de bytes enviados. */
size_t lastsend; /* Cantidad de bytes envados en el
ltimo envo. */
OVERLAPPED ovl; /* Manejador de comunicacin
asincrnica. */
unsigned char *ptr; /* Puntero al mensaje. */
FernandoArielBeunza79156 375
Tesis de Grado en Ingeniera Informtica
{
if (!GetOverlappedResult(hd->serialhd, &ovl, &lastsend,
FALSE))
break;
}
else
break;
}
}
CloseHandle(ovl.hEvent);
} while(!lastsend);
/*
Funcin serial_receive:
Recibe un mensaje por medio de la interfaz de comunicacin por puerto
serie.
*/
size_t serial_receive(serial_hd *hd, void *msg, size_t msgsize)
{
/* Variables. */
size_t received; /* Cantidad de bytes recibidos. */
/*
Funcin serial_poll:
Verifica la llegada de un nuevo mensaje.
*/
int serial_poll(serial_hd *hd)
{
/* Verifica la validez del manejador de la interfaz de comunicacin por
puerto serie. */
if (!hd) return 0;
376 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __serial_recvproc__:
Recibe datos por la interfaz de comunicacin por puerto serie y lo almacena
en el buffer de recepcin.
*/
static DWORD WINAPI __serial_recvproc__(LPVOID param)
{
/* Variables. */
int result; /* Resultado de la espera. */
size_t received; /* Cantidad de bytes recibidos. */
OVERLAPPED ovl; /* Manejador de comunicacin
asincrnica. */
HANDLE waiters[2]; /* Manejadores en espera. */
serial_hd *hd; /* Manejador de la interfaz por
puerto serie. */
FernandoArielBeunza79156 377
Tesis de Grado en Ingeniera Informtica
}
hd->received += received;
#if !defined(__MODPLC_H__)
#define __MODPLC_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modplc_spgrpid;
/* Definicin de constantes. */
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER 0x01
#define MODPLC_DATALINKLAYER 0x02
#define MODPLC_SESSIONLAYER 0x03
/* Tipos de seales. */
#define MODPLC_PHYNOISESIGNAL 0x01
#define MODPLC_PHYTESTSIGNAL1 0x02
#define MODPLC_PHYTESTSIGNAL2 0x03
378 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplc_init:
Inicializa los recursos utilizados por la interfaz con el modem PLC.
*/
modplc_hd *modplc_init(int, int, int);
/*
Funcin modplc_release:
Libera los recursos utilizados por la interfaz con el modem PLC.
*/
int modplc_release(modplc_hd *);
/*
Funcin modplc_status:
Devuelve el estado del modem PLC.
*/
int modplc_status(modplc_hd *);
/*
Funcin modplc_physndframe:
Enva una trama por medio de la capa fsica del modem PLC.
*/
size_t modplc_physndframe(modplc_hd *, unsigned char, const void *, size_t);
/*
Funcin modplc_phycapframe:
Captura una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phycapframe(modplc_hd *, unsigned char, size_t);
/*
Funcin modplc_phygetframe:
Obtiene una trama capturada previamente por medio de la capa fsica del
modem PLC.
*/
size_t modplc_phygetframe(modplc_hd *, unsigned char, void *, size_t);
/*
Funcin phy_poll:
Verifica la captura de una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phypoll(modplc_hd *, unsigned char);
/*
Funcin modplc_phyrsdframe:
Reenva una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phyrsdframe(modplc_hd *, unsigned char);
/*
Funcin modplc_phyclrbuffer:
Limpia el buffer de captura de tramas de la capa fsica del modem PLC.
*/
int modplc_phyclrbuffer(modplc_hd *, unsigned char);
/*
Funcin modplc_physensechannel:
Sensa el estado del canal de comunicacin por medio de la capa fsica del
modem PLC.
*/
int modplc_physensechannel(modplc_hd *, unsigned char, unsigned char,
long int);
/*
Funcin modplc_phygensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modplc_phygensignal(modplc_hd *, unsigned char, int);
/*
FernandoArielBeunza79156 379
Tesis de Grado en Ingeniera Informtica
Funcin modplc_phytstreceive:
Realiza una prueba de recepcin de la capa fsica del modem PLC.
*/
int modplc_phytstreceive(modplc_hd *, unsigned char);
/*
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 *, unsigned char);
/*
Funcin modplc_dlopen:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlopen(modplc_hd *, unsigned char, unsigned char);
/*
Funcin modplc_dlclose:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlclose(modplc_hd *, int);
/*
Funcin modplc_dlsend:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlsend(modplc_hd *, int, modplc_dlphyaddr, unsigned char,
const void *, size_t);
/*
Funcin modplc_dlreceive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlreceive(modplc_hd *, int, modplc_dlphyaddr, void *, size_t);
/*
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 *, int);
/*
Funcin modplc_dlgetaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int modplc_dlgetaddress(modplc_hd *, unsigned char, modplc_dlphyaddr);
/*
Funcin modplc_dladdlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int modplc_dladdlogaddress(modplc_hd *, unsigned char, unsigned char,
modplc_dllogaddr);
/*
Funcin modplc_dldellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int modplc_dldellogaddress(modplc_hd *, unsigned char, unsigned char,
modplc_dllogaddr);
/*
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 *, unsigned char, unsigned char,
modplc_dllogaddr, modplc_dlphyaddr);
380 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplc_dlgetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de enlace del modem PLC.
*/
size_t modplc_dlgetpayloadsize(modplc_hd *, unsigned char);
/*
Funcin modplc_sppublish:
Registra el dispositivo como publicador del grupo de difusin especificado
de la capa de sesin del modem PLC.
*/
int modplc_sppublish(modplc_hd *, modplc_spgrpid);
/*
Funcin modplc_spsubscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado
de la capa de sesin del modem PLC.
*/
int modplc_spsubscribe(modplc_hd *, modplc_spgrpid);
/*
Funcin modplc_spleave:
Desvincula el dispositivo del grupo de difusin especificado de la capa de
sesin del modem PLC.
*/
int modplc_spleave(modplc_hd *, modplc_spgrpid);
/*
Funcin modplc_spsend:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spsend(modplc_hd *, modplc_spgrpid, int, const void *, size_t);
/*
Funcin modplc_spreceive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spreceive(modplc_hd *, modplc_spgrpid *, void *, size_t);
/*
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 *);
/*
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 *);
#endif
FernandoArielBeunza79156 381
Tesis de Grado en Ingeniera Informtica
#include <stdio.h>
#include "serial.h"
#include "modplc.h"
/*
Funcin modplc_init:
Inicializa los recursos utilizados por la interfaz con el modem PLC.
*/
modplc_hd *modplc_init(int sid, int layer, int debugmode)
{
/* Variables. */
char prompt; /* Smbolo de la lnea de
comando. */
modplc_hd *handle; /* Manejador de interfaz con el
modem PLC. */
char cmdline[MODPLC_BUFFERSIZE]; /* Lnea de comando. */
char respline[MODPLC_BUFFERSIZE]; /* Lnea de respuesta de
comando. */
382 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
break;
strcat(cmdline, "\n");
if (__modplc_sendcmdline__(handle, cmdline, respline,
MODPLC_BUFFERSIZE) != MODPLC_INITPROMPT)
break;
sprintf(cmdline, "init\n");
if (__modplc_sendcmdline__(handle, cmdline, respline,
MODPLC_BUFFERSIZE) != MODPLC_LAYPROMPT)
break;
*(cmdline + 1) = '\n';
*(cmdline + 2) = 0;
if (__modplc_sendcmdline__(handle, cmdline, respline,
MODPLC_BUFFERSIZE) != MODPLC_NORMPROMPT)
break;
/*
Funcin modplc_release:
Libera los recursos utilizados por la interfaz con el modem PLC.
*/
int modplc_release(modplc_hd *hd)
{
/* Verifica que el manejador de interfaz con el modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplc_status:
Devuelve el estado del modem PLC.
*/
int modplc_status(modplc_hd *hd)
{
/* Verifica que el manejador de interfaz con el modem PLC exista. */
if (!hd) return 0;
FernandoArielBeunza79156 383
Tesis de Grado en Ingeniera Informtica
return 1;
hd->status = 0;
return 0;
}
/*
Funcin modplc_physndframe:
Enva una trama por medio de la capa fsica del modem PLC.
*/
size_t modplc_physndframe(modplc_hd *hd, unsigned char iface,
const void *frame, size_t framesize)
{
/* Variables. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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. */
/*
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
Tesis de Grado en Ingeniera Informtica
size_t framesize)
{
/* Variables. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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
Tesis de Grado en Ingeniera Informtica
/*
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. */
/*
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
Tesis de Grado en Ingeniera Informtica
return 0;
}
/*
Funcin modplc_phygensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modplc_phygensignal(modplc_hd *hd, unsigned char iface, int sig)
{
/* Variables. */
unsigned char result; /* Resultado del comando. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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. */
/*
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
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplc_dlopen:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlopen(modplc_hd *hd, unsigned char iface, unsigned char prot)
{
/* Variables. */
unsigned short int handle; /* Manejador de conexin. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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; /* Resultado del comando. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
388 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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. */
/* Enva un mensaje. */
inparam[0] = &handle;
inparam[1] = addr;
inparam[2] = &prio;
inparam[3] = &msgsize;
outparam[0] = &msgsize;
if (__modplc_sendcmd__(hd, MODPLCDL_SEND, "sabs", inparam, msg, "s",
outparam, NULL))
return msgsize;
return 0;
}
/*
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. */
/* Recibe un mensaje. */
inparam[0] = &handle;
inparam[1] = &msgsize;
outparam[0] = addr;
outparam[1] = &msgsize;
if (__modplc_sendcmd__(hd, MODPLCDL_RECEIVE, "ss", inparam, NULL, "as",
outparam, msg))
return msgsize;
return 0;
FernandoArielBeunza79156 389
Tesis de Grado en Ingeniera Informtica
/*
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; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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. */
/*
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
390 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
comando. */
/*
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. */
/*
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. */
FernandoArielBeunza79156 391
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplc_dlgetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de enlace del modem PLC.
*/
size_t modplc_dlgetpayloadsize(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned short int payloadsize; /* Cantidad mxima de bytes que
puede contener una trama. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin modplc_sppublish:
Registra el dispositivo como publicador del grupo de difusin especificado
de la capa de sesin del modem PLC.
*/
int modplc_sppublish(modplc_hd *hd, modplc_spgrpid grpid)
{
/* Variables. */
unsigned char result; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
392 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return 0;
}
/*
Funcin modplc_spsubscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado
de la capa de sesin del modem PLC.
*/
int modplc_spsubscribe(modplc_hd *hd, modplc_spgrpid grpid)
{
/* Variables. */
unsigned char result; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin modplc_spsend:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spsend(modplc_hd *hd, modplc_spgrpid grpid, int nosec,
const void *msg, size_t msgsize)
{
FernandoArielBeunza79156 393
Tesis de Grado en Ingeniera Informtica
/* Variables. */
void *inparam[3]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/* Enva un mensaje. */
inparam[0] = &grpid;
inparam[1] = &nosec;
inparam[2] = &msgsize;
outparam[0] = &msgsize;
if (__modplc_sendcmd__(hd, MODPLCSP_SEND, "bbs", inparam, msg, "s",
outparam, NULL))
return msgsize;
return 0;
}
/*
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. */
/* Recibe un mensaje. */
inparam[0] = &msgsize;
outparam[0] = grpid;
outparam[1] = &msgsize;
if (__modplc_sendcmd__(hd, MODPLCSP_RECEIVE, "s", inparam, NULL, "bs",
outparam, msg))
return msgsize;
return 0;
}
/*
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; /* Resultado del comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
394 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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; /* Cantidad mxima de bytes que
puede contener una trama. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin __modplc_sendcmdline__:
Enva una lnea de comando por medio de la interfaz de comunicacin por
puerto serie.
*/
static char __modplc_sendcmdline__(modplc_hd *hd, const char *cmdline,
char *resp, size_t respsize)
{
/* Variables. */
size_t send; /* Cantidad de bytes por envo. */
size_t size; /* Tamao de la lnea de
respuesta. */
char *lastchar; /* Pntero al ltimo caracter. */
char respline[MODPLC_BUFFERSIZE]; /* Respuesta a la lnea de
comando. */
FernandoArielBeunza79156 395
Tesis de Grado en Ingeniera Informtica
/* Recibe la respuesta. */
size += serial_receive(hd->serialhd, respline + size, respsize - size);
*(respline + size) = 0;
/*
Funcin __modplc_sendcmd__:
Enva un comando por medio de la interfaz de comunicacin por puerto serie
y devuelve su respuesta .
*/
static int __modplc_sendcmd__(modplc_hd *hd, char op, const char *infmt,
void **inparam, const void *inframe,
const char *outfmt, void **outparam,
void *outframe)
{
/* Variables. */
int param; /* Nmero de parmetro. */
size_t i; /* Contador. */
size_t j; /* Contador. */
size_t framesize; /* Tamao de la trama. */
unsigned char *ptrline; /* Puntero a la lnea de
respuesta de comando. */
unsigned char *ptrparam; /* Puntero al parmetro. */
unsigned char *ptrresp; /* Puntero a la respuesta. */
unsigned char *ptrframe; /* Puntero a la trama. */
unsigned char dat; /* Dato. */
char hexval[3]; /* Valor hexadecimal. */
char cmdline[MODPLC_BUFFERSIZE]; /* Lnea de comando. */
char rline[MODPLC_BUFFERSIZE]; /* Lnea de respuesta de
comando. */
char respline[MODPLC_BUFFERSIZE]; /* Lnea de respuesta de
comando. */
396 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Enva la trama. */
*cmdline = 0;
ptrframe = (char *) inframe;
framesize = *((size_t *) inparam[param - 1]);
for(i = 0; i < framesize; )
{
dat = (unsigned char) *ptrframe;
if ((dat >= 0x20) && (dat <= 0x7e) && (dat != '\\') &&
(dat != MODPLC_INITPROMPT) && (dat != MODPLC_LAYPROMPT) &&
(dat != MODPLC_NORMPROMPT) && (dat != MODPLC_PARAMPROMPT))
sprintf(hexval, "%c", dat);
else
sprintf(hexval, "\\%02X", dat);
strcat(cmdline, hexval);
ptrframe ++;
i ++;
if ((i % 24) && (i < framesize)) continue;
strcat(cmdline, "\n");
if (__modplc_sendcmdline__(hd, cmdline, respline,
MODPLC_BUFFERSIZE) != MODPLC_PARAMPROMPT)
break;
*cmdline = 0;
}
}
FernandoArielBeunza79156 397
Tesis de Grado en Ingeniera Informtica
if (*ptrresp == '\r')
{
ptrresp ++;
continue;
}
else if (*ptrresp != '\n')
{
rline[i++] = *(ptrresp ++);
continue;
}
rline[i] = 0;
ptrresp ++;
i = 0;
if (!strlen(rline)) continue;
if (param < 1)
{
param ++;
continue;
}
if (!outfmt[param - 1])
{
ptrresp -= (strlen(rline) + 2);
break;
}
ptrline = rline;
ptrparam = (unsigned char *) outparam[param - 1];
if (outfmt[param - 1] == 'b')
{
if (*ptrline != '\\')
*ptrparam = *(ptrline ++);
else
{
ptrline ++;
hexval[0] = *(ptrline ++);
hexval[1] = *(ptrline ++);
hexval[2] = 0;
sscanf(hexval, "%X", &dat);
*ptrparam = dat;
}
}
else if (outfmt[param - 1] == 's')
{
for(j = 0; j < 2; j++)
{
if (*ptrline != '\\')
*(ptrparam + 1 - j) = *(ptrline ++);
else
{
ptrline ++;
hexval[0] = *(ptrline ++);
hexval[1] = *(ptrline ++);
hexval[2] = 0;
sscanf(hexval, "%X", &dat);
*(ptrparam + 1 - j) = dat;
}
}
}
else if (outfmt[param - 1] == 'l')
{
for(j = 0; j < 4; j++)
{
if (*ptrline != '\\')
*(ptrparam + 3 - j) = *(ptrline ++);
else
{
ptrline ++;
hexval[0] = *(ptrline ++);
hexval[1] = *(ptrline ++);
hexval[2] = 0;
sscanf(hexval, "%X", &dat);
*(ptrparam + 3 - j) = dat;
398 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
}
}
}
else if (outfmt[param - 1] == 'a')
{
for(j = 0; j < 8; j++)
{
if (*ptrline != '\\')
*(ptrparam + j) = *(ptrline ++);
else
{
ptrline ++;
hexval[0] = *(ptrline ++);
hexval[1] = *(ptrline ++);
hexval[2] = 0;
sscanf(hexval, "%X", &dat);
*(ptrparam + j) = dat;
}
}
}
param++;
}
if (dat != '\\')
*ptrframe = dat;
else
{
hexval[0] = *(ptrresp ++);
hexval[1] = *(ptrresp ++);
hexval[2] = 0;
sscanf(hexval, "%X", &dat);
*ptrframe = dat;
}
ptrframe ++;
j ++;
}
}
/* xito. */
return 1;
}
#if !defined(__MODSP_H__)
#define __MODSP_H__
FernandoArielBeunza79156 399
Tesis de Grado en Ingeniera Informtica
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modsp_grpid;
/*
Funcin modsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modsp_hd *modsp_init(int, int);
/*
Funcin modsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modsp_release(modsp_hd *);
/*
Funcin modsp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modsp_publish(modsp_hd *, modsp_grpid);
/*
Funcin modsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int modsp_subscribe(modsp_hd *, modsp_grpid);
/*
Funcin modsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modsp_leave(modsp_hd *, modsp_grpid);
/*
Funcin modsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modsp_send(modsp_hd *, modsp_grpid, unsigned char, const void *,
size_t);
/*
Funcin modsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
400 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modsp_notify(modsp_hd *, void (*func)(modsp_hd *, modsp_grpid, void *,
size_t, void *), void *);
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modsp_poll(modsp_hd *);
/*
Funcin modsp_status:
Devuelve el estado del modem PLC.
*/
int modsp_status(modsp_hd *);
/*
Funcin modsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
size_t modsp_getpayloadsize(modsp_hd *);
#endif
/*
Funcin modsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modsp_hd *modsp_init(int sid, int debugmode)
{
/* Variables. */
modsp_hd *handle; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
FernandoArielBeunza79156 401
Tesis de Grado en Ingeniera Informtica
/* Inicializa semforo. */
handle->mutexsem = CreateSemaphore(NULL, 1, 1, NULL);
if (handle->mutexsem == INVALID_HANDLE_VALUE) break;
/*
Funcin modsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modsp_release(modsp_hd *hd)
{
/* Verifica que el manejador de interfaz con la capa de sesin del modem
PLC exista. */
if (!hd) return 0;
/* Libera los recursos utilizados por la interfaz con la capa de sesin del
modem PLC. */
CloseHandle(hd->mutexsem);
free(hd);
/* xito. */
return 1;
}
/*
Funcin modsp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int modsp_publish(modsp_hd *hd, modsp_grpid grpid)
{
/* Variables. */
int result; /* Resultado de la operacin. */
402 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (!hd) return 0;
/*
Funcin modsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int modsp_subscribe(modsp_hd *hd, modsp_grpid grpid)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modsp_leave(modsp_hd *hd, modsp_grpid grpid)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/* Desvincula el dispositivo. */
result = modplc_spleave(hd->modplchd, grpid);
/*
Funcin modsp_send:
FernandoArielBeunza79156 403
Tesis de Grado en Ingeniera Informtica
/* Enva un mensaje. */
msgsize = modplc_spsend(hd->modplchd, grpid, nosec, msg, msgsize);
/*
Funcin modsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modsp_receive(modsp_hd *hd, modsp_grpid *grpid, void *msg,
size_t msgsize)
{
/* Verifica que el manejador de interfaz con la capa de sesin del modem
PLC exista. */
if (!hd) return 0;
/* Recibe un mensaje. */
msgsize = modplc_spreceive(hd->modplchd, grpid, msg, msgsize);
/*
Funcin modsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modsp_notify(modsp_hd *hd, void (*func)(modsp_hd *, modsp_grpid, void *,
size_t, void *), void *param)
{
/* Variables. */
DWORD tid; /* Identificador de hilo. */
404 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
WaitForSingleObject(hd->mutexsem, INFINITE);
hd->recfun = func;
hd->param = param;
ReleaseSemaphore(hd->mutexsem, 1, NULL);
return 1;
}
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modsp_poll(modsp_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 405
Tesis de Grado en Ingeniera Informtica
/*
Funcin modsp_status:
Devuelve el estado del modem PLC.
*/
int modsp_status(modsp_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de sesin del modem PLC.
*/
size_t modsp_getpayloadsize(modsp_hd *hd)
{
/* Variables. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
/*
Funcin __modsp_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser ledo.
*/
static DWORD WINAPI __modsp_detectproc__(LPVOID param)
{
/* Variables. */
int recvflag; /* Indicador de recepcin de un
mensaje. */
size_t msgsize; /* Tamao del mensaje recibido. */
modsp_grpid grpid; /* Identificador de grupo. */
406 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__MODDL_H__)
#define __MODDL_H__
FernandoArielBeunza79156 407
Tesis de Grado en Ingeniera Informtica
/* Definicin de tipos. */
/*
Funcin moddl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
moddl_hd *moddl_init(int, int);
/*
Funcin moddl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int moddl_release(moddl_hd *);
/*
Funcin moddl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
moddlconn_hd *moddl_open(moddl_hd *, unsigned char, unsigned char);
/*
Funcin moddl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int moddl_close(moddlconn_hd *);
/*
Funcin moddl_send:
408 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t moddl_receive(moddlconn_hd *, moddl_phyaddr, void *, size_t);
/*
Funcin moddl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int moddl_notify(moddlconn_hd *, void (*func)(moddlconn_hd *, moddl_phyaddr,
void *, size_t, void *), void *);
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int moddl_poll(moddlconn_hd *);
/*
Funcin moddl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int moddl_getaddress(moddl_hd *, unsigned char, moddl_phyaddr);
/*
Funcin moddl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlade del modem PLC.
*/
int moddl_addlogaddress(moddl_hd *, unsigned char, unsigned char,
moddl_logaddr);
/*
Funcin moddl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int moddl_dellogaddress(moddl_hd *, unsigned char, unsigned char,
moddl_logaddr);
/*
Funcin moddl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa de
enlace del modem PLC.
*/
int moddl_getphyaddress(moddl_hd *, unsigned char, unsigned char,
moddl_logaddr, moddl_phyaddr);
/*
Funcin moddl_status:
Devuelve el estado del modem PLC.
*/
int moddl_status(moddl_hd *);
/*
Funcin moddl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de enlace del modem PLC.
*/
size_t moddl_getpayloadsize(moddl_hd *, unsigned char);
#endif
FernandoArielBeunza79156 409
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
moddl_hd *moddl_init(int sid, int debugmode)
{
/* Variables. */
moddl_hd *handle; /* Manejador de interfaz con la
capa de enlace del modem PLC. */
/* Inicializa semforo. */
handle->mutexsem = CreateSemaphore(NULL, 1, 1, NULL);
if (handle->mutexsem == INVALID_HANDLE_VALUE) break;
/*
Funcin moddl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int moddl_release(moddl_hd *hd)
410 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
/* Verifica que el manejador de interfaz con la capa de enlace del modem
PLC exista. */
if (!hd) return 0;
/* Libera los recursos utilizados por la interfaz con la capa de enlace del
modem PLC. */
CloseHandle(hd->mutexsem);
free(hd);
/* xito. */
return 1;
}
/*
Funcin moddl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
moddlconn_hd *moddl_open(moddl_hd *hd, unsigned char iface, unsigned char prot)
{
/* Variables. */
moddlconn_hd *handle; /* Manejador de conexin de la capa
de enlace del modem PLC. */
FernandoArielBeunza79156 411
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int moddl_close(moddlconn_hd *hd)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin moddl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t moddl_send(moddlconn_hd *hd, moddl_phyaddr addr, unsigned char prio,
const void *msg, size_t msgsize)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
/* Enva un mensaje. */
msgsize = modplc_dlsend(hd->moddlhd->modplchd, hd->handle, addr, prio, msg,
msgsize);
/*
Funcin moddl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
412 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
*/
size_t moddl_receive(moddlconn_hd *hd, moddl_phyaddr addr, void *msg,
size_t msgsize)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
/* Recibe un mensaje. */
msgsize = modplc_dlreceive(hd->moddlhd->modplchd, hd->handle, addr, msg,
msgsize);
/*
Funcin moddl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int moddl_notify(moddlconn_hd *hd, void (*func)(moddlconn_hd *, moddl_phyaddr,
void *, size_t, void *), void *param)
{
/* Variables. */
DWORD tid; /* Identificador de hilo. */
FernandoArielBeunza79156 413
Tesis de Grado en Ingeniera Informtica
WaitForSingleObject(hd->moddlhd->mutexsem, INFINITE);
hd->recfun = func;
hd->param = param;
hd->detectthread = CreateThread(NULL, 0, __moddl_detectproc__, hd, 0,
&tid);
if (hd->detectthread == INVALID_HANDLE_VALUE)
{
hd->recfun = NULL;
hd->param = NULL;
ReleaseSemaphore(hd->moddlhd->mutexsem, 1, NULL);
return 0;
}
ReleaseSemaphore(hd->moddlhd->mutexsem, 1, NULL);
return 1;
}
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int moddl_poll(moddlconn_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int moddl_getaddress(moddl_hd *hd, unsigned char iface, moddl_phyaddr addr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
414 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int moddl_addlogaddress(moddl_hd *hd, unsigned char iface, unsigned char prot,
moddl_logaddr addr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int moddl_dellogaddress(moddl_hd *hd, unsigned char iface, unsigned char prot,
moddl_logaddr addr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa de
enlace del modem PLC.
*/
int moddl_getphyaddress(moddl_hd *hd, unsigned char iface, unsigned char prot,
moddl_logaddr laddr, moddl_phyaddr paddr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 415
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_status:
Devuelve el estado del modem PLC.
*/
int moddl_status(moddl_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de la
capa de enlace del modem PLC.
*/
size_t moddl_getpayloadsize(moddl_hd *hd, unsigned char iface)
{
/* Variables. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
416 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return payloadsize;
}
/*
Funcin __moddl_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser ledo.
*/
static DWORD WINAPI __moddl_detectproc__(LPVOID param)
{
/* Variables. */
int recvflag; /* Indicador de recepcin de un
mensaje. */
size_t msgsize; /* Tamao del mensaje recibido. */
moddl_phyaddr addr; /* Direccin fsica de origen del
mensaje. */
moddlconn_hd *hd; /* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
void (*func)
(void *, moddl_phyaddr, void *,
size_t, void *); /* Manejador de mensajes
recibidos. */
char *msg; /* Puntero al mensaje recibido. */
FernandoArielBeunza79156 417
Tesis de Grado en Ingeniera Informtica
#if !defined(__MODPHY_H__)
#define __MODPHY_H__
/* Definicin de tipos. */
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPHY_NOISESIGNAL 0x01
#define MODPHY_TESTSIGNAL1 0x02
#define MODPHY_TESTSIGNAL2 0x03
/*
Funcin modphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
modphy_hd *modphy_init(int, int);
/*
Funcin modphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modphy_release(modphy_hd *);
/*
Funcin modphy_sndframe:
Enva una trama.
*/
size_t modphy_sndframe(modphy_hd *, unsigned char, const void *, size_t);
418 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_capframe:
Captura una trama.
*/
int modphy_capframe(modphy_hd *, unsigned char, size_t);
/*
Funcin modphy_getframe:
Obtiene una trama capturada previamente.
*/
size_t modphy_getframe(modphy_hd *, unsigned char, void *, size_t);
/*
Funcin modphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
int modphy_notify(modphy_hd *, unsigned char,
void (*func)(modphy_hd *, void *), void *);
/*
Funcin modphy_poll:
Verifica la captura de una trama.
*/
int modphy_poll(modphy_hd *, unsigned char);
/*
Funcin modphy_rsdframe:
Reenva una trama.
*/
int modphy_rsdframe(modphy_hd *, unsigned char);
/*
Funcin modphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modphy_clrbuffer(modphy_hd *, unsigned char);
/*
Funcin modphy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int modphy_sensechannel(modphy_hd *, unsigned char, unsigned char, long int);
/*
Funcin modphy_gensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modphy_gensignal(modphy_hd *, unsigned char, int);
/*
Funcin modphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modphy_tstreceive(modphy_hd *, unsigned char);
/*
Funcin modphy_status:
Devuelve el estado del modem PLC.
*/
int modphy_status(modphy_hd *);
/*
Funcin modphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modphy_getpayloadsize(modphy_hd *, unsigned char);
#endif
FernandoArielBeunza79156 419
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
modphy_hd *modphy_init(int sid, int debugmode)
{
/* Variables. */
short int iface; /* Identificadores de interfaces
fsicas. */
modphy_hd *handle; /* 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 semforo. */
handle->mutexsem = CreateSemaphore(NULL, 1, 1, NULL);
if (handle->mutexsem == INVALID_HANDLE_VALUE) break;
/*
420 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin modphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modphy_release(modphy_hd *hd)
{
/* Variables. */
short int iface; /* Identificadores de interfaces
fsicas. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/* 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;
/*
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;
FernandoArielBeunza79156 421
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_getframe:
Obtiene una trama capturada previamente.
*/
size_t modphy_getframe(modphy_hd *hd, unsigned char iface, void *frame,
size_t framesize)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/*
Funcin modphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
int modphy_notify(modphy_hd *hd, unsigned char iface,
void (*func)(modphy_hd *, void *), void *param)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
422 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_poll:
Verifica la captura de una trama.
*/
int modphy_poll(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;
/*
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;
FernandoArielBeunza79156 423
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modphy_clrbuffer(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;
/*
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;
/*
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
Tesis de Grado en Ingeniera Informtica
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/*
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;
/*
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;
FernandoArielBeunza79156 425
Tesis de Grado en Ingeniera Informtica
return result;
}
/*
Funcin modphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modphy_getpayloadsize(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener una trama. */
/* Verifica que el manejador de interfaz con la capa fsica del modem PLC
exista. */
if (!hd) return 0;
/*
Funcin __modphy_detectproc__:
Verifica la existencia de una trama capturada disponible para ser leda.
*/
static DWORD WINAPI __modphy_detectproc__(LPVOID param)
{
/* Variables. */
int captureflag; /* Indicador de captura de una
trama. */
short int i; /* Contador. */
unsigned char iface; /* Identificadores de interfaces
fsicas. */
modphy_hd *hd; /* Manejador de interfaz con la
capa fsica del modem PLC. */
void (*func)(void *, void *); /* Manejador de captura de
tramas. */
426 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
/* Espera el permiso para poder acceder a la interfaz con el modem
PLC. */
WaitForSingleObject(hd->mutexsem, INFINITE);
#if !defined(__MODDRV_H__)
#define __MODDRV_H__
/* Definicin de tipos. */
/*
Funcin moddrv_init:
FernandoArielBeunza79156 427
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddrv_release:
Libera los recursos utilizados por el driver del modem PLC.
*/
int moddrv_release(moddrv_hd *);
/*
Funcin moddrv_run:
Ejecuta el driver del modem PLC.
*/
int moddrv_run(moddrv_hd *);
/*
Funcin moddrv_stop:
Detiene la ejecucin del driver del modem PLC.
*/
int moddrv_stop(moddrv_hd *);
#endif
/* Definicin de tipos. */
/*
428 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin moddrv_init:
Inicializa los recursos utilizados por el driver del modem PLC.
*/
moddrv_hd *moddrv_init(int sid, int debugmode)
{
/* Variables. */
moddrv_hd *handle; /* Manejador del driver del modem
PLC. */
/*
Funcin moddrv_release:
Libera los recursos utilizados por el driver del modem PLC.
*/
int moddrv_release(moddrv_hd *hd)
{
/* Verifica que el manejador del driver del modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin moddrv_run:
Ejecuta el driver del modem PLC.
*/
int moddrv_run(moddrv_hd *hd)
{
/* Variables. */
DWORD tid; /* Identificador de hilo. */
HANDLE hq; /* Manejador de cola de
mensajes. */
HANDLE hm; /* Manejador de semforo de
exclusin mutua. */
HANDLE cthread; /* Manejador de hilo. */
char qname[256]; /* Nombre de la cola de
mensajes. */
__moddrv_shareinf__ sinf; /* Informacin compartida. */
/* Inicializa semforo. */
hm = CreateSemaphore(NULL, 1, 1, NULL);
if (hm == INVALID_HANDLE_VALUE) return 0;
FernandoArielBeunza79156 429
Tesis de Grado en Ingeniera Informtica
{
/* Crea una nueva cola de mensajes. */
hq = CreateNamedPipe(qname, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE |
PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 0, 0,
0, 0);
if (hq == INVALID_HANDLE_VALUE) break;
/*
Funcin moddrv_stop:
Detiene la ejecucin del driver del modem PLC.
*/
int moddrv_stop(moddrv_hd *hd)
{
/* Variables. */
HANDLE hq; /* Manejador de cola de
mensajes. */
int layer; /* Capa que se solicita
utilizar. */
int result; /* Respuesta a la solicitud. */
char qname[256]; /* Nombre de la cola de
mensajes. */
/* Abre una conexin con la cola de mensajes del driver del modem PLC. */
sprintf(qname, "\\\\.\\pipe\\modemplc%i", hd->port);
hq = CreateFile(qname, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hq == INVALID_HANDLE_VALUE) return 0;
/* Abre una conexin con la cola de mensajes del driver del modem PLC. */
sprintf(qname, "\\\\.\\pipe\\modemplc%i", hd->port);
430 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Cierra la conexin con al cola de mensajes del driver del modem PLC. */
CloseHandle(hq);
return 1;
}
/*
Funcin __moddrv_clientthread__:
Atiene a los clientes del driver del modem PLC.
*/
static DWORD WINAPI __moddrv_clientthread__(LPVOID param)
{
/* Variables. */
HANDLE hq; /* Manejador de cola de
mensajes. */
HANDLE hm; /* Manejador de semforo de
exclusin mutua. */
int layer; /* Capa que se solicita
utilizar. */
int result; /* Respuesta a la solicitud. */
moddrv_hd *hd; /* Manejador del driver del modem
PLC. */
__moddrv_shareinf__ *sinf; /* Informacin compartida. */
/* Espera el permiso para poder acceder a los recursos del driver del modem
PLC. */
WaitForSingleObject(hm, INFINITE);
FernandoArielBeunza79156 431
Tesis de Grado en Ingeniera Informtica
if (!hd->phyhd) result = 0;
}
/* Inicializa la interfaz de la capa de enlace del modem PLC. */
else if (layer == 2)
{
hd->dlhd = moddl_init(hd->port, hd->debugmode);
if (!hd->dlhd) result = 0;
}
/* Inicializa la interfaz de la capa de sesin del modem PLC. */
else if (layer == 3)
{
hd->sphd = modsp_init(hd->port, hd->debugmode);
if (!hd->sphd) result = 0;
}
}
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
ReleaseSemaphore(hm, 1, NULL);
/* Espera el permiso para poder acceder a los recursos del driver del modem
PLC. */
WaitForSingleObject(hm, INFINITE);
/* Elimina un cliente. */
hd->clients --;
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
ReleaseSemaphore(hm, 1, NULL);
432 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __moddrv_phyclient__:
Procesa las solicitudes de los clientes destinadas a la capa fsica del
modem PLC.
*/
static int __moddrv_phyclient__(moddrv_hd *hd, HANDLE hq, HANDLE hm)
{
/* Variables. */
int op; /* Cdigo de operacin. */
int sig; /* Tipo de seal. */
int result; /* Respuesta a la solicitud. */
size_t size; /* Cantidad de bytes. */
unsigned char iface; /* Identificador de interfaz
fsica. */
unsigned char level; /* Nivel de seal. */
long int waittime; /* Tiempo de espera. */
unsigned char *frame; /* Puntero a la trama recibida. */
/* Espera el permiso para poder acceder a los recursos del driver del
modem PLC. */
WaitForSingleObject(hm, INFINITE);
/* Recibe la trama. */
frame = (unsigned char *) malloc(size * sizeof(unsigned char));
if (!frame) continue;
if (!__moddrv_receive__(hq, frame, size))
{
free(frame);
continue;
}
/* Enva la trama. */
size = modphy_sndframe(hd->phyhd, iface, frame, size);
free(frame);
FernandoArielBeunza79156 433
Tesis de Grado en Ingeniera Informtica
434 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
}
/* Solicita el sensado del canal de comunicacin. */
else if (op == MODDRVPHY_SENSECHANNEL)
{
/* Recibe el identificador de interfaz fsica. */
if (!__moddrv_receive__(hq, &iface, sizeof(iface))) continue;
FernandoArielBeunza79156 435
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
ReleaseSemaphore(hm, 1, NULL);
}
ReleaseSemaphore(hm, 1, NULL);
return 0;
}
/*
Funcin __moddrv_dlclient__:
Procesa las solicitudes de los clientes destinadas a la capa de enlace del
modem PLC.
*/
static int __moddrv_dlclient__(moddrv_hd *hd, HANDLE hq, HANDLE hm)
{
/* Variables. */
int op; /* Cdigo de operacin. */
int result; /* Respuesta a la solicitud. */
unsigned char prot; /* Identificador de protocolo. */
unsigned char prio; /* Prioridad del mensaje. */
unsigned char iface; /* Identificador de interfaz
fsica. */
size_t size; /* Cantidad de bytes. */
moddlconn_hd *dlconnhd; /* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
moddl_logaddr laddr; /* Direccin lgica. */
moddl_phyaddr paddr; /* Direccin fsica. */
unsigned char *msg; /* Puntero al mensaje recibido. */
/* Espera el permiso para poder acceder a los recursos del driver del
modem PLC. */
WaitForSingleObject(hm, INFINITE);
/* Abre la conexin. */
dlconnhd = moddl_open(hd->dlhd, iface, prot);
if (dlconnhd) result = 1;
}
436 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
msg = (unsigned char *) malloc(size * sizeof(unsigned char));
if (!msg) continue;
if (!__moddrv_receive__(hq, msg, size))
{
free(msg);
continue;
}
/* Enva el mensaje. */
size = moddl_send(dlconnhd, paddr, prio, msg, size);
free(msg);
}
/* Recibe el mensaje. */
msg = (unsigned char *) malloc(size * sizeof(unsigned char));
if (!msg) continue;
size = moddl_receive(dlconnhd, paddr, msg, size);
}
FernandoArielBeunza79156 437
Tesis de Grado en Ingeniera Informtica
438 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
ReleaseSemaphore(hm, 1, NULL);
}
ReleaseSemaphore(hm, 1, NULL);
return 0;
}
/*
Funcin __moddrv_spclient__:
Procesa las solicitudes de los clientes destinadas a la capa de sesin del
modem PLC.
*/
static int __moddrv_spclient__(moddrv_hd *hd, HANDLE hq, HANDLE hm)
{
/* Variables. */
int op; /* Cdigo de operacin. */
FernandoArielBeunza79156 439
Tesis de Grado en Ingeniera Informtica
/* Espera el permiso para poder acceder a los recursos del driver del
modem PLC. */
WaitForSingleObject(hm, INFINITE);
440 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Enva el mensaje. */
size = modsp_send(hd->sphd, grpid, nosec, msg, size);
break;
}
/* Recibe el mensaje. */
msg = (unsigned char *) malloc(size * sizeof(unsigned char));
if (msg)
size = modsp_receive(hd->sphd, &grpid, msg, size);
else
size = 0;
FernandoArielBeunza79156 441
Tesis de Grado en Ingeniera Informtica
{
/* Verifica el estado del modem PLC. */
result = modsp_status(hd->sphd);
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
ReleaseSemaphore(hm, 1, NULL);
}
ReleaseSemaphore(hm, 1, NULL);
return 0;
}
/*
Funcin __moddrv_send__:
Enva datos por medio de la cola de mensajes.
*/
static int __moddrv_send__(HANDLE hq, const void *stream, size_t size)
{
/* Variables. */
size_t sent; /* Cantidad de bytes enviados. */
size_t lastsent; /* Cantidad de bytes enviados en el
ltimo envo. */
/*
Funcin __moddrv_receive__:
Enva datos por medio de la cola de mensajes.
*/
static int __moddrv_receive__(HANDLE hq, void *stream, size_t size)
{
/* Variables. */
size_t received; /* Cantidad de bytes recibidos. */
size_t lastreceive; /* Cantidad de bytes recibidos en
la ltima recepcin. */
442 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port; /* Puerto serie utilizado. */
int debug; /* Modo depuracin. */
moddrv_hd *hd; /* Manejador del driver del modem
PLC. */
char *option; /* Opcin especificada. */
/* Desactiva el driver. */
else if (!strcmp(option, "stop"))
moddrv_stop(hd);
break;
}
FernandoArielBeunza79156 443
Tesis de Grado en Ingeniera Informtica
444 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#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;
FernandoArielBeunza79156 445
Tesis de Grado en Ingeniera Informtica
recibidos. */
} modplcsp_hd;
/*
Funcin modplcsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modplcsp_hd *modplcsp_init(int);
/*
Funcin modplcsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modplcsp_release(modplcsp_hd *);
/*
Funcin modplcsp_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modplcsp_publish(modplcsp_hd *, modplcsp_grpid);
/*
Funcin modplcsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modplcsp_subscribe(modplcsp_hd *, modplcsp_grpid);
/*
Funcin modplcsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcsp_leave(modplcsp_hd *, modplcsp_grpid);
/*
Funcin modplcsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_send(modplcsp_hd *, modplcsp_grpid, unsigned char,
const void *, size_t);
/*
Funcin modplcsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_receive(modplcsp_hd *, modplcsp_grpid *, void *, size_t);
/*
Funcin modplcsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcsp_notify(modplcsp_hd *, void (*func)(modplcsp_hd *, modplcsp_grpid,
void *, size_t, void *), void *);
/*
Funcin modplcsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcsp_poll(modplcsp_hd *);
/*
Funcin modplcsp_status:
Devuelve el estado del modem PLC.
*/
int modplcsp_status(modplcsp_hd *);
/*
446 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin modplcsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de sesin del modem PLC.
*/
size_t modplcsp_getpayloadsize(modplcsp_hd *);
#endif
/*
Funcin modplcsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modplcsp_hd *modplcsp_init(int sid)
{
/* Variables. */
int op; /* Identificador de operacion. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
modplcsp_hd *handle; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
struct sockaddr_un servaddr; /* Direccin del servidor. */
FernandoArielBeunza79156 447
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modplcsp_release(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
448 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (pthread_mutex_destroy(&(hd->hm))) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcsp_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modplcsp_publish(modplcsp_hd *hd, modplcsp_grpid grpid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
Funcin modplcsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modplcsp_subscribe(modplcsp_hd *hd, modplcsp_grpid grpid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 449
Tesis de Grado en Ingeniera Informtica
PLC. */
if (pthread_mutex_lock(&(hd->hm))) return 0;
/*
Funcin modplcsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcsp_leave(modplcsp_hd *hd, modplcsp_grpid grpid)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
Funcin modplcsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
450 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
*/
size_t modplcsp_send(modplcsp_hd *hd, modplcsp_grpid grpid,
unsigned char nosec, const void *msg, size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
/* Enva un mensaje. */
while(1)
{
/* Solicita el envo de un mensaje. */
op = MODDRVSP_SEND;
if (!__modplcsp_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op)))
break;
/* Enva el mensaje. */
if (!__modplcsp_sendrecv__(hd->hq, &msgsize, sizeof(msgsize),
msg, msgsize))
break;
/*
Funcin modplcsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplcsp_receive(modplcsp_hd *hd, modplcsp_grpid *grpid, void *msg,
size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
FernandoArielBeunza79156 451
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
if (!__modplcsp_sendrecv__(hd->hq, msg, msgsize, NULL, 0))
break;
/*
Funcin modplcsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcsp_notify(modplcsp_hd *hd, void (*func)(modplcsp_hd *,
modplcsp_grpid, void *, size_t, void *), void *param)
{
/* Verifica que el manejador de interfaz con la capa de sesin del
modem PLC exista. */
if (!hd) return 0;
452 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
hd->param = param;
if (pthread_mutex_unlock(&(hd->hm))) return 0;
return 1;
}
if (pthread_mutex_lock(&(hd->hm))) return 0;
hd->recfun = (void (*)(void *, modplcsp_grpid, void *, size_t,
void *)) func;
hd->param = param;
if (pthread_create(&(hd->detectthread), NULL,
__modplcsp_detectproc__, hd))
{
hd->recfun = NULL;
hd->param = NULL;
pthread_mutex_unlock(&(hd->hm));
return 0;
}
if (pthread_mutex_unlock(&(hd->hm))) return 0;
return 1;
}
/*
Funcin modplcsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcsp_poll(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 453
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcsp_status:
Devuelve el estado del modem PLC.
*/
int modplcsp_status(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
Funcin modplcsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de sesin del modem PLC.
*/
size_t modplcsp_getpayloadsize(modplcsp_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
size_t payloadsize; /* Cantidad de bytes que puede
contener un mensaje. */
454 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcsp_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser
ledo.
*/
static void *__modplcsp_detectproc__(void *param)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
int captureflag; /* Indicador de recepcin de un
mensaje. */
size_t msgsize; /* Tamao del mensaje. */
modplcsp_grpid grpid; /* Identificador de grupo. */
modplcsp_hd *hd; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
void (*func)(void *,
modplcsp_grpid, void *,
size_t, void *); /* Funcin manejadora de mensajes
recibidos. */
unsigned char *msg; /* Puntero al mensaje. */
/* Recibe el mensaje. */
while(captureflag)
{
/* Solicita la recepcin de un mensaje. */
op = MODDRVSP_RECEIVE;
if (!__modplcsp_sendrecv__(hd->hq, NULL, 0, &op,
sizeof(op)))
break;
/* Recibe el mensaje. */
msg = (unsigned char *)
malloc(msgsize * sizeof(unsigned char));
FernandoArielBeunza79156 455
Tesis de Grado en Ingeniera Informtica
if (!msg)
{
captureflag = 0;
break;
}
__modplcsp_sendrecv__(hd->hq, msg, msgsize, NULL, 0);
break;
}
/*
Funcin __modplcsp_sendrecv__:
Intercambia datos con el driver del modem PLC.
*/
static int __modplcsp_sendrecv__(int hq, void *outdata, size_t outsize,
const void *indata, size_t insize)
{
/* Variables. */
size_t last; /* Cantidad de bytes enviados o
recibidos. */
size_t sent; /* Cantidad de bytes enviados. */
size_t received; /* Cantidad de bytes recibidos. */
/* 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
Tesis de Grado en Ingeniera Informtica
*/
#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;
/* Definicin de constantes. */
/* Tipo de mensaje. */
#define MODPLCPP_SECMSG 0x00
#define MODPLCPP_NOSECMSG 0x01
/* Tipos de datos. */
#define MODPLCPP_NULLTYPE 0x00
#define MODPLCPP_CHARTYPE 0x01
#define MODPLCPP_SINT8TYPE 0x02
#define MODPLCPP_UINT8TYPE 0x03
#define MODPLCPP_SINT16TYPE 0x04
#define MODPLCPP_UINT16TYPE 0x05
FernandoArielBeunza79156 457
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
modplcpp_hd *modplcpp_init(int);
/*
Funcin modplcpp_release:
Libera los recursos utilizados por la capa de presentacin del modem
PLC.
*/
int modplcpp_release(modplcpp_hd *);
/*
Funcin modplcpp_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modplcpp_publish(modplcpp_hd *, modplcpp_grpid);
/*
Funcin modplcpp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modplcpp_subscribe(modplcpp_hd *, modplcpp_grpid);
/*
Funcin modplcpp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcpp_leave(modplcpp_hd *, modplcpp_grpid);
/*
Funcin modplcpp_newmsg:
Crea un nuevo mensaje.
*/
int modplcpp_newmsg(modplcpp_hd *, modplcpp_msg *, modplcpp_grpid,
modplcpp_mtype);
/*
Funcin modplcpp_copymsg:
Crea un copia de un mensaje.
*/
int modplcpp_copymsg(modplcpp_msg *, modplcpp_msg *);
/*
Funcin modplcpp_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcpp_putfield(modplcpp_msg *, modplcpp_ftype, unsigned char,
const void *);
/*
Funcin modplcpp_sendmsg:
Enva un mensaje por medio de la capa de presentacin.
*/
int modplcpp_sendmsg(modplcpp_msg *);
/*
Funcin modplcpp_receivemsg:
Recibe un mensaje por medio de la capa de presentacin.
*/
458 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_getfield:
Extrae un campo del mensaje.
*/
int modplcpp_getfield(modplcpp_msg *, modplcpp_ftype *, unsigned char *,
void *);
/*
Funcin modplcpp_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcpp_grpid modplcpp_getgrpid(modplcpp_msg *);
/*
Funcin modplcpp_destroymsg:
Destruye un mensaje.
*/
int modplcpp_destroymsg(modplcpp_msg *);
/*
Funcin modplcpp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcpp_notify(modplcpp_hd *, void (*func)(modplcpp_hd *, modplcpp_msg *,
void *), void *);
/*
Funcin modplcpp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcpp_poll(modplcpp_hd *);
/*
Funcin modplcpp_status:
Devuelve el estado del modem PLC.
*/
int modplcpp_status(modplcpp_hd *);
#endif
/*
FernandoArielBeunza79156 459
Tesis de Grado en Ingeniera Informtica
Funcin modplcpp_init:
Inicializa los recursos utilizado por la capa de presentacin del modem
PLC.
*/
modplcpp_hd *modplcpp_init(int sid)
{
/* Variables. */
modplcpp_hd *handle; /* Manejador de capa de
presentacin. */
/*
Funcin modplcpp_release:
Libera los recursos utilizados por la capa de presentacin del modem
PLC.
*/
int modplcpp_release(modplcpp_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
460 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modplcpp_publish(modplcpp_hd *hd, modplcpp_grpid grpid)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modplcpp_subscribe(modplcpp_hd *hd, modplcpp_grpid grpid)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcpp_leave(modplcpp_hd *hd, modplcpp_grpid grpid)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_newmsg:
Crea un nuevo mensaje.
*/
int modplcpp_newmsg(modplcpp_hd *hd, modplcpp_msg *msg, modplcpp_grpid grpid,
modplcpp_mtype mtype)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* Inicializa el mensaje. */
msg->startoffset = 0;
msg->endoffset = 0;
msg->grpid = grpid;
msg->mtype = mtype;
msg->pphd = hd;
return 1;
}
/*
FernandoArielBeunza79156 461
Tesis de Grado en Ingeniera Informtica
Funcin modplcpp_copymsg:
Crea un copia de un mensaje.
*/
int modplcpp_copymsg(modplcpp_msg *dest, modplcpp_msg *src)
{
/* Verifica que el puntero al mensaje original no sea nulo. */
if (!src) return 0;
/*
Funcin modplcpp_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcpp_putfield(modplcpp_msg *msg, modplcpp_ftype type,
unsigned char count, const void *dat)
{
/* Variables. */
unsigned char *ptr; /* Puntero a los datos. */
size_t msgsize; /* Tamao del mensaje. */
462 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* xito. */
return 1;
}
/*
Funcin modplcpp_sendmsg:
Enva un mensaje por medio de la capa de presentacin.
*/
int modplcpp_sendmsg(modplcpp_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
FernandoArielBeunza79156 463
Tesis de Grado en Ingeniera Informtica
/* Enva un mensaje. */
if (modplcsp_send(((modplcpp_hd *) (msg->pphd))->modsphd, msg->grpid,
msg->mtype, msg->dat, msg->endoffset) == msg->endoffset)
return 1;
return 0;
}
/*
Funcin modplcpp_receivemsg:
Recibe un mensaje por medio de la capa de presentacin.
*/
int modplcpp_receivemsg(modplcpp_hd *hd, modplcpp_msg *msg)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcpp_getfield:
Extrae un campo del mensaje.
*/
int modplcpp_getfield(modplcpp_msg *msg, modplcpp_ftype *type,
unsigned char *count, void *dat)
{
/* Variables. */
unsigned char c; /* Contador. */
unsigned char *ptr; /* Puntero a los datos. */
464 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcpp_grpid modplcpp_getgrpid(modplcpp_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
FernandoArielBeunza79156 465
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcpp_destroymsg:
Destruye un mensaje.
*/
int modplcpp_destroymsg(modplcpp_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcpp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcpp_notify(modplcpp_hd *hd, void (*func)(modplcpp_hd *,
modplcpp_msg *, void *), void *param)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcpp_poll(modplcpp_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin modplcpp_status:
Devuelve el estado del modem PLC.
*/
int modplcpp_status(modplcpp_hd *hd)
{
/* Verifica que el manejador de la capa de presentacin exista. */
if (!hd) return 0;
/*
Funcin __modplcpp_procmsg__:
Procesa un mensaje recibido por medio de la capa de sesin.
*/
static void __modplcpp_procmsg__(modplcsp_hd *hd, modplcsp_grpid grpid,
void *msg, size_t msgsize, void *param)
{
/* Variables. */
modplcpp_hd *pphd; /* Manejador de capa de
466 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
presentacin. */
#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;
FernandoArielBeunza79156 467
Tesis de Grado en Ingeniera Informtica
presentacin. */
void (*recfun)
(void *, modplcap_msg *,
void *); /* Funcin manejadora de mensajes
recibidos. */
void *param; /* Parmetros para la funcin
manejadora de mensajes
recibidos. */
modplcap_msg buffer; /* Puntero al buffer de campos
recibidos. */
} modplcap_hd;
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCAP_NULLTYPE 0x00
#define MODPLCAP_CHARTYPE 0x01
#define MODPLCAP_SINT8TYPE 0x02
#define MODPLCAP_UINT8TYPE 0x03
#define MODPLCAP_SINT16TYPE 0x04
#define MODPLCAP_UINT16TYPE 0x05
#define MODPLCAP_SINT32TYPE 0x06
#define MODPLCAP_UINT32TYPE 0x07
#define MODPLCAP_FLOATTYPE 0x08
/*
Funcin modplcap_init:
Inicializa los recursos utilizados por la capa de aplicacin del modem
PLC.
*/
modplcap_hd *modplcap_init(int);
/*
Funcin modplcap_release:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
int modplcap_release(modplcap_hd *);
/*
Funcin modplcap_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modplcap_publish(modplcap_hd *, modplcap_grpid);
/*
Funcin modplcap_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modplcap_subscribe(modplcap_hd *, modplcap_grpid);
/*
Funcin modplcap_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcap_leave(modplcap_hd *, modplcap_grpid);
/*
Funcin modplcap_newmsg:
Crea un nuevo mensaje.
*/
int modplcap_newmsg(modplcap_hd *, modplcap_msg *, modplcap_grpid,
modplcap_msgid);
/*
Funcin modplcap_copymsg:
468 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcap_putfield(modplcap_msg *, modplcap_ftype, unsigned char,
const void *);
/*
Funcin modplcap_sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
int modplcap_sendmsg(modplcap_msg *);
/*
Funcin modplcap_receivemsg:
Recibe un mensaje por medio de la capa de aplicacin.
*/
int modplcap_receivemsg(modplcap_hd *, modplcap_msg *);
/*
Funcin modplcap_getfield:
Extrae un campo del mensaje.
*/
int modplcap_getfield(modplcap_msg *, modplcap_ftype *, unsigned char *,
void *);
/*
Funcin modplcap_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcap_grpid modplcap_getgrpid(modplcap_msg *);
/*
Funcin modplcap_getmsgid:
Devuelve el identificador de mensaje.
*/
modplcap_msgid modplcap_getmsgid(modplcap_msg *);
/*
Funcin modplcap_destroymsg:
Destruye un mensaje.
*/
int modplcap_destroymsg(modplcap_msg *);
/*
Funcin modplcap_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcap_notify(modplcap_hd *, void (*func)(modplcap_hd *, modplcap_msg *,
void *), void *);
/*
Funcin modplcap_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcap_poll(modplcap_hd *);
/*
Funcin modplcap_status:
Devuelve el estado del modem PLC.
*/
int modplcap_status(modplcap_hd *);
#endif
FernandoArielBeunza79156 469
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_init:
Inicializa los recursos utilizados por la capa de aplicacin del modem
PLC.
*/
modplcap_hd *modplcap_init(int sid)
{
/* Variables. */
modplcap_hd *handle; /* Manejador de capa de
aplicacin. */
/* Inicializa el buffer. */
handle->msgflag = 0;
470 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcap_release:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
int modplcap_release(modplcap_hd *hd)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplcap_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modplcap_publish(modplcap_hd *hd, modplcap_grpid grpid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modplcap_subscribe(modplcap_hd *hd, modplcap_grpid grpid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modplcap_leave(modplcap_hd *hd, modplcap_grpid grpid)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_newmsg:
Crea un nuevo mensaje.
*/
int modplcap_newmsg(modplcap_hd *hd, modplcap_msg *msg, modplcap_grpid grpid,
modplcap_msgid msgid)
FernandoArielBeunza79156 471
Tesis de Grado en Ingeniera Informtica
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/* Inicializa el mensaje. */
msg->msgid = msgid;
msg->msg = malloc(sizeof(modplcpp_msg));
if (!msg->msg) return 0;
while(1)
{
if (msgid & 0x8000)
{
if (!modplcpp_newmsg((modplcpp_hd *) hd->pphd,
(modplcpp_msg *) (msg->msg), grpid,
MODPLCPP_NOSECMSG))
break;
}
else
{
if (!modplcpp_newmsg((modplcpp_hd *) hd->pphd,
(modplcpp_msg *) (msg->msg), grpid,
MODPLCPP_SECMSG))
break;
}
if (!modplcpp_putfield((modplcpp_msg *) (msg->msg),
MODPLCPP_UINT16TYPE, 1, &msgid))
break;
return 1;
}
free(msg->msg);
msg->msg = NULL;
return 0;
}
/*
Funcin modplcap_copymsg:
Crea un copia de un mensaje.
*/
int modplcap_copymsg(modplcap_msg *dest, modplcap_msg *src)
{
/* Verifica que el puntero al mensaje original no sea nulo. */
if (!src) return 0;
/* Copia el mensaje. */
dest->msgid = src->msgid;
return modplcpp_copymsg((modplcpp_msg *) (dest->msg),
(modplcpp_msg *) (src->msg));
}
/*
Funcin modplcap_putfield:
Agrega un nuevo campo al mensaje.
*/
int modplcap_putfield(modplcap_msg *msg, modplcap_ftype type,
unsigned char count, const void *dat)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
472 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin modplcap_sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
int modplcap_sendmsg(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Enva un mensaje. */
return modplcpp_sendmsg((modplcpp_msg *) (msg->msg));
}
/*
Funcin modplcap_receivemsg:
Recibe un mensaje por medio de la capa de aplicacin.
*/
int modplcap_receivemsg(modplcap_hd *hd, modplcap_msg *msg)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/* Recibe un mensaje. */
if (msg)
{
msg->msgid = hd->buffer.msgid;
msg->msg = malloc(sizeof(modplcpp_msg));
if (!msg->msg) return 0;
memcpy((modplcpp_msg *) (msg->msg),
(modplcpp_msg *) (hd->buffer.msg),
sizeof(modplcpp_msg));
}
modplcpp_destroymsg(hd->buffer.msg);
free(hd->buffer.msg);
hd->msgflag = 0;
return 1;
}
/*
Funcin modplcap_getfield:
Extrae un campo del mensaje.
*/
int modplcap_getfield(modplcap_msg *msg, modplcap_ftype *type,
unsigned char *count, void *dat)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcap_grpid modplcap_getgrpid(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_getmsgid:
Devuelve el identificador de mensaje.
FernandoArielBeunza79156 473
Tesis de Grado en Ingeniera Informtica
*/
modplcap_msgid modplcap_getmsgid(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/*
Funcin modplcap_destroymsg:
Destruye un mensaje.
*/
int modplcap_destroymsg(modplcap_msg *msg)
{
/* Verifica que el puntero al mensaje no sea nulo. */
if (!msg) return 0;
/* Destruye el mensaje. */
if (msg->msg) free(msg->msg);
msg->msg = NULL;
return 1;
}
/*
Funcin modplcap_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcap_notify(modplcap_hd *hd, void (*func)(modplcap_hd *,
modplcap_msg *, void *), void *param)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modplcap_poll(modplcap_hd *hd)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
Funcin modplcap_status:
Devuelve el estado del modem PLC.
*/
int modplcap_status(modplcap_hd *hd)
{
/* Verifica que el manejador de la capa de aplicacin exista. */
if (!hd) return 0;
/*
474 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin __modplcap_procmsg__:
Procesa un mensaje recibido por medio de la capa de presentacin.
*/
static void __modplcap_procmsg__(modplcpp_hd *hd, modplcpp_msg *msg,
void *param)
{
/* Variables. */
modplcpp_ftype type; /* Tipo de campo. */
modplcap_msgid msgid; /* Identificador de mensaje. */
unsigned char count; /* Contador. */
modplcap_hd *aphd; /* Manejador de capa de
aplicacin. */
/* Recibe el mensaje. */
if (!modplcpp_getfield(msg, &type, &count, &msgid)) return;
if (type != MODPLCPP_UINT16TYPE) return;
if (count != 1) return;
FernandoArielBeunza79156 475
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCDL_H__)
#define __MODPLCDL_H__
/* Definicin de tipos. */
476 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
modplcdl_hd *modplcdl_init(int);
/*
Funcin modplcdl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int modplcdl_release(modplcdl_hd *);
/*
Funcin modplcdl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
modplcdlconn_hd *modplcdl_open(modplcdl_hd *, unsigned char, unsigned char);
/*
Funcin modplcdl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplcdl_close(modplcdlconn_hd *);
/*
Funcin modplcdl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplcdl_send(modplcdlconn_hd *, modplcdl_phyaddr, unsigned char,
const void *, size_t);
/*
Funcin modplcdl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplcdl_receive(modplcdlconn_hd *, modplcdl_phyaddr, void *, size_t);
/*
Funcin modplcdl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcdl_notify(modplcdlconn_hd *, void (*func)(modplcdlconn_hd *,
modplcdl_phyaddr, void *, size_t, void *), void *);
/*
Funcin modplcdl_poll:
FernandoArielBeunza79156 477
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int modplcdl_getaddress(modplcdl_hd *, unsigned char, modplcdl_phyaddr);
/*
Funcin modplcdl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int modplcdl_addlogaddress(modplcdl_hd *, unsigned char, unsigned char,
modplcdl_logaddr);
/*
Funcin modplcdl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int modplcdl_dellogaddress(modplcdl_hd *, unsigned char, unsigned char,
modplcdl_logaddr);
/*
Funcin modplcdl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa
de enlace del modem PLC.
*/
int modplcdl_getphyaddress(modplcdl_hd *hd, unsigned char, unsigned char,
modplcdl_logaddr, modplcdl_phyaddr);
/*
Funcin modplcdl_status:
Devuelve el estado del modem PLC.
*/
int modplcdl_status(modplcdl_hd *);
/*
Funcin modplcdl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de enlace del modem PLC.
*/
size_t modplcdl_getpayloadsize(modplcdl_hd *, unsigned char);
#endif
478 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
modplcdl_hd *modplcdl_init(int sid)
{
/* Variables. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
modplcdl_hd *handle; /* Manejador de interfaz con la
capa de enlace del modem PLC. */
struct sockaddr_un servaddr; /* Direccin del servidor. */
FernandoArielBeunza79156 479
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int modplcdl_release(modplcdl_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la solicitud. */
/* xito. */
return 1;
}
/*
Funcin modplcdl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
modplcdlconn_hd *modplcdl_open(modplcdl_hd *hd, unsigned char iface,
unsigned char prot)
{
/* Variables. */
int op; /* Identificador de operacin. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
size_t payloadsize; /* Cantidad de bytes que puede
contener un mensaje. */
modplcdlconn_hd *handle; /* Manejador de conexin de la capa
de enlace del modem PLC. */
struct sockaddr_un servaddr; /* Direccin del servidor. */
480 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
pthread_mutex_unlock(&(hd->hm));
return NULL;
}
/* Abre una conexin con la cola de mensajes del driver del modem
PLC. */
handle->hq = socket(AF_LOCAL, SOCK_STREAM, 0);
if (handle->hq < 0) break;
bzero(&servaddr, sizeof(servaddr));
servaddr.sun_family = AF_LOCAL;
sprintf(servaddr.sun_path, "/tmp/modemplc%i.str", hd->sid);
if (connect(handle->hq, (struct sockaddr *) &servaddr,
sizeof(servaddr)) < 0)
break;
FernandoArielBeunza79156 481
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplcdl_close(modplcdlconn_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la solicitud. */
/* xito. */
return 1;
}
/*
Funcin modplcdl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplcdl_send(modplcdlconn_hd *hd, modplcdl_phyaddr addr,
unsigned char prio, const void *msg, size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
482 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
PLC. */
if (pthread_mutex_lock(&(hd->dlhd->hm))) return 0;
/* Enva un mensaje. */
while(1)
{
/* Solicita el envo de un mensaje. */
op = MODDRVDL_SEND;
if (!__modplcdl_sendrecv__(hd->hq, NULL, 0, &op, sizeof(op)))
break;
/* Enva el mensaje. */
if (!__modplcdl_sendrecv__(hd->hq, &msgsize, sizeof(msgsize),
msg, msgsize))
break;
/*
Funcin modplcdl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplcdl_receive(modplcdlconn_hd *hd, modplcdl_phyaddr addr, void *msg,
size_t msgsize)
{
/* Variables. */
int op; /* Identificador de operacin. */
/* Recibe un mensaje. */
while(1)
{
/* Solicita la recepcin de un mensaje. */
op = MODDRVDL_RECEIVE;
FernandoArielBeunza79156 483
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
if (!__modplcdl_sendrecv__(hd->hq, msg, msgsize, NULL, 0))
break;
/*
Funcin modplcdl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modplcdl_notify(modplcdlconn_hd *hd, void (*func)(modplcdlconn_hd *,
modplcdl_phyaddr, void *, size_t, void *), void *param)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
484 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return 1;
}
/*
Funcin modplcdl_poll:
Verifica la recepcin de un mensaje.
*/
int modplcdl_poll(modplcdlconn_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
Funcin modplcdl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int modplcdl_getaddress(modplcdl_hd *hd, unsigned char iface,
modplcdl_phyaddr addr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 485
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int modplcdl_addlogaddress(modplcdl_hd *hd, unsigned char iface,
unsigned char prot, modplcdl_logaddr addr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
486 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
break;
/*
Funcin modplcdl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int modplcdl_dellogaddress(modplcdl_hd *hd, unsigned char iface,
unsigned char prot, modplcdl_logaddr addr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 487
Tesis de Grado en Ingeniera Informtica
return result;
}
/*
Funcin modplcdl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa
de enlace del modem PLC.
*/
int modplcdl_getphyaddress(modplcdl_hd *hd, unsigned char iface,
unsigned char prot, modplcdl_logaddr laddr,
modplcdl_phyaddr paddr)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
Funcin modplcdl_status:
Devuelve el estado del modem PLC.
*/
int modplcdl_status(modplcdl_hd *hd)
{
/* Variables. */
488 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcdl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de enlace del modem PLC.
*/
size_t modplcdl_getpayloadsize(modplcdl_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Operacin. */
size_t payloadsize; /* Cantidad de bytes que puede
contener un mensaje. */
FernandoArielBeunza79156 489
Tesis de Grado en Ingeniera Informtica
mensaje. */
return payloadsize;
}
/*
Funcin __modplcdl_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser
ledo.
*/
static void *__modplcdl_detectproc__(void *param)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
int captureflag; /* Indicador de captura de un
mensaje. */
size_t msgsize; /* Tamao del mensaje. */
modplcdl_phyaddr addr; /* Direccin de origen. */
modplcdlconn_hd *hd; /* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
void (*func)
(void *, modplcdl_phyaddr,
void *, size_t, void *); /* Funcin manejadora de mensajes
recibidos. */
unsigned char *msg; /* Puntero al mensaje recibido. */
/* Recibe el mensaje. */
while(captureflag)
{
/* Solicita la recepcin de un mensaje. */
op = MODDRVDL_RECEIVE;
if (!__modplcdl_sendrecv__(hd->hq, NULL, 0, &op,
sizeof(op)))
break;
490 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
msg = (unsigned char *)
malloc(msgsize * sizeof(unsigned char));
if (!msg)
{
captureflag = 0;
break;
}
__modplcdl_sendrecv__(hd->hq, msg, msgsize, NULL, 0);
break;
}
/*
Funcin __modplcdl_sendrecv__:
Intercambia datos con el driver del modem PLC.
*/
static int __modplcdl_sendrecv__(int hq, void *outdata, size_t outsize,
const void *indata, size_t insize)
{
/* Variables. */
size_t last; /* Cantidad de bytes enviados o
recibidos. */
size_t sent; /* Cantidad de bytes enviados. */
size_t received; /* Cantidad de bytes recibidos. */
/* 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
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
#endif
#if !defined(__MODPLCPHY_H__)
492 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#define __MODPLCPHY_H__
/* Definicin de tipos. */
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPLCPHY_NOISESIGNAL 0x01
#define MODPLCPHY_TESTSIGNAL1 0x02
#define MODPLCPHY_TESTSIGNAL2 0x03
/*
Funcin modplcphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
modplcphy_hd *modplcphy_init(int);
/*
Funcin modplcphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modplcphy_release(modplcphy_hd *);
/*
Funcin modplcphy_sndframe:
Enva una trama.
*/
size_t modplcphy_sndframe(modplcphy_hd *, unsigned char, const void *, size_t);
/*
Funcin modplcphy_capframe:
Captura una trama.
*/
int modplcphy_capframe(modplcphy_hd *, unsigned char, size_t);
/*
Funcin modplcphy_getframe:
Obtiene una trama capturada previamente.
*/
size_t modplcphy_getframe(modplcphy_hd *, unsigned char, void *, size_t);
/*
Funcin modplcphy_notify:
FernandoArielBeunza79156 493
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_poll:
Verifica la captura de una trama.
*/
int modplcphy_poll(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_rsdframe:
Reenva una trama.
*/
int modplcphy_rsdframe(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modplcphy_clrbuffer(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int modplcphy_sensechannel(modplcphy_hd *, unsigned char, unsigned char,
long int);
/*
Funcin modplcphy_gensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modplcphy_gensignal(modplcphy_hd *, unsigned char, int);
/*
Funcin modplcphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modplcphy_tstreceive(modplcphy_hd *, unsigned char);
/*
Funcin modplcphy_status:
Devuelve el estado del modem PLC.
*/
int modplcphy_status(modplcphy_hd *);
/*
Funcin modplcphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modplcphy_getpayloadsize(modplcphy_hd *, unsigned char);
#endif
494 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include "modplcphy.h"
/*
Funcin modplcphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
modplcphy_hd *modplcphy_init(int sid)
{
/* Variables. */
int layer; /* Capa a la que se quiere
accerder. */
int result; /* Resultado de la solicitud. */
short int iface; /* Identificadores de interfaces
fsicas. */
modplcphy_hd *handle; /* Manejador de interfaz con la
capa fsica del modem PLC. */
struct sockaddr_un servaddr; /* Direccin del servidor. */
FernandoArielBeunza79156 495
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modplcphy_release(modplcphy_hd *hd)
{
/* Variables. */
int op; /* Operacin. */
int result; /* Resultado de la operacin. */
short int iface; /* Identificadores de interfaces
fsicas. */
/* xito. */
return 1;
}
/*
Funcin modplcphy_sndframe:
Enva una trama.
*/
size_t modplcphy_sndframe(modplcphy_hd *hd, unsigned char iface,
const void *frame, size_t framesize)
{
/* Variables. */
int op; /* Identificador de operacin. */
496 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Enva la trama. */
if (!__modplcphy_sendrecv__(hd, &framesize, sizeof(framesize),
frame, framesize))
break;
/*
Funcin modplcphy_capframe:
Captura una trama.
*/
int modplcphy_capframe(modplcphy_hd *hd, unsigned char iface, size_t framesize)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 497
Tesis de Grado en Ingeniera Informtica
/*
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. */
498 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
pthread_mutex_unlock(&(hd->hm));
/*
Funcin modplcphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
int modplcphy_notify(modplcphy_hd *hd, unsigned char iface,
void (*func)(modplcphy_hd *, void *), void *param)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem
PLC exista. */
if (!hd) return 0;
/*
Funcin modplcphy_poll:
Verifica la captura de una trama.
FernandoArielBeunza79156 499
Tesis de Grado en Ingeniera Informtica
*/
int modplcphy_poll(modplcphy_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
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. */
500 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modplcphy_clrbuffer(modplcphy_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
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. */
FernandoArielBeunza79156 501
Tesis de Grado en Ingeniera Informtica
/*
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. */
502 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
break;
}
/*
Funcin modplcphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modplcphy_tstreceive(modplcphy_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
/*
Funcin modplcphy_status:
Devuelve el estado del modem PLC.
*/
int modplcphy_status(modplcphy_hd *hd)
{
/* Variables. */
int op; /* Identificador de operacin. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 503
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplcphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modplcphy_getpayloadsize(modplcphy_hd *hd, unsigned char iface)
{
/* Variables. */
int op; /* Operacin. */
size_t payloadsize; /* Cantidad de bytes que puede
contener una trama. */
/*
Funcin __modplcphy_detectproc__:
Verifica la existencia de una trama capturada disponible para ser
leda.
*/
static void *__modplcphy_detectproc__(void *param)
{
/* Variables. */
504 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modplcphy_sendrecv__:
Intercambia datos con el driver del modem PLC.
FernandoArielBeunza79156 505
Tesis de Grado en Ingeniera Informtica
*/
static int __modplcphy_sendrecv__(modplcphy_hd *hd, void *outdata,
size_t outsize, const void *indata,
size_t insize)
{
/* Variables. */
size_t last; /* Cantidad de bytes enviados o
recibidos. */
size_t sent; /* Cantidad de bytes enviados. */
size_t received; /* Cantidad de bytes recibidos. */
/* Enva la operacin. */
sent = 0;
while((indata) && (sent < insize))
{
last = write(hd->hq, indata + sent, insize - sent);
sent += last;
}
/* Recibe la respuesta. */
received = 0;
while((outdata) && (received < outsize))
{
last = read(hd->hq, outdata + received, outsize - received);
received += last;
}
/* xito. */
return 1;
}
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.
506 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
/* Tipos de reset. */
#define MODPLC_NORMRESET '0'
#define MODPLC_PARAMRESET '$'
FernandoArielBeunza79156 507
Tesis de Grado en Ingeniera Informtica
/* Tipos de seal. */
#define MODPLCPHY_NOISESIGNAL 0x01
#define MODPLCPHY_TESTSIGNAL1 0x02
#define MODPLCPHY_TESTSIGNAL2 0x03
508 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#endif
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
/* Definicin de tipos. */
/*
Funcin serial_init:
Inicializa la interfaz de comunicacin por puerto serie.
*/
serial_hd *serial_init(int);
/*
Funcin serial_release:
Libera los recursos utilizdos por la interfaz de comunicacin por puerto
serie.
FernandoArielBeunza79156 509
Tesis de Grado en Ingeniera Informtica
*/
int serial_release(serial_hd *);
/*
Funcin serial_send:
Enva un mensaje a travs de la interfaz de comunicacin por puerto serie.
*/
size_t serial_send(serial_hd *, const void *, size_t);
/*
Funcin serial_receive:
Recibe un mensaje a por medio de la interfaz de comunicacin por puerto
serie.
*/
size_t serial_receive(serial_hd *, void *, size_t);
/*
Funcin serial_poll:
Devuelve si hay un mensaje a la espera de ser recibido.
*/
int serial_poll(serial_hd *);
#endif
/*
Funcin serial_init:
Inicializa la interfaz de comunicacin por puerto serie.
*/
serial_hd *serial_init(int id)
{
/* Variables. */
serial_hd *handle; /* Manejador de la interfaz. */
char iname[256]; /* Nombre de la interfaz. */
510 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin serial_release:
Libera los recursos utilizdos por la interfaz de comunicacin por puerto
serie.
*/
int serial_release(serial_hd *hd)
{
/* Verifica la validez del manejador de la interfaz de comunicacin por
puerto serie. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin serial_send:
Enva un mensaje a travs de la interfaz de comunicacin por puerto serie.
*/
size_t serial_send(serial_hd *hd, const void *msg, size_t msgsize)
{
/* Variables. */
size_t sent; /* Cantidad de bytes enviados. */
unsigned char *ptr; /* Puntero al mensaje. */
/* Enva un mensaje. */
sent = 0;
FernandoArielBeunza79156 511
Tesis de Grado en Ingeniera Informtica
/*
Funcin serial_receive:
Recibe un mensaje por medio de la interfaz de comunicacin por puerto
serie.
*/
size_t serial_receive(serial_hd *hd, void *msg, size_t msgsize)
{
/* Verifica la validez del manejador de la interfaz de comunicacin por
puerto serie. */
if (!hd) return 0;
/* Recibe un mensaje. */
return read(hd->serialhd, (unsigned char *) msg, msgsize);
}
/*
Funcin serial_poll:
Verifica la llegada de un nuevo mensaje.
*/
int serial_poll(serial_hd *hd)
{
/* Variables. */
size_t received; /* Cantidad de bytes almacenados en
el buffer de entrada. */
#if !defined(__MODPLC_H__)
#define __MODPLC_H__
/* Definicin de tipos. */
512 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Identificador de grupo. */
typedef unsigned char modplc_spgrpid;
/* Definicin de constantes. */
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER 0x01
#define MODPLC_DATALINKLAYER 0x02
#define MODPLC_SESSIONLAYER 0x03
/* Tipos de seales. */
#define MODPLC_PHYNOISESIGNAL 0x01
#define MODPLC_PHYTESTSIGNAL1 0x02
#define MODPLC_PHYTESTSIGNAL2 0x03
/*
Funcin modplc_init:
Inicializa los recursos utilizados por la interfaz con el modem PLC.
*/
modplc_hd *modplc_init(int, int, int);
/*
Funcin modplc_release:
Libera los recursos utilizados por la interfaz con el modem PLC.
*/
int modplc_release(modplc_hd *);
/*
Funcin modplc_status:
Devuelve el estado del modem PLC.
*/
int modplc_status(modplc_hd *);
/*
Funcin modplc_physndframe:
Enva una trama por medio de la capa fsica del modem PLC.
*/
size_t modplc_physndframe(modplc_hd *, unsigned char, const void *, size_t);
/*
Funcin modplc_phycapframe:
Captura una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phycapframe(modplc_hd *, unsigned char, size_t);
/*
Funcin modplc_phygetframe:
Obtiene una trama capturada previamente por medio de la capa fsica del
modem PLC.
*/
size_t modplc_phygetframe(modplc_hd *, unsigned char, void *, size_t);
FernandoArielBeunza79156 513
Tesis de Grado en Ingeniera Informtica
/*
Funcin phy_poll:
Verifica la captura de una trama por medio de la capa fsica del
modem PLC.
*/
int modplc_phypoll(modplc_hd *, unsigned char);
/*
Funcin modplc_phyrsdframe:
Reenva una trama por medio de la capa fsica del modem PLC.
*/
int modplc_phyrsdframe(modplc_hd *, unsigned char);
/*
Funcin modplc_phyclrbuffer:
Limpia el buffer de captura de tramas de la capa fsica del modem PLC.
*/
int modplc_phyclrbuffer(modplc_hd *, unsigned char);
/*
Funcin modplc_physensechannel:
Sensa el estado del canal de comunicacin por medio de la capa fsica
del modem PLC.
*/
int modplc_physensechannel(modplc_hd *, unsigned char, unsigned char,
long int);
/*
Funcin modplc_phygensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modplc_phygensignal(modplc_hd *, unsigned char, int);
/*
Funcin modplc_phytstreceive:
Realiza una prueba de recepcin de la capa fsica del modem PLC.
*/
int modplc_phytstreceive(modplc_hd *, unsigned char);
/*
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 *, unsigned char);
/*
Funcin modplc_dlopen:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlopen(modplc_hd *, unsigned char, unsigned char);
/*
Funcin modplc_dlclose:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlclose(modplc_hd *, int);
/*
Funcin modplc_dlsend:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlsend(modplc_hd *, int, modplc_dlphyaddr, unsigned char,
const void *, size_t);
/*
Funcin modplc_dlreceive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t modplc_dlreceive(modplc_hd *, int, modplc_dlphyaddr, void *, size_t);
514 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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 *, int);
/*
Funcin modplc_dlgetaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int modplc_dlgetaddress(modplc_hd *, unsigned char, modplc_dlphyaddr);
/*
Funcin modplc_dladdlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int modplc_dladdlogaddress(modplc_hd *, unsigned char, unsigned char,
modplc_dllogaddr);
/*
Funcin modplc_dldellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int modplc_dldellogaddress(modplc_hd *, unsigned char, unsigned char,
modplc_dllogaddr);
/*
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 *, unsigned char, unsigned char,
modplc_dllogaddr, modplc_dlphyaddr);
/*
Funcin modplc_dlgetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de enlace del modem PLC.
*/
size_t modplc_dlgetpayloadsize(modplc_hd *, unsigned char);
/*
Funcin modplc_sppublish:
Registra el dispositivo como publicador del grupo de difusin
especificado de la capa de sesin del modem PLC.
*/
int modplc_sppublish(modplc_hd *, modplc_spgrpid);
/*
Funcin modplc_spsubscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado de la capa de sesin del modem PLC.
*/
int modplc_spsubscribe(modplc_hd *, modplc_spgrpid);
/*
Funcin modplc_spleave:
Desvincula el dispositivo del grupo de difusin especificado de la capa
de sesin del modem PLC.
*/
int modplc_spleave(modplc_hd *, modplc_spgrpid);
/*
Funcin modplc_spsend:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spsend(modplc_hd *, modplc_spgrpid, int, const void *, size_t);
/*
FernandoArielBeunza79156 515
Tesis de Grado en Ingeniera Informtica
Funcin modplc_spreceive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spreceive(modplc_hd *, modplc_spgrpid *, void *, size_t);
/*
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 *);
/*
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 *);
#endif
/*
Funcin modplc_init:
Inicializa los recursos utilizados por la interfaz con el modem PLC.
*/
modplc_hd *modplc_init(int sid, int layer, int debugmode)
{
/* Variables. */
char prompt; /* Smbolo de la lnea de
comando. */
modplc_hd *handle; /* Manejador de interfaz con el
modem PLC. */
char cmdline[MODPLC_BUFFERSIZE]; /* Lnea de comando. */
char respline[MODPLC_BUFFERSIZE]; /* Lnea de respuesta de
comando. */
516 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
handle->serialhd = serial_init(sid);
if (!handle->serialhd)
{
free(handle);
return NULL;
}
FernandoArielBeunza79156 517
Tesis de Grado en Ingeniera Informtica
modplc_release(handle);
return NULL;
}
/*
Funcin modplc_release:
Libera los recursos utilizados por la interfaz con el modem PLC.
*/
int modplc_release(modplc_hd *hd)
{
/* Verifica que el manejador de interfaz con el modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modplc_status:
Devuelve el estado del modem PLC.
*/
int modplc_status(modplc_hd *hd)
{
/* Verifica que el manejador de interfaz con el modem PLC exista. */
if (!hd) return 0;
/*
Funcin modplc_physndframe:
Enva una trama por medio de la capa fsica del modem PLC.
*/
size_t modplc_physndframe(modplc_hd *hd, unsigned char iface,
const void *frame, size_t framesize)
{
/* Variables. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
518 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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. */
/*
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,
size_t framesize)
{
/* Variables. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
FernandoArielBeunza79156 519
Tesis de Grado en Ingeniera Informtica
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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. */
/*
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. */
520 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
outparam[0] = &result;
if (__modplc_sendcmd__(hd, MODPLCPHY_CLRBUFFER, "b", inparam, NULL,
"b", outparam, NULL))
return (result == 1);
return 0;
}
/*
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. */
/*
Funcin modplc_phygensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modplc_phygensignal(modplc_hd *hd, unsigned char iface, int sig)
{
/* Variables. */
unsigned char result; /* Resultado del comando. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
FernandoArielBeunza79156 521
Tesis de Grado en Ingeniera Informtica
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. */
/*
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
puede contener una trama. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin modplc_dlopen:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
int modplc_dlopen(modplc_hd *hd, unsigned char iface, unsigned char prot)
{
/* Variables. */
unsigned short int handle; /* Manejador de conexin. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
522 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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; /* Resultado del comando. */
void *inparam[2]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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. */
/* Enva un mensaje. */
inparam[0] = &handle;
inparam[1] = addr;
inparam[2] = &prio;
FernandoArielBeunza79156 523
Tesis de Grado en Ingeniera Informtica
inparam[3] = &msgsize;
outparam[0] = &msgsize;
if (__modplc_sendcmd__(hd, '3', "sabs", inparam, msg, "s", outparam,
NULL))
return msgsize;
return 0;
}
/*
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. */
/* Recibe un mensaje. */
inparam[0] = &handle;
inparam[1] = &msgsize;
outparam[0] = addr;
outparam[1] = &msgsize;
if (__modplc_sendcmd__(hd, '4', "ss", inparam, NULL, "as", outparam,
msg))
return msgsize;
return 0;
}
/*
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; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin modplc_dlgetaddress:
524 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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. */
/*
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
Tesis de Grado en Ingeniera Informtica
/*
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. */
/*
Funcin modplc_dlgetpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de enlace del modem PLC.
*/
size_t modplc_dlgetpayloadsize(modplc_hd *hd, unsigned char iface)
{
/* Variables. */
unsigned short int payloadsize; /* Cantidad mxima de bytes que
puede contener una trama. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
526 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modplc_sppublish:
Registra el dispositivo como publicador del grupo de difusin
especificado de la capa de sesin del modem PLC.
*/
int modplc_sppublish(modplc_hd *hd, modplc_spgrpid grpid)
{
/* Variables. */
unsigned char result; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin modplc_spsubscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado de la capa de sesin del modem PLC.
*/
int modplc_spsubscribe(modplc_hd *hd, modplc_spgrpid grpid)
{
/* Variables. */
unsigned char result; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
FernandoArielBeunza79156 527
Tesis de Grado en Ingeniera Informtica
/*
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; /* Resultado del comando. */
void *inparam[1]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
Funcin modplc_spsend:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modplc_spsend(modplc_hd *hd, modplc_spgrpid grpid, int nosec,
const void *msg, size_t msgsize)
{
/* Variables. */
void *inparam[3]; /* Parmetros de entrada del
comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/* Enva un mensaje. */
inparam[0] = &grpid;
inparam[1] = &nosec;
inparam[2] = &msgsize;
outparam[0] = &msgsize;
if (__modplc_sendcmd__(hd, '4', "bbs", inparam, msg, "s", outparam,
NULL))
return msgsize;
return 0;
}
/*
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
Tesis de Grado en Ingeniera Informtica
/* Recibe un mensaje. */
inparam[0] = &msgsize;
outparam[0] = grpid;
outparam[1] = &msgsize;
if (__modplc_sendcmd__(hd, '5', "s", inparam, NULL, "bs", outparam,
msg))
return msgsize;
return 0;
}
/*
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; /* Resultado del comando. */
void *outparam[1]; /* Parmetros de salida del
comando. */
/*
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; /* Cantidad mxima de bytes que
puede contener una trama. */
void *outparam[1]; /* Parmetros de salida del
comando. */
FernandoArielBeunza79156 529
Tesis de Grado en Ingeniera Informtica
return 0;
}
/*
Funcin __modplc_sendcmdline__:
Enva una lnea de comando por medio de la interfaz de comunicacin por
puerto serie.
*/
static char __modplc_sendcmdline__(modplc_hd *hd, const char *cmdline,
char *resp, size_t respsize)
{
/* Variables. */
size_t send; /* Cantidad de bytes por envo. */
size_t size; /* Tamaoo de la lnea de
respuesta. */
char *lastchar; /* Puntero al ltimo caracter. */
char respline[MODPLC_BUFFERSIZE]; /* Respuesta a la lnea de
comando. */
/* Recibe la respuesta. */
size += serial_receive(hd->serialhd, respline + size, respsize - size);
*(respline + size) = 0;
/*
Funcin __modplc_sendcmd__:
Enva un comando por medio de la interfaz de comunicacin por puerto
530 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 531
Tesis de Grado en Ingeniera Informtica
/* Enva la trama. */
*cmdline = 0;
ptrframe = (unsigned char *) inframe;
framesize = *((size_t *) inparam[param - 1]);
for(i = 0; i < framesize; )
{
dat2 = (unsigned char) *ptrframe;
if ((dat2 >= 0x20) && (dat2 <= 0x7e) &&
(dat2 != '\\') && (dat2 != '#') &&
(dat2 != '?') && (dat2 != '$') &&
(dat2 != '>'))
sprintf(hexval, "%c", dat2);
else
sprintf(hexval, "\\%02X", dat2);
strcat(cmdline, hexval);
ptrframe ++;
i ++;
if ((i & 0x000f) && (i < framesize)) continue;
strcat(cmdline, "\n");
if (__modplc_sendcmdline__(hd, cmdline, respline,
MODPLC_BUFFERSIZE) != '>')
break;
*cmdline = 0;
}
}
532 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 533
Tesis de Grado en Ingeniera Informtica
if (dat2 != '\\')
*ptrframe = dat2;
else
{
hexval[0] = *(ptrresp ++);
hexval[1] = *(ptrresp ++);
hexval[2] = 0;
sscanf(hexval, "%X", &dat1);
*ptrframe = (unsigned char) dat1;
}
ptrframe ++;
j ++;
}
}
/* xito. */
return 1;
}
#if !defined(__MODSP_H__)
#define __MODSP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char modsp_grpid;
534 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modsp_hd *modsp_init(int, int);
/*
Funcin modsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modsp_release(modsp_hd *);
/*
Funcin modsp_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modsp_publish(modsp_hd *, modsp_grpid);
/*
Funcin modsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int modsp_subscribe(modsp_hd *, modsp_grpid);
/*
Funcin modsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modsp_leave(modsp_hd *, modsp_grpid);
/*
Funcin modsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modsp_send(modsp_hd *, modsp_grpid, unsigned char, const void *,
size_t);
/*
Funcin modsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modsp_receive(modsp_hd *, modsp_grpid *, void *, size_t);
/*
Funcin modsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modsp_notify(modsp_hd *, void (*func)(modsp_hd *, modsp_grpid, void *,
size_t, void *), void *);
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modsp_poll(modsp_hd *);
/*
Funcin modsp_status:
Devuelve el estado del modem PLC.
*/
int modsp_status(modsp_hd *);
/*
Funcin modsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de sesin del modem PLC.
FernandoArielBeunza79156 535
Tesis de Grado en Ingeniera Informtica
*/
size_t modsp_getpayloadsize(modsp_hd *);
#endif
/*
Funcin modsp_init:
Inicializa los recursos utilizados por la capa de sesin del modem PLC.
*/
modsp_hd *modsp_init(int sid, int debugmode)
{
/* Variables. */
modsp_hd *handle; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
/* Inicializa semforo. */
if (pthread_mutex_init(&(handle->mutexsem), NULL)) break;
if (pthread_mutex_unlock(&(handle->mutexsem))) break;
536 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return handle;
}
/*
Funcin modsp_release:
Libera los recursos utilizados por la capa de sesin del modem PLC.
*/
int modsp_release(modsp_hd *hd)
{
/* Verifica que el manejador de interfaz con la capa de sesin del
modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin modsp_publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
int modsp_publish(modsp_hd *hd, modsp_grpid grpid)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modsp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
FernandoArielBeunza79156 537
Tesis de Grado en Ingeniera Informtica
*/
int modsp_subscribe(modsp_hd *hd, modsp_grpid grpid)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modsp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int modsp_leave(modsp_hd *hd, modsp_grpid grpid)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/* Desvincula el dispositivo. */
result = modplc_spleave(hd->modplchd, grpid);
/*
Funcin modsp_send:
Enva un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modsp_send(modsp_hd *hd, modsp_grpid grpid, unsigned char nosec,
const void *msg, size_t msgsize)
{
/* Verifica que el manejador de interfaz con la capa de sesin del
modem PLC exista. */
if (!hd) return 0;
/* Enva un mensaje. */
msgsize = modplc_spsend(hd->modplchd, grpid, nosec, msg, msgsize);
538 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modsp_receive:
Recibe un mensaje por medio de la capa de sesin del modem PLC.
*/
size_t modsp_receive(modsp_hd *hd, modsp_grpid *grpid, void *msg,
size_t msgsize)
{
/* Verifica que el manejador de interfaz con la capa de sesin del
modem PLC exista. */
if (!hd) return 0;
/* Recibe un mensaje. */
msgsize = modplc_spreceive(hd->modplchd, grpid, msg, msgsize);
/*
Funcin modsp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int modsp_notify(modsp_hd *hd, void (*func)(modsp_hd *, modsp_grpid, void *,
size_t, void *), void *param)
{
/* Verifica que el manejador de interfaz con la capa de sesin del
modem PLC exista. */
if (!hd) return 0;
FernandoArielBeunza79156 539
Tesis de Grado en Ingeniera Informtica
return 1;
}
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int modsp_poll(modsp_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modsp_status:
Devuelve el estado del modem PLC.
*/
int modsp_status(modsp_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
540 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
PLC. */
if (pthread_mutex_lock(&(hd->mutexsem))) return 0;
/*
Funcin modsp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de sesin del modem PLC.
*/
size_t modsp_getpayloadsize(modsp_hd *hd)
{
/* Variables. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
/*
Funcin __modsp_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser
ledo.
*/
static void *__modsp_detectproc__(void *param)
{
/* Variables. */
int recvflag; /* Indicador de recepcin de un
mensaje. */
size_t msgsize; /* Tamaoo del mensaje recibido. */
modsp_grpid grpid; /* Identificador de grupo. */
modsp_hd *hd; /* Manejador de interfaz con la
capa de sesin del modem PLC. */
void (*func)
(void *, modsp_grpid,
void *, size_t, void *); /* Manejador de mensajes
recibidos. */
unsigned char *msg; /* Puntero al mensaje recibido. */
FernandoArielBeunza79156 541
Tesis de Grado en Ingeniera Informtica
hd = (modsp_hd *) param;
#if !defined(__MODDL_H__)
#define __MODDL_H__
/* Definicin de tipos. */
542 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
moddl_hd *moddl_init(int, int);
/*
Funcin moddl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int moddl_release(moddl_hd *);
/*
Funcin moddl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
moddlconn_hd *moddl_open(moddl_hd *, unsigned char, unsigned char);
/*
Funcin moddl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int moddl_close(moddlconn_hd *);
/*
Funcin moddl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t moddl_send(moddlconn_hd *, moddl_phyaddr, unsigned char, const void *,
size_t);
/*
Funcin moddl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
FernandoArielBeunza79156 543
Tesis de Grado en Ingeniera Informtica
*/
size_t moddl_receive(moddlconn_hd *, moddl_phyaddr, void *, size_t);
/*
Funcin moddl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int moddl_notify(moddlconn_hd *, void (*func)(moddlconn_hd *, moddl_phyaddr,
void *, size_t, void *), void *);
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int moddl_poll(moddlconn_hd *);
/*
Funcin moddl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int moddl_getaddress(moddl_hd *, unsigned char, moddl_phyaddr);
/*
Funcin moddl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlade del modem PLC.
*/
int moddl_addlogaddress(moddl_hd *, unsigned char, unsigned char,
moddl_logaddr);
/*
Funcin moddl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int moddl_dellogaddress(moddl_hd *, unsigned char, unsigned char,
moddl_logaddr);
/*
Funcin moddl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa
de enlace del modem PLC.
*/
int moddl_getphyaddress(moddl_hd *, unsigned char, unsigned char,
moddl_logaddr, moddl_phyaddr);
/*
Funcin moddl_status:
Devuelve el estado del modem PLC.
*/
int moddl_status(moddl_hd *);
/*
Funcin moddl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de enlace del modem PLC.
*/
size_t moddl_getpayloadsize(moddl_hd *, unsigned char);
#endif
544 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_init:
Inicializa los recursos utilizados por la capa de enlace del modem PLC.
*/
moddl_hd *moddl_init(int sid, int debugmode)
{
/* Variables. */
moddl_hd *handle; /* Manejador de interfaz con la
capa de enlace del modem PLC. */
/* Inicializa semforo. */
if (pthread_mutex_init(&(handle->mutexsem), NULL)) break;
if (pthread_mutex_unlock(&(handle->mutexsem))) break;
/*
Funcin moddl_release:
Libera los recursos utilizados por la capa de enlace del modem PLC.
*/
int moddl_release(moddl_hd *hd)
{
/* Verifica que el manejador de interfaz con la capa de enlace del
modem PLC exista. */
if (!hd) return 0;
FernandoArielBeunza79156 545
Tesis de Grado en Ingeniera Informtica
/* xito. */
return 1;
}
/*
Funcin moddl_open:
Abre una conexin por medio de la capa de enlace del modem PLC.
*/
moddlconn_hd *moddl_open(moddl_hd *hd, unsigned char iface, unsigned char prot)
{
/* Variables. */
moddlconn_hd *handle; /* Manejador de conexin de la capa
de enlace del modem PLC. */
546 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_close:
Cierra una conexin por medio de la capa de enlace del modem PLC.
*/
int moddl_close(moddlconn_hd *hd)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin moddl_send:
Enva un mensaje por medio de la capa de enlace del modem PLC.
*/
size_t moddl_send(moddlconn_hd *hd, moddl_phyaddr addr, unsigned char prio,
const void *msg, size_t msgsize)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
/* Enva un mensaje. */
msgsize = modplc_dlsend(hd->moddlhd->modplchd, hd->handle, addr, prio,
msg, msgsize);
/*
Funcin moddl_receive:
Recibe un mensaje por medio de la capa de enlace del modem PLC.
FernandoArielBeunza79156 547
Tesis de Grado en Ingeniera Informtica
*/
size_t moddl_receive(moddlconn_hd *hd, moddl_phyaddr addr, void *msg,
size_t msgsize)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
/* Recibe un mensaje. */
msgsize = modplc_dlreceive(hd->moddlhd->modplchd, hd->handle, addr,
msg, msgsize);
/*
Funcin moddl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int moddl_notify(moddlconn_hd *hd, void (*func)(moddlconn_hd *, moddl_phyaddr,
void *, size_t, void *), void *param)
{
/* Verifica que el manejador de conexin por medio de la capa de enlace
del modem PLC exista. */
if (!hd) return 0;
548 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modsp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int moddl_poll(moddlconn_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_getaddress:
Devuelve la direccin fsica de la capa de enlace del modem PLC.
*/
int moddl_getaddress(moddl_hd *hd, unsigned char iface, moddl_phyaddr addr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
FernandoArielBeunza79156 549
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_addlogaddress:
Agrega una nueva direccin lgica a la capa de enlace del modem PLC.
*/
int moddl_addlogaddress(moddl_hd *hd, unsigned char iface, unsigned char prot,
moddl_logaddr addr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_dellogaddress:
Elimina una direccin lgica a la capa de enlace del modem PLC.
*/
int moddl_dellogaddress(moddl_hd *hd, unsigned char iface, unsigned char prot,
moddl_logaddr addr)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica de la capa
de enlace del modem PLC.
*/
int moddl_getphyaddress(moddl_hd *hd, unsigned char iface, unsigned char prot,
moddl_logaddr laddr, moddl_phyaddr paddr)
{
/* Variables. */
550 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddl_status:
Devuelve el estado del modem PLC.
*/
int moddl_status(moddl_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin moddl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje de
la capa de enlace del modem PLC.
*/
size_t moddl_getpayloadsize(moddl_hd *hd, unsigned char iface)
{
/* Variables. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener un mensaje. */
FernandoArielBeunza79156 551
Tesis de Grado en Ingeniera Informtica
mensaje. */
payloadsize = modplc_dlgetpayloadsize(hd->modplchd, iface);
/*
Funcin __moddl_detectproc__:
Verifica la existencia de un mensaje recibido disponible para ser
ledo.
*/
static void *__moddl_detectproc__(void *param)
{
/* Variables. */
int recvflag; /* Indicador de recepcin de un
mensaje. */
size_t msgsize; /* Tamao del mensaje recibido. */
moddl_phyaddr addr; /* Direccin fsica de origen del
mensaje. */
moddlconn_hd *hd; /* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
void (*func)
(void *, moddl_phyaddr,
void *, size_t, void *); /* Manejador de mensajes
recibidos. */
unsigned char *msg; /* Puntero al mensaje recibido. */
552 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__MODPHY_H__)
#define __MODPHY_H__
/* Definicin de tipos. */
/* Definicin de constantes. */
/* Tipos de seales. */
#define MODPHY_NOISESIGNAL 0x01
#define MODPHY_TESTSIGNAL1 0x02
#define MODPHY_TESTSIGNAL2 0x03
/*
Funcin modphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
FernandoArielBeunza79156 553
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modphy_release(modphy_hd *);
/*
Funcin modphy_sndframe:
Enva una trama.
*/
size_t modphy_sndframe(modphy_hd *, unsigned char, const void *, size_t);
/*
Funcin modphy_capframe:
Captura una trama.
*/
int modphy_capframe(modphy_hd *, unsigned char, size_t);
/*
Funcin modphy_getframe:
Obtiene una trama capturada previamente.
*/
size_t modphy_getframe(modphy_hd *, unsigned char, void *, size_t);
/*
Funcin modphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
int modphy_notify(modphy_hd *, unsigned char,
void (*func)(modphy_hd *, void *), void *);
/*
Funcin modphy_poll:
Verifica la captura de una trama.
*/
int modphy_poll(modphy_hd *, unsigned char);
/*
Funcin modphy_rsdframe:
Reenva una trama.
*/
int modphy_rsdframe(modphy_hd *, unsigned char);
/*
Funcin modphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modphy_clrbuffer(modphy_hd *, unsigned char);
/*
Funcin modphy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int modphy_sensechannel(modphy_hd *, unsigned char, unsigned char, long int);
/*
Funcin modphy_gensignal:
Genera la seal especificada por medio de la capa fsica del modem PLC.
*/
int modphy_gensignal(modphy_hd *, unsigned char, int);
/*
Funcin modphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modphy_tstreceive(modphy_hd *, unsigned char);
/*
Funcin modphy_status:
554 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modphy_getpayloadsize(modphy_hd *, unsigned char);
#endif
/*
Funcin modphy_init:
Inicializa los recursos utilizados por la capa fsica del modem PLC.
*/
modphy_hd *modphy_init(int sid, int debugmode)
{
/* Variables. */
short int iface; /* Identificadores de interfaces
fsicas. */
modphy_hd *handle; /* Manejador de interfaz con la
capa fsica del modem PLC. */
FernandoArielBeunza79156 555
Tesis de Grado en Ingeniera Informtica
handle->iface[iface].recfun = NULL;
handle->iface[iface].param = NULL;
}
/* Inicializa semforo. */
if (pthread_mutex_init(&(handle->mutexsem), NULL)) break;
if (pthread_mutex_unlock(&(handle->mutexsem))) break;
/*
Funcin modphy_release:
Libera los recursos utilizados por la capa fsica del modem PLC.
*/
int modphy_release(modphy_hd *hd)
{
/* Variables. */
short int iface; /* Identificadores de interfaces
fsicas. */
/* 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;
556 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
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. */
/*
Funcin modphy_getframe:
Obtiene una trama capturada previamente.
*/
size_t modphy_getframe(modphy_hd *hd, unsigned char iface, void *frame,
size_t framesize)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem
PLC exista. */
if (!hd) return 0;
/*
Funcin modphy_notify:
Define una funcin manejadora de tramas capturadas.
*/
int modphy_notify(modphy_hd *hd, unsigned char iface,
void (*func)(modphy_hd *, void *), void *param)
{
/* Verifica que el manejador de interfaz con la capa fsica del modem
PLC exista. */
if (!hd) return 0;
FernandoArielBeunza79156 557
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_poll:
Verifica la captura de una trama.
*/
int modphy_poll(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
int result; /* Resultado de la operacin. */
558 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_rsdframe:
Reenva una trama.
*/
int modphy_rsdframe(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modphy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int modphy_clrbuffer(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modphy_sensechannel:
Sensa el estado del canal de comunicacin.
FernandoArielBeunza79156 559
Tesis de Grado en Ingeniera Informtica
*/
int modphy_sensechannel(modphy_hd *hd, unsigned char iface,
unsigned char level, long int waittime)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
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. */
int result; /* Resultado de la operacin. */
/*
Funcin modphy_tstreceive:
Realiza una prueba de recepcin.
*/
int modphy_tstreceive(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
int result; /* Resultado de la operacin. */
560 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modphy_status:
Devuelve el estado del modem PLC.
*/
int modphy_status(modphy_hd *hd)
{
/* Variables. */
int result; /* Resultado de la operacin. */
/*
Funcin modphy_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener una trama de la
capa fsica del modem PLC.
*/
size_t modphy_getpayloadsize(modphy_hd *hd, unsigned char iface)
{
/* Variables. */
size_t payloadsize; /* Cantidad mxima de bytes que
puede contener una trama. */
FernandoArielBeunza79156 561
Tesis de Grado en Ingeniera Informtica
/*
Funcin __modphy_detectproc__:
Verifica la existencia de una trama capturada disponible para ser
leda.
*/
static void *__modphy_detectproc__(void *param)
{
/* Variables. */
int captureflag; /* Indicador de captura de una
trama. */
short int i; /* Contador. */
unsigned char iface; /* Identificadores de interfaces
fsicas. */
modphy_hd *hd; /* Manejador de interfaz con la
capa fsica del modem PLC. */
void (*func)(void *, void *); /* Manejador de captura de
tramas. */
562 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__MODDRV_H__)
#define __MODDRV_H__
/* Definicin de tipos. */
/*
Funcin moddrv_init:
Inicializa los recursos utilizados por el driver del modem PLC.
*/
moddrv_hd *moddrv_init(int, int);
/*
Funcin moddrv_release:
Libera los recursos utilizados por el driver del modem PLC.
*/
int moddrv_release(moddrv_hd *);
/*
Funcin moddrv_run:
Ejecuta el driver del modem PLC.
*/
int moddrv_run(moddrv_hd *);
/*
Funcin moddrv_stop:
Detiene la ejecucin del driver del modem PLC.
*/
int moddrv_stop(moddrv_hd *);
#endif
FernandoArielBeunza79156 563
Tesis de Grado en Ingeniera Informtica
moddrv.c:
Implementacin de funciones referentes al driver del modem PLC.
*/
/* Definicin de tipos. */
/*
Funcin moddrv_init:
Inicializa los recursos utilizados por el driver del modem PLC.
*/
moddrv_hd *moddrv_init(int sid, int debugmode)
{
/* Variables. */
moddrv_hd *handle; /* Manejador del driver del modem
PLC. */
564 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin moddrv_release:
Libera los recursos utilizados por el driver del modem PLC.
*/
int moddrv_release(moddrv_hd *hd)
{
/* Verifica que el manejador del driver del modem PLC exista. */
if (!hd) return 0;
/* xito. */
return 1;
}
/*
Funcin moddrv_run:
Ejecuta el driver del modem PLC.
*/
int moddrv_run(moddrv_hd *hd)
{
/* Variables. */
int hl; /* Manejador de espera de
conexin. */
int hq; /* Manejador de cola de
mensajes. */
pthread_mutex_t hm; /* Manejador de semforo de
exclusin mutua. */
pthread_t cthread; /* Manejador de hilo. */
char qname[256]; /* Nombre de la cola de
mensajes. */
__moddrv_shareinf__ sinf; /* Informacin compartida. */
socklen_t clilen; /* Longitud de direccin del
cliente. */
struct sockaddr_un cliaddr; /* Direccin del cliente. */
struct sockaddr_un servaddr; /* Direccin del servidor. */
/* Inicializa semforo. */
if (pthread_mutex_init(&hm, NULL)) return 0;
if (pthread_mutex_unlock(&hm)) return 0;
FernandoArielBeunza79156 565
Tesis de Grado en Ingeniera Informtica
if (hq < 0)
{
if (errno == EINTR)
continue;
else
break;
}
/*
Funcin moddrv_stop:
Detiene la ejecucin del driver del modem PLC.
*/
int moddrv_stop(moddrv_hd *hd)
{
/* Variables. */
int hq; /* Manejador de cola de
mensajes. */
int layer; /* Capa que se solicita
utilizar. */
int result; /* Respuesta a la solicitud. */
struct sockaddr_un servaddr; /* Direccin del servidor. */
/* Abre una conexin con la cola de mensajes del driver del modem
PLC. */
hq = socket(AF_LOCAL, SOCK_STREAM, 0);
if (hq < 0) return 0;
bzero(&servaddr, sizeof(servaddr));
servaddr.sun_family = AF_LOCAL;
sprintf(servaddr.sun_path, "/tmp/modemplc%i.str", hd->port);
if (connect(hq, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
return 0;
566 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Cierra la conexin con al cola de mensajes del driver del modem PLC. */
close(hq);
return 1;
}
/*
Funcin __moddrv_clientthread__:
Atiene a los clientes del driver del modem PLC.
*/
static void *__moddrv_clientthread__(void *param)
{
/* Variables. */
int hq; /* Manejador de cola de
mensajes. */
pthread_mutex_t hm; /* Manejador de semforo de
exclusin mutua. */
int layer; /* Capa que se solicita
utilizar. */
int result; /* Respuesta a la solicitud. */
moddrv_hd *hd; /* Manejador del driver del modem
PLC. */
__moddrv_shareinf__ *sinf; /* Informacin compartida. */
/* Espera el permiso para poder acceder a los recursos del driver del
modem PLC. */
if (pthread_mutex_lock(&hm)) pthread_exit(0);
FernandoArielBeunza79156 567
Tesis de Grado en Ingeniera Informtica
PLC. */
else if (layer == 2)
{
hd->dlhd = moddl_init(hd->port, hd->debugmode);
if (!hd->dlhd) result = 0;
}
/* Inicializa la interfaz de la capa de sesin del modem
PLC. */
else if (layer == 3)
{
hd->sphd = modsp_init(hd->port, hd->debugmode);
if (!hd->sphd) result = 0;
}
}
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
pthread_mutex_unlock(&hm);
/* Espera el permiso para poder acceder a los recursos del driver del
modem PLC. */
pthread_mutex_lock(&hm);
/* Elimina un cliente. */
hd->clients --;
/* Permite a otro hilos el acceso a los recursos del driver del modem
PLC. */
pthread_mutex_unlock(&hm);
568 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __moddrv_phyclient__:
Procesa las solicitudes de los clientes destinadas a la capa fsica del
modem PLC.
*/
static int __moddrv_phyclient__(moddrv_hd *hd, int hq, pthread_mutex_t hm)
{
/* Variables. */
int op; /* Cdigo de operacin. */
int sig; /* Tipo de seal. */
int result; /* Respuesta a la solicitud. */
size_t size; /* Cantidad de bytes. */
unsigned char iface; /* Identificador de interfaz
fsica. */
unsigned char level; /* Nivel de seal. */
long int waittime; /* Tiempo de espera. */
unsigned char *frame; /* Puntero a la trama recibida. */
/* Recibe la trama. */
frame = (unsigned char *)
malloc(size * sizeof(unsigned char));
if (!frame) continue;
if (!__moddrv_receive__(hq, frame, size))
{
free(frame);
continue;
}
/* Enva la trama. */
size = modphy_sndframe(hd->phyhd, iface, frame, size);
free(frame);
FernandoArielBeunza79156 569
Tesis de Grado en Ingeniera Informtica
570 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 571
Tesis de Grado en Ingeniera Informtica
/*
Funcin __moddrv_dlclient__:
Procesa las solicitudes de los clientes destinadas a la capa de enlace
del modem PLC.
*/
static int __moddrv_dlclient__(moddrv_hd *hd, int hq, pthread_mutex_t hm)
{
/* Variables. */
int op; /* Cdigo de operacin. */
int result; /* Respuesta a la solicitud. */
unsigned char prot; /* Identificador de protocolo. */
unsigned char prio; /* Prioridad del mensaje. */
unsigned char iface; /* Identificador de interfaz
fsica. */
size_t size; /* Cantidad de bytes. */
moddlconn_hd *dlconnhd; /* Manejador de conexin por medio
de la capa de enlace del modem
PLC. */
moddl_logaddr laddr; /* Direccin lgica. */
moddl_phyaddr paddr; /* Direccin fsica. */
unsigned char *msg; /* Puntero al mensaje recibido. */
572 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Abre la conexin. */
dlconnhd = moddl_open(hd->dlhd, iface, prot);
if (dlconnhd) result = 1;
}
/* Recibe el mensaje. */
msg = (unsigned char *)
malloc(size * sizeof(unsigned char));
if (!msg) continue;
if (!__moddrv_receive__(hq, msg, size))
{
free(msg);
FernandoArielBeunza79156 573
Tesis de Grado en Ingeniera Informtica
continue;
}
/* Enva el mensaje. */
size = moddl_send(dlconnhd, paddr, prio, msg,
size);
free(msg);
}
/* Recibe el mensaje. */
msg = (unsigned char *)
malloc(size * sizeof(unsigned char));
if (!msg) continue;
size = moddl_receive(dlconnhd, paddr, msg,
size);
}
574 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 575
Tesis de Grado en Ingeniera Informtica
continue;
/*
Funcin __moddrv_spclient__:
Procesa las solicitudes de los clientes destinadas a la capa de sesin
del modem PLC.
*/
576 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 577
Tesis de Grado en Ingeniera Informtica
/* Enva el mensaje. */
size = modsp_send(hd->sphd, grpid, nosec, msg,
size);
break;
}
/* Recibe el mensaje. */
msg = (unsigned char *)
malloc(size * sizeof(unsigned char));
if (msg)
size = modsp_receive(hd->sphd, &grpid, msg,
size);
else
size = 0;
578 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
free(msg);
continue;
}
/*
Funcin __moddrv_send__:
Enva datos por medio de la cola de mensajes.
*/
static int __moddrv_send__(int hq, const void *stream, size_t size)
{
/* Variables. */
size_t sent; /* Cantidad de bytes enviados. */
size_t lastsent; /* Cantidad de bytes enviados en el
ltimo envo. */
unsigned char *ptr; /* Puntero a los datos. */
FernandoArielBeunza79156 579
Tesis de Grado en Ingeniera Informtica
sent = 0;
ptr = (unsigned char *) stream;
while((stream) && (sent < size))
{
lastsent = write(hq, ptr + sent, size - sent);
sent += lastsent;
}
return 1;
}
/*
Funcin __moddrv_receive__:
Enva datos por medio de la cola de mensajes.
*/
static int __moddrv_receive__(int hq, void *stream, size_t size)
{
/* Variables. */
size_t received; /* Cantidad de bytes recibidos. */
size_t lastreceive; /* Cantidad de bytes recibidos en
la ltima recepcin. */
unsigned char *ptr; /* Puntero a los datos. */
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port; /* Puerto serie utilizado. */
int debug; /* Modo depuracin. */
moddrv_hd *hd; /* Manejador del driver del modem
PLC. */
char *option; /* Opcin especificada. */
580 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
port = atoi(argv[1]);
debug = 0;
if (argc > 3)
{
option = strlwr(strdup(argv[3]));
if (!option) return -1;
if (!strcmp(option, "debug")) debug = 1;
}
option = strlwr(strdup(argv[2]));
if (!option) return -1;
/* Desactiva el driver. */
else if (!strcmp(option, "stop"))
moddrv_stop(hd);
break;
}
/*
Funcin strlwr:
Convierte todas las letras de una cadena a letra minscula.
*/
static char *strlwr(const char *str)
{
/* Variables. */
char *ostr; /* Cadena de salida. */
char *instr; /* Puntero a la cadena de
entrada. */
char *outstr; /* Puntero a la cadena de
salida. */
FernandoArielBeunza79156 581
Tesis de Grado en Ingeniera Informtica
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.
582 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
/* Capa de fsica. */
/* Caracter delimitador. */
#define MAC_DELIMITERBYTE 0x7e
/* Direccin de broadcast. */
#define MAC_BROADCASTADDR_0 0xff
584 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Tipos de mensaje. */
#define MAC_RTSMSG 0x01
#define MAC_DATAMSG 0x02
/* Protocolos. */
#define LLC_ARPPROT 0x01
#define LLC_UNUSEDPROT 0x02
/* Tipos de mensaje. */
#define ARP_REQUESTMSG 0x01
#define ARP_REPLYMSG 0x02
/* Protocolos. */
#define ARP_UNUSEDPROT 0x01
/* Capa de red. */
/* Capa de transporte. */
FernandoArielBeunza79156 585
Tesis de Grado en Ingeniera Informtica
/* Capa de sesin. */
/* Tamao de la lnea. */
#define MODPLC_CMDLINESIZE 80
/* Tipos de reset. */
#define MODPLC_NORMRESET "0"
#define MODPLC_PARAMRESET '$'
/* Capas de acceso. */
#define MODPLC_PHYSICALLAYER "1"
#define MODPLC_DATALINKLAYER "2"
#define MODPLC_SESSIONLAYER "3"
/* Tipos de seal. */
#define MODPLCPHY_NOISESIGNAL 0x01
#define MODPLCPHY_TESTSIGNAL1 0x02
#define MODPLCPHY_TESTSIGNAL2 0x03
586 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#endif
#if !defined(___COMMON_H__)
#define ___COMMON_H__
/*
Funcin wait_usecs:
Espera el transcurso de una determinada microsegundos.
*/
void wait_usecs(long int);
#endif
/*
Funcin wait_usecs:
Espera el transcurso de una determinada microsegundos.
*/
void wait_usecs(long int usecs)
{
/* Espera con watchdog desactivado. */
if (!__wdt_status__)
{
while(1)
{
__asm
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
FernandoArielBeunza79156 587
Tesis de Grado en Ingeniera Informtica
__endasm;
if (usecs < ((66 * F_CPU) / 11059200UL)) break;
usecs -= ((66 * F_CPU) / 11059200UL);
}
return;
}
#include "../common/serial.h"
#include "../common/serial.c"
#if !defined(__PHY_H__)
#define __PHY_H__
/*
588 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin phy_init:
Inicializa los recursos utilizados por la capa fsica.
*/
void phy_init(void);
/*
Funcin phy_release:
Libera los recursos utilizados por la capa fsica.
*/
void phy_release(void);
/*
Funcin phy_sndframe:
Enva una trama.
*/
short int phy_sndframe(const void *, short int);
/*
Funcin phy_capframe:
Captura una trama.
*/
int phy_capframe(short int);
/*
Funcin phy_getframe:
Obtiene una trama capturada previamente.
*/
short int phy_getframe(void *, short int);
/*
Funcin phy_notify:
Define una funcin manejadora de tramas capturadas.
*/
void phy_notify(void (*func)(void));
/*
Funcin phy_poll:
Verifica la captura de una trama.
*/
int phy_poll(void);
/*
Funcin phy_rsdframe:
Reenva una trama.
*/
int phy_rsdframe(void);
/*
Funcin phy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int phy_clrbuffer(void);
/*
Funcin phy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int phy_sensechannel(unsigned char, long int);
/*
Funcin phy_gennoisesignal:
Genera una seal de ruido.
*/
int phy_gennoisesignal(void);
/*
Funcin phy_tstsignal1:
Genera una seal de prueba 1.
*/
int phy_tstsignal1(void);
FernandoArielBeunza79156 589
Tesis de Grado en Ingeniera Informtica
/*
Funcin phy_tstsignal2:
Genera una seal de prueba 2.
*/
int phy_tstsignal2(void);
/*
Funcin phy_tstreceive:
Realiza una prueba de recepcin.
*/
int phy_tstreceive(void);
/*
Interrupcin INT0:
Procesa la seal recibida.
*/
extern void __phy_int0__(void) __interrupt 0;
#endif
/* Variables globales. */
/*
Funcin phy_init:
Inicializa los recursos utilizados por la capa fsica.
*/
void phy_init(void)
{
/* Inicializa TXDAT y TXCLK. */
P1 |= 0x03;
590 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
reset_watchdog();
}
/*
Funcin phy_release:
Libera los recursos utilizados por la capa fsica.
*/
void phy_release(void)
{
reset_watchdog();
__phy_recfun__ = NULL;
}
/*
Funcin phy_sndframe:
Enva una trama.
*/
short int phy_sndframe(const void *dat, short int size)
{
/* Variables. */
register short int send; /* Cantidad de bytes enviados. */
register unsigned char ea; /* Estado de las interrupciones. */
unsigned char *ptr; /* Puntero a la trama. */
/* Enva la trama. */
ptr = (unsigned char *) dat;
while(send)
{
__phy_buffbyte__ = *((__xdata unsigned char *) ptr);
if (!__phy_sendbyte__()) break;
*((__xdata unsigned char *) ptr) = __phy_buffbyte__;
send --;
ptr ++;
}
FernandoArielBeunza79156 591
Tesis de Grado en Ingeniera Informtica
__endasm;
}
/*
Funcin phy_capframe:
Captura una trama.
*/
int phy_capframe(short int size)
{
/* Variables. */
unsigned char hsize; /* Parte alta de la cantidad de
bytes a capturar. */
unsigned char lsize; /* Parte baja de la cantidad de
bytes a capturar. */
register unsigned char ea; /* Estado de las interrupciones. */
592 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
__phy_waitendop__();
EA = ea;
return 0;
}
__phy_waitendop__();
/* xito. */
EA = ea;
return 1;
}
/*
Funcin phy_getframe:
Obtiene una trama capturada previamente.
*/
short int phy_getframe(void *dat, short int size)
{
/* Variables. */
register short int receive; /* Cantidad de bytes recibidos. */
register unsigned char ea; /* Estado de las interrupciones. */
unsigned char *ptr; /* Puntero a la trama. */
/* Obtiene la trama. */
ptr = (unsigned char *) dat;
while(receive)
{
__phy_buffbyte__ = 0xff;
if (!__phy_sendbyte__()) break;
*((__xdata unsigned char *) ptr) = __phy_buffbyte__;
receive --;
ptr ++;
}
__phy_waitendop__();
/*
FernandoArielBeunza79156 593
Tesis de Grado en Ingeniera Informtica
Funcin phy_notify:
Define una funcin manejadora de tramas capturadas.
*/
void phy_notify(void (*func)(void))
{
/* Define el manejador. */
__phy_recfun__ = func;
/*
Funcin phy_poll:
Verifica la captura de una trama.
*/
int phy_poll(void)
{
reset_watchdog();
if (P3 & 0x04) return 0;
return 1;
}
/*
Funcin phy_rsdframe:
Reenva una trama.
*/
int phy_rsdframe(void)
{
/* Variables. */
register unsigned char ea; /* Estado de las interrupciones. */
594 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* xito. */
return 1;
}
/*
Funcin phy_clrbuffer:
Limpia el buffer de captura de tramas.
*/
int phy_clrbuffer(void)
{
return __phy_sendop__(PHY_CRBUFFOP);
}
/*
Funcin phy_sensechannel:
Sensa el estado del canal de comunicacin.
*/
int phy_sensechannel(unsigned char thrl, long int usecs)
{
/* Variables. */
int busych; /* Indicador de canal ocupado. */
unsigned char thrlevel; /* Nivel de umbral de deteccin de
ocupacin de canal de
comunicacin. */
register unsigned char ea; /* Estado de las interrupciones. */
FernandoArielBeunza79156 595
Tesis de Grado en Ingeniera Informtica
/*
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);
}
/*
Interrupcin INT0:
Procesa la seal recibida.
*/
void __phy_int0__(void) __interrupt 0
{
cli();
596 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
reset_watchdog();
if (__phy_recfun__) __phy_recfun__();
sei();
}
/*
Funcin __phy_waitendop__:
Espera fin de recepcin de operacin.
*/
static void __phy_waitendop__(void)
{
/* Variables. */
unsigned short int i; /* Contador. */
/*
Funcin __phy_sendbyte__:
Enva un byte del mensaje.
*/
static int __phy_sendbyte__(void)
{
/* Variables. */
register short int i; /* 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;
FernandoArielBeunza79156 597
Tesis de Grado en Ingeniera Informtica
mov C, P3.4 ;
clr P1.1 ; Enva el bit 1.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Enva el bit 2.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Enva el bit 3.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Enva el bit 4.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Enva el bit 5.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Enva el bit 6.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Enva el bit 7.
rlc a ;
mov P1.0, C ;
setb P1.1 ;
nop ;
mov C, P3.4 ;
clr P1.1 ; Fin.
rlc a ;
setb P1.0 ;
mov ___phy_buffbyte__, a ;
nop ;
pop psw ;
pop acc ;
__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; /* Estado de las interrupciones. */
/* Reinicia el watchdog. */
reset_watchdog();
598 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* xito. */
return 1;
}
#if !defined(__MAC_H__)
#define __MAC_H__
/* Definicin de tipos. */
/* Definicin de constantes. */
#define MAC_HEADERSIZE sizeof(__mac_header__)
#define MAC_FCSSIZE sizeof(unsigned short int)
/* 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
Tesis de Grado en Ingeniera Informtica
MAC_BROADCASTADDR_6, MAC_BROADCASTADDR_7
};
/*
Funcin mac_init:
Inicializa los recursos utilizados por la subcapa MAC.
*/
void mac_init(void);
/*
Funcin mac_release:
Libera los recursos utilizados por la subcapa MAC.
*/
void mac_release(void);
/*
Funcin mac_send:
Enva un mensaje por medio de la subcapa MAC.
*/
short int mac_send(mac_addr, unsigned char, unsigned char, const void *,
short int);
/*
Funcin mac_receive:
Recibe un mensaje por medio de la subcapa MAC.
*/
short int mac_receive(mac_addr, unsigned char *, void *, short int);
/*
Funcin mac_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void mac_notify(void (*func)(mac_addr, unsigned char, void *, short int));
/*
Funcin mac_poll:
Verifica la llegada de un nuevo mensaje.
*/
int mac_poll(void);
/*
Funcin mac_acceptprotocol:
Establece la recepcin de mensajes cuyo identificador de protocolo coincide
con el especificado.
*/
int mac_acceptprotocol(unsigned char);
/*
Funcin mac_rejectprotocol:
Bloquea la recepcin de mensajes cuyo identificador de protocolo coincide
con el especificado.
*/
int mac_rejectprotocol(unsigned char);
/*
Funcin mac_status:
Devuelve el estado del dispositivo.
*/
int mac_status(void);
/*
Funcin mac_getaddress:
Devuelve la direccin fsica del dispositivo.
*/
void mac_getaddress(mac_addr);
#endif
600 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Definicin de constantes. */
/* Variables globales. */
FernandoArielBeunza79156 601
Tesis de Grado en Ingeniera Informtica
__reentrant;
/*
Funcin mac_init:
Inicializa los recursos utilizados por la subcapa MAC.
*/
void mac_init(void)
{
/* Variables. */
unsigned char i; /* ndice de tabla de bloqueo de
protocolos. */
/*
Funcin mac_release:
Libera los recursos utilizados por la subcapa MAC.
*/
void mac_release(void)
{
phy_notify(NULL);
phy_release();
}
/*
Funcin mac_send:
602 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Enva el mensaje. */
phy_notify(NULL);
rsend = 0;
fragsize = MAC_FRAGMENTSIZE;
for(retries = 0; (retries < MAC_MAXRETRIES) && (msgsize); )
{
/* Agrega un tiempo de espera pseudoaleatorio. */
if (retries)
{
__mac_randnum__ = ((__mac_randnum__ << 7) ^
(__mac_randnum__ & 0x80)) |
(__mac_randnum__ >> 1);
wait = __mac_randnum__;
if (retries < 5)
wait %= (2 << (retries + 5));
else
wait %= (2 << 10);
while(wait--) wait_usecs(MAC_UNITTIME);
}
retries ++;
FernandoArielBeunza79156 603
Tesis de Grado en Ingeniera Informtica
604 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
if (__mac_sensechannel__(1))
{
frag ++;
tosend -= fragsize;
ptrmsg += fragsize;
rsend = 0;
continue;
}
}
wait_usecs(MAC_IFS);
rsend = 1;
/*
Funcin mac_receive:
Recibe un mensaje por medio de la subcapa MAC.
*/
short int mac_receive(mac_addr addr, unsigned char *prot, void *msg,
short int msgsize)
{
/* Verifica que el dispositivo no se haya desactivado por sobrepasar el
contador de errores. */
reset_watchdog();
if (__mac_errors__ > MAC_MAXERRORS) return 0;
/*
Funcin mac_notify:
Define una funcin manejadora de mensajes recibidos.
*/
FernandoArielBeunza79156 605
Tesis de Grado en Ingeniera Informtica
/*
Funcin mac_poll:
Verifica la llegada de un nuevo mensaje.
*/
int mac_poll(void)
{
reset_watchdog();
if (__mac_errors__ > MAC_MAXERRORS) return 0;
return (__mac_msg_size2__ != 0);
}
/*
Funcin mac_acceptprotocol:
Establece la recepcin de mensajes cuyo identificador de protocolo coincide
con el especificado.
*/
int mac_acceptprotocol(unsigned char prot)
{
/* Verifica que el dispositivo no se haya desactivado por sobrepasar el
contador de errores. */
reset_watchdog();
if (__mac_errors__ > MAC_MAXERRORS) return 0;
/*
Funcin mac_rejectprotocol:
Bloquea la recepcin de mensajes cuyo identificador de protocolo coincide
con el especificado.
*/
int mac_rejectprotocol(unsigned char prot)
{
/* Verifica que el dispositivo no se haya desactivado por sobrepasar el
contador de errores. */
reset_watchdog();
if (__mac_errors__ > MAC_MAXERRORS) return 0;
/*
Funcin mac_status:
Devuelve el estado del dispositivo.
*/
int mac_status(void)
{
reset_watchdog();
return (__mac_errors__ <= MAC_MAXERRORS);
}
/*
Funcin mac_getaddress:
606 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __mac_procmsg__:
Procesa un mensaje recibido por medio de la capa fsica.
*/
static void __mac_procmsg__(void)
{
/* Variables. */
int error; /* Indicador de error. */
int recstatus; /* Resultado de la recepcin del
mensaje. */
short int msgsize; /* Tamao del mensaje recibido. */
short int totalsize; /* Tamao total del mensaje. */
unsigned char msgtype; /* Tipo del mensaje recibido. */
unsigned char protocol; /* Identificador de protocolo. */
unsigned char fragment; /* Nmero de fragmento. */
mac_addr src_addr; /* Direccin de origen del
mensaje. */
mac_addr dest_addr; /* Direccin de destino del
mensaje. */
FernandoArielBeunza79156 607
Tesis de Grado en Ingeniera Informtica
/*
Funcin __mac_sensechannel__:
Sensa el estado del canal de comunicacin para obtener la confirmacin de
608 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
recepcin de un mensaje.
*/
static int __mac_sensechannel__(int wait)
{
/* Variables. */
int chstatus; /* Estado del canal de
comunicacin. */
short int i; /* Contador. */
/*
Funcin __mac_sendmsg__:
Arma y enva un mensaje por medio de la capa fsica.
*/
static int __mac_sendmsg__(mac_addr addr, unsigned char type,
unsigned char prot, unsigned char frag,
short int size, short int tsize, const void *msg)
{
/* Variables. */
short int msgsize; /* Tamao del mensaje. */
__mac_header__ *mac_header; /* Encabezado del mensaje. */
unsigned char buffer[MAC_HEADERSIZE +
MAC_FRAGMENTSIZE + MAC_FCSSIZE]; /* Buffer para el armado del
mensaje. */
FernandoArielBeunza79156 609
Tesis de Grado en Ingeniera Informtica
/*
Funcin __mac_receivemsg__:
Recibe y desarma un mensaje para ser enviado por medio de la capa fsica.
*/
static unsigned char __mac_receivemsg__(unsigned char *msg, mac_addr src_addr,
mac_addr dest_addr,
unsigned char *type,
unsigned char *prot,
unsigned char *frag, short int *size,
short int *tsize)
{
/* Variables. */
short int msgsize; /* Tamao del mensaje recibido. */
short int datsize; /* Tamao de los datos del mensaje
recibido. */
unsigned char msgtype; /* Tipo del mensaje recibido. */
unsigned char recstatus; /* Resultado de la recepcin del
mensaje. */
__mac_header__ *mac_header; /* Encabezado del mensaje. */
unsigned char buffer[MAC_HEADERSIZE +
MAC_FRAGMENTSIZE + MAC_FCSSIZE]; /* Buffer para desarmado de
mensaje. */
610 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#if !defined(__LLC_H__)
#define __LLC_H__
/* Definicin de tipos. */
/* Definicin de constantes. */
#define LLC_FCSSIZE sizeof(unsigned short int)
#define LLC_PAYLOADSIZE (MAC_PAYLOADSIZE - LLC_FCSSIZE)
#define __llc_broadcastaddr__ __mac_broadcastaddr__
/*
Funcin llc_init:
Inicializa los recursos utilizados por la subcapa LLC.
*/
void llc_init(void);
/*
Funcin llc_release:
FernandoArielBeunza79156 611
Tesis de Grado en Ingeniera Informtica
/*
Funcin llc_open:
Abre una conexin por medio de la subcapa LLC.
*/
int llc_open(unsigned char);
/*
Funcin llc_close:
Cierra una conexin por medio de la subcapa LLC.
*/
int llc_close(int);
/*
Funcin llc_send:
Enva un mensaje por medio de la subcapa LLC.
*/
short int llc_send(int, llc_addr, unsigned char, const void *, short int);
/*
Funcin llc_receive:
Recibe un mensaje por medio de la subcapa LLC.
*/
short int llc_receive(int, llc_addr, void *, short int);
/*
Funcin llc_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int llc_notify(int, void (*func)(llc_addr, void *, short int));
/*
Funcin llc_poll:
Verifica la llegada de un nuevo mensaje.
*/
int llc_poll(int);
/*
Funcin llc_status:
Devuelve el estado del dispositivo.
*/
#define llc_status()\
mac_status()
/*
Funcin llc_getaddress:
Devuelve la direccin fsica del dispositivo.
*/
#define llc_getaddress(addr)\
mac_getaddress(addr)
#endif
612 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#include <string.h>
#include "common.h"
#include "mac.h"
#include "llc.h"
/* Variables globales. */
/* Tabla de conexiones. */
static volatile struct llc_table
{
unsigned char protocol; /* Protocolo. */
llc_addr src_addr; /* Direccin de origen. */
short int size; /* Tamao del mensaje almacenado en
el buffer. */
unsigned char buffer[LLC_PAYLOADSIZE]; /* Buffer de recepcin de
mensajes. */
void (*recfun)
(llc_addr, void *, short int)
__reentrant; /* Funcin manejadora de mensajes
recibidos.*/
} __llc_table__[LLC_CONNECTIONS];
/*
Funcin llc_init:
Inicializa los recursos utilizados por la subcapa LLC.
*/
void llc_init(void)
{
/* Variables. */
unsigned char con; /* Nmero de conexin. */
/*
Funcin llc_open:
Abre una conexin por medio de la subcapa LLC.
*/
int llc_open(unsigned char prot)
{
/* Variables. */
int con; /* Nmero de conexin. */
FernandoArielBeunza79156 613
Tesis de Grado en Ingeniera Informtica
/*
Funcin llc_close:
Cierra una conexin por medio de la subcapa LLC.
*/
int llc_close(int handle)
{
/* Verifica que el manejador de conexin sea vlido. */
if (!__llc_validhandle__(handle)) return 0;
/* Libera la conexin. */
mac_rejectprotocol(__llc_table__[handle].protocol);
__llc_table__[handle].protocol = 0;
return 1;
}
/*
Funcin llc_send:
Enva un mensaje por medio de la subcapa LLC.
*/
short int llc_send(int handle, llc_addr dest_addr, unsigned char prio,
const void *msg, short int msgsize)
{
/* Variables. */
short int size; /* Cantidad de bytes a enviar. */
unsigned char buffer[LLC_PAYLOADSIZE +
LLC_FCSSIZE]; /* Buffer para armado de
mensaje. */
/* Enva el mensaje. */
size = msgsize + LLC_FCSSIZE;
if (mac_send(dest_addr, prio + 1, __llc_table__[handle].protocol, buffer,
size) == size)
return msgsize;
return 0;
614 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin llc_receive:
Recibe un mensaje por medio de la subcapa LLC.
*/
short int llc_receive(int handle, llc_addr addr, void *msg, short int msgsize)
{
/* Verifica que el manejador de conexin sea vlido. */
if (!__llc_validhandle__(handle)) return 0;
/*
Funcin llc_notify:
Define una funcin manejadora de mensajes recibidos.
*/
int llc_notify(int handle, void (*func)(llc_addr, void *, short int))
{
/* Verifica que el manejador de conexin sea vlido. */
if (!__llc_validhandle__(handle)) return -1;
/*
Funcin llc_poll:
Verifica la llegada de un nuevo mensaje.
*/
int llc_poll(int handle)
{
/* Verifica que el manejador de conexin sea vlido. */
if (!__llc_validhandle__(handle)) return -1;
/*
Funcin __llc_procmsg__:
Procesa un mensaje recibido por medio de la subcapa MAC.
*/
static void __llc_procmsg__(mac_addr addr, unsigned char prot, void *msg,
short int msgsize) __reentrant
{
/* Variables. */
int con; /* Nmero de conexin registrada. */
unsigned char *rmsg; /* Puntero al mensaje recibido. */
FernandoArielBeunza79156 615
Tesis de Grado en Ingeniera Informtica
reset_watchdog();
rmsg = (unsigned char *) msg;
if (msgsize <= LLC_FCSSIZE) return;
msgsize -= LLC_FCSSIZE;
if (msgsize > LLC_PAYLOADSIZE) return;
/*
Funcin __llc_validhandle__:
Verifica que el manejador de conexin sea vlido.
*/
static int __llc_validhandle__(int handle)
{
reset_watchdog();
return ((handle >= 0) && (handle < LLC_CONNECTIONS));
}
/*
Funcin __llc_findconn__:
Devuelve el manejador de la conexin solicitada.
*/
static int __llc_findconn__(unsigned char prot)
{
/* Variables. */
unsigned char con; /* Nmero de conexin. */
/* Conexin no encontrada. */
return -1;
}
616 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
arp.h:
Declaracin de funciones referentes al protocolo de resolucin de
direcciones lgicas (ARP).
*/
#if !defined(__ARP_H__)
#define __ARP_H__
/* Definicin de tipos. */
typedef unsigned long int arp_logaddr;
/*
Funcin arp_init:
Inicializa los recursos utilizados por ARP.
*/
void arp_init(void);
/*
Funcin arp_release:
Libera los recursos utilizados por ARP.
*/
void arp_release(void);
/*
Funcin arp_addaddress:
Agrega una nueva direccin lgica al dispositivo.
*/
int arp_addaddress(unsigned char, arp_logaddr);
/*
Funcin arp_deladdress:
Elimina una direccin lgica al dispositivo.
*/
int arp_deladdress(unsigned char, arp_logaddr);
/*
Funcin arp_getaddress:
Devuelve la direccin fsica asociada a la direccin lgica y protocolo.
*/
int arp_getaddress(unsigned char, arp_logaddr, llc_addr);
#endif
FernandoArielBeunza79156 617
Tesis de Grado en Ingeniera Informtica
#include "arp.h"
/* Definicin de tipos. */
/* Mensaje ARP. */
typedef struct
{
unsigned char type; /* Tipos de mensaje. */
unsigned char protocol; /* Protocolo. */
arp_logaddr address; /* Direccin lgica. */
} __arp_msg__;
/* Variables globales. */
/* Tabla de direcciones. */
static volatile struct arp_table
{
unsigned char protocol; /* Protocolo. */
arp_logaddr address; /* Direccin. */
} __arp_table__[ARP_ADDRESS];
/*
Funcin arp_init:
Inicializa los recursos utilizados por ARP.
*/
void arp_init(void)
{
/* Variables. */
unsigned char dir; /* Nmero de direccin. */
/*
Funcin arp_release:
Libera los recursos utilizados por ARP.
*/
void arp_release(void)
{
/* Cierra la conexin utilizada para ARP. */
llc_close(__arp_conn__);
618 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin arp_addaddress:
Agrega una nueva direccin lgica al dispositivo.
*/
int arp_addaddress(unsigned char prot, arp_logaddr addr)
{
/* Variables. */
unsigned char dir; /* Nmero de direccin. */
/* Agrega la direccin. */
llc_notify(__arp_conn__, NULL);
__arp_table__[dir].protocol = prot;
__arp_table__[dir].address = addr;
llc_notify(__arp_conn__, __arp_procmsg__);
return 1;
}
/*
Funcin arp_deladdress:
Elimina una direccin lgica al dispositivo.
*/
int arp_deladdress(unsigned char prot, arp_logaddr addr)
{
/* Variables. */
int dir; /* Nmero de direccin. */
/*
Funcin arp_getaddress:
Devuelve la direccin fsica asociada a la direccin lgica y protocolo.
*/
int arp_getaddress(unsigned char prot, arp_logaddr laddr, llc_addr paddr)
{
/* Variables. */
short int i; /* Contador. */
FernandoArielBeunza79156 619
Tesis de Grado en Ingeniera Informtica
/* Espera respuesta. */
for(i = 0; (i < 3000) && (!llc_poll(__arp_conn__)); i++)
wait_usecs(1000);
}
620 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __arp_findaddr__:
Devuelve el nmero de direccin almacenada en la tabla.
*/
static int __arp_findaddr__(unsigned char prot, arp_logaddr addr)
{
/* Variables. */
int dir; /* Nmero de direccin. */
/* Conexin no encontrada. */
return -1;
}
/*
Funcin __arp_procmsg__:
Procesa un mensaje recibido por medio de la subcapa LLC.
*/
static void __arp_procmsg__(llc_addr addr, void *msg, short int msgsize)
__reentrant
{
/* Variables. */
__arp_msg__ *amsg; /* Mensaje ARP. */
#if !defined(__DL_H__)
#define __DL_H__
FernandoArielBeunza79156 621
Tesis de Grado en Ingeniera Informtica
#include "arp.h"
/* Definicin de tipos. */
/* Definicin de constantes. */
#define DL_PAYLOADSIZE LLC_PAYLOADSIZE
/*
Funcin dl_init:
Inicializa los recursos utilizados por la capa de enlace.
*/
int dl_init(unsigned char);
/*
Funcin dl_release:
Libera los recursos utilizados por la capa de enlace.
*/
int dl_release(unsigned char);
/*
Funcin dl_open:
Abre una conexin por medio de la capa de enlace.
*/
int dl_open(unsigned char, unsigned char);
/*
Funcin dl_close:
Cierra una conexin por medio de la capa de enlace.
*/
#define dl_close(hd)\
llc_close(hd)
/*
Funcin dl_send:
Enva un mensaje por medio de la capa de enlace.
*/
#define dl_send(hd, paddr, prio, msg, size)\
llc_send(hd, paddr, prio, msg, size)
/*
Funcin dl_receive:
Recibe un mensaje por medio de la capa de enlace.
*/
#define dl_receive(hd, paddr, msg, size)\
llc_receive(hd, paddr, msg, size)
/*
Funcin dl_notify:
Define una funcin manejadora de mensajes recibidos.
*/
#define dl_notify(hd, func)\
llc_notify(hd, func)
/*
Funcin dl_poll:
Verifica la llegada de un nuevo mensaje.
*/
#define dl_poll(hd)\
llc_poll(hd)
622 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin dl_getaddress:
Devuelve la direccin fsica del dispositivo.
*/
int dl_getaddress(unsigned char, dl_addr);
/*
Funcin dl_addlogaddress:
Agrega una nueva direccin lgica al dispositivo.
*/
int dl_addlogaddress(unsigned char, unsigned char, dl_logaddr);
/*
Funcin dl_dellogaddress:
Elimina una direccin lgica al dispositivo.
*/
int dl_dellogaddress(unsigned char, unsigned char, dl_logaddr);
/*
Funcin dl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica y protocolo.
*/
int dl_getphyaddress(unsigned char, unsigned char, dl_logaddr, dl_addr);
/*
Funcin dl_status:
Devuelve el estado de la interfaz especificada del dispositivo.
*/
int dl_status(unsigned char);
/*
Funcin dl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje.
*/
short int dl_getpayloadsize(unsigned char);
#endif
/*
Funcin dl_init:
Inicializa los recursos utilizados por la capa de enlace.
*/
int dl_init(unsigned char iface)
{
if (iface != 0) return -1;
arp_init();
return 1;
}
/*
FernandoArielBeunza79156 623
Tesis de Grado en Ingeniera Informtica
Funcin dl_release:
Libera los recursos utilizados por la capa de enlace.
*/
int dl_release(unsigned char iface)
{
if (iface != 0) return -1;
arp_release();
return 1;
}
/*
Funcin dl_open:
Abre una conexin por medio de la capa de enlace.
*/
int dl_open(unsigned char iface, unsigned char prot)
{
if (iface != 0) return -1;
return llc_open(prot + LLC_UNUSEDPROT);
}
/*
Funcin dl_getaddress:
Devuelve la direccin fsica del dispositivo.
*/
int dl_getaddress(unsigned char iface, dl_addr addr)
{
if (iface != 0) return -1;
llc_getaddress(addr);
return 1;
}
/*
Funcin dl_addlogaddress:
Agrega una nueva direccin lgica al dispositivo.
*/
int dl_addlogaddress(unsigned char iface, unsigned char prot, dl_logaddr laddr)
{
if (iface != 0) return -1;
return arp_addaddress(ARP_UNUSEDPROT + prot, laddr);
}
/*
Funcin dl_dellogaddress:
Elimina una direccin lgica al dispositivo.
*/
int dl_dellogaddress(unsigned char iface, unsigned char prot, dl_logaddr laddr)
{
if (iface != 0) return -1;
return arp_deladdress(ARP_UNUSEDPROT + prot, laddr);
}
/*
Funcin dl_getphyaddress:
Devuelve la direccin fsica asociada a la direccin lgica y protocolo.
*/
int dl_getphyaddress(unsigned char iface, unsigned char prot, dl_logaddr laddr,
dl_addr paddr)
{
if (iface != 0) return -1;
return arp_getaddress(ARP_UNUSEDPROT + prot, laddr, paddr);
}
/*
Funcin dl_status:
Devuelve el estado de la interfaz especificada del dispositivo.
*/
int dl_status(unsigned char iface)
{
if (iface != 0) return 0;
return llc_status();
}
624 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin dl_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje.
*/
short int dl_getpayloadsize(unsigned char iface)
{
if (iface != 0) return -1;
return DL_PAYLOADSIZE;
}
#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;
/* Definicin de constantes. */
#define NET_HEADERSIZE sizeof(__net_header__)
#define NET_FCSSIZE sizeof(unsigned short int)
/*
Funcin net_init:
Inicializa los recursos utilizados por la capa de red.
*/
void net_init(void);
/*
Funcin net_release:
Libera los recursos utilizados por la capa de red.
*/
void net_release(void);
/*
Funcin net_send:
FernandoArielBeunza79156 625
Tesis de Grado en Ingeniera Informtica
/*
Funcin net_receive:
Recibe un mensaje por medio de la capa de red.
*/
short int net_receive(net_msgid *, unsigned char *, void *, short int);
/*
Funcin net_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void net_notify(void (*func)(net_msgid, unsigned char, void *, short int));
/*
Funcin net_poll:
Verifica la llegada de un nuevo mensaje.
*/
int net_poll(void);
/*
Funcin net_addaddr:
Agrega una nueva direccin de nodo.
*/
int net_addaddr(net_nodeid);
/*
Funcin net_deladdr:
Elimina una direccin de nodo existente.
*/
int net_deladdr(net_nodeid);
/*
Funcin net_addmsgid:
Agrega un nuevo identificador de mensaje.
*/
int net_addmsgid(net_msgid);
/*
Funcin net_delmsgid:
Elimina un identificador de mensaje.
*/
int net_delmsgid(net_msgid);
/*
Funcin net_status:
Devuelve el estado del dispositivo.
*/
int net_status(void);
/*
Funcin net_getpayloadsize:
Devuelve la cantidad mxima de bytes que debe contener un mensaje para
poder ser enviado por cualquier interfaz.
*/
short int net_getpayloadsize(void);
#endif
626 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
*/
/* Variables globales. */
/* Tabla de interfaces. */
static struct net_interfacetable
{
int hd; /* Manejador de conexin. */
unsigned char msgfilter[32]; /* Filtro de mensajes. */
} __net_interfacetable__[NET_PHYINTERFACES];
/*
Funcin net_init:
Inicializa los recursos utilizados por la capa de red.
*/
void net_init(void)
{
/* Variables. */
unsigned char iface; /* Identificador de interface. */
unsigned char filter; /* ndice de filtro de mensajes. */
FernandoArielBeunza79156 627
Tesis de Grado en Ingeniera Informtica
reset_watchdog();
__net_interfacetable__[iface].msgfilter[filter] = 0x00;
}
}
/*
Funcin net_release:
Libera los recursos utilizados por la capa de red.
*/
void net_release(void)
{
/* Variables. */
unsigned char iface; /* Identificador de interface. */
/*
Funcin net_send:
Enva un mensaje por medio de la capa de red.
*/
short int net_send(net_nodeid nodeid, net_msgid msgid, unsigned char prio,
unsigned char prot, const void *msg, short int msgsize)
{
/* Variables. */
int ack; /* Indicador de envo correcto. */
unsigned char iface; /* Identificador de interface. */
dl_addr dest_addr; /* Direccin fsica de destino. */
628 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
dest_addr[1] = 0xff;
dest_addr[2] = 0xff;
dest_addr[3] = 0xff;
dest_addr[4] = 0xff;
dest_addr[5] = 0xff;
dest_addr[6] = 0xff;
dest_addr[7] = 0xff;
}
/*
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. */
/*
Funcin net_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void net_notify(void (*func)(net_msgid, unsigned char, void *, short int))
{
/* Define la funcin manejadora de mensajes recibidos. */
reset_watchdog();
__net_recfun__ = func;
FernandoArielBeunza79156 629
Tesis de Grado en Ingeniera Informtica
/*
Funcin net_poll:
Verifica la llegada de un nuevo mensaje.
*/
int net_poll(void)
{
reset_watchdog();
return (__net_msg_size__ != 0);
}
/*
Funcin net_addaddr:
Agrega una nueva direccin de nodo.
*/
int net_addaddr(net_nodeid nodeid)
{
/* Variables. */
unsigned char iface; /* Identificador de interface. */
/*
Funcin net_deladdr:
Elimina una direccin de nodo existente.
*/
int net_deladdr(net_nodeid nodeid)
{
/* Variables. */
unsigned char iface; /* Identificador de interface. */
/*
Funcin net_addmsgid:
Agrega un nuevo identificador de mensaje.
*/
int net_addmsgid(net_msgid msgid)
{
/* Variables. */
int result; /* Resultado. */
unsigned char iface; /* Identificador de interface. */
630 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
/* Verifica que la ruta se encuentre definida. */
reset_watchdog();
if (__net_interfacetable__[iface].hd < 0) continue;
/*
Funcin net_delmsgid:
Elimina un identificador de mensaje.
*/
int net_delmsgid(net_msgid msgid)
{
/* Variables. */
int result; /* Resultado. */
unsigned char iface; /* Identificador de interface. */
/*
Funcin net_status:
Devuelve el estado del dispositivo.
*/
int net_status(void)
{
/* Variables. */
unsigned char iface; /* Identificador de interface. */
/*
Funcin net_getpayloadsize:
Devuelve la cantidad mxima de bytes que debe contener un mensaje para
poder ser enviado por cualquier interfaz.
*/
short int net_getpayloadsize(void)
{
/* Variables. */
short int payload; /* Capacidad mxima del mensaje. */
unsigned char iface; /* Identificador de interface. */
FernandoArielBeunza79156 631
Tesis de Grado en Ingeniera Informtica
payload = NET_PAYLOADSIZE;
for(iface = 0; iface < NET_PHYINTERFACES; iface++)
{
if (payload > dl_getpayloadsize(iface))
payload = dl_getpayloadsize(iface);
}
return payload - NET_HEADERSIZE - NET_FCSSIZE;
}
/*
Funcin __net_procmsg__:
Procesa un mensaje recibido por medio de la capa de enlace.
*/
static void __net_procmsg__(dl_addr addr, void *msg, short int msgsize)
__reentrant
{
/* Variables. */
short int size; /* Tamao del mensaje recibido. */
unsigned char iface; /* Identificador de interface. */
unsigned char msgid; /* Identificador de mensaje. */
unsigned char filter; /* Filto de mensajes. */
unsigned char version; /* Versin del protocolo de red. */
unsigned char protocol; /* Protocolo del mensaje. */
unsigned char *rmsg; /* Puntero al mensaje recibido. */
__net_header__ *net_header; /* Encabezado del mensaje. */
632 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __net_send__:
Enva un mensaje por medio de la capa de red.
*/
static short int __net_send__(unsigned char iface, dl_addr addr,
net_msgid msgid, unsigned char prio,
unsigned char prot, short int msgsize,
const void *msg)
{
/* Variables. */
short int size; /* Cantidad de bytes a enviar. */
__net_header__ *net_header; /* Encabezado del mensaje. */
unsigned char buffer[NET_HEADERSIZE +
NET_PAYLOADSIZE + NET_FCSSIZE]; /* Buffer para armado de
mensaje. */
/* Enva el mensaje. */
size = NET_HEADERSIZE + msgsize + NET_FCSSIZE;
if (dl_send(__net_interfacetable__[iface].hd, addr, prio, buffer,
size) == size)
return msgsize;
return 0;
}
#if !defined(__TP_H__)
#define __TP_H__
FernandoArielBeunza79156 633
Tesis de Grado en Ingeniera Informtica
#include "config.h"
#include "net.h"
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char tp_grpid;
/* Definicin de constantes. */
#define TP_HEADERSIZE sizeof(__tp_header__)
#define TP_PAYLOADSIZE (NET_PAYLOADSIZE - TP_HEADERSIZE)
/*
Funcin tp_init:
Inicializa los recursos utilizados por la capa de transporte.
*/
void tp_init(void);
/*
Funcin tp_release:
Libera los recursos utilizados por la capa de transporte.
*/
void tp_release(void);
/*
Funcin tp_send:
Enva un mensaje por medio de la capa de transporte.
*/
short int tp_send(tp_grpid, unsigned char, const void *, short int);
/*
Funcin tp_receive:
Recibe un mensaje por medio de la capa de transporte.
*/
short int tp_receive(tp_grpid *, void *, short int);
/*
Funcin tp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void tp_notify(void (*func)(tp_grpid, void *, short int));
/*
Funcin tp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int tp_poll(void);
/*
Funcin tp_setownergrp:
Establece el nodo como propietario del grupo especificado.
*/
int tp_setownergrp(tp_grpid);
/*
Funcin tp_setmembergrp:
Establece el nodo como miembro del grupo especificado.
*/
634 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
int tp_setmembergrp(tp_grpid);
/*
Funcin tp_leavegrp:
Desvincula el nodo del grupo especificado.
*/
int tp_leavegrp(tp_grpid);
/*
Funcin tp_status:
Devuelve el estado del dispositivo.
*/
int tp_status(void);
/*
Funcin tp_getpayloadsize:
Devuelve la cantidad mxima de bytes que debe contener un mensaje para
poder ser enviado por cualquier interfaz.
*/
short int tp_getpayloadsize(void);
#endif
/* Definicin de tipos. */
/* Variables globales. */
FernandoArielBeunza79156 635
Tesis de Grado en Ingeniera Informtica
/*
Funcin tp_init:
Inicializa los recursos utilizados por la capa de transporte.
*/
void tp_init(void)
{
/* Variables. */
unsigned char i; /* Contador. */
/*
Funcin tp_release:
Libera los recursos utilizados por la capa de transporte.
*/
void tp_release(void)
{
net_notify(NULL);
net_release();
}
/*
Funcin tp_send:
Enva un mensaje por medio de la capa de transporte.
*/
short int tp_send(tp_grpid grpid, unsigned char nosec, const void *msg,
short int msgsize)
{
/* Verifica que el tamao del mensaje no supere el mximo permitido. */
reset_watchdog();
if (msgsize > tp_getpayloadsize()) return 0;
636 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Enva el mensaje. */
if (nosec) return __tp_send__(0, grpid, TP_MAXPRIOMSG, -1, msgsize, msg);
if (__tp_send__(0, grpid, TP_MINPRIOMSG, __tp_sectable__[grpid], msgsize,
msg) == msgsize)
{
__tp_sectable__[grpid] ++;
if (__tp_sectable__[grpid] < 0) __tp_sectable__[grpid] = 0;
return msgsize;
}
return 0;
}
/*
Funcin tp_receive:
Recibe un mensaje por medio de la capa de transporte.
*/
short int tp_receive(tp_grpid *grpid, void *msg, short int msgsize)
{
/* Espera la llegada de un mensaje. */
while(!tp_poll());
/*
Funcin tp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void tp_notify(void (*func)(tp_grpid, void *, short int))
{
/* Define la funcin manejadora de mensajes recibidos. */
reset_watchdog();
__tp_recfun__ = func;
/*
Funcin tp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int tp_poll(void)
{
reset_watchdog();
return (__tp_msg__ != NULL);
}
/*
Funcin tp_setownergrp:
Establece el nodo como propietario del grupo especificado.
*/
int tp_setownergrp(tp_grpid grpid)
FernandoArielBeunza79156 637
Tesis de Grado en Ingeniera Informtica
{
/* Agrega la direccin. */
if (!net_addaddr(((net_nodeid) grpid) | 0x0100)) return 0;
/*
Funcin tp_setmembergrp:
Establece el nodo como miembro del grupo especificado.
*/
int tp_setmembergrp(tp_grpid grpid)
{
/* Verifica que el nodo no sea propietario y miembro simultneamente. */
if (__tp_ownergrptable__[grpid >> 3] & (1 << (grpid & 0x07)))
return 0;
/*
Funcin tp_leavegrp:
Desvincula el nodo del grupo especificado.
*/
int tp_leavegrp(tp_grpid grpid)
{
/* Elimina la direccin. */
net_deladdr(((net_nodeid) grpid) | 0x0100);
/*
Funcin tp_status:
Devuelve el estado del dispositivo.
*/
int tp_status(void)
{
reset_watchdog();
if (!__tp_status__) return 0;
return net_status();
}
/*
Funcin tp_getpayloadsize:
Devuelve la cantidad mxima de bytes que debe contener un mensaje para
poder ser enviado por cualquier interfaz.
*/
short int tp_getpayloadsize(void)
{
return net_getpayloadsize() - TP_HEADERSIZE;
}
638 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __tp_procmsg__:
Procesa un mensaje recibido por medio de la capa de red.
*/
static void __tp_procmsg__(net_msgid msgid, unsigned char prot, void *msg,
short int msgsize) __reentrant
{
/* Variables. */
char sequence; /* Nmero de secuencia del
mensaje. */
unsigned char *rmsg; /* Puntero al mensaje recibido. */
__tp_header__ *tp_header; /* Encabezado del mensaje. */
__tp_msg_fifo__ *ptrmsg; /* Puntero al mensaje. */
FernandoArielBeunza79156 639
Tesis de Grado en Ingeniera Informtica
{
ptrmsg->next = NULL;
return;
}
}
ptrmsg = ptrmsg->next;
}
else
{
__tp_msg__ = (__tp_msg_fifo__ *) __tp_msg_buffer__;
ptrmsg = __tp_msg__;
}
/*
Funcin __tp_send__:
Enva un mensaje por medio de la capa de transporte.
*/
static short int __tp_send__(net_nodeid nodeid, net_msgid msgid,
unsigned char prio, char sec,
short int msgsize, const void *msg)
{
/* Variables. */
short int size; /* Cantidad de bytes a enviar. */
__tp_header__ *tp_header; /* Encabezado del mensaje. */
unsigned char buffer[TP_HEADERSIZE +
TP_PAYLOADSIZE]; /* Buffer para armado de
mensaje. */
/* Enva el mensaje. */
size = TP_HEADERSIZE + msgsize;
if (net_send(nodeid, msgid, prio, TP_PROTID, buffer, size) == size)
return msgsize;
return 0;
}
640 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
sp.h:
Declaracin de funciones referentes a la capa de sesin.
*/
#if !defined(__SP_H__)
#define __SP_H__
/* Definicin de tipos. */
/* Identificador de grupo. */
typedef unsigned char sp_grpid;
/* Definicin de constantes. */
#define SP_HEADERSIZE sizeof(__sp_header__)
#define SP_PAYLOADSIZE (TP_PAYLOADSIZE - SP_HEADERSIZE)
/*
Funcin sp_init:
Inicializa los recursos utilizados por la capa de sesin.
*/
void sp_init(void);
/*
Funcin sp_release:
Libera los recursos utilizados por la capa de sesin.
*/
void sp_release(void);
/*
Funcin sp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int sp_publish(sp_grpid);
/*
Funcin sp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int sp_subscribe(sp_grpid);
/*
Funcin sp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int sp_leave(sp_grpid);
/*
Funcin sp_send:
Enva un mensaje por medio de la capa de sesin.
*/
short int sp_send(sp_grpid, unsigned char, const void *, short int);
/*
Funcin sp_receive:
FernandoArielBeunza79156 641
Tesis de Grado en Ingeniera Informtica
/*
Funcin sp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void sp_notify(void (*func)(sp_grpid, void *, short int));
/*
Funcin sp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int sp_poll(void);
/*
Funcin sp_status:
Devuelve el estado del dispositivo.
*/
int sp_status(void);
/*
Funcin sp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje.
*/
short int sp_getpayloadsize(void);
#endif
/* Variables globales. */
642 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin sp_init:
Inicializa los recursos utilizados por la capa de sesin.
*/
void sp_init(void)
{
/* Inicializa los recursos utilizados por la capa de transporte. */
tp_init();
/*
Funcin sp_release:
Libera los recursos utilizados por la capa de sesin.
*/
void sp_release(void)
{
tp_notify(NULL);
tp_release();
}
/*
Funcin sp_publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
int sp_publish(sp_grpid grpid)
{
return tp_setownergrp(grpid);
}
/*
Funcin sp_subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
int sp_subscribe(sp_grpid grpid)
{
return tp_setmembergrp(grpid);
}
/*
Funcin sp_leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int sp_leave(sp_grpid grpid)
{
return tp_leavegrp(grpid);
}
/*
Funcin sp_send:
Enva un mensaje por medio de la capa de sesin.
*/
short int sp_send(sp_grpid grpid, unsigned char nosec, const void *msg,
short int msgsize)
{
/* Variables. */
short int size; /* Cantidad de bytes a enviar. */
__sp_header__ *sp_header; /* Encabezado del mensaje. */
unsigned char buffer[SP_HEADERSIZE +
SP_PAYLOADSIZE]; /* Buffer para armado de
mensaje. */
FernandoArielBeunza79156 643
Tesis de Grado en Ingeniera Informtica
/* Enva el mensaje. */
size = SP_HEADERSIZE + msgsize;
if (tp_send(grpid, nosec, buffer, size) == size) return msgsize;
return 0;
}
/*
Funcin sp_receive:
Recibe un mensaje por medio de la capa de sesin.
*/
short int sp_receive(sp_grpid *grpid, void *msg, short int msgsize)
{
/* Espera la llegada de un mensaje. */
while(!sp_poll());
/*
Funcin sp_notify:
Define una funcin manejadora de mensajes recibidos.
*/
void sp_notify(void (*func)(sp_grpid, void *, short int))
{
/* Define la funcin manejadora de mensajes recibidos. */
reset_watchdog();
__sp_recfun__ = func;
/*
Funcin sp_poll:
Verifica la llegada de un nuevo mensaje.
*/
int sp_poll(void)
{
reset_watchdog();
return (__sp_msg_size__ != 0);
}
/*
Funcin sp_status:
Devuelve el estado del dispositivo.
*/
int sp_status(void)
{
644 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
return tp_status();
}
/*
Funcin sp_getpayloadsize:
Devuelve la cantidad mxima de bytes que puede contener un mensaje.
*/
short int sp_getpayloadsize(void)
{
return tp_getpayloadsize() - SP_HEADERSIZE;
}
/*
Funcin __sp_procmsg__:
Procesa un mensaje recibido por medio de la capa de transporte.
*/
static void __sp_procmsg__(tp_grpid grpid, void *msg, short int msgsize)
__reentrant
{
/* Variables. */
unsigned char *rmsg; /* Puntero al mensaje recibido. */
__sp_header__ *sp_header; /* Encabezado del mensaje. */
FernandoArielBeunza79156 645
Tesis de Grado en Ingeniera Informtica
/*
Funcin main:
Funcin principal.
*/
void main(void)
{
/* Variables. */
char line[MODPLC_CMDLINESIZE]; /* Lnea de comandos. */
646 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin modem_phymode:
Recibe y procesa comandos de la capa fsica.
*/
static void modem_phymode(void)
{
/* Variables. */
short int size; /* Tamao del mensaje. */
long int waittime; /* Tiempo de espera. */
unsigned char sig; /* Tipo de seal. */
unsigned char level; /* Nivel de seal. */
unsigned char iface; /* Identificador de interfaz
fsica. */
unsigned char *ptrval; /* Puntero al tiempo de espera. */
char line[MODPLC_CMDLINESIZE]; /* Lnea de comandos. */
unsigned char str[PHY_PAYLOADSIZE]; /* Mensaje de prueba. */
FernandoArielBeunza79156 647
Tesis de Grado en Ingeniera Informtica
else
modem_outputbyte(0);
}
648 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Comando desconocido. */
else
continue;
printf("\r\n");
}
/*
Funcin modem_dlmode:
Recibe y procesa comandos de la capa de enlace.
*/
static void modem_dlmode(void)
{
/* Variables. */
short int hd; /* Manejador de conexin. */
short int size; /* Tamao del mensaje. */
dl_addr dladdr; /* Direccin DL. */
dl_logaddr logaddr; /* Direccin lgica. */
unsigned char prio; /* Prioridad del mensaje. */
unsigned char prot; /* Identificador de protocolo. */
unsigned char iface; /* Identificador de interfaz
fsica. */
unsigned char *ptrval; /* Puntero a la direccin
lgica. */
char line[MODPLC_CMDLINESIZE]; /* Lnea de comandos. */
FernandoArielBeunza79156 649
Tesis de Grado en Ingeniera Informtica
/* Recibe comandos. */
reset_watchdog();
putchar(MODPLC_NORMPROMPT);
gets(line);
if (strceq(line, "")) continue;
650 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Comando desconocido. */
FernandoArielBeunza79156 651
Tesis de Grado en Ingeniera Informtica
else
continue;
printf("\r\n");
}
/*
Funcin modem_spmode:
Recibe y procesa comandos de la capa de la capa de sesin.
*/
static void modem_spmode(void)
{
/* Variables. */
unsigned char nosec; /* Indicador de mensaje fuera de
secuencia. */
short int size; /* Tamao del mensaje. */
sp_grpid grpid; /* Identificador de grupo. */
char line[MODPLC_CMDLINESIZE]; /* Lnea de comandos. */
unsigned char str[SP_PAYLOADSIZE]; /* Mensaje de prueba. */
/* Recibe comandos. */
reset_watchdog();
putchar(MODPLC_NORMPROMPT);
gets(line);
if (strceq(line, "")) continue;
652 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
modem_inputstream(&grpid, sizeof(grpid));
modem_inputstream(&nosec, sizeof(nosec));
modem_inputstream(&size, sizeof(size));
size = usl2b((unsigned short int) size);
modem_inputstream(str, size);
size = sp_send(grpid, nosec, str, size);
modem_outputint(size);
}
/* Comando desconocido. */
else
continue;
printf("\r\n");
}
/*
Funcin modem_outputbyte:
Enva un byte de datos.
*/
static void modem_outputbyte(unsigned char b)
{
reset_watchdog();
printf("\\%02X\r\n", b);
}
/*
Funcin modem_outputint:
Enva un entero de 16 bits de datos.
*/
static void modem_outputint(short int intval)
{
/* Variables. */
unsigned char *ptr; /* Puntero a los datos. */
FernandoArielBeunza79156 653
Tesis de Grado en Ingeniera Informtica
/*
Funcin modem_outputstream:
Enva una trama de datos.
*/
static void modem_outputstream(const void *str, short int size)
{
/* Variables. */
short int i; /* Contador. */
unsigned char *ptr; /* Puntero a los datos. */
/*
Funcin modem_inputstream:
Recibe una trama de datos.
*/
static void modem_inputstream(void *stream, short int size)
{
/* Variables. */
int i; /* Contador. */
char c; /* Caracter ledo. */
unsigned char dat; /* Byte ledo. */
unsigned char *ptrdat; /* Puntero a los datos. */
unsigned char *ptrline; /* Puntero a la lnea recibida. */
char line[MODPLC_CMDLINESIZE]; /* Lnea de comandos. */
654 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
reset();
return;
}
FernandoArielBeunza79156 655
Tesis de Grado en Ingeniera Informtica
*/
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
/* Capa de fsica. */
#endif
#if !defined(__PHY_H__)
#define __PHY_H__
656 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin phy_init:
Inicializa los recursos utilizados por la capa fsica.
*/
void phy_init(void);
/*
Funcin phy_exec:
Espera y ejecuta la operaciones solicitadas a la capa fsica.
*/
void phy_exec(void);
#endif
/* Definicin de constantes. */
FernandoArielBeunza79156 657
Tesis de Grado en Ingeniera Informtica
/* Variables globales. */
/* Cdigo de operacin. */
static volatile uint8_t __phy_buffop__;
/* Buffer de trama. */
static volatile uint8_t __phy_buffer__[PHY_PAYLOADSIZE +
sizeof(__phy_startpattern__) +
sizeof(__phy_endpattern__)];
/*
Funcin phy_init:
Inicializa los recursos utilizados por la capa fsica.
*/
void phy_init(void)
{
/* Variables. */
uint16_t i; /* Posicin dentro del buffer. */
/* Inicializa integrador. */
DDRD = 0xff;
PORTD = 0x00;
658 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
PORTE = 0x03;
/* Inicializa el buffer. */
__phy_buffop__ = 0x00;
__phy_buffsize__ = 0;
__phy_buffdata__ = __phy_buffer__ + sizeof(__phy_startpattern__);
for(i = 0; i < sizeof(__phy_startpattern__); i++)
__phy_buffer__[i] = __phy_startpattern__[i];
/*
Funcin phy_exec:
Espera y ejecuta la operaciones solicitadas a la capa fsica.
*/
void phy_exec(void)
{
sei();
while(1) PORTA = ((PHY_SIGGENLEVEL & 0x0f) << 4) | (PHY_THGENLEVEL & 0x0f);
}
/*
Interrupcin INT2:
Recibe solicitudes de operacin.
*/
ISR(INT2_vect, ISR_BLOCK)
{
/* Variables. */
uint16_t i; /* Posicin dentro del buffer. */
uint16_t buffsize; /* Cantidad de bytes almacenados en
el buffer. */
uint8_t thrlevel; /* Umbral de deteccin de ocupacin
del canal de comunicacin. */
FernandoArielBeunza79156 659
Tesis de Grado en Ingeniera Informtica
__phy_sndframe__();
PORTB |= 0x01;
}
/* Verifica si es la operacin de obtencin de trama capturada. */
else if (__phy_buffop__ == PHY_GETFRMOP)
{
i = 0;
PORTB |= 0x01;
while((!(PINE & 0x01)) && (i < __phy_buffsize__))
__phy_sendbyte__(__phy_buffdata__[i++]);
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
}
/* Verifica si es la operacin de captura de trama. */
else if (__phy_buffop__ == PHY_CAPFRMOP)
{
PORTB |= 0x01;
buffsize = __phy_buffsize__;
if (!(PINE & 0x01))
__phy_buffsize__ = __phy_recvbyte__() << 8;
if (!(PINE & 0x01))
__phy_buffsize__ |= __phy_recvbyte__();
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
PORTB |= 0x01;
if (__phy_buffsize__ > PHY_PAYLOADSIZE)
__phy_buffsize__ = PHY_PAYLOADSIZE;
if (__phy_buffsize__)
{
__phy_calthreshold__();
if (__phy_capframe__())
PORTB &= 0xfe;
else
__phy_buffsize__ = buffsize;
}
}
/* Verifica si es la operacin de reenvo de trama. */
else if (__phy_buffop__ == PHY_RSDFRMOP)
{
PORTB |= 0x01;
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
PORTB |= 0x01;
if (__phy_buffsize__)
{
for(i = 0; i < sizeof(__phy_endpattern__); i++)
__phy_buffdata__[i + __phy_buffsize__] = __phy_endpattern__[i];
PORTB &= 0xfe;
__phy_sndframe__();
PORTB |= 0x01;
}
}
/* Verifica si es la operacin de sensado del canal de comunicacin. */
else if (__phy_buffop__ == PHY_SENSCHOP)
{
/* Obtiene el umbral de deteccin de ocupacin del canal de
comunicacin. */
PORTB |= 0x01;
if (!(PINE & 0x01))
thrlevel = __phy_recvbyte__();
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
660 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
__phy_sendbyte__(0xff);
__phy_gennoisesignal__();
}
/* Verifica si es la operacin de limpieza del buffer. */
else if (__phy_buffop__ == PHY_CRBUFFOP)
{
PORTB |= 0x01;
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
__phy_buffsize__ = 0;
}
/* Verifica si es la operacin de generacin de seal de prueba 1. */
else if (__phy_buffop__ == PHY_TSTSIGOP1)
{
PORTB |= 0x01;
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
__phy_tstsignal1__();
}
/* Verifica si es la operacin de generacin de seal de prueba 2. */
else if (__phy_buffop__ == PHY_TSTSIGOP2)
{
PORTB |= 0x01;
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
__phy_tstsignal2__();
}
/* Verifica si es la operacin de prueba de recepcin. */
else if (__phy_buffop__ == PHY_TSTRCVOP)
{
PORTB |= 0x01;
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
__phy_tstreceive__();
}
/* Operacin desconocida. */
else
{
PORTB |= 0x01;
while(!(PINE & 0x01))
__phy_sendbyte__(0xff);
}
/*
Funcin __phy_recvbyte__:
Recibe un byte del mdulo procesamiento.
*/
static uint8_t __phy_recvbyte__(void)
{
/* Variables. */
static uint8_t dat; /* Byte recibido. */
/* Recibe un byte. */
asm volatile("\
push r16 ; Guarda contenido de los \n\t\
push r17 ; registros utilizados. \n\t\
push r18 ; \n\t\
push r19 ; \n\t\
clr r19 ; Inicializa el buffer de \n\t\
ldi r18, 0x08 ; bits recibidos. \n\t\
L_wait1%=: in r16, %0 ; Espera comienzo de pulso \n\t\
andi r16, (1 << %1) | (1 << %2) ; de sincronismo \n\t\
out %3, r16 ; \n\t\
sbis %0, %1 ; \n\t\
rjmp L_wait1%= ; \n\t\
nop ; \n\t\
FernandoArielBeunza79156 661
Tesis de Grado en Ingeniera Informtica
/*
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 r16 ; Guarda contenido de los \n\t\
push r17 ; registros utilizados. \n\t\
push r18 ; \n\t\
push r19 ; \n\t\
ld r19, x ; Inicializa el buffer de \n\t\
ldi r18, 0x08 ; bits recibidos. \n\t\
L_wait1%=: in r16, %0 ; Espera comienzo de pulso \n\t\
662 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __phy_sndframe__:
Enva la trama almacenada en el buffer.
*/
static void __phy_sndframe__(void)
{
asm volatile("\
push r2 ; Guarda contenido de los \n\t\
push r3 ; registros utilizados. \n\t\
push r4 ; \n\t\
push r5 ; \n\t\
push r6 ; \n\t\
push r7 ; \n\t\
push r8 ; \n\t\
push r9 ; \n\t\
push r10 ; \n\t\
push r11 ; \n\t\
FernandoArielBeunza79156 663
Tesis de Grado en Ingeniera Informtica
664 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbrc r18, 7 ; Enva los primeros 7 bits \n\t\
rjmp L_sndbit1_06_0%= ; de un byte de los datos. \n\t\
nop ; \n\t\
L_sndbit0_06_0%=: out %0, r8 ; \n\t\
FernandoArielBeunza79156 665
Tesis de Grado en Ingeniera Informtica
666 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 667
Tesis de Grado en Ingeniera Informtica
668 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 669
Tesis de Grado en Ingeniera Informtica
670 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 671
Tesis de Grado en Ingeniera Informtica
/*
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; /* Cantidad de bits. */
uint8_t thl; /* Umbral de deteccin. */
uint8_t sbyte; /* Valor del byte sensado. */
uint8_t thlevel; /* Acumulador de umbrales
vlidos. */
uint8_t thlevels; /* Cantidad de umbrales vlidos. */
/* Inicializa el integrador. */
PORTD = 0x00;
PORTB |= 0x80;
PORTB &= 0x7f;
asm volatile("\
push r16 ; \n\t\
ldi r16, 0x19 ; \n\t\
L_continue%=: dec r16 ; \n\t\
brne L_continue%= ; \n\t\
nop ; \n\t\
pop r16 ; "
:
:
);
672 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Espera. */
asm volatile("\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; "
:
:
);
/* Espera. */
asm volatile("\
push r16 ; \n\t\
ldi r16, 0x13 ; \n\t\
L_continue%=: dec r16 ; \n\t\
brne L_continue%= ; \n\t\
nop ; \n\t\
nop ; \n\t\
pop r16 ; "
:
:
);
}
/* Reinicia el integrador. */
PORTB |= 0x80;
PORTB &= 0x7f;
}
FernandoArielBeunza79156 673
Tesis de Grado en Ingeniera Informtica
/*
Funcin __phy_capframe__:
Captura una trama y la almacena en el buffer.
*/
static int __phy_capframe__(void)
{
/* Variables. */
uint8_t sreg; /* Contenido del registro de
estado. */
int capstatus; /* Estado de la captura. */
/* Realiza la captura. */
asm volatile("\
push r2 ; Guarda contenido de los \n\t\
push r3 ; registros utilizados. \n\t\
push r4 ; \n\t\
push r5 ; \n\t\
push r6 ; \n\t\
push r7 ; \n\t\
push r8 ; \n\t\
push r9 ; \n\t\
push r10 ; \n\t\
push r11 ; \n\t\
push r16 ; \n\t\
push r17 ; \n\t\
push r18 ; \n\t\
push r19 ; \n\t\
push r20 ; \n\t\
push r21 ; \n\t\
ldi r16, 0x00 ; Inicializa la lnea de \n\t\
out %1, r16 ; retardo. \n\t\
mov r2, r16 ; \n\t\
mov r3, r16 ; \n\t\
mov r4, r16 ; \n\t\
mov r5, r16 ; \n\t\
mov r6, r16 ; \n\t\
mov r7, r16 ; \n\t\
mov r8, r16 ; \n\t\
mov r9, r16 ; \n\t\
mov r10, r16 ; \n\t\
mov r11, r16 ; \n\t\
L_init_rx%=: ldi r17, 0x00 ; \n\t\
ldi r18, %9 ; \n\t\
sbi %2, %3 ; Inicializa el integrador. \n\t\
clr r19 ; \n\t\
ldi r16, 0x1a ; \n\t\
L_wait_rx_0%=: dec r16 ; \n\t\
brne L_wait_rx_0%= ; \n\t\
in r21, %8 ; \n\t\
cbi %2, %3 ; \n\t\
L_sense_rx%=: in r16, %0 ; Sensa el canal de \n\t\
com r16 ; comunicacin a la espera \n\t\
out %1, r16 ; de registrar actividad. \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
674 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbis %4, %5 ; \n\t\
rjmp L_calth_rx_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
sbis %6, %7 ; \n\t\
rjmp L_end_0%= ; \n\t\
rjmp L_sense_rx%= ; \n\t\
L_calth_rx_0%=: in r16, %0 ; Inicia reajuste del umbral \n\t\
eor r2, r16 ; de deteccin. \n\t\
out %1, r2 ; \n\t\
mov r2, r16 ; \n\t\
sbis %4, %5 ; \n\t\
clr r19 ; \n\t\
sbic %4, %5 ; \n\t\
inc r19 ; \n\t\
FernandoArielBeunza79156 675
Tesis de Grado en Ingeniera Informtica
in r16, %0 ; \n\t\
eor r3, r16 ; \n\t\
out %1, r3 ; \n\t\
mov r3, r16 ; \n\t\
lsl r17 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r4, r16 ; \n\t\
out %1, r4 ; \n\t\
mov r4, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r5, r16 ; \n\t\
out %1, r5 ; \n\t\
mov r5, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r6, r16 ; \n\t\
out %1, r6 ; \n\t\
mov r6, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r7, r16 ; \n\t\
out %1, r7 ; \n\t\
mov r7, r16 ; \n\t\
sbis %4, %5 ; \n\t\
clr r19 ; \n\t\
sbic %4, %5 ; \n\t\
inc r19 ; \n\t\
in r16, %0 ; \n\t\
eor r8, r16 ; \n\t\
out %1, r8 ; \n\t\
mov r8, r16 ; \n\t\
cpi r19, 0x01 ; Detecta el valor del bit \n\t\
brlo L_calth_rx_1%= ; recibido. \n\t\
ori r17, 0x01 ; \n\t\
L_calth_rx_1%=: clr r19 ; \n\t\
in r16, %0 ; \n\t\
eor r9, r16 ; \n\t\
out %1, r9 ; \n\t\
mov r9, r16 ; \n\t\
nop ; \n\t\
sbis %6, %7 ; \n\t\
rjmp L_end_0%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r10, r16 ; \n\t\
out %1, r10 ; \n\t\
mov r10, r16 ; \n\t\
cpse r17, r18 ; \n\t\
rjmp L_calth_rx_2%= ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r11, r16 ; \n\t\
out %1, r11 ; \n\t\
mov r11, r16 ; \n\t\
ldi r20, 0x0f ; \n\t\
out %8, r20 ; \n\t\
rjmp L_calth_rx_3%= ; \n\t\
676 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 677
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
in r16, %0 ; \n\t\
eor r10, r16 ; \n\t\
out %1, r10 ; \n\t\
mov r10, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r11, r16 ; \n\t\
out %1, r11 ; \n\t\
mov r11, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r2, r16 ; \n\t\
out %1, r2 ; \n\t\
mov r2, r16 ; \n\t\
sbis %4, %5 ; \n\t\
clr r19 ; \n\t\
sbic %4, %5 ; \n\t\
inc r19 ; \n\t\
in r16, %0 ; \n\t\
eor r3, r16 ; \n\t\
out %1, r3 ; \n\t\
mov r3, r16 ; \n\t\
lsl r17 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r4, r16 ; \n\t\
out %1, r4 ; \n\t\
mov r4, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r5, r16 ; \n\t\
out %1, r5 ; \n\t\
mov r5, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r6, r16 ; \n\t\
out %1, r6 ; \n\t\
mov r6, r16 ; \n\t\
nop ; \n\t\
cpse r20, 0x00 ; \n\t\
rjmp L_calth_rx_7%= ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r7, r16 ; \n\t\
out %1, r7 ; \n\t\
mov r7, r16 ; \n\t\
sbis %4, %5 ; \n\t\
clr r19 ; \n\t\
sbic %4, %5 ; \n\t\
inc r19 ; \n\t\
in r16, %0 ; \n\t\
eor r8, r16 ; \n\t\
out %1, r8 ; \n\t\
mov r8, r16 ; \n\t\
cpi r19, 0x01 ; Detecta el valor del bit \n\t\
brlo L_calth_rx_5%= ; recibido. \n\t\
678 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 679
Tesis de Grado en Ingeniera Informtica
680 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
in r16, %0 ; \n\t\
eor r10, r16 ; \n\t\
out %1, r10 ; \n\t\
mov r10, r16 ; \n\t\
cpse r17, r18 ; Verifica el fin del \n\t\
rjmp L_calth_rx_12%= ; proceso de ajuste. \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r11, r16 ; \n\t\
out %1, r11 ; \n\t\
mov r11, r16 ; \n\t\
inc r20 ; \n\t\
out %8, r20 ; \n\t\
rjmp L_calth_rx_13%= ; \n\t\
L_calth_rx_12%=: nop ; \n\t\
in r16, %0 ; \n\t\
eor r11, r16 ; \n\t\
out %1, r11 ; \n\t\
mov r11, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
rjmp L_calth_rx_10%= ; \n\t\
L_calth_rx_13%=: sbi %2, %3 ; Reinicia el integrador. \n\t\
ldi r18, %10 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
cbi %2, %3 ; \n\t\
L_start_rx_0%=: in r16, %0 ; Espera el delimitador. \n\t\
eor r2, r16 ; \n\t\
out %1, r2 ; \n\t\
mov r2, r16 ; \n\t\
sbis %4, %5 ; \n\t\
clr r19 ; \n\t\
sbic %4, %5 ; \n\t\
inc r19 ; \n\t\
in r16, %0 ; \n\t\
eor r3, r16 ; \n\t\
out %1, r3 ; \n\t\
mov r3, r16 ; \n\t\
lsl r17 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r4, r16 ; \n\t\
out %1, r4 ; \n\t\
mov r4, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r5, r16 ; \n\t\
out %1, r5 ; \n\t\
mov r5, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
eor r6, r16 ; \n\t\
out %1, r6 ; \n\t\
mov r6, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
FernandoArielBeunza79156 681
Tesis de Grado en Ingeniera Informtica
682 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 683
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
cbi %2, %3 ; \n\t\
pop r21 ; Recupera contenido de los \n\t\
pop r20 ; registros utilizados. \n\t\
pop r19 ; \n\t\
pop r18 ; \n\t\
pop r17 ; \n\t\
pop r16 ; \n\t\
pop r11 ; \n\t\
pop r10 ; \n\t\
pop r9 ; \n\t\
pop r8 ; \n\t\
pop r7 ; \n\t\
pop r6 ; \n\t\
pop r5 ; \n\t\
pop r4 ; \n\t\
pop r3 ; \n\t\
pop r2 ; "
:
: "I" _SFR_IO_ADDR(PINC),
"I" _SFR_IO_ADDR(PORTD),
"I" _SFR_IO_ADDR(PORTB),
"I" (7),
"I" _SFR_IO_ADDR(ACSR),
"I" (5),
"I" _SFR_IO_ADDR(PINE),
"I" (0),
"I" _SFR_IO_ADDR(PORTA),
"M" (PHY_CALTHRBYTE),
"M" (PHY_DELBYTE),
"x" (__phy_buffdata__ + __phy_buffsize__),
"z" (__phy_buffdata__)
);
/*
Funcin __phy_sensechannel__:
Sensa la actividad del canal de comunicacin.
*/
static int __phy_sensechannel__(uint8_t thrlevel)
{
/* Variables. */
uint8_t sreg; /* Contenido del registro de
estado. */
uint8_t thrstatus; /* Estado del canal de
comunicacin. */
int capstatus; /* Estado de la captura. */
684 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 685
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
in r16, %0 ; \n\t\
com r16 ; \n\t\
out %1, r16 ; \n\t\
nop ; \n\t\
sbis %6, %7 ; Verifica solicitud de fin \n\t\
rjmp L_end_0%= ; de sensado de canal de \n\t\
rjmp L_sense_ch%= ; comunicacin. \n\t\
L_end_0%=: clt ; Interrupcin de captura. \n\t\
rjmp L_end_2%= ; \n\t\
L_end_1%=: set ; Deteccin de ocupacin del \n\t\
L_end_2%=: ldi r16, 0x00 ; canal de comunicacin. \n\t\
out %1, r16 ; \n\t\
sbi %2, %3 ; Reinicia el integrador. \n\t\
nop ; \n\t\
ldi r16, 0x1a ; \n\t\
L_wait_1%=: dec r16 ; \n\t\
brne L_wait_1%= ; \n\t\
nop ; \n\t\
cbi %2, %3 ; \n\t\
pop r16 ; "
:
: "I" _SFR_IO_ADDR(PINC),
"I" _SFR_IO_ADDR(PORTD),
"I" _SFR_IO_ADDR(PORTB),
"I" (7),
"I" _SFR_IO_ADDR(ACSR),
"I" (5),
"I" _SFR_IO_ADDR(PINE),
"I" (0)
);
/*
Funcin __phy_gennoisesignal__:
Genera una seal de ruido.
*/
static void __phy_gennoisesignal__(void)
{
asm volatile("\
push r2 ; Guarda contenido de los \n\t\
push r3 ; registros utilizados. \n\t\
push r4 ; \n\t\
push r5 ; \n\t\
push r6 ; \n\t\
push r7 ; \n\t\
push r8 ; \n\t\
push r9 ; \n\t\
push r16 ; \n\t\
push r17 ; \n\t\
686 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 687
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
sbrc r18, 7 ; \n\t\
rjmp L_genbit1%= ; \n\t\
L_genbit0_0%=: nop ; Genera la seal de ruido \n\t\
out %0, r8 ; pseudoaleatorio. \n\t\
out %0, r14 ; \n\t\
out %0, r16 ; \n\t\
out %0, r15 ; \n\t\
out %0, r11 ; \n\t\
out %0, r9 ; \n\t\
nop ; \n\t\
out %0, r2 ; \n\t\
nop ; \n\t\
nop ; \n\t\
L_genbit0_1%=: out %0, r9 ; \n\t\
out %0, r7 ; \n\t\
out %0, r8 ; \n\t\
688 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 689
Tesis de Grado en Ingeniera Informtica
690 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin __phy_tstsignal1__:
Genera una seal de prueba.
*/
static void __phy_tstsignal1__(void)
{
asm volatile("\
push r2 ; Guarda contenido de los \n\t\
push r3 ; registros utilizados. \n\t\
push r4 ; \n\t\
push r5 ; \n\t\
push r6 ; \n\t\
push r7 ; \n\t\
push r8 ; \n\t\
push r9 ; \n\t\
push r16 ; \n\t\
push r17 ; \n\t\
push r18 ; \n\t\
in r17, %0 ; Carga los valores de las \n\t\
mov r18, r17 ; muestras. \n\t\
andi r17, 0x0f ; \n\t\
ldi r16, 0x00 ; \n\t\
mov r2, r16 ; \n\t\
or r2, r17 ; \n\t\
ldi r16, 0x10 ; \n\t\
mov r3, r16 ; \n\t\
or r3, r17 ; \n\t\
ldi r16, 0x20 ; \n\t\
mov r4, r16 ; \n\t\
or r4, r17 ; \n\t\
ldi r16, 0x30 ; \n\t\
mov r5, r16 ; \n\t\
or r5, r17 ; \n\t\
ldi r16, 0x40 ; \n\t\
FernandoArielBeunza79156 691
Tesis de Grado en Ingeniera Informtica
692 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
nop ; \n\t\
out %0, r2 ; \n\t\
out %0, r3 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
out %0, r4 ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
nop ; \n\t\
out %0, r5 ; \n\t\
sbis %3, %4 ; Detiene la seal de prueba \n\t\
rjmp L_end%= ; si hay una nueva solicitud \n\t\
nop ; de operacin. \n\t\
out %0, r6 ; \n\t\
rjmp L_continue%= ; \n\t\
L_end%=: out %0, r6 ; \n\t\
cbi %1, %2 ; Desactiva el transmisor. \n\t\
out %0, r18 ; \n\t\
pop r18 ; Recupera contenido de los \n\t\
pop r17 ; registros utilizados. \n\t\
pop r16 ; \n\t\
pop r9 ; \n\t\
pop r8 ; \n\t\
pop r7 ; \n\t\
pop r6 ; \n\t\
pop r5 ; \n\t\
pop r4 ; \n\t\
pop r3 ; \n\t\
pop r2 ; "
:
: "I" _SFR_IO_ADDR(PORTA),
"I" _SFR_IO_ADDR(PORTE),
"I" (2),
"I" _SFR_IO_ADDR(PINE),
"I" (0)
);
}
/*
Funcin __phy_tstsignal2__:
Genera una seal de prueba.
*/
static void __phy_tstsignal2__(void)
{
asm volatile("\
push r2 ; Guarda contenido de los \n\t\
push r3 ; registros utilizados. \n\t\
push r4 ; \n\t\
push r5 ; \n\t\
push r6 ; \n\t\
push r7 ; \n\t\
push r8 ; \n\t\
push r9 ; \n\t\
push r16 ; \n\t\
push r17 ; \n\t\
push r18 ; \n\t\
in r17, %0 ; Carga los valores de las \n\t\
mov r18, r17 ; muestras. \n\t\
andi r17, 0x0f ; \n\t\
ldi r16, 0x00 ; \n\t\
mov r2, r16 ; \n\t\
or r2, r17 ; \n\t\
ldi r16, 0x10 ; \n\t\
mov r3, r16 ; \n\t\
FernandoArielBeunza79156 693
Tesis de Grado en Ingeniera Informtica
/*
Funcin __phy_tstreceive__:
Realiza una prueba de recepcin.
*/
694 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin main:
Funcin principal.
*/
int main(void)
{
/* Inicializa los recursos utilizados por la capa fsica. */
phy_init();
/* Fin. */
return 0;
}
FernandoArielBeunza79156 695
Tesis de Grado en Ingeniera Informtica
#if !defined(__CONFIG_H__)
#define __CONFIG_H__
696 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#endif
#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
Tesis de Grado en Ingeniera Informtica
Funcin int0:
Redirecciona la interrupcin 0.
*/
extern void int0(void) __interrupt 0 __naked;
/*
Funcin int1:
Redirecciona la interrupcin 1.
*/
extern void int1(void) __interrupt 1 __naked;
/*
Funcin int2:
Redirecciona la interrupcin 2.
*/
extern void int2(void) __interrupt 2 __naked;
/*
Funcin int3:
Redirecciona la interrupcin 3.
*/
extern void int3(void) __interrupt 3 __naked;
/*
Funcin int4:
Redirecciona la interrupcin 4.
*/
extern void int4(void) __interrupt 4 __naked;
/*
Funcin int5:
Redirecciona la interrupcin 5.
*/
extern void int5(void) __interrupt 5 __naked;
#endif
/*
Funcin int0:
Redirecciona la interrupcin 0.
*/
void int0(void) __interrupt 0 __naked
{
__asm ljmp START_FIRMWARE+0x0003 __endasm;
}
/*
Funcin int1:
Redirecciona la interrupcin 1.
*/
void int1(void) __interrupt 1 __naked
{
__asm ljmp START_FIRMWARE+0x000b __endasm;
698 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin int2:
Redirecciona la interrupcin 2.
*/
void int2(void) __interrupt 2 __naked
{
__asm ljmp START_FIRMWARE+0x0013 __endasm;
}
/*
Funcin int3:
Redirecciona la interrupcin 3.
*/
void int3(void) __interrupt 3 __naked
{
__asm ljmp START_FIRMWARE+0x001b __endasm;
}
/*
Funcin int4:
Redirecciona la interrupcin 4.
*/
void int4(void) __interrupt 4 __naked
{
__asm ljmp START_FIRMWARE+0x0023 __endasm;
}
/*
Funcin int5:
Redirecciona la interrupcin 5.
*/
void int5(void) __interrupt 5 __naked
{
__asm ljmp START_FIRMWARE+0x002b __endasm;
}
#if !defined(__MEMORY_H__)
#define __MEMORY_H__
/*
Funcin init:
Inicia la ejecucin del firmware del modem PLC.
*/
void init(void);
/*
Funcin erase:
Borra la memoria destinada al firmware del modem PLC.
*/
void erase(void);
/*
Funcin read:
Lee la memoria que contiene el firmware del modem PLC.
FernandoArielBeunza79156 699
Tesis de Grado en Ingeniera Informtica
*/
void read(void);
/*
Funcin write:
Escribe en la memoria el firmware del modem PLC.
*/
void write(void);
/*
Funcin verify:
Verifica el contenido del rea de memoria destinada al firmware del modem
PLC.
*/
void verify(void);
/*
Funcin test:
Evala el funcionamiento de banco de memoria del modem PLC.
*/
void test(void);
#endif
/*
Funcin init:
Inicia la ejecucin del firmware del modem PLC.
*/
void init(void)
{
/* Activa el watchdog. */
init_watchdog(1);
700 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin erase:
Borra la memoria destinada al firmware del modem PLC.
*/
void erase(void)
{
/* Variables. */
unsigned short int address; /* Posicin de memoria. */
/*
Funcin read:
Lee la memoria que contiene el firmware del modem PLC.
*/
void read(void)
{
/* Variables. */
unsigned short int rbytes; /* Cantidad de bytes a leer por
registro. */
unsigned short int toread; /* Cantidad de bytes a leer en
total. */
unsigned short int address; /* Posicin de memoria. */
unsigned char j; /* Contador de bytes ledos. */
unsigned char checksum; /* Suma de verificacin. */
FernandoArielBeunza79156 701
Tesis de Grado en Ingeniera Informtica
/*
Funcin write:
Escribe en la memoria el firmware del modem PLC.
*/
void write(void)
{
write_verify(1);
}
/*
Funcin verify:
Verifica el contenido del rea de memoria destinada al firmware del modem
PLC.
*/
void verify(void)
{
write_verify(0);
}
/*
Funcin test:
Evala el funcionamiento de banco de memoria del modem PLC.
*/
void test(void)
{
/* Variables. */
unsigned short int errors; /* Cantidad de errores
encontrados. */
unsigned short int address; /* Posicin de memoria. */
unsigned char dat; /* Dato original de la posicin de
memoria. */
unsigned char read; /* Dato ledo de la posicin de
memoria. */
702 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin writemem:
Modifica el contenido de la posicin de memoria especificada.
*/
static int writemem(unsigned short int addr, unsigned char dat)
{
/* Varaibles. */
unsigned int i; /* Contador. */
unsigned short int j; /* Contador. */
/*
Funcin hex2val:
Convierte una cadena de caracteres que contiene un nmero hexadecimal de
dos digitos en su correspondiente valor numrico entre 0 y 255.
*/
static unsigned char hex2val(char *v)
{
/* Variables. */
char d; /* Dgito. */
unsigned char i; /* Cantidad de digitos. */
unsigned char val; /* Valor numrico. */
FernandoArielBeunza79156 703
Tesis de Grado en Ingeniera Informtica
/*
Funcin write_verify:
Escribe o verifica la memoria que contiene el firmware del modem PLC.
*/
static void write_verify(int op)
{
/* Variables. */
short int errors; /* Contador de errores. */
unsigned short int address; /* Direccin de memoria. */
length_t length; /* Tamao del registro. */
unsigned char i; /* Nmero de bytes del registro. */
unsigned char val; /* Valor ledo. */
unsigned char lstr; /* Longitud de la cadena
ingresada. */
unsigned char type; /* Tipo de registro. */
char *ptr; /* Puntero a registro. */
char *ptr2; /* Puntero a registro. */
unsigned char checksum; /* Suma de verificacin. */
char str[(RECORD_SIZE * 2) + 12]; /* Registro recibido. */
704 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 705
Tesis de Grado en Ingeniera Informtica
printf("Invalid address\r\n\n");
continue;
}
/*
Funcin main:
Funcin principal.
*/
void main(void)
{
char str[LINE_SIZE]; /* Lnea de comandos. */
706 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 707
Tesis de Grado en Ingeniera Informtica
#if !defined(__COMMON_H__)
#define __COMMON_H__
/* Definicin de tipos. */
/* Tipo longitud. */
typedef short int length_t;
/*
Funcin usl2b:
Convierte un entero sin signo de 16 bits codificado little endian en otro
codificado en big endian.
*/
unsigned short int usl2b(unsigned short int);
/*
Funcin usb2l:
Convierte un entero sin signo de 16 bits codificado big endian en otro
codificado en little endian.
*/
#define usb2l(val)\
usl2b(val)
/*
Funcin getfcs:
Calcula la suma de verificacin.
*/
unsigned short int getfcs(const void *, length_t);
/*
Funcin memcpy1:
Copia el contenido de la memoria de datos.
*/
void memcpy1(void *, const void *, length_t);
/*
Funcin memccpy1:
Copia el contenido de la memoria de cdigo a la memoria de datos.
*/
void memccpy1(void *, const void *, length_t);
/*
Funcin memcpy2:
Copia el contenido de la memoria de datos.
*/
void memcpy2(void *, length_t, const void *, length_t);
/*
708 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Funcin memccpy2:
Copia el contenido de la memoria de datos.
*/
void memccpy2(void *, length_t, const void *, length_t);
/*
Funcin memcmp1:
Compara el contenido de la memoria de datos.
*/
int memcmp1(const void *, const void *, length_t);
/*
Funcin memccmp1:
Compara el contenido de la memoria de cdigo a la memoria de datos.
*/
int memccmp1(const void *, const void *, length_t);
/*
Funcin streq:
Verifica si dos cadenas de caracteres en memoria de datos son iguales.
*/
int streq(const char *, const char *);
/*
Funcin strceq:
Verifica si una cadena de caracteres en memoria de datos y una cadena de
caracteres en memoria de cdigo son iguales.
*/
int strceq(const char *, const char *);
/*
Funcin strlen1:
Devuelve la longitud de una cadena de caracteres en memoria de datos.
*/
length_t strlen1(const char *);
/*
Funcin strlen1:
Devuelve la longitud de una cadena de caracteres en memoria de cdigo.
*/
length_t strclen1(const char *);
/*
Funcin sei:
Activa interrupciones.
*/
#define sei()\
__asm setb EA __endasm
/*
Funcin cli:
Desactiva interrupciones.
*/
#define cli()\
__asm clr EA __endasm
/*
Funcin reset:
Reinicia la ejecucin del cargador de firmware del modem PLC.
*/
void reset(void);
/*
Funcin initports:
Inicializa los puertos.
*/
void initports(void);
/*
Funcin idle:
Detiene la ejecucin del firmware del modem PLC.
FernandoArielBeunza79156 709
Tesis de Grado en Ingeniera Informtica
*/
#define idle()\
PCON |= 0x01
/*
Funcin init_watchdog:
Inicializa el watchdog del microcontrolador.
*/
void init_watchdog(unsigned char);
/*
Funcin reset_watchdog:
Reinicia el watchdog del microcontrolador.
*/
void reset_watchdog(void);
/*
Funcin status_watchdog:
Devuelve el estado del watchdog del microcontrolador.
*/
unsigned char status_watchdog(void);
#endif
/* Definicin de constantes. */
#define WATCHDOG_PERIOD 0x000f
/* Variables globales. */
/*
Funcin usl2b:
Convierte un entero sin signo de 16 bits codificado little endian en otro
710 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin getfcs:
Calcula la suma de verificacin.
*/
unsigned short int getfcs(const void *dat, length_t len)
{
/* Variables. */
unsigned short int fcs; /* Suma de verificacin. */
unsigned char *ptr; /* Puntero a los datos. */
/*
Funcin memcpy1:
Copia el contenido de la memoria de datos.
*/
void memcpy1(void *dest, const void *src, length_t ssrc)
{
memcpy2(dest, ssrc, src, ssrc);
}
/*
Funcin memccpy1:
Copia el contenido de la memoria de cdigo a la memoria de datos.
*/
void memccpy1(void *dest, const void *src, length_t ssrc)
{
memccpy2(dest, ssrc, src, ssrc);
}
/*
Funcin memcpy2:
Copia el contenido de la memoria de datos.
*/
void memcpy2(void *dest, length_t sdest, const void *src, length_t ssrc)
{
memcpy3(dest, sdest, src, ssrc);
}
/*
Funcin memccpy2:
Copia el contenido de la memoria de cdigo a la memoria de datos.
FernandoArielBeunza79156 711
Tesis de Grado en Ingeniera Informtica
*/
void memccpy2(void *dest, length_t sdest, const void *src, length_t ssrc)
{
memccpy3(dest, sdest, src, ssrc);
}
/*
Funcin memcmp1:
Compara el contenido de la memoria de datos.
*/
int memcmp1(const void *mem1, const void *mem2, length_t size)
{
return memcmp2(mem1, mem2, size);
}
/*
Funcin memccmp1:
Compara el contenido de la memoria de cdigo a la memoria de datos.
*/
int memccmp1(const void *mem1, const void *mem2, length_t size)
{
return memccmp2(mem1, mem2, size);
}
/*
Funcin streq:
Verifica si dos cadenas de caracteres en memoria de datos son iguales.
*/
int streq(const char *str1, const char *str2)
{
/* Variables. */
int result; /* Resultado de la comparacin. */
length_t i; /* Contador. */
char b1; /* Caracter de la primer cadena. */
char b2; /* Caracter de la segunda
cadena. */
/*
Funcin strceq:
Verifica si una cadena de caracteres en memoria de datos y una cadena de
caracteres en memoria de cdigo son iguales.
*/
int strceq(const char *strd, const char *strc)
{
712 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Variables. */
int result; /* Resultado de la comparacin. */
char bd; /* Caracter de la cadena en memoria
de datos. */
char bc; /* Caracter de la cadena en memoria
de cdigo. */
length_t i; /* Contador. */
/*
Funcin strlen1:
Devuelve la longitud de una cadena de caracteres en memoria de datos.
*/
length_t strlen1(const char *str)
{
/* Variables. */
length_t len; /* Longitud de la cadena de
caracteres. */
/*
FernandoArielBeunza79156 713
Tesis de Grado en Ingeniera Informtica
Funcin strlen1:
Devuelve la longitud de una cadena de caracteres en memoria de cdigo.
*/
length_t strclen1(const char *str)
{
/* Variables. */
length_t len; /* Longitud de la cadena de
caracteres. */
/*
Funcin reset:
Reinicia la ejecucin del cargador de firmware del modem PLC.
*/
void reset(void)
{
init_watchdog(1);
while(1);
}
/*
Funcin initports:
Inicializa los puertos.
*/
void initports(void)
{
__asm
mov p0, #0xff ;
mov p1, #0xff ;
mov p2, #0xff ;
mov p3, #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
Tesis de Grado en Ingeniera Informtica
*/
void reset_watchdog(void)
{
if (!__wdt_status__) return;
__asm
push IE ;
clr EA ;
mov _WDTRST, #0x1e ;
mov _WDTRST, #0xe1 ;
pop IE ;
__endasm;
}
/*
Funcin status_watchdog:
Devuelve el estado del watchdog del microcontrolador.
*/
unsigned char status_watchdog(void)
{
if (__wdt_status__) return 1;
return 0;
}
/*
Funcin crc16_update:
Calcula el CRC-16.
*/
static unsigned short int crc16_update(unsigned short int crc, unsigned char a)
{
/* Variables. */
int i; /* Contador. */
/* 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
Tesis de Grado en Ingeniera Informtica
/*
Funcin memccpy3:
Copia el contenido de la memoria de cdigo a la memoria de datos.
*/
static void memccpy3(unsigned char *dest, length_t sdest,
const unsigned char *src, length_t ssrc)
{
/* Variables. */
length_t i; /* Contador. */
/*
Funcin memcmp2:
Compara el contenido de la memoria de datos.
*/
static int memcmp2(const unsigned char *mem1, const unsigned char *mem2,
length_t size)
{
/* Variables. */
length_t i; /* Contador. */
716 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
{
if (!(i & WATCHDOG_PERIOD)) reset_watchdog();
if (*((__xdata unsigned char *) (mem1 + i)) !=
*((__xdata unsigned char *) (mem2 + i)))
return 0;
}
reset_watchdog();
return 1;
#else
#error "memcmp2(): unknow memory model"
#endif
}
/*
Funcin memccmp2:
Compara el contenido de la memoria de cdigo a la memoria de datos.
*/
static int memccmp2(const unsigned char *mem1, const unsigned char *mem2,
length_t size)
{
/* Variables. */
length_t i; /* Contador. */
#if !defined(__SERIAL_H__)
#define __SERIAL_H__
/*
Funcin inituart:
Inicializa la UART del microcontrolador.
*/
FernandoArielBeunza79156 717
Tesis de Grado en Ingeniera Informtica
/*
Funcin putchar:
Enva un caracter a travs de la UART.
*/
void putchar(char);
/*
Funcin poll:
Devuelve si hay un caracter almacenado en la UART.
*/
int poll(void);
/*
Funcin getchar:
Devuelve un caracter recibido por medio de la UART.
*/
char getchar(void);
#endif
/* Variables globales. */
/*
Funcin inituart:
Inicializa la UART del microcontrolador.
*/
void inituart(unsigned char t1_reload)
{
/* Inicializa la UART. */
SIO_SCON = 0x50;
SIO_TR1 = 0;
718 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin putchar:
Enva un caracter a travs de la UART.
*/
void putchar(char c)
{
if ((status_watchdog()) && (!__watchdog_counter__))
{
reset_watchdog();
while(!SIO_TI);
}
else
while(!SIO_TI);
SIO_TI = 0;
SIO_SBUF = c;
__watchdog_counter__ ++;
}
/*
Funcin poll:
Devuelve si hay un caracter almacenado en la UART.
*/
int poll(void)
{
return SIO_RI;
}
/*
Funcin getchar:
Devuelve un caracter recibido por medio de la UART.
*/
char getchar(void)
{
/* Varaibles. */
char c; /* Caracter recibido. */
FernandoArielBeunza79156 719
Tesis de Grado en Ingeniera Informtica
720 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
#include "..\modplcap\modplcap.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 MODPLCAP_NULLTYPE
#define MODPLCAPCPP_CHARTYPE MODPLCAP_CHARTYPE
#define MODPLCAPCPP_SINT8TYPE MODPLCAP_SINT8TYPE
#define MODPLCAPCPP_UINT8TYPE MODPLCAP_UINT8TYPE
#define MODPLCAPCPP_SINT16TYPE MODPLCAP_SINT16TYPE
#define MODPLCAPCPP_UINT16TYPE MODPLCAP_UINT16TYPE
#define MODPLCAPCPP_SINT32TYPE MODPLCAP_SINT32TYPE
#define MODPLCAPCPP_UINT32TYPE MODPLCAP_UINT32TYPE
#define MODPLCAPCPP_FLOATTYPE MODPLCAP_FLOATTYPE
/* Variables globales. */
/* 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
Tesis de Grado en Ingeniera Informtica
*/
int publish(modplcapcpp_grpid);
/*
Mtodo subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
int subscribe(modplcapcpp_grpid);
/*
Mtodo leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
int leave(modplcapcpp_grpid);
/*
Mtodo poll:
Verifica la llegada de un nuevo mensaje.
*/
int poll(void);
/*
Mtodo status:
Devuelve el estado del modem PLC.
*/
int status(void);
/* Clases amigas. */
friend class modplcapcpp_msg;
};
/*
Clase modplcapcpp_msg
*/
class modplcapcpp_msg
{
/* Atributos y mtodos privados. */
private:
modplcap_msg *msghd; /* 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
Tesis de Grado en Ingeniera Informtica
/*
Mtodo sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
int sendmsg(void);
/*
Mtodo getfield:
Extrae un campo del mensaje.
*/
int getfield(modplcapcpp_ftype *, unsigned char *, void *);
/*
Mtodo getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcapcpp_grpid getgrpid(void);
/*
Mtodo getmsgid:
Devuelve el identificador de mensaje.
*/
modplcapcpp_msgid getmsgid(void);
};
/*
Constructor:
Inicializa los recursos utilizados por la capa de aplicacin del modem PLC.
*/
inline modplcapcpp::modplcapcpp(int sid)
{
if (!__modplcapcpp_loadlib__)
{
modplcap_loadlib();
__modplcapcpp_loadlib__ = 1;
}
this->handle = modplcap_init(sid);
}
/*
Destructor:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
inline modplcapcpp::~modplcapcpp()
{
modplcap_release(this->handle);
}
/*
Mtodo publish:
Registra el dispositivo como publicador del grupo de difusin especificado.
*/
inline int modplcapcpp::publish(modplcapcpp_grpid grpid)
{
return modplcap_publish(this->handle, (modplcap_grpid)grpid);
}
/*
Mtodo subscribe:
Registra el dispositivo como suscriptor del grupo de difusin especificado.
*/
inline int modplcapcpp::subscribe(modplcapcpp_grpid grpid)
{
return modplcap_subscribe(this->handle, (modplcap_grpid) grpid);
}
724 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Mtodo leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
inline int modplcapcpp::leave(modplcapcpp_grpid grpid)
{
return modplcap_leave(this->handle, (modplcap_grpid) grpid);
}
/*
Mtodo poll:
Verifica la llegada de un nuevo mensaje.
*/
inline int modplcapcpp::poll(void)
{
return modplcap_poll(this->handle);
}
/*
Mtodo status:
Devuelve el estado del modem PLC.
*/
inline int modplcapcpp::status(void)
{
return modplcap_status(this->handle);
}
/*
Constructor:
Crea un nuevo mensaje.
*/
inline modplcapcpp_msg::modplcapcpp_msg(modplcapcpp *hd,
modplcapcpp_grpid grpid,
modplcapcpp_msgid msgid)
{
if (!__modplcapcpp_loadlib__)
{
modplcap_loadlib();
__modplcapcpp_loadlib__ = 1;
}
this->msghd = new modplcap_msg;
if (!this->msghd) return;
modplcap_newmsg(hd->handle, (modplcap_msg *) (this->msghd),
(modplcap_grpid) grpid, (modplcap_msgid) msgid);
}
/*
Constructor:
Crea un copia de un mensaje.
*/
inline modplcapcpp_msg::modplcapcpp_msg(modplcapcpp_msg *msg)
{
if (!__modplcapcpp_loadlib__)
{
modplcap_loadlib();
__modplcapcpp_loadlib__ = 1;
}
this->msghd = new modplcap_msg;
if (!this->msghd) return;
if (!modplcap_copymsg(this->msghd, msg->msghd))
delete this->msghd;
}
/*
Constructor:
Recibe un mensaje por medio de la capa de aplicacin.
*/
inline modplcapcpp_msg::modplcapcpp_msg(modplcapcpp *hd)
FernandoArielBeunza79156 725
Tesis de Grado en Ingeniera Informtica
{
if (!__modplcapcpp_loadlib__)
{
modplcap_loadlib();
__modplcapcpp_loadlib__ = 1;
}
this->msghd = new modplcap_msg;
if (!this->msghd) return;
if (!modplcap_receivemsg(hd->handle, this->msghd))
delete this->msghd;
}
/*
Destructor:
Destruye un mensaje.
*/
inline modplcapcpp_msg::~modplcapcpp_msg()
{
if (!this->msghd) return;
modplcap_destroymsg(this->msghd);
delete this->msghd;
}
/*
Mtodo putfield:
Agrega un nuevo campo al mensaje.
*/
inline int modplcapcpp_msg::putfield(modplcapcpp_ftype type,
unsigned char count, const void *dat)
{
return modplcap_putfield(this->msghd, (modplcap_ftype) type, count, dat);
}
/*
Mtodo sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
inline int modplcapcpp_msg::sendmsg(void)
{
return modplcap_sendmsg(this->msghd);
}
/*
Mtodo getfield:
Extrae un campo del mensaje.
*/
inline int modplcapcpp_msg::getfield(modplcapcpp_ftype *type,
unsigned char *count, void *dat)
{
return modplcap_getfield(this->msghd, (modplcap_ftype *) type, count, dat);
}
/*
Mtodo getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
inline modplcapcpp_grpid modplcapcpp_msg::getgrpid(void)
{
return (modplcap_grpid) modplcap_getgrpid(this->msghd);
}
/*
Mtodo getmsgid:
Devuelve el identificador de mensaje.
*/
inline modplcapcpp_msgid modplcapcpp_msg::getmsgid(void)
{
return (modplcap_msgid) modplcap_getmsgid(this->msghd);
}
726 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
#endif
#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 MODPLCAP_NULLTYPE
#define MODPLCAPCPP_CHARTYPE MODPLCAP_CHARTYPE
#define MODPLCAPCPP_SINT8TYPE MODPLCAP_SINT8TYPE
#define MODPLCAPCPP_UINT8TYPE MODPLCAP_UINT8TYPE
#define MODPLCAPCPP_SINT16TYPE MODPLCAP_SINT16TYPE
#define MODPLCAPCPP_UINT16TYPE MODPLCAP_UINT16TYPE
#define MODPLCAPCPP_SINT32TYPE MODPLCAP_SINT32TYPE
#define MODPLCAPCPP_UINT32TYPE MODPLCAP_UINT32TYPE
#define MODPLCAPCPP_FLOATTYPE 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
Tesis de Grado en Ingeniera Informtica
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.
*/
int publish(modplcapcpp_grpid);
/*
Mtodo subscribe:
Registra el dispositivo como suscriptor del grupo de
difusin especificado.
*/
int subscribe(modplcapcpp_grpid);
/*
Mtodo leave:
Desvincula el dispositivo del grupo de difusin
especificado.
*/
int leave(modplcapcpp_grpid);
/*
Mtodo poll:
Verifica la llegada de un nuevo mensaje.
*/
int poll(void);
/*
Mtodo status:
Devuelve el estado del modem PLC.
*/
int status(void);
/* Clases amigas. */
friend class modplcapcpp_msg;
};
/*
Clase modplcapcpp_msg
*/
class modplcapcpp_msg
{
/* Atributos y mtodos privados. */
private:
modplcap_msg *msghd; /* Manejador de mensaje. */
/* Mtodos pblicos. */
public:
/*
Constructor:
Crea un nuevo mensaje.
*/
modplcapcpp_msg(modplcapcpp *, modplcapcpp_grpid,
modplcapcpp_msgid);
/*
728 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
*/
int putfield(modplcapcpp_ftype, unsigned char, const void *);
/*
Mtodo sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
int sendmsg(void);
/*
Mtodo getfield:
Extrae un campo del mensaje.
*/
int getfield(modplcapcpp_ftype *, unsigned char *, void *);
/*
Mtodo getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
modplcapcpp_grpid getgrpid(void);
/*
Mtodo getmsgid:
Devuelve el identificador de mensaje.
*/
modplcapcpp_msgid getmsgid(void);
};
/*
Constructor:
Inicializa los recursos utilizados por la capa de aplicacin del modem
PLC.
*/
inline modplcapcpp::modplcapcpp(int sid)
{
this->handle = modplcap_init(sid);
}
/*
Destructor:
Libera los recursos utilizados por la capa de aplicacin del modem PLC.
*/
inline modplcapcpp::~modplcapcpp()
{
modplcap_release(this->handle);
}
/*
FernandoArielBeunza79156 729
Tesis de Grado en Ingeniera Informtica
Mtodo publish:
Registra el dispositivo como publicador del grupo de difusin
especificado.
*/
inline int modplcapcpp::publish(modplcapcpp_grpid grpid)
{
return modplcap_publish(this->handle, (modplcap_grpid)grpid);
}
/*
Mtodo subscribe:
Registra el dispositivo como suscriptor del grupo de difusin
especificado.
*/
inline int modplcapcpp::subscribe(modplcapcpp_grpid grpid)
{
return modplcap_subscribe(this->handle, (modplcap_grpid) grpid);
}
/*
Mtodo leave:
Desvincula el dispositivo del grupo de difusin especificado.
*/
inline int modplcapcpp::leave(modplcapcpp_grpid grpid)
{
return modplcap_leave(this->handle, (modplcap_grpid) grpid);
}
/*
Mtodo poll:
Verifica la llegada de un nuevo mensaje.
*/
inline int modplcapcpp::poll(void)
{
return modplcap_poll(this->handle);
}
/*
Mtodo status:
Devuelve el estado del modem PLC.
*/
inline int modplcapcpp::status(void)
{
return modplcap_status(this->handle);
}
/*
Constructor:
Crea un nuevo mensaje.
*/
inline modplcapcpp_msg::modplcapcpp_msg(modplcapcpp *hd,
modplcapcpp_grpid grpid,
modplcapcpp_msgid msgid)
{
this->msghd = new modplcap_msg;
if (!this->msghd) return;
modplcap_newmsg(hd->handle, (modplcap_msg *) (this->msghd),
(modplcap_grpid) grpid, (modplcap_msgid) msgid);
}
/*
Constructor:
Crea un copia de un mensaje.
*/
inline modplcapcpp_msg::modplcapcpp_msg(modplcapcpp_msg *msg)
{
this->msghd = new modplcap_msg;
if (!this->msghd) return;
730 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
if (!modplcap_copymsg(this->msghd, msg->msghd))
delete this->msghd;
}
/*
Constructor:
Recibe un mensaje por medio de la capa de aplicacin.
*/
inline modplcapcpp_msg::modplcapcpp_msg(modplcapcpp *hd)
{
this->msghd = new modplcap_msg;
if (!this->msghd) return;
if (!modplcap_receivemsg(hd->handle, this->msghd))
delete this->msghd;
}
/*
Destructor:
Destruye un mensaje.
*/
inline modplcapcpp_msg::~modplcapcpp_msg()
{
if (!this->msghd) return;
modplcap_destroymsg(this->msghd);
delete this->msghd;
}
/*
Mtodo putfield:
Agrega un nuevo campo al mensaje.
*/
inline int modplcapcpp_msg::putfield(modplcapcpp_ftype type,
unsigned char count, const void *dat)
{
return modplcap_putfield(this->msghd, (modplcap_ftype) type, count,
dat);
}
/*
Mtodo sendmsg:
Enva un mensaje por medio de la capa de aplicacin.
*/
inline int modplcapcpp_msg::sendmsg(void)
{
return modplcap_sendmsg(this->msghd);
}
/*
Mtodo getfield:
Extrae un campo del mensaje.
*/
inline int modplcapcpp_msg::getfield(modplcapcpp_ftype *type,
unsigned char *count, void *dat)
{
return modplcap_getfield(this->msghd, (modplcap_ftype *) type, count,
dat);
}
/*
Mtodo getgrpid:
Devuelve el identificador de grupo del mensaje.
*/
inline modplcapcpp_grpid modplcapcpp_msg::getgrpid(void)
{
return (modplcap_grpid) modplcap_getgrpid(this->msghd);
}
/*
Mtodo getmsgid:
Devuelve el identificador de mensaje.
*/
FernandoArielBeunza79156 731
Tesis de Grado en Ingeniera Informtica
#endif
732 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
identificador de mensaje utilizado para que el destinatario del mensaje pueda identificar y procesar
el mensaje recibido. En la figura E3 se pueden observar los parmetros configurables a los cuales se
hacia referencia anteriormente.
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
Tesis de Grado en Ingeniera Informtica
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.
736 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Figura E7. Diagrama de organizacin de cdigo.
/* Definicin de tipos. */
/* Definicin de constantes. */
/* Tipos de datos. */
#define MODPLCSIMULINK_CHARTYPE 1
#define MODPLCSIMULINK_SINT8TYPE 2
#define MODPLCSIMULINK_UINT8TYPE 3
#define MODPLCSIMULINK_SINT16TYPE 4
#define MODPLCSIMULINK_UINT16TYPE 5
#define MODPLCSIMULINK_SINT32TYPE 6
FernandoArielBeunza79156 737
Tesis de Grado en Ingeniera Informtica
#define MODPLCSIMULINK_UINT32TYPE 7
#define MODPLCSIMULINK_FLOATTYPE 8
/*
Funcin ModemPlcInterface_Initialize:
Inicializa el bloque Modem PLC Interface.
*/
void *ModemPlcInterface_Initialize(int port)
{
/* Variables. */
short int i; /* Contador. */
modplcsimulink_hd *handle; /* Manejador de comunicacin entre
bloques Simulink del Modem
PLC. */
/* Inicializa el bloque. */
handle = NULL;
while(1)
{
/* Carga la biblioteca. */
if (!modplcap_loadlib()) break;
/* 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; /* Nodo de lista de mensajes. */
738 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Recibe el mensaje. */
node->msg = (modplcap_msg *) malloc(sizeof(modplcap_msg));
if (!node->msg)
{
free(node);
break;
}
if (!modplcap_receivemsg(((modplcsimulink_hd *) handle)->hd,
node->msg))
{
free(node->msg);
free(node);
break;
}
node->next = NULL;
/*
Funcin ModemPlcInterface_Terminate:
Libera los recursos utilizados por el bloque Modem PLC Interface.
*/
int ModemPlcInterface_Terminate(void *handle)
{
/* Variables. */
listmsg_node *node; /* Nodo de lista de mensajes. */
listmsg_node *next; /* Prximo nodo en la lista de
mensajes. */
/* Destruye el nodo. */
free(node);
FernandoArielBeunza79156 739
Tesis de Grado en Ingeniera Informtica
/* xito. */
return 1;
}
/*
Funcin ModemPlcCreateMessage_Initialize:
Inicializa el bloque Modem PLC Create Message.
*/
void *ModemPlcCreateMessage_Initialize(void)
{
return malloc(sizeof(modplcap_msg));
}
/*
Funcin ModemPlcCreateMessage_Output:
Ejecuta el bloque Modem PLC Create Message.
*/
int ModemPlcCreateMessage_Output(void *handle, void *msg, int grpid, int msgid)
{
/* Verifica que manejador de comunicacin entre bloques Simulink del Modem
PLC exista. */
if (!handle) return 0;
740 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin ModemPlcCreateMessage_Terminate:
Libera los recursos utilizados por el bloque Modem PLC Create Message.
*/
int ModemPlcCreateMessage_Terminate(void *msg)
{
/* Destruye el mensaje anterior. */
if (!msg) return 0;
modplcap_destroymsg((modplcap_msg *) msg);
free(msg);
return 1;
}
/*
Funcin ModemPlcPutField_Initialize:
Inicializa el bloque Modem PLC Put Field.
*/
void *ModemPlcPutField_Initialize(void)
{
return NULL;
}
/*
Funcin ModemPlcPutField_Output:
Ejecuta el bloque Modem PLC Put Field.
*/
int ModemPlcPutField_Output(void *handle, int type, int count, double *dat)
{
/* Variables. */
int i; /* Contador. */
int result; /* Resultado de la operacin de
agregado del campo de datos. */
char *datchar; /* Puntero a datos tipo caracter. */
char *datsint8; /* Puntero a datos tipo entero con
signo de 8 bits. */
unsigned char *datuint8; /* Puntero a datos tipo entero sin
signo de 8 bits. */
short int *datsint16; /* Puntero a datos tipo entero con
signo de 16 bits. */
unsigned short int *datuint16; /* Puntero a datos tipo entero sin
signo de 16 bits. */
long int *datsint32; /* Puntero a datos tipo entero con
signo de 32 bits. */
unsigned long int *datuint32; /* Puntero a datos tipo entero sin
signo de 32 bits. */
float *datfloat; /* Puntero a datos tipo punto
flotante. */
FernandoArielBeunza79156 741
Tesis de Grado en Ingeniera Informtica
while(1)
{
/* Verifica que manejador de comunicacin entre bloques Simulink del
Modem PLC exista. */
if (!handle) break;
if (!((modplcsimulink_hd *) handle)->msg) break;
742 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Tipo desconocido. */
default:
break;
}
if (!result) break;
/*
Funcin ModemPlcPutField_Terminate:
Libera los recursos utilizados por el bloque Modem PLC Put Field.
*/
int ModemPlcPutField_Terminate(void)
{
return 1;
}
/*
Funcin ModemPlcSendMessage_Initialize:
Inicializa el bloque Modem PLC Send Message.
*/
void *ModemPlcSendMessage_Initialize(void)
{
FernandoArielBeunza79156 743
Tesis de Grado en Ingeniera Informtica
return NULL;
}
/*
Funcin ModemPlcSendMessage_Output:
Ejecuta el bloque Modem PLC Send Message.
*/
int ModemPlcSendMessage_Output(void *handle)
{
/* Verifica que manejador de comunicacin entre bloques Simulink del Modem
PLC exista. */
if (!handle) return 0;
/* Enva el mensaje. */
modplcap_sendmsg(((modplcsimulink_hd *) handle)->msg);
/*
Funcin ModemPlcSendMessage_Terminate:
Libera los recursos utilizados por el bloque Modem PLC Send Message.
*/
int ModemPlcSendMessage_Terminate(void)
{
return 1;
}
/*
Funcin ModemPlcReceiveMessage_Initialize:
Inicializa el bloque Modem PLC Receive Message.
*/
void *ModemPlcReceiveMessage_Initialize(void)
{
return malloc(sizeof(modplcap_msg));
}
/*
Funcin ModemPlcReceiveMessage_Output:
Ejecuta el bloque Modem PLC Receive Message.
*/
int ModemPlcReceiveMessage_Output(void *handle, void *msg, int grpid,
int msgid)
{
/* Variables. */
listmsg_node *currnode; /* Nodo corriente de lista de
mensajes. */
listmsg_node *prevnode; /* Nodo previo al corriente de
lista de mensajes. */
744 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 745
Tesis de Grado en Ingeniera Informtica
break;
}
/*
Funcin ModemPlcReceiveMessage_Terminate:
Libera los recursos utilizados por el bloque Modem PLC Receive Message.
*/
int ModemPlcReceiveMessage_Terminate(void *msg)
{
/* Destruye el mensaje anterior. */
if (!msg) return 0;
modplcap_destroymsg((modplcap_msg *) msg);
free(msg);
return 1;
}
/*
Funcin ModemPlcGetField_Initialize:
Inicializa el bloque Modem PLC Get Field.
*/
void *ModemPlcGetField_Initialize(void)
{
return NULL;
}
/*
Funcin ModemPlcGetField_Output:
Ejecuta el bloque Modem PLC Get Field.
*/
int ModemPlcGetField_Output(void *handle, unsigned char count, double *dat)
{
/* Variables. */
int i; /* Contador. */
int result; /* Resultado de la operacin de
agregado del campo de datos. */
modplcap_ftype rtype; /* Identificador de tipo de
dato. */
unsigned char rcount; /* Cantidad de datos recibidos. */
void *rdat; /* Puntero a los datos
recibidos. */
char *datchar; /* Puntero a datos tipo caracter. */
char *datsint8; /* Puntero a datos tipo entero con
signo de 8 bits. */
unsigned char *datuint8; /* Puntero a datos tipo entero sin
signo de 8 bits. */
short int *datsint16; /* Puntero a datos tipo entero con
signo de 16 bits. */
unsigned short int *datuint16; /* Puntero a datos tipo entero sin
signo de 16 bits. */
long int *datsint32; /* Puntero a datos tipo entero con
signo de 32 bits. */
unsigned long int *datuint32; /* Puntero a datos tipo entero sin
signo de 32 bits. */
float *datfloat; /* Puntero a datos tipo punto
flotante. */
746 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
PLC exista. */
if (!handle) return 0;
FernandoArielBeunza79156 747
Tesis de Grado en Ingeniera Informtica
/* Tipo desconocido. */
default:
result = 0;
break;
}
free(rdat);
if (!result) break;
/*
Funcin ModemPlcGetField_Terminate:
Libera los recursos utilizados por el bloque Modem PLC Get Field.
*/
int ModemPlcGetField_Terminate(void)
{
return 1;
}
748 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Variables globales. */
static void *handle; /* Manejador de comunicacin entre
bloques Simulink del Modem
PLC. */
/* 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);
/* */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
FernandoArielBeunza79156 749
Tesis de Grado en Ingeniera Informtica
/*
Funcin mdlInitializeSampleTimes:
Establece el tiempo de muestreo utilizado durante la simulacin.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
/* Variables. */
struct HINSTANCE__ *hlib; /* Manejador de biblioteca dinmica. */
/* Carga la biblioteca. */
hlib = NULL;
ModemPlcInterface_Initialize = NULL;
ModemPlcInterface_Output = NULL;
ModemPlcInterface_Terminate = NULL;
hlib = LoadLibrary("MODPLC_SIMULINK");
if (!hlib) return;
ModemPlcInterface_Initialize = (void * (*)(int))
GetProcAddress(hlib, "ModemPlcInterface_Initialize");
ModemPlcInterface_Output = (int (*)(void *))
GetProcAddress(hlib, "ModemPlcInterface_Output");
ModemPlcInterface_Terminate = (int (*)(void *))
GetProcAddress(hlib, "ModemPlcInterface_Terminate");
if ((!ModemPlcInterface_Initialize) || (!ModemPlcInterface_Output) ||
(!ModemPlcInterface_Terminate))
return;
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
int *flag_out; /* Puntero al indicador de
resultado de ejecucin de la
presente operacin. */
unsigned long int *handle_out; /* Puntero al manejador de conexin
de salida. */
750 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
ModemPlcInterface_Terminate(handle);
}
/* Variables globales. */
static int grpid; /* Identificador de grupo. */
static int msgid; /* Identificador de mensaje. */
static void *msg; /* 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
Tesis de Grado en Ingeniera Informtica
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* */
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; /* Manejador de biblioteca dinmica. */
/* Carga la biblioteca. */
msg = NULL;
hlib = NULL;
ModemPlcCreateMessage_Initialize = NULL;
ModemPlcCreateMessage_Output = NULL;
ModemPlcCreateMessage_Terminate = NULL;
hlib = LoadLibrary("MODPLC_SIMULINK");
if (!hlib) return;
ModemPlcCreateMessage_Initialize = (void * (*)(void))
GetProcAddress(hlib, "ModemPlcCreateMessage_Initialize");
ModemPlcCreateMessage_Output = (int (*)(void *, void *, int, int))
GetProcAddress(hlib, "ModemPlcCreateMessage_Output");
ModemPlcCreateMessage_Terminate = (int (*)(void *))
GetProcAddress(hlib, "ModemPlcCreateMessage_Terminate");
if ((!ModemPlcCreateMessage_Initialize) ||
(!ModemPlcCreateMessage_Output) || (!ModemPlcCreateMessage_Terminate))
return;
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
752 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
int *flag_in; /* Puntero al indicador de entrada
de ejecucin de la presente
operacin. */
int *flag_out; /* Puntero al indicador de salida
de ejecucin de la presente
operacin. */
unsigned long int *handle_in; /* Puntero al manejador de conexin
de entrada. */
unsigned long int *handle_out; /* Puntero al manejador de conexin
de salida. */
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
ModemPlcCreateMessage_Terminate(msg);
}
FernandoArielBeunza79156 753
Tesis de Grado en Ingeniera Informtica
/* 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);
754 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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; /* Manejador de biblioteca dinmica. */
/* Carga la biblioteca. */
hlib = NULL;
ModemPlcPutField_Initialize = NULL;
ModemPlcPutField_Output = NULL;
ModemPlcPutField_Terminate = NULL;
hlib = LoadLibrary("MODPLC_SIMULINK");
if (!hlib) return;
ModemPlcPutField_Initialize = (void * (*)(void))
GetProcAddress(hlib, "ModemPlcPutField_Initialize");
ModemPlcPutField_Output = (int (*)(void *, int, int, double *))
GetProcAddress(hlib, "ModemPlcPutField_Output");
ModemPlcPutField_Terminate = (int (*)(void))
GetProcAddress(hlib, "ModemPlcPutField_Terminate");
if ((!ModemPlcPutField_Initialize) || (!ModemPlcPutField_Output) ||
(!ModemPlcPutField_Terminate))
return;
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
InputRealPtrsType data_in; /* Datos de entrada. */
int *flag_in; /* Puntero al indicador de entrada
de ejecucin de la presente
operacin. */
int *flag_out; /* Puntero al indicador de salida
de ejecucin de la presente
operacin. */
unsigned long int *handle_in; /* Puntero al manejador de conexin
de entrada. */
unsigned long int *handle_out; /* Puntero al manejador de conexin
de salida. */
FernandoArielBeunza79156 755
Tesis de Grado en Ingeniera Informtica
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
ModemPlcPutField_Terminate();
}
756 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* 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);
/* */
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; /* Manejador de biblioteca dinmica. */
/* Carga la biblioteca. */
hlib = NULL;
ModemPlcSendMessage_Initialize = NULL;
ModemPlcSendMessage_Output = NULL;
ModemPlcSendMessage_Terminate = NULL;
hlib = LoadLibrary("MODPLC_SIMULINK");
if (!hlib) return;
ModemPlcSendMessage_Initialize = (void * (*)(void))
GetProcAddress(hlib, "ModemPlcSendMessage_Initialize");
FernandoArielBeunza79156 757
Tesis de Grado en Ingeniera Informtica
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
int *flag_in; /* Puntero al indicador de entrada
de ejecucin de la presente
operacin. */
int *flag_out; /* Puntero al indicador de salida
de ejecucin de la presente
operacin. */
unsigned long int *handle_in; /* Puntero al manejador de conexin
de entrada. */
unsigned long int *handle_out; /* Puntero al manejador de conexin
de salida. */
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
758 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
ModemPlcSendMessage_Terminate();
}
/* Variables globales. */
static int grpid; /* Identificador de grupo. */
static int msgid; /* Identificador de mensaje. */
static void *msg; /* 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);
FernandoArielBeunza79156 759
Tesis de Grado en Ingeniera Informtica
ssSetInputPortDirectFeedThrough(S, 1, 1);
ssSetInputPortRequiredContiguous(S, 1, 1);
/* */
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; /* Manejador de biblioteca dinmica. */
/* Carga la biblioteca. */
msg = NULL;
hlib = NULL;
ModemPlcReceiveMessage_Initialize = NULL;
ModemPlcReceiveMessage_Output = NULL;
ModemPlcReceiveMessage_Terminate = NULL;
hlib = LoadLibrary("MODPLC_SIMULINK");
if (!hlib) return;
ModemPlcReceiveMessage_Initialize = (void * (*)(void))
GetProcAddress(hlib, "ModemPlcReceiveMessage_Initialize");
ModemPlcReceiveMessage_Output = (int (*)(void *, void *, int, int))
GetProcAddress(hlib, "ModemPlcReceiveMessage_Output");
ModemPlcReceiveMessage_Terminate = (int (*)(void *))
GetProcAddress(hlib, "ModemPlcReceiveMessage_Terminate");
if ((!ModemPlcReceiveMessage_Initialize) ||
(!ModemPlcReceiveMessage_Output) ||
(!ModemPlcReceiveMessage_Terminate))
return;
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
int *flag_in; /* Puntero al indicador de entrada
de ejecucin de la presente
operacin. */
int *flag_out; /* Puntero al indicador de salida
de ejecucin de la presente
operacin. */
unsigned long int *handle_in; /* Puntero al manejador de conexin
760 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
de entrada. */
unsigned long int *handle_out; /* Puntero al manejador de conexin
de salida. */
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
ModemPlcReceiveMessage_Terminate(msg);
}
FernandoArielBeunza79156 761
Tesis de Grado en Ingeniera Informtica
/* Variables globales. */
static int count; /* Cantidad de datos del campo. */
/* 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);
/* */
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; /* Manejador de biblioteca dinmica. */
762 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Carga la biblioteca. */
hlib = NULL;
ModemPlcGetField_Initialize = NULL;
ModemPlcGetField_Output = NULL;
ModemPlcGetField_Terminate = NULL;
hlib = LoadLibrary("MODPLC_SIMULINK");
if (!hlib) return;
ModemPlcGetField_Initialize = (void * (*)(void))
GetProcAddress(hlib, "ModemPlcGetField_Initialize");
ModemPlcGetField_Output = (int (*)(void *, unsigned char, double *))
GetProcAddress(hlib, "ModemPlcGetField_Output");
ModemPlcGetField_Terminate = (int (*)(void))
GetProcAddress(hlib, "ModemPlcGetField_Terminate");
if ((!ModemPlcGetField_Initialize) || (!ModemPlcGetField_Output) ||
(!ModemPlcGetField_Terminate))
return;
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
int *flag_in; /* Puntero al indicador de entrada
de ejecucin de la presente
operacin. */
int *flag_out; /* Puntero al indicador de salida
de ejecucin de la presente
operacin. */
unsigned long int *handle_in; /* Puntero al manejador de conexin
de entrada. */
unsigned long int *handle_out; /* Puntero al manejador de conexin
de salida. */
real_T *data_out; /* Datos de salida. */
FernandoArielBeunza79156 763
Tesis de Grado en Ingeniera Informtica
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
ModemPlcGetField_Terminate();
}
/* Variables globales. */
static int priority_thread; /* Prioridad del hilo de
ejecucin. */
static DWORD priority_process; /* Prioridad del proceso. */
unsigned long int start_rtime; /* Primera muestra de tiempo real
transcurrido. */
/* 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
Tesis de Grado en Ingeniera Informtica
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* Inicializa dimensiones de entradas y salidas. */
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
/* */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}
/*
Funcin mdlInitializeSampleTimes:
Establece el tiempo de muestreo utilizado durante la simulacin.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
/* Establece el tiempo de muestreo. */
ssSetSampleTime(S, 0, 0.0);
ssSetOffsetTime(S, 0, 0.0);
/*
Funcin mdlOutputs:
Devuelve el resultado de la ejecucin de un ciclo de simulacin del bloque
Simulink.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Variables. */
LARGE_INTEGER freq; /* Frecuencia de reloj. */
LARGE_INTEGER ticks; /* Cantidad de ticks
transcurridos. */
unsigned long int rtime; /* Tiempo real transcurrido. */
unsigned long int stime; /* Tiempo de simulacin
transcurrido. */
real_T *time_diff; /* Puntero a la direrencia entre
tiempo de simulacin y tiempo
real. */
FernandoArielBeunza79156 765
Tesis de Grado en Ingeniera Informtica
if (QueryPerformanceFrequency(&freq))
{
QueryPerformanceCounter(&ticks);
rtime = (unsigned long int)
((((double) (ticks.QuadPart)) * 1000) / freq.QuadPart);
}
else
rtime = (unsigned long int)
(((double) (clock()) / CLOCKS_PER_SEC) * 1000);
if (stime)
rtime -= start_rtime;
else
{
start_rtime = rtime;
rtime = 0;
}
/*
Funcin mdlTerminate:
Finaliza la ejecucin de la simulacin del bloque Simulink.
*/
static void mdlTerminate(SimStruct *S)
{
SetPriorityClass(GetCurrentProcess(), priority_process);
SetThreadPriority(GetCurrentThread(), priority_thread);
}
766 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 767
Tesis de Grado en Ingeniera Informtica
768 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 769
Tesis de Grado en Ingeniera Informtica
770 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Variables globales. */
/*
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. */
/* Procesa mensaje. */
while(1)
{
/* Recibe el mensaje. */
msgid = modplcap_getmsgid(msg);
modplcap_getfield(msg, &type, &count, &val);
FernandoArielBeunza79156 771
Tesis de Grado en Ingeniera Informtica
{
val = 0x00;
if (!(P3 & 0x08)) val |= 0x01;
if (!(P3 & 0x08)) val |= 0x02;
if (!((P3 & 0x10) || (P3 & 0x08))) val |= 0x04;
if (!(P3 & 0x20)) val |= 0x08;
modplcap_putfield(&rmsg, MODPLCAP_UINT8TYPE, 1, &val);
}
/* Enva respuesta. */
modplcap_sendmsg(&rmsg);
break;
}
/*
Funcin main:
Funcin principal.
*/
void main(void)
{
/* Variables. */
unsigned short i; /* Contador. */
__data modplcap_hd *hd; /* Manejador de conexin. */
/* Inicializa puertos. */
P1 = 0xf8;
P0 = 0xff;
P2 = 0xff;
P3 = 0xff;
/* Ciclo de ejecucin. */
772 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
while(1)
{
/* Inicializa la conexin. */
hd = modplcap_init(1);
if (!hd) break;
if (!modplcap_setbuffer(hd, &buffer)) break;
if (!modplcap_notify(hd, func, NULL)) break;
if (!modplcap_publish(hd, 2)) break;
if (!modplcap_subscribe(hd, 1)) break;
/* Luces de posicin. */
case 0x01:
P1 &= 0xfc;
if (P3 & 0x08) break;
if (!(i & 0x0001)) P1 |= ((P1 ^ 0x01) & 0x01);
break;
/* Luces bajas. */
case 0x02:
P1 &= 0xfc;
if (P3 & 0x08) break;
P1 |= 0x01;
break;
/* Luces altas. */
case 0x03:
P1 &= 0xfc;
if ((P3 & 0x10) || (P3 & 0x08)) break;
P1 |= 0x03;
break;
/* Otra configuracin. */
default:
break;
}
/* Actualiza contador. */
i ++;
}
/* Finaliza la conexin. */
modplcap_leave(hd, 2);
modplcap_leave(hd, 1);
modplcap_release(hd);
break;
FernandoArielBeunza79156 773
Tesis de Grado en Ingeniera Informtica
774 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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
Tesis de Grado en Ingeniera Informtica
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.
776 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
directamente de la lnea y tambin por el modem PLC (que tiene capacidad de suministrar una
alimentacin limitada). La transferencia de datos entre el dispositivo cliente y el modem PLC se
lleva a cabo por medio de tres conductores (TX, RX y GND). La interfaz RS232 que posee el
modem PLC se encuentra conectada para poder visualizar por medio de una PC las comunicaciones
entre el dispositivo cliente y el modem PLC.
FernandoArielBeunza79156 777
Tesis de Grado en Ingeniera Informtica
778 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port1; /* Puerto serie utilizado. */
int port2; /* Puerto serie utilizado. */
int badframe; /* Indicador de trama
corrompida. */
size_t i; /* Contador. */
size_t size; /* Tamao de trama
enviada/recibida. */
size_t framesize; /* Tamao de trama. */
unsigned long int c; /* Contador de ciclos de prueba. */
unsigned long int dist; /* Distancia. */
unsigned long int frames; /* Cantidad de tramas de prueba. */
unsigned long int badbits; /* Cantidad de bits errados. */
unsigned long int lostbits; /* Cantidad de bits perdidos. */
unsigned long int sentbits; /* Cantidad de bits enviados. */
unsigned long int badframes; /* Cantidad de tramas
corrompidas. */
unsigned long int lostframes; /* Cantidad de tramas prdidas. */
double difftime; /* Diferencia de tiempo. */
clock_t clock1; /* Tiempo inicial. */
clock_t clock2; /* Tiempo final. */
unsigned char diff; /* Diferencia entre bytes. */
FernandoArielBeunza79156 779
Tesis de Grado en Ingeniera Informtica
/* 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;
/* Inicializa contadores. */
badbits = 0;
lostbits = 0;
sentbits = 0;
badframes = 0;
lostframes = 0;
/* 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
Tesis de Grado en Ingeniera Informtica
break;
/* Patrn 10101010. */
case 3:
printf("patrn 10101010 - ");
for(i = 0; i < size; i++) frame1[i] = 0xaa;
break;
/* Patrn 00110011. */
case 4:
printf("patrn 00110011 - ");
for(i = 0; i < size; i++) frame1[i] = 0x33;
break;
/* Patrn 11001100. */
case 5:
printf("patrn 11001100 - ");
for(i = 0; i < size; i++) frame1[i] = 0xcc;
break;
/* Patrn 01100110. */
case 6:
printf("patrn 01100110 - ");
for(i = 0; i < size; i++) frame1[i] = 0x66;
break;
/* Patrn 10011001. */
case 7:
printf("patrn 10011001 - ");
for(i = 0; i < size; i++) frame1[i] = 0x99;
break;
/* Patrn 00001111. */
case 8:
printf("patrn 00001111 - ");
for(i = 0; i < size; i++) frame1[i] = 0x0f;
break;
/* Patrn 11110000. */
case 9:
printf("patrn 11110000 - ");
for(i = 0; i < size; i++) frame1[i] = 0xf0;
break;
/* Patrn 00111100. */
case 10:
printf("patrn 00111100 - ");
for(i = 0; i < size; i++) frame1[i] = 0x3c;
break;
/* Patrn 11000011. */
case 11:
printf("patrn 11000011 - ");
for(i = 0; i < size; i++) frame1[i] = 0xc3;
break;
/* Patrn secuencia. */
case 12:
printf("patrn secuencia - ");
for(i = 0; i < size; i++) frame1[i] = (char) (i & 0x00ff);
break;
/* Patrn aleatorio. */
case 13:
printf("patrn aleatorio - ");
for(i = 0; i < size; i++)
frame1[i] = (char) ((rand() % 256) & 0x00ff);
break;
}
FernandoArielBeunza79156 781
Tesis de Grado en Ingeniera Informtica
modplcphy_clrbuffer(hd2, 0);
782 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Fin. */
return 0;
}
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port; /* Puerto serie utilizado. */
unsigned char count; /* Multiplicidad. */
unsigned char status; /* Estado de los faros. */
modplcap_ftype type; /* Tipo de campo. */
modplcap_msg msg; /* Mensaje. */
modplcap_hd *hd; /* Manejador de interfaz con la
capa de aplicacin del modem
PLC. */
/* 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;
FernandoArielBeunza79156 783
Tesis de Grado en Ingeniera Informtica
784 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Finaliza la conexin. */
modplcap_release(hd);
/* Fin. */
return 0;
}
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port; /* Puerto serie utilizado. */
unsigned char count; /* Multiplicidad. */
unsigned char status; /* Estado de los faros. */
modplcapcpp_ftype type; /* Tipo de campo. */
modplcapcpp_msg *msg; /* Mensaje. */
modplcapcpp *hd; /* Manejador de interfaz con la
FernandoArielBeunza79156 785
Tesis de Grado en Ingeniera Informtica
/* 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;
786 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* Finaliza la conexin. */
delete hd;
FernandoArielBeunza79156 787
Tesis de Grado en Ingeniera Informtica
/* Fin. */
return 0;
}
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port1; /* Puerto serie utilizado. */
int port2; /* Puerto serie utilizado. */
int badframe; /* Indicador de trama
corrompida. */
size_t i; /* Contador. */
size_t size; /* Tamao de trama
enviada/recibida. */
size_t framesize; /* Tamao de trama. */
unsigned long int c; /* Contador de ciclos de prueba. */
unsigned long int dist; /* Distancia. */
unsigned long int frames; /* Cantidad de tramas de prueba. */
unsigned long int badbits; /* Cantidad de bits errados. */
unsigned long int lostbits; /* Cantidad de bits perdidos. */
unsigned long int sentbits; /* Cantidad de bits enviados. */
unsigned long int badframes; /* Cantidad de tramas
corrompidas. */
unsigned long int lostframes; /* Cantidad de tramas prdidas. */
double difftime; /* Diferencia de tiempo. */
struct timeval time1; /* Tiempo inicial. */
struct timeval time2; /* Tiempo final. */
unsigned char diff; /* Diferencia entre bytes. */
modplcphy_hd *hd1; /* Manejador de interfaz con la
capa fsica del modem PLC. */
modplcphy_hd *hd2; /* Manejador de interfaz con la
capa fsica del modem PLC. */
unsigned char *frame1; /* Trama de prueba, */
unsigned char *frame2; /* Trama de prueba. */
/* Carga parmetros. */
if (argc < 4) return -1;
port1 = atoi(argv[1]);
788 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
port2 = atoi(argv[2]);
frames = atoi(argv[3]);
/* Prueba. */
while(1)
{
/* Inicializa conexiones con capa fsica. */
hd1 = modplcphy_init(port1);
if (!hd1) break;
hd2 = modplcphy_init(port2);
if (!hd2) break;
/* Inicializa contadores. */
badbits = 0;
lostbits = 0;
sentbits = 0;
badframes = 0;
lostframes = 0;
/* 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;
break;
/* Patrn 10101010. */
case 3:
printf("patrn 10101010 - ");
for(i = 0; i < size; i++)
frame1[i] = 0xaa;
break;
FernandoArielBeunza79156 789
Tesis de Grado en Ingeniera Informtica
/* Patrn 00110011. */
case 4:
printf("patrn 00110011 - ");
for(i = 0; i < size; i++)
frame1[i] = 0x33;
break;
/* Patrn 11001100. */
case 5:
printf("patrn 11001100 - ");
for(i = 0; i < size; i++)
frame1[i] = 0xcc;
break;
/* Patrn 01100110. */
case 6:
printf("patrn 01100110 - ");
for(i = 0; i < size; i++)
frame1[i] = 0x66;
break;
/* Patrn 10011001. */
case 7:
printf("patrn 10011001 - ");
for(i = 0; i < size; i++)
frame1[i] = 0x99;
break;
/* Patrn 00001111. */
case 8:
printf("patrn 00001111 - ");
for(i = 0; i < size; i++)
frame1[i] = 0x0f;
break;
/* Patrn 11110000. */
case 9:
printf("patrn 11110000 - ");
for(i = 0; i < size; i++)
frame1[i] = 0xf0;
break;
/* Patrn 00111100. */
case 10:
printf("patrn 00111100 - ");
for(i = 0; i < size; i++)
frame1[i] = 0x3c;
break;
/* Patrn 11000011. */
case 11:
printf("patrn 11000011 - ");
for(i = 0; i < size; i++)
frame1[i] = 0xc3;
break;
/* Patrn secuencia. */
case 12:
printf("patrn secuencia - ");
for(i = 0; i < size; i++)
frame1[i] =
(char) (i & 0x00ff);
break;
/* Patrn aleatorio. */
case 13:
printf("patrn aleatorio - ");
for(i = 0; i < size; i++)
frame1[i] = (char)
((rand() % 256) &
0x00ff);
790 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
break;
}
FernandoArielBeunza79156 791
Tesis de Grado en Ingeniera Informtica
lostframes,
((double) lostframes / (double) frames) * 100);
printf("Tramas corrompidas: %li (%.3f%%)\r\n",
badframes,
((double) badframes / (double) frames) * 100);
printf("\r\n");
break;
}
/* Fin. */
return 0;
}
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
int port; /* Puerto serie utilizado. */
unsigned char count; /* Multiplicidad. */
unsigned char status; /* Estado de los faros. */
modplcap_ftype type; /* Tipo de campo. */
modplcap_msg msg; /* Mensaje. */
modplcap_hd *hd; /* Manejador de interfaz con la
capa de aplicacin del modem
PLC. */
/* 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;
792 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 793
Tesis de Grado en Ingeniera Informtica
/* Finaliza la conexin. */
modplcap_release(hd);
/* Fin. */
return 0;
}
/*
Funcin main.
*/
int main(int argc, char *argv[])
{
/* Variables. */
794 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
/* 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;
FernandoArielBeunza79156 795
Tesis de Grado en Ingeniera Informtica
796 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
delete msg;
break;
}
/* Finaliza la conexin. */
delete hd;
/* Fin. */
return 0;
}
FernandoArielBeunza79156 797
Tesis de Grado en Ingeniera Informtica
798 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
FernandoArielBeunza79156 799
Tesis de Grado en Ingeniera Informtica
Chirp Chirp
Seal conformada por un barrido en frecuencia dentro de un determinado rango de
una seal senoidal.
800 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
DC-BUS DC-BUS
Red de datos desarrollada por la empresa Yamar Electronics Ltd. que emplea como
medio fsico la red elctrica del automvil
DID Destination ID
Campo de un paquete UPB utilizado para especificar al dispositivo destinatario.
FernandoArielBeunza79156 801
Tesis de Grado en Ingeniera Informtica
HF High Frecuency
Banda del espectro de frecuencias utilizada para las comunicaciones PLC
comprendida entre 1 y 30 MHz.
802 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
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.
FernandoArielBeunza79156 803
Tesis de Grado en Ingeniera Informtica
NID Network ID
Campo de un paquete UPB utilizado para especificar la red en donde se encuentra el
dispositivo destinatario.
804 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 805
Tesis de Grado en Ingeniera Informtica
SID Source ID
Campo de un paquete UPB utilizado para especificar al dispositivo que dio origen al
paquete.
SW Symbol Window
Segmento opcional de tiempo del ciclo de comunicacin recurrente de FlexRay
utilizado para evaluar el estado del medio.
806 FernandoArielBeunza79156
Tesis de Grado en Ingeniera Informtica
FernandoArielBeunza79156 807
Tesis de Grado en Ingeniera Informtica
X10 X10
Es un estndar de comunicaciones para el control remoto de dispositivos elctricos.
808 FernandoArielBeunza79156