tag:blogger.com,1999:blog-2265724369308607872024-03-09T22:45:51.763+01:00Notas de automatizaciónEjemplos reales de automatización industrialGRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.comBlogger95125tag:blogger.com,1999:blog-226572436930860787.post-14063710189721342212017-05-04T23:14:00.000+02:002017-05-04T23:14:08.496+02:00Una función de bloque (FB) para el registro de datos en PLC Siemens<div style="text-align: justify;">
En la <a href="https://notasdeautomatizacion.blogspot.com.es/2017/04/representacion-de-una-grafica-xy-en-hmi.html">entrada anterior</a> expliqué cómo dibujar una gráfica en HMI con los datos almacenados en un bloque de datos (DB) en un PLC. Ahora voy a centrarme en la captura de datos en el propio PLC y para ello he desarrollado una función de bloque que recoge todo el proceso de captura.</div>
<div style="text-align: justify;">
<br />
Realizar la captura de datos de un proceso puede resultar un tema complejo ya que debemos tener en cuenta todos los factores en juego, tales como la velocidad de adquisición o la capacidad de almacenamiento disponible. La forma óptima y con la que obtendremos el mejor rendimiento es usar bloques de organización (OB) de interrupción por tiempo "Cyclic interrupt", en los que a intervalos regulares se leen las señales a analizar. En los nuevos <a href="http://w3.siemens.com/mcms/programmable-logic-controller/en/advanced-controller/s7-1500/Pages/default.aspx">PLC de la gama 1500 de Siemens</a> he visto que se pueden programar OB de interrupción por tiempo con periodos de 500 μs en adelante.</div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCddy3FJ8YBU82AKPTkFchSjqO_4qciFCTy6wqO89J0LTWpP8Ov-G15B3ux-zbbjuryTk8noObVVFuGQhQhdCWR1HGZRChiji6a3914a6CVD-40_X39rsLL6i1Ah60qnUZZmjyFMsBLScR/s1600/OB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCddy3FJ8YBU82AKPTkFchSjqO_4qciFCTy6wqO89J0LTWpP8Ov-G15B3ux-zbbjuryTk8noObVVFuGQhQhdCWR1HGZRChiji6a3914a6CVD-40_X39rsLL6i1Ah60qnUZZmjyFMsBLScR/s640/OB.png" width="640" /></a></div>
</div>
<div style="text-align: justify;">
En los veteranos <a href="http://w3.siemens.com/mcms/programmable-logic-controller/en/advanced-controller/s7-300/Pages/Default.aspx">S7-300</a> estos OB tienen un periodo de interrupción más largo, pueden empezar, según modelo, en el rango de 100 o 200 ms en adelante.</div>
<div style="text-align: justify;">
<br />
Sin embargo esta no es la estrategia que voy a seguir en este ejemplo, ya que el FB que he programado se llamará en el ciclo principal del PLC. Por tanto lo primero de lo que debemos asegurarnos es que el tiempo de ciclo de nuestro programa es suficiente para registrar los datos del sistema. Por ejemplo si tenemos una señal analógica proveniente de una célula de carga cuyo conversor analógico/digital tiene un tiempo de actualización de 100 ms y el tiempo de ciclo de nuestro PLC es de unos 15 ms, entonces no habrá problemas con la captura de datos.</div>
<div style="text-align: justify;">
<br />
NOTA: es importante señalar que el tiempo de ciclo de un PLC no es un valor constante y depende de la <i>carga de programa</i> en cada ciclo. Por lo general será suficiente asegurarse de que, mientras esté la captura de datos en marcha, no se requieran tareas pesadas al PLC tales como bucles FOR o WHILE largos.</div>
<div style="text-align: justify;">
<br />
Otro elemento a tener en cuenta es la cantidad máxima de datos a almacenar. Mi objetivo es la representación de los datos en una gráfica en un panel de Siemens y el número máximo de elementos que puede tener una tabla para ser enlazada desde el panel al PLC es de 1600 valores. Si se toma un dato en cada ciclo de scan del PLC las tablas de datos se llenan en pocos segundos, así que es necesario discriminar los datos a guardar cada cierto intervalo o el máximo valor de cada intervalo, por ejemplo.</div>
<div style="text-align: justify;">
<br />
Teniendo todo esto en cuenta he preparado un FB que utilizo cuando tengo que hacer un registro de datos. Una llamada a dicho FB tiene el siguiente aspecto:</div>
<div style="text-align: justify;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzQlDTpYGxtWuQIPGjNsSeOof-tol87-G8MgWoSNC4d-EvpAnqdlaEeXieCQkMFEgZ0bGeRg39unv08b76hzcAMDRj7D7njFCuNUC3UpSnBSqthGQPBEKofzIJ27cVrT05UtdZhvrNPcNa/s1600/Call.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="620" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzQlDTpYGxtWuQIPGjNsSeOof-tol87-G8MgWoSNC4d-EvpAnqdlaEeXieCQkMFEgZ0bGeRg39unv08b76hzcAMDRj7D7njFCuNUC3UpSnBSqthGQPBEKofzIJ27cVrT05UtdZhvrNPcNa/s640/Call.png" width="640" /></a></div>
</div>
<div style="text-align: justify;">
<br />
El funcionamiento es el siguiente: cuando la señal de habilitación está activa y la <b>Señal X</b> se encuentra entre el <b>Valor mínimo (X)</b> y <b>Valor máximo (X)</b> se procede a la captura de datos, indicado con la salida <b>Capturando</b>. Cada vez que la <b>Señal X</b> se incremente en un <b>Paso mínimo (X)</b> se almacenará un nuevo dato en la tabla, salvo que esté activada la opción <b>Guardar máximos (Y)</b>, en cuyo caso el valor que se guardará será el máximo para la <b>Señal Y</b> dentro del intervalo definido por el <b>Paso mínimo (X)</b>. Una vez finalizada la captura de datos, bien porque la <b>Señal X</b> haya salido de la ventana de valores mínimo y máximo o porque haya caído la señal de habilitación, se activará la salida <b>Listo</b> durante el tiempo especificado en <b>Tiempo pulso fin lectura</b>. El número de puntos almacenados en las tablas lo tenemos en la salida <b>Puntos</b> y si se alcanza el límite de datos posible se activa la señal <b>Desbordamiento</b>. Para repetir una captura de datos será necesario dar un pulso a la señal de <b>Reinicialización</b> antes de volver a habilitar la captura.</div>
<div style="text-align: justify;">
<br />
Los datos se almacenan en tablas que deberemos crear en un bloque de datos (DB) aparte y deberán tener el formato <i>Array[0..1599] of Real</i>. Se pasan al FB como parámetros <i>InOut</i>, y al ser un tipo de datos estructurado se pasan como puntero, con lo que no se desperdicia memoria duplicando las tablas, tal y como viene explicado en la documentación:</div>
<a name='more'></a><div style="text-align: justify;">
<i>Declare los tipos de datos estructurados en el área "InOut". Siempre que sea posible, para variables estructuradas (p. ej. del tipo de datos ARRAY, STRUCT, STRING, …) debe utilizarse el área "InOut" en la interfaz del bloque. Puesto que los parámetros de entrada/salida estructurados (InOut) se transfieren como estándar en forma de puntero, de este modo no aumenta innecesariamente la memoria de datos necesaria.</i></div>
<br />
El FB está programado en lenguaje SCL en TIA Portal V14 y el código sería el siguiente:<br />
<br />
<blockquote class="tr_bq">
FUNCTION_BLOCK "Captura de datos"<br />
TITLE = Registro de datos<br />
{ S7_Optimized_Access := 'TRUE' }<br />
VERSION : 0.1<br />
VAR_INPUT <br />
"Señal X" : Real := 0.0; // Señal para el eje X<br />
"Señal Y" : Real := 0.0; // Señal para el eje Y<br />
Habilitación : Bool := false; // Habilitación par ala captura de datos<br />
"Paso mínimo (X)" : Real := 0.0; // Paso mínimo en el eje X para guardar un nuevo punto<br />
"Guardar máximos (Y)" : Bool := false; // 1 - Dentro de cada tramo se guarda el valor máximo registrado / 0 - Se guarda el último valor del tramo<br />
"Valor mínimo (X)" : Real := 0.0; // Para que se registren datos la señal X debe ser mayor a este valor<br />
"Valor máximo (X)" : Real := 0.0; // Para que se registren datos la señal X debe ser menor a este valor<br />
Reinicialización : Bool := false; // Reinicialización de los datos<br />
"Tiempo pulso fin captura" : Time := t#1s; // Tiempo que dura el pulso de datos listos al finalizar una captura<br />
END_VAR<br />
<br />
VAR_OUTPUT <br />
Capturando : Bool; // Captura de datos en proceso<br />
Listo : Bool; // Captura de datos lista<br />
Puntos : Int; // Nº de puntos capturados<br />
Desbordamiento : Bool; // Las tabla de datos se han llenado (pérdida de datos)<br />
END_VAR<br />
<br />
VAR_IN_OUT <br />
"Datos X" : Array[0..1599] of Real; // Tabla para almacenar los datos de la señal X<br />
"Datos Y" : Array[0..1599] of Real; // Tabla para almacenar los datos de la señal Y<br />
END_VAR<br />
<br />
VAR <br />
"Tiempo listo" {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;<br />
"FN capturando" {OriginalPartName := 'F_TRIG_1500'; LibVersion := '1.0'} : F_TRIG;<br />
"Aux. Capturando" : Bool := false;<br />
"Aux. Listo" : Bool := false;<br />
"Aux. Puntos" : Int := 0;<br />
END_VAR<br />
<br />
VAR_TEMP <br />
Index : Int;<br />
END_VAR<br />
<br />
VAR CONSTANT <br />
"Nº puntos máximo" : Int := 1600; // Número máximo de elementos en las tablas de datos (máx. 1600)<br />
END_VAR<br />
<br />
<br />
BEGIN<br />
//=============================================================================<br />
// Notas de automatización - notasdeautomatizacion.blogspot.com 2017<br />
//-----------------------------------------------------------------------------<br />
// Herramienta de ingeniería: TIA Portal 14<br />
// Funcionalidad: Capturar dos señales (X,Y) para representarlas en HMI<br />
//-----------------------------------------------------------------------------<br />
// Registro de cambios:<br />
// 01.00.00 04.04.2017 Primera versión - GR <br />
//=============================================================================<br />
<br />
REGION Reinicialización de datos<br />
IF #Reinicialización THEN<br />
FOR #Index := 0 TO #"Nº puntos máximo" - 1 DO<br />
#"Datos X"[#Index] := real#0.0;<br />
#"Datos Y"[#Index] := real#0.0;<br />
END_FOR;<br />
#Puntos := #"Aux. Puntos" := 0;<br />
#Capturando := #"Aux. Capturando" := false;<br />
#Listo := #"Aux. Listo" := false;<br />
#Desbordamiento := false;<br />
RETURN;<br />
END_IF;<br />
END_REGION<br />
<br />
REGION Captura de datos<br />
IF #Habilitación AND<br />
#"Señal X" >= #"Valor mínimo (X)"AND #"Señal X"<= #"Valor máximo (X)" AND<br />
#"Aux. Puntos" >= 0 AND #"Aux. Puntos" < #"Nº puntos máximo" THEN<br />
<br />
#"Aux. Capturando" := true;<br />
<br />
IF #"Aux. Puntos" = 0 THEN<br />
#"Datos X"[0] := #"Señal X";<br />
#"Datos Y"[0] := #"Señal Y";<br />
#"Aux. Puntos" := 1;<br />
ELSE<br />
IF #"Señal Y" > #"Datos Y"[#"Aux. Puntos"] OR NOT #"Guardar máximos (Y)" THEN<br />
#"Datos X"[#"Aux. Puntos"] := #"Señal X";<br />
#"Datos Y"[#"Aux. Puntos"] := #"Señal Y";<br />
END_IF;<br />
<br />
IF #"Señal X" >= #"Datos X"[#"Aux. Puntos" - 1] + #"Paso mínimo (X)" THEN<br />
#"Aux. Puntos" += 1;<br />
END_IF;<br />
END_IF;<br />
ELSE<br />
#"Aux. Capturando" := false;<br />
END_IF;<br />
END_REGION<br />
<br />
REGION Salidas<br />
#"FN capturando"(CLK := #"Aux. Capturando");<br />
IF #"FN capturando".Q THEN<br />
#"Aux. Listo" := true;<br />
END_IF;<br />
<br />
#"Tiempo listo"(IN := #"Aux. Listo", PT := #"Tiempo pulso fin captura");<br />
IF #"Tiempo listo".Q THEN<br />
#"Aux. Listo" := false;<br />
END_IF;<br />
<br />
#Capturando := #"Aux. Capturando";<br />
#Listo := #"Aux. Listo";<br />
#Puntos := #"Aux. Puntos";<br />
<br />
IF #"Aux. Puntos" >= #"Nº puntos máximo" THEN<br />
#Desbordamiento := true;<br />
END_IF;<br />
END_REGION<br />
<br />
END_FUNCTION_BLOCK</blockquote>
<br />
<div style="text-align: justify;">
ADVERTENCIA: Si quisieramos usar este código en versiones anteriores de TIA Portal habría que adaptarlo eliminado las regiones, las asignaciones múltiples y el operador de incremento, que son novedades en TIA Portal V14.</div>
<br />
<div style="text-align: justify;">
Al proyecto que preparé en la entrada anterior le he añadido este FB y un código de prueba donde uso como "Señal X" un temporizador y como "Señal Y" una función seno de la "Señal X", de forma que puedo hacer pruebas desde el panel:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAcmCACKEPvLDtIxjcBkbxtTcAcgziaPHA2lrPPUDApaCvyoO4dm6QtqdNk8A76t5P7lwq-ICEcGgdwXUQUoQVanRmyg89_tja9fGlB8LQtJA4ozUuSEQzMhO-C3x5MIpJSkcIEAgRgQ84/s1600/P1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAcmCACKEPvLDtIxjcBkbxtTcAcgziaPHA2lrPPUDApaCvyoO4dm6QtqdNk8A76t5P7lwq-ICEcGgdwXUQUoQVanRmyg89_tja9fGlB8LQtJA4ozUuSEQzMhO-C3x5MIpJSkcIEAgRgQ84/s640/P1.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pantalla para simular una captura de datos y probar el FB</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiivxT95r2OiNsLEjtv2AjHoi0TulQKBw414oiJMrYw_iXCBQ3ZJhsT_ryA8ZZP7YK_shBs34jQ5G5i2OK3oGrix98MPdMQnKXomYOiNnoF-sJu7YwoCXr9udFk6nHKrwmVPYfBFhXRgQIe/s1600/P2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiivxT95r2OiNsLEjtv2AjHoi0TulQKBw414oiJMrYw_iXCBQ3ZJhsT_ryA8ZZP7YK_shBs34jQ5G5i2OK3oGrix98MPdMQnKXomYOiNnoF-sJu7YwoCXr9udFk6nHKrwmVPYfBFhXRgQIe/s640/P2.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Resultado de la prueba en un panel real</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
Espero que esto le pueda resultar útil a alguien y como siempre agradeceré comentarios.<br />
</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com7tag:blogger.com,1999:blog-226572436930860787.post-2280772651943262582017-04-24T22:04:00.000+02:002017-04-24T23:16:42.826+02:00Gráfica X/Y en HMI Siemens a partir de puntos almacenados en un bloque de datos (DB)<div style="text-align: justify;">
Si utilizamos un <a href="https://es.wikipedia.org/wiki/Controlador_l%C3%B3gico_programable">PLC</a>
<a href="http://w5.siemens.com/spain/web/es/industry/automatizacion/Pages/automatizacion_industrial_default.aspx">Siemens</a> para realizar una captura de datos y después pretendemos
realizar una gráfica con estos datos en un panel táctil de Siemens
(un <a href="http://w3.siemens.com/mcms/human-machine-interface/en/operator-devices/advanced-hmi-panel-based/comfort-panels/Pages/Default.aspx">Comfort Panel</a> por ejemplo), veremos que la cosa no es tan
sencilla.</div>
<br />
<div style="text-align: justify;">
Los controles para
mostrar gráficas en los sistema <a href="https://es.wikipedia.org/wiki/Interfaz_de_usuario">HMI</a> de Siemens parecen estar
pensados para que el propio sistema HMI haga la captura de datos para
su representación, como queriendo liberar al PLC de esta tarea. Sin
embargo el limitado ciclo de adquisición que tienen estos sistemas
nos limitan a procesos con una dinámica lenta, en los que
registrando un punto cada varios segundos sea suficiente. Si es
necesario registrar un proceso más rápido deberá ser el PLC el que
se haga cargo, guardando, por ejemplo, los datos en tablas en un
bloque de datos (DB), pero entonces se plantea el problema de cómo
llevar estos datos al control de visualización de gráficas.</div>
<br />
<div style="text-align: justify;">
En esta entrada voy a
explicar cómo representar en un control "Visor de curvas f(x)"
datos almacenados en un bloque de datos en un PLC. Me he basado en un ejemplo que me facilitó un técnico de Siemens, aunque yo lo he elaborado un poco más.</div>
<br />
<div style="text-align: justify;">
La idea general será
que el control "Visor de vurvas f(x)" permite ser
configurado para obtener los datos de un fichero de texto en formato
CSV, y como desde un script podemos crear ficheros de texto y además
tenemos acceso a las variables del PLC, programaremos uno que vaya
leyendo los datos almacenados en el bloque de datos y escribiéndolos
en un fichero CSV digerible por el control "Visor de curvas
f(x)".</div>
<a name='more'></a><div style="text-align: justify;">
<br />
El material que voy a
utilizar en esta entrada es un PLC 1510SP F-1 PN de la serie 1500 de
Siemens, aunque valdría cualquiera de las series 300/400/1200/1500.
Como panel tengo un TP900 Comfort, pero sería igualmente válido uno
que tuviese capacidad de ejecutar scripts y llevase como sistema
operativo Windows CE (no serviría un panel que ejecutase Windows
normal de PC). Además, el panel debe disponer de algún puerto USB
libre o ranura para tarjetas SD.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir7-64Z-7u_7SYSordub3eJVrXtKNCR_t44aq3dyzg9k3L403AY36pzvagaVJtwp4xE4J5QJTe-rRoL8sV0tjrb6_h2nbc1N7UoF_4oEqUTReU0RUPV7bKPQVs6GngF65aDwQm5kNkwW0A/s1600/00+-+Red.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir7-64Z-7u_7SYSordub3eJVrXtKNCR_t44aq3dyzg9k3L403AY36pzvagaVJtwp4xE4J5QJTe-rRoL8sV0tjrb6_h2nbc1N7UoF_4oEqUTReU0RUPV7bKPQVs6GngF65aDwQm5kNkwW0A/s640/00+-+Red.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Para crear los
ficheros hay que disponer de una unidad de almacenamiento donde
ubicarlos, y esta debe ser una memoria externa, ya sea conectada a un
puerto USB o una tarjeta SD (desde un script no podemos escribir en
la memoria interna del panel). La ruta de los ficheros debe ser
ajustada en el script y en la configuración de ficheros en el panel,
como iremos viendo más adelante.</div>
<br />
<div style="text-align: justify;">
El proyecto sobre el
que estoy trabajando está generado con el software de ingenería TIA
Portal V14, aunque todo lo aquí explicado debería funcionar con
versiones anteriores.</div>
<br />
<div style="text-align: justify;">
Configurados nuestro
PLC y panel para que se comuniquen a través de una red Profinet,
procederemos a crear en el PLC un bloque de datos donde almacenaremos
los puntos que queramos representar en el panel. En este ejemplo,
este DB será lo único que necesitemos en el PLC.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS9YoCsprfQ_urGn5ar8QQqdyfrmFoLNwb6gZU4gxiuquPNv05Etf9CWIqhAsGLhLUfebK7xuXAvuaW_UbH1OJwGOhQL40R8Y9X3pnFozEb3u6KImhEUBKOeOzdXJPqTTsoe8uLLgoFotJ/s1600/01+-+DB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS9YoCsprfQ_urGn5ar8QQqdyfrmFoLNwb6gZU4gxiuquPNv05Etf9CWIqhAsGLhLUfebK7xuXAvuaW_UbH1OJwGOhQL40R8Y9X3pnFozEb3u6KImhEUBKOeOzdXJPqTTsoe8uLLgoFotJ/s640/01+-+DB.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Este DB consta de un
Índice que me indica la última posición de las tablas que
contienen datos y dos tablas de 500 valores reales donde se iran almacenando
los puntos a representar en sus coordenadas X e Y respectivamente.
Estas tablas podrían tener un tamaño máximo de 1600 elementos, ya
que es límite que se impone para poder ser enlazadas desde el panel.</div>
<br />
<div style="text-align: justify;">
Pasamos entonces a
realizar la configuración en el panel. Lo primero será crear las
variables que necesitamos: enlazaremos las tablas creadas en el PLC
("DATOS_X" y "DATOS_Y"), el índice (HMI_Índice);
crearemos dos variables reales ("LogValX" y "LogValY")
que nos servirar para ir leyendo los datos y un booleano ("Espera")
para visualizar en el panel que se están procesando los datos de la
gráfica.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcuC2LCqNWxWab8Iod2cmhpA4aau53blKyKg6zFnhPHMzpDLojBJ-uc5nin7iVGts1lIsrj3N4um6KnjFF9Ez_U2VFvn-Xik_di_6VHI8pef5NTZA_FDqyCVZeJQ1Bj9iT5zlcxreXIAmR/s1600/02+-+Variables+HMI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcuC2LCqNWxWab8Iod2cmhpA4aau53blKyKg6zFnhPHMzpDLojBJ-uc5nin7iVGts1lIsrj3N4um6KnjFF9Ez_U2VFvn-Xik_di_6VHI8pef5NTZA_FDqyCVZeJQ1Bj9iT5zlcxreXIAmR/s640/02+-+Variables+HMI.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
En el árbol del
proyecto hacemos doble clic sobre Ficheros.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkSoIiPFn0-ByyVkedjKkn5z8O4qVwqCFu2E43umH_5PZe2lko_dIUxFl5Gw28UtfEkO6Mmydw0M8iwWp5n3qn46WLcf_qfyn8Lky7qLfhGCLYBHiMeMbWlG-5-HWo7UY6co4QYg6od4t7/s1600/02b+-+Ficheros.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkSoIiPFn0-ByyVkedjKkn5z8O4qVwqCFu2E43umH_5PZe2lko_dIUxFl5Gw28UtfEkO6Mmydw0M8iwWp5n3qn46WLcf_qfyn8Lky7qLfhGCLYBHiMeMbWlG-5-HWo7UY6co4QYg6od4t7/s640/02b+-+Ficheros.png" width="344" /></a></span></div>
<br />
<div style="text-align: justify;">
Deberemos generar dos
ficheros de variables "DATOX" y "DATOY". Les
damos como ubicación "Archivo – CSV (ASCII)", asignamos
la ruta "\Storage Card USB\" en el caso de que utilicemos
una memoria USB como unidad de trabajo o "\Storage Card SD\"
si dicha unidad es una tarjeta SD. El método de archivación será
"Fichero circular" y el comportamiento al reiniciar será
"Restaurar fichero". En cada fichero de variable deberemos
asignar una variable de fichero, que serán las que previamente hemos
creado como reales en la tabla de variables "LogValX" y
"LogValY". Es importante que nos aseguremos de que el modo
de adquisición esté seleccionado "Bajo demanda".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjADnfDDcpruXCmJGTklexxLiWT8JEiyIEmEv4LKp4AIsZwgEiQvITZD61zRD_ISFYMCYGfTZ7txvMLCOIF-_2vbdP7USsUXeThxDWHkad8xLdcJuyCneVSX_5kuEVzfAn9Y6Jn5ZZ3C8zD/s1600/03+-+Fichero+X.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjADnfDDcpruXCmJGTklexxLiWT8JEiyIEmEv4LKp4AIsZwgEiQvITZD61zRD_ISFYMCYGfTZ7txvMLCOIF-_2vbdP7USsUXeThxDWHkad8xLdcJuyCneVSX_5kuEVzfAn9Y6Jn5ZZ3C8zD/s640/03+-+Fichero+X.png" width="640" /></a></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDqhcJR7pVFvMpI0EcP6px68hdP2EqRS52LGI10welbbNuzNQtfpIkuMa4PByiYEd80wFSAwlT8Z82R2yoT4agJt9ll8-j4s-ch8z2UI77v2VjH4Q1aei7gJcSXrIBa3yx_K2p8QeIa7N5/s1600/04+-+Fichero+Y.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDqhcJR7pVFvMpI0EcP6px68hdP2EqRS52LGI10welbbNuzNQtfpIkuMa4PByiYEd80wFSAwlT8Z82R2yoT4agJt9ll8-j4s-ch8z2UI77v2VjH4Q1aei7gJcSXrIBa3yx_K2p8QeIa7N5/s640/04+-+Fichero+Y.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
El siguiente paso será
programar el script, cuya función será recorrer las tablas en el
bloque de datos en el PLC e ir escribiendo los ficheros en formato
CSV de donde tomará los datos el control de visualización de la
gráfica. El nombre de los ficheros (se genera un fichero por cada
variable) deberá ser el que hayamos asignado en la configuración
de ficheros de variables ("DATOX" y "DATOY")
añadiéndo "0.csv", quedando como "DATOX0.csv" y
"DATOY0.csv". Es importante en el script ajustar la misma
ruta que la que hayamos configurado en la configuración de ficheros
de variables ("\Storage Card USB\" o "\Storage Card
SD\").</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisAfFEtLJxGuPejy2CwFAQhv70tLIgpFUJnuwXFPTgZ36dq__RYF4adOgKqpVHtcBPRsqCyWmUGTu7zRsECVZf896_pWd3Hrk1ZGDeoU2P4ATc9BmkfQ4OuR2Ymg_q_QUdpcHpesthAu1F/s1600/05+-+Script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="436" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisAfFEtLJxGuPejy2CwFAQhv70tLIgpFUJnuwXFPTgZ36dq__RYF4adOgKqpVHtcBPRsqCyWmUGTu7zRsECVZf896_pWd3Hrk1ZGDeoU2P4ATc9BmkfQ4OuR2Ymg_q_QUdpcHpesthAu1F/s640/05+-+Script.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
El código del script
es el siguiente:
<br />
<blockquote class="tr_bq">
Sub Grafica_Dibujar()<br />'=============================================================================<br />' Notas de automatización 2017 - https://notasdeautomatizacion.blogspot.com<br />'-----------------------------------------------------------------------------<br />'Herramienta de ingeniería: TIA Portal 14<br />'Requerimientos adicionales:<br />' -Tarjeta SD o memoria USB contactada al panel (ajustar la ruta adecuada)<br />' -Panel que ejecute Windows CE<br />'Funcionalidad: A partir de datos almacenados en un DB del PLC se representa<br />' una gráfica en el panel.<br />'-----------------------------------------------------------------------------<br />'Registro de cambios:<br />'01.00.00 31.03.2017 GR - Primera versión<br />'=============================================================================<br /><br />'NOTA: Los nombres de fichero a utilizar deberán ser los que hayamos asignado<br />' en la configuración de ficheros de variables en el panel, añadiendo '0'<br />' y la extensión '.csv'.<br /><br />'Rutas y nombres de fichero para las variables a representar en los ejes X e Y<br />'(Si se usa como memoria de almacenamiento una tarjeta SD)<br />'IMPORTANTE: Se deben asignar las mismas rutas en la configuración de ficheros<br />'Const pathX = "\Storage Card SD\DATOX0.csv"<br />'Const pathY = "\Storage Card SD\DATOY0.csv"<br /><br />'Rutas y nombres de fichero para las variables a representar en los ejes X e Y<br />'(Si se usa como memoria de almacenamiento una memoria USB)<br />'IMPORTANTE: Se deben asignar las mismas rutas en la configuración de ficheros<br />Const pathX = "\Storage Card USB\DATOX0.csv"<br />Const pathY = "\Storage Card USB\DATOY0.csv"<br /><br />Const varNametagX = "LogValX" 'Nombre de la variable para el eje X en HMI<br />Const varNametagY = "LogValY" 'Nombre de la variable para el eje Y en HMI<br /><br />Const ForAppending = 8 'Modo de acceso a fichero<br />Const fsAttrArchive = 32 'Dir command attribute (archive)<br /><br />Const validity = 1<br />Const splitSign = ";" 'Separador de campos<br /><br />Dim array_x, array_y, fsc, dir_return, fsoX, fsoY, delay_counter<br />Dim i, data_count, timeMS, timestring<br /><br />'ShowSystemAlarm "Iniciando representación de gráfica..."<br />SetBit "Espera" 'Para señalizar en la pantalla que se está dibujando<br /><br />CloseAllLogs 'Close logs and files<br /><br />'Espera para dar tiempo a cerrar todos los ficheros<br />delay_counter = 0<br />While delay_counter < 100000<br /> delay_counter = delay_counter + 1<br />Wend<br /><br />'Si hay ficheros previos creados se borran<br />Set fsc = CreateObject("FileCtl.FileSystem")<br /><br />dir_return = fsc.dir(pathX, fsAttrArchive)<br />If dir_return <> "" Then<br /> fsc.kill pathX<br /> 'ShowSystemAlarm pathX & " deleted" 'Debug code<br />End If<br /><br />dir_return = fsc.dir(pathY, fsAttrArchive)<br />If dir_return <> "" Then<br /> fsc.kill pathY<br /> 'ShowSystemAlarm pathY & " deleted" 'Debug code<br />End If<br /><br />Set fsc = Nothing<br /><br />'SE GENERAN LOS FICHEROS A PARTIR DE LOS CUALES SE DIBUJARÁ LA GRÁFICA<br /><br />'Para Windows CE - NO FUNCIONA PARA WINDOWS DE PC<br />Set fsoX = CreateObject("FileCtl.File")<br />Set fsoY = CreateObject("FileCtl.File")<br /><br />'Open files for appending<br />fsoX.open pathX, ForAppending<br />fsoY.open pathY, ForAppending<br /><br />Set array_x = SmartTags("DATOS_X") 'Tabla de datos para el eje X<br />Set array_y = SmartTags("DATOS_Y") 'Tabla de datos para el eje Y<br /><br />'Se escribe la cabecera para el fichero CSV del eje X<br />fsoX.LinePrint("""VarName"";""TimeString"";""VarValue"";""Validity"";""Time_ms""")<br />fsoX.LinePrint("""$RT_DIS$"";""30.03.2017 12:00:00"";0;0;0,0")<br />fsoX.LinePrint("""$RT_COUNT$"";2;;;;")<br /><br />'Se escribe la cabecera para el fichero CSV del eje Y<br />fsoY.LinePrint("""VarName"";""TimeString"";""VarValue"";""Validity"";""Time_ms""")<br />fsoY.LinePrint("""$RT_DIS$"";""30.03.2017 12:00:00"";0;0;0,0")<br />fsoY.LinePrint("""$RT_COUNT$"";2;;;;")<br /><br />'Se recorren las tablas de datos escribiendo en los ficheros CSV<br />data_count = SmartTags("HMI_Índice")<br />If data_count > 0 And data_count < 500 Then '500 es el número de elementos en las tablas en el PLC<br /> For i=0 To data_count<br /> timeMS = i<br /> fsoX.LinePrint (varNametagX & splitSign & timestring & splitSign & array_x(i) & splitSign & validity & splitSign & timeMS)<br /> fsoY.LinePrint (varNametagY & splitSign & timestring & splitSign & array_y(i) & splitSign & validity & splitSign & timeMS) <br /> Next<br />Else<br /> ShowSystemAlarm "Sin datos en la tabla (índice no válido)."<br />End If<br /><br />'Una vez terminada la escritura se cierran los ficheros <br />fsoX.Close<br />fsoY.Close<br />Set fsoX = Nothing<br />Set fsoY = Nothing<br /><br />If Err.Number <> 0 Then<br /> ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description<br /> Err.Clear<br />Else<br /> 'ShowSystemAlarm "Representación gráfica finalizada." 'Debug code<br />End If<br /> <br />'Restablecer la conexión entre WinCC y los ficheros<br />OpenAllLogs<br /><br />'Espera para dar tiempo a abrir todos los ficheros<br />delay_counter = 0<br />While delay_counter < 100000<br /> delay_counter = delay_counter + 1<br />Wend<br /><br />'Actualizar/acceder a la pantalla donde se representa la gráfica<br />'NOTA: En versiones de firmware anteriores al TIA 14, al ejecutar la siguiente línea <br />' aparecía un error indescifrable en el panel y no se visualizaba la gráfica. Si eso<br />' sucede, la solución es crear un script adicional donde se ejecute únicamente esta<br />' línea de código (la llamada a la pantalla). Este script se llamaría en lugar de la<br />' línea problemática "ActivateScreen".<br />ActivateScreen "Gráfica", 0<br /><br />ResetBit "Espera"<br /><br />End Sub</blockquote>
<br />
Al
final el script llama a la pantalla donde tengamos el visor de la
gráfica, para que se actualice. No me paro a explicar en detalle el
script ya que resultaría tedioso y creo que lo mejor es analizarlo
apoyándose en sus comentarios.</div>
<br />
<div style="text-align: justify;">
Ahora
vamos a crear una pantalla con el control de visualización de la
gráfica, la que yo he preparado tiene el siguiente aspecto:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEIZJA9wK5ZvIfQGRQUFtsZjKhARfZedNDFc2BX8gmcXslUxhkoi4VAB5pPZ28kysV-ag6wW-bpGYCEiwpv6ku869pzooS218qSmp4qKCMK6_KATIhU9ySUXJucsGltCxhlXeYsvhrCquq/s1600/06+-+Pantalla.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEIZJA9wK5ZvIfQGRQUFtsZjKhARfZedNDFc2BX8gmcXslUxhkoi4VAB5pPZ28kysV-ag6wW-bpGYCEiwpv6ku869pzooS218qSmp4qKCMK6_KATIhU9ySUXJucsGltCxhlXeYsvhrCquq/s640/06+-+Pantalla.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Básicamente
consiste en un control "Visor de curvas f(x)", un botón
desde el que se llamará al script y en la parte inferior un "Visor
de avisos" para la visualización de mensajes del sistema.
Además visualiza la variable "Índice" y como en mis
pruebas voy a usar una memoria USB pongo un botón para poder
retirarla con seguridad.</div>
<br />
<div style="text-align: justify;">En
las propiedades del visor de curvas nos interesa la opción de
"Curvas", donde añadiremos nuestra gráfica.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwHch9zq-V9VhbehTn22FXbanZwV4Fa8jis6lIJ3jg-RV7b0GpY14SGEyMdMYSZQDm-7YSAmu0r8JlwEjNeS38UUFnkz5OW_K_1RjQWWqkuGFsAv1wou6hRg3zoMIKbvTRoy5k6zXvcYkd/s1600/07+-+Curvas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwHch9zq-V9VhbehTn22FXbanZwV4Fa8jis6lIJ3jg-RV7b0GpY14SGEyMdMYSZQDm-7YSAmu0r8JlwEjNeS38UUFnkz5OW_K_1RjQWWqkuGFsAv1wou6hRg3zoMIKbvTRoy5k6zXvcYkd/s640/07+-+Curvas.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
En
"Estilo" configuraremos a nuestro gusto cómo queremos que
se represente la línea (o los puntos) de nuestros datos.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC-_ICjfYF7T7kf0Y7rM10MVmd3p0CITsRYYhHglS-yqpIzQijOIqu3VhUWxSzUS6cIQSJxOqJYHBs3PPAcGnbdGbDsL7kqlUAOPxybZoCA7aLhmITkv2naf9L8ETZ3Dk1i5GAjX-jmj69/s1600/08+-+Estilo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC-_ICjfYF7T7kf0Y7rM10MVmd3p0CITsRYYhHglS-yqpIzQijOIqu3VhUWxSzUS6cIQSJxOqJYHBs3PPAcGnbdGbDsL7kqlUAOPxybZoCA7aLhmITkv2naf9L8ETZ3Dk1i5GAjX-jmj69/s640/08+-+Estilo.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
En
"Origen de los datos" deberemos seleccionar como tipo de
origen "Variables de fichero".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWK8NWh7-E2J8Lzpm8I-IoB8YdjqHkB3saQ3E6L6ib1dtM6G8gFhHZSxrGbO-BeZ5E6ReCIYU0wF3krdH7zM6tl7CdQRwoHpP7aiE1-7cIH3MhSJd4lQUQIUZSfucjAUlsFZwnjkAPKv1J/s1600/09+-+Origen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWK8NWh7-E2J8Lzpm8I-IoB8YdjqHkB3saQ3E6L6ib1dtM6G8gFhHZSxrGbO-BeZ5E6ReCIYU0wF3krdH7zM6tl7CdQRwoHpP7aiE1-7cIH3MhSJd4lQUQIUZSfucjAUlsFZwnjkAPKv1J/s640/09+-+Origen.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Como
valores X e Y deberemos seleccionar las variables "LogValX"
y "LogValY" que hemos incluido en los ficheros "DATOX"
y "DATOY".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirmR-C30rMToDqX_aEd10RAou2rrQ4BlEDwjt4K675RKc5sG8Q_hXwb6_Qe4HGsMC5pXCX-b94fybGe_obONn7hNu9Eqkurv0AWFqZoc_WIR8epcMDuUJ3jdqhAKG2SwctTAWk92fBnxB1/s1600/10+-+Valores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="274" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirmR-C30rMToDqX_aEd10RAou2rrQ4BlEDwjt4K675RKc5sG8Q_hXwb6_Qe4HGsMC5pXCX-b94fybGe_obONn7hNu9Eqkurv0AWFqZoc_WIR8epcMDuUJ3jdqhAKG2SwctTAWk92fBnxB1/s640/10+-+Valores.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
En
rango de datos deberemos seleccionar "Puntos de medición",
siendo el tiempo de inicio irrelevante.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqP2vZ_PhY9RwptVW1xLJn0ukATDIzo8DbaILkoVNfwVQ72Il6zwUwby_XkAseCq40B6pj998eVw-EndsokCNvqZCNSooHcMYH3hmo1QpGbXG46CsmES9R_YWPM2Ru4mxVtuvtRJCNKCm9/s1600/11+-+Rango.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqP2vZ_PhY9RwptVW1xLJn0ukATDIzo8DbaILkoVNfwVQ72Il6zwUwby_XkAseCq40B6pj998eVw-EndsokCNvqZCNSooHcMYH3hmo1QpGbXG46CsmES9R_YWPM2Ru4mxVtuvtRJCNKCm9/s640/11+-+Rango.png" width="640" /></a></span></div>
<br />
<div lang="zxx" style="text-align: justify;">
El
resto de configuraciones del visor de curvas lo ajustaremos según
nuestras necesidades, teniendo muchas de ellas un efecto simplemente
estético.</div>
<br />
<div style="text-align: justify;">
A
continuación, en el botón con el texto redibujar, voy a asignar la
llamada al script "Grafica_Dibujar". Cada vez que pulse
este botón se leerán los datos del PLC, se escribirán en ficheros
en la memoria USB y a partir de ahí se representarán en el visor de
curvas.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUOgNBO0JKbtrNt2Muol5LHJBCRUERCv34yx3Vxl3VdrQ1Tu9eWspFLqQV09q1C74d38OdrD11FEn5e-s7_PZPeP9phw8j1oI81t6wtSH2FTXHSpw-HZ21aImdDEx5011Ib8zMdN7Hchpg/s1600/12+-+Redibujar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUOgNBO0JKbtrNt2Muol5LHJBCRUERCv34yx3Vxl3VdrQ1Tu9eWspFLqQV09q1C74d38OdrD11FEn5e-s7_PZPeP9phw8j1oI81t6wtSH2FTXHSpw-HZ21aImdDEx5011Ib8zMdN7Hchpg/s640/12+-+Redibujar.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Para
probar la representación deberemos forzar valores directamente en
las tablas del DB.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvDp-MmAMSK2zrecgt5MWNi26FJFudZ6cZ2tacFcrOQIjujWsZmMt6wfsFlFUyeUDK1Sztn99cuG9f1T6mHGc_I9T-dzvunPHKd8CGh9T2YaecduQEslZl8A3lGSQ23PUK2AQe5Ks5Xxjf/s1600/13+-+Forzar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="506" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvDp-MmAMSK2zrecgt5MWNi26FJFudZ6cZ2tacFcrOQIjujWsZmMt6wfsFlFUyeUDK1Sztn99cuG9f1T6mHGc_I9T-dzvunPHKd8CGh9T2YaecduQEslZl8A3lGSQ23PUK2AQe5Ks5Xxjf/s640/13+-+Forzar.png" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Pulsando
el botón "REDIBUJAR" deberían aparecer representados
nuestros datos en el visor de gráficas.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPMgHQnsCsmH13eOaIx1rAVHZGnrxIzzQW87wAE_j4CVphjL5ovh-rtoGlkzPypwKWut1usqwXE7wFkomPg9JtrWoQ4tAJpS4w5XV4UA7AYOq3RdL2Xm8tvEV7qKOp89gkTKz7rHx6pR5R/s1600/14+-+Captura.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="444" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPMgHQnsCsmH13eOaIx1rAVHZGnrxIzzQW87wAE_j4CVphjL5ovh-rtoGlkzPypwKWut1usqwXE7wFkomPg9JtrWoQ4tAJpS4w5XV4UA7AYOq3RdL2Xm8tvEV7qKOp89gkTKz7rHx6pR5R/s640/14+-+Captura.jpg" width="640" /></a></span></div>
<br />
<div style="text-align: justify;">
Y hasta aquí este ejemplo, que espero sea útil para hacer desarrollos
más elaborados.</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com8tag:blogger.com,1999:blog-226572436930860787.post-29878823842320593512017-04-11T20:55:00.000+02:002017-04-11T20:55:35.673+02:00Unas notas sobre las novedades para programar controladores S7-1500 en TIA Portal <div style="text-align: justify;">
En estos últimos años me he dedicado casi en exclusiva a programar PLC de <a href="http://w5.siemens.com/spain/web/es/industry/automatizacion/Pages/automatizacion_industrial_default.aspx">Siemens</a> con el software de ingenería <a href="http://w5.siemens.com/spain/web/es/industry/automatizacion/simatic/Tia-Portal/Pages/TIAPortal.aspx">TIA Portal</a>, desde la versión 12 a la última 14. Al principio controladores de la gama S7-300 pero, además, he empezado a utilizar la nueva gama <a href="http://w5.siemens.com/spain/web/es/industry/automatizacion/simatic/controladores_modulares/controlador_avanzado/Pages/Default.aspx#SIMATIC_20S7_1500_20__20Incremento_20de_20la_20productividad_20y_20eficiencia_20en_20planta_20y_20m_c3_a1quina">S7-1500</a>, que traen un cambio importante de tecnología. Aunque la programación de los antiguos S7-300/400 sirve para los nuevos S7-1500, mantener las mismas constumbres de programación nos hará desaprovechar muchas de las importantes mejoras que traen estos últimos.</div>
<br />
<div style="text-align: justify;">
Para ponernos al día sobre todas las posibilidades Siemens pone a nuestra disposición abundante documentación que nos servirá de orientación. En esta entrada haré un resumen de las ideas y conceptos que más me han llamado la atención y que me han parecido más interesantes.
A continuación tenéis una serie de enlaces donde podemos acceder a la fuente de esta documentación en la propia página de Siemens:</div>
<ul>
<li><a href="https://support.industry.siemens.com/cs/document/90885040/programming-guideline-for-s7-1200-1500?dti=0&dl=en&lc=es-WW">Programming Guideline for S7-1200/1500</a> (en inglés).
</li>
<li><a href="https://support.industry.siemens.com/cs/document/109478811/gu%C3%ADa-para-la-migraci%C3%B3n%3A-de-simatic-s7-300-s7-400-a-simatic-s7-1500?dti=0&lc=es-ES">Guía para la migración: De SIMATIC S7-300/S7-400 a SIMATIC S7-1500</a>.</li>
<li><a href="https://support.industry.siemens.com/cs/document/65601780/tia-portal%3A-resumen-de-los-documentos-y-enlaces-m%C3%A1s-importantes-sobre-control?dti=0&lc=es-WW">TIA Portal: Resumen de los documentos y enlaces más importantes sobre control</a>. </li>
</ul>
<div style="text-align: justify;">
Lo primero que tengo que decir es que si tenemos un proyecto en TIA Portal con un S7-300 y tenemos que migrarlo a un S7-1500 el proceso es muy sencillo. Yo habré migrado media docena de proyectos con distintas configuraciones y no he tenido ningún problema, ya que todas las capacidades de un S7-300 están soportadas por un S7-1500. Sin embargo, al hacer ésto estamos desaprovechando las nuevas características que nos ofrece el 1500, como son, por ejemplo, los bloques optimizados.
</div>
<a name='more'></a><div style="text-align: justify;">
En cuanto a los lenguajes de programación en TIA Portal cabe destacar la inclusión de SCL (Structured Control Language) como uno de los lenguajes por defecto en TIA Portal, no como en el antiguo Step7 que requería de un paquete opcional. El lenguaje AWL (STL - lista de instruciones) sigue disponible, aunque no en la gama S7-1200.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9Sk4gLKja86PlEssLcc-ZMLcGsCvaEgEujRb3ciCAo8wEis16I5FwOryt9RsgPxcK9k-vI4hbWiYPNMfP72kIsRmb3oflHkUTvIbPMrd8roy39oSULj9fCiUvIG9jE7oqNzaolw4VvUI_/s1600/Lenguajes.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9Sk4gLKja86PlEssLcc-ZMLcGsCvaEgEujRb3ciCAo8wEis16I5FwOryt9RsgPxcK9k-vI4hbWiYPNMfP72kIsRmb3oflHkUTvIbPMrd8roy39oSULj9fCiUvIG9jE7oqNzaolw4VvUI_/s640/Lenguajes.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tabla sacada del documento de Siemens "<a href="https://support.industry.siemens.com/cs/document/90885040/programming-guideline-for-s7-1200-1500?dti=0&dl=en&lc=es-WW">Programming Guideline for S7-1200/1500</a>"</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
Un cambio de filosofía muy importante que trae el TIA Portal es el
abandono del direccionamiento directo a memoria. Sigue estando soportado
por razones de compatibilidad, pero se considera una funcionalidad <i>legacy</i>,
con lo que es muy probable que en el futuro desaparezca. A cambio
deberemos irnos acostumbrando al direccionamiento simbólico; de hecho
los bloques optimizados sólo aceptan este tipo de direccionamiento.</div>
<br />
<div style="text-align: justify;">
Los
bloques optimizados son otra gran novedad en la nueva gama de PLCs
Siemens. En ellos no debemos preocuparnos por situar los datos en la
memoria ya que la organización de los datos se hace automáticamente. En
Step7 tradicional los bloques de datos se almacenaban por defecto en
memoria remanente, ahora con los bloques optimizados deberemos ir
marcando individualmente los datos que deban ser remanentes. Otra
ventaja importante es que se pueden añadir datos a un DB y tranferirlo
al PLC sin reinicializar los datos previos. </div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnI_8rGw46-_BdQJxm9Z8iNXZFQ5K1XujeozBEoRG4axC1avoSJe3BxurDPV7fiLfSDat0aWUoxFSpgX2bHmMAwqyML7cfLSKpSX6aDyaHVoX_XkFrOaWNB4xevucT4Ok-s0T7wlSGrpI_/s1600/Reinicializaci%25C3%25B3n.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="528" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnI_8rGw46-_BdQJxm9Z8iNXZFQ5K1XujeozBEoRG4axC1avoSJe3BxurDPV7fiLfSDat0aWUoxFSpgX2bHmMAwqyML7cfLSKpSX6aDyaHVoX_XkFrOaWNB4xevucT4Ok-s0T7wlSGrpI_/s640/Reinicializaci%25C3%25B3n.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Gráfico sacado del documento de Siemens "<a href="https://support.industry.siemens.com/cs/document/90885040/programming-guideline-for-s7-1200-1500?dti=0&dl=en&lc=es-WW">Programming Guideline for S7-1200/1500</a>"</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
Por razones de velocidad de acceso, en la gama S7-1500, los valores booleanos dentro de un DB optimizado ocupan un byte, lo cual no debería ser un problema puesto que el tamaño máximo de los bloques de datos es de hasta 16MBytes.</div>
<br />
<div style="text-align: justify;">
Siguiendo la filosofía de priorizar el direccionamiento simbólico, la memoria de marcas (M0.0, MW120 por ejemplo) tiende a desaparecer. En la documentación hacen mucho incapié en que es más rápido acceder a un DB global optimizado que al área de marcas y que ésta se mantiene únicamente por motivos de compatibilidad. Un efecto colateral es que no se debería utilizar el byte de ciclo (que se mapea al área de marcas), donde teníamos disponibles señales pulsantes a frecuencias fijas y que eran muy cómodas de utilizar. Siemens hace la recomendación de programar nuestros propios bits de ciclo pulsantes.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKhigQgp6UlXJxxtRNBci8qx28hC2pyeVSjez4bDiiCq84pxLa8sHOEk01tdko94x-kfnuHP80gLzpsSeqfCLI7EKRkoqpzGLPAcsto36u-uAI2HzskM1g_algJZ0pQUuXOvzl-dpinEtM/s1600/Pulsos.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKhigQgp6UlXJxxtRNBci8qx28hC2pyeVSjez4bDiiCq84pxLa8sHOEk01tdko94x-kfnuHP80gLzpsSeqfCLI7EKRkoqpzGLPAcsto36u-uAI2HzskM1g_algJZ0pQUuXOvzl-dpinEtM/s640/Pulsos.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Gráfico sacado del documento de Siemens "<a href="https://support.industry.siemens.com/cs/document/90885040/programming-guideline-for-s7-1200-1500?dti=0&dl=en&lc=es-WW">Programming Guideline for S7-1200/1500</a>"</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
El motivo por el cual acceder a un DB optimizado es más rápido que a un DB tradicional, o incluso al área de marcas, es debido al cambio de arquitectura de los PLC: se ha pasado de una arquitectura Big-Endian a una Little-Endian, con lo que en cada acceso a un DB tradicional o al área de marcas exige un reordenamiento de los bytes, cosa que no sucede con los DB optimizados ya que los bytes se ordenan tal y como los lee el microprocesador. </div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1tfPmovLmbmac8IrF4lSg1y82e7a7evVuYWQBPfLGEPKVknpq9ys-MGIPahgs-JDsxLIhf1JDYceay-Ra0Z6XJJyuBdf-nYiyq_q3leF1t2QJfn-_WDfBWkEOGiXKIuNn4VUlcvYdPFSM/s1600/Acceso.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="392" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1tfPmovLmbmac8IrF4lSg1y82e7a7evVuYWQBPfLGEPKVknpq9ys-MGIPahgs-JDsxLIhf1JDYceay-Ra0Z6XJJyuBdf-nYiyq_q3leF1t2QJfn-_WDfBWkEOGiXKIuNn4VUlcvYdPFSM/s640/Acceso.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Gráfico sacado del documento de Siemens "<a href="https://support.industry.siemens.com/cs/document/90885040/programming-guideline-for-s7-1200-1500?dti=0&dl=en&lc=es-WW">Programming Guideline for S7-1200/1500</a>"</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
Los nuevos PLC 1200/1500 soportan tipos de datos de 64 bits: LWord y LReal (en los 1500 además ULInt y LInt). Se puede trabajar con nuevos formatos de tiempos y fechas, así como cadenas de caracteres en UNICODE (WCHAR y WSTRING). El nuevo tipo VARIANT (que viene a sustituir al antiguo ANY) es un puntero que puede referirse a variables de diferentes tipos, y tiene control de tipos. Esto quiere decir que cuando copiemos datos a través de VARIANT se comprobará que tanto los datos de origen como los de destino sean del mismo tipo. Su uso solo debería estar justificado cuando usemos direccionamiento indirecto y no conozcamos de antemano el tipo de los datos.</div>
<br />
<div style="text-align: justify;">
Los bloques de programa (OB, FB, FC y DB) en TIA Portal son muy similares a los ya conocidos de versiones anteriores de Step7, aunque han ampliado su cantidad y sus capacidades. </div>
<br />
<div style="text-align: justify;">
Cuando empecé a programar en TIA Portal usando los temporizadores IEC, por cada temporizador se generaba un DB de instancia, lo cual no es un problema, pero queda "poco elegante" dejar colgados decenas o cientos de DB en el árbol de proyecto. Esto se puede solucionar usando multi-instancia, que básicamente consiste en que un DB contenga otros DB. Por ejemplo, yo creo mis temporizadores IEC en una función de bloque (FB) específica, y en su DB de intancia voy incluyendo como multi-instancias los DB de instancia de los temporizadores, con lo que en el árbol de proyecto solo tengo un DB. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otra característica en la que Siemens hace mucho incapié es la reutilización de código, de forma que el mismo código se pueda aprovechar para diferentes programas o usarlo varias veces en un mismo programa. Para ello se recomienda encapsular el código en funciones, usando la interfaz del bloque para el intercambio de datos y evitando el acceso a recursos globales dentro de las funciones. Esto realmente no es una novedad, ya se podía hacer en las versiones anteriores de Step7, si bien ahora se han potenciado las características para hacer este tipo de programación. </div>
<br />
<div style="text-align: justify;">
Y hasta aquí este resumen muy somero sobre las novedades que tenemos sobre la programación en TIA Portal y los nuevos PLC de Siemens. </div>
<br />
<div style="text-align: justify;">
Si bien es cierto que aún hay profesionales que se resisten a la implantación de TIA Portal y se mantienen firmes con el Step7 clásico, sólo es cuestión de tiempo que el TIA Portal se implante como una herramienta imprescidible, nos guste o no. Así que toca ponerse al día y para ello deberemos leer la documentación que Siemens tiene a nuestra disposición. </div>
<br />
<div style="text-align: justify;">
Como siempre, cualquier comentario será bienvenido.</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com4tag:blogger.com,1999:blog-226572436930860787.post-34328354713554544262014-02-01T18:21:00.000+01:002014-02-01T18:21:32.102+01:00Realizar un autotuning de los parámetros de un regulador con Simotion Scout<div style="text-align: justify;">
Para que un servomotor funcione correctamente y con la máxima eficiencia se debe realizar un ajuste de los parámetros del lazo de regulación. Para facilitar esta operación, el software de ingeniería <a href="http://www.automation.siemens.com/mcms/mc-systems/en/automation-systems/mc-system-simotion/motion-control-software/engineering-software/simotion-scout/pages/engineering-software-simotion-scout.aspx">Simotion Scout</a> (supongo que en <a href="http://www.industry.usa.siemens.com/drives/us/en/engineering-software/commissioning-tool-starter/Pages/commissioning-tool-starter.aspx">Starter</a> será similar) viene preparado para realizar un ajuste automático de estos parámetros, operación también llamada <i>autotuning</i>.</div>
<br />
<div style="text-align: justify;">
En esta entrada voy a detallar los pasos que he dado para realizar un <i>autotuning</i> en un motor controlado por un <a href="http://notasdeautomatizacion.blogspot.com.es/2013/04/primer-contacto-con-un-simotion-d435-2.html">Simotion D435</a>.</div>
<br />
<div style="text-align: justify;">
El primer paso será poner la máquina donde está instalado nuestro servomotor en orden de trabajo, puertas cerradas, setas de emergencia desenclavadas, barreras inmateriales libres y demás seguridades listas y rearmadas. En mi caso el servomotor está acoplado a un husillo, así que manejando la máquina desde el panel de operador (o el método de manejo que tenga) llevo el eje a la mitad de su recorrido, aproximadamente. Esto es necesario ya que durante el <i>autotuning</i> el servomotor va a dar varias vueltas y si lo dejamos cerca del límite de recorrido es posible que lo sobrepase. </div>
<a name='more'></a><div style="text-align: justify;">
Con la máquina en esta situación, vamos a la CPU y la pasamos a modo <b>STOP-U</b>. Para ello es necesario estar on-line con la CPU y sobre esta, con el botón derecho del ratón, vamos a <i>Target device -> Operating state... </i>y en la ventana que aparece seleccionamos <b>STOP-U</b>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8f5WETBIBSJp0cZCa3N8rV-KsfNVPhyg6semCpHm92Jg_zuyr7MLzl-qTnh0JhidhNJIQhd9OSroNf0hRC6bgGgwajjs-0pFGNCbfzNrEAtMbPgewMA1li0hq_2KLvRfGZEgzy-voRV-d/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8f5WETBIBSJp0cZCa3N8rV-KsfNVPhyg6semCpHm92Jg_zuyr7MLzl-qTnh0JhidhNJIQhd9OSroNf0hRC6bgGgwajjs-0pFGNCbfzNrEAtMbPgewMA1li0hq_2KLvRfGZEgzy-voRV-d/s1600/00.png" height="320" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Vamos ahora al árbol de proyecto y desplegamos <i>SINAMICS_Integrated -> Drives -> [Nombre de nuestra unidad de control] -> Commissioning</i> y pulsamos sobre <i>Automatic controller setting</i></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC4ZSwy119cYLVXMR_xeNtn2SZHL954dCyNIfV6e2fWLpAa9yK59MIBOFyE6dUs0nA2VfBPtpddqgrDGZWv04-L3390J0o3lnMphiSq1WeqoOOnndq6M97aJYwPlIJlT6_ZQaJH8-fv_Cv/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC4ZSwy119cYLVXMR_xeNtn2SZHL954dCyNIfV6e2fWLpAa9yK59MIBOFyE6dUs0nA2VfBPtpddqgrDGZWv04-L3390J0o3lnMphiSq1WeqoOOnndq6M97aJYwPlIJlT6_ZQaJH8-fv_Cv/s1600/01.png" /></a></div>
<br />
<br />
<div style="text-align: justify;">
En el área de trabajo se abrirá una ventana donde nos aparecen el tipo de controlador (velocidad o posición), la unidad de control seleccionada, la secuencia de ajuste del controlador, una guía con los pasos a seguir y un listado de los parámetros que actualmente están programados en nuestra unidad de control.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8EiLDpy08VkvD79_LSrEHjw9Bn76ud3bLqBKQbzMgBnGkwpCuvUF16v61fcwF4-MdaGrj1rXzHe7uJaava0HN8xWvvplxVUoHL3grWhFgeqOtTY_Ge4bE8frNQWQuNM0bxg4cVBdxvZv0/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8EiLDpy08VkvD79_LSrEHjw9Bn76ud3bLqBKQbzMgBnGkwpCuvUF16v61fcwF4-MdaGrj1rXzHe7uJaava0HN8xWvvplxVUoHL3grWhFgeqOtTY_Ge4bE8frNQWQuNM0bxg4cVBdxvZv0/s1600/02.png" height="468" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Pulsamos entonces sobre el botón <i>Assume control priority!</i> para tomar el control del eje desde el Simotion Scout. Si nos sale un mensaje de error y no nos deja realizar esta operación lo más probable es que hayan quedado algunas alarmas en la CPU sin acusar. Si este el el caso vamos a la pestaña inferior <i>Alarms</i> y pulsamos sobre <i>Acknowledge all</i>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7uCeGHqPKXmk5KOxjDUq8nL7nJVkekxOj8Ba8NufFa0m5IbOLgRfJ-xy_VZIeqsYX70KzolbuIk1k-qoq-hG-QY0Krr4VqZazXBSyKkvUkgCgCdRumuDUi0M9SMfq1WBcUwJWJwwa9M3n/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7uCeGHqPKXmk5KOxjDUq8nL7nJVkekxOj8Ba8NufFa0m5IbOLgRfJ-xy_VZIeqsYX70KzolbuIk1k-qoq-hG-QY0Krr4VqZazXBSyKkvUkgCgCdRumuDUi0M9SMfq1WBcUwJWJwwa9M3n/s1600/03.png" /></a></div>
<br />
<div style="text-align: justify;">
Antes de asumir el control nos saldrá una ventana advirtiéndonos de las consecuencias de seguridad. Aceptamos.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh3DxYTYkipdfQI0sN0ZSF6DTzrwiMlUQ_W4ZcFSwCwkMA9BsyrCElYoneo84-FVmf055ALs0U2d2ZdjD_qmZk3VlUh2qWRknilOvl2q7dgagpi-ITv5h1maP6DNBkCINrZf-X578xttT3/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh3DxYTYkipdfQI0sN0ZSF6DTzrwiMlUQ_W4ZcFSwCwkMA9BsyrCElYoneo84-FVmf055ALs0U2d2ZdjD_qmZk3VlUh2qWRknilOvl2q7dgagpi-ITv5h1maP6DNBkCINrZf-X578xttT3/s1600/04.png" /></a></div>
<br />
<div style="text-align: justify;">
Pulsamos el botón verde para activar la unidad de control, seleccionamos el modo de control que deseemos ajustar, en mi caso regulación en velocidad (<i>Speed controller</i>), e iniciamos el proceso con el botón <i>Perform all steps</i>.</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUOVq0ZUWsLE2WaUg97GmJKGN75YB-z-ZQC3MGOVFmLT6myzAkO9-KHOdkr6GqicDX9rJHqkqHM-F72Bh9XGrtyJnG3nsVVS3QY9EujwhLRA2J7DCy7Ev7bi5YmWd7xLx9tHYWisPZEiyI/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUOVq0ZUWsLE2WaUg97GmJKGN75YB-z-ZQC3MGOVFmLT6myzAkO9-KHOdkr6GqicDX9rJHqkqHM-F72Bh9XGrtyJnG3nsVVS3QY9EujwhLRA2J7DCy7Ev7bi5YmWd7xLx9tHYWisPZEiyI/s1600/05.png" /></a></div>
<br />
<div style="text-align: justify;">
El servomotor empezará a moverse para medir el sistema mecánico y realizar los ajustes necesarios. Durante este proceso el servomotor no girará más que un par de vueltas y seguramente emitirá un sonido desagradable, debido a las vibraciones. En el caso de que tengamos cargas suspendidas deberemos tener en cuenta que pueden desplomarse, así que deberemos previamente tomar las medidas de seguridad necesarias.</div>
<br />
<div style="text-align: justify;">
Finalizado el proceso se nos mostrarán en una tabla los valores antiguos y los recién calculados, debiendo aceptarlos para poder hacer uso de ellos.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWjrfptE8Rnv0k528uQCU9uUZr6PBbUucbgCpDvSNWZYjlLXXivJS58GEOfz2n7tVmepsMx6NSAcfOnJaGqwSkHuCqkIN3-r_VZAy0aYJXe7PGxdMVinS5Gt6j8HAfophaGwAOJLeLlGhq/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWjrfptE8Rnv0k528uQCU9uUZr6PBbUucbgCpDvSNWZYjlLXXivJS58GEOfz2n7tVmepsMx6NSAcfOnJaGqwSkHuCqkIN3-r_VZAy0aYJXe7PGxdMVinS5Gt6j8HAfophaGwAOJLeLlGhq/s1600/06.png" /></a></div>
<br />
<div style="text-align: justify;">
Ahora debemos desactivar la unidad de control (botón rojo) y devolver el control (<i>Give up control priority!</i>). Pasamos la CPU a modo <b>RUN</b> y procedemos a probar la máquina. De estar conformes con los nuevos parámetros debemos grabarlos para que no se pierdan al apagar, así que con el botón derecho sobre <i>SINAMICS_Integrated</i> hacemos un <i>Save RAM to ROM</i>. Y para guardar estos mismos parámetros en nuestro proyecto debemos hacer un <i>Upload</i> del <i>SINAMICS_Integrated</i> y finalmente <i>Save and compile</i> del proyecto entero. </div>
<br />
<br />
<div style="text-align: justify;">
Hace unos años, en un cursillo sobre Simotion al que asistí, un técnico de Siemens comentaba que el <i>autotuning</i> era una excelente herramienta y que solía dar buenos resultados, pero que los sistemas automáticos de cálculo de parámetros aún no alcanzaban la optimización que un ingeniero bien entrenado y con experiencia podía conseguir. Recuedo que se refirió a este trabajo como un "arte". En mi experiencia sé que despues de montar un servomotor y acoplarle su mecánica definitiva es imprescindible hacer un <i>autotuning</i>. Es más, después de tener el servomotor trabajando durante algún tiempo de, llamémoslo así, rodaje, es conveniente repetir este proceso, ya que la mecánica tiende a suavizarse y cambia el comportamiento del sistema. Cuando un servomotor tiene problemas para posicionarse, no lo hace con la precisión y rapidez exigidas o durante su funcionamiento vibra o chilla, entonces la primera medida de corrección a realizar es un <i>autotuning</i>.</div>
<div>
<br /></div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com6tag:blogger.com,1999:blog-226572436930860787.post-21397135073359588682013-04-20T19:45:00.000+02:002013-04-20T19:45:40.375+02:00Configuración de periferia distribuida por Profibus en un Simotion<div style="text-align: justify;">
En esta entrada voy a mostrar un ejemplo de cómo realizar la configuración de periferia distribuida en un sistema <a href="https://www.automation.siemens.com/mcms/automation/es/automation-systems/motion-control/Pages/Default.aspx">Simotion</a>. A uno de los puertos <a href="https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CEYQFjAA&url=http%3A%2F%2Fes.wikipedia.org%2Fwiki%2FProfibus&ei=vbdyUZTxEMqyhAecnYHgBw&usg=AFQjCNEXFb1TNH8om_JYgB0S-spxtwN9AA&sig2=jv2c7XLepDG7q_qaOtxBuQ&bvm=bv.45512109,d.ZG4">Profibus</a> de mi CPU D435-2 DP/PN voy a conectar una cabecera de 16 entradas digitales referencia <a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES71311BH010XB0&caller=view">6ES7 131-1BH01-0XB0</a>, es una referencia antigua pero ha funcionado perfectamente.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7dcwu4TNMDZpmCljz_lBlvAcbJOG-YC2DXgor81sGoyM2yPkf7WjaanjWDAAdyA-t8LTEBEv108J9hqTNLNRyEECu3i-3cMMhyphenhyphen3yqtGI1hbUENRjMYLPnCz_gpRZHLXeXNevglV3TlDOY/s1600/ET.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7dcwu4TNMDZpmCljz_lBlvAcbJOG-YC2DXgor81sGoyM2yPkf7WjaanjWDAAdyA-t8LTEBEv108J9hqTNLNRyEECu3i-3cMMhyphenhyphen3yqtGI1hbUENRjMYLPnCz_gpRZHLXeXNevglV3TlDOY/s1600/ET.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cabecera Profibus referencia 6ES7 131-1BH01-0XB0</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv9eLP2F0jeygp3Ul_jPEvAKPb7bHvtg26q45kMVQyg-qsUyvfJ5eF_HQauOcWzGJKjwM_ArMClmqrNYmBorryJ-2_MCYE2wVR8dSKYMzbaEJik7Yy0JvQhGnAyvGmqSTL6aI-HQymmAK4/s1600/Conjunto.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv9eLP2F0jeygp3Ul_jPEvAKPb7bHvtg26q45kMVQyg-qsUyvfJ5eF_HQauOcWzGJKjwM_ArMClmqrNYmBorryJ-2_MCYE2wVR8dSKYMzbaEJik7Yy0JvQhGnAyvGmqSTL6aI-HQymmAK4/s1600/Conjunto.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">El conjunto CPU + cabecera sobre mi mesa</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: justify;">
Empezaremos por abrir el proyecto y sobre la CPU, con el botón derecho del ratón, seleccionaremos <i>Open HW Configuration</i></div>
<div class="separator" style="clear: both; text-align: justify;">
<i><br /></i></div>
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsgTn7DveV4HvvyFjhwZtJW4wDB3yrKMPTRYOnNiQJ4_sEfAlFJ6hBh7kWNAhzyJD0JGE4vyzzVMXDAJINjBP006z73XhttQ39RYnyNRfuB1Ou1SVpFgrKY8-44GCfBdz4bAAqztQhPWSN/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsgTn7DveV4HvvyFjhwZtJW4wDB3yrKMPTRYOnNiQJ4_sEfAlFJ6hBh7kWNAhzyJD0JGE4vyzzVMXDAJINjBP006z73XhttQ39RYnyNRfuB1Ou1SVpFgrKY8-44GCfBdz4bAAqztQhPWSN/s1600/00.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Se abrirá entonces la herramienta de configuración hardware.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV98i9hui0qZ6s22cJqzi3bW2oAfGimRna2Dzu0h8JSw79QJC2Yw9y4zzbgfYrTQp0WVtZ8HtgIeGC6PbrHO4x5EudGAc1j2FP_DImxf6BcJthGwM5-0NeJFrk5zV42VKkiDFnlJhhGf8y/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="495" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV98i9hui0qZ6s22cJqzi3bW2oAfGimRna2Dzu0h8JSw79QJC2Yw9y4zzbgfYrTQp0WVtZ8HtgIeGC6PbrHO4x5EudGAc1j2FP_DImxf6BcJthGwM5-0NeJFrk5zV42VKkiDFnlJhhGf8y/s640/01.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Es la misma herramienta que existe en Step7 y, de hecho, haremos la configuración de la misma manera que si estuviéramos configurando la periferia en un S7-300. Si nos fijamos vemos que ya aparece una red Profibus configurada y resaltada en un llamativo color fucsia. Esta conexión Profibus es interna del Simotion y sirve para comunicar la CPU con el <i>Sinamics_integrated </i>que realiza el control de los ejes. Es una configuración cerrada y no deberemos modificarla.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Ahora voy a crear un nueva red Profibus en el conector <b>X136</b>, así que lo selecciono y hago doble clic sobre él para abrir la ventana de configuración del puerto.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf-CaS7UABQSAxN_s61Aw0FvNFgyY3ZhBykv_PqliFPMallIZ8XMuog8X69ygbcJe8V-SoM1TS_1G1c40ClYEBp_XLR84ewBBKJGAVwYx4U8vA-FgZ5dk1Y5A53mSmNH1SXuaPTFjjQaXh/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf-CaS7UABQSAxN_s61Aw0FvNFgyY3ZhBykv_PqliFPMallIZ8XMuog8X69ygbcJe8V-SoM1TS_1G1c40ClYEBp_XLR84ewBBKJGAVwYx4U8vA-FgZ5dk1Y5A53mSmNH1SXuaPTFjjQaXh/s1600/02.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
En <i>Interface </i>selecciono tipo <i>Profibus</i>, y pulso pobre el botón <i>Propiedades</i>...</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmDkACup_J4KjrEyVkQTDKIeOPRq3jkUFrjMydebWww46EN2Z4ZDwyn6NWkmAYGp1ula-vbUcru9GqGY01fprC1m9GMq6SX2bR_H5ERc-HJjb5H8DqpDNassc350C_z90AlC0i0jcd1ILw/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmDkACup_J4KjrEyVkQTDKIeOPRq3jkUFrjMydebWww46EN2Z4ZDwyn6NWkmAYGp1ula-vbUcru9GqGY01fprC1m9GMq6SX2bR_H5ERc-HJjb5H8DqpDNassc350C_z90AlC0i0jcd1ILw/s1600/03.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Dejo la dirección por defecto y pulso sobre el botón <i>Nueva...</i></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmoYJ2UnF5COngH3MN5gT8EpHud8oYK9KdTSLzx_kUXpE_Iubj8v7NfsZ7LrkPUIhCSdD4ZIXqVfWgmqlRdiwar9Bb7179_-MHAdc1KNwiSqh1jZ9FzbVCfA4RTB8MuBKeiLjnkD43SacJ/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmoYJ2UnF5COngH3MN5gT8EpHud8oYK9KdTSLzx_kUXpE_Iubj8v7NfsZ7LrkPUIhCSdD4ZIXqVfWgmqlRdiwar9Bb7179_-MHAdc1KNwiSqh1jZ9FzbVCfA4RTB8MuBKeiLjnkD43SacJ/s1600/04.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Le doy el nombre <b>PERIFERIA</b> a la red que estoy creando y pulso sobre la pestaña <i>Ajustes de la red</i>.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeVdrICpC7Dt6jCLyVQWBP0iEFcsu7z8m4EF_beAkdr3Gkvwtl3hKTsLdppaXEb7Ykrqrx4O6uci2nIX8WKJJY-G9QyK5St0_HYpO_7XAsC-f6yYMv7nnE6wYCXqGchwOYIopq7_stYrGc/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeVdrICpC7Dt6jCLyVQWBP0iEFcsu7z8m4EF_beAkdr3Gkvwtl3hKTsLdppaXEb7Ykrqrx4O6uci2nIX8WKJJY-G9QyK5St0_HYpO_7XAsC-f6yYMv7nnE6wYCXqGchwOYIopq7_stYrGc/s1600/05.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Aquí dejo los parámetros por defecto (velocidad de <b>1,5 Mbit/s</b> y perfil <b>DP</b>). Acepto.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA1IW8YwWzD7ULAa1ZdRh7kgOiDgPHpOP0nPolhqf_vCMgyLhz_8TUEYg8f6SJNv2KkGuSKgoC-elRTUxSasYn3lwczqxOMeyNFOSRei8y_R7SI41GTJqzk61goOkFUIdYZK7NKte2mSpS/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA1IW8YwWzD7ULAa1ZdRh7kgOiDgPHpOP0nPolhqf_vCMgyLhz_8TUEYg8f6SJNv2KkGuSKgoC-elRTUxSasYn3lwczqxOMeyNFOSRei8y_R7SI41GTJqzk61goOkFUIdYZK7NKte2mSpS/s1600/06.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Aceptamos nuevamente y ya tenemos nuestra red Profibus creada.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQL-UrMhaz3_x58ZVYfSUoeCbjg6GIUeNK_5EZ-4S0aJN68IZ2xuoB46jz_01LUpDyWms6j4fTsYrJXifxhk8uIDcoiYzonJlF-37qUqkREDkauSnoW1GWQ52C_sKtb4Fl4ZLjMfqFrbeI/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="495" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQL-UrMhaz3_x58ZVYfSUoeCbjg6GIUeNK_5EZ-4S0aJN68IZ2xuoB46jz_01LUpDyWms6j4fTsYrJXifxhk8uIDcoiYzonJlF-37qUqkREDkauSnoW1GWQ52C_sKtb4Fl4ZLjMfqFrbeI/s640/08.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: justify;">
El siguiente paso será buscar en el árbol de componentes de la derecha la referencia de mi cabecera Profibus. Una vez localizada la selecciono y arrastro sobre la red, quedando tal como sigue:</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir8zq-YCu5YsTud6wQv1gpiYeZElRv_Vx6_RU3NP7CKhTTq9tsu1Drtje9H6NsJ7Ku4Nc9icEC37mzC17WbJNIJ7d4eFV1D5hYoJZM7N5Fhsw_3y7c6hvBbRf_l5OM8zBUcdaChjvpLC-o/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir8zq-YCu5YsTud6wQv1gpiYeZElRv_Vx6_RU3NP7CKhTTq9tsu1Drtje9H6NsJ7Ku4Nc9icEC37mzC17WbJNIJ7d4eFV1D5hYoJZM7N5Fhsw_3y7c6hvBbRf_l5OM8zBUcdaChjvpLC-o/s640/10.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Esta cabecera consume dos bytes de entradas que, por defecto, asigna a las direcciones 0 y 1. Si queremos asignar direcciones personalizadas tenemos que hacer doble clic en parte inferior, sobre las direcciones.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPZGf4Z1gqgXnymBzyzxCNpWe0WxijMwIROoti5m7eT15ZQMfrbIHSiOTuRO50w-CCrWdRMqzeWD97WtF8MgveM_hepcjAmj9ZckUSA_gOUmJ2OUMUW8J1oqk4GMMGU7nZb8Gn93SwWtgE/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPZGf4Z1gqgXnymBzyzxCNpWe0WxijMwIROoti5m7eT15ZQMfrbIHSiOTuRO50w-CCrWdRMqzeWD97WtF8MgveM_hepcjAmj9ZckUSA_gOUmJ2OUMUW8J1oqk4GMMGU7nZb8Gn93SwWtgE/s1600/11.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Para este ejemplo le voy a asignar las direcciones 8 y 9. Acepto y la configuración está terminada, ya solo nos queda <i>Guardar y compilar</i>.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibBKQkRkl0zP2P9zS0b_KUSaeP-bUpc0vnmTE0jqM1EbpLbQWKIVU7r1A5U2RT8StQhIkE94Q_g1GYxH-7c9mjI9ghv3h3lkuxqw9EqShyTsQGA2eb7Q8UWv4SMi5P_0dU8dhZFIYJ6bA-/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibBKQkRkl0zP2P9zS0b_KUSaeP-bUpc0vnmTE0jqM1EbpLbQWKIVU7r1A5U2RT8StQhIkE94Q_g1GYxH-7c9mjI9ghv3h3lkuxqw9EqShyTsQGA2eb7Q8UWv4SMi5P_0dU8dhZFIYJ6bA-/s640/12.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Cerramos la configuración hardware y en el árbol de proyecto del Scout aparece la tarjeta que acabamos de configurar. Sin embargo, no todas las tarjetas configuradas tienen porque aparecer en el árbol de proyecto.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxFl5eeA5XP5qLnRLU4w3doZK8XLFnJ1KRYrq56gNHMHDFLR4DnDZmtpufryXQMPbWexNuDaNJbdQ6gLnSo1oQ91GyBLJB51OyCyGWh0dZ62MhNXVj239Vx8eFKR3RvCvhNmg8uMIMUupu/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxFl5eeA5XP5qLnRLU4w3doZK8XLFnJ1KRYrq56gNHMHDFLR4DnDZmtpufryXQMPbWexNuDaNJbdQ6gLnSo1oQ91GyBLJB51OyCyGWh0dZ62MhNXVj239Vx8eFKR3RvCvhNmg8uMIMUupu/s1600/13.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Si a estas alturas transferimos el proyecto, la luz del interfaz DP/MPI del frontal del Simotion ya debería lucir en verde, indicando que la comunicación Profibus es correcta.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRPnGFElezfuqAhH8RqQfqGbsSM5RisCD8wd8qXUWyHS0Y55LJCrqi9g8_cMCQ2TBmyBhqT1TprK7BfUkQ5t9i6DpFEpb_TbThuLkPVFTo1lgLcVyO7nHvYsZVKxfK_SY3wdcaE1l2DsBi/s1600/Frontal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRPnGFElezfuqAhH8RqQfqGbsSM5RisCD8wd8qXUWyHS0Y55LJCrqi9g8_cMCQ2TBmyBhqT1TprK7BfUkQ5t9i6DpFEpb_TbThuLkPVFTo1lgLcVyO7nHvYsZVKxfK_SY3wdcaE1l2DsBi/s1600/Frontal.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Para poder acceder a las entradas digitales de nuestra tarjeta Profibus tenemos que direccionarlas en nuestro proyecto. Seleccionamos el <i>ADDRESS LIST</i> en el árbol de proyecto y en la parte inferior vemos que todavía no hay nada configurado.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfU4KmwdVQYvdDQEyt3s-5zRFR7VKRXWIW97qr_Z6eTXg973cz1nsSmbIis7E1DTb-WBy5MyTOblF8TPyYGOF0Cj45pEb0MNsnuhqZMi_2T85GfRnnmuYqCWB-hNHEjZ9r06VcnVnJDqXX/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfU4KmwdVQYvdDQEyt3s-5zRFR7VKRXWIW97qr_Z6eTXg973cz1nsSmbIis7E1DTb-WBy5MyTOblF8TPyYGOF0Cj45pEb0MNsnuhqZMi_2T85GfRnnmuYqCWB-hNHEjZ9r06VcnVnJDqXX/s640/14.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Vamos a la primera línea vacía y asignamos un nombre a la primera entrada. En el apartado <i>I/O address</i> seleccionamos IN.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOpe7P-x5eFWNyHtyxXHkKfNiT7JRdPcQJaTn-PE1X35cWVyXsXcCNSDVno5Q62bpDVnXR90f-GZdJfSOjzubAQ8wTdZVvx_EYc6nH_t-LPKfrrGKkkwwkVfROJ7H7Uu_Hl4JH0Ap6IlT/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdOpe7P-x5eFWNyHtyxXHkKfNiT7JRdPcQJaTn-PE1X35cWVyXsXcCNSDVno5Q62bpDVnXR90f-GZdJfSOjzubAQ8wTdZVvx_EYc6nH_t-LPKfrrGKkkwwkVfROJ7H7Uu_Hl4JH0Ap6IlT/s1600/15.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Seleccionamos el formato BOOL en <i>Data type</i>.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEPN3c-2QTxEp-uHmcntmqhmWqCHcgM845rOEMwuG2pWg4-9KjeeHKMznI7msyKm8nlqEbmDU_4dQ2o_SzUZ3VHlcXQTV0eKjNXeMl-Wo1TIv4PAp8k-Osy6gu8T7vPAPoGpFyUN4UEXEQ/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEPN3c-2QTxEp-uHmcntmqhmWqCHcgM845rOEMwuG2pWg4-9KjeeHKMznI7msyKm8nlqEbmDU_4dQ2o_SzUZ3VHlcXQTV0eKjNXeMl-Wo1TIv4PAp8k-Osy6gu8T7vPAPoGpFyUN4UEXEQ/s1600/16.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Y ahora hay que hacer que apunte a la primera entrada de nuestra tarjeta, por lo que pulsamos sobre el botón de los puntos suspensivos bajo <i>Assignment.</i></div>
<div class="separator" style="clear: both; text-align: justify;">
<i><br /></i></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg-b26ZCaPtr44KGfhvXxQDMWO2fE4jWe1b8pZeBj8DT0EWcjuN-0qOzN7hxD-Lr0R27anjS4vAlNSwWB25tyB2cP9o7PYZPsKTYvxNfq8bEB5JHk397F-MIP38VJXDM3D4SnLKemzRq4c/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg-b26ZCaPtr44KGfhvXxQDMWO2fE4jWe1b8pZeBj8DT0EWcjuN-0qOzN7hxD-Lr0R27anjS4vAlNSwWB25tyB2cP9o7PYZPsKTYvxNfq8bEB5JHk397F-MIP38VJXDM3D4SnLKemzRq4c/s640/17.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<i><br /></i></div>
<div class="separator" style="clear: both; text-align: justify;">
En la ventana que aparece debemos configurar como <i>Free address input</i> la dirección <b>PI 8.0.</b></div>
<div class="separator" style="clear: both; text-align: justify;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgoER_1LBNXmvKYEpGML1E7jbU3NLNzbvRFUlSiSrmXBzkb3vnXH5lZ8y65Lsi7M9JYbmT8FOYrYp6cMF0wYR1HmetFwJx2LZz2bleU62PAayIEmtPuWIBqaz6xSljikavvJBcUzusulk/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgoER_1LBNXmvKYEpGML1E7jbU3NLNzbvRFUlSiSrmXBzkb3vnXH5lZ8y65Lsi7M9JYbmT8FOYrYp6cMF0wYR1HmetFwJx2LZz2bleU62PAayIEmtPuWIBqaz6xSljikavvJBcUzusulk/s1600/18.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: justify;">
Aceptamos y ya está nuestra primera entrada lista. Guardamos y compilamos y transferimos nuestro proyecto a la CPU. Estando on-line en el <i>Address list</i> podemos verificar el funcionamiento de la entrada.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUFhKzhTFXhWMYIgs3dcSEio-38VoTt0kcR7B6eQEDE6pZ-xuvjfVtcPSJAr2wPUTFHWEsh0nPZsd-TiQ9kWt62EkMw0JuwXyHT1UfbRUsT5vp1dSjDCE-S0XTNPr2QZT0-c5-CtfNnogJ/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUFhKzhTFXhWMYIgs3dcSEio-38VoTt0kcR7B6eQEDE6pZ-xuvjfVtcPSJAr2wPUTFHWEsh0nPZsd-TiQ9kWt62EkMw0JuwXyHT1UfbRUsT5vp1dSjDCE-S0XTNPr2QZT0-c5-CtfNnogJ/s1600/20.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Y hasta aquí este ejemplo. Cualquier comentario será bienvenido.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com5tag:blogger.com,1999:blog-226572436930860787.post-31802255244401386102013-04-13T12:47:00.000+02:002013-04-13T12:47:57.262+02:00Un vistazo al entorno de programación Simotion Scout - El árbol de proyecto<br />
<div style="text-align: justify;">
En la <a href="http://notasdeautomatizacion.blogspot.com.es/2013/04/primer-contacto-con-un-simotion-d435-2.html">entrada anterior</a> dejamos nuestra CPU D435-2 DP/PN con una configuración mínima. Ahora, antes de entrar a preparar ejes y realizar la programación, voy a hacer un repaso (no muy exhaustivo) del entorno Simotion Scout.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFg6Q3iC4hvXngP_pbNp6zBP6mFJBWZMe8ASWJr2UGntla5yCFZZmHB-PxMxNXKgiaMl0gBmkmtMk0uIS8ypF5g6OMU_HIMgkR4Tt715T-A0tD1HolJZXRz9pbNtpO4aWv3XeQb5uOhnT/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBFg6Q3iC4hvXngP_pbNp6zBP6mFJBWZMe8ASWJr2UGntla5yCFZZmHB-PxMxNXKgiaMl0gBmkmtMk0uIS8ypF5g6OMU_HIMgkR4Tt715T-A0tD1HolJZXRz9pbNtpO4aWv3XeQb5uOhnT/s640/00.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A la derecha está el árbol de proyecto (<i>Project navigator</i>) donde tendremos acceso a los diferentes componentes. Desplegando la <b>CPU D435</b> podemos ver en primer lugar el conector de entradas/salidas digitales <b>X142</b>. Haciendo doble clic sobre él podemos cambiar su direccionamiento:</div>
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyvCfWZ9WJMyHv_kXpil1g9oKimbIL9X4BB1pNrk8QInkypXUurmyUp-qPA45MF73Kehyphenhyphenu-Jg-Ll24Ntd6burpv6h0yGEuZJnz3fekbSXqUEXStc4J42ni4n2VO0Jibmu1_MznZmBUoAxQ/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyvCfWZ9WJMyHv_kXpil1g9oKimbIL9X4BB1pNrk8QInkypXUurmyUp-qPA45MF73Kehyphenhyphenu-Jg-Ll24Ntd6burpv6h0yGEuZJnz3fekbSXqUEXStc4J42ni4n2VO0Jibmu1_MznZmBUoAxQ/s1600/01.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
y en la pestaña <i>Canal 0-7</i> configuraremos el comportamiento de cada pin del conector como entrada, salida, entrada de medición o leva de salida, todo ello de manera muy visual.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlaNsf3t2XNIwJbZOV2pXqoLZATjyNCGzJobAXxidURaVb-c2FuTmMZq6f8HtNXrhqBqpNU3S09XmtM1F01OuiNm8iv7Ab7nImRejI3-r-QmPmtt9-8N88_PfDSGLmOkGY7MS2Brrxbhy7/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlaNsf3t2XNIwJbZOV2pXqoLZATjyNCGzJobAXxidURaVb-c2FuTmMZq6f8HtNXrhqBqpNU3S09XmtM1F01OuiNm8iv7Ab7nImRejI3-r-QmPmtt9-8N88_PfDSGLmOkGY7MS2Brrxbhy7/s1600/02.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La presencia de este tipo de conectores depende del modelo de CPU que tengamos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A continuación, en el árbol de proyecto, está el <b>Execution System</b>. Este es un componente de vital importancia, ya que aquí configuraremos la ejecución de las diferentes partes del programa.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe6C72_Bvet1nCN_T0w9XUdulTIYteEYnMmHVBFuy12P5ExOUH04-a1qzJQyLAOJ9oaORmrTQmDKxzVCo3Elo4qZGW6A946CDrI94ExdPBRgHEKUuldEFAm1pO3EDQlxVcgHqpqDL_cBuH/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe6C72_Bvet1nCN_T0w9XUdulTIYteEYnMmHVBFuy12P5ExOUH04-a1qzJQyLAOJ9oaORmrTQmDKxzVCo3Elo4qZGW6A946CDrI94ExdPBRgHEKUuldEFAm1pO3EDQlxVcgHqpqDL_cBuH/s1600/03.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Está dividido en una serie de tareas (<i>tasks</i>) a las cuales le asignaremos programas. Por ejemplo, a la tarea de arranque <i>StartupTask </i>le asignaremos los programas que tengan que ejecutarse cuando la CPU pase a modo <i>Run </i>(similar a lo que haríamos con el módulo de programación OB100 en Step7). Análogamente existe tambíén la tarea de apagado <i>ShutdownTask</i>. En la tarea <i>BackgroundTask </i>estarían los programas que se tengan que ejecutar cíclicamente y bajo la inspección del tiempo de ciclo, que en Simotion se denomina <i>Round Robin</i>. La <i>BackgroundTask </i>tiene la misma función que el OB1 de Step7.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Las situaciones de fallo en Simotion tienen sus propias tareas bajo <i>SystemInterruptTasks</i>, siendo equivalentes a los OB de fallo en Step7. También tenemos la opción de programar tareas que se ejecuten periódicamente, cada cierto tiempo configurable, o incluso controladas por eventos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Mención aparte requieren la <i>MotionTasks</i>, que son tareas especiales pensadas para realizar comandos de Motion Control, aunque podemos usarlas para lo que queramos. Una característica muy importante es que no están sometidas al control de tiempo de ciclo (puedes poner una espera hasta que termine un movimiento, sin miedo a que la CPU vaya a Stop). En mi modelo de CPU estoy limitado a 32 <i>MotionTasks </i>y para ejecutarlas, detenerlas y reiniciarlas existen comandos que deberemos programar en otras tareas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Siguiendo por el árbol de proyecto encontramos el <b>Address List</b>. Si hacemos doble clic sobre él, en la parte inferior se abrirá una pestaña donde podremos ver y configurar todas las entradas y salidas que necesitemos usar en nuestro proyecto.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAkupJenGn7U0Li_8oHJ31j-4woJ-WgybgOolHZNsB-_Hx6EqOfkB5Sg6afKfvkrS53LRU7QDaSSBxwavEF4545WKuHRAt2531WRw6W56REaNZ3jJ7tF1L5376CXPBJuArsBAzPXSDv6w5/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAkupJenGn7U0Li_8oHJ31j-4woJ-WgybgOolHZNsB-_Hx6EqOfkB5Sg6afKfvkrS53LRU7QDaSSBxwavEF4545WKuHRAt2531WRw6W56REaNZ3jJ7tF1L5376CXPBJuArsBAzPXSDv6w5/s640/04.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Configurar las entradas y salidas es muy sencillo. Si son entradas o salidas del propio Simotion la asignación es muy visual. Le damos un nombre y pulsando sobre los puntos suspensivos de la casilla <i>Assignment </i>aparecerá una ventana con las entradas / salidas disponibles. Seleccionamos la que nos interese y listo.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg84GgUWc846WweQip8wqFgQFAfGiXH4xE2-sq-y-NNj2V1Fd7AEg5hUsL3HELVJIDBvEvhFjkAuyNig9jrfWGHrVxVSHl9aY0iFmnNNjXJfMIAIHx1M-CqNZmrgTawopwAf_wh7hJyK6yo/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg84GgUWc846WweQip8wqFgQFAfGiXH4xE2-sq-y-NNj2V1Fd7AEg5hUsL3HELVJIDBvEvhFjkAuyNig9jrfWGHrVxVSHl9aY0iFmnNNjXJfMIAIHx1M-CqNZmrgTawopwAf_wh7hJyK6yo/s640/05.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el caso de entradas / salidas que no sean del sistema Simotion, por ejemplo, de periferia distribuida, tendremos que asignar la dirección de forma coherente con la que le hayamos asignado en la configuración hardware (seguramente una próxima entrada trate sobre esto).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Debajo de<b> Address List</b> está <b>Global Device Variables</b>, que si lo seleccionamos nos mostrará, también en la parte inferior, la lista de variables globales a todo el proyecto. Podemos crear las variables que deseemos aquí. Son de asignación dinámica sin que estén vinculadas a ninguna posición de memoria en particular.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOD30LmimrYCQyxgo9culECq_yiu-fyEUy72ookGL8aIAfbri004jdlLj0KrEp0dklJZGRJm0XqlG1F9kGmJeNYUTjOdCiQ9fkQjG4f-YsfHR-In846-vvlf6SUW9WczPFYcQkxvG_CSTv/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOD30LmimrYCQyxgo9culECq_yiu-fyEUy72ookGL8aIAfbri004jdlLj0KrEp0dklJZGRJm0XqlG1F9kGmJeNYUTjOdCiQ9fkQjG4f-YsfHR-In846-vvlf6SUW9WczPFYcQkxvG_CSTv/s640/06.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A continuación viene una serie de carpetas donde se configurarán los ejes, encoders, y otros componentes que necesitemos integrar en nuestro proyecto, pero esto mejor lo iré desgranando en siguientes entradas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La última de las carpetas, denominada <b>PROGRAM</b>, sirve para englobar todos los programas que necesitemos. Un programa en esta carpeta no tiene ningún efecto hasta que sea incluido en el <i>Execution System</i>. Esto es muy cómodo para tener varias versiones de un mismo programa y cambiar rápidamente entre ellos con solo intercambiarlos en su tarea correspondiente.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9vPgzQlTJG6ilJSQDPWMB6AmxoVuDhOyyCGYjbvIEUqNnu4qLZK7IJRTOPrrcFuwJFwU1h0ZcSCA4WgqFr-2EzURfQkRe-8qs-uxy8QhVrKUuygxrJLvxxsYQZRjc61NP0b8S9e4kKNWd/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9vPgzQlTJG6ilJSQDPWMB6AmxoVuDhOyyCGYjbvIEUqNnu4qLZK7IJRTOPrrcFuwJFwU1h0ZcSCA4WgqFr-2EzURfQkRe-8qs-uxy8QhVrKUuygxrJLvxxsYQZRjc61NP0b8S9e4kKNWd/s1600/07.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los programas se agrupan en unidades (<i>units</i>) que deben compartir el mismo lenguaje de programación. Podemos programar en ST (texto estructurado), LAD/FBF (equivalentes al KOP/FUP de Step7) y MCC, que es una forma de programación de bloques visual y es el lenguaje en el que es recomendable programar las secuencias de Motion Control. En cada unidad y programa se pueden declarar variables de ámbito local.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un componente que va a aparecer siempre en el árbol de proyecto es <b>Sinamics_Integrated</b>. Las CPU Simotion lleva internamente este componente, que será el encargado de atacar directamente los ejes de Motion Control.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4Oic-x2fE6SKhxnzTlEPeQDbLMsOv1VnvAoqj8PTtEMzsZsM0yBwBx9xa73ucoIuTht4uzctRWJ8bHQm-Ds-Yf2Kjwt41Wxk6BbiG45URg0eCIMEOFYw-9iWi8jFtPGvBeAeDUY64d8Vy/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4Oic-x2fE6SKhxnzTlEPeQDbLMsOv1VnvAoqj8PTtEMzsZsM0yBwBx9xa73ucoIuTht4uzctRWJ8bHQm-Ds-Yf2Kjwt41Wxk6BbiG45URg0eCIMEOFYw-9iWi8jFtPGvBeAeDUY64d8Vy/s320/08.png" width="236" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si necesitamos incluir bibliotecas para acceder a otros dispositivos, deberemos insertarlas en el apartado <b>Libraries</b>. Más adelante tengo pensado escribir una entrada sobre el control de un servomotor PosmoA y tendré que incluir aquí una biblioteca con las funciones de control.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por último solo nos queda la carpeta <b>Monitor</b>, que sirve para hacer tablas de inspección de variables, con una funcionalidad idéntica a las tablas de variables de Step7.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Y hasta aquí este rápido repaso por el árbol de proyecto. Seguramente me dejo cosas importantes en el tintero, pero espero ir completando conceptos en las siguientes entradas sobre Simotion.</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com1tag:blogger.com,1999:blog-226572436930860787.post-50118418121578920232013-04-11T20:26:00.000+02:002013-04-13T12:53:39.311+02:00Primer contacto con un Simotion D435-2 DP/PN<br />
<div style="text-align: justify;">
Estoy involucrado en el proyecto de una máquina que va a llevar como control un <a href="https://eb.automation.siemens.com/mall/en/WW/Catalog/Products/10168361">Simotion D435-2 DP/PN</a>. Aprovechando que me acaba de llegar la CPU voy a escribir una serie de entradas sobre como realizar su conexión, configuración y programación.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El manual de referencia que he consultado para la elaboración de esta entrada es el llamado <i>SIMOTION D4x5-2 Commissioning and Hardware Installation Manual,</i> disponible en formato PDF <a href="http://support.automation.siemens.com/WW/llisapi.dll/61189579?func=ll&objId=61189579&objAction=csView&ClusterID=51774873&nodeid0=16512438&lang=en&siteid=cseus&aktprim=0&extranet=standard&viewreg=WW&load=content&subtype=133300">aquí</a>. Para buscar más manuales sobre Simotion se puede seguir el siguiente <a href="http://support.automation.siemens.com/WW/llisapi.dll?func=ll&objid=35558847&nodeid0=10805436&load=treecontent&lang=en&siteid=cseus&aktprim=0&objaction=csview&extranet=standard&viewreg=WW#Kap. 1">enlace</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para realizar estas pruebas el único material que voy a necesitar es una fuente de 24VDC, la tarjeta Compact-Flash que trae el firmware y las licencias, un cable ethernet, y la propia CPU.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Coloco la CPU sobre mi mesa y le instalo en la parte inferior el ruidoso ventilador que viene en el mismo embalaje, sin el cual el Simotion dará error. Quito la tapa azul inferior y alojo la tarjeta Compact-Flash en su ranura. Levanto la carcasa y en el conector <b>X124</b> alimento a 24VDC. Finalmente conecto un cable ethernet entre la toma marcada con <b>PN/IE X127 P1</b> en el frontal de la CPU y mi portátil. Doy tensión a la fuente y ya tengo todo lo necesario para hacer mis pruebas. El conjunto tiene sobre mi mesa el siguiente aspecto:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWcDhLcQS3XMI_bqRzogQpOhYEmJZeRpyGHWDJj7kKDWU6w4q6LO9_-3Sk1zZpEyAhUHP1QISRfQZ7MSuAZw0oyDhRmxiNROZupwRihaAlGDudZCuBnP2qIXgumO77rN6xu4fcsMoQJbwt/s1600/Simotion+D435-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWcDhLcQS3XMI_bqRzogQpOhYEmJZeRpyGHWDJj7kKDWU6w4q6LO9_-3Sk1zZpEyAhUHP1QISRfQZ7MSuAZw0oyDhRmxiNROZupwRihaAlGDudZCuBnP2qIXgumO77rN6xu4fcsMoQJbwt/s400/Simotion+D435-2.jpg" width="298" /></a></div>
<br />
<div style="text-align: justify;">
Para programar esta CPU voy a utilizar el software de ingeniería <a href="http://www.automation.siemens.com/mcms/m2/en/automation-systems/mc-system-simotion/motion-control-software/engineering-software/simotion-scout/pages/engineering-software-simotion-scout.aspx">Simotion Scout V4.3.1.3</a> que tengo instalado en una máquina virtual bajo <a href="https://www.virtualbox.org/">VirtualBox</a>.</div>
<a name='more'></a><div style="text-align: justify;">
Lo primero será comprobar si tenemos conexión. Ejecutamos el Simotion Scout y pulsamos en el botón <i>Accesible nodes</i>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjitwjEHGQkEAQb0iYtLTAYeaD25ff6n2lLqqB1daKPNmXbl2o9fhHaBdPF4VUouH0FaqPtn2BicQGzInHFE3vkeBUO4jBYbJvPepdrarTO_vTVrkeHaQsOuVkZEUyzVQUcgKxlQc8ipNsj/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjitwjEHGQkEAQb0iYtLTAYeaD25ff6n2lLqqB1daKPNmXbl2o9fhHaBdPF4VUouH0FaqPtn2BicQGzInHFE3vkeBUO4jBYbJvPepdrarTO_vTVrkeHaQsOuVkZEUyzVQUcgKxlQc8ipNsj/s1600/00.png" /></a></div>
<br />
Se abrirá la herramienta para buscar nodos. En ella pulsamos sobre el botón <i>PG/PC...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjP2tcjSTBEc_a_YqjjguHhvfnm1GgaMJhqnohTfcKx5FPt2rWeJSvNUrX5kB_WrbmyIo29Q6WxHmMnsVX60mUaQomPC3VZ49gLb2qX0aDIzDkuS-cbNU0bWQNmMtXJYwk7jeZjcbmYw3A/s1600/00b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjP2tcjSTBEc_a_YqjjguHhvfnm1GgaMJhqnohTfcKx5FPt2rWeJSvNUrX5kB_WrbmyIo29Q6WxHmMnsVX60mUaQomPC3VZ49gLb2qX0aDIzDkuS-cbNU0bWQNmMtXJYwk7jeZjcbmYw3A/s640/00b.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Aquí seleccionaremos nuestro adaptador de red. En mi máquina virtual tengo configurado el modelo <i>Intel(R) PRO/1000 T Server</i>, que nunca me ha dado problemas. Pincho sobre él y acepto.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioYAujqmPpF3df-Z_Y30EoMh6wXI2f4Z7jc-HpIIaKkE-l82sFV9zjM8pExcHIYh3MjL9lzUQWolXNAwkll1Tc5qTFwAjvkW5Hu0r067rbXMSwYvccL_BohnPLHY1FJCHPEjqpXXzXNR4r/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioYAujqmPpF3df-Z_Y30EoMh6wXI2f4Z7jc-HpIIaKkE-l82sFV9zjM8pExcHIYh3MjL9lzUQWolXNAwkll1Tc5qTFwAjvkW5Hu0r067rbXMSwYvccL_BohnPLHY1FJCHPEjqpXXzXNR4r/s1600/01.png" /></a></div>
<br />
<div style="text-align: justify;">
Ahora pulso sobre el botón <i>Access point</i> y en la ventana de ajuste de punto de acceso marco la casilla <i>DEVICE (STARTER, SCOUT)</i> y pulso <i>OK</i>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTXmfKygWWdYY6-pXel9bQU5zY23upoCmRY51sw9atHP_dwnBM_aK6mmPw5ApEtQysbUKeDj-BCUfEgEPUDdkahES4kJqerHnAyvsNruO9Rn5OGt4IU1sYCLJTL0fBM4jm1oXh30UuAO28/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTXmfKygWWdYY6-pXel9bQU5zY23upoCmRY51sw9atHP_dwnBM_aK6mmPw5ApEtQysbUKeDj-BCUfEgEPUDdkahES4kJqerHnAyvsNruO9Rn5OGt4IU1sYCLJTL0fBM4jm1oXh30UuAO28/s1600/02.png" /></a></div>
<br />
Pulso sobre <i>Update</i> y se pondrá a buscar nodos en nuestra red...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilZLLfRVI3dwQSt8S7yQGmfMK0NVx-7-a_ElgtAS_cc8m8uOws8SYgkU6swSg3F_b05EVnlsHT46ft7ErnKQ4t-PtuL1-Z2ZFxH63F46N-l46z-3micE7iaf-wXQgE0IRx49CXd7fLWMEL/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilZLLfRVI3dwQSt8S7yQGmfMK0NVx-7-a_ElgtAS_cc8m8uOws8SYgkU6swSg3F_b05EVnlsHT46ft7ErnKQ4t-PtuL1-Z2ZFxH63F46N-l46z-3micE7iaf-wXQgE0IRx49CXd7fLWMEL/s1600/03.png" /></a></div>
<br />
Si todo va bien, al cabo de un rato aparecerá el D435-2 con la dirección IP de fábrica (<b>169.254.11.22</b>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2okkRfHed64orsmw1Ry9CmQ1gB45Xlo3FLD30ol3n1mVywxO1I8TJuniQTawojlWoiP_MqN3Q5IKQrWLM3B_RElgAU4xJhkn36gSbNwHdjnaC9QOVXr_eyyav9JkFTVQ8tYzH-Kp1-RfB/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2okkRfHed64orsmw1Ry9CmQ1gB45Xlo3FLD30ol3n1mVywxO1I8TJuniQTawojlWoiP_MqN3Q5IKQrWLM3B_RElgAU4xJhkn36gSbNwHdjnaC9QOVXr_eyyav9JkFTVQ8tYzH-Kp1-RfB/s640/04.png" width="640" /></a></div>
<br />
Si desplegamos el nodo podremos ver hasta que ficheros aparecen en la Compact-Flash.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjObPD13pyIqisv61ZbDiWYAllrevYOIhRmDyWM4vorFWYSwoIzYJdKzEwfKN-5zsTcELlnfrxsQVlkxX6YwDBQucNqL3zokK0PE5bGJnI4Kv7ShaTtxj4DzxSFuZNzrfLOluZjSGUsMWiY/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="436" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjObPD13pyIqisv61ZbDiWYAllrevYOIhRmDyWM4vorFWYSwoIzYJdKzEwfKN-5zsTcELlnfrxsQVlkxX6YwDBQucNqL3zokK0PE5bGJnI4Kv7ShaTtxj4DzxSFuZNzrfLOluZjSGUsMWiY/s640/05.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Llegados a este punto ya sabemos que nuestro sistema está en red y es accesible. Cerramos la ventana de nodos accesibles y pulsamos sobre el botón para crear un nuevo proyecto...</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijNMZcKH6vk5bjS3NDwrBkg5v2t3L_1HLg9SG-lnOuSVXqmt1tcFyr3IgfSSSTrGzpWE59KTE9gz4LqubxuMvm33NEeqrmafXHM0A2kzSRtxv3ol985VEJUYupLSSC3KCJTZoEolsHDvaK/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijNMZcKH6vk5bjS3NDwrBkg5v2t3L_1HLg9SG-lnOuSVXqmt1tcFyr3IgfSSSTrGzpWE59KTE9gz4LqubxuMvm33NEeqrmafXHM0A2kzSRtxv3ol985VEJUYupLSSC3KCJTZoEolsHDvaK/s1600/10.png" /></a></div>
<br />
Especificamos donde queremos guardarlo y le asignamos un nombre...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfk2BD5MRmY1tB8gvLIkAZHnO4dYgtgl_3QBiSrlypOqpepQjgYyhni4n0jYvhX1pD_Wi1uL-V8KnTWeoHQEK0pSLWBdkwQHbKV21sHeaXqI7MdGXUYX_GkNzgAaAmjz4WzOLHbbWkZoUs/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfk2BD5MRmY1tB8gvLIkAZHnO4dYgtgl_3QBiSrlypOqpepQjgYyhni4n0jYvhX1pD_Wi1uL-V8KnTWeoHQEK0pSLWBdkwQHbKV21sHeaXqI7MdGXUYX_GkNzgAaAmjz4WzOLHbbWkZoUs/s1600/11.png" /></a></div>
<br />
En el árbol del proyecto hacemos doble clic sobre <i>Insert SIMOTION device</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWWSI7-9Qt-1s5YfhMInjKUZp9QkC6IeFOvM6XJg76vDzvrgIrYteWtyW8KX1V0DA17ZxnFHZEvdF2ILzv1Qfp8hULLVii77DnrRzSujqkqASWEAr8nyLXBFjO74XM5r5m3C7eNCscT_hG/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWWSI7-9Qt-1s5YfhMInjKUZp9QkC6IeFOvM6XJg76vDzvrgIrYteWtyW8KX1V0DA17ZxnFHZEvdF2ILzv1Qfp8hULLVii77DnrRzSujqkqASWEAr8nyLXBFjO74XM5r5m3C7eNCscT_hG/s640/12.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Y seleccionamos el modelo correcto. También desmarcamos la casilla<i> Open HW Config</i> ya que no necesitaremos introducir tarjetas adicionales.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj09f1MnrL40pY_hTAqum7NMoi-RAWTcPvKQdUWGzogNlp5an6mzp8zoZ97-gK9ZOuCFBlLF7Fn_DVd_wNRQqJRX9KoWM4Z0c-FI7-CWnAB3YYmMTYkaIuPjp1uWEQ2Eion9AezJOED_sQe/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj09f1MnrL40pY_hTAqum7NMoi-RAWTcPvKQdUWGzogNlp5an6mzp8zoZ97-gK9ZOuCFBlLF7Fn_DVd_wNRQqJRX9KoWM4Z0c-FI7-CWnAB3YYmMTYkaIuPjp1uWEQ2Eion9AezJOED_sQe/s1600/13.png" /></a></div>
<br />
<div style="text-align: justify;">
A continuación nos pedirá crear un interface ethernet, lo cual no será necesario, así que simplemente aceptaremos.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7u-kyrc8nVnVlzrmlHPf5AwXHEGf6At3qVFR2wmJTkh5xIQhSHgMWD0GMwc-3_WiGyvInqbraZ2oBZi_IbW-FMInYwBG4aclGBtJDuvPMFeHMg7zBO9I2vfvKzvWevyCVuyjOweKP3oZJ/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7u-kyrc8nVnVlzrmlHPf5AwXHEGf6At3qVFR2wmJTkh5xIQhSHgMWD0GMwc-3_WiGyvInqbraZ2oBZi_IbW-FMInYwBG4aclGBtJDuvPMFeHMg7zBO9I2vfvKzvWevyCVuyjOweKP3oZJ/s1600/14.png" /></a></div>
<br />
<div style="text-align: justify;">
Lo siguiente que nos preguntará es por los interfaces de la CPU y de nuestro PC a través de los cuales realizaremos la programación. En la parte superior seleccionaré el conector <b>X127</b> del Simotion (el conector frontal, accesible sin levantar la carcasa) y debajo seleccionaré la tarjeta de red con la que realizamos las pruebas anteriores.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKQAnY3Hgru9FOCtcFmpzi93QKXFj_45k9a8FMlyVs7GQ626yoTj5m1VqMaQNC9eM8m9jfT-4FXe8aPBoZkaLpzGrRJ0uQSRiDbHfVA3zxWft-bZVmGQO5Vsw0iZM2UnP1nH7-HnTOlbUH/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKQAnY3Hgru9FOCtcFmpzi93QKXFj_45k9a8FMlyVs7GQ626yoTj5m1VqMaQNC9eM8m9jfT-4FXe8aPBoZkaLpzGrRJ0uQSRiDbHfVA3zxWft-bZVmGQO5Vsw0iZM2UnP1nH7-HnTOlbUH/s1600/16.png" /></a></div>
<br />
Debemos abrir ahora la herramienta de configuración de redes <i>NetPro</i>...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSKdO-cWY02mqGjlJV1EIq2npQI4xmcZfM16b5jycSXpHL-dh96hEhKFS3qCwvY5PUX-5DZvMTgV6EjM9B-Yqm8y0OBzNeX3ueNFOPsdodbfLfFaNwnwC5QpLiPFFe63TqUgkK5ipbEwDx/s1600/52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSKdO-cWY02mqGjlJV1EIq2npQI4xmcZfM16b5jycSXpHL-dh96hEhKFS3qCwvY5PUX-5DZvMTgV6EjM9B-Yqm8y0OBzNeX3ueNFOPsdodbfLfFaNwnwC5QpLiPFFe63TqUgkK5ipbEwDx/s1600/52.png" /></a></div>
<br />
<div style="text-align: justify;">
Vemos que en la configuración aparece nuestro ordenador como PG/PC. El enlace debe aparecer en amarillo, lo que significa que está habilitado el enrutado (<i>routing</i>). Hacemos doble clic sobre el cuadradito verde de la PG/PC.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bm0_V_cI0JjXAAgGx3IWWwf8Mp_Z66Nq9amDqrK69GGkSpZXMKm4H5HpyS3ymlvqqd3dY4aHoU2bTg3G1hB5yblqYQvkX-cl2lT3r5rak0BrVvjWs7wFNVoAukeywGpZFlIJEk2H5TTg/s1600/50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="530" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bm0_V_cI0JjXAAgGx3IWWwf8Mp_Z66Nq9amDqrK69GGkSpZXMKm4H5HpyS3ymlvqqd3dY4aHoU2bTg3G1hB5yblqYQvkX-cl2lT3r5rak0BrVvjWs7wFNVoAukeywGpZFlIJEk2H5TTg/s640/50.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Y aparecerán las propiedades del interfaz ethernet. Debemos asignarle una dirección coherente, así que le doy la anterior a la que viene en el Simotion: <b>169.254.11.21</b>, y la máscara la ajusto a <b>255.255.0.0</b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh969VZbcMNFsdJSNoSfl7PohBtY7HnYpOjbR_uhDuzXqjNloYZEyIvsKPQRJTOkzfWjIPGuk2krz0q-pHRPQKbm-awDXjrc81244yO2XCyoDSJHOW7rVrOj4jFnxNh_2hGNG_6CNe_tkDs/s1600/51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh969VZbcMNFsdJSNoSfl7PohBtY7HnYpOjbR_uhDuzXqjNloYZEyIvsKPQRJTOkzfWjIPGuk2krz0q-pHRPQKbm-awDXjrc81244yO2XCyoDSJHOW7rVrOj4jFnxNh_2hGNG_6CNe_tkDs/s1600/51.png" /></a></div>
<br />
<div style="text-align: justify;">
Guardamos y compilamos y ya tenemos la configuración necesaria para conectarnos al Simotion, así que pulsamos el botón <i>Connect to selected target devices</i> en el Scout.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt6c0_lBuzDMC6CHN3LGUo5DD-NZ8qJHQuSPB32RxBSUlGI8txNcZIiK-jSG3VxfwPXx9HV79VUzUX3aJ5HSWvmnrOWTDZEeUbqMzoKsP2SAwWVLttyVUaKH5zYCkHSn-P8C5enaLjP8OM/s1600/17b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt6c0_lBuzDMC6CHN3LGUo5DD-NZ8qJHQuSPB32RxBSUlGI8txNcZIiK-jSG3VxfwPXx9HV79VUzUX3aJ5HSWvmnrOWTDZEeUbqMzoKsP2SAwWVLttyVUaKH5zYCkHSn-P8C5enaLjP8OM/s1600/17b.png" /></a></div>
<br />
<div style="text-align: justify;">
Como la primera vez no hay dispositivos seleccionados, nos preguntará a qué nos queremos conectar. En este ejemplo será suficiente con el D435, ya que no tenemos ejes reales conectados al <i>SINAMICS_Integrated</i>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5o93bMFCOb5tnmCELU4-1mokO38AO8uMV-BIjEuwhQk0pcyKruZQpjLeMcv_ovx2BOSq80XvkSGKOTb31K_aQ3Fu-1wQL3YblDkWxjyMV_PmmKhpBFebdunPeEpX6hQmG0Hv1ElOy17Gn/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5o93bMFCOb5tnmCELU4-1mokO38AO8uMV-BIjEuwhQk0pcyKruZQpjLeMcv_ovx2BOSq80XvkSGKOTb31K_aQ3Fu-1wQL3YblDkWxjyMV_PmmKhpBFebdunPeEpX6hQmG0Hv1ElOy17Gn/s1600/18.png" /></a></div>
<br />
Y ya estamos conectados: en la barra inferior, marcado en amarillo está el mensaje <b>Online mode</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFc-NQ5SsmTY1YqPLOlsooPPp6swnDF-FcrkyKMEhHiRtJVqSZipZRbw6YUy0ShWQuymR5WFp6obQx-p6zJY6z4c0DDZ82NGmdAT7NC8kfq4_g6phAYfh8rZt_WhlHXBz10P6rWzZTqwFE/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFc-NQ5SsmTY1YqPLOlsooPPp6swnDF-FcrkyKMEhHiRtJVqSZipZRbw6YUy0ShWQuymR5WFp6obQx-p6zJY6z4c0DDZ82NGmdAT7NC8kfq4_g6phAYfh8rZt_WhlHXBz10P6rWzZTqwFE/s640/19.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Podemos probar ahora a cargar nuestro proyecto tal y como lo tenemos al Simotion, para ello pulsamos el botón <i>Load project to target system</i>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhix9urPyqXtwHaBfiTVJndiQB5wkmDmJqh_H1hW2ZxRT5UpO-WeT_8X_Sn-IidL97AN9l6gYfKjAClmdBp0RrUI4fvN-aJt3l0egq4sMjHlVda5uulyO41_uzWzXb9Wcn9zTjDJnYyYLmE/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhix9urPyqXtwHaBfiTVJndiQB5wkmDmJqh_H1hW2ZxRT5UpO-WeT_8X_Sn-IidL97AN9l6gYfKjAClmdBp0RrUI4fvN-aJt3l0egq4sMjHlVda5uulyO41_uzWzXb9Wcn9zTjDJnYyYLmE/s1600/20.png" /></a></div>
<br />
<div style="text-align: justify;">
Marcamos la casilla <i>After loading, copy RAM to ROM</i>, para que el proyecto no se pierda si apagamos el Simotion, y pulsamos <i>Yes</i>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZvrnv81h0Noz6o3-HdvuEAnZ3s045X0nmdnb7Va2bae8eCdM_-oWRm5SOcycpyPSKgMpMk_8HXTrcC3iuL-hM2n8btxivkm_VVqFhaefVxExW1c0hd22hZx2DNdfTDFkn1XmFVSKnsjYv/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZvrnv81h0Noz6o3-HdvuEAnZ3s045X0nmdnb7Va2bae8eCdM_-oWRm5SOcycpyPSKgMpMk_8HXTrcC3iuL-hM2n8btxivkm_VVqFhaefVxExW1c0hd22hZx2DNdfTDFkn1XmFVSKnsjYv/s1600/21.png" /></a></div>
<br />
<div style="text-align: justify;">
Tardará unos instantes y podremos comprobar que la descarga resulta satisfactoria viendo los mensajes de información en la pestaña inferior <i>Target system output</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Hasta aquí por hoy, en la <a href="http://notasdeautomatizacion.blogspot.com.es/2013/04/un-vistazo-al-entorno-de-programacion.html">siguiente entrada</a> haré un pequeño recorrido por el entorno de programación, explicando las herramientas necesarias para hacer un sencillo programa de ejemplo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Antes de terminar debo advertir que no soy un gurú en programación de sistemas Simotion, y aunque ya he programado varias máquinas bajo este sistema, simplemente conozco aquello que he tenido que aprender para realizar mi trabajo. Así que si tienes dudas de cierta complejidad seguramente no las sabré resolver sin dedicarle un tiempo del que, probablemente, no disponga.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aunque todo lo que publique estará probado en un Simotion real, estoy convencido de que cometeré errores e imprecisiones, por lo que las correcciones serán, como siempre, bienvenidas.</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com9tag:blogger.com,1999:blog-226572436930860787.post-30937176992755538072013-01-21T12:32:00.000+01:002013-01-21T13:05:18.212+01:00Una aplicación para importar tags de Step 7-Micro/WIN a WinCC FlexibleActualmente estoy implicado en automatizar una máquina en la que vamos a montar un <a href="http://es.wikipedia.org/wiki/Controlador_l%C3%B3gico_programable">PLC</a> <a href="http://www.swe.siemens.com/spain/web/es/industry/automatizacion/simatic/controladores/Pages/S7200.aspx">Siemens S7-200</a>, concretamente una <a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES7214-1AD23-0XB0&caller=view">CPU 224</a>, y como <a href="http://es.wikipedia.org/wiki/Interfaz_de_usuario">HMI</a> un panel también <a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6AV6641-0AA11-0AX0&caller=view">Siemens modelo OP73</a>.<br />
<br />
A diferencia de la gama S7-300, no es posible tener integrado en un mismo proyecto el programa del PLC y el programa de la pantalla, con lo que los tags (variables) que deben compartir se deben introducir manualmente. Para hacer esta tarea más sencilla, y aprovechando las opciones para importar tags que tiene el software de programación de paneles <a href="http://www.automation.siemens.com/mcms/human-machine-interface/en/visualization-software/wincc-flexible/pages/default.aspx">WinCC Flexible</a>, he hecho una sencilla aplicación en <a href="http://es.wikipedia.org/wiki/Visual_Basic">Visual Basic</a> que me permitirá copiar y pegar tags desde <a href="http://www.swe.siemens.com/spain/web/es/industry/automatizacion/simatic/software/steps7_s7200/Pages/STEP7MicroWinparaS7-200.aspx">Step 7-Micro/WIN</a> y guardarlos en un fichero en formato <a href="http://es.wikipedia.org/wiki/CSV">CSV</a> que aceptará sin problemas WinCC Flexible.<br />
<br />
Al ejecutar la aplicación veremos la siguiente ventana:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMy2GcxZfMwvraUQwTQZFAZTzphfezrg4V64XzUckPf9p1jI6tap2P2QWlBqPG_UaYgossAUn9jq8Z4JwrzqaIz9CcwJeeEx2orTMZohBfvTkWz3bOaVkdoYUg6a-Ds05eDhMd0ZDNcCTg/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMy2GcxZfMwvraUQwTQZFAZTzphfezrg4V64XzUckPf9p1jI6tap2P2QWlBqPG_UaYgossAUn9jq8Z4JwrzqaIz9CcwJeeEx2orTMZohBfvTkWz3bOaVkdoYUg6a-Ds05eDhMd0ZDNcCTg/s1600/00.png" /></a></div>
<br />
<a name='more'></a>Su uso es bastante sencillo. Lo primero que hay que hacer es copiar desde Step 7-Micro/WIN los tags que queramos exportar. Personalmente suelo agrupar los tags que necesitaré en el panel en una tabla de símbolos específica. Para probar la aplicación he creado la siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_WtHfSZQ0p9-IgshGZBXzn4hpbhosjqpu9Yn3b_B2GxZjwIXFkv1kzwftJkHQClFOmmEDGJx15wjvXlHcpih-kCJ0hkfXuPL3osm_Png_fAWmZ33oZ1EK9ds4mdNuWoLMjWcoWh0Xn04c/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_WtHfSZQ0p9-IgshGZBXzn4hpbhosjqpu9Yn3b_B2GxZjwIXFkv1kzwftJkHQClFOmmEDGJx15wjvXlHcpih-kCJ0hkfXuPL3osm_Png_fAWmZ33oZ1EK9ds4mdNuWoLMjWcoWh0Xn04c/s1600/01.png" /></a></div>
<br />
Localizadas la variables a exportar, las seleccionamos y copiamos al portapapeles:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHH1T8vZ6-3cyq1gYl9ixcOkJ9mkW815zmTbWRGKkxOfclkrxEt-ZBs2rJH420A0Iw5jv0kc_wqU9sToVbHDW7KVnkqDTvDsiQ75H5-7MkWyE3eGM0flmRKvwxN8wMwYs69-cjJF_tCDGB/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHH1T8vZ6-3cyq1gYl9ixcOkJ9mkW815zmTbWRGKkxOfclkrxEt-ZBs2rJH420A0Iw5jv0kc_wqU9sToVbHDW7KVnkqDTvDsiQ75H5-7MkWyE3eGM0flmRKvwxN8wMwYs69-cjJF_tCDGB/s640/02.png" width="640" /></a></div>
<br />
Ahora vamos a la aplicación inicial y pulsamos sobre el botón <i>Leer texto del portapapeles.</i><br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN0mRHTmB7I9Y0AHewQkT9gbJONDyph58lcxxDk24h_m8crskvr_NbHPwHQKCQ5lrDCRnchmeAYBZrTLlyOw9TxlCkt9xwX59nVdBf8Koh2Vrd4OiOBqVp3868kU7aq87KrMT-Xa1u4uEf/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN0mRHTmB7I9Y0AHewQkT9gbJONDyph58lcxxDk24h_m8crskvr_NbHPwHQKCQ5lrDCRnchmeAYBZrTLlyOw9TxlCkt9xwX59nVdBf8Koh2Vrd4OiOBqVp3868kU7aq87KrMT-Xa1u4uEf/s1600/03.png" /></a></div>
<br />
En la tabla deberán aparecer los tags que hemos copiado. El siguiente paso será especificar el nombre de la conexión entre el PLC y el panel que hayamos configurado en WinCC Flexible. Podemos verla en la opción <i>Conexiones</i>, en mi ejemplo tiene el nombre por defecto <b>Conexión_1</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLklHu06DC06lFMHBTi-Q8Fkr26-_r9LnsxIlLm2OJ6QB89omjzTna7Hoe2wUhaUDVwpdhomNpZLc7_x_gi93kj4gMbOD-9ucEWZZlLsoNpjM2ijMA-RnOMmcbSXcIoU_9fwdsPO7mvgX3/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLklHu06DC06lFMHBTi-Q8Fkr26-_r9LnsxIlLm2OJ6QB89omjzTna7Hoe2wUhaUDVwpdhomNpZLc7_x_gi93kj4gMbOD-9ucEWZZlLsoNpjM2ijMA-RnOMmcbSXcIoU_9fwdsPO7mvgX3/s640/04.png" width="640" /></a></div>
<br />
Pulsamos ahora sobre el botón <i>Generar fichero .CSV</i> y especificamos el directorio y el nombre del fichero.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbnOskQA0jl6SC06fmrqQ5mqivxGFazGaVTddjegS3JMTtWJjdwMqHuChxztJ4eRt3i0oT_ViSUFegNgc_RtXzVetiT6KoApKMByB5h79BcVs1ZBZ8Np2rJBbNRxHO_ZjL_B3-4w9JCBWo/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbnOskQA0jl6SC06fmrqQ5mqivxGFazGaVTddjegS3JMTtWJjdwMqHuChxztJ4eRt3i0oT_ViSUFegNgc_RtXzVetiT6KoApKMByB5h79BcVs1ZBZ8Np2rJBbNRxHO_ZjL_B3-4w9JCBWo/s1600/05.png" /></a></div>
<br />
Al pulsar <i>Guardar</i> tendremos un fichero parecido a este:<br />
<br />
<blockquote>
# Fichero generado para ser importado por WinCC Flexible<br />
# a partir de tags obtenidas de Step 7-Micro/Win<br />
# GR - http://notasdeautomatizacion.blogspot.com<br />
#Columna A: nombre de variable (obligatorio - sin apóstrofe)<br />
#Columna B: conexión (si está vacía, entonces interna)<br />
#Columna C: dirección (depende de la conexión básica)<br />
#Columna D: tipo de datos (depende de la conexión básica)<br />
#Columna E: longitud (necesaria si el tipo de datos es una secuencia de caracteres)<br />
#Columna F: cantidad de elementos de matriz<br />
#Columna G: modo de adquisición (1 = sobre demanda, 2 = uso cíclico (por defecto), 3 = cíclico continuo)<br />
#Columna H: ciclo de adquisición, p. ej. 1 s<br />
#Columna I: límite superior (coma flotante)<br />
#Columna J: límite superior adicional (coma flotante)<br />
#Columna K: límite inferior adicional (coma flotante)<br />
#Columna L: límite inferior (coma flotante)<br />
#Columna M: escala lineal (0 o falso 1 o verdadero)<br />
#Columna N: valor de la escala del PLC superior (coma flotante)<br />
#Columna O: valor de la escala del PLC inferior (coma flotante)<br />
#Columna P: valor de escala de la HMI superior (coma flotante)<br />
#Columna Q: valor de escala de la HMI inferior (coma flotante)<br />
#Columna R: valor inicial (el tipo depende del tipo de datos básico)<br />
#Columna S: ID de actualización<br />
#Columna T: comentario (máx. 500 caracteres)<br />
ENTRADA_20<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>E 2.0<span class="Apple-tab-span" style="white-space: pre;"> </span>Bool<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE ENTRADA<br />
SALIDA_31<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>A 3.1<span class="Apple-tab-span" style="white-space: pre;"> </span>Bool<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE SALIDA<br />
ENTERO_V<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>VW 4<span class="Apple-tab-span" style="white-space: pre;"> </span>Word<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE WORD<br />
OCTETO_V<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>VB 2<span class="Apple-tab-span" style="white-space: pre;"> </span>Byte<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE BYTE<br />
DOBLE_ENTERO_V<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>MD 0<span class="Apple-tab-span" style="white-space: pre;"> </span>DWord<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE DOBLE WORD<br />
MARCA_100<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>M 10.0<span class="Apple-tab-span" style="white-space: pre;"> </span>Bool<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE MARCA<br />
VARIABLE_00<span class="Apple-tab-span" style="white-space: pre;"> </span>Conexión_1<span class="Apple-tab-span" style="white-space: pre;"> </span>V 0.0<span class="Apple-tab-span" style="white-space: pre;"> </span>Bool<span class="Apple-tab-span" style="white-space: pre;"> </span>1<span class="Apple-tab-span" style="white-space: pre;"> </span>2<span class="Apple-tab-span" style="white-space: pre;"> </span>1 s<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>100<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>0<span class="Apple-tab-span" style="white-space: pre;"> </span>PRUEBA DE BIT</blockquote>
Solo nos queda importar este fichero en WinCC Flexible. Vamos al menú <i>Proyecto -> Importar/Exportar -> Importación CSV...</i><br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH_fiEuM-EHcO-SVm5FaumzvJYr6Z2wzxHCO_1YFuYhUisqxdDmtx_FMoG-cjbeIfcPEP8nRzt5xFtT3r7QHEQvCHRjZ94niMIihaphM8L08CH5ZNvy3cMOsY_2jLUDn0H6fPlJd8AuNLs/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH_fiEuM-EHcO-SVm5FaumzvJYr6Z2wzxHCO_1YFuYhUisqxdDmtx_FMoG-cjbeIfcPEP8nRzt5xFtT3r7QHEQvCHRjZ94niMIihaphM8L08CH5ZNvy3cMOsY_2jLUDn0H6fPlJd8AuNLs/s1600/06.png" /></a></div>
<br />
Dejamos marcada solo la opción de <i>Variables</i> y seleccionamos nuestro fichero.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIYYFw0SlTR2ZDzlckP_yc3-G7omt9LTVMLqSUTwq5RNX29gnoJCFh66uVzRaW4nDn-PgwYOTARZE3xA76zYX1KFtMaNJwNycmWwZ3uDfi72zRQc3NMbYlJ8rbfp5XzPluBLqgpIIdNMid/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIYYFw0SlTR2ZDzlckP_yc3-G7omt9LTVMLqSUTwq5RNX29gnoJCFh66uVzRaW4nDn-PgwYOTARZE3xA76zYX1KFtMaNJwNycmWwZ3uDfi72zRQc3NMbYlJ8rbfp5XzPluBLqgpIIdNMid/s1600/07.png" /></a></div>
<br />
Solo nos queda la dar la orden <i>Importar</i> y la operación se pondrá en marcha.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWVS6a0_QbhnwsINTpy-ong_oP8P2b3haa15YI5WQsJa090nlYRa5RkgxKqGbZoShbglpDq5AjFGMSZqgN4zgTfo0Dp87z97Dn-j62eu_loRvzPZWe5t0odPRpeO_3qvHDjab6LhjcDvhH/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWVS6a0_QbhnwsINTpy-ong_oP8P2b3haa15YI5WQsJa090nlYRa5RkgxKqGbZoShbglpDq5AjFGMSZqgN4zgTfo0Dp87z97Dn-j62eu_loRvzPZWe5t0odPRpeO_3qvHDjab6LhjcDvhH/s1600/08.png" /></a></div>
<br />
Y ya tendremos nuestras variables listas para ser usadas en WinCC Flexible.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygOb7nF4bgCAIoo2urj2AxYBzonhhTs05-9HmhjeoDBkwjRKe9bejv70oDPg610XFVndYbir-TIgrvc_ZJcQkwSwZZs5NNyBL3C3-HdcxLhePyWveB_mx-tIERHjNbAm_IN0qAKZLfI51/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygOb7nF4bgCAIoo2urj2AxYBzonhhTs05-9HmhjeoDBkwjRKe9bejv70oDPg610XFVndYbir-TIgrvc_ZJcQkwSwZZs5NNyBL3C3-HdcxLhePyWveB_mx-tIERHjNbAm_IN0qAKZLfI51/s640/09.png" width="640" /></a></div>
<br />
La aplicación la puedes descargar <a href="http://goo.gl/h1i8r">aquí</a>. Si quieres curiosear el código fuente también está disponible <a href="http://goo.gl/0OTeg">aquí</a>.<br />
<br />
Como la aplicación está programada con <a href="http://www.microsoft.com/visualstudio/eng/products/visual-studio-2010-express">Microsoft Visual Basic 2010 Express</a>, puede que tengas que instalar el <a href="http://www.microsoft.com/es-es/download/details.aspx?id=17851">Microsoft .NET Framework 4</a>.<br />
<br />
Me ha sorprendido que Step 7-Micro/WIN no incluya ninguna opción para exportar variables. Y, a pesar de ser una aplicación veterana, también me ha extrañado que nadie haya hecho una aplicación similar (o tal vez yo no la haya encontrado).<br />
<br />
Como siempre, cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com11tag:blogger.com,1999:blog-226572436930860787.post-61595796382867842742012-10-07T14:09:00.000+02:002012-10-07T17:39:00.614+02:00Comunicación entre un PLC Beckhoff BC8150 y un panel Pro-face GP4105En las <a href="http://notasdeautomatizacion.blogspot.com.es/2012/10/preparativos-para-programar-un-beckhoff.html">entradas anteriores</a> me preparé para la programación de un <a href="http://www.beckhoff.com/english.asp?bus_terminal/bc8000_bc8050_bc8100_bc8150.htm">PLC Beckhoff BC8150</a>. Al puerto serie de este PLC, haciendo la función de HMI, voy a conectar un panel táctil <a href="http://www.proface.es/product/hmi/gp4100/spec/gp4105g1d.html">Pro-Face GP4105</a>. En esta entrada voy a explicar los pasos que he dado para comunicar ambos dispositivos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaXoQP0R6IOsZo83kc4OqbLHpGdX6xCG4AO3gRPzNzYDS_x4MfVJfBuSbUlMs2M07dF2xnNNZwqNm8XA0K-SPKbIdH3xqkdSd_60zFqHKZQC4ArAiMwi1BcZ4X-ZUc5ClGm6QUIsRXq81Y/s1600/PLC-PANEL.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaXoQP0R6IOsZo83kc4OqbLHpGdX6xCG4AO3gRPzNzYDS_x4MfVJfBuSbUlMs2M07dF2xnNNZwqNm8XA0K-SPKbIdH3xqkdSd_60zFqHKZQC4ArAiMwi1BcZ4X-ZUc5ClGm6QUIsRXq81Y/s1600/PLC-PANEL.jpg" /></a></div>
<br />
El protocolo de comunicación que se va a utilizar es <a href="http://es.wikipedia.org/wiki/Modbus">Modbus RTU</a>. En el PLC simplemente hay que darle una dirección entre 40 y 59 en los interruptores rotatorios que tiene en el frontal (con una dirección superior a 40 el PLC se configura automáticamente en <i>Modbus RTU</i>).<br />
<br />
El cable de comunicación tendrá por un extremo un conector DB9 macho para el PLC y el otro lo embornaremos en el panel, con el siguiente conexionado:<br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBWD3gAFFE0S8nPmPs0udULuIAo4mXKb05kI-WOJEMrZoD4N0X3T4VP9lk1Er9ctWl9WrMnBaVZVb7R5Ki2QRcqgmopREyE4sFZm1IVs04pJgkB5VbjnpbbgWueb7BGHYpTXVlZQ7DQbQ-/s1600/100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBWD3gAFFE0S8nPmPs0udULuIAo4mXKb05kI-WOJEMrZoD4N0X3T4VP9lk1Er9ctWl9WrMnBaVZVb7R5Ki2QRcqgmopREyE4sFZm1IVs04pJgkB5VbjnpbbgWueb7BGHYpTXVlZQ7DQbQ-/s320/100.png" width="319" /></a></div>
<br />
Vamos ahora por el panel; no es primera vez que trabajo con esta gama de paneles, en <a href="http://notasdeautomatizacion.blogspot.com.es/2011/05/probando-un-panel-tactil-pro-face.html">esta entrada</a> probé el mismo panel pero con interfaz <i>Profibus</i>. Para programarlo se usa el software de <a href="http://www.pro-face.com/product/soft/gpproex/limited.html">Pro-Face GP-Pro EX Limited Edition</a>, que es gratuito. Se puede obtener en el <a href="http://www.pro-face.com/otasuke/download/trial/gpproex/trial.htm">portal de descargas de Pro-face</a> con un usuario y contraseña que te debe facilitar tu distribuidor. Si te registras en el portal, la versión que te bajarás es la <i>GP-Pro EX Trial</i>, que no permite transferir el programa al panel.<br />
<br />
Entonces ejecutamos el <i>GP-Pro EX Limited Edition</i> y le diremos que vamos a crear un proyecto nuevo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijbXVQB3vHz-7VLdljqC8HOKaaPb9G5gRCp34odMXU8mTe-9cgQK6xtvKPk8_-479KxSSk-wBRn8tklg6JtPjtSkpdsuscrNgAC_Ct1No1uwXftWeTr-Dqp1PXUBBYqeq3D_2Y4n6tJCq6/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijbXVQB3vHz-7VLdljqC8HOKaaPb9G5gRCp34odMXU8mTe-9cgQK6xtvKPk8_-479KxSSk-wBRn8tklg6JtPjtSkpdsuscrNgAC_Ct1No1uwXftWeTr-Dqp1PXUBBYqeq3D_2Y4n6tJCq6/s1600/10.png" /></a></div>
<br />
Aceptamos y seleccionamos el modelo de panel que tengamos, en mi caso el <i>GP4105</i>, y la orientación en la que lo vamos a instalar, siendo <i>Landscape </i>(horizontal) lo adecuado para mí.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUBtenr011kRrZLHw0dRXZu5K9J-hKLKKDNu5Qb0k9WyBln3rWxXg1yicrCwsSA60PQSyhniG2GVcK5PuSg0jVMZ6OWBBNrsnBiVEwuPublsjGbBWVeNX0BTBSb46FqTDJMhoT34YnmoJS/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUBtenr011kRrZLHw0dRXZu5K9J-hKLKKDNu5Qb0k9WyBln3rWxXg1yicrCwsSA60PQSyhniG2GVcK5PuSg0jVMZ6OWBBNrsnBiVEwuPublsjGbBWVeNX0BTBSb46FqTDJMhoT34YnmoJS/s1600/11.png" /></a></div>
<br />
Al pulsar <i>Next </i>nos preguntará por el protocolo de comunicación con el PLC. Entre la amplia gama de posibilidades seleccionaremos <i>Modbus-IDA</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxkef_B2PqLrH5_DFjSzRlcodqux_l1N6IBxR6pJtvDIWATb3Pd0FyqkMIJ_1CefbL2JFEyMPW37JfZ441m6SG61rI11UqADzL9ZyvHOA3WzCqbNaCzL5P1bH3IPVuGjP5ipwhiW3j4mEt/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxkef_B2PqLrH5_DFjSzRlcodqux_l1N6IBxR6pJtvDIWATb3Pd0FyqkMIJ_1CefbL2JFEyMPW37JfZ441m6SG61rI11UqADzL9ZyvHOA3WzCqbNaCzL5P1bH3IPVuGjP5ipwhiW3j4mEt/s1600/12.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisBY3lx6sYBlORkrd6CuDG3PcWVFHvl-UWYEO0UVPza60l73Bw2m_qYOGpaji-qTSzdGd1OOTXsH5jNksqlLyiU5sMMYn-StCWDtuJ59ezJzX3V-WvyQPbpYKlnFo2tuv7183PKGO5nUc_/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisBY3lx6sYBlORkrd6CuDG3PcWVFHvl-UWYEO0UVPza60l73Bw2m_qYOGpaji-qTSzdGd1OOTXsH5jNksqlLyiU5sMMYn-StCWDtuJ59ezJzX3V-WvyQPbpYKlnFo2tuv7183PKGO5nUc_/s1600/13.png" /></a></div>
<br />
Se creará a continuación el proyecto, visualizando la pantalla <i>System</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht52xYVck49cmhYuGpU-ktrDedQw9ANFkAAqpDq3ng3FxwnOWKfgaWg0B2eGv_zz6DUcIioovxgh95C-fbEtGad6FbTbn2jN3OrchjcUGyAwPrt57yBd9tYPmlKz3xvF4f4-bMHhhYnMqw/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht52xYVck49cmhYuGpU-ktrDedQw9ANFkAAqpDq3ng3FxwnOWKfgaWg0B2eGv_zz6DUcIioovxgh95C-fbEtGad6FbTbn2jN3OrchjcUGyAwPrt57yBd9tYPmlKz3xvF4f4-bMHhhYnMqw/s1600/14.png" /></a></div>
<br />
Pulsamos sobre el enlace <i>Device/PLC1</i> para entrar en los detalles de comunicación. Aquí simplemente deberemos cambiar la velocidad a <i>9600 </i>baudios<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdPU7kxizgFbSqLCGYQPwyiC1i5K5W8O-8Fm3-hl42s3aKJky2trf46hHzcGKbC47dVlN41OvIZSzuy5U4VvO_Az0mMe7py-6drKfheYslxXYpEqWySG0f0ZNA56qvNdxJE9-lxQ7FaZEW/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdPU7kxizgFbSqLCGYQPwyiC1i5K5W8O-8Fm3-hl42s3aKJky2trf46hHzcGKbC47dVlN41OvIZSzuy5U4VvO_Az0mMe7py-6drKfheYslxXYpEqWySG0f0ZNA56qvNdxJE9-lxQ7FaZEW/s1600/15.png" /></a></div>
<br />
y en la parte inferior, al lado de la casilla <i>PLC1</i> pulsamos en el pequeño botón que hay justo a la derecha (entre <i>Device Name</i> y <i>Settings</i>).<br />
<br />
Aparecerá una ventana donde deberemos especificar la dirección que hayamos ajustado en los interruptores rotativos del PLC, en mi caso la <i>40</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9Sld9OtvJyF9h-MZurKoSQYsBTi8Ka1D_ehelfNCO82LrNOS6uvJHChOA-bO3LrsWkQ_W7Y1uUz385kLWE26PTI_qB8w5UcI-30x-ELGyXr2WCLfygrUdCBKCa2s3Q1DPgmbaPhIlrUS/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9Sld9OtvJyF9h-MZurKoSQYsBTi8Ka1D_ehelfNCO82LrNOS6uvJHChOA-bO3LrsWkQ_W7Y1uUz385kLWE26PTI_qB8w5UcI-30x-ELGyXr2WCLfygrUdCBKCa2s3Q1DPgmbaPhIlrUS/s1600/16.png" /></a></div>
<br />
Y listo, la comunicación ya está lista. Bastará con conectar el cable serie al panel y al PLC, y alimentar el conjunto para que estos se entiendan perfectamente. El panel tendrá acceso al área de marcas (<i>flag area</i>) del PLC. Si nuestra comunicación involucra pocas variables podemos direccionarlas a mano. Por ejemplo, la dirección <b>%MX0.0</b> del PLC será la <b>416385.0</b> para el panel, estando mapeado el resto del área de marcas a continuación. Deberemos tener en cuenta que el área de marcas del PLC está direccionado en <i>bytes </i>y el panel, por defecto, direcciona en <i>words</i>.<br />
<br />
Pero introducir variables a mano en el programa del panel no es práctico. Para hacernos la vida más sencilla, <a href="http://www.infoplc.net/foro/member.php?3-David">David</a>, un entusiasta colaborador del fantástico portal de automatización <a href="http://infoplc.net/">infoPLC</a> ha programado una pequeña y útil aplicación que traduce del formato de exportación de <i>TwinCAT </i>a un formato aceptado por el <i>GP-Pro EX</i>. El enlace para descargar la aplicación la tienes en <a href="http://www.infoplc.net/foro/showthread.php?345-Comunicacion-Beckhoff-Proface-en-Modbus-Tcp">este hilo</a> del foro de infoPLC.<br />
<br />
El primer paso será crear las variables que queramos exportar al panel como variables globales en <i>TwinCAT</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh07rzpogKyZBdZVuZv17AHi-ycJyHkhCBVPnrzT38uksK2O0M3Ki2J-MnZbD0FG76wwAyOaT16rygcWKcl5KxghIusqtyfsWcXy3hfoZ3nTcFCe9a_oLiO4bRgULp7zzp1BepCmD3NtrBV/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh07rzpogKyZBdZVuZv17AHi-ycJyHkhCBVPnrzT38uksK2O0M3Ki2J-MnZbD0FG76wwAyOaT16rygcWKcl5KxghIusqtyfsWcXy3hfoZ3nTcFCe9a_oLiO4bRgULp7zzp1BepCmD3NtrBV/s1600/00.png" /></a></div>
<br />
Vamos entonces al menú <i>Proyecto -> Exportar...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJuzhIXPyxZgNJV3TaG8hFdFxusvhWVQZ2TRev55-Rg_5FOCjXY5DC62W5P-TwZw53Qw8ti479p5ORWDBOqn0a9skEmy3YZQq_5zcszkc9v7zERLc6xwYQfee7ZVig1XWpdgvhDxYOfDGJ/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJuzhIXPyxZgNJV3TaG8hFdFxusvhWVQZ2TRev55-Rg_5FOCjXY5DC62W5P-TwZw53Qw8ti479p5ORWDBOqn0a9skEmy3YZQq_5zcszkc9v7zERLc6xwYQfee7ZVig1XWpdgvhDxYOfDGJ/s1600/01.png" /></a></div>
<br />
Y seleccionamos las variables globales.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO-mIL4Ia1z-sClXQwv1mu6XeEluWm0pdXZpbYEkMch6NLFXbdYEcpjtCDVBnKvFZj2G6VqdTWMks9xpXKIJJfhsY-cYaNZCkatgNr6yVReuFZJOs-suMqZAMawkslEI1drHZVk9mQz1hB/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO-mIL4Ia1z-sClXQwv1mu6XeEluWm0pdXZpbYEkMch6NLFXbdYEcpjtCDVBnKvFZj2G6VqdTWMks9xpXKIJJfhsY-cYaNZCkatgNr6yVReuFZJOs-suMqZAMawkslEI1drHZVk9mQz1hB/s1600/02.png" /></a></div>
<br />
Y le damos el nombre de "<b>VARIABLES GLOBALES.EXP</b>".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglbD527qovbL4CGGrzlq2ZWsw0JYDB-EXh_N1AkRkkTkOeblrY_I20Wi6k95AwbKKDqGbmFILMz3uUVNF4k_B569KeuJz3goM-Pq2wLqY9G30ifBOsI3RKWxKlxVIFvuG1aZOMLgTWcX-R/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglbD527qovbL4CGGrzlq2ZWsw0JYDB-EXh_N1AkRkkTkOeblrY_I20Wi6k95AwbKKDqGbmFILMz3uUVNF4k_B569KeuJz3goM-Pq2wLqY9G30ifBOsI3RKWxKlxVIFvuG1aZOMLgTWcX-R/s1600/03.png" /></a></div>
<br />
El contenido del fichero tendrá un contenido como el siguiente:<br />
<br />
<blockquote class="tr_bq">
(* @NESTEDCOMMENTS := 'Yes' *)<br />
(* @GLOBAL_VARIABLE_LIST := 'Variables_globales' *)<br />
(* @PATH := '' *)<br />
(* @SYMFILEFLAGS := '2048' *)<br />
(* http://notasdeautomatizacion.blogspot.com *)<br />
VAR_GLOBAL<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Contador AT %MW0: INT;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Rearme AT %MX2.0: BOOL;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>En_Origen AT %MX2.1: BOOL;<br />
END_VAR<br />
(* @OBJECT_END := 'Variables_globales' *)<br />
(* @CONNECTIONS := Variables_globales<br />
FILENAME : ''<br />
FILETIME : 0<br />
EXPORT : 0<br />
NUMOFCONNECTIONS : 0<br />
*)</blockquote>
<br />
Ahora ejecutamos el programa de David y vamos al menú <i>Herramientas -> Generar variables globales</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinl9zsU3Cb2-CXinkZoCDkZPI0AhfhLRLopJZ_DBjZrnfvOOLVhfidd-twe6qG_DoBSIRiEQ2w2BVIBJ3gx99V9iEMwB00pcHjmTzj637oYxNCkjF-09VR-YjSn9NSNf_yI4Na2WdEEHFT/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinl9zsU3Cb2-CXinkZoCDkZPI0AhfhLRLopJZ_DBjZrnfvOOLVhfidd-twe6qG_DoBSIRiEQ2w2BVIBJ3gx99V9iEMwB00pcHjmTzj637oYxNCkjF-09VR-YjSn9NSNf_yI4Na2WdEEHFT/s1600/05.png" /></a></div>
<br />
A continuación pulsamos en el botón <i>Generar todas las variables</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMiUIELamnhwdn12Ks-jfupeLe0oLahYvWF9S1n-GsxECfLcvoA68nAp38sYxAp9YiNVdiJo1EUUj4vH-riaI2HM_SlqXcSLhnBXkz3BPgZDLZP7bEHfa9PKCgN8BUC2jOhdE13zW35L2W/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMiUIELamnhwdn12Ks-jfupeLe0oLahYvWF9S1n-GsxECfLcvoA68nAp38sYxAp9YiNVdiJo1EUUj4vH-riaI2HM_SlqXcSLhnBXkz3BPgZDLZP7bEHfa9PKCgN8BUC2jOhdE13zW35L2W/s1600/06.png" /></a></div>
<br />
Seleccionamos el directorio donde tengamos el fichero "<b>VARIABLES GLOBALES.EXP</b>" generado previamente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIuiGiJc79Yexm3O76gkZNKYk8PTMGQztBSa7DOMd0NtdZIvufNsP3b9wIWlT6RIhcLFm58FN6bOZN06BcEtOfZWhaWIBc5HLx1BkeQhbTET1DMOYquxp9JcaS-ltR7216Y5CW59_dKI-I/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIuiGiJc79Yexm3O76gkZNKYk8PTMGQztBSa7DOMd0NtdZIvufNsP3b9wIWlT6RIhcLFm58FN6bOZN06BcEtOfZWhaWIBc5HLx1BkeQhbTET1DMOYquxp9JcaS-ltR7216Y5CW59_dKI-I/s1600/07.png" /></a></div>
<br />
Y obtendremos un nuevo fichero llamado "<b>Variables GP.csv</b>", que está en un formato aceptado por el <i>GP-Pro EX</i>.<br />
<br />
<blockquote class="tr_bq">
GP-Pro EX<br />
"File Type","SymbolVariable"<br />
"File Version","1","0"<br />
"Name","Index","Type","Internal/External","Address","Keep","Comment"<br />
Contador,,WordAddress,PLC1,416385,,<br />
Rearme,,BitAddress,PLC1,"416386,0",,<br />
En_Origen,,BitAddress,PLC1,"416386,1",,</blockquote>
<br />
Volvemos ahora al <i>GP-Pro EX</i> y vamos al menú <i>Common Settings -> Symbol Variable</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7B7-j9v-aSNb7DqdfrP2222dKQoqzyIKJ6bkgzEjhx8LXqfnWZ2R0G0INpyT5-2Ig3PcIZywKWcoTZDedh08JlJcG3GxBYIlFYc2P-uMrRz30hOHe1ei5MiYv4HFlwQRMed7as11PDBDP/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7B7-j9v-aSNb7DqdfrP2222dKQoqzyIKJ6bkgzEjhx8LXqfnWZ2R0G0INpyT5-2Ig3PcIZywKWcoTZDedh08JlJcG3GxBYIlFYc2P-uMrRz30hOHe1ei5MiYv4HFlwQRMed7as11PDBDP/s1600/17.png" /></a></div>
<br />
Se abrirá la pantalla <i>Symbol</i>, donde deberemos pinchar en el enlace <i>Utility </i>en la parte derecha.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLO5nwD4tqR7CiMHlHy8wlaCXXhl46MpQz9nndqPmXIhZoGxGb-p-9tGx_pSr5ner5OYErjiDwlkpsf1yQKUdL18_p6RoZNfwmS5YAE36iv5T4PJwHgKlVjXIezUdlGW706W0zACRSvG0D/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLO5nwD4tqR7CiMHlHy8wlaCXXhl46MpQz9nndqPmXIhZoGxGb-p-9tGx_pSr5ner5OYErjiDwlkpsf1yQKUdL18_p6RoZNfwmS5YAE36iv5T4PJwHgKlVjXIezUdlGW706W0zACRSvG0D/s1600/18.png" /></a></div>
<br />
Y seleccionar <i>Import -> GP-Pro EX Format</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXcFkYtWpLIpj9rjs_zXL8XFLH7in0lUAWZ7U0s1g-eACtgvRJdDAB1kqFpDe-wFMBt6WYbCXeWAxqvkt6DzZQkfAYF-O6bvinqMNQrTd4H-VihIpSGkvyoBsDzMmyb-XxK97Uvzthkcqc/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXcFkYtWpLIpj9rjs_zXL8XFLH7in0lUAWZ7U0s1g-eACtgvRJdDAB1kqFpDe-wFMBt6WYbCXeWAxqvkt6DzZQkfAYF-O6bvinqMNQrTd4H-VihIpSGkvyoBsDzMmyb-XxK97Uvzthkcqc/s1600/19.png" /></a></div>
<br />
Y buscamos el fichero "<b>Variables GP.csv</b>"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbX5-Ys5eZjYfQ10qwf3V4TMQNvZ87DDc2bs5chaQv7O45tA0orGbD2G2oAkGVyQgGIIbTXRdxpIMuL8h0Orln4Tu2Ij5O3BW9Yyukpj3THzndkConUbDBAmMbHyDReI8VJxW3PYoYnMYc/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbX5-Ys5eZjYfQ10qwf3V4TMQNvZ87DDc2bs5chaQv7O45tA0orGbD2G2oAkGVyQgGIIbTXRdxpIMuL8h0Orln4Tu2Ij5O3BW9Yyukpj3THzndkConUbDBAmMbHyDReI8VJxW3PYoYnMYc/s1600/20.png" /></a></div>
<br />
Ya tenemos nuestras variables listas para ser usadas en el programa del panel.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrYt1jUKVQ8kMA0Kx-Pxnw8K1y_55X68NpH8zrMRQpEX2u4CiBXyjEnCTuu8firRJx2ZZpNXTcyvZfjMBuFXfoTH_auegPEACKQWnHdXr8pLBDX_a00NE53kOdBZLxhB5K768e0V0B1pZ3/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrYt1jUKVQ8kMA0Kx-Pxnw8K1y_55X68NpH8zrMRQpEX2u4CiBXyjEnCTuu8firRJx2ZZpNXTcyvZfjMBuFXfoTH_auegPEACKQWnHdXr8pLBDX_a00NE53kOdBZLxhB5K768e0V0B1pZ3/s1600/21.png" /></a></div>
<br />
Como conclusión puedo decir que comunicar un PLC Beckhoff BC8150 con un panel Pro-Face GP4105 es sencillo, rápido y fiable. Sin embargo existe un inconveniente. Debido a que los puertos serie de programación y de comunicación del PLC son internamente el mismo, no se puede estar en línea con el PLC y tener el panel enchufado simultáneamente. Es más, como el protocolo de comunicación difiere entre el modo de programación y el modo del panel, deberemos cambiar la configuración de los interruptores rotatorios cada vez que queramos cambiar de un modo a otro, lo cual es bastante engorroso.<br />
<br />
En descargo diré que el comercial de Beckhoff me advirtió de esta situación y, a decir verdad, me arrepiento de no haber elegido el PLC y el panel con puertos ethernet. El ahorro de precio no compensa la pérdida de comodidad al programar.<br />
<br />
Como siempre, cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com0tag:blogger.com,1999:blog-226572436930860787.post-38537651771978526942012-10-04T09:22:00.000+02:002012-10-05T18:02:00.376+02:00Mapeado de entradas/salidas y configuración para un PLC Beckhoff 8150En la <a href="http://notasdeautomatizacion.blogspot.com.es/2012/10/preparativos-para-programar-un-beckhoff.html">entrada anterior</a> preparé la comunicación con el PLC y, partiendo de ahí, voy a realizar el mapeado de entradas/salidas y la configuración del PLC para dejarlo listo para empezar a programar.<br />
<br />
NOTA: La versión de TwinCAT que estoy utilizando es la 2.11.2220<br />
<br />
El primer paso será ejecutar el <i>TwinCAT PLC Control</i> y generar un nuevo proyecto.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmzX4sXPPwRNvw4QVYqRaQWZT0YKyjZNwwIz5OmwnKEOq6fLhLnm93Z79C4j9kDQBRU1qgI2tjMccqVHYvb0fwLNxYsesB2ezOwt1JqUVuDXxFOK1Y7ArJ94eOW-SYIJ43wUxxqN7OF-Ic/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmzX4sXPPwRNvw4QVYqRaQWZT0YKyjZNwwIz5OmwnKEOq6fLhLnm93Z79C4j9kDQBRU1qgI2tjMccqVHYvb0fwLNxYsesB2ezOwt1JqUVuDXxFOK1Y7ArJ94eOW-SYIJ43wUxxqN7OF-Ic/s1600/00.png" /></a></div>
<br />
Nos pedirá el tipo de comunicación con el PLC y, según la tenemos configurada, deberemos marcar <i>BCxx50 or BX a través de AMS</i>.<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX8V67SN6vMZawDJaOYGUiCHtqn5EU2oFwfEs5CGMaHbd9qrucc81SkZ4rX59fw9SZPg9qknGuObQKRkqd4dbcxBjrKCFdCQqo1yLkPVmx-3U3YjTTrMfWCI9xWdxebY9b-U4lHWv5Yljp/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX8V67SN6vMZawDJaOYGUiCHtqn5EU2oFwfEs5CGMaHbd9qrucc81SkZ4rX59fw9SZPg9qknGuObQKRkqd4dbcxBjrKCFdCQqo1yLkPVmx-3U3YjTTrMfWCI9xWdxebY9b-U4lHWv5Yljp/s1600/01.png" /></a></div>
<br />
El PLC necesita un módulo principal, que será el que se ejecute automáticamente en cada ciclo de scan del PLC. En la siguiente pantalla le daremos un nombre y el lenguaje en el que deseamos programarlo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY-rdGiBX2kUGEM2GWdbJK3aRj_1FZSVTXB-sM3Oo5jrfiofy94JxF6DhS1dTSjJy0FqGnfUG12HThseXRmZhwvbM2pMa4dO5jbVSHXzEX1SCirwumShINZJw5Ys2lZK6HX3C2o8GE0c90/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY-rdGiBX2kUGEM2GWdbJK3aRj_1FZSVTXB-sM3Oo5jrfiofy94JxF6DhS1dTSjJy0FqGnfUG12HThseXRmZhwvbM2pMa4dO5jbVSHXzEX1SCirwumShINZJw5Ys2lZK6HX3C2o8GE0c90/s1600/02.png" /></a></div>
<br />
Ya tenemos el módulo principal, sin ningún contenido, creado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpV4dJxz8kFbbT0s3LCf0vPpvvPu_Oyian8ow6VfuDurtoxQQb70B98iV2oeGPXKxTysbp7vGnpQHoSl6AhR6K8rPJF3qoHD5O2lIVgvqzKhNHcmjAmX5qNlLMiwQ_bKhqwoVawWPwSfrs/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpV4dJxz8kFbbT0s3LCf0vPpvvPu_Oyian8ow6VfuDurtoxQQb70B98iV2oeGPXKxTysbp7vGnpQHoSl6AhR6K8rPJF3qoHD5O2lIVgvqzKhNHcmjAmX5qNlLMiwQ_bKhqwoVawWPwSfrs/s1600/03.png" /></a></div>
<br />
Ahora hay que seleccionar el PLC al que será transferido nuestro programa, para ello vamos al menú <i>En línea</i> y pinchamos sobre <i>Selección del sistema de destino...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEion8E5YoKo7FltSGTLyanHCRyjsU6NDkj6As-N83K8H-vwiE6xicS4AN76tETiOBmD9PriC0ifDFXIFsOmQU5-Ar3F6JtwxkoTAAkX07Hix_CIS-G4bMgAvmOuCCYzm6iKt2g4PQszwzGj/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEion8E5YoKo7FltSGTLyanHCRyjsU6NDkj6As-N83K8H-vwiE6xicS4AN76tETiOBmD9PriC0ifDFXIFsOmQU5-Ar3F6JtwxkoTAAkX07Hix_CIS-G4bMgAvmOuCCYzm6iKt2g4PQszwzGj/s1600/04.png" /></a></div>
<br />
En la ventana que nos aparece deberemos seleccionar el <i>Run-Time</i> de nuestro PLC BC8150 y pulsar <i>OK</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRkxFY4dX6R7_Eu6lIv7WvQob1R2rp2lB-GnmlMF-ME7Ufv5KlRcunUKEqmTuW6jtVGUQQMIOM874q4U3Qwo-7xMfC27cRiG32j8incdRA8pByo2Z6wHsIY-FQImUFwSr9KYfN0cPIgXsk/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRkxFY4dX6R7_Eu6lIv7WvQob1R2rp2lB-GnmlMF-ME7Ufv5KlRcunUKEqmTuW6jtVGUQQMIOM874q4U3Qwo-7xMfC27cRiG32j8incdRA8pByo2Z6wHsIY-FQImUFwSr9KYfN0cPIgXsk/s1600/05.png" /></a></div>
<br />
Lo siguiente que voy a hacer será el mapeado de entradas y salidas de las tarjetas que tengo conectadas a mi PLC y esta es la parte que menos me gusta de todo el proceso. Aunque en la <a href="http://notasdeautomatizacion.blogspot.com.es/2012/10/preparativos-para-programar-un-beckhoff.html">entrada anterior</a>, desde el <i>TwinCAT System Manager</i>, pudimos obtener automáticamente la lista de las tarjetas conectadas, no podemos importarlas al <i>TwinCAT PLC Control</i>. La solución consiste en preparar manualmente un proyecto en el <i>TwinCAT System Manager</i> y exportar la configuración del direccionamiento de las tarjetas. El proceso es idéntico al que explico en <a href="http://notasdeautomatizacion.blogspot.com.es/2009/08/mapeado-de-entradassalidas-en-un-plc.html">esta entrada sobre un PLC Beckhoff BC3100</a>, así que no lo repito aquí, obteniendo un fichero de exportación en formato ".exp".<br />
<br />
Para incorporar este fichero a nuestro proyecto vamos al menú <i>Proyecto </i>y pinchamos sobre <i>Importar...</i><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_qqCHc7kfamo0CSK1Fr131jMo3gAXWUKvpHTmzpbSKMyhRTYXFXOFngNlbQzzS69APnLRAvhoav_x3NQyZcrl5QBL2gXmMGl5wTRPKIu7aQEJEn9L4kWRxVx4sL7wMPMXuDu9FuiEwtyR/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_qqCHc7kfamo0CSK1Fr131jMo3gAXWUKvpHTmzpbSKMyhRTYXFXOFngNlbQzzS69APnLRAvhoav_x3NQyZcrl5QBL2gXmMGl5wTRPKIu7aQEJEn9L4kWRxVx4sL7wMPMXuDu9FuiEwtyR/s1600/06.png" /></a></div>
<br />
Abrimos el fichero de exportación generado previamente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIDZ1VWv9AgaT1QcXhFNwkaGKjlJ9ic3iWCVThOt4tSjnI0rczjopZxBz7J-d9wtbMpHHZ1yBTPxjPL8b9NrVgLQV8azYMt_nlJbAWn-l3eChEmKvgS5_oQH-wLpHClVNmunR4nMbSVgXR/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIDZ1VWv9AgaT1QcXhFNwkaGKjlJ9ic3iWCVThOt4tSjnI0rczjopZxBz7J-d9wtbMpHHZ1yBTPxjPL8b9NrVgLQV8azYMt_nlJbAWn-l3eChEmKvgS5_oQH-wLpHClVNmunR4nMbSVgXR/s1600/07.png" /></a></div>
<br />
Y en la pestaña <i>Recursos </i>del <i>TwinCAT PLC Control</i>, bajo <i>Variables globales</i>, aparecerá la sección <i>TwinCAT_Import</i>, en la que estarán declaradas todas las variables de entrada/salida asociadas a las tarjetas con un nombre referido a la tarjeta, su dirección y tipo de dato.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiT_heLPhFnNx1LXEU2O6JJglM-K2Ac6oyhLPoFS2P-SJ-mj97A-lJBq40YRNZ8cUG72Fgxi9XoQ_MRyGQioKnVvHMm8gUOD7UmqkcXEl1F3d-mrk0llxe0T3SVY9cxYqBs7CNp0xsqQYS/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiT_heLPhFnNx1LXEU2O6JJglM-K2Ac6oyhLPoFS2P-SJ-mj97A-lJBq40YRNZ8cUG72Fgxi9XoQ_MRyGQioKnVvHMm8gUOD7UmqkcXEl1F3d-mrk0llxe0T3SVY9cxYqBs7CNp0xsqQYS/s1600/08.png" /></a></div>
<br />
En este punto conviene guardar el proyecto y darle un nombre.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhuddLOxiT4YCgvvZjqCzz_zA0Rjtm1fm7o1QHqSUHV2F9LCB53xXbkbn1U9Yz38OPVeQldnlTduC_WCNjEMndPBLL1KGBWOKPG1hyphenhyphenbBS_CvQ6GIrOZXvm7nvsWChFChqQH8RgNUAM-lC4/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhuddLOxiT4YCgvvZjqCzz_zA0Rjtm1fm7o1QHqSUHV2F9LCB53xXbkbn1U9Yz38OPVeQldnlTduC_WCNjEMndPBLL1KGBWOKPG1hyphenhyphenbBS_CvQ6GIrOZXvm7nvsWChFChqQH8RgNUAM-lC4/s1600/09.png" /></a></div>
<br />
Si intentásemos compilar el proyecto nos saldría un error, debido a que no hemos introducido ninguna instrucción en el módulo principal. Así que aprovechando que ya tengo el mapeado de entradas/salidas realizado, voy a hacer algo tan sencillo como escribir en la primera salida digital el estado de la primera entrada digital.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGAkhRhbMSu0EET3idtGndmOjezYCjighFbafWO9SXRv80MqZ0Kw_93Dfd_qkIcMgs-RxZicrRdBSz8_d6roYWat9XEFkKAL7-XUXel5UY6aZKZ9DOhTNcBBYCRg7PvrCo9E76IiFO4iKH/s1600/09b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGAkhRhbMSu0EET3idtGndmOjezYCjighFbafWO9SXRv80MqZ0Kw_93Dfd_qkIcMgs-RxZicrRdBSz8_d6roYWat9XEFkKAL7-XUXel5UY6aZKZ9DOhTNcBBYCRg7PvrCo9E76IiFO4iKH/s1600/09b.png" /></a></div>
<br />
Ya estamos en condiciones de compilar nuestro proyecto, así que vamos al menú <i>Proyecto </i>y pinchamos sobre <i>Compilar todo</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGcI33nf-2xlsPgivvdTxTdQnLjRw_8vZnYYIjRlnH5Ox0chIRUHD0Z0F4yHtjWF7HIwjCUDFYMhO20F-Kdo6v7VVRY244NR4ywfmthwM-nMcqZ4MqHbBbqEndy0zr9wAfr2yQKs7_esdW/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGcI33nf-2xlsPgivvdTxTdQnLjRw_8vZnYYIjRlnH5Ox0chIRUHD0Z0F4yHtjWF7HIwjCUDFYMhO20F-Kdo6v7VVRY244NR4ywfmthwM-nMcqZ4MqHbBbqEndy0zr9wAfr2yQKs7_esdW/s1600/10.png" /></a></div>
<br />
Si vamos a la carpeta donde estamos guardando nuestro proyecto veremos que se han generado unos ficheros adicionales.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3HVpWloog_MI71x8rXCB6OPzrTXY-HmcQ4VMeCyg1siKo8WnXNsM_Nh-LA_RjDJqyfbH85T2cxUN8bg4s_38obCKoS9V5zAccAHcdxNwKZpd1WnOYqLViwqTkMX1lLGqwX1959j5A8oZ/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM3HVpWloog_MI71x8rXCB6OPzrTXY-HmcQ4VMeCyg1siKo8WnXNsM_Nh-LA_RjDJqyfbH85T2cxUN8bg4s_38obCKoS9V5zAccAHcdxNwKZpd1WnOYqLViwqTkMX1lLGqwX1959j5A8oZ/s1600/11.png" /></a></div>
<br />
Vamos ahora a necesitar el <i>TwinCAT System Manager</i>, en el que, tal y como hicimos en la entrada anterior, tenemos autodetectadas las tarjetas de entradas y salidas. Vamos sobre <i>PLC - Configuración</i> y con el botón derecho seleccionamos<i> Agregar a proyecto PLC...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXF3kXDMqdK_OFYrV7b1o5SVxQO61fliDkDP0pPZOjXowWfpX7QGa2gq64W50iUoV0ukmAIA-FqiofDyI21WcBjpELtjl4YlUCYUYBCRsPA7fP3ZbABcdFrKrc4uAaWF7LAp717vccttMn/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXF3kXDMqdK_OFYrV7b1o5SVxQO61fliDkDP0pPZOjXowWfpX7QGa2gq64W50iUoV0ukmAIA-FqiofDyI21WcBjpELtjl4YlUCYUYBCRsPA7fP3ZbABcdFrKrc4uAaWF7LAp717vccttMn/s1600/12.png" /></a></div>
<br />
Buscamos el fichero ".tpy" que hemos generado al compilar el proyecto.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGNOrKV6n_T0nNpS557SRALVDi7X_A4hwyGTsTrWxJasxaDkvk94ZqtYJsY8CGqQ5Jct2m6ZeSIBr62YOC04zRdgna4X73GN2LLhZ_ZCkWDf8m-qDvM5Y8HL-U0CEHW18Jhg4Lho2ig1JR/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGNOrKV6n_T0nNpS557SRALVDi7X_A4hwyGTsTrWxJasxaDkvk94ZqtYJsY8CGqQ5Jct2m6ZeSIBr62YOC04zRdgna4X73GN2LLhZ_ZCkWDf8m-qDvM5Y8HL-U0CEHW18Jhg4Lho2ig1JR/s1600/13.png" /></a></div>
<br />
Y todas las entradas y salidas que teníamos declaradas en el programa PLC aparecerán en la configuración.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMRzeBMcdi4cMFn8dYRBzIEUhMrCc6KO1cZSQdISb954Y3fGWHZnwOS4M9xI_7IduquLaiCK8e-VT4G0_FDB-0mGMt6OVdq-hmpmq3NQtbieJ1rOOq37vaAs_cp2yL-GS37b9NwMX2WbRO/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMRzeBMcdi4cMFn8dYRBzIEUhMrCc6KO1cZSQdISb954Y3fGWHZnwOS4M9xI_7IduquLaiCK8e-VT4G0_FDB-0mGMt6OVdq-hmpmq3NQtbieJ1rOOq37vaAs_cp2yL-GS37b9NwMX2WbRO/s1600/14.png" /></a></div>
<br />
Pero estas entradas y salidas no están vinculadas a ninguna entrada física. Para vincularlas seleccionamos una que nos interese, por ejemplo mi primera entrada analógica, y con el botón derecho pinchamos en <i>Cambiar vínculo...</i><br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJK7bi1W2F0wB_KmznllnGup2CbvKcv3xF3MrSMMLJ8PyRAqQtre55PWR1QEML2yodCtsfhyphenhyphenb2YoMY2iYNzRXezpXDTUbuPXu8TFrlZpGOe_c0rwLnDkHevX1HCHz3Eu4WmIyoe2dS4G4/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJK7bi1W2F0wB_KmznllnGup2CbvKcv3xF3MrSMMLJ8PyRAqQtre55PWR1QEML2yodCtsfhyphenhyphenb2YoMY2iYNzRXezpXDTUbuPXu8TFrlZpGOe_c0rwLnDkHevX1HCHz3Eu4WmIyoe2dS4G4/s1600/15.png" /></a></div>
<br />
A continuación nos aparecerá una ventana donde deberemos seleccionar el dato de la tarjeta que queremos vincular a la entrada, en mi ejemplo el primer canal de la tarjeta de entradas analógicas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs74gYnpM5bQKz38DqVF_UxYJgBbSbbUv4PkjvXaAAei3juOc5F4qn58FN8J99-N5mBx9MlKynGf180vcGGdG1KosRWFLxouyd00pmkRLiyfWEQ8PmYOaytHzL76vslkJ2c3EUfq1BhEdb/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs74gYnpM5bQKz38DqVF_UxYJgBbSbbUv4PkjvXaAAei3juOc5F4qn58FN8J99-N5mBx9MlKynGf180vcGGdG1KosRWFLxouyd00pmkRLiyfWEQ8PmYOaytHzL76vslkJ2c3EUfq1BhEdb/s1600/16.png" /></a></div>
<br />
Al aceptar podemos comprobar que nuestra variable está vinculada correctamente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEqXPSmQC8PoTuJ3tnZzE4dS1Dh4bBJUOSsgQ7Ktrrixbb4Lyr9Urtool72_aesskMQEsHUqcfheZsIekU7ZKLGEiqB8vwVExRNa6v1VMdLA46s16R3K3q3fM46A6fa7bKI1zsWRGpxt-5/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEqXPSmQC8PoTuJ3tnZzE4dS1Dh4bBJUOSsgQ7Ktrrixbb4Lyr9Urtool72_aesskMQEsHUqcfheZsIekU7ZKLGEiqB8vwVExRNa6v1VMdLA46s16R3K3q3fM46A6fa7bKI1zsWRGpxt-5/s1600/17.png" /></a></div>
<br />
Vincular las entradas y salidas una por una puede ser un trabajo muy pesado, por suerte podemos vincular series de variables consecutivas a la vez. Por ejemplo, voy a seleccionar las 16 entradas digitales que voy a direccionar en el terminal 2.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMnDCUjPZ5YQhyphenhyphen5kUtjvKhPU1ykZvyUq6kWMVDepDjizSjHsHTA69kx5g5l6Zvo6ThFwKlr7yiwSCG9y_5V8hHakweXJNEnoO6-vMtDMNBYNaTQOC1UhWKqgI2wJieo538W791GHojPRGR/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMnDCUjPZ5YQhyphenhyphen5kUtjvKhPU1ykZvyUq6kWMVDepDjizSjHsHTA69kx5g5l6Zvo6ThFwKlr7yiwSCG9y_5V8hHakweXJNEnoO6-vMtDMNBYNaTQOC1UhWKqgI2wJieo538W791GHojPRGR/s1600/18.png" /></a></div>
<br />
Y con el botón derecho sobre ellas pincho en <i>Cambiar vínculo múltiple...</i><br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibptZ4GF4YywHdVVdPzV1Ri_APoU18orGxDv46w_Sli1kqq-zu6iSIbOa88VVpPQ4-ozIblCMKTylnoMge1iiDUtbjo27PTtxPQZbZfV43XxJ7_jQKIBwbeUZA_qoy_uoRRWqdA0ZA-Xir/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibptZ4GF4YywHdVVdPzV1Ri_APoU18orGxDv46w_Sli1kqq-zu6iSIbOa88VVpPQ4-ozIblCMKTylnoMge1iiDUtbjo27PTtxPQZbZfV43XxJ7_jQKIBwbeUZA_qoy_uoRRWqdA0ZA-Xir/s1600/19.png" /></a></div>
<br />
Y en la ventana que me aparece selecciono asimismo los canales correspondientes en el terminal (si no aparecen marcar la casilla <i>Todos los tipos</i>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmfUC_krhGFwE8rB2L8Ad77edNB02gMbiq3PgyGTOV55RtW2tSPflLqNXCCjbtdd-E5CnxlJ7ow6G2IjcAdp-wsNbZZcX6yqPw2UfVxFwk2Se1X2PdhmcLlJbmFrwx7UbZkvZlp2Cjm_k/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmfUC_krhGFwE8rB2L8Ad77edNB02gMbiq3PgyGTOV55RtW2tSPflLqNXCCjbtdd-E5CnxlJ7ow6G2IjcAdp-wsNbZZcX6yqPw2UfVxFwk2Se1X2PdhmcLlJbmFrwx7UbZkvZlp2Cjm_k/s1600/20.png" /></a></div>
<br />
Y al aceptar se habrán vinculado de golpe las 16 entradas digitales.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN2N9VwvCe_3Xm0nJ9HyrooWn1SZHmws8E6VeYbbj1z5IrIuKdgiruuqr-pGcsR5MnUU4B65n7jydY4CpuOeoBXEfgKBsRPwbYXivztvDD5YxKqeAeZAaCBgyojfa6_P2ZTvFq-TOk1gYq/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN2N9VwvCe_3Xm0nJ9HyrooWn1SZHmws8E6VeYbbj1z5IrIuKdgiruuqr-pGcsR5MnUU4B65n7jydY4CpuOeoBXEfgKBsRPwbYXivztvDD5YxKqeAeZAaCBgyojfa6_P2ZTvFq-TOk1gYq/s1600/21.png" /></a></div>
<br />
Terminamos de vincular todas las entradas y salidas que tengamos y ya solo nos queda transferir la configuración al PLC. Para ello pulsamos en el botón<i> Activa la configuración</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGG3i_AqGsIKjTQ4v_OGUxiz36f31s4Jg-rDS0Z_TVmwC6KIWyL-jJppic3SusIQGbRYOEsJIMJcVbysVEClJZ1uqlOe5MRDYFDqMsMMTYA2Pd64cFMxKM7Msf3jckeShDDfF5BwrDZ1r7/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGG3i_AqGsIKjTQ4v_OGUxiz36f31s4Jg-rDS0Z_TVmwC6KIWyL-jJppic3SusIQGbRYOEsJIMJcVbysVEClJZ1uqlOe5MRDYFDqMsMMTYA2Pd64cFMxKM7Msf3jckeShDDfF5BwrDZ1r7/s1600/22.png" /></a></div>
<br />
Aceptamos en la ventana de confirmación.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsClhY9ZXVi0D1YcH3a9dyhiNZ5mb_2jr4Ztgl7sw6XOC1IGoSN7akGToJNLh6f9x_1yVjHuU-SBzUnuMkuuFKGIc0mErFHgWcb-pCK62QjFCtvUmivrvMgy-qi7vJIYfabfpKjWfeAFu9/s1600/23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsClhY9ZXVi0D1YcH3a9dyhiNZ5mb_2jr4Ztgl7sw6XOC1IGoSN7akGToJNLh6f9x_1yVjHuU-SBzUnuMkuuFKGIc0mErFHgWcb-pCK62QjFCtvUmivrvMgy-qi7vJIYfabfpKjWfeAFu9/s1600/23.png" /></a></div>
<br />
<br />
Y aceptamos también al requerimiento de rearrancar el sistema TwinCAT en modo <i>Run</i>.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLN3iBic98O82UHMWtjSpE_5GDEnOEVmCV_419pp2C8nVnhBBiTh-u-Y-R4sWCbT7tZsqvDql2THMcghch0VT7Q8cJ5IEncgTkpE_o7LcShdR93ZZdmPGxQ_FnAGXnoFIypwISYzJbzRVu/s1600/24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLN3iBic98O82UHMWtjSpE_5GDEnOEVmCV_419pp2C8nVnhBBiTh-u-Y-R4sWCbT7tZsqvDql2THMcghch0VT7Q8cJ5IEncgTkpE_o7LcShdR93ZZdmPGxQ_FnAGXnoFIypwISYzJbzRVu/s1600/24.png" /></a></div>
<br />
La configuración ya está transferida.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggmPQ1vDWe674DfDL5OO0THVzUF5yCyfEL8DqUyYBsJFfnqUR6w8Z87iD-exhyvfjNs3DnLbCkaB1pyu57e0HYHU8yKTrqWgrO1zuuq0zBO0jFI4Kppr2fcndYJV-MhDOsjiJdkMQjl1oJ/s1600/25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggmPQ1vDWe674DfDL5OO0THVzUF5yCyfEL8DqUyYBsJFfnqUR6w8Z87iD-exhyvfjNs3DnLbCkaB1pyu57e0HYHU8yKTrqWgrO1zuuq0zBO0jFI4Kppr2fcndYJV-MhDOsjiJdkMQjl1oJ/s1600/25.png" /></a></div>
<br />
Guardamos la configuración, cerramos en <i>TwinCAT System Manager</i> y volvemos al <i>TwinCAT PLC Control</i>, en el cual vamos a ponernos en línea con el PLC. Para ello vamos al menú <i>En línea</i> y pulsamos sobre <i>Iniciar sesiones</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qzEY4b-CQ11h0gCj_PfO6PMrB7DEN7AO9TlM4746ILi3-E8j1XeVxpuQP1qta9GM4DhYTVsyvQfZ3LvqB7zfw1WpyBgvePL0eoTOenGbvLgfmOTuHQp3Bmcn0GsJRfy6B7SGohwJLIH-/s1600/26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qzEY4b-CQ11h0gCj_PfO6PMrB7DEN7AO9TlM4746ILi3-E8j1XeVxpuQP1qta9GM4DhYTVsyvQfZ3LvqB7zfw1WpyBgvePL0eoTOenGbvLgfmOTuHQp3Bmcn0GsJRfy6B7SGohwJLIH-/s1600/26.png" /></a></div>
<br />
Puede que nos solicite volver a compilar el proyecto.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaUIhV5QI2xIg5WpF5hZU_YykrBZh7_VGSgw97iBQsk_vJ0hOmq1DhRFiiTvs4OPffV5qYv8q4u8RCvBrn9hDtc6ZsZOIJyHRU5x2p6r5IRA_V24_eU3XCPpycEMCCGh45Rc6Qh0-AEsf_/s1600/27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaUIhV5QI2xIg5WpF5hZU_YykrBZh7_VGSgw97iBQsk_vJ0hOmq1DhRFiiTvs4OPffV5qYv8q4u8RCvBrn9hDtc6ZsZOIJyHRU5x2p6r5IRA_V24_eU3XCPpycEMCCGh45Rc6Qh0-AEsf_/s1600/27.png" /></a></div>
<br />
Y transferir el programa al PLC.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq4lMAjwUAquvhPCbTAV_Tm6P1aGDEzqJkiyefhWjD9-5izPpeAGtW9_TcT3hpTjvduQOF4BIeyfw-_OM4Ue5d03YMz9p6_ArBw5B_vNkH4YImalCPH_C9mW17QvcF8q9qf7rTEx3LiAWx/s1600/28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq4lMAjwUAquvhPCbTAV_Tm6P1aGDEzqJkiyefhWjD9-5izPpeAGtW9_TcT3hpTjvduQOF4BIeyfw-_OM4Ue5d03YMz9p6_ArBw5B_vNkH4YImalCPH_C9mW17QvcF8q9qf7rTEx3LiAWx/s1600/28.png" /></a></div>
<br />
Ya estamos en línea con el PLC, pero este aún no está ejecutando el programa.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXUEfCesl_PGe9NRciPNW0dfzfLBZoadOuXsK0Pi61TGoBhcutwv1kJaBIVWEE99RQC35_PEWw2TXQASRZc0y-RKEIGUnVcQco51CC9U1PIJDrq8t8b9XS2zKjE0l4BIVxdgbMus9FUqEI/s1600/29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXUEfCesl_PGe9NRciPNW0dfzfLBZoadOuXsK0Pi61TGoBhcutwv1kJaBIVWEE99RQC35_PEWw2TXQASRZc0y-RKEIGUnVcQco51CC9U1PIJDrq8t8b9XS2zKjE0l4BIVxdgbMus9FUqEI/s1600/29.png" /></a></div>
<br />
Para iniciar la ejecución del programa debemos ir al menú <i>En línea</i> y pulsar sobre <i>Inicio</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVOQalHZu6BTEJmmNYeKmpkWoeqOU40bUIqO-oELTLP2a1A7QiGnynPHyhDei0gYUV7fbj5ewJZ9q3vx-stEmxYi2pKRFe1iQKM9NdwaS608rKmeBnTjAIbLyeXSTb-aoBayU1b8cC3KWX/s1600/30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVOQalHZu6BTEJmmNYeKmpkWoeqOU40bUIqO-oELTLP2a1A7QiGnynPHyhDei0gYUV7fbj5ewJZ9q3vx-stEmxYi2pKRFe1iQKM9NdwaS608rKmeBnTjAIbLyeXSTb-aoBayU1b8cC3KWX/s1600/30.png" /></a></div>
<br />
Y ya podemos ver como nuestro PLC ejecuta nuestro sencillo código (en la barra inferior del <i>TwinCAT PLC Control</i> aparece resaltado en verde la casilla <b>EJECUTAR</b>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIFhrlV4FDt5NHySQjn1T9NJ5607gI1sH-iKBD1DtbF5F3IwpZx9UkLg8XGO6QyX2xMce15zsurDEIlsMz7ajmvGtXnPlP9BJe5Pa60fqsBToFlZ7Mdmph9hWbpLC_0xmJ-xyfdHlftn81/s1600/31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIFhrlV4FDt5NHySQjn1T9NJ5607gI1sH-iKBD1DtbF5F3IwpZx9UkLg8XGO6QyX2xMce15zsurDEIlsMz7ajmvGtXnPlP9BJe5Pa60fqsBToFlZ7Mdmph9hWbpLC_0xmJ-xyfdHlftn81/s1600/31.png" /></a></div>
<br />
Ya solo falta un pequeño detalle, y es que si quitamos la alimentación del PLC el programa se perderá, siendo necesario una nueva transferencia. Para fijar nuestro programa debemos crear un proyecto de arranque, en el menú<i> En línea -> Crear un proyecto de arranque</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpN-rjP4tDR4f9rcNg783r6XM2khbRXH9W_wGCm6MVs2fFbBK5Jqpg6elfrNZK06axD90_y1nlzf5Vi4zs5hITzb0wy4-gR2TxUvstWeqNjDuUQ-2Oi3tuvaq3XiL-PuOcwV5BfTQKDbuM/s1600/32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpN-rjP4tDR4f9rcNg783r6XM2khbRXH9W_wGCm6MVs2fFbBK5Jqpg6elfrNZK06axD90_y1nlzf5Vi4zs5hITzb0wy4-gR2TxUvstWeqNjDuUQ-2Oi3tuvaq3XiL-PuOcwV5BfTQKDbuM/s1600/32.png" /></a></div>
<br />
Llegados a este punto nuestro PLC ya está configurado, listo para que le saquemos el máximo jugo programándolo.<br />
<br />
Por si a alguien le interesa, todos los ficheros generados en esta entrada están disponibles <a href="http://goo.gl/99ciE">aquí</a>.<br />
<br />
Como siempre, cualquier comentario será bienvenido.<br />
<br />GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com2tag:blogger.com,1999:blog-226572436930860787.post-30611335770453930832012-10-03T12:10:00.000+02:002012-10-04T09:55:25.041+02:00Preparativos para programar un PLC Beckhoff BC8150Tengo entre manos un proyecto para el que hemos seleccionado un <a href="http://www.beckhoff.com/english.asp?bus_terminal/bc8000_bc8050_bc8100_bc8150.htm">PLC Beckhoff BC8150</a>. Es un PLC económico de gama baja que lleva incorporado un puerto serie RS232. En esta entrada voy a describir los pasos que tuve que dar para configurar la comunicación para programarlo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqLnO2y2IdBZmkbTdEheKKq0_RlIXmdDvYlIVc9uyU_4FF_Q5gjfR924-IYjJ9XFq0PvPGYJtAIVeNo39ZNGxM-LjnK-EBdvnDlCd0lIprd_o5KMYM315Pt94VvF0ShTyZkYbcRrg8PulO/s1600/BC8150.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqLnO2y2IdBZmkbTdEheKKq0_RlIXmdDvYlIVc9uyU_4FF_Q5gjfR924-IYjJ9XFq0PvPGYJtAIVeNo39ZNGxM-LjnK-EBdvnDlCd0lIprd_o5KMYM315Pt94VvF0ShTyZkYbcRrg8PulO/s1600/BC8150.jpg" /></a></div>
<br />
En esta ocasión he instalado el software de programación <a href="http://www.beckhoff.com/english.asp?twincat/default.htm">TwinCAT</a> (descargable gratuitamente desde <a href="http://www.beckhoff.com/english/download/software_products.htm?id=70997977100322">aquí</a>) en una máquina virtual. La conexión con el PLC será a través de un cable de programación serie, que ya tenía de proyectos anteriores. Mi portátil viene con puerto serie integrado, pero he notado que de vez en cuando pierde la comunicación, no recuperándola hasta reiniciar la máquina virtual. Sin embargo, usando un adaptador serie/USB con chipset Prolific el funcionamiento ha sido óptimo.<br />
<br />
El BC8150 tiene dos ruedas numeradas donde se selecciona el protocolo y la dirección de comunicación. Si la dirección está entre 0 y 39 el protocolo será autoconfigurable. Entre 40 y 59 el protocolo será <a href="http://es.wikipedia.org/wiki/Modbus">Modbus RTU</a>. Para programar será necesario que la dirección sea inferior a 40 (más información <a href="http://infosys.beckhoff.com/english.php?content=../content/1033/bc8x50/html/bt_bc8150_address.htm&id=2100">aquí</a>).<br />
<br />
NOTA: Aunque físicamente hay dos conectores serie (el superior para programación con el cable de Beckhoff y el inferior para la conexión de dispositivos), internamente deben ser el mismo. Esto implica que <u>si tenemos un dispositivo conectado al puerto DB9, para poder programar deberemos desconectarlo</u>.<br />
<br />
Con mi PLC alimentado y el cable serie conectado puedo empezar a configurar la comunicación. Sobre el icono de TwinCAT, con el botón derecho, pulso sobre <i>Properties</i>.<br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPWLZv1NR5q901wgsfAoMw3NDdHXJCsXDW6Q3lflKGyx8bQVngqk8E_J0RbjOJvlDpstTHSkRBnvEuq_taXQWLVZ-vwIMQQNMTWG1yFIR7j6TjzvnXdsW5AZ7XBAH6kBPlePM2EUcR1gFI/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPWLZv1NR5q901wgsfAoMw3NDdHXJCsXDW6Q3lflKGyx8bQVngqk8E_J0RbjOJvlDpstTHSkRBnvEuq_taXQWLVZ-vwIMQQNMTWG1yFIR7j6TjzvnXdsW5AZ7XBAH6kBPlePM2EUcR1gFI/s1600/00.png" /></a></div>
<br />
Aparecerá la ventana de propiedades de TwinCAT.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjY-seZbeHXtWMwkJWmhSW27QhexceQU_PHmNBmV4e2su5enhF2N6XAXS6xA4cvYwQM6N6BxoDcqXdytNT4ZABjqcYQe4_0Aqml9NVh6F6p6SdX9cKnjAkVGi49ZrpdtviwKxX_YVyNDM/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjY-seZbeHXtWMwkJWmhSW27QhexceQU_PHmNBmV4e2su5enhF2N6XAXS6xA4cvYwQM6N6BxoDcqXdytNT4ZABjqcYQe4_0Aqml9NVh6F6p6SdX9cKnjAkVGi49ZrpdtviwKxX_YVyNDM/s1600/01.png" /></a></div>
<br />
Vamos a la pestaña <i>AMS Router</i> y pulsamos sobre <i>Add.</i><br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3g-LXNvJ-waFTRsSPVyH6uU3mOYb6hGWIf2o_j616zHJ6dTFN2Jpb_lFhDCbFc-Er7sf1wzOwEFeWDb-SA7p-IoRE05QTIrL9CmSNCe2Qw-kjayJiXP3FOlP6LwnchR-K9JxptXxUQOgZ/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3g-LXNvJ-waFTRsSPVyH6uU3mOYb6hGWIf2o_j616zHJ6dTFN2Jpb_lFhDCbFc-Er7sf1wzOwEFeWDb-SA7p-IoRE05QTIrL9CmSNCe2Qw-kjayJiXP3FOlP6LwnchR-K9JxptXxUQOgZ/s1600/02.png" /></a></div>
<br />
Ahora introduciremos un identificador para la conexión, yo la he llamado como el PLC (<b>BC8150</b>), en el campo <i>AMS Net ID</i> introduciremos <b>1.1.1.1.1.1</b>, en <i>Address </i>introduciremos el puerto serie que estará conectado con el PLC, la velocidad, la paridad, los bits de datos y de parada, quedando algo así: <b>COM1:9600,e,8,1</b> (las mayúsculas son importantes), finalmente, en el campo <i>Transport</i> seleccionamos <b>COM-PORT</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2cFZ2U-CchbdLEikEV0aZgnpYqPKXtiav735zbsKRGmPVM_O-EdISJIBLsxPdKLVTvXpplkEfVkehI9gzbQggtpAxx7rPfvRkrEhG9wW7oqbKi28xtjK652YHAlcxWiNnpUUpLdwrchcw/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2cFZ2U-CchbdLEikEV0aZgnpYqPKXtiav735zbsKRGmPVM_O-EdISJIBLsxPdKLVTvXpplkEfVkehI9gzbQggtpAxx7rPfvRkrEhG9wW7oqbKi28xtjK652YHAlcxWiNnpUUpLdwrchcw/s1600/03.png" /></a></div>
<br />
Pulsamos <i>OK</i> y la ventana se cerrará. Para que la configuración tenga efecto debemos parar el sistema TwinCAT y volver a ponerlo en modo configuración. En el icono de TwinCAT, con el botón derecho, seleccionamos <i>System -> Stop</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRxXSH4TN0gf58iXaZsmo5n-9VVRYtFdFJNgJEaFUW4b0eeZs10brF3HmlefOVLupUmOYItIb2qneBvpy37wFDu7lCbY941tD6H5cBUkBpBjDn3q4Wi1wI5nOvoh6YlXBuEH9zOHgjEi6b/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRxXSH4TN0gf58iXaZsmo5n-9VVRYtFdFJNgJEaFUW4b0eeZs10brF3HmlefOVLupUmOYItIb2qneBvpy37wFDu7lCbY941tD6H5cBUkBpBjDn3q4Wi1wI5nOvoh6YlXBuEH9zOHgjEi6b/s1600/04.png" /></a></div>
<br />
Para luego seleccionar de la misma manera <i>System -> Config</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoc66yJyLzQQ0gB9jDGa2S2jxS8trNOCZtjDIgHiw9bhSSjbW23dzD5VJOYq9dTTwH0MmFsR-97ZZiUqcK0Lf_use5SPaK-PNkia2EmYGSfqxk67Wy2xinotKp1ypDC-Q2Ph1oMZN9wNqO/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoc66yJyLzQQ0gB9jDGa2S2jxS8trNOCZtjDIgHiw9bhSSjbW23dzD5VJOYq9dTTwH0MmFsR-97ZZiUqcK0Lf_use5SPaK-PNkia2EmYGSfqxk67Wy2xinotKp1ypDC-Q2Ph1oMZN9wNqO/s1600/05.png" /></a></div>
<br />
Ya tenemos la comunicación configurada. Para probarla abrimos el <i>TwinCAT System Manager</i> y pulsamos sobre <i>Choose Target...</i><br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBE81KLmaBb9VmzJ0T49j9TIJPLw_5wozQ0bbV-j_6YPI_Iuh53bRFgAD3f3wGtyGOwCkTbiLJdvRyIce_rAlKKTzaI30O_3toPetgB0V68E7F3e2raEXSA-toAYm19oD9ZgepINEJkN7u/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBE81KLmaBb9VmzJ0T49j9TIJPLw_5wozQ0bbV-j_6YPI_Iuh53bRFgAD3f3wGtyGOwCkTbiLJdvRyIce_rAlKKTzaI30O_3toPetgB0V68E7F3e2raEXSA-toAYm19oD9ZgepINEJkN7u/s1600/06.png" /></a></div>
<br />
Seleccionamos nuestro PLC y pulsamos OK.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmi9jUt30h56X00VBrhtkbvX-bOgKBHbUro3a7Yhi6YVmACbpqhbLRI2GFW4n__mqZ2kXNA-6kIGBWFa5Q-vofXymIbgRquO-B9Hd5cl1rbdoMrYs3NlsMZlNGkZBH88MlJAvy5oocKKnw/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmi9jUt30h56X00VBrhtkbvX-bOgKBHbUro3a7Yhi6YVmACbpqhbLRI2GFW4n__mqZ2kXNA-6kIGBWFa5Q-vofXymIbgRquO-B9Hd5cl1rbdoMrYs3NlsMZlNGkZBH88MlJAvy5oocKKnw/s1600/07.png" /></a></div>
<br />
En la parte inferior del <i>System Manager</i> podremos ver que la conexión ha cambiado a nuestro PLC. Desplegamos la <i>Configuración E/S</i> y con el botón derecho sobre <i>Dispositivos de E/S</i> seleccionamos <i>Explorar dispositivos...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9_x874xDVZXJRuAkLJ5aq1WW1xaRahgSHTPW3XJUXS6VNUmJ38a_Y_J9xT85v1plOdBNmRKosj8zmKjd-AkUQs_pIOZ13Reh-vPQfem0hsTG2j1GxGOJuaz84BM8S2-cX5Jog4UYtErCJ/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9_x874xDVZXJRuAkLJ5aq1WW1xaRahgSHTPW3XJUXS6VNUmJ38a_Y_J9xT85v1plOdBNmRKosj8zmKjd-AkUQs_pIOZ13Reh-vPQfem0hsTG2j1GxGOJuaz84BM8S2-cX5Jog4UYtErCJ/s1600/09.png" /></a></div>
<br />
Lo que vamos a hacer es comprobar qué tarjetas conectadas al PLC son detectadas por el sistema. Nos aparecerá una advertencia de que no todos los dispositivos pueden ser detectados de esta manera.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4SL_hYlJrU5WzDBChyphenhyphenp1XKYA6CJOlyenHzgJ5VLsdTdHstdWYaIp46NoZU08F8VWPcfnTjjWw3OLKulPH1Yjfg_q-OvDFcT2upCWEZIvPKiTANDQUlJHUYuyTyYxMUqTVwLER1S1Su49/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4SL_hYlJrU5WzDBChyphenhyphenp1XKYA6CJOlyenHzgJ5VLsdTdHstdWYaIp46NoZU08F8VWPcfnTjjWw3OLKulPH1Yjfg_q-OvDFcT2upCWEZIvPKiTANDQUlJHUYuyTyYxMUqTVwLER1S1Su49/s1600/10.png" /></a></div>
<br />
Pulsamos <i>Aceptar</i> nos mostrará los dispositivos de entrada/salida que ha detectado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvewDqvuqIV1esSNpc2Ty-DYprxE4B1NF7xrXJ17omK0_UGs9K4XhnuEjjAk5mjRuIXZ3JJ1q34iSHiNMr1IE62vH_FGCWWqBuzmrsI9MfyAOPDfnGNIVKZdVJP2Oiadyv8AvMluBFXetZ/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvewDqvuqIV1esSNpc2Ty-DYprxE4B1NF7xrXJ17omK0_UGs9K4XhnuEjjAk5mjRuIXZ3JJ1q34iSHiNMr1IE62vH_FGCWWqBuzmrsI9MfyAOPDfnGNIVKZdVJP2Oiadyv8AvMluBFXetZ/s1600/11.png" /></a></div>
<br />
Pulsamos <i>OK</i> y le diremos que <i>Sí</i> en la siguiente ventana.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-pRybYuD7hLZyxE_vfL43db1_iOHdezXDKnkXQ-Tnbgs0bt1177mWlmXiKA2MnPkqgqkVz_RHQWYuMI4ys5BTRk9Nxq4e3osNUX-rKLQ359vTl26Pjqb94YwAUNbX-HtbzNpiOSeHxESf/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-pRybYuD7hLZyxE_vfL43db1_iOHdezXDKnkXQ-Tnbgs0bt1177mWlmXiKA2MnPkqgqkVz_RHQWYuMI4ys5BTRk9Nxq4e3osNUX-rKLQ359vTl26Pjqb94YwAUNbX-HtbzNpiOSeHxESf/s1600/12.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
A continuación nos preguntará si queremos activar el modo <i>Free Run</i>, que nos permitirá probar la entradas y salidas sin necesidad de cargar un programa en el PLC.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXo_BLNiynE-cjeN5YgAspQdEJMGsCNkwMMNdqU86PtnfivDiBxs_vWzoiuHL9HL69uVteWekmsHzpIrM97-ZSJ8GwqDI-PyP1AJUkINoYXa8c7nMhybubdeCLL9xm1pBmKHzsB3Rt7pya/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXo_BLNiynE-cjeN5YgAspQdEJMGsCNkwMMNdqU86PtnfivDiBxs_vWzoiuHL9HL69uVteWekmsHzpIrM97-ZSJ8GwqDI-PyP1AJUkINoYXa8c7nMhybubdeCLL9xm1pBmKHzsB3Rt7pya/s1600/13.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Finalmente podremos ver el resultado de la exploración. En mi caso detectó todas las tarjetas que tenía conectadas al PLC.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAh4H49HnEJi5DNsfBrKV4JhkfQULqEMRfY0SRJGhLTGt1blUNQR1NJopxbqdvqtZkE8Jl6ErRmloiWSDmJPZqVPlNCrYs4YS4mrYc_3guL4QOBY-xM9yOYresi3_nGJJ31wSfb-_tPxWQ/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAh4H49HnEJi5DNsfBrKV4JhkfQULqEMRfY0SRJGhLTGt1blUNQR1NJopxbqdvqtZkE8Jl6ErRmloiWSDmJPZqVPlNCrYs4YS4mrYc_3guL4QOBY-xM9yOYresi3_nGJJ31wSfb-_tPxWQ/s1600/14.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Con estos pasos hemos configurado la comunicación para poder programar el PLC y hemos comprobado que funciona correctamente. En una <a href="http://notasdeautomatizacion.blogspot.com.es/2012/10/mapeado-de-entradassalidas-y.html">próxima entrada</a> explicaré como tener acceso a las entradas y salidas desde el programa PLC.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Como siempre, cualquier comentario será bienvenido.</div>
GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com5tag:blogger.com,1999:blog-226572436930860787.post-85302415726486558342012-07-06T14:51:00.000+02:002012-07-06T14:51:45.294+02:00Midiendo el tiempo de arranque de una máquina con un script en WinCC FlexibleHace ya unas semanas un lector me hizo una consulta sobre cómo medir el tiempo de arranque de una máquina con un <a href="http://es.wikipedia.org/wiki/Script">script</a> en <a href="http://www.automation.siemens.com/mcms/human-machine-interface/en/visualization-software/wincc-flexible/pages/default.aspx">WinCC Flexible</a>. En su momento no tuve tiempo de responderle, pero he hecho una prueba y aprovecho para publicarla en el blog.<br />
<br />
Lo que se pretende es visualizar en una pantalla el tiempo de arranque de una máquina. No existe la posibilidad de modificar el programa PLC, con lo que toda la programación deberá hacerse sobre WinCC Flexible.<br />
<br />
Con este planteamiento lo primero es localizar dos variables en el programa PLC que nos sirvan para identificar los momentos de inicio y fin de arranque. Para mi ejemplo he enlazado dos variables llamadas <b>INICIO_CICLO</b> y <b>FIN_CICLO</b> que cumplirán esta función y mediante dos botones desde el HMI simularé su activación. También crearé con formato Long tres variables internas, una para el tiempo de inicio (<b>TIEMPO_INICIAL</b>), otra para el tiempo final (<b>TIEMPO_FINAL</b>) y la tercera para la diferencia entre ambos (<b>TIEMPO_MEDIDO</b>), que será el tiempo de arranque buscado.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAO5ngT-hlX4SdCprTU2A_tXIgqMhikfSa2fgPFy_rAO3b743wqjzM_g0qGUwZQL2MNwP_pbAIaxMbpPnkK_3sdDaZzj2l5L5c_VnrUmH629bsgsBwGGcHXBIv3oHCjtns59a6-5Z8ifK6/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAO5ngT-hlX4SdCprTU2A_tXIgqMhikfSa2fgPFy_rAO3b743wqjzM_g0qGUwZQL2MNwP_pbAIaxMbpPnkK_3sdDaZzj2l5L5c_VnrUmH629bsgsBwGGcHXBIv3oHCjtns59a6-5Z8ifK6/s640/05.png" width="640" /></a></div>
<br />
Estas variables deberemos enlazarlas desde el HMI, seleccionando en su configuración <i>Ciclo continuo</i> y ajustando el <i>Tiempo de adquisición</i> al más bajo posible: 100 ms. Así el panel estará leyendo cada 100 ms el valor de estas variables desde el PLC. Por lo tanto es importante que estas variables en el PLC estén activadas durante más de 100 ms.<br />
<br /><a name='more'></a><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD5lAHVlmYTXw-ePe7QYOFPTbKezl9iEtBakSX1A8C-Ob5qGHOGRltoYwWVZyutIIgRbdTTHHeNVf0JFmxtfSoqHDZVdMtnWzbQOddUJ7HEX462njVGet52g07iam7kOGcz-Uq-gxaa9vU/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD5lAHVlmYTXw-ePe7QYOFPTbKezl9iEtBakSX1A8C-Ob5qGHOGRltoYwWVZyutIIgRbdTTHHeNVf0JFmxtfSoqHDZVdMtnWzbQOddUJ7HEX462njVGet52g07iam7kOGcz-Uq-gxaa9vU/s640/01.png" width="640" /></a></div>
<br />
A continuación tendremos que crear un par de scripts, que se ejecutarán cuando estas variables cambien, uno para cuando se detecte que se ha iniciado el arranque y otro para cuando finalice.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhF-wSDMhkTkPzetKfC14vRublGF4oQwTYAxjqjp3DskMJG0JHMXHiFBPy6cu9ZZlL0J1Q2uM-jXdJCeTs2vSM7C8oz7m4ggV90GUBnpeHiXWg8vxdHlzYqhWXSBFqLvRY1CM0cIr3SGcK/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhF-wSDMhkTkPzetKfC14vRublGF4oQwTYAxjqjp3DskMJG0JHMXHiFBPy6cu9ZZlL0J1Q2uM-jXdJCeTs2vSM7C8oz7m4ggV90GUBnpeHiXWg8vxdHlzYqhWXSBFqLvRY1CM0cIr3SGcK/s640/04.png" width="640" /></a></div>
<br />
Dentro de los scrips usaré la función de <a href="http://es.wikipedia.org/wiki/Visual_Basic_Script_Edition">Visual Basic Script</a> <i>Timer</i>, que cuando la llamamos nos devuelve el número de segundos que han transcurrido desde las 00:00 horas, teniendo por tanto un rango entre 0 y 86399 segundos. No he encontrado una función que tenga una resolución temporal inferior al segundo, con lo que si necesitamos más precisión esta no es la forma de hacerlo.<br />
<br />
Si escribimos <i>Timer </i>en el editor de scripts y pulsamos la tecla F1 aparecerá la ayuda para esta función, que nos dice lo siguiente:<br />
<blockquote class="tr_bq">
Microsoft® Visual Basic® Scripting Edition<br />
Timer Function Language Reference Version 5<br />
<br />
--------------------------------------------------------------------------------<br />
Description<br />
Returns the number of seconds that have elapsed since 12:00 AM (midnight).<br />
The following example uses the Timer function to determine the time it takes to iterate a For...Next loop N times:<br />
Function TimeIt(N)<br />
Dim StartTime, EndTime<br />
StartTime = Timer<br />
For I = 1 To N<br />
Next<br />
EndTime = Timer<br />
TimeIt = EndTime - StartTime<br />
<span style="background-color: white;">End Function </span> </blockquote>
<span style="background-color: white;">El código del script para detectar el inicio del arranque es el siguiente:</span><br />
<blockquote class="tr_bq">
'Script a asociar a la variable que indique el inicio de ciclo<br />
'Si la variable que marca el inicio del ciclo está a uno<br />
If SmartTags("INICIO_CICLO") = True Then<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>'Se guarda el tiempo inicial<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>'La función Timer devuelve el nº de segundos que han pasado desde las 00:00 horas<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>SmartTags("TIEMPO_INICIAL") = Timer<br />
End If</blockquote>
<span style="background-color: white;">y el código para el script que se asocia a la variable del fin de arranque es este:</span><br />
<blockquote class="tr_bq">
'Script a asociar a la variable que indique el final del ciclo<br />
'Si la variable que marca el final del ciclo está a uno<br />
If SmartTags("FIN_CICLO") = True Then<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>'Se guarda el tiempo final<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>'La función Timer devuelve el nº de segundos que han pasado desde las 00:00 horas<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>SmartTags("TIEMPO_FINAL") = Timer<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>'Se calcula la diferencia entre el tiempo inicial y el tiempo final<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>'para tener el tiempo de arranque buscado<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>'Si el tiempo final es mayor que el tiempo inicial se restan<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>If SmartTags("TIEMPO_FINAL") > SmartTags("TIEMPO_INICIAL") Then<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>SmartTags("TIEMPO_MEDIDO") = SmartTags("TIEMPO_FINAL") - SmartTags("TIEMPO_INICIAL")<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>'Si el tiempo final es menor que el inicial, es que dentro del intervalo está la puesta a cero<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Else<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>SmartTags("TIEMPO_MEDIDO") = SmartTags("TIEMPO_FINAL") + _<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> SmartTags("TIEMPO_INICIAL") - 86400<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>End If<br />
End If</blockquote>
<span style="background-color: white;">Ahora hay que asociar los scripts a sus variables correspondientes. Seleccionamos cada variable y en sus propiedades, bajo </span><i>Eventos -> Cambio de valor</i><span style="background-color: white;"> le asignamos el script adecuado.</span><br />
<span style="background-color: white;"><br /></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfUcZrA1Un0fmM_QNmzCbCjArfbIhXElGDSA1k_NjYPk1h8r9LthLqYEWkw5JBIvU-f4GWsDIlpKoEu9ctZ6G2HKhjWQv68cf1csTCPY0Na4pDklTAvFaEJGwP8uawlmFbvIeJ-YPfceod/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="448" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfUcZrA1Un0fmM_QNmzCbCjArfbIhXElGDSA1k_NjYPk1h8r9LthLqYEWkw5JBIvU-f4GWsDIlpKoEu9ctZ6G2HKhjWQv68cf1csTCPY0Na4pDklTAvFaEJGwP8uawlmFbvIeJ-YPfceod/s640/02.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho-51bZbniaMwo6GGGmu9k6HbSZnzm1fcO3N0ZNWyScAsX1uAeqIkYHlLNF2rhqF1CsNK5WV8a76dfH3mnuTHh5RgW09-XqlRjg2P-IssLSa_FCSVf8OHrUddU4e1eMZAZ0VE55a2Ls82l/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="448" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho-51bZbniaMwo6GGGmu9k6HbSZnzm1fcO3N0ZNWyScAsX1uAeqIkYHlLNF2rhqF1CsNK5WV8a76dfH3mnuTHh5RgW09-XqlRjg2P-IssLSa_FCSVf8OHrUddU4e1eMZAZ0VE55a2Ls82l/s640/03.png" width="640" /></a></div>
<br />
Y listo, cuando se den las condiciones de inicio de arranque y posteriormente el de fin de arranque, en la variable <b>TIEMPO_FINAL</b> tendremos el tiempo en segundos buscado.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWZ8nDWyr4amPG-Zb1jM8OkS7xmfyHB_7Ct5f2BpTZd8DyVsrePIV37h-11LfZSYiNf4pUz8rxd6SK5xfvSH43PWxgp4jLaX25pEGVFdVIgLbapjV6X9-Hq7DwsDmr5HESWsLVukYC3l2a/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWZ8nDWyr4amPG-Zb1jM8OkS7xmfyHB_7Ct5f2BpTZd8DyVsrePIV37h-11LfZSYiNf4pUz8rxd6SK5xfvSH43PWxgp4jLaX25pEGVFdVIgLbapjV6X9-Hq7DwsDmr5HESWsLVukYC3l2a/s640/00.png" width="640" /></a></div>
<br />
Esto no es más que un ejemplo muy sencillo. No sé si será la mejor opción, pero funciona razonablemente bien. Lo he probado con máquinas virtuales ejecutando WinAC y un Runtime de WinCC Flexible, y tienes el proyecto de prueba <a href="http://goo.gl/xVlpi">aquí</a>.<br />
<br />
El mayor problema que veo es la limitación de no poder modificar el programa PLC. Puede que no sea sencillo localizar variables que nos marquen inequívocamente el inicio y el fin del arranque y tal vez tendremos que elaborar un poco más (usando operaciones lógicas con varias variables) su detección. Si se te ocurre una solución mejor estaré encantado de que me la cuentes.<br />
<br />
No conozco documentación específica sobre programación de scripts en WinCC Flexible salvo la que se instala con el propio programa: creo que lo mejor para aprender es trastear con el propio editor y consultar su ayuda, que es bastante completa.<br />
<br />
Como siempre agradeceré cualquier comentario.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com6tag:blogger.com,1999:blog-226572436930860787.post-34451392712710847302012-06-27T21:19:00.000+02:002012-06-27T21:19:15.831+02:00Ajustando una fibra de detección de color Keyence CZ-V21AP con cabezal CZ-H32En un proyecto reciente hemos tenido la necesidad de colocar un sensor para distinguir entre varios tipos de piezas a través de su color. Las piezas tenían formas similares pero su acabado superficial era plástico verde o azul, o metálico brillante. El sensor elegido para realizar esta función fue una fibra óptica de <a href="http://www.keyence.co.uk/">Keyence</a>, compuesta por un amplificador referencia <a href="http://www.keyence.eu/products/sensors/fiberoptic/czv20/czv20_features_1.php">CZ-V21AP</a> y un cabezal referencia <a href="http://www.keyence.eu/products/sensors/fiberoptic/czv20/czv20_features_2.php">CZ-H32</a>. En esta entrada voy a explicar, a modo de guía, cómo he realizado la configuración y su calibración.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvbOs4ryg56IeXC1B9-VdusZJ4nGt1tLS6SET2C9WAWVz-EZyLModVQAvt2EDffSaUhk7X7Ml6Od3VbwPdPNjqBlmwENZKY0rqgq7AHIstaONWHE297qCK9yVV5b5_4Rsb-JmWcdAQpFC/s1600/Amp.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvbOs4ryg56IeXC1B9-VdusZJ4nGt1tLS6SET2C9WAWVz-EZyLModVQAvt2EDffSaUhk7X7Ml6Od3VbwPdPNjqBlmwENZKY0rqgq7AHIstaONWHE297qCK9yVV5b5_4Rsb-JmWcdAQpFC/s1600/Amp.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Imagen del amplificador (disculpad la mala calidad de las fotos)</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEBJIbkZVikIrFLpblgYhXXAr5CXa_XIAsSSosv40emIkdK7pC1EveLGC9qNlafmhrXxE1kocBxleSnorbsiXe6hjJtouEYmrsys8wd9omRq_ZuyN9oZdoyOk4zsn8EDZA7gNWOCTmKwgO/s1600/Cab.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEBJIbkZVikIrFLpblgYhXXAr5CXa_XIAsSSosv40emIkdK7pC1EveLGC9qNlafmhrXxE1kocBxleSnorbsiXe6hjJtouEYmrsys8wd9omRq_ZuyN9oZdoyOk4zsn8EDZA7gNWOCTmKwgO/s1600/Cab.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Imagen del cabezal</td></tr>
</tbody></table>
<a name='more'></a><br />
El folleto de instrucciones que acompaña la fibra tiene toda la información necesaria de manera muy esquemática y deberemos leerla con detenimiento. Lo primero es verificar que tenemos el cabezal montado dentro de los parámetros que especifica el fabricante. Para mi ejemplo, el cabezal CZ-H32 debe estar a una distancia de entre 50 a 95 mm, siendo la idónea 70 mm. La fibra por la que viajará la luz no de debe tener en ningún punto una curvatura menor de 25 mm (cuanto mayor sea el radio de curvatura mejor, ya que tendremos menos pérdidas). También deberemos tener en cuenta que no debe haber excesiva iluminación ni debe incidir directamente ninguna fuente de luz, colocando si es necesario algún elemento que ampare la zona de detección. Debemos escapar de realizar la detección en bordes o zonas poco definidas. Por último, como uno de los acabados que debo detectar es metálico brillante, el fabricante aconseja girar el cabezal unos 15º.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_n5XbAvNGRrssYxzuh-mWFmdRL-625RsSzMwvY18xohZyUEIHfD_5gV0GNyOYRwFoEyB48gPQi28EWMbRuW1PHZMIPSlla6kQoXfQl_LuD0Q9CT14F7BFlDXpz7xuYIMXjisVvqKK6eRZ/s1600/Ang.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_n5XbAvNGRrssYxzuh-mWFmdRL-625RsSzMwvY18xohZyUEIHfD_5gV0GNyOYRwFoEyB48gPQi28EWMbRuW1PHZMIPSlla6kQoXfQl_LuD0Q9CT14F7BFlDXpz7xuYIMXjisVvqKK6eRZ/s1600/Ang.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Captura del manual de instrucciones de Keyence</td></tr>
</tbody></table>
<br />
Nota: En la página <a href="http://www.keyence.eu/services/download.php?file=cz_v20_man_kb.pdf&fs=CZ-V20&src=WEB+Man.+Download&done=/products/sensors/fiberoptic/czv20/czv20_features_2.php">web de Keyence</a> tenemos disponibles los manuales de sus productos, aunque es necesario registrarse previamente.<br />
<br />
Con nuestra fibra correctamente montada y cableada ya estamos en condiciones de realizar su configuración. El primer paso que deberemos dar es borrar cualquier configuración previa del amplificador. Para ello deberemos mantener pulsado el botón <b>MODE </b>mientras pulsamos cinco veces el botón <b>SET</b>. A continuación nos preguntará una confirmación, con las flechas cambiamos de no a yes y volvemos a pulsar <b>MODE</b>. Al cabo de unos segundos el amplificador de la fibra estará con sus parámetros por defecto.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH4biDOr-AqgK7hD7MF6c1H0BGj0C3xGTy8ypvlfGeKDCW33BsradRRZrZGtqadW6H85KbLWgVJwfsNcvr0aY2pddRQ_shQbME1SVX_xTcENwB7sgneumCig_uajNm5IxRRnOxo18vibX7/s1600/But.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH4biDOr-AqgK7hD7MF6c1H0BGj0C3xGTy8ypvlfGeKDCW33BsradRRZrZGtqadW6H85KbLWgVJwfsNcvr0aY2pddRQ_shQbME1SVX_xTcENwB7sgneumCig_uajNm5IxRRnOxo18vibX7/s1600/But.png" /></a></div>
<br />
El amplificador nos permite elegir entre varios modos de detección: color (<i>C</i>), color más intensidad (<i>C+I</i>) o intensidad solamente (<i>Super I</i>). Para mi aplicación la intensidad de luz no es relevante, por lo que seleccionaré el modo color. También es importante el tiempo de respuesta, que en mi caso, ya que la alimentación de piezas es manual, será la más lenta (modo <i>Super</i>), que me garantiza la evaluación en menos de 8 ms. Para aplicaciones donde las piezas fuesen alimentadas más rápidamente podríamos tener evaluaciones en modos más veloces de hasta 200 microsegundos. La calibración la podemos hacer para cada color individualmente (<i>1-P</i>) o para distinguir entre dos colores (<i>2-P</i>). Existe un tercer método denominado <i>Pinpoint </i>que es como el individual (<i>1-P</i>) pero más estricto. Por último, si la cantidad de luz que recibimos es excesiva se puede activar una atenuación.<br />
<br />
De todas estas opciones de configuración no me queda muy claro, a priori, cual es la más adecuada para mi aplicación. En el manual echo de menos ejemplos concretos de utilización de la fibra y tampoco los he encontrado en la web de Keyence. Así que, al final, el seleccionar una configuración que funcionase se ha hecho por ensayo y error.<br />
<br />
Después de varias pruebas me he decantado por la siguiente configuración, seleccionable de la siguiente manera:<br />
<br />
1. Pulsar <b>MODE </b>durante al menos tres segundos; con esto entraremos en el menú.<br />
2. Ahora nos preguntará si queremos el menú fácil (<i>easy</i>) o completo (<i>full</i>). Con las flechas seleccionaremos <i>Full </i>y pulsaremos <b>MODE</b>.<br />
3. Estamos ahora seleccionando el modo de detección. Con las flechas seleccionamos <i>Col </i>y pulsamos <b>MODE</b>.<br />
4. Tenemos que elegir el tiempo de respuesta. La opción a seleccionar aquí será <i>Supr </i>y pulsamos <b>MODE</b>.<br />
5. El comportamiento de las salidas digitales se configura aquí. Como queremos que den señal cuando detecten el color correspondiente seleccionamos <i>no </i>(contacto normalmente abierto) y pulsamos <b>MODE</b>.<br />
6. Esta opción nos permite temporizar la salida, pero no es necesario, por lo que seleccionamos <i>tOff </i>y pulsamos <b>MODE</b>.<br />
7. Deshabilitamos la función de ahorro de energía seleccionado <i>Off </i>y pulsamos <b>MODE</b>.<br />
8. El modo de calibración será <i>1-P</i>, pulsamos <b>MODE</b>.<br />
9. Y finalmente desactivamos la atenuación seleccionando <i>Off </i>y pulsando <b>MODE</b>.<br />
<br />
Ya está el amplificador configurado, nos falta hacer la calibración para cada tipo de pieza. Para ello cogemos una pieza y la colocamos en la posición de detección. Pulsando en el amplificador <b>MODE </b>más las flechas seleccionamos la salida digital que le queramos asignar a ese color. Pulsando <b>SET </b>registraremos el color de esa pieza como referencia para la activación de la salida. Si es posible pasar por delante del cabezal más superficie de detección, podemos mantener pulsado <b>SET </b>mientras lo hacemos, para que queden registradas las posibles distintas tonalidades de color, pero hay que ser cuidadoso de no interrumpir en ningún momento el haz de la fibra con la mano o que no haya durante este proceso delante de la fibra una superficie que no corresponda con la zona a evaluar, ya que quedaría registrada. Cada vez que repitamos esta operación se borrará la calibración previa para la salida seleccionada.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBakUWu15nVbptgwcNsha-MWCWPPNEhuUVUKRSDPp-NTEVCfga-IJqcMWToatnA0NlP81Cf3DFF1NFGt698V8U4zYvP3DfzawrVljSFc5rM-_oQ6n1xJCeAuppmUBCKDWcqZP1HjPFRblj/s1600/Cal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBakUWu15nVbptgwcNsha-MWCWPPNEhuUVUKRSDPp-NTEVCfga-IJqcMWToatnA0NlP81Cf3DFF1NFGt698V8U4zYvP3DfzawrVljSFc5rM-_oQ6n1xJCeAuppmUBCKDWcqZP1HjPFRblj/s1600/Cal.png" /></a></div>
<br />
Repetimos los pasos anteriores con una pieza de cada color, siendo cuidadosos de seleccionar la salida correspondiente.<br />
<br />
Con esto tenemos una primera calibración. Ahora la idea es ir pasando la mayor cantidad de piezas posible por delante del cabezal, verificando que siempre se active la salida correcta. En caso de que alguna pieza no sea detectada y que la pieza en sí no presente un defecto, deberemos realizar un ajuste manual. Para ello seleccionamos la salida correspondiente a esa pieza y nos fijamos en la pantalla del amplificador. El número de la parte superior (en rojo) indica, en porcentaje, cuanto se parece el color que está detectando al color de referencia. Debajo, en verde, está el valor de umbral (también en porcentaje) a partir del cual se activa la salida. Lo que debemos hacer es con la flechas del amplificador ir bajando el valor de umbral hasta que sea inferior al valor leído.<br />
<br />
En mi aplicación, usando unas veinte piezas de cada color conseguí una calibración efectiva. La pieza metálica fue la más fiable, con el primer ajuste no volví a tener problemas. Con las piezas plásticas azules y verdes tuve que hacer algún reajuste manual.<br />
<br />
Una vez realizada la calibración, el funcionamiento de la fibra ha sido impecable. La única pega que le puedo poner es que dar con la configuración más adecuada puede ser un poco laborioso.<br />
<br />
Como siempre, agradeceré cualquier comentario.<br />GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com6tag:blogger.com,1999:blog-226572436930860787.post-31806816477980650642012-05-29T19:41:00.000+02:002012-05-29T19:45:04.973+02:00Trends en RSLogix5000Una de las herramientas que se han vuelto imprescidibles en mi trabajo diario con <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/">RSLogix5000</a> son los <i>Trends </i>(tendencias). Sirven para representar gráficamente a modo de <a href="http://es.wikipedia.org/wiki/Osciloscopio">osciloscopio</a> o <a href="http://es.wikipedia.org/wiki/Analizador_l%C3%B3gico">analizador lógico</a> cualquier variable a la que tengamos acceso en nuestro programa PLC. Los <i>Trends </i>se guardan en el proyecto de RSLogix5000 sin que afecten al PLC. Las capturas de datos que hagamos podremos almacenarlas en un formato propio o exportarlas a <a href="http://es.wikipedia.org/wiki/CSV">formato CSV</a>, aceptable por cualquier programa de hoja de cálculo.<br />
<br />
Para crear un <i>Trend </i>vamos al árbol de nuestro proyecto y con el botón derecho sobre la carpeta <i>Trends </i>seleccionamos <i>New Trend...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitjGyCXhXzV9NUgD6VUri8dWfXb1CSa6XoT1XEmz1VryveWOFAjkI0NiKt5RP35ItCAReEs5LbR_m4RMKf9pDgcpedxl0r-7AjFDE4fbti5ax61sg1X4h91YxGAuLPbEP4_32LPMJGGpL2/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitjGyCXhXzV9NUgD6VUri8dWfXb1CSa6XoT1XEmz1VryveWOFAjkI0NiKt5RP35ItCAReEs5LbR_m4RMKf9pDgcpedxl0r-7AjFDE4fbti5ax61sg1X4h91YxGAuLPbEP4_32LPMJGGpL2/s1600/00.png" /></a></div>
A continuación nos pedirá un nombre, una descripción y un periodo de muestreo (modificables más adelante).<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSP72sbr5h_vKqrDQYkaqF9CPkEU_xBTyEuiJgChMXK4e-MSHlXUQHAIaZWzmKXxQKdC4lK9puqnxiVTXUehNx_NPjj7PKv7rkw5wgBbr63_hT_GcJQFiOtwMUaD77YWhYffn8zJBGQnVv/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSP72sbr5h_vKqrDQYkaqF9CPkEU_xBTyEuiJgChMXK4e-MSHlXUQHAIaZWzmKXxQKdC4lK9puqnxiVTXUehNx_NPjj7PKv7rkw5wgBbr63_hT_GcJQFiOtwMUaD77YWhYffn8zJBGQnVv/s1600/01.png" /></a></div>
<br />
En la siguiente ventana selecionaremos las variables a visualizar, aunque podremos cambiarlas posteriormente a voluntad.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHlFT0lnCajtqQx53cXKjTntskbllS1xW2FC7j8KPvzLniTpmDn0BTm3_Bu1tXxRUDu_Lkrj85J4Y1rG12nA8AGSN-76hKFCLrvRNu8PbotdQn0PvLGCRv9V_6gRjyUhjUXRfeHvyyEUd/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHlFT0lnCajtqQx53cXKjTntskbllS1xW2FC7j8KPvzLniTpmDn0BTm3_Bu1tXxRUDu_Lkrj85J4Y1rG12nA8AGSN-76hKFCLrvRNu8PbotdQn0PvLGCRv9V_6gRjyUhjUXRfeHvyyEUd/s1600/02.png" /></a></div>
<br />
Al finalizar aparecerá la pantalla del <i>Trend</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOZMEVYkux1ks_qLm-TyLHBLSqpxgM2lD6b81WY_PDEjHyB_u-4U700LvCL7d9MNAYQH6YguaErTLlDMhj7vWblOU4GgxeIYCkfdY4MH_7YJq27BNUbmYjmLjk-TiJfiyJs_WYGFg7MlIT/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOZMEVYkux1ks_qLm-TyLHBLSqpxgM2lD6b81WY_PDEjHyB_u-4U700LvCL7d9MNAYQH6YguaErTLlDMhj7vWblOU4GgxeIYCkfdY4MH_7YJq27BNUbmYjmLjk-TiJfiyJs_WYGFg7MlIT/s400/03.png" width="400" /></a></div>
<br />
El <i>Trend </i>ya está preparado para ser usado, pero es mejor refinar su configuración, así que con el botón derecho selecciono <i>Chart Properties</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbhKSe3wO2g6aYZ6EVXpmjanTtxh7EPqVjZxj74cWmEOHzuzrlYtpTPFrGhbL_4wfevmL6hszD6fhvlxeBlTeK5IL57P_oLlFRXGANWkrDYXDQpj4qXR8S35Pi-xekKTa9bp51VV2OFA16/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbhKSe3wO2g6aYZ6EVXpmjanTtxh7EPqVjZxj74cWmEOHzuzrlYtpTPFrGhbL_4wfevmL6hszD6fhvlxeBlTeK5IL57P_oLlFRXGANWkrDYXDQpj4qXR8S35Pi-xekKTa9bp51VV2OFA16/s1600/04.png" /></a></div>
<br />
Aparecerá la ventana de propiedades en la pestaña <i>Name</i>, donde podremos cambiar el nombre y la descripción.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSUr5q4vlaOPRprvOK6EN7Cvxy1u7TRiS8nbbRSNIFkWIwxyGiROytGNWc3Ys9VXFu9db64-pXc1AcMzdy_KSxHMUpbS-l9BWdWKQd41uI3K8xRu4Ybr0uQILNKskrlknwVPlwptdFvZiy/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSUr5q4vlaOPRprvOK6EN7Cvxy1u7TRiS8nbbRSNIFkWIwxyGiROytGNWc3Ys9VXFu9db64-pXc1AcMzdy_KSxHMUpbS-l9BWdWKQd41uI3K8xRu4Ybr0uQILNKskrlknwVPlwptdFvZiy/s1600/05.png" /></a></div>
<br />
En la pestaña <i>General </i>espeficicamos el título que se visualizará en el <i>Trend </i>y en <i>Chart Style</i> tenemos la opción de representar la gráfica contra el tiempo de adquisición (<i>Standard</i>) o contra alguna variable analógica que hayamos seleccionado (<i>XY Plot</i>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjisrQIwB11w_QFsZcYAtDlxIk6yxRafLt4zEVZRBkvcqKpfXp9a8A6d8fi80Q5M42XqJ7-gxeh-nq0sj8SWsCCCDQvIZSsp9zqais2CaQHPgoG2yecqNIuDMgh5qrR1nUd7dClWwNUUZO/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjisrQIwB11w_QFsZcYAtDlxIk6yxRafLt4zEVZRBkvcqKpfXp9a8A6d8fi80Q5M42XqJ7-gxeh-nq0sj8SWsCCCDQvIZSsp9zqais2CaQHPgoG2yecqNIuDMgh5qrR1nUd7dClWwNUUZO/s1600/06.png" /></a></div>
<br />
En la pestaña <i>Display </i>podemos modificar la forma en la que se nos muestran los datos, formato de tiempo, etc. Aquí las opciones que vienen seleccionadas por defecto dan buenos resultados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1kigpoWtMBD17mBEe2CRcZFncGCCN27kQwsoythXYn5JJwxsvYmj2CfW7vR90fBREvVD1esdXHSu-86_ASpOZUfN4j-i3vyKyXk4AxMx9aSjw7im_21Siv-LahFAcuaYk-YKY91xE4mWV/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1kigpoWtMBD17mBEe2CRcZFncGCCN27kQwsoythXYn5JJwxsvYmj2CfW7vR90fBREvVD1esdXHSu-86_ASpOZUfN4j-i3vyKyXk4AxMx9aSjw7im_21Siv-LahFAcuaYk-YKY91xE4mWV/s1600/07.png" /></a></div>
<br />
En la pestaña <i>Pens </i>podemos seleccionar y configurar la visualización de hasta ocho variables simultáneas, ya sean analógicas o digitales. Podemos cambiar el color, ancho y tipo de línea, si son analógicas o digitales, y el rango de representación. Este último valor es importante para tener una buena representación. Si nuestra variable es digital oscilará entre 0 y 1, pero para obtener una buena representación yo configuro en <i>Min </i>-0.1 y en <i>Max </i>1.1. Para variables analógicas es bueno dar un poco de margen por arriba y por debajo para que las líneas de la rejilla no tapen parte de nuestra gráfica.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifisc4HrEYDkK6cwI1KFenwKDYBnXm1alA40ekuNbecfjCJXDy75qfaPyv-J9Szawu-B4ONwTIdXUk9PGr54oqDja8LkYnwXBUy2WlNX0eRX4nVYfDkdVQa36UtLA4hS_ma9l8TuO7tz78/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifisc4HrEYDkK6cwI1KFenwKDYBnXm1alA40ekuNbecfjCJXDy75qfaPyv-J9Szawu-B4ONwTIdXUk9PGr54oqDja8LkYnwXBUy2WlNX0eRX4nVYfDkdVQa36UtLA4hS_ma9l8TuO7tz78/s1600/08.png" /></a></div>
<br />
En la pestaña <i>X-Axis</i> configuraremos el eje horizontal de visualización. Lo más significativo aquí es <i>Time Span</i> que es el tiempo parcial de la gráfica que se visualizará y la rejilla (<i>grid</i>). Para mi ejemplo he puesto una visualización de 20 segundos con nueve divisiones principales verticales (que dan lugar a diez tramos de dos segundos) más una división intermedia.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnxrjPN7EGJl4tVg80NbZb4TDLFZWQZHkqpRnX4buk1rgIQVUm6hD8RF68RZ9ZHmmx-ZN1hAHNcGGb86dBy4T9sbpoFZDGG3-Nl67On-ypETWQXbv9AJowgdGHQljqPRtbzSgl5_8SdPMb/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnxrjPN7EGJl4tVg80NbZb4TDLFZWQZHkqpRnX4buk1rgIQVUm6hD8RF68RZ9ZHmmx-ZN1hAHNcGGb86dBy4T9sbpoFZDGG3-Nl67On-ypETWQXbv9AJowgdGHQljqPRtbzSgl5_8SdPMb/s1600/09.png" /></a></div>
<br />
En la siguiente pestaña <i>Y-Axis</i> se configura el eje vertical. Podemos seleccionar como límites de representación (valores máximos y mínimos) los que calcule el <i>trend </i>automáticamente (<i>Automatic</i>), los que hayamos especificado individualmente para cada variable en la pestaña <i>Pens</i> (<i>Preset</i>) o usar los mismos límites para todas las variables (<i>Custom</i>). En <i>Display Options</i>, si marcamos <i>Isolated graphing</i> se dividirá la pantalla horizontalmente para representar individualmente cada variable. En caso contrario todas las variables se solaparán.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg87cconRUVYbR-23PDgPIsUzFk81v8TBhArCOwFlmMPWNHMzXZUrR46HbmYPoRjzoAQwXxmGJO56QKPFpJcYmh_IbOzYZatcpRl2BxqEU3H0778_tzESDAkCsBT4-SqayLhXR_BayC0vuN/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg87cconRUVYbR-23PDgPIsUzFk81v8TBhArCOwFlmMPWNHMzXZUrR46HbmYPoRjzoAQwXxmGJO56QKPFpJcYmh_IbOzYZatcpRl2BxqEU3H0778_tzESDAkCsBT4-SqayLhXR_BayC0vuN/s1600/10.png" /></a></div>
<br />
En la pestaña <i>Sampling </i>definiremos el muestreo. Se especificará el tiempo entre cada adquisición de datos y la cantidad de datos a obtener, ya sea indicando directamente el número de muestras (<i>Samples</i>), el tiempo máximo de adquisición (<i>Time period</i>) o sin más límite que el espacio que tengamos en el disco duro (<i>No limit</i>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZgNa7Kv__Q7JoSGXIsnyfwMUrdRlewDgQwOLOw-MNgL-X3myCiAe6yAvZCKC_mwi3tLNzVSF7WxAN75ExFuMy4DkYMlil8V4X3AzEtwRqP455GPvMS3g2tbtfPp0mmbeEF3DpjX0h-uoA/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZgNa7Kv__Q7JoSGXIsnyfwMUrdRlewDgQwOLOw-MNgL-X3myCiAe6yAvZCKC_mwi3tLNzVSF7WxAN75ExFuMy4DkYMlil8V4X3AzEtwRqP455GPvMS3g2tbtfPp0mmbeEF3DpjX0h-uoA/s1600/11.png" /></a></div>
<br />
Finalmente en las dos últimas pestañas configuraremos los disparos (<i>trigger</i>) de inicio y fin de captura. En el ejemplo siguiente he puesto que la captura se inicie cuando el valor de SIGNAL_1 supere el valor cero. En el caso de seleccionar <i>No Trigger</i> el disparo deberemos iniciarlo manualmente pulsando el botón <i>Run </i>del <i>Trend</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaCTkOsKYtufTxX096HgVj82iLwu8cYqgPjyriLQepoQAhUnI2rrqbnJg1s2Blum0caAm-B__HB77pSkvRqbp9T58WjRyrdAr_9NkKq3tx5SiYpkNieCoWJ9MaEbXy86GiJbMmL5bXNfQG/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaCTkOsKYtufTxX096HgVj82iLwu8cYqgPjyriLQepoQAhUnI2rrqbnJg1s2Blum0caAm-B__HB77pSkvRqbp9T58WjRyrdAr_9NkKq3tx5SiYpkNieCoWJ9MaEbXy86GiJbMmL5bXNfQG/s1600/12.png" /></a></div>
<br />
Con nuestro <i>Trend </i>configurado ya solo tenemos que ponernos en línea con el PLC y pulsar <i>Run </i>para iniciar una captura de datos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVoCiFvBnltcnWqCn_FxvibXt3S1PmRQOAmq6oBSkl5qaeqjguIuPgjHvEOAusmuaVcaRk5p9aQ2QxSvU3bJph-1RJg0pu1obLJp-ogzpsP676tHR7yetsWc-ame8LqMCFYniRFNJO3VxZ/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVoCiFvBnltcnWqCn_FxvibXt3S1PmRQOAmq6oBSkl5qaeqjguIuPgjHvEOAusmuaVcaRk5p9aQ2QxSvU3bJph-1RJg0pu1obLJp-ogzpsP676tHR7yetsWc-ame8LqMCFYniRFNJO3VxZ/s640/13.png" width="640" /></a></div>
<br />
Aquí podemos ver la captura y representación de ocho señales digitales como si fuese un analizador lógico:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9jQkx5a7AYmX6gZbDdrkv8NschlhhqZpSdfH5-sy4TacCN3_eWYR-tKfFIFraYRLoPt5Ex0GMJYr6Zo_7Yfx29Yhy0eWodn0apw2yWogNBQ5J01hhp6ZnL5gxw3v_PEAY6oP92YLq80WP/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9jQkx5a7AYmX6gZbDdrkv8NschlhhqZpSdfH5-sy4TacCN3_eWYR-tKfFIFraYRLoPt5Ex0GMJYr6Zo_7Yfx29Yhy0eWodn0apw2yWogNBQ5J01hhp6ZnL5gxw3v_PEAY6oP92YLq80WP/s640/14.png" width="640" /></a></div>
<br />
Los <i>Trends </i>no solo están disponibles en RSLogix. Si en nuestra aplicación disponemos de un <a href="http://es.wikipedia.org/wiki/Interfaz_de_usuario">HMI </a>como <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/1239781/1670480/1681260/">Panelview</a>, <a href="http://www.actors-solutions.net/Panel-PC-VersaView">Versaview</a> o similar, podremos representar <i>Trends</i> en ellos, dejando permanentemenete disponible una útil herramienta de diagnosis.<br />
<br />
Para incluir un <i>Trend </i>en una pantalla debemos usar el objeto <i>Trends </i>del panel de objetos de <a href="http://www.rockwellautomation.com/rockwellsoftware/performance/view/viewstudio.html">Factory Talk Studio</a>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6aSdMjCf5CHp_RgjVF5wyVehMRwGlH11Y2ropR9aKpjHgU15jfK_9TNFV8h4RTkMzs2tcFBLp8nHbig6DRZUdx7U32vUF0pz4yxkXBsOwoPipcsQ5p8fyaEnB7V04ulsBVlcvFZjUIvch/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6aSdMjCf5CHp_RgjVF5wyVehMRwGlH11Y2ropR9aKpjHgU15jfK_9TNFV8h4RTkMzs2tcFBLp8nHbig6DRZUdx7U32vUF0pz4yxkXBsOwoPipcsQ5p8fyaEnB7V04ulsBVlcvFZjUIvch/s1600/20.png" /></a></div>
<br />
Es una versión simplificada de los <i>Trends </i>de RSLogix. Las señales a visualizar las tendremos que enlazar en la pestaña <i>Connections</i>, configurándose el resto de pestañas de forma muy similar que lo visto anteriormente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2a10vqsU5xMeP73DH3qdwXbGNlzC-2_dvneASD6jtEy-dKDNkZG2u_Ttn3aws4yQA5m2yurEtSY9f8VmqJNtZo-9JdCXv09iYSuPQm3BnHYAdLou2bzJ7gneB6k0Mr7ISO4TXCx0JTJC0/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2a10vqsU5xMeP73DH3qdwXbGNlzC-2_dvneASD6jtEy-dKDNkZG2u_Ttn3aws4yQA5m2yurEtSY9f8VmqJNtZo-9JdCXv09iYSuPQm3BnHYAdLou2bzJ7gneB6k0Mr7ISO4TXCx0JTJC0/s1600/22.png" /></a></div>
<br />
Un <i>Trend </i>de tres variables digitales en un <i>Panelview </i>puede tener un aspecto como el siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUIPOus49JW9OTTDHz127Lso1HRhy4lI2BmXjzaKcbgYZ5HL4dUUek8WZJurmUAotDijB7X0DfMVT8FjQQgzaQk-EOqtloIpvwEPNAUlFqoZmqFG7RckiWat_K1zfm5GdnflRDgg4IKvTy/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="500" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUIPOus49JW9OTTDHz127Lso1HRhy4lI2BmXjzaKcbgYZ5HL4dUUek8WZJurmUAotDijB7X0DfMVT8FjQQgzaQk-EOqtloIpvwEPNAUlFqoZmqFG7RckiWat_K1zfm5GdnflRDgg4IKvTy/s640/21.png" width="640" /></a></div>
<br />
En resumen, los <i>Trends </i>son una magnífica ayuda que me han permitido ahorrar tiempo al diagnósticar problemas en el funcionamiento de mi instalación. Una vez que te acostumbras a usarlos se convierten en imprescindibles. Como punto negativo diré que el zoom de las gráficas es mejorable, a veces pierdes la gráfica y hay que guardarla y volver a abrirla para recuperar la visualización. También se me antoja escaso el límite de ocho variables simultáneas pero nada nos impida tener varios <i>Trends </i>funcionando simultáneamente.<br />
<br />
Como siempre, cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com9tag:blogger.com,1999:blog-226572436930860787.post-62619520694619962252012-04-27T19:50:00.000+02:002012-04-27T19:50:52.273+02:00Comandando variadores Sew Movidrive MDX61B a través de DeviceNetRecientemente he tenido que poner en marcha unos <a href="http://es.wikipedia.org/wiki/Variador_de_frecuencia">variadores</a> <a href="http://www.sew-eurodrive.es/produkt/variador-vectorial-movidrive-b.htm">Sew Movidrive MDX61B</a> para comandar unos motores acoplados a husillos, para realizar movimientos de traslación y elevación en una máquina. Para este uso la configuración que hay que hacer es muy sencilla, lejos de las posibilidades que se le pueden exprimir a estos variadores: <a href="http://es.wikipedia.org/wiki/Control_vectorial">control vectorial</a> o <a href="http://en.wikipedia.org/wiki/Servo_drive">modo servo</a>. Como van a estar integrados en una red <a href="http://es.wikipedia.org/wiki/DeviceNet">DeviceNet</a>, les he instalado la correspondiente tarjeta de comunicaciones DFD11B. En estas notas voy a resumir los pasos que he dado para comandarlo desde un PLC <a href="http://ab.rockwellautomation.com/Programmable-Controllers/CompactLogix">CompactLogix</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicHnCltNXPH9pjh8Nxojt7e_90Pog5b0vUo75XbQafg-ly5em1whuM2nOT8u_-cCy4tWAIkE9j82IBcbX7K3c6DDHDOjQERHKsX-CWk4z2q5T1Bl8XSIGLOKKfJi4_UD7UkZUU6hDboTPR/s1600/VAR.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicHnCltNXPH9pjh8Nxojt7e_90Pog5b0vUo75XbQafg-ly5em1whuM2nOT8u_-cCy4tWAIkE9j82IBcbX7K3c6DDHDOjQERHKsX-CWk4z2q5T1Bl8XSIGLOKKfJi4_UD7UkZUU6hDboTPR/s1600/VAR.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Variadores Sew Movidrive MDX61B (perdón por la calidad de las fotos)</td></tr>
</tbody></table>
La instalación de los variadores está bien explicada en el completo<a href="http://www.sew-eurodrive.es/support/documentation_result.php?gruppen_id=A43"> manual de instrucciones de funcionamiento</a> (en español). Si seguimos sus recomendaciones no tendremos la más mínima complicación, así que me voy a centrar en la manera en la que los he configurado.<br />
<br />
La tarjeta de comunicaciones DFD11B tiene una serie de interruptores DIP para configurarla. Con ellos le asignaremos una dirección de nodo en la red DeviceNet (interruptores NA), la velocidad de comunicación (interruptores DR) y la longitud de los datos que se transmitirán (interruptores PD). En mi caso tengo tres variadoes que les he asigando las direcciones 10, 15 y 20. La velocidad de comunicación la he fijado en 250 kbps y he asignado un 3 a los datos de proceso.<br />
<br />
<a name='more'></a>Alimento el variador y para parametrizarlo tengo una consola de programación DGB60B, que se conecta a través de un conector RJ10 y permite hacer la puesta en marcha, modificar parámetros, diagnósticos, etc. También existe la opción de conexión a PC a través de adaptador USB11A que nos permitirá hacer esto mismo desde un PC con el software <a href="http://www.sew-eurodrive.es/support/software_result.php?woher=software_result&software_searchword=***All***&software_produkt=A43&software_gruppe=15&software2=Buscar">Movitools MotionStudio</a> (incluido con el adaptador). Si vamos a tener muchos variadores resulta interesante ya que nos ahorrará tiempo en la parametrización y tiene un coste bajo (unos 60 €).<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrr-P0CHTYfyl23Ll0jkzVYyIEWnHJqTA_1Mc0KQLlNKXh57wZfunIKOnl8c2_oNxcEQFgZRF6EfNlBGzgdY4WSXGn2E2C1NmfyhvNQD7JPObFVr1RYUni7u32lhchsYIq1ErE6sfONbCM/s1600/CONS.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrr-P0CHTYfyl23Ll0jkzVYyIEWnHJqTA_1Mc0KQLlNKXh57wZfunIKOnl8c2_oNxcEQFgZRF6EfNlBGzgdY4WSXGn2E2C1NmfyhvNQD7JPObFVr1RYUni7u32lhchsYIq1ErE6sfONbCM/s320/CONS.jpg" width="198" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Consola de programación DGB60B</td></tr>
</tbody></table>
La consola es muy sencilla de usar. Tiene un botón para seleccionar el idioma y ponerla en español. Lo primero que voy a hacer es la puesta en marcha, que es básicamente decirle los datos de red y del motor. Si el motor es Sew, probablemente ya vengan sus datos en la consola, con lo que solo tendremos que indicarle la referencia. Si no es así tendremos que leer en la placa de características la tensión nominal, frecuencia nominal, corriente nominal, factor de potencia y velocidad nominal.<br />
<br />
Una vez realizada la puesta en marcha necesito modificar algunos parámetros. Como vamos a comandar el variador desde DeviceNet, voy a los parámetros <b>P100</b> (fuente de consigna) y <b>P101</b> (fuente de control) y los ajusto a Bus de campo (<i>fieldbus</i>). También debemos deshabilitar los comandos que por defecto tienen las entradas binarias de la 1 a la 7, en los parámetros del <b>P600</b> al <b>P606</b> seleccionaremos <i>Sin función</i>. La entrada digital 0 está asignada al desbloqueo del regulador y es imperativo cablearla por razones de seguridad. Si las rampas de aceleraciones que vienen configuradas por defecto no son apropiadas para nuestra aplicación, en los parámetros <b>P130</b> al <b>P133</b> podremos ajustarlas.<br />
<br />
La configuración necesaria en el variador ya la tengo lista, ahora tengo que configurar la comunicación con mi PLC. El primer paso será registrar el fichero <i>SEW_MOVIDRIVE_DFD11B.eds</i> incluido en el CD que vino con la documentación (descargable <a href="http://www.sew-eurodrive.es/download/soft/SEW_EDS-DN_DFD11B_V2-0.zip">aquí</a>). Así, al ponernos <i>on-line</i> con el RSNetworx aparecerán nuestros variadores como nodos de la red DeviceNet.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhiRTU4NCJweL_HqnGhrmBqrUJBmJLk9nlSql_WF0QH_xAc8pEGJoH3f1DXcoblT69dhQIMP9PofMkq4vnE-TLUv-Hh6Dl8KgaKv8kZu4x11N8UU3yJUV59ABGTfbN_YPuPKv7YEbI2ayg/s1600/rsnet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhiRTU4NCJweL_HqnGhrmBqrUJBmJLk9nlSql_WF0QH_xAc8pEGJoH3f1DXcoblT69dhQIMP9PofMkq4vnE-TLUv-Hh6Dl8KgaKv8kZu4x11N8UU3yJUV59ABGTfbN_YPuPKv7YEbI2ayg/s1600/rsnet.png" /></a></div>
<br />
Si hacemos doble clic sobre cualquiera de ellos accederemos a su ventana de configuración.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6LbiTaKVzoZy0i2f9tBqOOVjMQZiFuIAKoJ91aIrQ1pGQj7pccbtK50CBYr6N5y97zzPNOviIP-B95JAvJ4WZZfhyphenhyphenctRcS9dYlvT_OOocBoJy7DEl3NEYSV1ptPpN30laQEhsYJWO8JSL/s1600/r02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6LbiTaKVzoZy0i2f9tBqOOVjMQZiFuIAKoJ91aIrQ1pGQj7pccbtK50CBYr6N5y97zzPNOviIP-B95JAvJ4WZZfhyphenhyphenctRcS9dYlvT_OOocBoJy7DEl3NEYSV1ptPpN30laQEhsYJWO8JSL/s1600/r02.png" /></a></div>
<br />
Podemos comprobar como la fuente de consigna (<i>setpoint source</i>) y la fuente de control (<i>control source</i>) están asignados al bus de campo (<i>fieldbus</i>), pues previamente los habíamos configurado con la consola, aunque también podríamos haberlo hecho desde aquí. La configuración PD la he dejado por defecto, pero en PO1, PO2, PO3 y PI1, PI2, PI3 podríamos cambiar los datos que se intercambiarían en la comunicación con el PLC. De fábrica, en PO1 tenemos la palabra de control donde irán las órdenes con las que comandaremos el variador y en PO2 la consigna de velocidad, dejando libre PO3. En PI1 tenemos la palabra de estado, para saber qué está pasando en nuestro variador, en PI1 la velocidad real que está aplicando el variador al motor y en PI3 la corriente aparente que consume el motor.<br />
<br />
En la pestaña <i>I/O Data</i> podemos ver el tamaño de datos que puede transmitir el variador en la red, dependiendo de la configuración PD, y la política de transmisión <i>Polled</i>. En mi caso el tamaño es de 20 bytes, tanto de entradas como de salidas, aunque solo usaré los seis primeros de cada.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNQ0_F4Unwbu_92D_LmgokBsJoUYlpecQLDIztadIqVyRmwe0P6E8-0IhKQrPIUrKRbBpq7HihPQvl2_wEZSKqfS8YBsyyUpq-gqoLsl_lIhApF970pCjMzrEs47uA5bHn_Np-MqXKlVi/s1600/r03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNQ0_F4Unwbu_92D_LmgokBsJoUYlpecQLDIztadIqVyRmwe0P6E8-0IhKQrPIUrKRbBpq7HihPQvl2_wEZSKqfS8YBsyyUpq-gqoLsl_lIhApF970pCjMzrEs47uA5bHn_Np-MqXKlVi/s1600/r03.png" /></a></div>
<br />
Abrimos la configuración del escáner maestro de nuestra red y nos aseguramos que nuestros variadores estén mapeados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzapX97TTQopNCO6f5DLP6p8v1nrYuj_VfoCiJbaJtQx8tVB0ZLwYUg1gLyVYXF4M-3Xa3Fm21wjUoGlvbmw2b9UXnqGVWC1YGGKDcgoUmaoth2GhNr6VfaktUsVL0GNwoyZEGu2VPbJzl/s1600/r04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzapX97TTQopNCO6f5DLP6p8v1nrYuj_VfoCiJbaJtQx8tVB0ZLwYUg1gLyVYXF4M-3Xa3Fm21wjUoGlvbmw2b9UXnqGVWC1YGGKDcgoUmaoth2GhNr6VfaktUsVL0GNwoyZEGu2VPbJzl/s1600/r04.png" /></a></div>
<br />
En las pestañas <i>Input </i>y <i>Output </i>podemos comprobar en qué zonas de memoria nos vendrán los datos de los variadores en la tabla de datos del escáner DeviceNet.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit_ZheFvLZweoq3JRvWi0GDhpxh-0YgMDxEYq6S8Pi6zx4n3Eh2IWPgpIKrxgKkmzJOCiXGos8D6THBq1CfSqEQf3oJnpgAfleJRmqonM5JcoQLD-4pkUjUkXcYNDp4GgZZ6jy22TMqgEF/s1600/r05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit_ZheFvLZweoq3JRvWi0GDhpxh-0YgMDxEYq6S8Pi6zx4n3Eh2IWPgpIKrxgKkmzJOCiXGos8D6THBq1CfSqEQf3oJnpgAfleJRmqonM5JcoQLD-4pkUjUkXcYNDp4GgZZ6jy22TMqgEF/s1600/r05.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieqS47X8Nyff3VYaH3MzygCDUFSFmU6iYqZZSNilw8dH7dNnYeSv0XsHHOV1uP42n9BIWv4VxJM06qKCVuTUaVTB80SqhzhOg14ijS5YYANOi-6Nk7CyFhHi2n6r0VTYxzkACq9e1UHXhD/s1600/r06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieqS47X8Nyff3VYaH3MzygCDUFSFmU6iYqZZSNilw8dH7dNnYeSv0XsHHOV1uP42n9BIWv4VxJM06qKCVuTUaVTB80SqhzhOg14ijS5YYANOi-6Nk7CyFhHi2n6r0VTYxzkACq9e1UHXhD/s1600/r06.png" /></a></div>
<br />
Para acceder de forma ordenada a los datos del variador he preparado un par de UDT con los datos de entrada y salida desmenuzados:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpVe8eevPEszrUlQvgTtYKy9uhVWf8QWC2duXOZ3UvpcPAARtlOQmueCG8i387l6YEA9UOd26cBZ1Hu4tNe-VUjnE1Ck9m_63DuI2yJJwX00yg1CWBDkiiNpNDj0OKn-kPtvCexq0Di5Sb/s1600/R10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpVe8eevPEszrUlQvgTtYKy9uhVWf8QWC2duXOZ3UvpcPAARtlOQmueCG8i387l6YEA9UOd26cBZ1Hu4tNe-VUjnE1Ck9m_63DuI2yJJwX00yg1CWBDkiiNpNDj0OKn-kPtvCexq0Di5Sb/s1600/R10.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBEYAq8HsMeO1BVdRjamvbl4KVsAL1MShwAsnraj-1RpGgp1Iuo3evxE4Zz5b2C8896TB0u72vhbGlXF2vhErp51OcI0YQPGZciSkxvNHt8QrujoieTldGWFDx8hl4fw3vLoifw3KufN9/s1600/R11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBEYAq8HsMeO1BVdRjamvbl4KVsAL1MShwAsnraj-1RpGgp1Iuo3evxE4Zz5b2C8896TB0u72vhbGlXF2vhErp51OcI0YQPGZciSkxvNHt8QrujoieTldGWFDx8hl4fw3vLoifw3KufN9/s1600/R11.png" /></a></div>
<br />
Declaro una par de tablas de tres elementos con el formato de las UDT anteriores:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1buoCyUMnij9xl1FAyX1OiLnBlqHTzWwNuErzy8VwYCgqnvSV_J9O0PDmhIHiIxiqsFI4WO6jJXmUXYxWCz7ivbD1DbcwUg3WPu5k1H4PghLl2KKdSpzb8xmanxqwDpQpfhiCbSmFFqWl/s1600/r12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1buoCyUMnij9xl1FAyX1OiLnBlqHTzWwNuErzy8VwYCgqnvSV_J9O0PDmhIHiIxiqsFI4WO6jJXmUXYxWCz7ivbD1DbcwUg3WPu5k1H4PghLl2KKdSpzb8xmanxqwDpQpfhiCbSmFFqWl/s1600/r12.png" /></a></div>
<br />
Y los sincronizo con los tags de entradas y salidas del escáner DeviceNet con un par de renglones como los siguientes:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMJmxzLxeN0Szy_Y1bQk4muZ1oY8FXGtjq2giR5-kLZwvp3N08dVMbOrTphW2ZgWxzyVkeXM7npAo9SJ51XCfOBqPI0NAWOa4TngNi4jR96TRMrRh0enelTXTBStDWfPRbMsxnuyBBYG0H/s1600/r13.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMJmxzLxeN0Szy_Y1bQk4muZ1oY8FXGtjq2giR5-kLZwvp3N08dVMbOrTphW2ZgWxzyVkeXM7npAo9SJ51XCfOBqPI0NAWOa4TngNi4jR96TRMrRh0enelTXTBStDWfPRbMsxnuyBBYG0H/s640/r13.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">(Previamente he mapeado la red DeviceNet con la herramienta DeviceNet Tag Generator)</td></tr>
</tbody></table>
De la palabra de control tan solo necesito tres bits, <b>INHIBIT </b>que debe estar a cero para activar el variador, <b>ENABLE_RAPID_STOP </b>que debo poner a uno para que el motor pueda ponerse en marcha y finalmente <b>ENABLE_STOP </b>para arrancar el variador.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8Iq7ch-8ah3FtUSV7mnnlxFz8RLv7g5lLKPtWdIWLEXMubQAncAUwNJmeRO5lWvSerHF0gomYiZUYNh5sQlCd2J_660kivGD6rGjoihc4w_Zr1VfktdQ72eCF5YGWbmJUIIYeW9bVIer/s1600/R14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="353" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8Iq7ch-8ah3FtUSV7mnnlxFz8RLv7g5lLKPtWdIWLEXMubQAncAUwNJmeRO5lWvSerHF0gomYiZUYNh5sQlCd2J_660kivGD6rGjoihc4w_Zr1VfktdQ72eCF5YGWbmJUIIYeW9bVIer/s640/R14.png" width="640" /></a></div>
<br />
Y no olvidar poner un valor de consigna adecuado:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjx1-iE2FQw4o5Dn8J94XFpK0TVrWMRqhRVUYSZ6EO5xVV1YzcRwy2PVBCAyE_EwiTfONeownZ1q4EQPczCRzXykA_BWvE-tu_amhfWnSh7VMuGS7jr2ercg9okMZKCTh7Fp_cbV8ev4Yy/s1600/r15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjx1-iE2FQw4o5Dn8J94XFpK0TVrWMRqhRVUYSZ6EO5xVV1YzcRwy2PVBCAyE_EwiTfONeownZ1q4EQPczCRzXykA_BWvE-tu_amhfWnSh7VMuGS7jr2ercg9okMZKCTh7Fp_cbV8ev4Yy/s640/r15.png" width="640" /></a></div>
<br />
Con esto ya tendría una programación básica de los variadores. Cabría completarla con la configuración de límites de recorrido, visualizaciones de estado, reseteo de fallos, etc.<br />
<br />
En resumen puedo decir que estos variadores funcionan impecablemente. Es la primera vez que trabajo con ellos pero nuestro cliente ya lleva utilizándolos durante años, sin dar ningún problema. La documentación es muy completa y en perfecto español. Tuve que llamar en una ocasión al servicio técnico para resolver una duda y la atención fue rápida y efectiva.<br />
<br />
Como siempre, cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com6tag:blogger.com,1999:blog-226572436930860787.post-72508796066833974192012-04-06T23:59:00.000+02:002012-04-07T00:00:00.143+02:00Mapeando una red DeviceNet en un controlador Logix5000Cuando insertamos un escáner DeviceNet en un proyecto de <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/">RSLogix 5000</a>, en las variables de ámbito del controlador (<i>Controller tags</i>) aparecen tres tags que nos servirán para establecer el diálogo con todos los elementos de la red. <b>Local:1:I</b> se refiere a los datos que leemos de la red,<b> Local:1:O</b> a los datos que vamos a escribir y <b>Local:1:S</b> a variables que nos van a permitir diagnosticar el estado de nuestra red (el 1 después de <b>Local </b>quiere decir que nuestro escáner está en el slot 1 del bastidor).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHYvymENqC-tEG0dnszNaKJnmXZgw2_JJDBiM1py_6uLrXAHrcxJ91ZtYSKf6C8b3O2WLWBeTggkh6vnEp2Iy-nnMdP2Y5G_1BehqmfpF39twnPOzIS4FNx3bXsjf12tjnb3pxbR9cZzmF/s1600/200.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHYvymENqC-tEG0dnszNaKJnmXZgw2_JJDBiM1py_6uLrXAHrcxJ91ZtYSKf6C8b3O2WLWBeTggkh6vnEp2Iy-nnMdP2Y5G_1BehqmfpF39twnPOzIS4FNx3bXsjf12tjnb3pxbR9cZzmF/s1600/200.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: -webkit-auto;">Tags para un escáner DeviceNet 1756-DNB</span>
</td></tr>
</tbody></table>
<div>
Los distintos dispositivos que hayamos configurado en nuestra red se mapearán en <b>Local:1:I.Data</b> para los datos de entrada (lo que leemos de los dispositivos) y en<b> Local:1:O.Data</b> para los datos de salida (lo que vamos a escribir). Estas variables son tablas de tipo DINT de tamaño máximo prefijado para cada tipo de escáner. Por ejemplo, para un escáner <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/um/1769-um009_-es-p.pdf">1769-SDN</a> de la gama CompactLogix tenemos 90 DINT (360 bytes) para entrada y 90 DINT para la salida, y para el escáner <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/rn/1756-rn660_-en-p.pdf">1756-DNB</a> de la gama ControlLogix esta capacidad se amplía a 124 DINT (496 bytes) para la entrada y 123 DINT (492 bytes) para la salida.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr></tr>
</tbody></table>
</div>
<br />
<a name='more'></a>La forma en que vendrán distribuidos los datos de nuestros dispositivos dentro de estas tablas es configurable mediante el software <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rsnetworx/">RSNetWorx for DeviceNet</a>. Para ello voy a hacer un ejemplo sencillo, voy a crear una red en la que voy a colgar un Maxum de 12 entradas y 4 salidas digitales en el nodo 1, un variador PowerFlex 40 en el nodo 2, un CompactBlock de 8 entradas y 8 salidas digitales en el nodo 3 y finalmente un escáner 1756-DNB como maestro en el nodo 0:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1eaWKoceVLduVfKGd6MOXRSz0bR2SmBf__sEl-gUDBlxHqI81rJd8QXLfKc7GPyl7P7wb2L7Fu-24NSbIiBteTbwSYKLrJJjx-CN4_BKIeO-5Rc-iQsUAbytM6oAO6DRjoFKIeHo1E63q/s1600/102.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1eaWKoceVLduVfKGd6MOXRSz0bR2SmBf__sEl-gUDBlxHqI81rJd8QXLfKc7GPyl7P7wb2L7Fu-24NSbIiBteTbwSYKLrJJjx-CN4_BKIeO-5Rc-iQsUAbytM6oAO6DRjoFKIeHo1E63q/s1600/102.png" /></a></div>
<br />
Haciendo doble clic en cada uno de nuestros elementos podremos acceder a su configuración. Por ejemplo, si hacemos doble clic sobre el Maxum nos aparecerá información relevante sobre el mismo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfBz6R5Q2ikrtEiRiUM3_WmYr0ZtqRdhYWqlNMQlOG-CZkjtloX8SwgdqbArDurK0ljrmj-CcJGRF-uLQrZvMhPnkccQk8VZffWSt-luo9tcMULwK9UiwNmKy-jRTuNZ8tPCPkgvOEpoa/s1600/103.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfBz6R5Q2ikrtEiRiUM3_WmYr0ZtqRdhYWqlNMQlOG-CZkjtloX8SwgdqbArDurK0ljrmj-CcJGRF-uLQrZvMhPnkccQk8VZffWSt-luo9tcMULwK9UiwNmKy-jRTuNZ8tPCPkgvOEpoa/s1600/103.png" /></a></div>
<br />
En las pestañas de parámetros y configuración podremos comprobar el estado de nuestro módulo, así como realizar la parametrización que deseemos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6j-Zem6mXohfs7IhoYURF-e-F53gYOaWBGzb_BxDd_JbM_2wlwC9koz4zNmy9tNWLw8NF7QdR9IY6nIuykX0LH7WxTWayoBKxIoRHWOalhHYj0bRn2H4PIZ1wro8b_TZ-OnVqV7HmICuO/s1600/104.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6j-Zem6mXohfs7IhoYURF-e-F53gYOaWBGzb_BxDd_JbM_2wlwC9koz4zNmy9tNWLw8NF7QdR9IY6nIuykX0LH7WxTWayoBKxIoRHWOalhHYj0bRn2H4PIZ1wro8b_TZ-OnVqV7HmICuO/s1600/104.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUUCHo9ku9VQc2YiXa8-YoCFSIx2pnc59Lj5L1DF-f3-6K9u6ejQ3Kr_46aBMF1YLgz1exHBCOAL700lBNnK9UyxW_IX96jvgNptNF2NZ1rBHE5WgpjXiR9LJ1u444AA0tv_kYw_GN7LwA/s1600/105.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUUCHo9ku9VQc2YiXa8-YoCFSIx2pnc59Lj5L1DF-f3-6K9u6ejQ3Kr_46aBMF1YLgz1exHBCOAL700lBNnK9UyxW_IX96jvgNptNF2NZ1rBHE5WgpjXiR9LJ1u444AA0tv_kYw_GN7LwA/s1600/105.png" /></a></div>
<br />
En cuanto al mapeado, la pestaña más interesante es la titulada <i>I/O Data</i>, ya que nos ofrece información sobre la cantidad de datos que va a consumir nuestro dispositivo y la forma en que van a ser transmitidos. En el caso del Maxum se enviará 1 byte y se recibirán 4. No todos los dispositivos traen esta información.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4_LEVk9HMhxjwEeCEPm1qYylfjwNFvOBJ3vkGCf3m-jP5z5asI7mZQ2vQqBUyeWxN3FDHrHflPkiC0efxll1B74FGO4Z7xwbAWX1bTEdzJe9bWAxCNpK24YfzRzaBcpRSlKKI782Ifozb/s1600/106.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4_LEVk9HMhxjwEeCEPm1qYylfjwNFvOBJ3vkGCf3m-jP5z5asI7mZQ2vQqBUyeWxN3FDHrHflPkiC0efxll1B74FGO4Z7xwbAWX1bTEdzJe9bWAxCNpK24YfzRzaBcpRSlKKI782Ifozb/s1600/106.png" /></a></div>
<br />
El mapeado de datos se realiza en el escáner, para ello hacemos doble clic sobre el mismo y nos aparecerá la ventana de propiedades:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdRazKnHCo72HBcRO7mgOjKap9FfUqSCYUXZvvA2Ue8rSUwDim_mzBP1lYxtTS3yYmchVg061IMf-tBhrE3Cj0Ah0-c2JXQyTEBySc2whgdDkQVxQmjUWWL8bjds1Bvq1NY3BW6e4Zqkeu/s1600/107.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdRazKnHCo72HBcRO7mgOjKap9FfUqSCYUXZvvA2Ue8rSUwDim_mzBP1lYxtTS3yYmchVg061IMf-tBhrE3Cj0Ah0-c2JXQyTEBySc2whgdDkQVxQmjUWWL8bjds1Bvq1NY3BW6e4Zqkeu/s1600/107.png" /></a></div>
<br />
Vamos a la pestaña <i>Scanlist</i> y podremos ver nuestros dispositivos disponibles:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimqN4MIdJnqWRT8CRbjqyk8rUcjvG1hhXCcCH91Nz454HqnSwbxTZx_W0mRQc4PDCElktMcSRuWQiDq1qT3_Ejr7N95Xda4DnpVQPL-EclpSxnVl9H3ZoWC2N99WEUzSoFNbBhN-SMbBZd/s1600/108.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimqN4MIdJnqWRT8CRbjqyk8rUcjvG1hhXCcCH91Nz454HqnSwbxTZx_W0mRQc4PDCElktMcSRuWQiDq1qT3_Ejr7N95Xda4DnpVQPL-EclpSxnVl9H3ZoWC2N99WEUzSoFNbBhN-SMbBZd/s1600/108.png" /></a></div>
<br />
El <i>Scanlist </i>es una lista de dispositivos cuyos datos se transmitirán por la red DeviceNet. El orden en el que introduzcamos los dispositivos es importante, pues determinará dónde irán colocados sus datos en las tablas que leeremos en el controlador. No me complico y dispongo los dispositivos por el número de nodo (lo más lógico).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8-3TzJnuKWu1Lsjv5rUTlIXpaYuXa0hRhpq0Zpdhi6eMFE-WtdSHQtCtHTCQZtfhD9Vfy1OsUmrTs_xGQtP66VccKLHTV7DjlZOpNAExvKb1ADl5uWEvx6WQZHfFmJ1OpEX2jncjWEzNZ/s1600/109.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8-3TzJnuKWu1Lsjv5rUTlIXpaYuXa0hRhpq0Zpdhi6eMFE-WtdSHQtCtHTCQZtfhD9Vfy1OsUmrTs_xGQtP66VccKLHTV7DjlZOpNAExvKb1ADl5uWEvx6WQZHfFmJ1OpEX2jncjWEzNZ/s1600/109.png" /></a></div>
<br />
Si seleccionamos un dispositivo de la <i>Scanlist</i> y pulsamos sobre el botón<i> Edit I/O Parameters...</i> podremos modificar la cantidad de datos que ocupará el dispositivo en la red. Lo normal es dejar el tamaño que traen por defecto, ya que suele venir especificado en el <a href="http://www.rockwellautomation.com/resources/eds/">EDS</a>. Sin embargo puede que nuestro dispositivo no tenga asignado tamaños para los datos de entrada / salida y tengamos que ser nosotros quienes los introduzcamos a mano.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqEZ9em2MBdgzwoAWog6GAANvmtYpk_SeRW9_MrEmdZFh2i3Z6orKvT_HNfRWK5CcOyf6P7crSYeRuHy5gwf2qKr4GXIEMo6O4jkASfgaSWJr-pWNyQS_yURrkL0aUA7x72e_lHH4aVT3u/s1600/110.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqEZ9em2MBdgzwoAWog6GAANvmtYpk_SeRW9_MrEmdZFh2i3Z6orKvT_HNfRWK5CcOyf6P7crSYeRuHy5gwf2qKr4GXIEMo6O4jkASfgaSWJr-pWNyQS_yURrkL0aUA7x72e_lHH4aVT3u/s1600/110.png" /></a></div>
<br />
Una vez creada nuestra <i>Scanlist</i> podemos ir a las pestañas <i>Input </i>y <i>Output</i> para ver dónde irán ubicados en las tablas que le llegarán al controlador los datos de cada dispositivo. Pulsando sobre cada uno se resaltará en la parte inferior los datos que le corresponden.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfRl_-GxsCV9lUURrlLRJz4IKOfrgeaVKq2M-INLsf-aJTJPv438pjlzOyKcIpaqC3cawtjbqwNrIqvX_XjxvRHwOicQgQ_UcEinI4SUtI0Kh4u8J1DQ2dHA5rbAxLIRHBZO1H5xXqGX3D/s1600/111.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfRl_-GxsCV9lUURrlLRJz4IKOfrgeaVKq2M-INLsf-aJTJPv438pjlzOyKcIpaqC3cawtjbqwNrIqvX_XjxvRHwOicQgQ_UcEinI4SUtI0Kh4u8J1DQ2dHA5rbAxLIRHBZO1H5xXqGX3D/s1600/111.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWln4AjYwJwijIC2yD0LqYkDIKda3X7YY3s3KTJw7Vzm0opamJvz2_DQQQzzHk0LcKmpl94R3oj2RgjUjMKq5VqW7zsFT38rkj-XEA3RO0SOYs1CRVVpo3iAigO8hsR5pD5GB09B90tosH/s1600/112.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWln4AjYwJwijIC2yD0LqYkDIKda3X7YY3s3KTJw7Vzm0opamJvz2_DQQQzzHk0LcKmpl94R3oj2RgjUjMKq5VqW7zsFT38rkj-XEA3RO0SOYs1CRVVpo3iAigO8hsR5pD5GB09B90tosH/s1600/112.png" /></a></div>
<br />
Con lo visto hasta ahora ya sabemos dónde leer y escribir para acceder a nuestros dispositivos, pero tener los datos dentro tablas de DINT no es la mejor manera de tratar con ellos. Para facilitarnos el trabajo, Rockwell tiene disponible una herramienta llamada <i>DeviceNet Tag Generator</i> disponible <a href="http://www.software.rockwell.com/support/download/detail.cfm?ID=3628">aquí</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFZvTLWITCGOR0KFriiCVsq6RRJmkPGHYq_F31Oaa4-dgT90g6-7qI8sR0KpJb1omDPq-sgENSqeUBGySne9XUEZ5GchqHH4U5uPYHZ_MPuJKdE_zvEkKK-95V3Bx8fd7BFeBS1GChku5m/s1600/201.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFZvTLWITCGOR0KFriiCVsq6RRJmkPGHYq_F31Oaa4-dgT90g6-7qI8sR0KpJb1omDPq-sgENSqeUBGySne9XUEZ5GchqHH4U5uPYHZ_MPuJKdE_zvEkKK-95V3Bx8fd7BFeBS1GChku5m/s1600/201.png" /></a></div>
<br />
Lo que hace es leer la configuración asociada a un escáner de nuestro proyecto de RSLogix5000 y generar una serie de tags relativos a cada dispositivo y unas rutinas donde irá separando los datos para cada dispositivo. Esta herramienta ahorra mucho trabajo pero debemos tener cuidado. Antes de usarla es recomendable hacer una copia de seguridad de nuestro proyecto ya que le va a realizar modificaciones. También debemos estar seguros de tener la configuración de red definitiva, ya que si la cambiamos y volvemos a generar los tags puede algunos cambien de nombre (sobre todo si hemos alterado algún número de nodo).<br />
<br />
Como siempre, cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com4tag:blogger.com,1999:blog-226572436930860787.post-62720165894644195192012-03-29T17:18:00.000+02:002012-03-29T17:22:57.805+02:00Unas notas sobre redes DeviceNetRecientemente he estado trabajando en instalaciones donde he tenido que poner a punto varias redes <a href="http://es.wikipedia.org/wiki/DeviceNet">DeviceNet</a>. Esta entrada es una recopilación de las acciones que he tenido que realizar, así como de las dificultades que surgieron y cómo las he solucionado.<br />
<br />
DeviceNet es un bus de campo desarrollado por <a href="http://ab.rockwellautomation.com/">Allen-Bradley</a> basado en el estándar <a href="http://en.wikipedia.org/wiki/Controller_Area_Network">CAN</a> (<i>Controller Area Network</i>). Físicamente se compone de cuatro o cinco hilos de color rojo (CAN_V+), negro (CAN_GND), azul (CAN_HIGH), blanco (CAN_LOW) y, opcionalmente, la malla de color verde (CAN_SHLD). El cableado puede tener una longitud de 100, 250 o 500 metros, dependiendo inversamente de la velocidad de comunicación (500, 250 o 125 kbps) y del tipo de cable que usemos. En cada red DeviceNet se pueden colocar hasta un máximo de 64 nodos (numerados del 0 al 63). El protocolo DeviceNet da mayor prioridad a los nodos con una numeración más baja.<br />
<br />
El modo de funcionamiento más habitual es maestro/esclavo con un único maestro por red, aunque puedan coexistir varios o establecerse comunicaciones de igual a igual (peer to peer). Entre los cables rojo y negro deberemos suministrar alimentación de 24 V. Es importante que provenga de una fuente de alimentación de calidad y es muy recomendable que usemos una fuente independiente para alimentar el bus. Esta misma alimentación puede usarse para alimentar dispositivos en el bus de campo (finales de carrera, detectores de proximidad, fotocéluas, etc).<br />
<br />
El sistema de cableado DeviceNet usa una topología de línea de troncal/línea de derivación:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpGB4bqrP6tNnvmY6qv2gnaIaNFKVSnDUVRfL0lKb_FcuRtezQIsg1IVhomrHIsFiAjo0omxjhyQhFu9sBD03zh7j0SInkcdNHT2nh7SxR-peMr5XfLXO0YLze38lkRCCpb9DhZqeHoxnw/s1600/10.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpGB4bqrP6tNnvmY6qv2gnaIaNFKVSnDUVRfL0lKb_FcuRtezQIsg1IVhomrHIsFiAjo0omxjhyQhFu9sBD03zh7j0SInkcdNHT2nh7SxR-peMr5XfLXO0YLze38lkRCCpb9DhZqeHoxnw/s1600/10.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small; text-align: -webkit-auto;">Imagen sacada del <i>Manual de planificación e instalación DeviceNet</i> de Allen-Bradley</span></td></tr>
</tbody></table>
<br />
<a name='more'></a>Deberemos colocar una resistencia de terminación de 120 ohmios, 5 % o más, o de 121 ohmios, 1 %, 1/4 W, en cada extremo del cable troncal, entre los conductores azul (CAN_HIGH) y blanco (CAN_LOW) del cable DeviceNet. No he visto ningún dispositivo que viniese con las resistencias incorporadas y ello es debido a que las especificaciones DeviceNet recomiendan expresamente que no lo hagan. Asimismo deberemos respetar las recomendaciones de instalación recogidas en el <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/um/dn-um072_-es-p.pdf">Manual de planificación e instalación de sistema de cables DeviceNet</a> [PDF], que deberá ser nuestro manual de referencia.<br />
<br />
Aunque DeviceNet está pensada para soportar entornos ruidosos, es conveniente tener la precuación de separar, en lo medida de lo posible, el cableado de posibles fuentes de ruido electromagnético.<br />
<br />
En las redes que he tenido que configurar siempre he tenido la misma estructura, línea troncal con varias derivaciones, un maestro con el número de nodo 0 y varios dispositivos del tipo <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416243/2877322/Communication-Adapter-Modules.html">ArmorPoint </a>, <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416241/203435/Digital-I-O-Base-Blocks.html">CompactBlock</a>, <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416243/1513475/print.html">ArmorBlock MaXum I/O</a> e incluso variadores de frecuencia <a href="http://ab.rockwellautomation.com/Drives/PowerFlex-40">PowerFlex 40</a> de Rockwell o<a href="http://www.sew-eurodrive.es/produkt/variador-vectorial-movidrive-b.htm"> MoviDrive</a> de Sew.<br />
<br />
Como maestros he usado tarjetas escáner DeviceNet <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/360807/1837522/tab5.html">1756-DNB</a> cuando el PLC era un ControlLogix y <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/407648/7921606/Introduction.html">1769-SDN</a> cuando el PLC era de la gama CompactLogix. Los escáner DeviceNet se "apropian" de los esclavos y estos solo pueden "obedecer" a un maestro.<br />
<br />
Los escáner DeviceNet ofrecen la posibilidad de actualizar el firmware. En mi caso, el cliente para el que trabajamos tiene homologadas versiones de firmware específicas. El proceso de actualización es muy similar al de actualizar el firmware de un PLC, utilizándose la misma herramienta <a href="http://support.rockwellautomation.com/ControlFlash/">ControlFLASH</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNm7VTNpVkzbBxmrhGNnC09QH54EnFSeRNGMaeZVMoc-dmB1nTJd30M5LsiD-n0wV0OGguhleS5aWXIL6ITjNyeQyKhqHz-WnG77zDj5NYlKU0YcCVRtkbxXQgX0qQhkNOXVxlHYfELcM/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiNm7VTNpVkzbBxmrhGNnC09QH54EnFSeRNGMaeZVMoc-dmB1nTJd30M5LsiD-n0wV0OGguhleS5aWXIL6ITjNyeQyKhqHz-WnG77zDj5NYlKU0YcCVRtkbxXQgX0qQhkNOXVxlHYfELcM/s1600/11.png" /></a></div>
<br />
También es importante tener registrados los <a href="http://www.rockwellautomation.com/resources/eds/">ficheros EDS</a> adecuados para cada elemento de la red, incluidos los escáner. Me sucedió que un escáner 1769-SDN no daba señales de vida incluso actualizándole el firmware, problema que quedó resuelto al <a href="http://au.rockwellautomation.com/applications/gs/ap/gsau.nsf/pages/Solving_Communication_Issues_between_RSLinx_Software_and_CompactLogix_controllers">actualizar el EDS</a>. Los EDS (<i>electronic data sheet</i>) son un tipo de ficheros que nos proporcionan los fabricates de dispositivos DeviceNet especificando su configuración de red. Es necesario registrarlos en el sistema para que puedan ser identificados en la red y para ello tenemos la herramienta <i>EDS Wizard</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj5euxhSmWbS_8SBrO7EQ4mYPbqzD-p3vQps2HIWNzsJiwkRGUSvbYX4SZE9-zUEcq1MlrxIeCDS4VM0_l3Ha2p6zV3nft1v7QDNBof5M8T_iSyviSLauQTbBqAQNd0CEe_p-UJkzA2_5_/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj5euxhSmWbS_8SBrO7EQ4mYPbqzD-p3vQps2HIWNzsJiwkRGUSvbYX4SZE9-zUEcq1MlrxIeCDS4VM0_l3Ha2p6zV3nft1v7QDNBof5M8T_iSyviSLauQTbBqAQNd0CEe_p-UJkzA2_5_/s1600/12.png" /></a></div>
<br />
A cada nodo de la red le deberemos asignar un número y la velocidad de comunicación. Esta última deber ser única y coincidente para todos los nodos de la red. Le presencia de un nodo con una velocidad mal configurada provocará que no exista comunicación en absoluto. También tendremos problemas si le damos la misma dirección a dos o más dispositivos. Para realizar esta asignación deberemos consultar la documentación de cada dispositivo. Lo habitual es que existan en el propio dispositivo microinterruptores o ruedas numeradas con las que especificar la dirección y velocidad. También es posible encontrarnos dispositivos que acepten únicamente la configuración a través de software u ambas al mismo tiempo. En este último caso colocaremos la selección del número de nodo en 63 o superior y luego, vía el software de configuración de redes <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rsnetworx/">RSNetWorx</a> u otro software específico, asignarle la dirección.<br />
<br />
Los escáner DeviceNet 1769-SDN usados en los PLC CompactLogix solo admiten la posibilidad de configuración software. Para ello disponemos de la aplicación <i>Node Comissioning</i> accesible desde el menú de RSNetWorx <i>Tools -> Node Comissioning...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyAPt1dU2jAiSxktLwBLY1rzOHKSnJVzXKfjhpx8ra1-BN8FeAPhNH9U43Lv31wol3OCqfeUpL-LFqYHh1aXW3g_x9ZmnF547XTAydbiieFNwlY1mV30AdO-i0VJOvRMQ-A9qLMMRGth41/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyAPt1dU2jAiSxktLwBLY1rzOHKSnJVzXKfjhpx8ra1-BN8FeAPhNH9U43Lv31wol3OCqfeUpL-LFqYHh1aXW3g_x9ZmnF547XTAydbiieFNwlY1mV30AdO-i0VJOvRMQ-A9qLMMRGth41/s1600/13.png" /></a></div>
<br />
Ahora debemos asegurarnos que estamos en línea con el PLC y pulsar sobre Browse...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLKtLGYkrk2juqQgYtSP5J0CNXrzPBCLi4kYvGQ3CxrEQFbjOiCbu0WpIXOztrhLBCvuDcgDEGCHtJ3MSQSfrFq9JldqUA2KnI_qiNORx5vbl85cXyXzDTwmNOVm_DFQqdRBU-anqRhKd/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLKtLGYkrk2juqQgYtSP5J0CNXrzPBCLi4kYvGQ3CxrEQFbjOiCbu0WpIXOztrhLBCvuDcgDEGCHtJ3MSQSfrFq9JldqUA2KnI_qiNORx5vbl85cXyXzDTwmNOVm_DFQqdRBU-anqRhKd/s1600/14.png" /></a></div>
<br />
Navegamos por nuestro PLC buscando el escáner DeviceNet y seleccionamos su puerto:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIULmyfzBDleH-cTdktodSZ1EPHO094RDMPJcBjc15dDGXdnuZFU6riyU0brYTaxMaA7EEbRhgHv_foqzcdbtwuoTzTTUkq4Q7qmXSqAEXZArs_P72KlFwyNm-LADwFXxsNOM8WKLkihrw/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIULmyfzBDleH-cTdktodSZ1EPHO094RDMPJcBjc15dDGXdnuZFU6riyU0brYTaxMaA7EEbRhgHv_foqzcdbtwuoTzTTUkq4Q7qmXSqAEXZArs_P72KlFwyNm-LADwFXxsNOM8WKLkihrw/s1600/15.png" /></a></div>
<br />
Ahora solo deberemos asignarle el número de nodo y la velocidad correctas:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrr3GtjhtwOZuUMBw8z0Smk4ygW23Udgh8DjedY0uuHzlNrCoaA6s_WPX58AqVSOKRqKRcL_oJw0x9-oKkVup0jvbSnS1WF1kePxwb-2wRt0kTzr15-elGyl-rlGXPGY65-mz3BD24U9tz/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrr3GtjhtwOZuUMBw8z0Smk4ygW23Udgh8DjedY0uuHzlNrCoaA6s_WPX58AqVSOKRqKRcL_oJw0x9-oKkVup0jvbSnS1WF1kePxwb-2wRt0kTzr15-elGyl-rlGXPGY65-mz3BD24U9tz/s1600/16.png" /></a></div>
<br />
Sin embargo, los escáner 1756-DNB usados en los PLC ControlLogix vienen con ruedas numeradas donde hacer la configuración. Me ha parecido curioso ver como es posible sacar una de estas tarjetas del bastidor en caliente, realizar la configuración y volverla a pinchar, todo ello con el PLC alimentado.<br />
<br />
En otros dispositivos como por ejemplo los CompactBlock solo deberemos especificar el número de nodo mediante ruedas numeradas, la velocidad se configura automáticamente ya que tienen la característica <i>Autobaud</i>.<br />
<br />
Personalmente prefiero la opción de configuración hardware, ya que para sustituir un dispositivo averiado simplemente hay que copiar la posición de los interrupores. Sin embargo la configuración software tiene la ventaja de no tener que acceder físicamente al dispositivo para realizar alguna modificación.<br />
<br />
Cuando tengamos todos nuestros nodos preparados y conectados es momento de alimentar la red DeviceNet. Los escáner vienen con displays que nos darán información de sus estado. Los 1769-SDN tienen dos dígitos que nos indicarán un código numérico para que veamos en la documentación su significado. Los 1756-DNB tienen un display que nos dirá su estado, por ejemplo <i>Bus off detected</i> o <i>No power</i>.<br />
<br />
Cada dispositivo tiene a su vez leds que nos pueden ayudar a su diagnosis:<br />
<ul>
<li>Led verde parpadeante: UNALLOCATED - El dispositivo está correctamente unido a la red, pero ningún maestro (escáner) se ha hecho cargo de él - o TIMED OUT - se han perdido mensajes de comunicación maestro/esclavo.</li>
<li>Led rojo fijo: FAULTED - Se ha producido un error interno en el dispositivo o hay nodos duplicados en la red - o BUSOFF - el dispositivo se ha desconectado de la red debido a errores graves.</li>
</ul>
Durante la puesta en marcha de mis instalaciones se dieron varios fallos. Lo primero que me encontré fue alguna alimentación de 24 V al revés, afortunadamente sin consecuencias graves. También me encontré con que la alimentación de las cabeceras ArmorPoint estaban en cortocircuito. El problema fue que la numeración del conector, comprado también a Rockwell, no coincidía con la numeración en la propia cabecera -no hay que fiarse de las numeraciones de los conectores-. Solventados estos problemas me encontré con que mi red estaba permanentemente en estado BUSOFF. Para ver qué estaba pasando comprobé primero que en los puntos más alejados de la red, entre los cables rojo y negro no había una caída de tensión menor al 5% (22,8 V). Quitando la alimentación, comprobé el valor de resistencia entre los cables azul y blanco, que debe ser de unos 60 Ω (el paralelo de las resistencias de terminación). Luego desconecté todos los nodos -para recuperar la red en estado de BUSOFF es necesario quitar alimentación-. Volví a alimentar y vi que ya no estaba en BUSOFF. Luego fui conectando los nodos uno a uno, hasta que apreció el problemático: resultó ser un Maxum mal conectado. Los Maxum tienen dos conectores, uno para la red DeviceNet y otro para alimentar las salidas digitales, ambos de métrica 12 y estaban intercambiados entre sí.<br />
<br />
Rockwell tiene disponible un manual en español muy útil para realizar la diagnosis de una red DeviceNet titulado <a href="http://rockwellautomation.custhelp.com/ci/fattach/get/8923/1170774207">Guía de Diagnóstico y solución de Problemas para DeviceNet</a> (formato .DOC). Si tienes que trabajar con redes DeviceNet resulta un documento imprescidible.<br />
<br />
Llegados a este punto ya tengo mi red lista para atacarla a nivel software. Aquí deberemos empezar por inspeccionarla con el RSLinx. Si en el RSLinx no aparece ningún nodo es que tenemos un problema de cableado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbQqQfRbvwZSh_OZ6vmX7RIUxugQoiTKCxWylFtIN1Q4EXGqvLyr2zPmHK29n6edEYKoH1Yr9a9NYDIf9M0b8qHsdadJBXaa9FkCvFvHkJYiHYbnLsuatTue5jhMgoEuocyHrr9Oe8A6zS/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbQqQfRbvwZSh_OZ6vmX7RIUxugQoiTKCxWylFtIN1Q4EXGqvLyr2zPmHK29n6edEYKoH1Yr9a9NYDIf9M0b8qHsdadJBXaa9FkCvFvHkJYiHYbnLsuatTue5jhMgoEuocyHrr9Oe8A6zS/s640/17.png" width="640" /></a></div>
<br />
En una siguiente entrada hablaré de cómo acceder desde el PLC a los datos de los dispositivos en DeviceNet.<br />
<br />
Para saber más <a href="http://www.rtaautomation.com/devicenet/">aquí</a> tienes una completa introducción a DeviceNet (en inglés).<br />
<br />
Si te has <i>peleado </i>con redes DeviceNet te agradecería que lo comentases, para ayudar a los que estamos empezando.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com10tag:blogger.com,1999:blog-226572436930860787.post-2191464571538050652012-03-02T13:46:00.001+01:002012-03-02T13:58:47.926+01:00Comunicación por puerto serie a través de DeviceNet: ArmorPoint RS-232 ASCIIEn la <a href="http://notasdeautomatizacion.blogspot.com/2012/02/probando-el-puerto-serie-integrado-en.html">entrada anterior</a> programé la comunicación serie de un lector de códigos de barras con un PLC CompactLogix a través de su puerto serie integrado. Ahora la aplicación ha cambiado y debo hacer la comunicación utilizando una tarjeta <i>ArmorPoint RS-232 ASCII</i> a través de <a href="http://en.wikipedia.org/wiki/DeviceNet">DeviceNet</a>.<br />
<br />
Los <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416243/2877322/Introduction.html">ArmorPoint</a> de Rockwell son módulos de periferia distribuida disponibles para <a href="http://es.wikipedia.org/wiki/Bus_de_campo">buses de campo</a> DeviceNet, ControlNet, EtherNet/IP o Profibus DP. A la cabecera DeviceNet<i> </i>que tengo disponible, referencia <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416243/2877322/Communication-Adapter-Modules.html">1738-ADN18</a>, le voy a acoplar una tarjeta de comunicaciones <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416243/2877322/Specialty-I-O-Modules.html">1738-232ASCM12</a>, que es una versión más robusta de una tarjeta <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/104830/2416241/104832/Specialty-I-O-Modules.html">1734-232ASC</a>, compartiendo la misma electrónica, por ello la documentación de referencia será la de esta última tarjeta: <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/um/1734-um009_-en-p.pdf">POINT I/O ASCII Modules 1734-232ASC, 1734-485ASC (PDF)</a>. El conjunto ensamblado de la cabecera <i>ArmorPoint </i>con mi tarjeta de comunicación serie tiene el siguiente aspecto:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz-gUZVDgKoOCiLQVh9bdmziK75edlrld2nomRA7WCAuxy9NCdCfcEWZhC4vInIOvcBMir7XWC2qEIUlTvPmOhJJfK8bXFvgIzOpDRdvVyAxgd1LZbNDliU1g7x7sKDIvPd-03B_wz8-_n/s1600/1738.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz-gUZVDgKoOCiLQVh9bdmziK75edlrld2nomRA7WCAuxy9NCdCfcEWZhC4vInIOvcBMir7XWC2qEIUlTvPmOhJJfK8bXFvgIzOpDRdvVyAxgd1LZbNDliU1g7x7sKDIvPd-03B_wz8-_n/s1600/1738.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cabecera <i>ArmorPoint</i> con inteface serie sobre mi mesa, lista para hacer pruebas<br />
(disculpad la calidad de las conexiones, a pesar del mal aspecto el conjunto funcionó sin problemas).</td></tr>
</tbody></table>
<a name='more'></a>En conjunto, para hacer mis pruebas, tengo conectado un PLC CompactLogix L35E con una tarjeta escáner de DeviceNet. Entre esta última y la cabecera <i>ArmorPoint</i> coloco un <i>PowerTap</i> referencia <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/214372/1768364/3490957/">1485T-P2T5-T5</a>, que me servirá para alimentar la red. Conecto el cable DeviceNet y en los extremos, entre los cables blanco y azul pondré sendas resistencias de cierre. Para conectar el lector de códigos de barras a la tarjeta de comunicaciones he fabricado chapuceramente un adaptador como el siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDviOt1DB9W1oQYEk9Jf-o3Gv3wtBNw4t4fPEiKBqj8rAlhRxvXmjGtfkIVmlswrdSjZxebAmJOAI09mYi4_u4TDoJWrL3steoATa4tDlPOXGrUpNEAm70mzxd_yD-3uKGhQOd8lkydgqY/s1600/adaptador.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDviOt1DB9W1oQYEk9Jf-o3Gv3wtBNw4t4fPEiKBqj8rAlhRxvXmjGtfkIVmlswrdSjZxebAmJOAI09mYi4_u4TDoJWrL3steoATa4tDlPOXGrUpNEAm70mzxd_yD-3uKGhQOd8lkydgqY/s1600/adaptador.png" /></a></div>
<br />
El conjunto completo y alimentado sobre mi mesa presenta el siguiente aspecto:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHh5kM64eFRV9Qljs4YWn0xUg2nC1QH_1o02YVenUjY3mw9TUh_ZFl7wR_3Y2ZoGfCp3nx_0VUKOwjf2uoShgCd8FTY2hseXCQYPfCIzoD6r9Ge0wclw3QCsiWAOuAYaMmH1vSOiogdAP2/s1600/DNET.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHh5kM64eFRV9Qljs4YWn0xUg2nC1QH_1o02YVenUjY3mw9TUh_ZFl7wR_3Y2ZoGfCp3nx_0VUKOwjf2uoShgCd8FTY2hseXCQYPfCIzoD6r9Ge0wclw3QCsiWAOuAYaMmH1vSOiogdAP2/s1600/DNET.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">PLC + PowerTap + ArmorPoint + Lector de códigos de barras</td></tr>
</tbody></table>
Ahora toca configurar la tarjeta de comunicaciones, para ello abrimos el software de redes <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rsnetworx/">RSNetWorx for DeviceNet</a> y buscamos la tarjeta <i>1738-232ASCM12:</i><br />
<i><br /></i><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRmJ8syTvD_mqeBPgMoi6d6JNqTy5vETmE3sERW0_6JlSxL2mlv736MCNa_vNWIY9OSNxBgIViE-X21KrfOYzKisCQQYgr4Hki8uIoM5DYhPiEGj1ak5wzZuKlSMU3kbg9TCoqlnUXapsq/s1600/rsnetw.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRmJ8syTvD_mqeBPgMoi6d6JNqTy5vETmE3sERW0_6JlSxL2mlv736MCNa_vNWIY9OSNxBgIViE-X21KrfOYzKisCQQYgr4Hki8uIoM5DYhPiEGj1ak5wzZuKlSMU3kbg9TCoqlnUXapsq/s640/rsnetw.png" width="640" /></a></div>
<i><br /></i><br />
Los parámetros de comunicación serie deben ser coherentes con los indicados el la configuración hecha en el lector de códigos de barras. También deberemos ampliar los buffers de comunicación y especificar el caracter terminador. No olvidemos mapear en el escáner las áreas de entradas y salidas necesarias.<br />
<br />
Configuro mi PLC en un proyecto de RSLogix5000, con la red DeviceNet del escáner y la subred del <i>ArmorPoint</i>. Con la herramienta <a href="http://www.software.rockwell.com/support/download/detail.cfm?ID=3628">DeviceNet Tag Generator Tool</a> genero en mi proyecto los tags necesarios para no tener que direccionarlos a mano.<br />
<br />
A la hora de realizar la programación, lo primero a tener en cuenta es que las instrucciones para manejo del puerto serie integrado en el PLC no son aplicables a un puerto serie en DeviceNet. Además tenemos una limitación adicional: el tamaño de buffer máximo es de 128 bytes. Si vamos a hacer comunicaciones de menor tamaño no habría ningún problema, pero en mi caso necesito recibir tramas de unos 200 bytes. La solución para mi aplicación consiste en programa el lector de códigos de barras para que cada 80 bytes (por ejemplo) inserte un carácter de terminación. Así que para leer una trama de 200 bytes voy a tener que hacer tres lecturas sucesivas y reunirlas en mi PLC.<br />
<br />
Para manejar las tramas de comunicación voy a definir un tipo de string de 256 caracteres:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmnBt8dOVv14KLQLxQPuiNORFMgNnXGaA7KMpWXjWze76-xgP8JHkpZUsuunHAwTll95st_w-i4W91-b-66eWj22InzIJenQ-QJEKKfN9vTknX6yATw58yMvzb0H8EEKPfMi5t0qiE3lyQ/s1600/string.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmnBt8dOVv14KLQLxQPuiNORFMgNnXGaA7KMpWXjWze76-xgP8JHkpZUsuunHAwTll95st_w-i4W91-b-66eWj22InzIJenQ-QJEKKfN9vTknX6yATw58yMvzb0H8EEKPfMi5t0qiE3lyQ/s640/string.png" width="640" /></a></div>
<br />
Los tags que voy a necesitar los voy a agrupar en un UDT:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSQc2hjAwAnCe3lfbUV4DLjQ-n0fLEoGHQQ_G-Lw977LQoL5N0dRZ4kluKyTttyZT5w_huHZtCDAZ_AhBRnFz26IaNVwY6kGAD2g5MbBb8VR79F5lJKqCsTHPmua7rrSrQdXErv_yHVChi/s1600/udt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSQc2hjAwAnCe3lfbUV4DLjQ-n0fLEoGHQQ_G-Lw977LQoL5N0dRZ4kluKyTttyZT5w_huHZtCDAZ_AhBRnFz26IaNVwY6kGAD2g5MbBb8VR79F5lJKqCsTHPmua7rrSrQdXErv_yHVChi/s640/udt.png" width="640" /></a></div>
<br />
Para saber que tenemos datos disponibles en el buffer de comunicación serie tenemos el tag <i>DNET_N01_S01_COS_I.ReceiveRecordNumber</i> (creado automáticamente por el <i>DeviceNet Tag Generator</i>), que se irá incrementando con cada recepción. Como cada trama viene troceada en varias recepciones, para saber que he leído todos los datos, el lector de código de barras lo he configurado para que me dé en los primeros cuatro bytes la longitud total de la trama. Así que tendré que ir sumando la longitud de cada recepción hasta que coincida con lo que me diga el lector. Si tuviese una longitud de trama fija la programación sería más sencilla.<br />
<br />
Mi rutina de recepción de datos es la siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdBqjAJE4OC3YbycboAU3h5j-M3SNH1LoEVgX0MQ8jVLNs98ug2sL3YlAqkyRHBZvlTw1L85evhZ1TUeq0b6z7MceB7k5w6O0H2cLK9tLwf1FuvWM0bCUJAo7h6br_uA58q5UztFcBJ2Bc/s1600/r0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdBqjAJE4OC3YbycboAU3h5j-M3SNH1LoEVgX0MQ8jVLNs98ug2sL3YlAqkyRHBZvlTw1L85evhZ1TUeq0b6z7MceB7k5w6O0H2cLK9tLwf1FuvWM0bCUJAo7h6br_uA58q5UztFcBJ2Bc/s640/r0.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGzLNe-FrZnMG9SmV5p8vRNStU_zBbx2GQ2pxcJKLDzPuKFYEquOv452xTUDHjQE5xhMbjRYLJ64dszk8tTJdR8A2ZuIfyrFusZKdvU6DQ7iyAuIZWqmp07Av5f54vGR757s3xgt0V58EZ/s1600/r1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGzLNe-FrZnMG9SmV5p8vRNStU_zBbx2GQ2pxcJKLDzPuKFYEquOv452xTUDHjQE5xhMbjRYLJ64dszk8tTJdR8A2ZuIfyrFusZKdvU6DQ7iyAuIZWqmp07Av5f54vGR757s3xgt0V58EZ/s640/r1.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYhwMQlrQJdngtNXdoLO2qH8eE2pMyygHzbkD8r0mC-ISk5CuRWkSWCR6TJaqUBMGfp8wcncKuutnD9qTEhCtcYL8VWjpnGYuYBiQrliLst9buX8fkyn76vakbEizHHQzV_Z2cEVY9RxNY/s1600/r2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYhwMQlrQJdngtNXdoLO2qH8eE2pMyygHzbkD8r0mC-ISk5CuRWkSWCR6TJaqUBMGfp8wcncKuutnD9qTEhCtcYL8VWjpnGYuYBiQrliLst9buX8fkyn76vakbEizHHQzV_Z2cEVY9RxNY/s640/r2.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAL9XLxzXlsmg3DWAy7a4tqbbN0viGuG6O8el6JFWn7cm5bQQYDQHC9W2-BESBQ27_Fdzksq_WXN-uaoLx4dhH0DPzYQgpepOLWQpFiKkMhojjB-JO3NZIl0-UOnZpNHKmLfI0NEz6e2Bm/s1600/r3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAL9XLxzXlsmg3DWAy7a4tqbbN0viGuG6O8el6JFWn7cm5bQQYDQHC9W2-BESBQ27_Fdzksq_WXN-uaoLx4dhH0DPzYQgpepOLWQpFiKkMhojjB-JO3NZIl0-UOnZpNHKmLfI0NEz6e2Bm/s640/r3.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6gUinIicobaLuVfZwin-jLPXNGPzw2zdlsNjCsNa4LfcD3R_Pb6I5xGmkqW8P4rkky05wjg1ZISQcXzbRvSVR84rKZCubZpoSGPgY6Lg5_NHJRjH-S-9OX4uLt2Wd2oBcbvyjdEPq_4w/s1600/r4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6gUinIicobaLuVfZwin-jLPXNGPzw2zdlsNjCsNa4LfcD3R_Pb6I5xGmkqW8P4rkky05wjg1ZISQcXzbRvSVR84rKZCubZpoSGPgY6Lg5_NHJRjH-S-9OX4uLt2Wd2oBcbvyjdEPq_4w/s640/r4.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRd4CWju7iI1jdyprj_i_6mftDc4n9OkgpnrzzQ1yuqlDjEaSTMR2JYpYt18uqwftpbiHIAgLOviIrvo0UAEIU9y9ysuVK_o4RIVSkepRy7J4RxowCJ67NjpiDTy9ip5N9-rcP9YCOxNuy/s1600/r5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRd4CWju7iI1jdyprj_i_6mftDc4n9OkgpnrzzQ1yuqlDjEaSTMR2JYpYt18uqwftpbiHIAgLOviIrvo0UAEIU9y9ysuVK_o4RIVSkepRy7J4RxowCJ67NjpiDTy9ip5N9-rcP9YCOxNuy/s640/r5.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix4gE0CSv7AYMdnXQ0uFbUpf3siPl6ID6Z6Co39-F1cjFrBSSZhKa0e83If5yVInTspa9wGvO4IMjkgBvkQuGve6QBR4QP1Iy4lSR40cepQXoPHD0bP-r3CPtjzQXg3cdRZFfZAPGgJxNs/s1600/r6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix4gE0CSv7AYMdnXQ0uFbUpf3siPl6ID6Z6Co39-F1cjFrBSSZhKa0e83If5yVInTspa9wGvO4IMjkgBvkQuGve6QBR4QP1Iy4lSR40cepQXoPHD0bP-r3CPtjzQXg3cdRZFfZAPGgJxNs/s640/r6.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG1R1H8UZkjAAnn2wsMvZqOKipZNTm9OnQtFjBnisd74gZdnvklVq6Buklt3BI5oxnJPXihh50kuqZJjAlP8vinmpBoBpGCLA-UJBGGjuV4NX8jxw-1YrZbgs7OoCeHW3550WHOMTBZtyC/s1600/r7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG1R1H8UZkjAAnn2wsMvZqOKipZNTm9OnQtFjBnisd74gZdnvklVq6Buklt3BI5oxnJPXihh50kuqZJjAlP8vinmpBoBpGCLA-UJBGGjuV4NX8jxw-1YrZbgs7OoCeHW3550WHOMTBZtyC/s640/r7.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_2Ukrq6h5ogI9-GTgG0ZoKVdeU3uAEVpu3zps8ARXAyRK-xZwhdfAfUYMkMyR4gwXYMnORKaKgj-TMTqdMDOREdxSmhH_u_dZ7ZN_JdaOd-aE_N1RAwUab9l7lYu5t9o1Q-gN-Kl1nFJE/s1600/r8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_2Ukrq6h5ogI9-GTgG0ZoKVdeU3uAEVpu3zps8ARXAyRK-xZwhdfAfUYMkMyR4gwXYMnORKaKgj-TMTqdMDOREdxSmhH_u_dZ7ZN_JdaOd-aE_N1RAwUab9l7lYu5t9o1Q-gN-Kl1nFJE/s640/r8.png" width="640" /></a></div>
<br />
Para activar una recepción de datos hay que setear el tag <b>SERIE_DNET.ORDEN_LECTURA</b>. Cuando la trama haya sido completamente leída el mismo tag se pondrá a cero, con lo podremos leer en <b>SERIE_DNET.LECTURA</b> la trama buscada.<br />
<br />
Su funcionamiento es el siguiente: cuando se activa la orden de lectura se borra la trama anterior y se vigilan cambios en <i>DNET_N01_S01_COS_I.ReceiveRecordNumber</i>. Cuando este cambio se detecta se comprueba que su longitud esté dentro unos límites y se copian los datos recibidos en un string. Si estamos en el primer trozo se sacan los cuatro primeros bytes y se lee la longitud total de la trama. Vamos concatenando lecturas sucesivas hasta obtener la longitud buscada o que pase un tiempo máximo desde haber recibido el primer trozo.<br />
<br />
El proyecto de RSLogix5000 con el que he realizado las pruebas te lo puedes descargar <a href="http://goo.gl/IZb9D">aquí</a>.<br />
<br />
Solo he hecho pruebas para la recepción de datos, puesto que para mi aplicación es suficiente. La programación del envío de datos debería seguir una filosofía similar.<br />
<br />
Y hasta aquí esta entrada. Como siempre cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com5tag:blogger.com,1999:blog-226572436930860787.post-533885220517366132012-02-13T15:50:00.000+01:002012-02-13T22:56:33.053+01:00Probando el puerto serie integrado en los PLC Logix5000Recientemente he estado probando la comunicación entre un PLC Rockwell <a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/407648/7921716/Introduction.html">CompactLogix L35E</a> y un lector de códigos de barras por puerto serie <a href="http://es.wikipedia.org/wiki/RS-232">RS-232</a> en modo ASCII. En esta entrada voy resumir la configuración del puerto serie y la programación necesaria.<br />
<br />
Todos los PLC de la gama CompactLogix vienen con un puerto serie incorporado. Para controlarlo existen instrucciones específicas Logix5000 que simplifican mucho el trabajo y que vienen detalladas en el documento de Rockwell "<a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/rm/1756-rm003_-es-p.pdf">Instrucciones generales de los controladores Logix5000</a>" (en español, en formato PDF), en el capítulo 17. Para hacer la configuración del puerto, el documento de referencia es "<a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm013_-es-p.pdf">Cadenas ASCII de controladores Logix5000</a>" (también en español y en PDF).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG66dl03OGpPuZ0ktRo6AsG-5_i467vHVhl0uKVl8dVvdoIW5Sml5P8HogEejlZGdQaPeiK46IVw26zyt3kyK-_QxgWuLB59m1_8f7LlcHv11Ozz66gNkpjDMlbZxf6DQZYIsZPuhmWM2t/s1600/plc.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG66dl03OGpPuZ0ktRo6AsG-5_i467vHVhl0uKVl8dVvdoIW5Sml5P8HogEejlZGdQaPeiK46IVw26zyt3kyK-_QxgWuLB59m1_8f7LlcHv11Ozz66gNkpjDMlbZxf6DQZYIsZPuhmWM2t/s1600/plc.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Controlador CompactLogix L35E con puerto serie incorporado</td></tr>
</tbody></table>
El lector del código de barras determina que voy a leer cadenas con el carácter de terminación <b>CR</b> (<i>Carry Return</i>), representado como <b>'$r'</b> o también como el código ASCII 13; la longitud de la trama a recibir o enviar no será superior a 256 caracteres y los parámetros de comunicación serie serán 9600 baudios, 8 bits, sin paridad y un bit de parada.<br />
<a name='more'></a><br />
Mis pruebas las he realizado con un CompactLogix L35E y también con un <a href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html">SoftLogix en una máquina virtual</a> asignándole el puerto serie de mi portátil.<br />
<br />
Para configurar el puerto serie del PLC vamos a las propiedades del controlador en mi proyecto de Logix5000, a la pestaña <i>Serial Port</i>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfjd51orcZcIbOCxD1Fdew9rLvDF-EmTMbcWrHq21QSwbZf9w1oXBdBvabPBgTmzuZARhxnI9HHIjE6v5NQKj5kdeJDaiPcSBdHmFVwAp23tGaUiehrlnyVD_c47QSxm6Zs1wmakHqmHZD/s1600/CONFIG_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfjd51orcZcIbOCxD1Fdew9rLvDF-EmTMbcWrHq21QSwbZf9w1oXBdBvabPBgTmzuZARhxnI9HHIjE6v5NQKj5kdeJDaiPcSBdHmFVwAp23tGaUiehrlnyVD_c47QSxm6Zs1wmakHqmHZD/s1600/CONFIG_1.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
En <i>Mode</i> selecciono <i>User</i>, e introduzco los valores de velocidad (<i>Baud Rate</i>), número de bits (<i>Data Bits</i>), Paridad y bits de parada. Ahora vamos a la pestaña <i>User Protocol</i>:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdDnSeXxDmw7WeEhlhOiH3H7TlmFvziV8JmAeumLhvwRIpmLxat1ZAJpTIXIxy2ajPU6TwlKhc5sU3XaQ6Jb_hvE8U2EHR5lR6Iv1SZctlOikf2bpyqXYu2XZ21CvaUwrUpnntQeGluW-a/s1600/CONFIG_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdDnSeXxDmw7WeEhlhOiH3H7TlmFvziV8JmAeumLhvwRIpmLxat1ZAJpTIXIxy2ajPU6TwlKhc5sU3XaQ6Jb_hvE8U2EHR5lR6Iv1SZctlOikf2bpyqXYu2XZ21CvaUwrUpnntQeGluW-a/s1600/CONFIG_2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Especifico el protocolo ASCII, fijo el tamaño del buffer de lectura / escritura en 256 caracteres (bytes) y especifico como carácter de terminación <b>'$r'</b>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Aplicamos y aceptamos, y con esto ya está toda la configuración necesaria para el puerto serie terminada. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Por comodidad a la hora de manejar los datos recibidos por el puerto serie voy a declarar un tipo de datos STRING de 256 caracteres. Para ello voy al árbol de proyecto, en <i>Data Types -> Strings</i>, y creo el nuevo formato STRING256:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUHcOpTkfJRnXZbS4raHS0xfoOPikTLN8m3eVoPcCjtwfw482zVhZc2a3i1lWnJnQCietoURTKrBzUo3rnpw_anMFQE4Szncm8s98lVZe83bNqv6rmCq3x6EZKXNGyvAFCPgegbBXWtSDK/s1600/DT_STRING256.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUHcOpTkfJRnXZbS4raHS0xfoOPikTLN8m3eVoPcCjtwfw482zVhZc2a3i1lWnJnQCietoURTKrBzUo3rnpw_anMFQE4Szncm8s98lVZe83bNqv6rmCq3x6EZKXNGyvAFCPgegbBXWtSDK/s1600/DT_STRING256.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
También voy a crear dos tipos de datos en <i>Data Types -> User-Defined</i> para agrupar las variables necesarias para acceder al puerto serie, para escritura y lectura respectivamente:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifplSUGdFGzY7xRuqphr6YHi-gqhba2z5paRRJPaaTMEZlq676Xi-X0WyVovK30MrJeL4ifDWGBwoNCaxwVn13t_bFwp9Ck0bbyFVBWV_NrJ6pfsznB43QgCEqITdvQleC4R1ihSfkaSA8/s1600/DT_serie_e.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifplSUGdFGzY7xRuqphr6YHi-gqhba2z5paRRJPaaTMEZlq676Xi-X0WyVovK30MrJeL4ifDWGBwoNCaxwVn13t_bFwp9Ck0bbyFVBWV_NrJ6pfsznB43QgCEqITdvQleC4R1ihSfkaSA8/s1600/DT_serie_e.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioqvWqt0Dn1cTfQAdgQk06DGC0Ca23XmAoZjA7fAyMRWcXjz04Be-00eMz2BUr6gZ40I1U-NfTzJyFqKofD7ynq4gx0OFrRVd2-K9GAkZ6F0QqKH42MQIfFH8RfHbraFhKXew1Ah_VLdGy/s1600/DT_serie_l.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioqvWqt0Dn1cTfQAdgQk06DGC0Ca23XmAoZjA7fAyMRWcXjz04Be-00eMz2BUr6gZ40I1U-NfTzJyFqKofD7ynq4gx0OFrRVd2-K9GAkZ6F0QqKH42MQIfFH8RfHbraFhKXew1Ah_VLdGy/s1600/DT_serie_l.png" /></a></div>
<br />
Y finalmente declaro dos tags con estos tipos de dato:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR34_aUk4CBdgfEF-w8fdgivxK7bvNYaiZaQtLOe0y2Cl7y8y53ah1rn3UlVcvr-ohcIGIDASYPp_f6VFR3Cei2nKz8LgtHbp3ihmzvlUjjG1khe1isZKms1U0__tb3MvNWRNKclU-ev31/s1600/Tags.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR34_aUk4CBdgfEF-w8fdgivxK7bvNYaiZaQtLOe0y2Cl7y8y53ah1rn3UlVcvr-ohcIGIDASYPp_f6VFR3Cei2nKz8LgtHbp3ihmzvlUjjG1khe1isZKms1U0__tb3MvNWRNKclU-ev31/s1600/Tags.png" /></a></div>
<br />
Ahora voy a la programación. Para el envío de datos por el puerto serie voy a usar la instrucción <b>AWA</b>, que es la adecuada para enviar mensajes que siempre tienen el mismo carácter de terminación, en mi caso <b>'$r'</b>. La rutina <b>Serie_RECEPCION</b> se compone de dos renglones:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0x260YJNV_VRJAf_xwjICQTBxlXo1ht9Y0qkApt0-m6QSDJYqdvsV6k0rrEj5f4KZCxr2AEpV4zhxuqcmpFrujuIjiSxHch68l6b6zEksqUztLRGQFm-cc20Fcp33HmirhRT_j8rYPypC/s1600/SERIE_ENVIO.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0x260YJNV_VRJAf_xwjICQTBxlXo1ht9Y0qkApt0-m6QSDJYqdvsV6k0rrEj5f4KZCxr2AEpV4zhxuqcmpFrujuIjiSxHch68l6b6zEksqUztLRGQFm-cc20Fcp33HmirhRT_j8rYPypC/s640/SERIE_ENVIO.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para recibir datos voy a usar dos instrucciones, <b>ABL </b>para comprobar si en el buffer de recepción hay datos que contengan el carácter de terminación y <b>ARL</b>, que es adecuada para leer datos desde un dispositivo que envía una trama de longitud indeterminada. La rutina <b>Serie_ENVIO </b>se compone de cuatro renglones:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8tBWMZA1VegurvJ-S_IgV4BABB76f8oawovn0RXz3jMb9clUsbXvFJRvEbh2IThUkn1jFBJ3cfAVgHPKtRKRC-eiL55DqC8nrmp8_oyhLtIh8YEmYCWodp6dIYo9fbKuZ3AVZ3D6hyphenhyphen87-/s1600/SERIE_RECEPCION_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8tBWMZA1VegurvJ-S_IgV4BABB76f8oawovn0RXz3jMb9clUsbXvFJRvEbh2IThUkn1jFBJ3cfAVgHPKtRKRC-eiL55DqC8nrmp8_oyhLtIh8YEmYCWodp6dIYo9fbKuZ3AVZ3D6hyphenhyphen87-/s640/SERIE_RECEPCION_1.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6lzF6zEjgPteAWtHABe1_6x_xBn4BVN1aNOPxU7VNGo0_N5DYpqcuMi84UUrKbFLWTAKcdBviQffUi9V4RwEuslnrd60IOlrlK9TT-NUODlfsXE71P_GXmEKRi4ScxZIBGjQray48GLf1/s1600/SERIE_RECEPCION_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6lzF6zEjgPteAWtHABe1_6x_xBn4BVN1aNOPxU7VNGo0_N5DYpqcuMi84UUrKbFLWTAKcdBviQffUi9V4RwEuslnrd60IOlrlK9TT-NUODlfsXE71P_GXmEKRi4ScxZIBGjQray48GLf1/s640/SERIE_RECEPCION_2.png" width="640" /></a></div>
<br />
Transfiero el proyecto a mi PLC y lo paso modo <i>Run</i>, me aseguro que el lector de código de barras está encendido y conectado, y ya estoy listo para hacer pruebas. Para ello me pongo <i>on-line</i> y monitorizo los tags que he creado:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZkXXno81MDgmbMQ130h7ZMx61DiU8jJ08u7FZvvXwncEf9AHEejekmsa_Z9-Fp4PveB4soeElH1Y_let-hTLKd_X4ts56sNS18MiQ7lkmBUteYKMaLj6jJDTgPa401k3lUHbiL9TIqQA3/s1600/TAGS_ONLINE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZkXXno81MDgmbMQ130h7ZMx61DiU8jJ08u7FZvvXwncEf9AHEejekmsa_Z9-Fp4PveB4soeElH1Y_let-hTLKd_X4ts56sNS18MiQ7lkmBUteYKMaLj6jJDTgPa401k3lUHbiL9TIqQA3/s1600/TAGS_ONLINE.png" /></a></div>
<br />
Para probar el envío de datos introduzco un comando que reconozca el lector de código de barras en la cadena <b>SERIE_E.ESCRITURA</b> (con su correspondiente carácter de terminación) y pongo a uno el bit <b>SERIE_E.ORDEN_ESCRITURA</b>. En cuanto la transmisión finalice este bit se pondrá a cero.<br />
<br />
Para realizar una recepción simplemente tengo que activar el bit <b>SERIE_L.ORDEN_LECTURA</b> y en cuanto se ponga a cero sabré que en la cadena <b>SERIE_L_LECTURA</b> tendré una trama recibida por el puerto serie.<br />
<br />
Si hubiese algún error de configuración o comunicación, en los datos de control del tipo <b>SERIAL_PORT_CONTROL</b>, en la variable <b>ERROR </b>tenemos un código que nos será muy útil para depurar por qué falla nuestra comunicación. El significado de los códigos de error se pueden consultar en la página 568 del documento <a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/rm/1756-rm003_-es-p.pdf">Instrucciones generales de los controladores Logix5000</a>.<br />
<br />
El código de este proyecto para RSLogix5000 lo tienes <a href="http://goo.gl/K1hgr">aquí</a>.<br />
<br />
Hasta aquí este sencillo programa de prueba. Como conclusión puedo decir que trabajar con el puerto serie de los controladores CompactLogix es muy sencillo, con un funcionamiento impecable y siguiendo los manuales disponibles en la web de Rockwell no he tenido la más mínima complicación.<br />
<br />
Como siempre, cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com11tag:blogger.com,1999:blog-226572436930860787.post-48977866513501726152012-01-17T15:37:00.000+01:002012-01-26T12:01:04.578+01:00Probando un adaptador USB/MPI chinoRecientemente, en el <a href="http://www.infoplc.net/foro/showthread.php?8316-PC-Adapter-MPI-en-maquina-virtual">foro de Siemens en infoPLC</a>, me enteré de la existencia de un adaptador USB/MPI muy económico que se vende a través de <a href="http://www.ebay.es/itm/USB-to-MPI-Interface-Adapter-For-Siemens-Simatic-S7-300-/260679235521?pt=BI_Control_Systems_PLCs&hash=item3cb1b177c1#ht_2197wt_922">ebay</a>, total que hemos comprado uno. El pedido tardó unas tres semanas en llegar (dentro del plazo que especifica el vendedor). En el paquete venía el adaptador y un mini CD con los controladores:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcY8kYxXxFPOMQBtj6aGzARD8HN-TJGZBqqbic5NWG8kKBke_dpnAaKwPsz9IabWUIC7kpQQdwNRF0Pe4hAuXifs7HbwtQVDdS5SXvd2hr0eo5Juo0AdfzBKu8DVk1tj_arl0hBUVN6Z6z/s1600/close.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcY8kYxXxFPOMQBtj6aGzARD8HN-TJGZBqqbic5NWG8kKBke_dpnAaKwPsz9IabWUIC7kpQQdwNRF0Pe4hAuXifs7HbwtQVDdS5SXvd2hr0eo5Juo0AdfzBKu8DVk1tj_arl0hBUVN6Z6z/s400/close.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">(pulsar encima para ampliar)</td></tr>
</tbody></table>
<br />
La primera impresión es bastante lamentable, leer <i>For SEMIES S7-300</i> no hace presagiar nada bueno. El cable mide unos tres metros y el adaptador en sí apenas tiene peso. La carcasa tampoco parece muy sólida y lo primero que he hecho es abrirla para curiosear la electrónica:<br />
<a name='more'></a><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpNL141wD8fAOhtK5jk0AMkzMZMiTIErUJMapPFFUHAPPXkQS0_Wf3C0p6l5SawOhms5K11T4LhSovOu2V8O9-xunItbWUMlR_8lKYxyiv_82nA_6u45F41YxUKQd-Y7aXjY7G4MD27mhg/s1600/open.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpNL141wD8fAOhtK5jk0AMkzMZMiTIErUJMapPFFUHAPPXkQS0_Wf3C0p6l5SawOhms5K11T4LhSovOu2V8O9-xunItbWUMlR_8lKYxyiv_82nA_6u45F41YxUKQd-Y7aXjY7G4MD27mhg/s400/open.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Han raspado los chips para evitar su identificación (pulsar para ampliar)</td></tr>
</tbody></table>
Nada más leer el CD saltó el antivirus detectando una amenaza. Dentro viene documentación en perfecto chino y también el programa de instalación del controlador del <a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES7972-0CB20-0XA0&caller=view">PC Adapter USB original de Siemens</a> (lo cual supongo que no es muy legal). Por tanto deduzco que el controlador necesario para este adaptador chino es el mismo que el de Siemens.<br />
<br />
Conecto el adaptador a mi ordenador y lo asigno a la máquina virtual de <a href="https://www.virtualbox.org/">Virtual Box</a> donde tengo instalado la última versión de Step7 (5.5 SP1). Enseguida el asistente de instalación de nuevos dispositivos me dice que el adaptador USB está instalado y listo para para usarse. Con el Step7 instalado, el controlador del PC Adapter de Siemens ya está disponible, con lo que el CD de controladores, en mi caso, no fue necesario.<br />
<br />
El siguiente paso es ajustar el interface PG/PC. Debemos seleccionar <b>PC Adapter</b>, en mi caso con la opción <b>Auto</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjCQJwNe_S87UuXmi0c2SpVWRBhccvog3w8LaEhQ6C9PoGT8AOzCw9286ssmSHGIlEpAMERRRDOZSPRy71wEZO0O3Dw3V5KM3gAG2GnMdYd6rhF5odMKFws4HVg6AcNeZFcXLgviFSjpgE/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjCQJwNe_S87UuXmi0c2SpVWRBhccvog3w8LaEhQ6C9PoGT8AOzCw9286ssmSHGIlEpAMERRRDOZSPRy71wEZO0O3Dw3V5KM3gAG2GnMdYd6rhF5odMKFws4HVg6AcNeZFcXLgviFSjpgE/s1600/00.png" /></a></div>
<br />
Pulsamos el botón de <b>Propiedades </b>y en la pestaña <b>Conexión local</b> debemos seleccionar <b>Conexión a USB</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6OrMIJt1hN8OY8rNoqWK8n2CsEpU6blNaBgI8lILOb7mQDk9DX7nDwTyk4KdbzDxc6GvnRzWVbbKBMEIqB51QSqV3jnSV06feKMXYowOi_L17M5tf_sz0fcrKT86pPsaCPCHS8g0fivu5/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6OrMIJt1hN8OY8rNoqWK8n2CsEpU6blNaBgI8lILOb7mQDk9DX7nDwTyk4KdbzDxc6GvnRzWVbbKBMEIqB51QSqV3jnSV06feKMXYowOi_L17M5tf_sz0fcrKT86pPsaCPCHS8g0fivu5/s1600/01.png" /></a></div>
<br />
Aceptamos y listo. Ya solo queda conectar el extremo MPI al PLC y empezar a probar. Yo he usado un <a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES7315-2AG10-0AB0&caller=view">PLC Siemens 315-2DP</a> que ha aceptado la conexión sin problemas: he transferido la configuración hardware, el programa y usado las funciones de visualización <i>on-line</i>.<br />
<br />
También he hecho la prueba de conectarle un panel táctil <a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6AV6643-0AA01-1AX0&caller=view">TP277-6"</a> de Siemens. En modo MPI directo funciona correctamente, tardando en transferir un proyecto de WinCC Flexible lo normal para una velocidad de 187,5 kbit/s estándar para MPI (y la única velocidad permitida por este adaptador). Luego he conectado el panel en Profibus al PLC, para probar a hacer un <i>routing </i>MPI-Profibus, y también ha funcionado sin problemas.<br />
<br />
En el lateral de la carcasa del adaptador hay dos leds marcados como <b>Power </b>(rojo) y <b>Active </b>(verde), pero realmente lo único que hacen es parpadear cuando hay una comunicación activa.<br />
<br />
Como conclusión puedo decir que simplemente funciona, aunque no me da sensación de fiabilidad. No lleva ningún marcado CE ni nada parecido. Puede servir para salir de un apuro, pero no lo veo para el trabajo diario. También hay que tener en cuenta que no permite la comunicación directa a través de redes Profibus, cosa que sí es posible con el modelo original de Siemens. Aunque por el precio que tiene no se le puede pedir más.<br />
<br />
<b>Actualización</b>: la página del fabricante original de este adaptador es <a href="http://www.dgycgk.com/list.asp?ProdId=0379">ésta</a>.<br />
<br />
Cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com17tag:blogger.com,1999:blog-226572436930860787.post-40910601022283751282012-01-16T17:25:00.000+01:002012-01-16T17:49:27.551+01:00Modificando tiempos en un PLC S7 desde WinCC Flexible RTRecientemente me ha tocado actualizar el programa de una máquina que llevaba un panel táctil realizado en <a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&nodeid0=10805581&lang=es&siteid=cseus&aktprim=0&extranet=standard&viewreg=WW&objid=10805580&treeLang=es">ProTool</a>. En este proyecto hay una serie de tiempos configurables desde el panel y me llamó la atención que estaban enlazados a variables en formato <b>WORD</b>, haciendo la conversión a formato <b>S5TIME </b>en el PLC, con segmentos como el siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm36gOzTvhJqiD5cdM6DlOY8SZpSqwtXy1gLMW9OgciB9Jyc-F5BQscQ1gJQy4Zd8GgYrW6EhE9kcZyue-Esfqlwm76nlFTcF19QXGzzubQxjAy6GCVJKwSHg4QcqoICWdu7WVg14rYu3Z/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm36gOzTvhJqiD5cdM6DlOY8SZpSqwtXy1gLMW9OgciB9Jyc-F5BQscQ1gJQy4Zd8GgYrW6EhE9kcZyue-Esfqlwm76nlFTcF19QXGzzubQxjAy6GCVJKwSHg4QcqoICWdu7WVg14rYu3Z/s640/03.png" width="640" /></a></div>
<br />
El valor se recibe en un <b>WORD</b>, se copia en un <b>INT</b>, que vuelve a ser un <b>WORD </b>después de la instrucción <b>I_BCD</b>, se le añade la base de tiempo con la instrucción <b>WOR_W</b>, para finalmente moverlo a la variable en formato <b>S5TIME </b>definitiva.<br />
<br />
No es la primera vez que me encuentro con conversiones similares, pero como no estaba del todo seguro de cómo trata WinCC Flexible directamente las variables de tipo <b>S5TIME</b>, pues nada mejor que hacer una sencilla prueba.<br />
<a name='more'></a><br />
Lo primero es crear un proyecto de Step7 con una variable <b>S5TIME </b>en un bloque de datos y transferirlo a mi PLC.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUv8UYyqm4dmVjmo59PzOb6EFJyjxQ1DlEHqW24FpSYjrrQmU0RZUSTaE8WQYersD5ZGjH5KXuIZKKclHwftN8cGpMFhCsyYi0agca1pY9QsLt_1eU3mb8jny_JGnu44FceGJi_rhqcr-3/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUv8UYyqm4dmVjmo59PzOb6EFJyjxQ1DlEHqW24FpSYjrrQmU0RZUSTaE8WQYersD5ZGjH5KXuIZKKclHwftN8cGpMFhCsyYi0agca1pY9QsLt_1eU3mb8jny_JGnu44FceGJi_rhqcr-3/s1600/02.png" /></a></div>
<br />
En WinCC Flexible enlazo la variable anterior a un campo de entrada salida, le doy suficiente longitud de representación, tres dígitos para la parte decimal y tipo de formato <i>Decimal</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbZnMkiQldxv5WmtCurB5cwFWTWHZ9zf-QXv7FGSoXoRc27Zg5lNA_cTgFVQbjaka6La37k_hneN1q7mo92GpHlCx0qNQoH6iU3yrph3DHYhU_JVULGylglx7K21Bvi9ThW9ieRfqa1FgJ/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbZnMkiQldxv5WmtCurB5cwFWTWHZ9zf-QXv7FGSoXoRc27Zg5lNA_cTgFVQbjaka6La37k_hneN1q7mo92GpHlCx0qNQoH6iU3yrph3DHYhU_JVULGylglx7K21Bvi9ThW9ieRfqa1FgJ/s640/01.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
La idea es ir dando distintos valores a la variable desde el <i>Runtime </i>de WinCC Flexible para comprobar de qué manera le llega el valor de tiempo al PLC. Así que transfiero el programa al panel y visualizo simultáneamente el valor de la variable en el PLC y la ejecución del HMI:</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp25-tjMfyCztZSnggzidhNU0OWBbrzJylleUCzLK-hIaGRJz1YU5dg5RkNoT_MXHc3PRxYHObJ74lHcmg7XWCm-O0XWqFadSvtXrJUYY03gn9GDiR2aXuKSTJcr_V33_fmt3jbWiRPNVX/s1600/00.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="449" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp25-tjMfyCztZSnggzidhNU0OWBbrzJylleUCzLK-hIaGRJz1YU5dg5RkNoT_MXHc3PRxYHObJ74lHcmg7XWCm-O0XWqFadSvtXrJUYY03gn9GDiR2aXuKSTJcr_V33_fmt3jbWiRPNVX/s640/00.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dos máquinas virtuales: una con Step7 on-line con el PLC y la otra con el RT de WinCC Flexible.</td></tr>
</tbody></table>
Lo que me he encontrado es que introduciendo el valor en segundos (en milisegundos si obviamos la coma),<br />
la variable en formato <b>S5TIME </b>del PLC recibe la conversión ya realizada, directamente, sin programar nada más. Si ponemos valores superiores a 9990,000 segundos (que es la temporización máxima de un temporizador Simatic correspondiente a 2h 36m 30s) se redondea a este valor. Asimismo, no todos los valores de tiempo son posibles, dependen de la base de tiempo, pero el PLC recibirá el valor redondeado más próximo al que hayamos introducido.<br />
<br />
Y hasta aquí esta sencilla comprobación. Cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com2tag:blogger.com,1999:blog-226572436930860787.post-38610502546922270962011-12-26T12:59:00.000+01:002011-12-26T12:59:43.806+01:00Probando un servomotor Posmo A para posicionamiento simple (parte 2ª)Habiendo dejado en la <a href="http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para.html">entrada anterior</a> el Posmo configurado, ahora toca realizar un proyecto en Step7 para controlarlo. Como maestro Profibus voy a usar un <a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES7315-2AG10-0AB0&caller=view">PLC S7-315-2DP</a> al que voy a conectar una <a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6ES7374-2XH01-0AA0&caller=view">tarjeta simuladora de entradas / salidas digitales</a> para dar las órdenes necesarias al servomotor y visualizar su estado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0z2FYObJM6jExX-gX1zSKTmTwICPYOcufYWU82oEow1vpWGVcdpOzXQypfoUHx4ZmRnKZjiAKUZToWOaUBYriWB6d9wYcYBew7jgnLfiETRlU3FqB6nniTC89uBI7hSDc164akYZF9Hsw/s1600/01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0z2FYObJM6jExX-gX1zSKTmTwICPYOcufYWU82oEow1vpWGVcdpOzXQypfoUHx4ZmRnKZjiAKUZToWOaUBYriWB6d9wYcYBew7jgnLfiETRlU3FqB6nniTC89uBI7hSDc164akYZF9Hsw/s1600/01.jpg" /></a></div>
<br />
Alimento el PLC y el servomotor, conecto el cable Profibus entre ambos y al borne 1 del servomotor un detector inductivo que hará las veces de leva de referenciado.<br />
<br />
Ejecuto el Administrador Simatic y creo un proyecto vacío. Inserto un equipo Simatic 300 y abro la configuración hardware. Inserto mi referencia de PLC, la tarjeta simuladora, creo una red Profibus y finalmente añado el Posmo, con lo que me quedaría algo como esto:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9VMwJHV6pH11m4oDieqZ7gwZAuwI_TvaYreZInQTmj_b1itA7kSK266T9R_hpD_wKmAYpe21AZcS4woePRntx3wgmwuM8O67VdohYK54dYMnlSIAdW3K1ZpHGe5kKxlXCrMJgt6hy4BL4/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9VMwJHV6pH11m4oDieqZ7gwZAuwI_TvaYreZInQTmj_b1itA7kSK266T9R_hpD_wKmAYpe21AZcS4woePRntx3wgmwuM8O67VdohYK54dYMnlSIAdW3K1ZpHGe5kKxlXCrMJgt6hy4BL4/s1600/00.png" /></a></div>
<br />
<a name='more'></a>Al PLC le he asignado la dirección Profibus número 2 y al servomotor la dirección 3, que debe coincidir con la que hayamos configurado con los microinterruptores del Posmo. La velocidad la dejo en 1,5 Mbps. Es importante que tanto la dirección inicial hardware de entradas como la de la salidas coincidan, ya que en la programación solo podremos especificar una. Para mi ejemplo he dejado la 256.<br />
<br />
Al transferir la configuración deben desaparecer los fallos de comunicación de nuestra red Profibus, luciendo en verde el led de la parte trasera del Posmo. En caso contrario verificar el conexionado, el estado de las resistencias terminadoras y las direcciones asignadas. En mi caso no tuve ninguna dificultad.<br />
<br />
Ya nos podemos concentrar en la programación. Siemens tiene en su página web disponible un <a href="https://support.automation.siemens.com/WW/llisapi.dll?aktprim=0&lang=es&referer=%2fWW%2f&func=cslib.csinfo&siteid=cseus&groupid=4000003&extranet=standard&viewreg=WW&nodeid0=10804026&objaction=csopen">ejemplo de programación</a>. De este ejemplo he usado dos FB, el FB10 y FB11 que ya tienen programada la comunicación con el Posmo. El primero sirve para controlar el Posmo: referenciar, posicionar, jog, fallos, etc., y el segundo permite leer o escribir parámetros de configuración.<br />
<br />
Yo he incorporado estos dos FB en mi proyecto y el FB10 lo usaré para referenciar, posicionar en MDI y gestión de fallos. Entre la información del Posmo que me ofrece el FB10 no está la posición instantánea, así que necesito el FB11 para leer el parámetro 40, que contiene dicho dato. Todas las variables referidas al control del Posmo las he agrupado en un bloque de datos (DB9).<br />
<br />
Los parámetros de entrada que he necesitado para el FB10 son:<br />
<br />
<ul>
<li><i>I_O_Adresss </i>- Dirección hardware del Posmo.</li>
<li><i>Initialization </i>- Para la puesta en servicio del Posmo, deberá ser lo primero que activemos.</li>
<li><i>Referencing </i>- Señal que nos permitirá definir el punto actual donde se encuentre el servomotor como cero. En mi ejemplo no lo voy a usar, puesto que usaré una secuencia de referenciado.</li>
<li><i>Jogging_1 </i>y <i>Jogging_2 </i>- Señales para hacer girar el servomotor en un sentido o en el contrario mientras estén activadas.</li>
<li><i>Jogging_override </i>- Limitación de velocidad en porcentaje para los movimientos de Jog.</li>
<li><i>Start </i>- Señal para iniciar una secuencia de desplazamiento. <b>Debe ser activada al menos un ciclo de scan después haber modificado los parametros del bloque a ejecutar</b>.</li>
<li><i>No_intermediate_stop </i>y <i>No_stop </i>- Señales para indicar que no se realicen paradas en el cambio de bloques. En el ejemplo de Siemens las mantiene siempre a uno y las he dejado igual.</li>
<li><i>Automatic_operation</i>, <i>External_blockchange</i>, <i>Read_in_enable </i>y <i>Brake_release </i>- No son necesarias en mi ejemplo.</li>
<li><i>Fault_acknowledgement </i>- Esta señal permite borrar los fallos y avisos del Posmo. También tiene el efecto de detener el servomotor si está en movimiento.</li>
<li><i>Block_number </i>- Número de bloque que se ejecutará cuando se dé la señal <i>Start</i>. Para mi ejemplo usaré el bloque número 3 para el posicionamiento en MDI y el 13 para realizar el referenciado.</li>
<li><i>Override </i>- Limitación general de velocidad en porcentaje.</li>
<li><i>Start_byte </i>- Condiciones auxiliares de inicio, no necesarias en mi ejemplo.</li>
<li><i>MDI_Type </i>- Si esta señal está a cero, el desplazamiento se hará en modo absoluto. Si está a uno el movimiento será realizado relativo a la posición actual del servomotor. Para mi ejemplo usaré el modo absoluto.</li>
<li><i>MDI_Velocity </i>y <i>MDI_Acceleration </i>- Velocidad y aceleración del movimiento en MDI expresadas en porcentaje respecto de la velocidad y aceleración máximas configuradas.</li>
<li><i>MDI_Position </i>- Cota en formato REAL para realizar el posicionamiento en MDI.</li>
<li><i>Timer_for_wait </i>- Temporizador que usa internamente el FB10, no debemos usarlo en otra parte del programa.</li>
<li><i>FB_Coordination </i>- Esta señal sirve para coordinar los distintos FB de acceso al Posmo. Entiendo que es una especie de semáforo para que los FB no se pisen. No debemos escribir en ella en ninguna parte del programa.</li>
</ul>
<div>
El FB10 me devuelve la siguiente información:</div>
<div>
<ul>
<li><i>Warning </i>y <i>Fault </i>- Señales que nos indican si existe alguna advertencia en el Posmo o si este está en fallo.</li>
<li><i>Ready </i>- Señal que nos indica que el Posmo está listo para el servicio.</li>
<li><i>Status_word </i>- Palabra donde cada bit indica el estado del Posmo, más abajo lo describiré.</li>
<li><i>Actual_block </i>- Número de bloque actualmente seleccionado en el Posmo.</li>
<li><i>Warm_number</i>, <i>Warm_info</i> y <i>Fault_number </i>- Códigos numéricos que nos indican, cuando hay un fallo o advertencia, qué está pasando en el Posmo. Estos códigos están descritos en la documentación.</li>
</ul>
<div>
En el <i>Status_word</i> tenemos la siguiente información:</div>
</div>
<div>
<div>
<ul>
<li>Bit 0 - Sin error de seguimiento<span class="Apple-tab-span" style="white-space: pre;"> </span></li>
<li>Bit 1 - No usado</li>
<li>Bit 2 - En posición de consigna.</li>
<li>Bit 3 - El servomotor está referenciado</li>
<li>Bit 4 - El servomotor aceptó la secuencia de desplazamiento.</li>
<li>Bit 5 - El servomotor se está moviendo.</li>
<li>Bit 6 - El servomotor está ejecutando una secuencia de desplazamiento.</li>
<li>Bit 7 - Alimentación de potencia presente.<span class="Apple-tab-span" style="white-space: pre;"> </span></li>
<li>Bit 8 - Posmo alimentado.</li>
<li>Bit 9 - Posmo listo para el servicio.</li>
<li>Bit 10 - Servicio habilitado</li>
<li>Bit 11 - Posmo en fallo</li>
<li>Bit 12 - Ningún DES2 aplicado</li>
<li>Bit 13 - Ningún DES3 aplicado</li>
<li>Bit 14 - Posmo en bloqueo de conexión.</li>
<li>Bit 15 - Posmo en alarma.</li>
</ul>
</div>
<div>
Para obtener la posición instantánea del Posmo llamo al FB11 como sigue:</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP5Xe3uSEQPxK8U8qtxJltXonNmX_sp_GcrAGgUauuxNf8osFFu2s7jTNobrRjlmUHDv3shDVCR9-dUuawyFcTmuJIX-8AmzxicMdONRRMgEjvq_CiAY24ZN1MVuExbqjhD3TlOs4mmgos/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP5Xe3uSEQPxK8U8qtxJltXonNmX_sp_GcrAGgUauuxNf8osFFu2s7jTNobrRjlmUHDv3shDVCR9-dUuawyFcTmuJIX-8AmzxicMdONRRMgEjvq_CiAY24ZN1MVuExbqjhD3TlOs4mmgos/s1600/01.png" /></a></div>
<div>
<br /></div>
<div>
En la llamada indico la dirección hardware del Posmo, el número de parámetro a leer, le indico que quiero leer y no escribir, y obtengo en formato DWORD el parámetro pedido. Tenemos que tener la precaución de solo dar por buena la lectura cuando el valor de coordinación (<i>FB_Coordination</i>) tenga valor cero.</div>
<div>
<br /></div>
<div>
En mi proyecto de prueba he hecho toda la programación en el FC50. Las distintas órdenes las he dado desde las entradas digitales, que deberán ser adaptadas para un proyecto "real".</div>
<div>
<br /></div>
<div>
El proyecto de Step7 lo tienes <a href="http://goo.gl/kIfaC">aquí</a> y si quieres echar un vistazo a la parametrización del Posmo también está <a href="http://goo.gl/K0Dvu">disponible</a>.</div>
<div>
<br /></div>
<div>
En el pasado he programado varios Posmo A de esta manera y hasta ahora no he tenido el más mínimo problema. Si tienes alguna sugerencia o ves algo que no esté del todo bien, te agradeceré que lo comentes.</div>GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com0tag:blogger.com,1999:blog-226572436930860787.post-32918230601753987982011-12-23T11:08:00.000+01:002011-12-26T13:44:08.590+01:00Probando un servomotor Posmo A para posicionamiento simple (parte 1ª)El <a href="http://www.automation.siemens.com/mcms/mc/en/converters/low-voltage-converters/simodrive/positioning-motor/simodrive-posmo-a/Pages/simodrive-posmo-a.aspx">Simodrive Posmo A</a> es un servomotor de <a href="http://www.automation.siemens.com/">Siemens</a> que hemos montado en multitud de ocasiones. Es sencillo de configurar y programar, y siempre ha dado buen resultado, destacando su fiabilidad. Aprovechando que tengo uno por aquí (referencia <a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&lang=es&objid=6SN2132-1BC11-1BA1&caller=view">6SN2132-1BC11-1BA1</a>) voy a dedicarle una entrada.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEVtmk8TPQT_xbDv1WFO_ecVs4hL7igVy3RwKVKQJZ8n09iwnPWpmXb2UzCEq3AgWTeFP6vWXLjSqUTB5x3ppaClZ32LdyEYzndXfFKjqaaLJV2nZeQV-awqjvyvXt_pbar_Ib5f5b0bCy/s1600/Posmo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEVtmk8TPQT_xbDv1WFO_ecVs4hL7igVy3RwKVKQJZ8n09iwnPWpmXb2UzCEq3AgWTeFP6vWXLjSqUTB5x3ppaClZ32LdyEYzndXfFKjqaaLJV2nZeQV-awqjvyvXt_pbar_Ib5f5b0bCy/s400/Posmo.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">El Posmo A sobre mi mesa preparado para hacer pruebas.</td></tr>
</tbody></table>
Lo primero que llama la atención es que lleva incorporado el regulador, formado un bloque compacto. Se alimenta con corriente continua, 24 o 48 V según versiones. Como interface de comunicaciones tiene un puerto <a href="http://es.wikipedia.org/wiki/Profibus">Profibus</a>. Bajo la tapa lleva unos microinterruptores donde ajustaremos la resistencia terminadora de red y la dirección Profibus. También tiene un bornero donde podremos realizar alimentación separada de electrónica y potencia, y un par de entradas / salidas configurables.<br />
<br />
<a name='more'></a>Para mis pruebas voy a conectar el cable Profibus, la alimentación de potencia y un detector inductivo que hará las veces de leva de referenciado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5m7o2rSOePceYC6NV8Bx5z2t-ChweM3W_VI9q5x_d3wPi2oNmZJ16N_6a7qeuFUFfaEPqxCRzGGrfDcLMDtOlZySzIS-zkiPRBFRmkSnaD5bHucHQHb9-hWgc8Z1kh-AZW2G-bl2XIkGb/s1600/Posmo+abierto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5m7o2rSOePceYC6NV8Bx5z2t-ChweM3W_VI9q5x_d3wPi2oNmZJ16N_6a7qeuFUFfaEPqxCRzGGrfDcLMDtOlZySzIS-zkiPRBFRmkSnaD5bHucHQHb9-hWgc8Z1kh-AZW2G-bl2XIkGb/s400/Posmo+abierto.jpg" width="400" /></a></div>
<br />
Para configurarlo necesitamos el Simocom A, que podemos <a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&nodeid0=10804026&lang=en&siteid=cseus&aktprim=0&extranet=standard&viewreg=WW&objid=10804026&treeLang=en">descargar de la página web de Siemens</a> (no es necesaria licencia). Es un software muy sencillo, está en español incluida la completa ayuda, y nos servirá para hacer la configuración y también comprobar el correcto funcionamiento del servomotor. Para conectarnos tendremos que hacerlo necesariamente a través de Profibus, ya sea directamente o por enrutado (<i>routing</i>) a través de un PLC. Si no tenemos el servomotor también podemos hacer la configuración <i>off-line</i> y transferirla posteriormente.<br />
<br />
Mi intención es configurar el Posmo para realizar posicionamientos absolutos en modo MDI (<i>Manual Data Input</i>), así que ejecuto el Simocom A y me conecto.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihKNdPn6CFj4z5kWZ6TY_11prk3tloKeHQtvDKSusC9z5rgnm8Vp1PkSZ-hXWYuXnWjRXRTL3q4Ty7jsachrdxgqiE0dJtkCDSx2GXFOe4wP3QC8r1zk7Ouwu2sc3ZqLYzkZu3n8cLmxgN/s1600/Dibujo01.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihKNdPn6CFj4z5kWZ6TY_11prk3tloKeHQtvDKSusC9z5rgnm8Vp1PkSZ-hXWYuXnWjRXRTL3q4Ty7jsachrdxgqiE0dJtkCDSx2GXFOe4wP3QC8r1zk7Ouwu2sc3ZqLYzkZu3n8cLmxgN/s640/Dibujo01.PNG" width="640" /></a></div>
<br />
En el Simocom A tenemos a la izquierda un árbol con las distintas opciones de configuración. En la primera pantalla definiremos el modo de funcionamiento. El que yo necesito es <b>Posicionar</b> y como mi Posmo irá acoplado a un husillo lo configuro como <b>Eje lineal</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKvU7wLHA-V_-6KQfmcI5XbwfCq-GozpKIpPOXWDqYOa-hfyVACepROwpuMCTIzfN0EK1FfaPQje7fJTV_T8scFynSTpygPUQ7DYFOSBZPiJh5B6ZwSICLVbrgCNAXSjMDrj-Ni8GdWpmv/s1600/Dibujo02.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKvU7wLHA-V_-6KQfmcI5XbwfCq-GozpKIpPOXWDqYOa-hfyVACepROwpuMCTIzfN0EK1FfaPQje7fJTV_T8scFynSTpygPUQ7DYFOSBZPiJh5B6ZwSICLVbrgCNAXSjMDrj-Ni8GdWpmv/s640/Dibujo02.PNG" width="640" /></a></div>
<br />
A continuación voy al apartado <i>Mecánica</i>, donde especifico el paso del husillo, o sea, lo que avanza el eje lineal con cada vuelta del servomotor. En la casilla <i>Juego de inversión</i> se introduce la holgura que presenta nuestra mecánica al cambiar el sentido de giro.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lbfskacMXXy8l6x4f1vHuYe1gFplIZ0wuRiXZJWDNp6kfgfx_1KUCzviSQ4UxJgNcFVG1Z6dpWK5X_kyVKdOwbyZhPEzXVk6UGHVF0EPLJt87Gz-9x5DDUVlx7kW7tscVQqwX0PAdZzg/s1600/Dibujo03.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="322" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lbfskacMXXy8l6x4f1vHuYe1gFplIZ0wuRiXZJWDNp6kfgfx_1KUCzviSQ4UxJgNcFVG1Z6dpWK5X_kyVKdOwbyZhPEzXVk6UGHVF0EPLJt87Gz-9x5DDUVlx7kW7tscVQqwX0PAdZzg/s640/Dibujo03.PNG" width="640" /></a></div>
<br />
En el apartado <i>Límites </i>especificaremos la velocidad y aceleración máxima que estarán permitidas a nuestro servomotor. Son parámetros importantes, ya que otros parámetros se referirán en relación porcentual a estos valores.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdDYKftbD3kHUsCE4FgZza3arleVY_gfIQbUQvbP_xHoxIySRYA19geC6IMg6WGEaQFnKo6-sqVVVIwhIF8IpNzVRK0Hc_bsnQ7DlrRG6K3s0iFHoa8HUF1i2Fd5ujafPG8n6nAJ6MWvng/s1600/Dibujo04.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="402" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdDYKftbD3kHUsCE4FgZza3arleVY_gfIQbUQvbP_xHoxIySRYA19geC6IMg6WGEaQFnKo6-sqVVVIwhIF8IpNzVRK0Hc_bsnQ7DlrRG6K3s0iFHoa8HUF1i2Fd5ujafPG8n6nAJ6MWvng/s640/Dibujo04.PNG" width="640" /></a></div>
<br />
El servomotor dispone de la posibilidad de conectar dos entradas / salidas digitales libremente configurables. En mi caso voy a conectar en el borne 1 la señal de referenciado, dejando el borne 2 sin función.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CQNUX5I7yVRu2wXX9gxXXquZzXFhHvuLb4bUJPOVLeBl0f-rm7KnrDmXvlGYhQOtFwkyV64-uAvu8kVMt6Tvxf4O6h-IyY1tUDkEdrEwC8iijoIK_Je6TjmrpGfFWpUhOP3sk3KH5vp-/s1600/Dibujo05.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CQNUX5I7yVRu2wXX9gxXXquZzXFhHvuLb4bUJPOVLeBl0f-rm7KnrDmXvlGYhQOtFwkyV64-uAvu8kVMt6Tvxf4O6h-IyY1tUDkEdrEwC8iijoIK_Je6TjmrpGfFWpUhOP3sk3KH5vp-/s640/Dibujo05.PNG" width="640" /></a></div>
<br />
En el apartado <i>Vigilancia </i>podemos activar límites de recorrido, para mantener nuestro servomotor dentro de un margen de funcionamiento. Además podemos establecer una vigilancia de posicionamiento, de forma que salte una alarma en el caso de funcionamiento anómalo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9A2woYvGOw6eIm_xz6oJJGaU7yPNmitAya6KPvZfUivSKWNPYxjZaFIGykAw0uM0AFV44mlwKXXXioX5jL6QSbzoN_x8JQ1XzwnZzwKNZxMCl083CcSOoakE-is90ltqBUq0iNy-QRcpc/s1600/Dibujo06.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9A2woYvGOw6eIm_xz6oJJGaU7yPNmitAya6KPvZfUivSKWNPYxjZaFIGykAw0uM0AFV44mlwKXXXioX5jL6QSbzoN_x8JQ1XzwnZzwKNZxMCl083CcSOoakE-is90ltqBUq0iNy-QRcpc/s640/Dibujo06.PNG" width="640" /></a></div>
<br />
En el apartado <i>Regulador </i>se puede modificar algún parámetro de regulación, pero con la configuración de fábrica nunca he tenido problemas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXvkl019OIl82NyiiqNCvrFdYP26ap8XdptS3ZvCYzrvve56aiQOss4OPV21Tkoz-Kmdbydfg70W01xCntv8Z2SpIcou0M8ilzzbg9Z-n9bQo8HM9qc5sm9_aiqt3w31olQxR1IlB-bbhq/s1600/Dibujo07.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="322" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXvkl019OIl82NyiiqNCvrFdYP26ap8XdptS3ZvCYzrvve56aiQOss4OPV21Tkoz-Kmdbydfg70W01xCntv8Z2SpIcou0M8ilzzbg9Z-n9bQo8HM9qc5sm9_aiqt3w31olQxR1IlB-bbhq/s640/Dibujo07.PNG" width="640" /></a></div>
<br />
En el apartado <i>Secuencias de desplazamiento</i> podemos programar movimientos de forma que llamando al número de secuencia se realice el movimiento configurado. Los bloques 1 y 2 están reservados para <i>Jogging. </i>En modo MDI , cuando se transfieren los valores de posición, velocidad y aceleración, se guardan en el bloque número 3. Otros bloques pueden, a su vez, estar reservados para realizar la secuencia de referenciado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZJGvN4ilhbGBHskqYTJvN-CqeJ1umXpkhilQIbeMIDk4qSLl7YmDp3lkZ-KtxmzVc-bYoHe1tYahcE4DgK4eHsgaXnGL0o5ZyPQmjae-DkmqJb6zoZ__TJowxWjHYIocZvmaHN7K3vedQ/s1600/Dibujo08.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZJGvN4ilhbGBHskqYTJvN-CqeJ1umXpkhilQIbeMIDk4qSLl7YmDp3lkZ-KtxmzVc-bYoHe1tYahcE4DgK4eHsgaXnGL0o5ZyPQmjae-DkmqJb6zoZ__TJowxWjHYIocZvmaHN7K3vedQ/s640/Dibujo08.PNG" width="640" /></a></div>
<br />
Finalmente, en el apartado <i>Referenciado </i>configuraremos la secuencia de referenciado. La secuencia que necesito es:<br />
<ul>
<li>avanzar hacia la derecha hasta encontrar la leva de referenciado. </li>
<li>detener el movimiento.</li>
<li>avanzar hacia la izquierda a velocidad lenta hasta perder la leva.</li>
<li>detener el movimiento.</li>
<li>ajustar esa posición como origen (cero).</li>
</ul>
<div>
Se podría mejorar la precisión buscando el impulso de origen del encóder, pero para mi aplicación no es necesario.</div>
<div>
<br /></div>
<div>
Voy a configurar el número de secuencia 13 para iniciar el referenciado, sentido positivo de búsqueda inicial de le leva de referenciado, con inversión de sentido al encontrar la leva y especifico que la leva de referenciado está conectada al borne 1.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaDYWh0HXUXRmXCVxIH3swIgXW_iRH5h2zOIfMQIJYkdhJ8oG7sVQV5OVY34r-921wGJq75EoszL2viVG5Qsb4GDBs8ySpoWHSofuDn_kyB2n_SgA6J2SSGDnciz5b9OYZlqC0_CEqsfhN/s1600/Dibujo09.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaDYWh0HXUXRmXCVxIH3swIgXW_iRH5h2zOIfMQIJYkdhJ8oG7sVQV5OVY34r-921wGJq75EoszL2viVG5Qsb4GDBs8ySpoWHSofuDn_kyB2n_SgA6J2SSGDnciz5b9OYZlqC0_CEqsfhN/s640/Dibujo09.PNG" width="640" /></a></div>
<div>
<br /></div>
Más abajo especifico las velocidades de búsqueda y vuelta atrás, en porcentaje relativo a la velocidad máxima anteriormente configurada. También especifico el recorrido máximo que hará el servomotor durante la búsqueda de la leva de referenciado. Si fuese necesario, se puede cambiar la cota en la que está situada la leva. Cuando acabemos la configuración debemos pulsar sobre el botón <i>Generar programa de referenciado</i>, que preparará la secuencia 13 y siguientes.<br />
<br />
Una vez terminada toda la configuración deberemos guardarla en la EPROM del servomotor, para no perderla ante una caída de tensión. También es recomendable guardar los parámetros en un archivo <i>.par</i>.<br />
<br />
El Simocom A nos permite probar el funcionamiento del servomotor. Para ello deberemos tomar el control desde el PC (botón <b>PC!</b> de la barra superior). Con <b>F8</b> desbloquearemos el regulador y ya podremos realizar movimientos en modo Jog, probar el referenciado, posicionados, etc.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1RKFMpAY-GPC42m0S6EnBzpDea3KTP8_ok6BuI9wyla2I2VtYlCAXpuWkcLEQL0ErMwlZrc4-6NDwfnssoBvUhhj0Zq4hvN1nmCyxxaARZsRRgqpzJgCbB8ZkkbQTQK6vmAbzeVU2caSK/s1600/Manejo.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1RKFMpAY-GPC42m0S6EnBzpDea3KTP8_ok6BuI9wyla2I2VtYlCAXpuWkcLEQL0ErMwlZrc4-6NDwfnssoBvUhhj0Zq4hvN1nmCyxxaARZsRRgqpzJgCbB8ZkkbQTQK6vmAbzeVU2caSK/s640/Manejo.PNG" width="640" /></a></div>
<br />
Tal y como viene de fábrica, la configuración del referenciado tiene un comportamiento que, en mi caso, no es deseable: se mantiene la señal <i>en referencia</i> incluso después de una pérdida de tensión. Lo que necesito es que sea necesario referenciar cada vez que se encienda la máquina, ya que si se mueve el eje con la máquina apagada, las posiciones del servomotor serán incorrectas, al llevar un <a href="http://es.wikipedia.org/wiki/Codificador_rotatorio">encóder</a> relativo.<br />
<br />
Para solucionar este inconveniente deberemos entrar en la <i>Lista de experto</i>, para que nos muestre todos los parámetros del regulador.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHA334-bNjl8fazcH1WoUmMNyZmOkEfqLqdq2cBIetye-irWtwXsQAL-8veFBDypNVWYQqCsUxbOskIFr64zyvm_dZAckCPwDmwylOWozyFEcwJe2fjM1EDYFLYwsC29nFyJurJnSeaSzx/s1600/Lista+de+experto+1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHA334-bNjl8fazcH1WoUmMNyZmOkEfqLqdq2cBIetye-irWtwXsQAL-8veFBDypNVWYQqCsUxbOskIFr64zyvm_dZAckCPwDmwylOWozyFEcwJe2fjM1EDYFLYwsC29nFyJurJnSeaSzx/s1600/Lista+de+experto+1.PNG" /></a></div>
<br />
<br />
Buscamos el parámetro 56 <i>Opciones de funcionamiento</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMeJnr-J7EBdTVjehPTEkZpVZ_0NWzcO2kPyErSIAi2QxAlAVT7i_FQZgJqUnzpEgBesjbTIzJnrZKpEPXfMQZejfUlsfjx92MrMDs4bxFT7KynmRKD-7DkXqye2a4XPbuzbCgXzF7hHn/s1600/Lista+de+experto+2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMeJnr-J7EBdTVjehPTEkZpVZ_0NWzcO2kPyErSIAi2QxAlAVT7i_FQZgJqUnzpEgBesjbTIzJnrZKpEPXfMQZejfUlsfjx92MrMDs4bxFT7KynmRKD-7DkXqye2a4XPbuzbCgXzF7hHn/s640/Lista+de+experto+2.PNG" width="640" /></a></div>
<br />
Lo seleccionamos y pulsamos <b>F4</b> para editarlo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9ai3wdFlphXm5BkW0tM82NTfDf1Pr-z-osY_TrqMYZvXPmxUvH1mJWhjPUcZgEP4ltL24QCEzk2xo1bsT99sn27kA-d5kcEGBV2jP3nT10F9nROA8n2SsIRWRt87G2wYvkI7yQhoSylxj/s1600/Lista+de+experto+3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9ai3wdFlphXm5BkW0tM82NTfDf1Pr-z-osY_TrqMYZvXPmxUvH1mJWhjPUcZgEP4ltL24QCEzk2xo1bsT99sn27kA-d5kcEGBV2jP3nT10F9nROA8n2SsIRWRt87G2wYvkI7yQhoSylxj/s1600/Lista+de+experto+3.PNG" /></a></div>
<br />
Y según lo especificado en el manual de configuración, debemos marcar los bits 0 y 1. Con esto, cada vez que demos tensión al servomotor deberemos hacer un referenciado. No olvidemos guardar en EPROM los cambios.<br />
<br />
Hasta aquí este ejemplo de configuración de servomotor Posmo A. En una <a href="http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para_26.html">siguiente entrada</a> me meteré con la programación desde un PLC S7-300.<br />
<br />
Cualquier comentario será bienvenido.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com1tag:blogger.com,1999:blog-226572436930860787.post-5837557961121209442011-10-17T13:09:00.000+02:002011-10-18T10:11:03.177+02:00Tres maneras de generar pulsos en un controlador Logix5000Es raro que programando una máquina no sea necesaria una señal pulsante, generalmente para funciones de señalización. En controladores de <a href="http://www.rockwellautomation.com/">Rockwell</a>, por ejemplo del tipo <a href="http://ab.rockwellautomation.com/Programmable-Controllers/SLC-500">SLC 500</a>, podemos echar mano de bits de sistema que cumplen esta función. Sin embargo, en la gama de controladores <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/">Logix5000</a>, si necesitamos un pulso deberemos generarlo nosotros. En esta entrada voy a proponer tres maneras de generar una señal pulsante de un segundo de duración: primero usando temporizadores (<b>PULSO_TEMP</b>), luego leyendo el tiempo del sistema (<b>PULSO_SIS</b>) y finalmente usando tareas periódicas (<b>PULSO_TAREA</b>).<br />
<br />
El código en lógica de escalera para generar un pulso con temporizadores podría tener este aspecto:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlnLjV7UXNc8fWY_WmaLxz3rRBcgla2Bb5ZtlG3wxTrKZgI9m29hEHOoRoigSt8Ett869l1nEo-lSzMSmMiiFpTyErNS-eUkie7WM5lFUQ_z-DMdmOIGnqm3cFgVBOv23JZStn_imDIFU8/s1600/00.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlnLjV7UXNc8fWY_WmaLxz3rRBcgla2Bb5ZtlG3wxTrKZgI9m29hEHOoRoigSt8Ett869l1nEo-lSzMSmMiiFpTyErNS-eUkie7WM5lFUQ_z-DMdmOIGnqm3cFgVBOv23JZStn_imDIFU8/s400/00.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">(Pincha para ver mejor la imagen)</td></tr>
</tbody></table>
<br />
Uso dos temporizadores, uno para controlar el semiciclo activo del pulso y otro para el semiciclo inactivo, y a cada uno de ellos le asigno una duración de 500 ms. Esta es la opción que requiere más programación.<br />
<br />
Otra forma de generar el pulso es leyendo el tiempo del sistema.<a name='more'></a> Para ello tenemos que echar mano de la instrucción <b>GSV</b> (<i>Get System Value</i>), que sirve para leer distintos parámetros de estado del controlador. El tiempo del sistema lo obtendré en una tabla de siete DINT, así que voy a crear un tipo de dato para almacenarlo. Voy al árbol del proyecto y sobre <i>Data Types → User Defined</i>, con el botón derecho del ratón, pulso sobre <i>New Data Type...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw7G2ovLUaIIPtZ2reJgC650Gdi_MWRB0YhuyK3bSydyQ4PdQ3gdWnQOmbSb4np-r9vAp_pSFxfTv_NV5k69JHGeI4_bHMRS6vJwAM9305SM47yor7n72-QNaoUYQWHpQaXdnkiD0T_dQI/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw7G2ovLUaIIPtZ2reJgC650Gdi_MWRB0YhuyK3bSydyQ4PdQ3gdWnQOmbSb4np-r9vAp_pSFxfTv_NV5k69JHGeI4_bHMRS6vJwAM9305SM47yor7n72-QNaoUYQWHpQaXdnkiD0T_dQI/s1600/08.png" /></a></div>
<br />
Y genero un tipo de datos que voy a llamar <b>FECHA_HORA</b> con siete datos de formato DINT donde se almacenarán consecutivamente el año, el mes, el día, la hora, el minuto, los segundo y los microsegundos (ojo con este último dato, son microsegundos, no milisegundos - nunca me había encontrado un PLC con semejante resolución de tiempo).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZLpFLV2IUkIx1p1lMvygzOUjqsjpBxjNjG0AObiP3R4hpQR3L2XhzQMdFJXogSBxrHH3a86tnJCIl4l_ABmNbYfcZYVUXG5MxBPHms4pwylxC0HMrAAJs1m9vwAAhrFkNpFVYIMI3X0P1/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZLpFLV2IUkIx1p1lMvygzOUjqsjpBxjNjG0AObiP3R4hpQR3L2XhzQMdFJXogSBxrHH3a86tnJCIl4l_ABmNbYfcZYVUXG5MxBPHms4pwylxC0HMrAAJs1m9vwAAhrFkNpFVYIMI3X0P1/s400/02.png" width="400" /></a></div>
<br />
Ahora declaramos una variable con este nuevo tipo de dato (yo la he llamado <b>T_ACTUAL</b>) y ya podemos programar:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja978QThuye7RC0IUFMTNhfD4EfBYEZt-bQvFscT57r_xq4DzdV4ZV7F8BGy30P-RkTP_SSiEHSltj3WAkIn3TJ3IybkhnYgvsxIy2ibO_yGOuURQlnc9taR_tZqgO5m39Z5gv31sA5eFv/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja978QThuye7RC0IUFMTNhfD4EfBYEZt-bQvFscT57r_xq4DzdV4ZV7F8BGy30P-RkTP_SSiEHSltj3WAkIn3TJ3IybkhnYgvsxIy2ibO_yGOuURQlnc9taR_tZqgO5m39Z5gv31sA5eFv/s1600/01.png" /></a></div>
<br />
En el primer renglón uso la instrucción <b>GSV</b> para almacenar en la variable <b>T_ACTUAL</b> la lectura del tiempo del sistema. En el dato <i>T_ACTUAL.Microseconds</i> tendré un valor entre 0 y 999 999; para generar el pulso de un segundo veo si ese valor es menor de 500 000 (medio segundo), activándolo en caso afirmativo.<br />
<br />
Las dos formas de generar intermitencias que acabamos de ver tienen un inconveniente, y es que dependemos del tiempo de ciclo del PLC para ejecutar las instrucciones, restando precisión a los pulsos. Esto no tiene importancia si vamos a usar la intermitencia para la señalización, por ejemplo, de una baliza luminosa, pero puede que precisemos pulsos lo más exactos posibles, en este caso debemos usar una tarea periódica. <br />
<br />
Una tarea periódica se ejecuta cada cierto tiempo regular definido por el usuario y se usa para funciones que requieran una ejecución precisa o determinista. Dependiendo del tipo de PLC Logix5000 se pueden crear hasta 32 tareas periódicas (en la gama CompactLogix solo cuatro) y asignar un nivel de prioridad a cada una. Cada vez que se cumple el tiempo de la tarea periódica, se interrumpe la tarea continua, se ejecuta una vez y luego devuelve el control en el mismo punto donde se interrumpió la tarea continua.<br />
<br />
Para crear una tarea periódica, en el árbol de proyecto, pulsamos con el botón derecho del ratón sobre <i>Tasks</i> y seleccionamos <i>New Task...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhau7Y0pdvJBmYINafyK_nBWrfxToS9oXm6vxXwZQcwO097Nks8oR6MD34JU1EtZKaEc7VEkqYcLZXtY3KeM9oBORmoCCsrhnnpKdoHqNtFEZw4ycKA_KebDz-46BKfhb3xlGVnj1dpZkZA/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhau7Y0pdvJBmYINafyK_nBWrfxToS9oXm6vxXwZQcwO097Nks8oR6MD34JU1EtZKaEc7VEkqYcLZXtY3KeM9oBORmoCCsrhnnpKdoHqNtFEZw4ycKA_KebDz-46BKfhb3xlGVnj1dpZkZA/s1600/09.png" /></a></div>
<br />
Le asignamos un nombre (en mi caso <b>PULSOS</b>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK2ZJgKbwyFKQwrzeiIU0v2DBmjdcoq_-Dz8RDIC4u8QWCZ8dctrBNVLYjGcV_H_gFbtrl7BqJ0m1JqOEkjsAkya55TkswXpGRnIumHMk6ZRU72fkNJoJ4RBU0sCK3iBk78WmoAnuxrARk/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK2ZJgKbwyFKQwrzeiIU0v2DBmjdcoq_-Dz8RDIC4u8QWCZ8dctrBNVLYjGcV_H_gFbtrl7BqJ0m1JqOEkjsAkya55TkswXpGRnIumHMk6ZRU72fkNJoJ4RBU0sCK3iBk78WmoAnuxrARk/s1600/03.png" /></a></div>
<br />
Vamos a la pestaña <i>Configuration</i> y en <i>Period</i> asignamos un valor de 500 ms.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXtTnTt3kcyaqTUT1xWQVljU4SXO-tMQ15ju_dns9RbEuqqMBuFOu9uL6wssNihTMPEowV11RnxA8dWHiU29pfwTWDG_ZNqVzcRARMavMVJ3t0F6Za8rAhDve5NJTvF79Xm4Bss56hPqQU/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXtTnTt3kcyaqTUT1xWQVljU4SXO-tMQ15ju_dns9RbEuqqMBuFOu9uL6wssNihTMPEowV11RnxA8dWHiU29pfwTWDG_ZNqVzcRARMavMVJ3t0F6Za8rAhDve5NJTvF79Xm4Bss56hPqQU/s1600/04.png" /></a></div>
<br />
Dentro de esta nueva tarea creamos un programa (<b>GENERADOR</b>) y dentro del programa una rutina (<b>PULSO_TAREA</b>). Esta rutina la asigno como rutina principal al programa:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTCUKEq8P4Hk1SCA5hacqwVgkGFA-X13XroL5CrVSeECmEmiPXg-hCarIZ7lpA5qoGQoLeRWAywZcPCEo_a9G7fuKellGJdoi3xVUn_F3KKJp1kxeQVS5Ltflk_hHujV9-AAanL8iS1wrJ/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTCUKEq8P4Hk1SCA5hacqwVgkGFA-X13XroL5CrVSeECmEmiPXg-hCarIZ7lpA5qoGQoLeRWAywZcPCEo_a9G7fuKellGJdoi3xVUn_F3KKJp1kxeQVS5Ltflk_hHujV9-AAanL8iS1wrJ/s1600/05.png" /></a></div>
<br />
El código de esta rutina es algo tan sencillo como el siguiente renglón:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTIZxZoozifEnIjUSiKyP_4bs7ylvb42wuBnGwQ_HAbgZCNBAEOceJJZnbac1Em-PQWbAtF6hl_XnM7wPVC9ehvfm0OZYViIJm-suI5PVbQpyE4SXYGdQJjXrAmt05piVgTgV19NRGwAZZ/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTIZxZoozifEnIjUSiKyP_4bs7ylvb42wuBnGwQ_HAbgZCNBAEOceJJZnbac1Em-PQWbAtF6hl_XnM7wPVC9ehvfm0OZYViIJm-suI5PVbQpyE4SXYGdQJjXrAmt05piVgTgV19NRGwAZZ/s1600/06.png" /></a></div>
<br />
Cada 500 ms se ejecuta la rutina y en ella invierto la señal del pulso.<br />
<br />
En la siguiente captura de pantalla se ven los tres pulsos funcionando simultánemante:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8S762S2zDXie707IyfNBtYEbmqXEVX29NdQwOCd99Aapi5sFHVrP8aTzakBjr1uWjPXd0MTiRxry-UEGuF49Lf2FBo2YxLnyNpLNtQEqJiu4orzYtvv5LUMJwAJSpuQiXxExFgf9Pyj_F/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8S762S2zDXie707IyfNBtYEbmqXEVX29NdQwOCd99Aapi5sFHVrP8aTzakBjr1uWjPXd0MTiRxry-UEGuF49Lf2FBo2YxLnyNpLNtQEqJiu4orzYtvv5LUMJwAJSpuQiXxExFgf9Pyj_F/s400/07.png" width="400" /></a></div>
<br />
Por si alguien tiene interés, el proyecto para RSLogix 5000 de esta entrada está disponible <a href="http://goo.gl/DaTmX">aquí</a>.<br />
<br />
Y hasta aquí esta sencilla entrada sobre programación de pulsos en Logix, si algún lector tiene algún método diferente le agradeceré que lo comparta en los comentarios.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com7tag:blogger.com,1999:blog-226572436930860787.post-45377289238437233912011-10-07T16:49:00.000+02:002011-10-07T16:49:18.891+02:00Comunicación OPC con un PLC Logix5000 desde Visual BasicYa he hablado en el blog de comunicación <a href="http://es.wikipedia.org/wiki/OPC">OPC</a>, en concreto en <a href="http://notasdeautomatizacion.blogspot.com/2009/09/comunicacion-opc-entre-un-plc-software.html">esta entrada</a> traté el acceso a un WinAC desde Visual Basic. Ahora, aprovechando la configuración que tengo con <a href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html">SoftLogix</a> sobre una máquina virtual, voy a hacer lo mismo.<br />
<br />
Mi prueba consistirá en crear un proyecto para SoftLogix en el que definiré un par de tags, <b>OPC_BIT</b> y <b>OPC_DINT</b>, que me servirán para probar la comunicación. En el SoftLogix no voy a hacer nada más, simplemente le transferiré el proyecto, lo pondre en modo <i>Run</i> y monitorizaré el contenido de los tags. Luego generaré un enlace OPC con el <a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslinx/">RSLinx</a> y desde un programa en <a href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-basic-express">Visual Basic</a> leeré y escribiré en los tags del PLC.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtqVdwnYPASbxBgJswQ4oUOByhaXEtyjcjpvfsZjaALKeL1aXqfljLWUFqJUKhHofy_s46bdttMU04_YOeHiaQYsszkpTtd8K1FVdlYDUMCXiQC2lxParQfaMm8cPqAy_vqHE9bKfnYZnR/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtqVdwnYPASbxBgJswQ4oUOByhaXEtyjcjpvfsZjaALKeL1aXqfljLWUFqJUKhHofy_s46bdttMU04_YOeHiaQYsszkpTtd8K1FVdlYDUMCXiQC2lxParQfaMm8cPqAy_vqHE9bKfnYZnR/s1600/04.png" /></a></div>
<br />
Para establecer una comunicación OPC necesitaré un servidor OPC, y <a href="http://www.rockwellautomation.com/">Rockwell</a> nos lo proporciona integrado con el RSLinx, pero ojo, deberemos asegurarnos de que no sea la versión lite. Recomiendo echar un vistazo a este documento <a href="http://samplecode.rockwellautomation.com/idc/groups/literature/documents/gr/lnx-gr001_-es-e.pdf">Cómo obtener resultados con RSLinx Classic</a> (pdf) donde se especifica para qué sirve cada versión de RSLinx.<br />
<a name='more'></a><br />
En el ordenador donde tengo instalado Visual Basic he instalado RSLinx Classic. Con mi SoftLogix funcionando compruebo que lo detecta.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYWQ5Kou3UDPBsuUAByPoSPmDXxjLBFzcpEcLZwd-nvEmcJm_aF1JdMsCKD8ZtdwvzXEmxXSm5AxTOS57NIY-Xas11X7aJ39B1xoVzVK5NiUlK0rEe25_DzF0yicKI5aMTQA8XzH4sdJSb/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYWQ5Kou3UDPBsuUAByPoSPmDXxjLBFzcpEcLZwd-nvEmcJm_aF1JdMsCKD8ZtdwvzXEmxXSm5AxTOS57NIY-Xas11X7aJ39B1xoVzVK5NiUlK0rEe25_DzF0yicKI5aMTQA8XzH4sdJSb/s1600/02.png" /></a></div>
<br />
Para obtener acceso al PLC a través de OPC deberemos configurar un <i>Topic</i>, que es la definición de la ruta de acceso al controlador. Para ello vamos al menú de RSLinx y pulsamos sobre <i>DDE/OPC → Topic Configuration... </i>y aparecerá una ventana donde seleccionaremos nuestro controlador y le asignaremos un <i>Topic</i>, en mi caso <b>PRUEBA_OPC</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvo-DVRU7jBmR-JHZ7mn1cBR6zb42Z4_xRi3ubiIvaQ5tDfefbfxxELWgLvQfIVYf51vRtkjXZ4MJ_g2NPaN-SadXABdSsAfSS3O1IruTuzybXsZ-W8U15i5L0JOd_LwzsKMjGOiGgZCQs/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvo-DVRU7jBmR-JHZ7mn1cBR6zb42Z4_xRi3ubiIvaQ5tDfefbfxxELWgLvQfIVYf51vRtkjXZ4MJ_g2NPaN-SadXABdSsAfSS3O1IruTuzybXsZ-W8U15i5L0JOd_LwzsKMjGOiGgZCQs/s1600/03.png" /></a></div>
<br />
Aceptamos y ya podemos cerrar el RSLinx. Para comprobar que nuestro servidor OPC funciona, Rockwell suministra la herramienta <i>OPC Test Client</i> (se instala conjuntamente con el RSLinx). La ejecutamos y vamos al menú <i>Server → Connect...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs43OE2GoNdetqFMc-gZMEhDRvOBIJHTLVLKxwYwPcFucwzFQXdCPj2T2z7CDN5vaFlMkyP9-nOj-lA1IZ95gHzD-sKCIwdMOUnzvnJw-Eb0OnhWURlXhyphenhyphenrBmEBHvwa-zLLQc7IBS_Yonx/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs43OE2GoNdetqFMc-gZMEhDRvOBIJHTLVLKxwYwPcFucwzFQXdCPj2T2z7CDN5vaFlMkyP9-nOj-lA1IZ95gHzD-sKCIwdMOUnzvnJw-Eb0OnhWURlXhyphenhyphenrBmEBHvwa-zLLQc7IBS_Yonx/s1600/06.png" /></a></div>
<br />
Selecciono <i>RSLinx OPC Server</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLWvbAEQa3q6Hfq0Zf-_YNZma9VeZXTMx_H6yRDDql7kf9J0Oi-a9E0kBrrUQ_oK1yxpQu6JjtCUhJFAx2hbwP8_imVcOdEqWroMlGszCtqhUWMaYxX83Re0IBylWHJTHyIFscMcIzM9g9/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLWvbAEQa3q6Hfq0Zf-_YNZma9VeZXTMx_H6yRDDql7kf9J0Oi-a9E0kBrrUQ_oK1yxpQu6JjtCUhJFAx2hbwP8_imVcOdEqWroMlGszCtqhUWMaYxX83Re0IBylWHJTHyIFscMcIzM9g9/s1600/07.png" /></a></div>
<br />
Ahora tenemos que añadir un grupo, vamos al menú <i>Group → Add Group...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-XTelZyZ1EMEh9JYs8N-skqUsd_gi_cPiWdd0y3EUeVs3joN7CKSKa_20dHe0TlriE69hJ91BkJg5KMBD494cYJh6pS22R3mthfdNRqcV362N7aRA8hUBKL3heiLjxKSfNrB2T6nYRTDr/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-XTelZyZ1EMEh9JYs8N-skqUsd_gi_cPiWdd0y3EUeVs3joN7CKSKa_20dHe0TlriE69hJ91BkJg5KMBD494cYJh6pS22R3mthfdNRqcV362N7aRA8hUBKL3heiLjxKSfNrB2T6nYRTDr/s1600/08.png" /></a></div>
<br />
Le asignamos un nombre cualquiera y aceptamos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVRHsYb_klgs-oAd9-HiUPMD2J8R1UhJwVxBaOYaJCXgUCfpKnGvb-xtEw3fWEVwYGROzZ_gIsw4dXUG5_oIf0tT-DjhajKRkwVLw9NPFW1J4m3BFyPKTN34vVMJyEWCZmATmrn9mzI653/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVRHsYb_klgs-oAd9-HiUPMD2J8R1UhJwVxBaOYaJCXgUCfpKnGvb-xtEw3fWEVwYGROzZ_gIsw4dXUG5_oIf0tT-DjhajKRkwVLw9NPFW1J4m3BFyPKTN34vVMJyEWCZmATmrn9mzI653/s1600/09.png" /></a></div>
<br />
Ya solo falta añadir Items (que serán nuestros tags), vamos al menú <i>Item → Add Item...</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdGmSWjBdXWB9_iS2T8LSleeSiwe-AOKVc73CPoCcwE85Mle5mWTpK4KsbXceSc1Kv9l6UiiBKzJPzklOWkkMYwyar3Gd7DLGaAQBrExWkxAKQRfpoLrXxt5kIlAzmYbVt0nqd5DaH3Sec/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdGmSWjBdXWB9_iS2T8LSleeSiwe-AOKVc73CPoCcwE85Mle5mWTpK4KsbXceSc1Kv9l6UiiBKzJPzklOWkkMYwyar3Gd7DLGaAQBrExWkxAKQRfpoLrXxt5kIlAzmYbVt0nqd5DaH3Sec/s1600/10.png" /></a></div>
<br />
En la ventana que aparece, en la parte inferior izquierda navegamos por el árbol del servidor OPC, seleccionamos dentro de nuestro <i>Topic</i> la opción <i>online</i> y a la derecha deberán mostrarse los tags de nuestro proyecto Logix5000. Selecciono el tag que me interese y pulso el botón <i>Add Item</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoCo79Ikd_ks6JLy4qlri095oGbFe_Pz6r2E67UTFTU_BbOFOWXHyzySX3SbsEoEPigNJNh6wNvI9zb6NMVSc6P41Ww1Eam5rpxxY6H__PUxrsrT4q6J4Nn-TCGWy5Eu6GCM0HcJjXU8lO/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoCo79Ikd_ks6JLy4qlri095oGbFe_Pz6r2E67UTFTU_BbOFOWXHyzySX3SbsEoEPigNJNh6wNvI9zb6NMVSc6P41Ww1Eam5rpxxY6H__PUxrsrT4q6J4Nn-TCGWy5Eu6GCM0HcJjXU8lO/s1600/11.png" /></a></div>
<br />
Y ya podemos ver el contenido de nuestro tag. Si modificamos su valor desde el RSLogix5000 veremos en el <i>OPC Test Client</i> como varía.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXOlKzfrD-UaITjDnP6SPkSGSJSLAXqlZavanz3sKLlhp3TmflqvUi5y1mX6if399-ctZqAP04EFLkW5a3ixUi55gWGINDK2tV4t3HhShSVir6t0o-MSYQNWKt3rQtJ7Eodxgs1e-AGNby/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXOlKzfrD-UaITjDnP6SPkSGSJSLAXqlZavanz3sKLlhp3TmflqvUi5y1mX6if399-ctZqAP04EFLkW5a3ixUi55gWGINDK2tV4t3HhShSVir6t0o-MSYQNWKt3rQtJ7Eodxgs1e-AGNby/s1600/12.png" /></a></div>
<br />
Ya hemos comprobado que tenemos acceso por OPC a nuestro controlador. Ahora lo que voy a hacer es la misma operación pero desde un programa en Visual Basic.<br />
<br />
Crearemos un proyecto en Visual Basic y, para tener acceso a las funciones de comunicación OPC, deberemos agregar, en mi caso, la referencia <i>OPC DA Automation Wrapper 2.02</i> (<i>OPCDAAuto.DLL</i>) que estará disponible en mi ordenador al tener instalado el RSLinx. Esta referencia difiere según sea la versión de RSLinx de que dispongamos; según leo en el <a href="http://www.control.com/thread/1003433372">foro de control.com</a> deberemos agregar <i>RsLinxOPCAuto.DLL</i> o incluso <i>RsiOPCAuto.DLL</i> si disponemos de versiones antiguas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjycWPb8E1wWzYMVrDrLFWkpthKSSVt-W7O7HQClWTEKGSNGj86uhl758XJqinRxUn3BSkEZPfxNhgWkZg_W8cKvWYnqxPEx7F2K7SeWg17yaul8EnEjN7iArh4oRPvCXERln9MPlRtQD9U/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjycWPb8E1wWzYMVrDrLFWkpthKSSVt-W7O7HQClWTEKGSNGj86uhl758XJqinRxUn3BSkEZPfxNhgWkZg_W8cKvWYnqxPEx7F2K7SeWg17yaul8EnEjN7iArh4oRPvCXERln9MPlRtQD9U/s1600/00.png" /></a></div>
<br />
Comprobamos que en <i>Espacios de nombres importados</i> esté marcado <i>RsiOPCAuto</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrqPeRfs89UpCRo3UpXeaik3Fi_RTezqEYvTzT9Gw3iIDdVNYdXJ39J60nyxdnnLxO6WifRTVu0KEWj6zR9NSzRAetjQsCZwOxGoTgX4muaPhpO0pUjjSeG1MYiFUe5oG1pucA-4WFXCX2/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrqPeRfs89UpCRo3UpXeaik3Fi_RTezqEYvTzT9Gw3iIDdVNYdXJ39J60nyxdnnLxO6WifRTVu0KEWj6zR9NSzRAetjQsCZwOxGoTgX4muaPhpO0pUjjSeG1MYiFUe5oG1pucA-4WFXCX2/s1600/01.png" /></a></div>
<br />
Con esto ya podemos empezar a programar. Voy a adaptar el código de la clase que programé en la <a href="http://notasdeautomatizacion.blogspot.com/2009/09/comunicacion-opc-entre-un-plc-software.html">entrada sobre OPC y WinAC</a>:<br />
<blockquote>
Imports OPCAutomation<br />
<br />
Public Class OPC_NdA 'OPC Notas de Automatización<br />
'Objectos para establecer la comunicación OPC<br />
Private WithEvents ServidorOPC As OPCServer<br />
Private WithEvents GrupoOPC As OPCGroup<br />
Private WithEvents GruposOPC As OPCGroups<br />
Private ItemOPC() As OPCItem<br />
<br />
Public Conectado As Boolean 'Para saber si la conexión está activada<br />
<br />
'Si hay algún error se indica en estas variables<br />
Public Mensaje As String<br />
Public Detalle_Error As String<br />
<br />
'Constructor<br />
Public Sub New()<br />
'Al crear el objeto, no estamos conectados<br />
Conectado = False<br />
End Sub<br />
<br />
'Función para activar la conexión OPC<br />
Public Function Conectar() As Boolean<br />
<br />
'Si ya estoy conectado aviso y salgo.<br />
If Conectado Then<br />
Mensaje = "Error conexión OPC."<br />
Detalle_Error = "Se ha intentado crear una conexión OPC cuando ya hay una creada."<br />
Conectar = False<br />
Exit Function<br />
End If<br />
<br />
Try<br />
Mensaje = "Conectando con el servidor OPC..."<br />
ServidorOPC = New OPCServer<br />
ServidorOPC.Connect("RSLinx OPC Server")<br />
<br />
Mensaje = "Añadiendo grupo al servidor OPC..."<br />
GruposOPC = ServidorOPC.OPCGroups<br />
GrupoOPC = GruposOPC.Add("Grupo1")<br />
<br />
GrupoOPC.IsActive = True<br />
GrupoOPC.UpdateRate = 1000<br />
GrupoOPC.IsSubscribed = True<br />
<br />
Mensaje = "Añadiendo Items al grupo..."<br />
ReDim ItemOPC(100) 'Dimensionar según las necesidades<br />
<br />
'Introducir un ítem por cada variable del PLC en la que queramos leer o escribir<br />
'A cada ítem le asignamos un número, que debemos recordar para referirnos a él en el programa<br />
ItemOPC(0) = GrupoOPC.OPCItems.AddItem("[PRUEBA_OPC]OPC_DINT", 0)<br />
ItemOPC(1) = GrupoOPC.OPCItems.AddItem("[PRUEBA_OPC]OPC_BIT", 1)<br />
<br />
Catch ex As Exception<br />
<br />
Detalle_Error = "Error: " & ex.ToString<br />
Conectado = False<br />
Conectar = False<br />
Exit Function<br />
<br />
End Try<br />
<br />
Mensaje = "Conexión OPC realizada correctamente."<br />
Detalle_Error = ""<br />
Conectado = True<br />
Conectar = True<br />
<br />
End Function<br />
<br />
'Función para deshacer la conexión OPC<br />
Public Function Desconectar() As Boolean<br />
Try<br />
Mensaje = "Desconectando..."<br />
ItemOPC = Nothing<br />
<br />
If Not IsNothing(ServidorOPC) Then<br />
ServidorOPC.OPCGroups.RemoveAll()<br />
ServidorOPC.Disconnect()<br />
ServidorOPC = Nothing<br />
End If<br />
GrupoOPC = Nothing<br />
GruposOPC = Nothing<br />
<br />
Catch ex As Exception<br />
<br />
Detalle_Error = "Error: " & ex.ToString<br />
Desconectar = False<br />
Exit Function<br />
<br />
End Try<br />
<br />
Mensaje = "Desconexión realizada correctamente."<br />
Detalle_Error = ""<br />
Conectado = False<br />
Desconectar = True<br />
<br />
End Function<br />
<br />
'Función para escribir en un ítem que representa una variable entera<br />
'Se le pasa el índice del ítem y el valor que vamos a escribir<br />
'Si todo va bien devuelve True<br />
Public Function EscribirItemInt(ByVal Indice As Integer, ByVal Entero As Integer) As Boolean<br />
Dim Dims() As Integer = New Integer() {1}<br />
Dim Bounds() As Integer = New Integer() {1}<br />
Dim Serverhandles As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)<br />
Dim Errores As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)<br />
Dim Valores As Array = Array.CreateInstance(GetType(Object), Dims, Bounds)<br />
<br />
If Not Conectado Then<br />
Mensaje = "Error conexión OPC."<br />
Detalle_Error = "No hay establecida una conexión OPC."<br />
EscribirItemInt = False<br />
Exit Function<br />
End If<br />
<br />
Try<br />
Serverhandles.SetValue(ItemOPC(Indice).ServerHandle, 1)<br />
Errores.SetValue(0, 1)<br />
Valores.SetValue(Entero, 1)<br />
<br />
GrupoOPC.SyncWrite(1, Serverhandles, Valores, Errores)<br />
<br />
Catch ex As Exception<br />
<br />
Detalle_Error = ex.ToString<br />
Mensaje = "¡Error al escribir Item! [Int, Índice " & Indice & "]"<br />
EscribirItemInt = False<br />
Exit Function<br />
<br />
End Try<br />
<br />
Mensaje = ""<br />
Detalle_Error = ""<br />
EscribirItemInt = True<br />
<br />
End Function<br />
<br />
'Función para escribir en un ítem que representa una variable booleana<br />
'Se le pasa el índice del ítem y el valor que vamos a escribir<br />
'Si todo va bien devuelve True<br />
Public Function EscribirItemBool(ByVal indice As Integer, ByVal Bit As Boolean) As Boolean<br />
Dim Dims() As Integer = New Integer() {1}<br />
Dim Bounds() As Integer = New Integer() {1}<br />
Dim Serverhandles As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)<br />
Dim Errores As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)<br />
Dim Valores As Array = Array.CreateInstance(GetType(Object), Dims, Bounds)<br />
<br />
If Not Conectado Then<br />
Mensaje = "Error conexión OPC."<br />
Detalle_Error = "No hay establecida una conexión OPC."<br />
EscribirItemBool = False<br />
Exit Function<br />
End If<br />
<br />
Try<br />
Serverhandles.SetValue(ItemOPC(indice).ServerHandle, 1)<br />
Errores.SetValue(0, 1)<br />
Valores.SetValue(Bit, 1)<br />
<br />
GrupoOPC.SyncWrite(1, Serverhandles, Valores, Errores)<br />
<br />
Catch ex As Exception<br />
<br />
Detalle_Error = ex.ToString<br />
Mensaje = "¡Error al escribir Item! [Bool, Índice " & indice & "]"<br />
EscribirItemBool = False<br />
Exit Function<br />
<br />
End Try<br />
<br />
Mensaje = ""<br />
Detalle_Error = ""<br />
EscribirItemBool = True<br />
<br />
End Function<br />
<br />
'Función para leer un ítem que representa una variable entera<br />
'Se le pasa el índice del ítem que vamos a leer<br />
'Si todo va bien devuelve el valor de la variable<br />
Public Function LeerItemInt(ByVal Indice) As Integer<br />
<br />
Dim Valor As Object = Nothing<br />
Dim Calidad As Object = Nothing<br />
Dim TimeStamp As Object = Nothing<br />
<br />
If Not Conectado Then<br />
Mensaje = "Error conexión OPC."<br />
Detalle_Error = "No hay establecida una conexión OPC."<br />
LeerItemInt = 0<br />
Exit Function<br />
End If<br />
<br />
Try<br />
ItemOPC(Indice).Read(OPCDataSource.OPCDevice, Valor, Calidad, TimeStamp)<br />
LeerItemInt = CInt(Valor.ToString)<br />
<br />
Catch ex As Exception<br />
<br />
Detalle_Error = ex.ToString<br />
Mensaje = "¡Error al leer Item! [Int, Índice " & Indice & "]"<br />
LeerItemInt = 0<br />
Exit Function<br />
<br />
End Try<br />
<br />
Mensaje = ""<br />
Detalle_Error = ""<br />
<br />
End Function<br />
<br />
'Función para leer un ítem que representa una variable booleana<br />
'Se le pasa el índice del ítem que vamos a leer<br />
'Si todo va bien devuelve el valor de la variable<br />
Public Function LeerItemBool(ByRef Indice) As Boolean<br />
<br />
Dim Valor As Object = Nothing<br />
Dim Calidad As Object = Nothing<br />
Dim TimeStamp As Object = Nothing<br />
<br />
If Not Conectado Then<br />
Mensaje = "Error conexión OPC."<br />
Detalle_Error = "No hay establecida una conexión OPC."<br />
LeerItemBool = 0<br />
Exit Function<br />
End If<br />
<br />
Try<br />
ItemOPC(Indice).Read(OPCDataSource.OPCDevice, Valor, Calidad, TimeStamp)<br />
If StrComp(Valor.ToString, "True") = 0 Or Valor = 1 Then<br />
LeerItemBool = True<br />
Else<br />
LeerItemBool = False<br />
End If<br />
<br />
Catch ex As Exception<br />
<br />
Detalle_Error = ex.ToString<br />
Mensaje = "¡Error al leer Item! [Bool, Índice " & Indice & "]"<br />
LeerItemBool = False<br />
Exit Function<br />
<br />
End Try<br />
<br />
Mensaje = ""<br />
Detalle_Error = ""<br />
<br />
End Function<br />
<br />
End Class</blockquote>
<br />
Con respecto al <a href="http://notasdeautomatizacion.blogspot.com/2009/09/comunicacion-opc-entre-un-plc-software_03.html">código que hice para Siemens</a> simplemente he cambiado en la función <i>Conectar</i> el servidor OPC a <b>RSLinx OPC Server</b> y he adaptado la lista de items.<br />
<br />
Para introducir los items deberemos especificar el nombre del <i>Topic</i> que hayamos configurado en el RSLinx entre corchetes seguido del nombre del tag, por ejemplo:<br />
<br />
<blockquote>
ItemOPC(0) = GrupoOPC.OPCItems.AddItem("[PRUEBA_OPC]OPC_DINT", 0)</blockquote>
<br />
Las funciones para leer y escribir booleanos y enteros son las mismas que las programadas en el OPC de Siemens.<br />
<br />
Ya solo nos queda crear una interfaz sencilla para probar la conexión:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwrKD46lmmLsvWemeW5dwsBOY_F2UL4L23GhnZpI_k1YRgZmSKVGaMDaV0QzqhIPzhsrmjKJaZsZEkhmS4qZB98ilrlL-LLnJdJ_j5WcNyeMxWw7PpXKl0JgWBsBtvbFtDeiq47aELDiBJ/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwrKD46lmmLsvWemeW5dwsBOY_F2UL4L23GhnZpI_k1YRgZmSKVGaMDaV0QzqhIPzhsrmjKJaZsZEkhmS4qZB98ilrlL-LLnJdJ_j5WcNyeMxWw7PpXKl0JgWBsBtvbFtDeiq47aELDiBJ/s1600/13.png" /></a></div>
<br />
Pulsando el botón <i>Conectar</i> se establecerá la conexión OPC y si todo va correctamente podremos escribir y leer valores en el tag <b>OPC_DINT</b> y cambiar el estado del booleano <b>OPC_BIT</b>.<br />
<br />
El código de este sencillo programa lo tienes en <a href="http://goo.gl/iCHJE">este proyecto de Visual Basic</a>.<br />
<br />
Y hasta aquí esta toma de contacto con la tecnología OPC en Rockwell. No es un ejemplo elaborado, pero espero que pueda servir de punto de partida para aplicaciones más complejas.<br />
<br />
Como siempre, agradeceré cualquier comentario.GRhttp://www.blogger.com/profile/16097531750734003921noreply@blogger.com28