Universidad Argentina John F. Kennedy

Escuela de Licenciatura en Sistemas

Departamento de Tecnología Informática

Informática Industrial - Curso 2002

Turno: Jueves noche

Docente: Ing. Diego Romero

Proyecto: PLC basados en Linux


Integrantes y Roles:

Brusa, Carlos: Leg. 44049

Investigación y lógica del MatPLC

 

Marazzita, Guillermo  Leg.157731

Investigación e Interfases

Oriolo, Nestor: Leg. 29358

Investigación y compaginación

Smith, Ramiro: Leg. 150079

Investigación y logística


Tabla de Contenidos

Sección A – Introducción

Abstract

Introducción al proyecto

Introducción al Linux

Que es el Linux?

Características

Licencia GNU

Sección B – Funcionalidad

Requisitos del Sistema

Funcionamiento

Modularidad

Sección C – Interfases

Interfases de Entrada / SalidaMódulos personalizados

Interfase a HMI

Conclusión

Sección D – Anexos

Copia de la Licencia GNU

Ensayos

Ensayo - Brusa.doc

Ensayo - Marazzita.doc

Ensayo - Oriolo.doc

Ensayo - Smith.doc

Presentación

MatPLC.ppt


Sección A  -  Introducción


A.1.  Abstract

El presente trabajo es una investigación del proyecto MAT-PLC, obviamente basado en Linux.

Es un proyecto licenciado en Junio de 2001 que busca construir un PLC trabajando sobre una PC y NO sobre un PLC físico.

Se aprovecha el hecho de contar con un sistema operativo que aporta modularidad (Linux) y utilizar sus características para poder hacer un PLC bien modular.

El estado de desarrollo se encuentra en estado pre-alfa  y estiman finalizarlo para junio de 2003.

El presente trabajo comenta los módulos involucrados, los lenguajes sugeridos para su programación y el tipo de interfase de E/S soportado.

A.2.  Introducción al proyecto

El proyecto de MAT es un esfuerzo de producir un Controlador Lógico Programable (PLC) de licencia Linux GNU.

Los PLCs fueron desarrollados en los años 60 para substituir los complejos circuitos eléctricos de relais, que fueran muy utilizados para control de máquinas en procesos de automatización industrial.

Los programas PLCs son usados para definir una serie de acciones que una máquina deberá realizar. El PLC funciona leyendo señales de entrada de los dispositivos tales como sensores o interruptores y, dependiendo de esos valores, devuelven salidas con valores encendido o apagado.

En su forma más simple, un PLC substituye la lógica del relais.  En vez de los dispositivos mecánicos, tales como relais interconectados o contadores de tiempo, proporcionando la lógica para la máquina, el PLC es un dispositivo encajado que realiza la misma función.

Dado que es programable, y esencialmente es una computadora, es más flexible y más fácil cambiar que el cableado físico de relais. Tambièn es mucho más pequeño que su equivalente del relais.  Puede también realizar aritmética y otras funciones tales como servocontrol y mediciones analógicas.

Las docenas de líneas de productos de idéntica funcionalidad pero incompatibles entre ellos, limitan a los clientes a la solución propietaria de determinado vendedor. Linux propone una alternativa de solución con un sistema abierto.

A.3. Introducción al Linux

En 1991 Linus Torvals, estudiante de la Universidad de Helsinki, inició un proyecto personal para hacer del sistema operativo Minix una réplica exacta del sistema operativo Unix, que era un sistema propietario. Torvals quiso compartir su código para que cualquiera pudiera usarlo y contribuir a su desarrollo.

En un principio Linux se obtenía en Internet exclusivamente, y era muy difícil ponerlo en funcionamiento.  Unos años después aparecieron las primeras agrupaciones de software, ya compiladas y organizadas, para que los usuarios menos experimentados pudiesen instalar este sistema. Desde aquí el crecimiento en numero de usuarios fue de manera exponencial. Actualmente ya empieza a ser visto como una alternativa a los SO comerciales.

           

A.4.  Que es Linux ?

Linux es básicamente un clon de Unix, lo que significa que Linux incorpora muchas de las ventajas de Unix.  La multitarea de Linux es totalmente preferente, es decir que permite ejecutar varios programas a la vez de forma ininterrumpida. Otros sistemas, como Windows 3.1 de Microsoft, también permiten ejecutar varios programas a la vez, pero cuando se pasa de un programa a otro, el primero de ellos normalmente deja de funcionar.  Windows NT de Microsoft se parecen mas a Linux ya que permiten ejecutar multitarea preferente.  Con Linux se puede iniciar una transferencia de archivos, imprimir un documento, copiar un disquete, utilizar un CD-Rom y activar un juego todo al mismo tiempo.

Linux posee capacidad multiusuario, lo que significa que más de una persona puede conectarse y utilizar el sistema operativo al mismo tiempo. 

           

Linux es un núcleo de un SO, pero para tener un SO completo hay que acompañarlo de un montón de utilidades, dotarlo de una estructura de directorios, así como  de ficheros de configuración y scripts (fichero que contiene instrucciones para el interprete de comandos) para  distintas tareas.  Todos estos elementos juntos y bien organizadas se denominan distribuciones. Estas distribuciones de Linux corren a cargo de distintas compañías (Red Hat, Slackware, etc.), cada una de  ellas con su propio paquete de programas,  aunque todas faciliten un núcleo de archivos que conformen una versión de Linux.

A.5.  Características

El S.O. Linux se encarga de controlar y asignar los recursos físicos del ordenador (hardware) y de planificar tareas. Podemos establecer tres elementos principales dentro de éste S.O.:

El núcleo del sistema operativo (kernel), el escalón más bajo que realiza tareas tales como el acceso a los dispositivos (terminales, discos, cintas...).

El intérprete de comandos (shell) es la interfase básica que ofrece Linux de cara al usuario. Además de ejecutar otros programas, posee un lenguaje propio así como numerosas características adicionales que se mencionan más adelante.

Utilidades "de fabrica"; normalmente se trata de programas ejecutables que vienen junto con el Sistema Operativo; algunas de ellas son:

Compiladores: C, assembler y en algunos casos C++.

Herramientas de edición: Editores (vi,ex) , formateadores (troff) , filtros ...

Soporte de comunicaciones: Herramientas basadas en TCP/IP (telnet,ftp ...)

Programas de Administración del Sistema (sysadm, sa, sam, va)

Utilidades diversas y juegos (éstos últimos se suele instalar aparte).

A. 6.  Licencia GNU

IBM posee los derechos de OS/2, Microsoft los de MS-DOS y Windows, no sucede así con los derechos de Linux.  En primer lugar, Linux no es un programa de dominio público; varios componentes de Linux tienen derechos de autor de distintas personas.  Linux Torvals conserva los derechos de autor del kernel básico de Linux, estos han protegido sus trabajos bajo la licencia GNU, esta licencia permite a los desarrolladores crear programas para el público en gral.  La premisa fundamental de GNU es aquella de permitir a todos los usuarios acceso libre  a los programas con la posibilidad de modificarlos, si así se desea.  La única condición impuesta es que no puede limitarse el código modificado, es decir que el resto de los usuarios tienen derecho también a utilizar el nuevo código.

El GNU Copyleft (GNU es un acrónimo compuesto de un juego de palabras: GNU No es Unix y Copyleft es juego de palabras derivado de la palabra inglesa Copyright, ) o GPL (General Public License – Licencia Pública General), permite a los creadores de programas conservar sus derechos de autor, pero permitiendo el resto de los usuarios la  posibilidad de copiarlos, modificarlos y hasta venderlos.  Sin embargo, al hacerlo, no pueden limitar ningún derecho similar a los que compren el programa.  Si se vende el programa tal y como está o una modificación del mismo, el usuario debe facilitar además el código fuente.  Por ello, cualquier versión de Linux incorpora siempre el código fuente del mismo.


Sección B  -  Funcionalidad



B.1.  Requisitos del sistema

Tal como un sistema básico de Linux, la compilación y el funcionamiento del sistema de MatPLC requiere algunos paquetes adicionales.

Para compilar y para funcionar el MatPLC, se necesitará GCC(compilador de C), libtool, lo hace y los otros paquetes generalmente implicados en la compilación - los archivos de jefe, los linkers, etc.

Además, se necesitará casi ciertamente el paquete del desarrollo de las consola-herramientas. El demo básico depende de esto, y no es instalado generalmente por defecto.

B.2.  Funcionamiento

El proyecto MAT es un estudio interesante como controlador embebido. Comparándolo con cualquier producto embebido, el MAT es mucho más general.

Un PLC tiende a ser muy costos. El MAT, que funciona en una PC será también una solución a costo más competitivo.

Proveer una plataforma que permita compartir y reutilizar el código, debe permitir levantar la productividad de los abastecedores de las soluciones por lo menos en orden a la magnitud, eliminando la pérdida enorme por mantener centenares de soluciones paralelas.  Esto permitirá a los integradores, a los consultores y a equipos internos concentrar sus capacidades en la competencia.  Una solución libre, abierta también beneficiará los educadores, que enseñan el uso de Controladores y cómo trabajan. 

Aunque el MatPLC se pensó para emular un PLC estándar, tiene una arquitectura muy diversa.  Debe aprovecharse el hecho que funcionará sobre un sistema operativo hecho y derecho (en este caso Linux), pero sobre todo porque se quiso que fuera altamente modular para poder soportar múltiples partidas de desarrollo de código simultáneamente. 

A diferencia de un PLC estándar, el MatPLC no necesariamente funciona en un bucle infinito:  leyendo las entradas, ejecutando la lógica, y actualizando las salidas.  El MatPLC se compone de módulos autónomos que, por defecto, se ejecutarán en procesos separados.  Cada uno de estos módulos está libre decidir si o no se ejecuta en un lazo estándar del PLC.

La comunicación entre los módulos se hace a través de una biblioteca común de MatPLC de rutinas (véase el cuadro 2), escrito en C y con los archivos de C disponibles.  Estas rutinas tienen acceso a dos áreas de memoria comunes que juntas controlan el estado del PLC y lo sincronizan usando semáforos.

B.3.  Modularidad

Es la llave para solucionar problemas grandes. Esto significa dividir el problema en secciones (o los módulos, los componentes, los bloques, etc) y solucionar cada sección por separado.

Un programa se pudo dividir a lo largo del flujo de proceso  por el modo (manual, automático, etc); por los niveles (solo movimientos, movimientos compuestos, acciones, táctica, estrategia); por el propósito (control, supervisando, mmi, etc); o de una cierta otra manera que tiene sentido para el proyecto.

A menudo, una sección sigue siendo demasiado grande para ser solucionada en una sola pieza, así que se divide en subdivisiones de una manera similar.

La ventaja con modularidad - y la razón por la que es importante - es asegurarse de que cada sección hace un trabajo solo, bien definido. Debe obrar recíprocamente con otras secciones escasamente; una subdivisión debe obrar recíprocamente solamente dentro de la sección, a menos que su propósito sea específicamente interacción (en qué caso debe hacer poco ). Obviamente, como todas las reglas, esto se puede romper en alguna ocasión, pero no a menudo.


Sección C  -  Interfases


C.1. Módulos de Entrada/Salida

C.1.1. Opciones comunes de E/S

C.1.1.1. Introducción

La mayoría de los módulos de E/S utilizan una sintaxis común para registrar puntos físicos de E/S a los puntos MAT. Además, cada módulo de E/S puede tener configuración adicional.

C.1.1.2. Registro 

El registro entre la E/S física y los puntos del PLC se especifica usando una tabla “mapa”.

El formato de cada línea es:


map [inv | invert] {in | out} <io_addr> <matplc point>

inv o invert

Invierte el valor leído/escrito a la E/S física, todos los bits se invierten.

In: Copia el estado de la  E/S física al punto del matplc (es una entrada)

Out : Copia el estado del punto del matplc a la salida física (es una salida)

< io_addr >

Dirección de la E/S física. El formato de esta dirección dependerá del tipo de E/S física con que se trabaje.

< matplc point>

El punto MAT al cual esta relacionada la E/S física .

C.1.1.3. Ejemplo

Por ejemplo, suponiendo que estamos utilizando el módulo paralelo del puerto E/S. Tenemos LED´s que se enciendan para arriba cuando la salida es baja, así que elegimos invertir todas las salidas así que los LED se encenderán para arriba cuando el punto del PLC se fija a 1.

 

En la tabla mapa:

map inv out D.0 L1

map inv out D.1 L2

map inv out D.2 L3

map inv out D.3 L4

C.1.2.  Entrada / Salida CIF

C.1.2.1.  Introducción

Este módulo de MAT, junto con el módulo correspondiente del kernel (driver de dispositivo), interconecta con las tarjetas de E/S CIF.

Estas tarjetas soportan las siguientes redes y protocolos (en orden alfabético): ASi, CANopen, ControlNet, DeviceNet, Interbus, ModBus más, PROFIBUS y Sercos. Hilscher implementa el protocolo en su firmware. Usando esto como el interfaz al bús, tambien podemos utilizar código GPL capaz de dialogar con el firmware de la tarjeta y hacia afuera a través de la red.

 
C.1.2.2. La registración

El < io_addr >  del mapa posee un formato simple de un bit .

Los números se pueden dar en el decimal (58) o en hexadecimal (0xA).

 

C.1.2.3. Configuración

BoardID

La tarjeta BoardId del CIF. Ésta es la identificación que el módulo del kernel utiliza para identificar la tarjeta que deseamos utilizar.

El módulo del CIF del MatPLC no tiene acceso directamente a la tarjeta del CIF, lo hace a traves del driver de la tarjeta. Cuando se carga este módulo, encuentra cada tarjeta basada PCI del CIF automáticamente. Las tarjetas en el bús  ISA tienen que ser especificadas explícitamente en la línea de comando cuando se carga el driver de dispositivo. A cada tarjeta a que el driver de dispositivo puede tener acceso se le da un número único a partir del 0..3. Puesto que el kernel  utiliza el driver de dispositivo para controlar la tarjeta del CIF, necesita siempre el numero identificador.

DPMsize

El tamaño del DPM (memoria de puerto dual), en kilobytes.

Éste es el tamaño del DPM en la tarjeta que el módulo utilizará. Este parámetro no es realmente muy importante, esto es básicamente permitir que el modulo del CIF verifique en tiempo de configuración si cualquier punto del registro plc  puede ser registrado fuera de la imagen de proceso de la tarjeta. El tamaño (en octetos) de cada imagen de proceso depende del tamaño de DPM (en kilobytes) y esta dada por: ((tamaño DPM * 1024) - 1024)/2

En tiempo de ejecucion el módulo verificará si la tarjeta que está utilizando realmente tiene un DPM y su tamaño.

Valor defecto  8. Otro valor posible puede ser 2 (kilobytes).

timeout

Timeout máximo al intentar tener acceso a la tarjeta del CIF. El valor esta dado en ms, un 0 significaria sin timeout. El defecto es 100 (ms).

C.1.3. Puerto paralelo E/S

C.1.3.1. Introducción

El puerto paralelo tiene 17 bits de E/S, que pueden configurarse como entrada o como salida. Hasta 12 se pueden configurar como salidas, y dependiendo del hardware y la forma de acceso hasta los 17 puede ser configurados como entradas.

El puerto paralelo se puede acceder directamente o a través del driver del kernel.

Los bits se impactan en tres registros, D, S y C. Registro D puede ser una entrada o salida, S es siempre entrada. El registro de C suele ser una salida, pero puede ser utilizado como entrada si el puerto es accedido directamente (no a través del driver del kernel) y si el hardware lo soporta, que varía entre los fabricantes. La dirección de estos registros configurables se deduce del registro; o puede ser especificada directamente.

El formato de la columna < io_addr>  para el mapa es R.x donde R es el registro (D, S o C) y x es el número del bit. Los rangos de dirección validos se enumeran en la tabla.

Registro

Rango

Número

Dirección

Nota

Pins

D

D.0-d.7

8

output/input

LS TTL

2-9

S

S.3-s.7

5

entrada

LS TTL

15/13/12/10/11

C

C.0-c.3

4

generalmente salida

Colector Abierto de la TTL

1/14/16/17

Observar que mientras que algunos de los bits de S y C son invertidos por el hardware del puerto paralelo, este módulo re-invierte todos estos bits para presentar una interfase coherente. Sin embargo, se pueden  verificar todos los estados como salidas para evitar acciones inesperadas durante el arranque.

C.1.3.2. Configuración

io_addr

La dirección base del puerto paralelo. 0x378 es el defecto si no se especifica ningún io_addr. Se puede usar 0x278 si la primera vez no trabaja correctamente.

Ejemplo: io_addr = 0x378

NOTA: Sin relacion a la columna <io_addr>  del mapa.

dev_file

Si se prefiere usar el driver del kernel, entonces se especifica el archivo del dispositivo.

Ejemplo: = dev_file/dev/plc_parport0

NOTA: Si ambos métodos antedichos se configuran, entonces el driver del kernel será utilizado. Si este método falla entonces se levantara el modo de acceso directo utilizando la dirección especificada.

Ddir

Define la dirección { entrada | salida } que el registro D debe utilizar. Si se omite esto, será deducido automáticamente del registro.

Ejemplo: Ddir = out

Cdir

Define la dirección { entrada | salida } que el registro C debe utilizar. Si se omite esto, será deducido automáticamente del registro.

Ejemplo: Cdir = in

El registro  S es siempre una entrada y su dirección no es configurable.

C.1.4. Log de Datos

C.1.4.1. Introducción

Existen dos módulos de log mat/io/logger y mat/io/logger_db


Logger utiliza texto plano.


Logger_db utiliza una base de datos MYSQL .

C.1.4.2. Configuración del módulo de Log

Opciones de la configuración que necesitan ser fijadas para utilizar un módulo de log:

file = nombre de fichero


points nombre1 nombre2...


scan_period = sec


Ejemplo:

[ Logger ]

file = chaser.log

points L1 L2

points L3 L4

scan_period = 0.25

C.1.4.3. Configuración del módulo de Logger_db

Opciones de la configuración que necesitan ser fijadas para utilizar un módulo del logger_db:

host = host name

user = user name

password = password

#port_num = port#

#socket_name = socket name

db_name = database name

table = table name

points pointname1 pointname2 ...

scan_period = sec



Ejemplo:

[LOGGER_DB]
host = localhost

user = matuser

password = mat

#port_num = 0

#socket_name =

db_name = matlog

table = demolog

points L1 L2

points L3 L4

C.1.5. Otros Módulos de Entrada / Salida

Tarjetas 8255

Modbus

Conexión UDP

C.2.  Módulos personalizados

C.2.1. Introducción

La mayoría de las veces, una combinación de los módulos existentes (genéricos y/o específicos) satisfará los requisitos de un proyecto. Sin embargo, a veces solamente un módulo personalizado lo hará. Aquí se analizara rápidamente como realizar un modulo personalizado.

Los módulos personalizados  se pueden escribir en varios idiomas. Caen en dos amplios grupos, C y el resto.

C.2.1.1.  Lenguaje C

C es el recomendado porque es la lengua nativa del MatPLC. Como tal, permite el acceso a 100% de la funcionalidad tan pronto como aparezca en el MatPLC, y es un poco más eficiente (aunque con las computadoras actuales esto no es tan importante).

C.2.1.2.  El resto de los lenguajes

La escritura C es un trabajo del especialista, y es a veces mejor escribir en una lengua más “amigable” tal como python (clase de BASIC semejante o de VB pero de cerca de tres décadas más moderno). Si se está utilizando ya uno de estos lenguajes en otra parte del proyecto, este puede conectarse directamente desde allí con el MatPLC sin la utilización de un intermediario.

Otro propósito de esta sección es explicar algo de los funcionamientos de los módulos genéricos y específicos provistos. Los módulos provistos del MatPLC funcionan exactamente de la misma manera que los módulos de encargo. Todos se escriben actualmente en C nativa .

C.2.2.  Módulos personalizados - Python

C.2.2.1.  Introducción

La lengua de Python fue diseñada para alcanzar alta performance y poseer una sintaxis muy clara. Tiene características modernas como modularidad, OO, tratamiento de excepciones, tipos de datos dinámicos.

C.2.2.2.  Instalación en python

La extensión del python debe ser instalada antes de que pueda ser utilizada.

cambiar al directorio de lang/python

opcional ./setup.py

como root: el /setup.py install

Si  no se tiene la librería compartida de MatPLC instalada en el lugar se debera generar la variable de entorno LD_LIBRARY_PATH para señalar al directorio de MatPLC lib/.libs antes de comenzar el python o la escritura del python.

C.2.2.3.  Ejemplo

import matplc

matplc.init("example")

foo = matplc.point("foo")

bar = matplc.point("bar")

es_out = matplc.point("es_out")

try:

            while 1:

                        matplc.scan_beg()

                        matplc.update()

                        if foo.get():

                                   bar.set(1)

                        else:

                                   bar.set(0)

                        matplc.update()

                        matplc.scan_end()

finally:

            es_out.set(1)

            matplc.update()

Matplc.done()

C.2.3.  Módulos de encargo - Tcl

C.2.3.1.  Introducción

La lengua del Tcl fue diseñada para ser un lenguaje scripting simple. Salvando que se tenga conocimiento en la misma o alguna otra razón especifica para utilizarla se recomienda  utilizar el python en lugar de otro.

C.2.3.2.  Comandos y opciones

Aquí se describen los comandos del Tcl puestos en ejecución por la extensión de MatPLC; este asume un conocimiento de trabajo del Tcl que programa y la interfase de programación de la lengua de MatPLC ‘ C ‘.

Se carga el módulo con un explícito comando load, o con paquete requerido lplc.

El módulo implementa un nuevo comando del Tcl en ejecución, lplc, que tiene la forma:

lplc subcomando [opciones...]

Se ponen en ejecución los subcomandos y las opciones siguientes:

lplc init [-module string] [-array arrayname] [--PLCoptions]

Se agregan al MatPLC en ejecución. Debido a la naturaleza de la rutina del plc_init() en MATPLC, esta llamada no retorna hasta que la inicialización se realiza exitosamente .

El módulo del defecto para las escrituras del Tcl es “TCL”. Esto se puede sobreescribir con  la opción -module.

Si se especifica un nombre de array, el comando del init crea un array con el nombre especificado de le siguiente manera:

Array(count)

número de puntos

nombre del punto en el índice x (donde 0 <= x < contador) 

Array(x, name)

Si el punto en el índice x es inválido (es decir manejador valido== 0), el nombre es INVÁLIDO (éste no debe suceder, pues los indices son dictados por la configuración.)

Las opciones del plc especificadas por la rutina del plc_init() se pueden pasar en la línea de comando también. Observar que esta lista incluye PLCmodule = cadena , otra forma  para sobreescribir el módulo por defecto.

lplc hecho

Desconecta del MatPLC.

Lplc getpt [-nombre del punto]

Vuelve el valor actual del punto nombrado.

Genera un error del Tcl si el punto nombrado no puede ser alcanzado.

Nota: el comando  getpt realiza un plc_update() y posteriormente un plc_get()

lplc setpt[-name pointname] [-value value]

Fija el punto nombrado al valor especificado.

Genera un error del Tcl si el punto nombrado no puede ser alcanzado

Nota: el comando  setpt realiza un plc_set() y posteriormente un plc_update()

 

Lplc update [-array arrayname]

Actualiza la copia del módulo de los datos de MatPLC.

Si se especifica un nombre de array, se completa de la siguiente forma:

array(x, value)

valor del punto en el índice x

C.2.4.  Módulos personalizados en C 

C.2.4.1.  Un módulo básico

La estructura básica debe ser la siguiente:

#include <plc.h>

int main(int argc,char *argv[])

{

  plc_init("modulename",argc,argv);

  /* initialization goes here */

  while (1) {

    plc_scan_beg();

    plc_update();

    /* body of loop goes here */

    plc_update();

    plc_scan_end();

  }

}

C.2.4.2.  Inicialización

Una de las tareas principales que es necesario realizar aquí es crear las variables  a todos los puntos que el programa tendrá acceso.

 
foo = plc_pt_by_name("foo");

 
bar = plc_pt_by_name("bar");

foo y bar se deben declarar como variables del  tipo plc_pt_t. Para mayor seguridad, se puede  también comprobar que foo.valid y bar.valid sean diferentes a cero después de la inicialización antedicha.

A través del resto del programa,  entonces se utilizarán las variables foo y bar para referirse a esos dos puntos.

C.2.4.3.  Cuerpo del loop

Las dos funciones más importantes aquí:

plc_get(point)

lee el estado del punto

plc_set(point,value)

escribe el valor al punto

Éstos se utilizan para las bobinas y para los registros del número entero. Cuando está utilizado para bobinas, 0 se interpreta como APAGADO y 1 como ENCENDIDO.

Cuando se está utilizando para los registros, el valor se trata como número entero de 32-bit sin signo (MAT define el tipo u32 para este propósito). Puntos de menor tamaño  se pueden también tratar como enteros sin signo - por ejemplo, un plc_get() en un punto 8-bit devolverá un número entre 0 y 255.

 Es importante resaltar  que para el plc_set() , es necesario que exista la relación en el archivo matplc.conf file.Si se intenta escribir un punto que no ha sido agregado los cambios se perderáan en el plc_update siguiente.

C.2.5.  Referencia del Mapa Global de Memoria (gmm)

El mapa global (gmm) es el área de datos común para los usos del  MatPLC. Contiene todos los datos que son utilizados por todos los módulos del MatPLC, incluyendo E/S física, de bobinas internas, y de cualquier dato que se compartirá entre los módulos. Los datos confidenciales se pueden todavía mantener dentro del módulo, pero si los datos no están en el mapa de memoria global, no van a estar disponibles para ningún otro motor de la lógica, los módulos de HMI, las herramientas de puesta a punto, etc.

Cada módulo, al arrancar, adquiere  una copia privada del mapa de memoria global. Todas las funciones que realice el mismo se copian a este mapa de memoria privado que entonces se sincroniza al mapa de memoria global con una llamada de la función en la biblioteca compartida de la memoria. Esta sincronización es el semáforo controlado, que proporciona actualizaciones atómicas. Cuando el sistema funciona con un solo motor de lógica, esto permite que el MatPLC imite el comportamiento de un PLC tradicional.

El administrador de memoria compartida (smm/smm-mgr) era el programa que asignaba/desasignaba e inicializaba la memoria compartida . Actualmente esto puede cambiar.

La biblioteca del gmm de MatPLC es la única manera de tener acceso a la memoria compartida. En la inicialización, asigna un mapa privado y también una máscara del mapa. La máscara se utiliza para determinar si un módulo tiene permiso de escritura de un punto de referencias particular. Si un módulo intenta modificar un punto de referencias al cual no tiene permisos de escritura el, los cambios se desechan durante la actualización.

La biblioteca proporciona algunas funciones para el acceso al mapa global, y algunas funciones, tipos y variables de menor jerarquía. Observar las distinciones entre la memoria privada y global.

 

plc_init()
plc_done()

el plc_init() se utiliza para inicializar un mapa de memoria privado para un módulo. Esto se debe llamar una vez al principio del módulo.

el plc_done() se utiliza para dar de baja la biblioteca y el mapa de memoria privado para el módulo. Este debe ser llamado si el módulo sale por cualquier razón.

Limitación: La función del plc_done() no es particularmente completa - debe cerrar el módulo totalmente, y desasignar toda la memoria de modo que el plc_init() se pudiera llamar otra vez. Esto no se hace actualmente, una razon es por  descuido y tambien porque la mayoría de los ejemplos son bucles infinitos y se sale inmediatamente después de llamar al plc_done().

 plc_init(module_name, argc, argv);

 plc_done();

no en tiempo real (no se verifica en el momento que sucede la acción)

 

plc_pt_t

Éste es el tipo de dato que define el punto.

El único campo del plc_pt_t que es público es .valid field. Esto indica si la variable del punto está inicializada correctamente. Diferente a cero indica éxito.

Los lenguajes que manejan excepciones típicamente no tienen un campo .valid field en el tipo correspondiente.

Las variables del punto se obtienen generalmente usando el plc_pt_by_name() , el plc_subpt() o el plc_pt_null() de las funciones .

 data_point del plc_pt_t; 

 
 

plc_get()

Permite la lectura del mapa de memoria privado. Observar que ésta puede no ser una representación exacta de los datos en el mapa de memoria global, pues se almacena como una instantanea de datos desde la ulitma llamada pasada al plc_update() . Si es crítico que los datos más exactos estén actualizados, se debera llamar al plc_update() antes del plc_get() . No hay restricción a qué datos pueden ser leidos dentro el mapa de memoria privado.

i=plc_get(data_point);

Data_point es del tipo plc_pt_t , y se chequea para asegurarse de que es una direccion privada válida del mapa de memoria.

El valor devuelto es un entero sin signo de hasta (actualmente) 32 bits, según lo leído en el mapa privado en la localización tratada por el data_point.

en tiempo real; inmediato (se tiene conocimiento del suceso en el mismo momento en el que sucede)

 

Plc_set()

Permite la escritura del mapa de memoria privado. No hay restricción a qué se puede escribir al mapa de memoria privado. Sin embargo, cuando se llama el plc_update(), cualquier cambio a los datos -sin permiso de escritura- en el area de memoria compartida será desechado. Esto da la seguridad de que cualquier cambio realizado sera hecho solo por quien posea los privilegios para tal. Los cambios realizados al mapa de memoria privado no serán reflejados en el mapa de memoria global hasta que se llama el plc_update. Si es crítico actualizar los cambios de los datos al mapa de memoria global, se debera llamar al plc_update() inmediatamente después del plc_set() .

plc_set(data_point, value);

data_point es del tipo plc_pt_t , y se chequea para asegurarse de que es una direccion privada válida del mapa de memoria.

el valor es un entero sin signo de 32-bit. Este valor se colocara en el data_point una vez invocada la funcion.

en tiempo real; inmediato

 

plc_update()

Realiza la actualizacion de los cambios generados en el area de memoria privada al area de memoria global. Si el mapa de memoria privado contiene cambios a los datos para los cuales no se poseen permisos de escritura en el mapa de memoria global, los cambios se desechan.Las actualizaciones trabajan como un semáforo controlado. Esto preve actualizaciones atómicas del mapa de memoria global entre todos los módulos.

Nota: Algunos de los demas lenguajes como por ejemplo el Tcl scripting , no tiene explícitamente esta función; en cambio, llaman al plc_update() cada vez que un punto es modificado.  

 plc_update(); 

en tiempo real; puede demorar el semáforo

C.2.6.  Config file (archivo plano de configuración)

El archivo config es el mecanismo básico para que el usuario especifique ajustes y parámetros. Es imprescindible que todos los datos se encuentren aqui, o bien en un archivo nombrado por el config. Es terminantemente inalterable; solamente el usuario puede cambiar los valores en estos archivos.

Se divide en secciones: normalmente, cada modulo leera su correspondiente sección. Sin embargo, puede también leer otras secciones - por ejemplo, cada módulo lee en la sección [ PLC ]  las prioridades del semáforo y la lista de puntos.

C.2.7.  Un módulo personalizado de E/S

Los módulos del E/S son todos muy similares, a excepción de la manera en que estos acceden al hardware, y el formato que manejan de las direcciones de hardware de E/S que se especifican en el archivo de configuración. Existe una librería escrita de E/S que utilizan los módulos de E/S. Esta librería posee básicamente todo lo que requiere un módulo del E/S (incluyendo la funcion main()), a excepción de las funciones para tener acceso al hardware e interpretar las direcciones de hardware especificadas en los config.

Esta se encuentra en /lib/io/io_hw.h.

  

C.3.   Interfase a HMI

C.3.1  Introducción al HMI

hmi_gtk.c es un interpretador HMI.

El principal propósito del interpretador HMI es construir un GUI (interfase grafica hacia el usuario) para leer y escribir puntos en MatPLC

Glade es usado para construir la interfase.

C.3.2. Nombres del Widgets

Los  widgets son conectados a los puntos del  MatPLC para darles un nombre especial. El camino más facil para la construcción de los nombres es usando el widgetnamer wizard.

 

C.3.2.1. Usando el widgetnamer

Cuando el widgetnamer comienza, emitirá un cuadro de diálogo. Se completará con los siguientes detalles:

Point

Los puntos a los cuales deben de ser conectados el widget.

Widget number

Normalmente, este será 0. Si quiere mostrar varios widgets en el mismo punto, vos necesitas el número de ellos (0,1,2, etc)

Type

El punto de un punto al cual se esta conectadando. Para rollos, este debe ser booleano (on/off), para registros tenes que verificar que tipos son y seleccionarlos apropiadamente. Todos los puntos usados por DSP son f32 (floating-point number).

Parameter 1

Este tiene diferentes significados dependiendo de el tipo. Para instancias, para el tipo boolenao sera el texto ON o una imagen.

Parameter 2

Este tiene diferentes significados dependiendo de el tipo. Para instancias, para el tipo boolenao sera el texto OFF o una imagen.

Una vez que se haya llenado, debe hacer un click en “select”. Las entradas pueden ser limpiadas con el boton “Clear”.

 

C.3.2.2. Explicación de los nombres widget.

El nombre son puestos de la siguiente forma:

_pointname[.number[.type][.parameter1[.parameter2]]]

El campo número es necesario porque todos los widgets en una ventana deben ser un únicos. El tipo puede ser booleano i32, i16, i8, u32, u16, u8 or f32.

Ejemplo: _left.0.bool.on.off

Este puede ser el nombre de un LabelWidget que será mostrado "on" o "off" dependiendo del estado del punto llamado “left” en el MatPLC.

C.3.2.3. Clases de  widgets (módulos)

Los widgets que son actualmente soportados son:

Label (Output)

Soporta todos los tipos.

 
param1 = mensaje de ENCENDIDO.


param2 = mensaje de APAGADO.

 

Progress (Output)

Soporta flotante en un rango de 0.0 a 100.0.

GnomePixmap (Output)

Soporta tipo booleano

 
param1 = nombre de archivo gráfico de ON (la extension .xpm es automaticamente agregada)
param2 = nombre de archivo gráfico OFF la extension .xpm es automaticamente agregada)

ToggleButton (Input)

Soporta tipo booleano

Add Signal: toggled, Handler: update_value

Button (Input)

Soporta tipo booleano

Add signal: pressed, Handler: update_value

Add signal: released, Handler: reset_value

Entry (Input)

Soporta todos los tipos.

Add Signal: activate, Handler: update_value

C.3.2.4. Probabilidades y fines

En orden para las entradas de los widgets para el trabajo deben agregarse señales con handler = update_value.

En orden para la habilitación de las variables, deben ser asiganadas a el modulo en el archivo matplc.conf . el modulo por defecto es el interpretador HMI hmi_gtk.

C.3.3. Juntando todo

La manera sugerida de construir un proyecto es crear un proyecto en hmi_gtk nombrado glade. Entonces agregue una ventana del uso de Gnome encontrada en la gama de colores de Gnome. Suprima las opciones indeseadas del menú y las opciones toolbar. La opción del menú exhibirá alrededor automáticamente créditos de este proyecto. Uno puede agregar widgets a esta ventana y conectar widgets con el MatPLC siguiendo descrito previamente el nombrar de la convención.

Construir un proyecto de multi-ventanas uno puede agregar la ventana normal Widgets encontrado en la gama de colores básica de GTK+ de Glade. Para abrir este ventanas adicionales que necesitamos ligar una señal de un botón, botón toolbar o la opción del menú. Hay dos maneras de ligar ventanas a los widgets (es decir botón):

Una forma es utilizar los 10 nombres predefinidos para las ventanas dentro del intérprete de HMI, window1 a window10, cada con una función predefinida run_window1 hasta run_window10. Al abrir una ventana de una opción solo hay una forma de llamarla, solo se necesita agregar el correspondiente nombre del manejador a la opción del menú (es decir tratante: run_window5). Esto limita el número de ventanas adicionales para llamar a las opciones del menú.

Hay una manera alternativa de llamar una ventana que se pueda utilizar por el otro Widgets como el widget del botón. Este método utiliza a tratante común llamado run_window, este tratante cuenta con un nombre de la ventana en el parámetro de los datos de la señal. Este método no impone un límite ante el número de las ventanas que el proyecto puede abrir. Uno podía también llamar las ventanas predefinidas de este los widgets agregando al tratante de la ventana a la señal correspondiente

Ejemplo de conexión de un botón widget a la ventana.

En la solapa de las señales de la ventana escriba:

Signal:

Clicked

Handler:

run_window

Data:

WindowName (This has to be the name of the window in Glade)

Después tipee Agregar (Add)

Debido a preocupaciones del funcionamiento, hay una característica en el programa que permite solamente que una versión de cada ventana esté abierta al mismo tiempo.

Cuando guarde el proyecto de glade que bajo el archivo de hmi_gtk.glade, este archivo es lo que utiliza el intérprete funcionar el HMI gráfico.

C.3.4. Advertencia:

Debido a un Bug en el glade 0,6,2 y versiones anteriores, el estado escalado GnomePixmap no se guarda. Esto hará * el archivo de la configuración del glade soltar esta información cada vez que se ahorra un cambio. En este demo la línea siguiente fue insertada manualmente para cada widget escalado: <scaled>True</scaled>

Este simple bug hace la correción con imágenes escadas Gnomepixmap no muy comodas Desde la versión0.6.3 este bug funciona correctamente, esta nueva versión se puede bajar de: ftp://ftp.gnome.org/pub/GNOME/stable/sources/glade/glade-0.6.3.tar.bz2 ftp://ftp.gnome.org/pub/GNOME/stable/sources/glade/glade-0.6.3.tar.gz

Libglade no reconoce el estado escalado tampoco, por lo tanto una solución del interino fue puesta en ejecución en módulo de hmi_gtk.c. La inconveniencia es que el nombre del pixmap tiene que ser puesto en el nombre del widget usando el formato siguiente: filename.ext_id

El widget se escala realmente al tamaño del widget y de no usar los factores de posicionamiento del GnomePixbuf.

El widget progressbar también tiene un problema similar pero con las gamas y los factores de la barra del progreso, éste limita la flexibilidad de este widget para escalar la señal entrante. Ahora es solamente posible exhibir un valor 0,0 a 100,0 usando este widget.

C.3.5. Ejemplos de pantallas HMI

                                               Figura C.1.HMI Linux

Sample

Figura C.2. HMI Linux


C.4.  Conclusión

El presente trabajo demuestra la importancia de utilizar PLC basados en Linux como alternativa al uso de PLC comerciales.

A diferencia de otros proyectos basados en Linux se destaca MatPLC ya que no es un desarrollo corporativo, con la ventaja de una personalización del producto. Esta personalización de módulos nuevos y existentes es alentada por los desarrolladores, para contribuir al proyecto, quienes brindan las herramientas necesarias para tal fin siguiendo la política open source.

Esto último puede ser visto como una ventaja o una desventaja según la capacidad operativa de la empresa ya que el soporte brindado por el proyecto es a través de programadores free lance.

Otra ventaja importante es el hecho de trabajar con una PC reemplazando la CPU del PLC, lo que significa una más alta capacidad de procesamiento a menor costo y la posibilidad,  a partir de esto,  de implementar varios motores de lógica de control simultáneo.

C.5. Bibliografía

http://mat.sourceforge.net/

http://visual.sourceforge.net/

www.gnu.org


Sección D  -  Anexos


D.1. Licencia GNU

D.1.1.  Preámbulo

Las licencias que cubren la mayor parte del software están diseñadas para quitarle a usted la libertad de compartirlo y modificarlo. Por el contrario, la Licencia Pública General de GNU pretende garantizarle la libertad de compartir y modificar software libre, para asegurar que el software es libre para todos sus usuarios. Esta Licencia Pública General se aplica a la mayor parte del software del la Free Software Foundation y a cualquier otro programa si sus autores se comprometen a utilizarla. (Existe otro software de la Free Software Foundation que está cubierto por la Licencia Pública General de GNU para Bibliotecas). Si quiere, también puede aplicarla a sus propios programas.

Cuando hablamos de software libre, estamos refiriéndonos a libertad, no a precio. Nuestras Licencias Públicas Generales están diseñadas para asegurarnos de que tenga la libertad de distribuir copias de software libre (y cobrar por ese servicio si quiere), de que reciba el código fuente o que pueda conseguirlo si lo quiere, de que pueda modificar el software o usar fragmentos de él en nuevos programas libres, y de que sepa que puede hacer todas estas cosas.

Para proteger sus derechos necesitamos algunas restricciones que prohiban a cualquiera negarle a usted estos derechos o pedirle que renuncie a ellos. Estas restricciones se traducen en ciertas obligaciones que le afectan si distribuye copias del software, o si lo modifica.

Por ejemplo, si distribuye copias de uno de estos programas, sea gratuitamente, o a cambio de una contraprestación, debe dar a los receptores todos los derechos que tiene. Debe asegurarse de que ellos también reciben, o pueden conseguir, el código fuente. Y debe mostrarles estas condiciones de forma que conozcan sus derechos.

Protegemos sus derechos con la combinación de dos medidas:

Ponemos el software bajo copyright y

le ofrecemos esta licencia, que le da permiso legal para copiar, distribuir y/o modificar el software.

También, para la protección de cada autor y la nuestra propia, queremos asegurarnos de que todo el mundo comprende que no se proporciona ninguna garantía para este software libre. Si el software se modifica por cualquiera y éste a su vez lo distribuye, queremos que sus receptores sepan que lo que tienen no es el original, de forma que cualquier problema introducido por otros no afecte a la reputación de los autores originales.

Por último, cualquier programa libre está constantemente amenazado por patentes sobre el software. Queremos evitar el peligro de que los redistribuidores de un programa libre obtengan patentes por su cuenta, convirtiendo de facto el programa en propietario. Para evitar esto, hemos dejado claro que cualquier patente debe ser pedida para el uso libre de cualquiera, o no ser pedida.

Los términos exactos y las condiciones para la copia, distribución y modificación se exponen a continuación.

Términos y condiciones para la copia, distribución y modificación

Esta Licencia se aplica a cualquier programa u otro tipo de trabajo que contenga una nota colocada por el tenedor del copyright diciendo que puede ser distribuido bajo los términos de esta Licencia Pública General. En adelante, «Programa» se referirá a cualquier programa o trabajo que cumpla esa condición y «trabajo basado en el Programa» se referirá bien al Programa o a cualquier trabajo derivado de él según la ley de copyright. Esto es, un trabajo que contenga el programa o una proción de él, bien en forma literal o con modificaciones y/o traducido en otro lenguaje. Por lo tanto, la traducción está incluida sin limitaciones en el término «modificación». Cada concesionario (licenciatario) será denominado «usted».

Cualquier otra actividad que no sea la copia, distribución o modificación no está cubierta por esta Licencia, está fuera de su ámbito. El acto de ejecutar el Programa no está restringido, y los resultados del Programa están cubiertos únicamente si sus contenidos constituyen un trabajo basado en el Programa, independientemente de haberlo producido mediante la ejecución del programa. El que esto se cumpla, depende de lo que haga el programa.

Usted puede copiar y distribuir copias literales del código fuente del Programa, según lo has recibido, en cualquier medio, supuesto que de forma adecuada y bien visible publique en cada copia un anuncio de copyright adecuado y un repudio de garantía, mantenga intactos todos los anuncios que se refieran a esta Licencia y a la ausencia de garantía, y proporcione a cualquier otro receptor del programa una copia de esta Licencia junto con el Programa.

Puede cobrar un precio por el acto físico de transferir una copia, y puede, según su libre albedrío, ofrecer garantía a cambio de unos honorarios.

Puede modificar su copia o copias del Programa o de cualquier porción de él, formando de esta manera un trabajo basado en el Programa, y copiar y distribuir esa modificación o trabajo bajo los términos del apartado 1, antedicho, supuesto que además cumpla las siguientes condiciones:

Debe hacer que los ficheros modificados lleven anuncios prominentes indicando que los ha cambiado y la fecha de cualquier cambio.

Debe hacer que cualquier trabajo que distribuya o publique y que en todo o en parte contenga o sea derivado del Programa o de cualquier parte de él sea licenciada como un todo, sin carga alguna, a todas las terceras partes y bajo los términos de esta Licencia.

Si el programa modificado lee normalmente órdenes interactivamente cuando es ejecutado, debe hacer que, cuando comience su ejecución para ese uso interactivo de la forma más habitual, muestre o escriba un mensaje que incluya un anuncio de copyright y un anuncio de que no se ofrece ninguna garantía (o por el contrario que sí se ofrece garantía) y que los usuarios pueden redistribuir el programa bajo estas condiciones, e indicando al usuario cómo ver una copia de esta licencia. (Excepción: si el propio programa es interactivo pero normalmente no muestra ese anuncio, no se requiere que su trabajo basado en el Programa muestre ningún anuncio).

Estos requisitos se aplican al trabajo modificado como un todo. Si partes identificables de ese trabajo no son derivadas del Programa, y pueden, razonablemente, ser consideradas trabajos independientes y separados por ellos mismos, entonces esta Licencia y sus términos no se aplican a esas partes cuando sean distribuidas como trabajos separados. Pero cuando distribuya esas mismas secciones como partes de un todo que es un trabajo basado en el Programa, la distribución del todo debe ser según los términos de esta licencia, cuyos permisos para otros licenciatarios se extienden al todo completo, y por lo tanto a todas y cada una de sus partes, con independencia de quién la escribió.

Por lo tanto, no es la intención de este apartado reclamar derechos o desafiar sus derechos sobre trabajos escritos totalmente por usted mismo. El intento es ejercer el derecho a controlar la distribución de trabajos derivados o colectivos basados en el Programa.

Además, el simple hecho de reunir un trabajo no basado en el Programa con el Programa (o con un trabajo basado en el Programa) en un volumen de almacenamiento o en un medio de distribución no hace que dicho trabajo entre dentro del ámbito cubierto por esta Licencia.

Puede copiar y distribuir el Programa (o un trabajo basado en él, según se especifica en el apartado 2, como código objeto o en formato ejecutable según los términos de los apartados 1 y 2, supuesto que además cumpla una de las siguientes condiciones:

Acompañarlo con el código fuente completo correspondiente, en formato electrónico, que debe ser distribuido según se especifica en los apartados 1 y 2 de esta Licencia en un medio habitualmente utilizado para el intercambio de programas, o

Acompañarlo con una oferta por escrito, válida durante al menos tres años, de proporcionar a cualquier tercera parte una copia completa en formato electrónico del código fuente correspondiente, a un coste no mayor que el de realizar físicamente la distribución del fuente, que será distribuido bajo las condiciones descritas en los apartados 1 y 2 anteriores, en un medio habitualmente utilizado para el intercambio de programas, o

Acompañarlo con la información que recibiste ofreciendo distribuir el código fuente correspondiente. (Esta opción se permite sólo para distribución no comercial y sólo si usted recibió el programa como código objeto o en formato ejecutable con tal oferta, de acuerdo con el apartado b anterior).

Por código fuente de un trabajo se entiende la forma preferida del trabajo cuando se le hacen modificaciones. Para un trabajo ejecutable, se entiende por código fuente completo todo el código fuente para todos los módulos que contiene, más cualquier fichero asociado de definición de interfaces, más los guiones utilizados para controlar la compilación e instalación del ejecutable. Como excepción especial el código fuente distribuido no necesita incluir nada que sea distribuido normalmente (bien como fuente, bien en forma binaria) con los componentes principales (compilador, kernel y similares) del sistema operativo en el cual funciona el ejecutable, a no ser que el propio componente acompañe al ejecutable.

Si la distribución del ejecutable o del código objeto se hace mediante la oferta acceso para copiarlo de un cierto lugar, entonces se considera la oferta de acceso para copiar el código fuente del mismo lugar como distribución del código fuente, incluso aunque terceras partes no estén forzadas a copiar el fuente junto con el código objeto.

No puede copiar, modificar, sublicenciar o distribuir el Programa excepto como prevé expresamente esta Licencia. Cualquier intento de copiar, modificar sublicenciar o distribuir el Programa de otra forma es inválida, y hará que cesen automáticamente los derechos que te proporciona esta Licencia. En cualquier caso, las partes que hayan recibido copias o derechos de usted bajo esta Licencia no cesarán en sus derechos mientras esas partes continúen cumpliéndola.

No está obligado a aceptar esta licencia, ya que no la ha firmado. Sin embargo, no hay hada más que le proporcione permiso para modificar o distribuir el Programa o sus trabajos derivados. Estas acciones están prohibidas por la ley si no acepta esta Licencia. Por lo tanto, si modifica o distribuye el Programa (o cualquier trabajo basado en el Programa), está indicando que acepta esta Licencia para poder hacerlo, y todos sus términos y condiciones para copiar, distribuir o modificar el Programa o trabajos basados en él.

Cada vez que redistribuya el Programa (o cualquier trabajo basado en el Programa), el receptor recibe automáticamente una licencia del licenciatario original para copiar, distribuir o modificar el Programa, de forma sujeta a estos términos y condiciones. No puede imponer al receptor ninguna restricción más sobre el ejercicio de los derechos aquí garantizados. No es usted responsable de hacer cumplir esta licencia por terceras partes.

Si como consecuencia de una resolución judicial o de una alegación de infracción de patente o por cualquier otra razón (no limitada a asuntos relacionados con patentes) se le imponen condiciones (ya sea por mandato judicial, por acuerdo o por cualquier otra causa) que contradigan las condiciones de esta Licencia, ello no le exime de cumplir las condiciones de esta Licencia. Si no puede realizar distribuciones de forma que se satisfagan simultáneamente sus obligaciones bajo esta licencia y cualquier otra obligación pertinente entonces, como consecuencia, no puede distribuir el Programa de ninguna forma. Por ejemplo, si una patente no permite la redistribución libre de derechos de autor del Programa por parte de todos aquellos que reciban copias directa o indirectamente a través de usted, entonces la única forma en que podría satisfacer tanto esa condición como esta Licencia sería evitar completamente la distribución del Programa.

Si cualquier porción de este apartado se considera inválida o imposible de cumplir bajo cualquier circunstancia particular ha de cumplirse el resto y la sección por entero ha de cumplirse en cualquier otra circunstancia.

No es el propósito de este apartado inducirle a infringir ninguna reivindicación de patente ni de ningún otro derecho de propiedad o impugnar la validez de ninguna de dichas reivindicaciones. Este apartado tiene el único propósito de proteger la integridad del sistema de distribución de software libre, que se realiza mediante prácticas de licencia pública. Mucha gente ha hecho contribuciones generosas a la gran variedad de software distribuido mediante ese sistema con la confianza de que el sistema se aplicará consistentemente. Será el autor/donante quien decida si quiere distribuir software mediante cualquier otro sistema y una licencia no puede imponer esa elección.

Este apartado pretende dejar completamente claro lo que se cree que es una consecuencia del resto de esta Licencia.

Si la distribución y/o uso de el Programa está restringida en ciertos países, bien por patentes o por interfaces bajo copyright, el tenedor del copyright que coloca este Programa bajo esta Licencia puede añadir una limitación explícita de distribución geográfica excluyendo esos países, de forma que la distribución se permita sólo en o entre los países no excluidos de esta manera. En ese caso, esta Licencia incorporará la limitación como si estuviese escrita en el cuerpo de esta Licencia.

La Free Software Foundation puede publicar versiones revisadas y/o nuevas de la Licencia Pública General de tiempo en tiempo. Dichas nuevas versiones serán similares en espíritu a la presente versión, pero pueden ser diferentes en detalles para considerar nuevos problemas o situaciones.

Cada versión recibe un número de versión que la distingue de otras. Si el Programa especifica un número de versión de esta Licencia que se refiere a ella y a «cualquier versión posterior», tienes la opción de seguir los términos y condiciones, bien de esa versión, bien de cualquier versión posterior publicada por la Free Software Foundation. Si el Programa no especifica un número de versión de esta Licencia, puedes escoger cualquier versión publicada por la Free Software Foundation.

Si quiere incorporar partes del Programa en otros programas libres cuyas condiciones de distribución son diferentes, escribe al autor para pedirle permiso. Si el software tiene copyright de la Free Software Foundation, escribe a la Free Software Foundation: algunas veces hacemos excepciones en estos casos. Nuestra decisión estará guiada por el doble objetivo de de preservar la libertad de todos los derivados de nuestro software libre y promover el que se comparta y reutilice el software en general.

AUSENCIA DE GARANTÍA

Como el programa se licencia libre de cargas, no se ofrece ninguna garantía sobre el programa, en todas la extensión permitida por la legislación aplicable. Excepto cuando se indique de otra forma por escrito, los tenedores del copyright y/u otras partes proporcionan el programa «tal cual», sin garantía de ninguna clase, bien expresa o implícita, con inclusión, pero sin limitación a las garantías mercantiles implícitas o a la conveniencia para un propósito particular. Cualquier riesgo referente a la calidad y prestaciones del programa es asumido por usted. Si se probase que el Programa es defectuoso, asume el coste de cualquier servicio, reparación o corrección.

En ningún caso, salvo que lo requiera la legislación aplicable o haya sido acordado por escrito, ningún tenedor del copyright ni ninguna otra parte que modifique y/o redistribuya el Programa según se permite en esta Licencia será responsable ante usted por daños, incluyendo cualquier daño general, especial, incidental o resultante producido por el uso o la imposibilidad de uso del Programa (con inclusión, pero sin limitación a la pérdida de datos o a la generación incorrecta de datos o a pérdidas sufridas por usted o por terceras partes o a un fallo del Programa al funcionar en combinación con cualquier otro programa), incluso si dicho tenedor u otra parte ha sido advertido de la posibilidad de dichos daños.

FIN DE TÉRMINOS Y CONDICIONES

D.2.  Cómo aplicar estos términos a sus nuevos programas.

Si usted desarrolla un nuevo Programa, y quiere que sea del mayor uso posible para el público en general, la mejor forma de conseguirlo es convirtiéndolo en software libre que cualquiera pueda redistribuir y cambiar bajo estos términos.

Para hacerlo, añada los siguientes anuncios al programa. Lo más seguro es añadirlos al principio de cada fichero fuente para transmitir lo más efectivamente posible la ausencia de garantía. Además cada fichero debería tener al menos la línea de «copyright» y un indicador a dónde puede encontrarse el anuncio completo.

<una línea para indicar el nombre del programa y una rápida idea de qué hace.>

Copyright (C) 19aa <nombre del autor>

Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU según es publicada por la Free Software Foundation, bien de la versión 2 de dicha Licencia o bien (según su elección) de cualquier versión posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN PROPÓSITO PARTICULAR. Véase la Licencia Pública General de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General junto con este programa. Si no ha sido así, escriba a la Free Software Foundation, Inc., en 675 Mass Ave, Cambridge, MA 02139, EEUU.

Añada también información sobre cómo contactar con usted mediante correo electrónico y postal.

Si el programa es interactivo, haga que muestre un pequeño anuncio como el siguiente, cuando comienza a funcionar en modo interactivo:

Gnomovision versión 69, Copyright (C) 19aa nombre del autor

Gnomovision no ofrece ABSOLUTAMENTE NINGUNA GARANTÍA. Para más detalles escriba «show w».

Los comandos hipotéticos «show w» y «show c» deberían mostrar las partes adecuadas de la Licencia Pública General. Por supuesto, los comandos que use pueden llamarse de cualquier otra manera. Podrían incluso ser pulsaciones del ratón o elementos de un menú (lo que sea apropiado para su programa).

También deberías conseguir que su empleador (si trabaja como programador) o tu Universidad (si es el caso) firme un «renuncia de copyright» para el programa, si es necesario. A continuación se ofrece un ejemplo, altere los nombres según sea conveniente:

Yoyodyne, Inc. mediante este documento renuncia a cualquier interés de derechos de copyright con respecto al programa Gnomovision (que hace pasadas a compiladores) escrito por Pepe Programador.

<firma de Pepito Grillo>, 20 de diciembre de 1996

Pepito Grillo, Presidente de Asuntillos Varios.

Esta Licencia Pública General no permite que incluya sus programas en programas propietarios. Si su programa es una biblioteca de subrutinas, puede considerar más útil el permitir el enlazado de aplicaciones propietarias con la biblioteca. Si este es el caso, use la Licencia Pública General de GNU para Bibliotecas en lugar de esta Licencia.