Introducción

El lenguaje de programación Exemys Script es de tipo bucle, esto quiere decir que se ejecuta todo el código hasta la última línea y luego vuelve a comenzar.

No hay sentencias para crear bucles dentro del programa, por lo que no se puede detener el flujo del programa en una sección de código. Se asemeja en este sentido a la programación de PLCs, aunque su sintaxis es mas cercana al C o a Pascal.

Además de la lectura de este manual, recomendamos la lectura de scripts de ejemplo. Puede descargar ejemplos desde este link www.exemys.com/EjemplosDeScriptEnGRD

Todos estos ejemplos también funcionan en los cLAN, excepto lo que usan SMS.

Versiones 1, 2 y 3 del script

Existe 3 versiones de script. La versión 2 se diferencia de la 1 porque permite el doble de variables ya que pueden ir en minúscula o mayúscula. En la versión 1 las variables solo se escriben en minúscula. La versión 3 ahorra entre un 20 y un 30% es espacio ocupado por el programa en la memoria del equipo, permitiendo así cargar programas mas largos. Puede notar la diferencia al presionar el botón de verificar.

Los equipos GRD-XF-2G y cLAN V1.x funcionan con versión 1

Los equipos GRD-XF-3G y cLAN V2.x funcionan con versión 2 (hasta la versión 10.x) y la versión 3 desde 11.0 en adelante

Los GRD-MQ y cLAN MQ funcionan con versión 2 (hasta la versión 10.x) y la versión 3 desde 11.0 en adelante

La versión 3 es totalmente compatible con la 2 y se conmuta automáticamente a 3 en los equipos compatibles (V11.0 o superior).

Los programas escritos en versión 3 son idénticos a los de versión 2. Solo ocupan menos espacio en la memoria del equipo.

Variables

Se dispone de 2 tipos de variables, numéricas del tipo “long” y de texto del tipo “string”.

No es necesario definir las variables ya que se tiene una cantidad fija.

En la versión 1 de script las variable numéricas son 21, de la “a” a la “u”. Las de texto son 5, de la “v” a la “z”, con una longitud máxima de 100 caracteres cada una.

En la versión 2/3 de script las variable numéricas son 42, de la “a” a la “u” y de la “A” a la “U” Las de texto son 10, de la “v” a la “z” y de la “V” a la “Z” y con una longitud máxima de 100 caracteres cada una.

Como las variables numéricas son del tipo “long” cualquier operación que arroje un resultado con decimales se vera truncado.

El valor inicial de las variables numéricas es 0, en las de texto es un string vacío.

Las variables numéricas, pueden “mapearse” para poder ser leídas de algún modo. En el GRD pueden vinculares de los canales de entradas y salidas.

Asignar valor a una variable:

                        a = 652;

                        v = 'Hola mundo'

Puede observarse que para cargar texto es necesario colocarlo entre comillas simples.

Concatenación de strings:

 

Para concatenar variables solamente debemos colocar una a continuación de la otra, separándolas por comas.

 

Por ejemplo:

 

            a = 20;

 

     u = 'La temperatura es de ';

 

     v = ' °C';

 

Si queremos formar la frase 'La temperatura es de 20 °C ' y guardarla en otra variable hacemos lo siguiente:

 

     w = u, a, v;

 

Otra forma de hacerlo sería:

 

            w = 'La temperatura es de ', a,' °C';

 

La concatenación solo puede hacerse en asignación de textos a variables string y en la función write_str

 

Inserción de valores ASCII en strings:

 

Si se quiere insertar un valor ASCII en string se puede usar el operador $. Después del operador se debe indicar al código ASCII en decimal. No se permite el ASCII 0.

 

Por ejemplo:

 

            z = 'Hola mundo',$13,$10;

 

La inserción de valores ASCII solo puede hacerse en asignación de textos a variables string y en la función write_str

 

Operadores aritméticos

A continuación veremos los operadores que se pueden utilizar en el script, debemos tener en cuenta que solo toma valores del tipo “long” por lo que cualquier operación que arroje resultados con decimales se verá truncada, o sea que solamente obtendremos como resultado la parte entera.

 

Operador

Significado

=

Igual

^

Exponencial

|

Or

&

And

+

Suma

-

Resta

*

Multiplicación

/

División

%

Resto

 

Por ejemplo:

 

a = 130;

b = a+5;

 

Resultado: La variable b vale 135.

 

Estructura de un programa

Todas las instrucciones finalizan con punto y coma “;”.

 

Es muy importante tener en cuenta que el programa se ejecuta de manera que cuando se alcanza la ultima sentencia vuelve a comenzar, debido a esta particularidad disponemos de una sentencia llamada “start” que se ejecuta solo una vez cuando el programa se inicia. Dentro de este bloque podremos cargar valores iniciales de variables o todo aquello que consideremos adecuado.

 

Todo programa debe terminar con la instrucción “end;”.

 

A continuación veremos la estructura típica de un programa:

 

            start

     {

         a = 10;

     };

     a = a + 1;

     end;

 

Este simple ejemplo muestra como se utiliza la función “start” para iniciar por única vez a la variable “a” con el valor 10 y luego incrementarse en 1 constantemente.

Como podemos ver todas las instrucciones que se encuentran después del bloque “start” y antes del “end;” se ejecutaran de manera cíclica.

 

Comentarios:

 

En caso de querer agregar un comentario al programa se de anteponer al texto el carácter “#” y finalizarlo con “;”.

 

Por ejemplo:

 

     start

     {

         a = 10;  #Inicia variable a = 10;

     };

     a = a + 1;    #Incrementa variable a;

     end;

 

Funciones de Control de flujo

El control de flujo especifica el orden en que se van a llevar a cabo ciertas líneas del código.

En nuestro caso tenemos 3 funciones para realizar dicho control, el “start”, el “if-else” y el “end”.  

Función “start”

 

Se utiliza para ejecutar líneas de código por única vez en el momento que el programa se inicia.

Las instrucciones a ejecutar se colocan entre llaves y luego de la de cierre se debe colocar “;”.

 

          Sintaxis:


start
{
...;
...;
};

 

Función “if-else”:

 

Esta función se utiliza para la toma de decisiones, si la condición colocada luego del “if” es valida se ejecutaran las instrucciones que estén entre llaves debajo de este en caso contrario se ejecutaran las que estén dentro del “else”.

 

La condición de ejecución puede utilizar los siguientes operadores:

Operador

Significado

=

Igual

!

Distinto

Mayor

Menor

 

La condición se escribe dejando un espacio después del “if”

 

Sintaxis:

           

Solo “if”:

     if condición
   
  {
        ...;
        ...;
     };
 
           
Luego de la llave de cierre del “if” debe colocarse “;”.

"if-else”:

     if condición
   
  {
        ...;
        ...;
     }

     else
   
 
{
        ...;
        ...;
     };
 

          
En este caso el “;” se coloca después de la llave de cierre del “else” y no después del “if”.

Función “end”

Solamente se utiliza para indicar el fin del programa luego de ejecutarla se vuelve a la primera línea del código.

 

Sintaxis:

 

            end;

 

Funciones de interfaz

Estas funciones permiten tomar datos de distintas fuentes como también enviar datos a distintos destinos.

Función “read_io”

Permite leer parámetros indexados de distintas fuentes, como los valores de canales de entradas digitales, salidas digitales, entradas analógicas, etc.

 

Se debe indicar la “fuente” del dato con un número. En caso de que corresponda, con el parámetro “índice”, le decimos la posición dentro de esa fuente.

El resultado de la lectura se guarda en una variable numérica.

 

Sintaxis:  

read_io fuente,variable_numerica,indice;              

Las fuentes disponibles dependen del equipo donde se corre el script y la versión de script. En un futuro pueden agregarse nuevas fuentes.

Refiérase a la seeción fuentes/destinos para mas detalles.

Función “write_io”

Permite escribir parámetros indexados en distintos destinos, como los valores de canales de salidas digitales, de pulsos, etc.

 

Se debe indicar el “destino” donde escribir con un número. En caso de que corresponda, con el parámetro “índice”, le decimos la posición dentro de ese destino.

 

El “valor” a escribir puede ser un número o una variable numérica.

 

Sintaxis:  

write_io destino,indice,valor;                        

Los destinos disponibles dependen del equipo donde se corre el script y la versión de script. En un futuro pueden agregarse nuevos destinos.

Refiérase a la seeción fuentes/destinos para mas detalles.  

Función “read_str”:

Permite leer strings originados en distintas fuentes, como lo son los datos recibidos por un puerto serie o por SMS. Para realizar esto se debe indicar la “fuente” con un número.

El resultado de la lectura se guarda en dos variables, una del tipo string y una del tipo numérica, donde se indica la longitud del string. Si no hay datos este parámetro dará 0.

Sintaxis:

read_str fuente,variable_numerica,variable_string;

Las fuentes disponibles dependen del equipo donde se corre el script y la versión de script. En un futuro pueden agregarse nuevas fuentes.

Refiérase a la seeción fuentes/destinos para mas detalles.

Función “write_str”:

Permite escribir strings en distintos “destino”, como el puerto serie o enviar SMS. Para realizar esto se debe indicar el “destino” con un número y el string a enviar.

Sintaxis:

write_str destino,string;.

Los destinos disponibles dependen del equipo donde se corre el script y la versión de script. En un futuro pueden agregarse nuevos destinos.

Refiérase a la seeción fuentes/destinos para mas detalles

El string puede ser una variable o un string escrito en la función. Esta función permite concatenación e inclusión de valores ASCII.

Funciones de string

Estas funciones permiten realizar distintas operaciones con las variables del programa del tipo string.

Función “is_equal”

Compara una variable string con un string (texto fijo o variable string). Devuelve 0 si son distintos y 1 si son iguales.

Sintaxis:

is_equal variable_numerica,variable_string,string;

Ejemplo:

v='APAGAR BOMBA';
is_equal c,v,'APAGAR BOMBA';
if c=1 {
         #Los textos son iguales;
};

Función “finish_with”

Determina si un variable string termina con un string en particular (texto fijo o variable string). Devuelve 0 si es falso o 1 si verdadero

Sintaxis:

finish_with variable_numerica,variable_string,string;

Ejemplo:

v='APAGAR BOMBA';
finish_with c,v,'BOMBA';
if c=1 {
         #El string guardado en v termina en 'BOMBA';
};

Función “begin_with”

Determina si un variable string comienza con un string en particular (texto fijo o variable string). Devuelve 0 si es falso o 1 si verdadero

Sintaxis:

begin_with variable_numerica,variable_string,string;

Ejemplo:

v='APAGAR BOMBA';
begin_with c,v,'APAGAR';
if c=1 {
         #El string guardado en v empieza con 'APAGAR';
};

Función “contains”:

Determina si una variable string contiene un string en particular (texto fijo o variable string). Devuelve 0 si no lo encuentra o la posición donde lo encontró si lo encuentra.

Sintaxis:

contains variable_numerica,variable_string,string;

Ejemplo:

v='APAGAR BOMBA';
contains c,v,'GAR';
if c>0 {
         #El string guardado en v contiene el texto 'GAR';
};

Función “upper”

Convierte todos los caracteres de una variable string  a mayúsculas, guardando el resultado en la misma variable.

Sintaxis:

upper variable_string;

Ejemplo:

v='Apagar';
upper v;
#Ahora v es igual a 'APAGAR';

Función “lower”

Convierte todos los caracteres de una variable string  a minúscula, guardando el resultado en la misma variable.

Sintaxis:

lower variable_string;

Ejemplo:

v='Apagar';
lower v;
#Ahora v es igual a 'apagar';

Función “strlen”

Devuelve en una variable numérica, la longitud de una variable string.

Sintaxis:

strlen variable_numerica,variable_string;

Ejemplo:

v='Apagar';
strlen c,v;
#Ahora c vale 6;

Función “substr”

Devuelve una parte de una variable string dentro de la misma variable

Sintaxis:

substr inicio,fin,variable_string;

Ejemplo:

v='APAGAR BOMBA';
substr 2,3,v;
#Ahora v vale 'PA';

Funciones de conversión

Estas funciones convierten variables de un tipo a otro.

Función “point”

Coloca el punto decimal a una variable numérica y la convierte a string.
Como parámetros se le pasa, la variable numérica, la variable string y la cantidad de decimales que queremos colocarle.

Sintaxis:

point variable_string,variable_numerica,decimales;

Ejemplo:

c=123;
point v,c,1;
#Ahora v vale '12.3'; 
         

Función “aton”

Convierte un número dentro de string a una variable numérica. Empieza en el principio del string y termina en donde encuentra un valor no numérico o el fin del string.

Sintaxis:

aton variable_numerica,variable_string;

Ejemplo:

v='123 RPM';
aton c,v;
#Ahora c vale 123;
           

Funciones “day”,”month”,”year”,”hs”,”min”,”sec” y “nday”

Estas funciones convierten un time_stamp a día, mes, año, hora, minuto, segundo y número de día de la semana, respectivamente.
Como vimos anteriormente, el fecha/hora actual se lee con la función read_io tipo 7 y se guarda en una variable numérica que representa la cantidad de segundos desde el 01/01/2000.

Sintaxis:

day dia,timestamp;

month mes,timestamp;

year año,timestamp;

hs hora,timestamp;

min minutos,timestamp;

sec segundos,timestamp;

nday dia_semana,timestamp;

La función “nday” devuelve el número de día de la semana comenzando por el domingo = 0.

Ejemplo:

read_io 7,e,0; #Lee la hora actual en e;
day f,e;
month g,e;
year h,e;
hs i,e;
min j,e;
sec k,e;
#La fecha y hora actual es f/g/h i:j:k;

Funciones matemáticas y lógicas

Estas funciones realizan ciertas operaciones matemáticas especiales.

Funcion “neg”

Se utiliza para negar una variable numérica. La negación se produce a nivel de bit.

Sintaxis:

neg resultado,inicio;

Primero se coloca la variable en la cual se quiere obtener el resultado y luego la variable a negar.

Ejemplo:

a=32323; #7E43h
neg b,a;

# b vale 4294934972 (FFFF81BC);

Función “sqtr”

Realiza la raíz cuadrada. Como el Exemys Script solo maneja variables enteras de tipo “long”, la parte decimal del resultado se verá truncada. Para evitar esto se recomienda multiplicar antes de realizar la operación.

Sintaxis:

sqrt resultado,inicio;

Ejemplo:

a=225;
sqrt b,a;
#Ahora b vale 15;

Función “scale”

Permite escalar una variable utilizando la ecuación de la recta que pasa por 2 puntos.

Sintaxis:

scale resultado,inicio,x0,x1,y0,y1;

Ejemplo: Escalar la señal 4-20mA de la entrada AN1 en un valor de 0 a 500

read_io 2,a,1; #a = AN1;
scale c,a,400,2000,0,500;
#Ahora c tiene el valor escalado;

Funciones de temporizado

Estas funciones permiten controlar el flujo del programa en función de tiempos.

Funciones “timer” y “check_timer”

Con estas funciones podemos definir un periodo de tiempo y ejecutar instrucciones cuando este se cumpla.
La forma de uso es la siguiente. Primero ejecutamos la función “timer” a la cual le pasamos como parámetros una variable numérica y un tiempo en milisegundos. Luego se consulta esta variable con la función “check_timer”.

Sintaxis:

timer variable_numerica,tiempo_en_milisegundos;
...
check_timer variable_numerica
{
    ...
    ...
};

Como podemos ver, con la función “timer” definimos el tiempo, y con “check_timer” consultamos la variable cargada anteriormente. Cuando se cumple el periodo, las instrucciones colocadas entre llaves se ejecutan.
Debemos tener en cuenta que una vez cumplido el periodo la condición siempre será verdadera, y si volvemos a realizar un “check_timer” se ejecutaran nuevamente las instrucciones. Normalmente se carga de vuelta la variable dentro del bloque “check_timer”

Nota: Las funciones de temporizado no deben usarse en aplicaciones de precisión de tiempo, ya que el temporizado puede presentar cierta dispersión.

2025-07-02