You are on page 1of 9

TEMA 16: OPERACIONES CON NÚMEROS ENTEROS.

ARITMÉTICA
En cualquiera de las actividades que desarrollamos en nuestra vida diaria se hace necesario el uso de
herramientas de tipo matemático para trabajar con datos numéricos.

Del mismo modo, estamos rodeados de máquinas que realizan cálculos para servir a nuestras
necesidades, tanto domésticas, como en entornos de trabajo y entorno industriales.

Cuando vamos a comprar un producto a peso, la báscula calcula el


precio total multiplicando el precio del kilogramo por el número de
kilogramos. Hay máquinas de café que suma el valor de las monedas
que vamos introduciendo, comparan con el precio y realizan la resta
para devolvernos el cambio.

En entornos industriales, la necesidad de integrar operaciones en los


programas de un autómata es tremendamente variada. Algo tan sencillo
como la habilitación de un temporizador puede requerir el uso de
operaciones aritméticas. Supongamos que introducimos el tiempo de un
temporizador a través de un panel de operador que se encuentra en el
panel de mandos de una máquina.

Los valores introducidos desde un panel de operador se depositan


directamente en la memoria del programa en forma de byte, Word o dword.

El usuario de la máquina no tiene por qué saber que nuestro autómata cuenta el tiempo en décimas
de segundo o unidades menores, así que debemos facilitarle la tarea. En la pantalla, el usuario
introducirá una cifra en segundos, pero nosotros debemos multiplicarla por 10 para que el
temporizador cuente el tiempo correctamente. Si el usuario trabajase con horas, minutos y
segundos, entonces tendríamos que convertir todo a segundos, sumar el resultado total de segundos
y volver a multiplicar por 10 para que el temporizador cuente correctamente.

Resumiendo, las operaciones aritméticas son necesarias para dar mayores prestaciones a nuestros
programas.

Las operaciones que veremos en esta unidad, son operaciones con números enteros, no con números
decimales.

Las operaciones con números enteros se denominan operaciones aritméticas en coma fija y las
operaciones aritméticas con números decimales (números reales) se denominan operaciones
aritméticas en coma flotante.

1.- Suma
La suma se realiza entre enteros o entre dobles enteros. Se trata de sumas de Words o de dwords. No
existe la suma de bytes.

Es importante tener en cuenta que nunca es posible sumas enteros con dobles enteros. Cada unidad
tiene su propia operación de suma.

La función suma se ejecuta como resultado de la lógica de programa


conectada a la línea de entrada EN.

Veamos ahora sus componentes:

-EN: línea de entrada de la lógica de programa. Cuando el resultado


de esa lógica de programa es verdadero (1) se ejecuta la función de
suma.

- IN1: primer sumando. Toda suma está formada de dos o más sumandos. Las funciones de suma
para el autómata S7-200 solamente permiten sumar de dos en dos (dos sumandos). El primer
sumando es IN1; será un valor en formato de Word de entradas, salidas o marcas, o un valor
constante dentro del rango -32767 a +32767

- IN2: segundo sumando. Segundo componente de la suma. Al igual que IN1 será un valor en
formato Word

- OUT: resultado de la suma entre IN1 e IN2. El resultado de esta suma se guarda en una
dirección de Word que se indica en OUT. En el caso del ejemplo, esta dirección es VW50.
Siempre será una dirección de Word. Esta puede ser de salidas o marcas

- ENO: es una salida binaria (0 ó 1) que se encuentra a 1 cuando la operación está habilitada y
no se produce ningún error en la operación. Permite conectar varias funciones en un mismo
segmento de programa.

La inserción en la lógica de programa es similar al de otras funciones como las de transferencia. Es


una función que se ejecuta como resultado de una lógica de programa, por lo que irá al final de
dicha línea, para después incorporarle los parámetros de la función (sumando y resultado). Veamos
el proceso paso a paso:

Colocamos el cursor en la posición de la línea de programa en la que queremos introducir la


operación:

En el Árbol de operaciones abrir la carpeta


Aritmética en coma fija. Una vez abierta,
seleccionar la ADD_I.

Al seleccionar con doble clic la función de suma


de enteros, esta queda introducida en nuestra
línea de programa.

Ahora hemos de rellenar los valores correspondientes a IN1, IN2 y OUT que aparecen con
interrogantes. Una vez introducidos los valores o direcciones de la suma, ya tenemos completada la
línea de activación y la configuración de esta suma de enteros.

1.1.- Limitaciones de uso


La suma de enteros tiene una limitación fundamental que se basa en el rango de valores que puede
representarse en una variable Word (entero).
La operación ADD_I realiza una suma de dos enteros de 16 bits y lo deposita en otro entero de 16
bits. Pero el máximo valor que se puede representar por medio de un Word es 32767. Por tanto, si
trabajamos con enteros de valores altos, fácilmente obtendremos valores mayores de 32767 como
resultado de la suma.

En estos casos se produce un desbordamiento de la operación que no es sino un error de operación.


De esta forma, la operación no se ejecuta y pone a 1 un bit de error que nos permite usarlo como bit
de aviso de error.

El bit de desbordamiento de la operación suma es SM1.1. Se trata de una marca especial y que indica
un estado del sistema. En este caso, es una marca reservada por el sistema para indicar
desbordamiento en la suma. Hay muchas más marcas especiales, cada una tiene la “misión” de
indicar eventos que se producen en las operaciones del programa.

El bit de desbordamiento se comporta como una marca cualquiera, de forma que podemos utilizarla
en programa para detener un funcionamiento, provocar un aviso de alarma,
etc.

1.2.- Suma de doble entero


La limitación de uso de la suma de enteros (16 bits) crea la necesidad de trabajar con unidades
mayores, puesto que lógicamente podemos tener que trabajar con unidades mucho mayores que el
valor 32767. Sin ir más lejos podemos realizar contajes de piezas de millones de unidades que nos
sería imposible reflejar o tratar aritméticamente por medio de enteros (Word)

Sin embargo la operación ADD_I está definida de forma que solamente permite trabajar con valores
de Word. Por eso existe una función que permite la suma entre valores mayores, en forma de
formato dword: la suma ADD_DI

El funcionamiento y la forma de trabajar con la función ADD_DI es


exactamente el mismo que en el caso de la suma de enteros, con la
diferencia ya comentada de que estamos trabajando con valores más
grandes.

El bit de desbordamiento es el mismo SM1.1, aunque, lógicamente,


no se activa ante los mismos valores que en el caso de la suma ADD_I, sino en valores que desborden
el valor máximo representado en 32 bits (-2147484647 y 2147483647)

2.- Resta
La resta se realiza entre enteros o entre dobles enteros, de la misma manera que ocurre en el caso
de la suma. Tendremos restas entre enteros (Word) o entre enteros dobles (dword). Tampoco existe
la resta de bytes.

Veamos sus componentes:

-EN: línea de entrada de la lógica de programa. Cuando el resultado de esa


lógica de programa es verdadero (1), se ejecuta la función de resta.

-IN1: minuendo o primer elemento de la resta. Toda resta está formada por
minuendo y sustraendo. Las operaciones de resta para el autómata S7-200
solamente permiten restar de dos en dos, es decir, un minuendo y un
sustraendo. El minuendo es IN1. Será un valor en formato de Word de entradas, salidas o
marcas, o un valor constante dentro del rango -32.767 y 32.767
- IN2: sustraendo, segundo componente de la resta. Al igual que IN1, será un valor en formato
de Word de entradas, salidas o marcas, o un valor constante en el rango -32767 y 32.767.

- OUT: resultado de la resta entre IN1 e IN2, es decir, la diferencia. El resultado de esta resta
se guarda en una dirección de Word que se indica en OUT. En el caso del ejemplo esta
dirección de Word es VW50. Siempre será una dirección Word. Esta puede ser de salidas o
marcas.

- ENO: es una salida binario (0-1) que se encuentra a 1, cuando la operación está habilitada, y
no se produce ningún error en la operación. Permite conectar varias funciones en un mismo
segmento de programa.

La inserción en la lógica de programa es similar a la ya vista para la suma.

2.1.- Limitaciones de uso


La resta de enteros presenta una limitación fundamental, en cuanto al rango de valores, similar a la
que ocurre en el caso de la suma y que se basa en el rango de valores que puede representarse en
una variable Word (entero).

La operación SUB_I realiza una resta de dos enteros de 16 bits y lo deposita en otro entero de 16
bits. Pero el mínimo valor que se puede representar por medio de un Word es -32.767. Por tanto, si
restamos un entero de valor alto, fácilmente obtendremos valores menores de -32.767 como
resultado de la resta.

En estos casos se produce un desbordamiento de la operación que no es sino un error de operación.


De esta forma, la operación no se ejecuta y pone a 1 un bit de error que nos permite usarlo como bit
de aviso de error.

El bit de desbordamiento de la operación de resta es el SM1.1, el mismo que para el caso de la suma.
De forma que esta marca no discrimina si se produce un desbordamiento en una operación de resta o
suma, sino simplemente nos indica que se ha producido dicho desbordamiento.

El bit de desbordamiento se comporta como una marca cualquiera, de forma que podemos utilizarla
en programa para detener un funcionamiento, provocar un aviso de alarma, etc. En definitiva, lo
podemos integrar en la lógica de programa como una marca más.

2.2.- Resta de doble entero


La limitación de uso de las operaciones de suma y resta de enteros (16 bits) crea la necesidad de
trabajar con unidades mayores, puesto que, lógicamente, podemos tener que trabajar con unidades
mucho mayores que el valor 32.767.

Por eso, existe una función que permite la resta entre valores mayores, en formato dword. Esta
función es la resta de doble entero SUB_DI.

El funcionamiento es exactamente el mismo que el visto para el caso de la resta de enteros, con la
única diferencia ya comentada de que estamos trabajando con valores más grandes.
El bit de desbordamiento es el mismo SM1.1, aunque, lógicamente, no se activa ante los mismos
valores que en el caso de la resta de enteros, sino en valores que desborden el valor máximo
representado en 32 bits.

Ejemplo: Podemos hacer uso de la resta de enteros en el caso de que queramos representar una
cuenta atrás con respecto a un valor predeterminado.

Por ejemplo, si queremos guardar en una dirección de memoria (VW100) el


número de piezas que faltan hasta alcanzar un valor objetivo para la
producción de un día. En la dirección VW20 guardamos el número de piezas
a realizar. Con el contador C10 contamos el número de piezas realizado.
Podemos obtener el número de piezas que faltan con solo restas C10 a
VW20.

3.- Multiplicación
La multiplicación se realiza entre enteros (Word) o entre dobles enteros (dword). Tampoco existe la
multiplicación de valores enteros en formato byte.

La función multiplicación se ejecuta como resultado de la lógica de programa


conectada a la línea de entrada EN.

Veamos sus componentes:

-EN: línea de entrada de la lógica de programa. Cuando el resultado de esa


lógica de programa es verdadero (1), se ejecuta la función de multiplicación.

- IN1: Multiplicando. Es el primer factor de la multiplicación. Toda multiplicación está formada


por al menos dos factores, multiplicando y multiplicador, además del resultado de la
multiplicación de los mismos lógicamente. Las operaciones de multiplicación solo permiten
multiplicar de dos en dos, es decir, un multiplicando y un multiplicador. El multiplicando es
IN1. Será un valor en formato de Word de entradas, salidas o marcas o un valor constante
dentro del rango -32.767 y +32.767.

- IN2: Multiplicador

- OUT: resultado o producto de la multiplicación entre IN1 e IN2. El resultado de esta


multiplicación se guarda en una dirección de Word que se indica en OUT. En el caso del
ejemplo, esta dirección de Word es VW100. Siempre será una dirección de Word. Esta puede
ser de salidas o marcas

- ENO: es una salida binaria (0-1) que se encuentra a 1, cuando la operación está habilitado y
no se produce ningún error en la operación. Permite conectar varias funciones en un mismo
segmento de programa.

3.1.- Limitaciones de uso


La multiplicación de enteros presenta la misma limitación que encontrábamos en las operaciones
de suma y resta de enteros. La limitación en el rango de valores que podemos representar
mediante un Word (16 bits.

En el caso de la multiplicación, se hace mucho más patente que en el caso de la suma y resta,
pues por la propia naturaleza de la operación es mucho más fácil obtener datos con valores altos.

La operación MUL_I realiza una multiplicación, de dos enteros de 16 bits y lo deposita en otro
entero de 16 bits, pero el máximo valor que se puede representar por medio de un Word es
32.767. Por tanto, si trabajamos con enteros de valores altos, fácilmente obtendremos valores
mayores de 32.767 como resultado de la multiplicación.

En estos casos, se produce un desbordamiento de la operación que no es sino un error de


operación. De esta forma, la operación no se ejecuta y pone a 1 un bit de error que nos permite
usarlo como bit de aviso de error. El bit de desbordamiento de la operación de multiplicación es
la marca especial SM1.1.

Para trabajar con datos de mayor valor deberíamos hacer como en el caso de sumas y restas, es
decir, debería haber una operación de multiplicaciones de enteros dobles. Esta operación, existe.
Sin embargo, existe una operación de multiplicación que permite trabajar con enteros como
multiplicando y multiplicador, pero que el resultado no tiene que ser necesariamente un entero,
sino que puede ser un entero doble.

Esta es la operación de multiplicación MUL, cuyas características como


operación a la hora de programar son idénticas a la operación MUL_I, pero que
se diferencia en que el parámetro OUT no es un Word sino una dword.

3.2.- Multiplicación de doble entero


La limitación de uso de las operaciones de multiplicación de enteros (16 bits) crea la necesidad
de trabajar con unidades mayores, puesto que, lógicamente, podemos tener que trabajar con
unidades mucho mayores que el valor 32.767. Por eso, existe una función que permite la
multiplicación entre valores mayores, en formato dword, esta es la suma de doble entero
MUL_DI.

El funcionamiento y la forma de trabajo con la función MUL_DI es


exactamente el mismo que el ya visto para el caso de la multiplicación de
enteros, con la diferencia de que estamos trabajando con valores más
grandes.

El bit de desbordamiento es el mismo SM1.1, aunque lógicamente, no se activa ante los mismos
valores.

Ejemplo:

Un sencillo ejemplo sería el uso, combinado con la operación suma, para convertir un valor de
tiempo introducido por un usuario en minutos y segundos a décimas de segundo para que las
pueda entender uno de nuestros temporizadores.

Supongamos que ya hemos hecho la conversión de minutos a segundos y los hemos sumado. El
resultado de la suma de segundos lo guardamos en VW20. La operación sería algo así:

En la dirección VW100 guardamos el tiempo que deberá temporizar un


temporizador que habilitemos en otra línea de programa.

4.- División
La división se realiza entre enteros o entre dobles enteros. Tendremos división entre enteros
(Word) o división entre dobles enteros (dword). Tampoco existe la división de valores enteros en
formato de byte.
La función división se ejecuta como resultado de la lógica de programar conectada a la línea de
entrada EN, Veamos sus componentes:

-EN: línea de entrada de la lógica de programa. Cuando el resultado de esa


lógica de programa es verdadero (1) se ejecuta la función división.

-IN1: dividendo. Es el primer factor de la división. Toda división está


formada de dos factores, dividendo y divisor. Aparte de estos dos componentes están el
cociente, resultado y el resto. Las operaciones de división no tiene en cuenta el resto,
solamente el cociente. El dividendo es IN1. Será un valor en formato de Word de entradas,
salidas o marcas, o un valor constante dentro del rango -32.767 --- 32.767

- IN2: divisor. Segundo componente de la división. Al igual que IN1, será un valor en formato de
Word de entradas, salidas o marcas, o un valor constante en el rango -32767 ---- 32767

- OUT: resultado o cociente de la división entre IN1 e IN2. El resultado de esta división se
guarda en una dirección de Word que se indica en OUT. En el caso del ejemplo, esta dirección
de Word es VW50. Siempre será una dirección Word. Esta puede ser de salidas o marcas

- ENO: es una salida binaria (0 o 1) que se encuentra a 1 cuando la operación está habilitada y
no se produce ningún error en la operación. Permite conectar varias funciones en un mismo
segmento de programa.

4.1.- Limitaciones de uso


La división de enteros presenta la misma limitación que encontrábamos en las operaciones anteriores
con enteros. La limitación en el rango de valores que podemos representar mediante un Word
(16bits).

En el caso de la división de enteros la limitación es mucho mayor que en el caso de las operaciones
aritméticas vistas hasta ahora para enteros o enteros dobles, puesto que al trabajar con enteros
todos los componentes de la operación han de ser enteros, pero la división nos genera como
resultado números no enteros, es decir, números con decimales, estos es, números reales. Estos
números reales provocan un desbordamiento en la operación de división si resulta un número real
como cociente de una división.

Ejemplo: 1/2=0,5

En el caso de la división, también existe una operación en la que los factores son Word y el resultado
es dword. Pero nos podemos encontrar con el desbordamiento por cociente real, que en el fondo es
un cociente fuera de rango. Esta operación es DIV, cuyas características como operación a la hora de
programar son idénticas a la operación DIV_I, pero que se diferencia en que el parámetro OUT no es
un Word sino un dword.

En el caso de la división hemos de tener en cuenta un nuevo


bit o marca especial de error de operación es el generado
cuando el resultado de la división es una división por cero,
es decir, cuando el divisor es igual a 0, se produce una
indeterminación que se traduce en una operación errónea de
la división. La operación no se realiza y se genera un error
en el programa. Se pone a 1 la marca especial SM1.3.

El error de división por 0 afecta a todas las operaciones de división, tanto DIV como DIV_I, como las
que veremos en los siguientes aparatados.
4.2.- División de doble entero
La limitación de uso de las operaciones de división de enteros (16 bits) crea la necesidad de trabajar
con unidades mayores, puesto que, lógicamente, podemos tener que trabajar con unidades mucho
mayores que el valor 32767.


Por eso existe una función que permite la división entre valores mayores en formato dword: es la
división de doble entero DIV_DI. El funcionamiento y la forma de trabajo de la función DIV_DI es
exactamente el mismo que el visto para la división de enteros, con la diferencia de que estamos
trabajando con valores más grandes.
El bit de desbordamiento sigue siendo el SM1.3.

5.- Operaciones para incrementar valor


Adicionalmente a las operaciones aritméticas que podríamos considerar clásicas (suma, resta,
multiplicación y división) existen una serie de operaciones desarrolladas en el autómata basadas en
la suma. Estas operaciones son las operaciones de incremento de un valor.

Son básicamente una suma en la que el primer sumando es fijo: su valor es 1. El segundo sumando es
una variable o una constante en formato byte, Word o dword.

Es una operación que nos permite crear un registro de contaje o descontaje sin las limitaciones de
un contador. Sin embargo tal y como vemos en los dibujos (sumar 1 a VW10 y depositarlo en VW20)
no tiene muchas aplicaciones. Como podemos sacarle mucho partido, es cuando en el campo de
salida OUT colocamos la misma dirección que en la de entrada.

De esta forma, cada vez que recibe un pulso de subida a la


entrada EN, se produce un incremento de una unidad sobre el
valor de IN=VW10 que se deposita en OUT=VW10. Así a cada pulso
en la entrada EN, tenemos un incremento de 1 de vW10.

Esta es la manera de establecer contajes mediante incrementos de uno en uno en todo tipo de
variables (byte, Word y dword) y sin tener que recurrir a contadores, que, por otra parte, tienen un
número limitado.

La inserción en la lógica de programa es similar a las vistas anteriormente.

La limitación de uso que presenta es la que ya conocemos para la operación suma. Podemos alcanzar
valores por encima del máximo para un byte o para un Word, sobre, todo, pero también para el caso
de un dword. El bit o marca de desbordamiento es el SM1.1

Ejemplo: Un contador se realiza en una variable Word, luego está sujeto a la limitación de tamaño
de una Word (-32767 --- 32767). Si tuviésemos que contar una producción de miles de piezas,
seguramente no tendríamos problemas a la hora de contarlos con un contador. Pero hay producciones
que se miden en centenares de miles o millones de piezas y eso no lo podríamos contar con un
contador de los que tenemos en el autómata, pero podríamos utilizar la operación INC_DW que nos
ayuda a realizar grandes contajes.
6.- Operaciones de decrementar un valor
Si la operación de incremento de un valor es básicamente una suma donde uno de los sumandos es
fijo e igual a 1, la operación de decrementar valor tiene una explicación similar, pero fundamentada
en la resta de enteros.

Es básicamente una resta en la que el segundo elemento de la resta, el sustraendo, es fijo y su valor
es 1; el minuendo es una variable o una constante en formato byte, Word o dword. A diferencia de
las restas, está definida para bytes.

Esta operación nos permite crear un registro de contaje hacia atrás o descontaje sin las limitaciones
de un contador, que nos permite descontaje pero no sobre cualquier unidad.

Si nos fijamos en la operación decrementar dword, tenemos que, cada vez que recibe un pulso de
subida a la entrada EN, se produce un decremento en una unidad sobre el valor de IN=VD10, que se
deposita en OUT=VD10. De esta forma, a cada pulso en la entrada EN, tenemos un decremento de 1
en VD10.

La inserción en la lógica de programa es igual a la que ya hemos visto para el resto de operaciones, y
su limitación de uso es la misma que presentan las operaciones suma, resta y operación incrementar:
podemos alcanzar valores por encima del máximo para un byte o una Word, sobre todo, pero
también para el caso de una dword.

Ejemplo: podemos proponer un ejemplo similar al que vimos para la operación incrementar.
Imaginemos que tenemos que realizar el contaje, hacia atrás, de una cantidad de millones de
unidades, por ejemplo, la producción de una fábrica de pilas. Pero queremos disponer del número de
piezas que faltan para alcanzar una producción dada. Cada pieza terminada supondrá un descontaje
sobre el objetivo, hasta la producción buscada. En este caso, la operación de DEC_DW nos ayudaría a
realizar grandes contajes.

You might also like