<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUEGQn06eyp7ImA9WhRbEEg.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787</id><updated>2012-02-01T01:53:43.313+01:00</updated><category term="Festo" /><category term="PanelView" /><category term="WinCC Flexible" /><category term="SoftLogix" /><category term="libnodave" /><category term="Profibus" /><category term="Mensajes" /><category term="CX9010" /><category term="Step5" /><category term="Omron" /><category term="Visual Basic Script" /><category term="TwinCAT System Manager" /><category term="Rockwell" /><category term="atornillador" /><category term="LOGO" /><category term="Comunicación" /><category term="Motion control" /><category term="WinAC RTX" /><category term="Rexroth" /><category term="Simocom A" /><category term="HMI" /><category term="Neumática" /><category term="Cursos" /><category term="variador" /><category term="Step7" /><category term="CompactLogix" /><category term="encóder" /><category term="Siemens" /><category term="POV-Ray" /><category term="Visual Basic" /><category term="firmware" /><category term="tiempo de ciclo" /><category term="simotion" /><category term="diseño" /><category term="Simodrive" /><category term="NT21" /><category term="OPC" /><category term="MPI" /><category term="BC3100" /><category term="KS2000" /><category term="servomotor" /><category term="Micromaster" /><category term="Ethernet" /><category term="Profinet" /><category term="Beckhoff" /><category term="Pro-face" /><category term="NTST" /><category term="serie" /><category term="Ecodrive03" /><category term="Logix" /><category term="Industrial Ethernet" /><category term="Licencias" /><category term="Simocom U" /><category term="CX-Programmer" /><category term="CPM2C" /><category term="Add-On" /><category term="Remanencia" /><category term="S5/S7 for Windows" /><category term="Proyecto" /><category term="Indramat" /><category term="scout" /><category term="Factory Talk View ME" /><category term="Seguridad" /><category term="Posmo" /><category term="PLC Software" /><category term="sinamics" /><category term="pulsos" /><category term="RSLogix 5000" /><title>Notas de automatización</title><subtitle type="html">A modo de recordatorio y también por si a alguien le sirve, en este blog voy a reflejar aquellas experiencias de mi trabajo de automatización industrial que creo puedan resultar interesantes.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://notasdeautomatizacion.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/NotasDeAutomatizacin" /><feedburner:info uri="notasdeautomatizacin" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0ECRXs8cCp7ImA9WhRUFUo.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-4897786651350172615</id><published>2012-01-17T15:37:00.000+01:00</published><updated>2012-01-26T12:01:04.578+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T12:01:04.578+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="MPI" /><category scheme="http://www.blogger.com/atom/ns#" term="Comunicación" /><title>Probando un adaptador USB/MPI chino</title><content type="html">Recientemente, en el &lt;a href="http://www.infoplc.net/foro/showthread.php?8316-PC-Adapter-MPI-en-maquina-virtual"&gt;foro de Siemens en infoPLC&lt;/a&gt;, me enteré de la existencia de un adaptador USB/MPI muy económico que se vende a través de &lt;a href="http://www.ebay.es/itm/USB-to-MPI-Interface-Adapter-For-Siemens-Simatic-S7-300-/260679235521?pt=BI_Control_Systems_PLCs&amp;amp;hash=item3cb1b177c1#ht_2197wt_922"&gt;ebay&lt;/a&gt;,&amp;nbsp;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:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DKo8L3P67JA/TxVWsMXgQcI/AAAAAAAACBw/WJijBvqZ85Y/s1600/close.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="277" src="http://3.bp.blogspot.com/-DKo8L3P67JA/TxVWsMXgQcI/AAAAAAAACBw/WJijBvqZ85Y/s400/close.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;(pulsar encima para ampliar)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
La primera impresión es bastante lamentable, leer &lt;i&gt;For SEMIES S7-300&lt;/i&gt; 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:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7K8aojKKqiA/TxVWttLvFAI/AAAAAAAACB4/_sjbjb066M0/s1600/open.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="190" src="http://1.bp.blogspot.com/-7K8aojKKqiA/TxVWttLvFAI/AAAAAAAACB4/_sjbjb066M0/s400/open.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Han raspado los chips para evitar su identificación (pulsar para ampliar)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Nada más leer el CD saltó el antivirus detectando una amenaza.&amp;nbsp;Dentro viene documentación en perfecto chino y también el programa de instalación del controlador del &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7972-0CB20-0XA0&amp;amp;caller=view"&gt;PC Adapter USB original de Siemens&lt;/a&gt; (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.&lt;br /&gt;
&lt;br /&gt;
Conecto el adaptador a mi ordenador y lo asigno a la máquina virtual de &lt;a href="https://www.virtualbox.org/"&gt;Virtual Box&lt;/a&gt; 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.&lt;br /&gt;
&lt;br /&gt;
El siguiente paso es ajustar el interface PG/PC. Debemos seleccionar &lt;b&gt;PC Adapter&lt;/b&gt;, en mi caso con la opción &lt;b&gt;Auto&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-r4HweTPGt4o/TxVWp8X0T_I/AAAAAAAACBg/lKXsthHRQ50/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-r4HweTPGt4o/TxVWp8X0T_I/AAAAAAAACBg/lKXsthHRQ50/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Pulsamos el botón de &lt;b&gt;Propiedades &lt;/b&gt;y en la pestaña &lt;b&gt;Conexión local&lt;/b&gt; debemos seleccionar &lt;b&gt;Conexión a USB&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-3OD3PcqtHLU/TxVWqeEk7xI/AAAAAAAACBk/CCTR6x92h0A/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-3OD3PcqtHLU/TxVWqeEk7xI/AAAAAAAACBk/CCTR6x92h0A/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Aceptamos y listo. Ya solo queda conectar el extremo MPI al PLC y empezar a probar. Yo he usado un &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7315-2AG10-0AB0&amp;amp;caller=view"&gt;PLC Siemens 315-2DP&lt;/a&gt; que ha aceptado la conexión sin problemas: he transferido la configuración hardware, el programa y usado las funciones de visualización &lt;i&gt;on-line&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
También he hecho la prueba de conectarle un panel táctil &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6AV6643-0AA01-1AX0&amp;amp;caller=view"&gt;TP277-6"&lt;/a&gt; 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 &lt;i&gt;routing &lt;/i&gt;MPI-Profibus, y también ha funcionado sin problemas.&lt;br /&gt;
&lt;br /&gt;
En el lateral de la carcasa del adaptador hay dos leds marcados como &lt;b&gt;Power &lt;/b&gt;(rojo) y &lt;b&gt;Active &lt;/b&gt;(verde), pero realmente lo único que hacen es parpadear cuando hay una comunicación activa.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Actualización&lt;/b&gt;: la página del fabricante original de este adaptador es &lt;a href="http://www.dgycgk.com/list.asp?ProdId=0379"&gt;ésta&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-4897786651350172615?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4aA9aeSkvUXOVvZzgHU7HG0YJ-8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4aA9aeSkvUXOVvZzgHU7HG0YJ-8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4aA9aeSkvUXOVvZzgHU7HG0YJ-8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4aA9aeSkvUXOVvZzgHU7HG0YJ-8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/hTBK6k-QGZw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/4897786651350172615/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2012/01/probando-un-adaptador-usbmpi-chino.html#comment-form" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4897786651350172615?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4897786651350172615?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/hTBK6k-QGZw/probando-un-adaptador-usbmpi-chino.html" title="Probando un adaptador USB/MPI chino" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-DKo8L3P67JA/TxVWsMXgQcI/AAAAAAAACBw/WJijBvqZ85Y/s72-c/close.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2012/01/probando-un-adaptador-usbmpi-chino.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEICRns-eSp7ImA9WhRVF04.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-4091060102228375128</id><published>2012-01-16T17:25:00.000+01:00</published><updated>2012-01-16T17:49:27.551+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T17:49:27.551+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="HMI" /><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="WinCC Flexible" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><title>Modificando tiempos en un PLC S7 desde WinCC Flexible RT</title><content type="html">Recientemente me ha tocado actualizar el programa de una máquina que llevaba un panel táctil realizado en &lt;a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;nodeid0=10805581&amp;amp;lang=es&amp;amp;siteid=cseus&amp;amp;aktprim=0&amp;amp;extranet=standard&amp;amp;viewreg=WW&amp;amp;objid=10805580&amp;amp;treeLang=es"&gt;ProTool&lt;/a&gt;.&amp;nbsp;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 &lt;b&gt;WORD&lt;/b&gt;, haciendo la conversión a formato &lt;b&gt;S5TIME &lt;/b&gt;en el PLC, con segmentos como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-WzBYLzDY0kY/TxQ_HwXYxiI/AAAAAAAACBA/-fjYPwLdnGw/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://3.bp.blogspot.com/-WzBYLzDY0kY/TxQ_HwXYxiI/AAAAAAAACBA/-fjYPwLdnGw/s640/03.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
El valor se recibe en un &lt;b&gt;WORD&lt;/b&gt;, se copia en un &lt;b&gt;INT&lt;/b&gt;, que vuelve a ser un &lt;b&gt;WORD &lt;/b&gt;después de la instrucción &lt;b&gt;I_BCD&lt;/b&gt;, se le añade la base de tiempo con la instrucción &lt;b&gt;WOR_W&lt;/b&gt;, para finalmente moverlo a la variable en formato &lt;b&gt;S5TIME &lt;/b&gt;definitiva.&lt;br /&gt;
&lt;br /&gt;
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&amp;nbsp;variables&amp;nbsp;de tipo &lt;b&gt;S5TIME&lt;/b&gt;, pues nada mejor que hacer una sencilla prueba.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Lo primero es crear un proyecto de Step7 con una variable &lt;b&gt;S5TIME &lt;/b&gt;en un bloque de datos y transferirlo a mi PLC.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-GXt5on7Vtv4/TxQ_NWzMOSI/AAAAAAAACBU/nKBEYiDUiow/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-GXt5on7Vtv4/TxQ_NWzMOSI/AAAAAAAACBU/nKBEYiDUiow/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En WinCC Flexible enlazo la variable anterior a un campo de entrada salida, le doy suficiente longitud de representación, tres&amp;nbsp;dígitos&amp;nbsp;para la parte decimal y tipo de formato &lt;i&gt;Decimal&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-PceWPXVUtDA/TxQ_MlV6nZI/AAAAAAAACBQ/xcUYXkZLTPA/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="499" src="http://2.bp.blogspot.com/-PceWPXVUtDA/TxQ_MlV6nZI/AAAAAAAACBQ/xcUYXkZLTPA/s640/01.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
La idea es ir dando distintos valores a la variable desde el &lt;i&gt;Runtime &lt;/i&gt;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&amp;nbsp;simultáneamente&amp;nbsp;el valor de la variable en el PLC y la ejecución del HMI:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DCoqvqn-OAo/TxQ_LsRPw0I/AAAAAAAACBI/IbFfs6jaRag/s1600/00.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="449" src="http://4.bp.blogspot.com/-DCoqvqn-OAo/TxQ_LsRPw0I/AAAAAAAACBI/IbFfs6jaRag/s640/00.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Dos máquinas virtuales: una con Step7 on-line con el PLC y la otra con el RT de WinCC Flexible.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Lo que me he encontrado es que introduciendo el valor en segundos (en milisegundos si obviamos la coma),&lt;br /&gt;
la variable en formato &lt;b&gt;S5TIME &lt;/b&gt;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&amp;nbsp;correspondiente&amp;nbsp;a 2h 36m 30s) se redondea a este valor.&amp;nbsp;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.&lt;br /&gt;
&lt;br /&gt;
Y hasta aquí esta sencilla comprobación.&amp;nbsp;Cualquier&amp;nbsp;comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-4091060102228375128?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4KYDWQBCZk2admi9BnBgIZs_39Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4KYDWQBCZk2admi9BnBgIZs_39Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4KYDWQBCZk2admi9BnBgIZs_39Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4KYDWQBCZk2admi9BnBgIZs_39Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/WLSAhRr9ISA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/4091060102228375128/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2012/01/modificando-tiempos-en-un-plc-s7-desde.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4091060102228375128?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4091060102228375128?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/WLSAhRr9ISA/modificando-tiempos-en-un-plc-s7-desde.html" title="Modificando tiempos en un PLC S7 desde WinCC Flexible RT" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-WzBYLzDY0kY/TxQ_HwXYxiI/AAAAAAAACBA/-fjYPwLdnGw/s72-c/03.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2012/01/modificando-tiempos-en-un-plc-s7-desde.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAMQnY7fip7ImA9WhRXGU0.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-3861050254692227096</id><published>2011-12-26T12:59:00.000+01:00</published><updated>2011-12-26T12:59:43.806+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T12:59:43.806+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="Posmo" /><category scheme="http://www.blogger.com/atom/ns#" term="servomotor" /><title>Probando un servomotor Posmo A para posicionamiento simple (parte 2ª)</title><content type="html">Habiendo dejado en la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para.html"&gt;entrada anterior&lt;/a&gt; el Posmo configurado, ahora toca realizar un proyecto en Step7 para controlarlo.&amp;nbsp;Como maestro Profibus voy a usar un&amp;nbsp;&lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7315-2AG10-0AB0&amp;amp;caller=view"&gt;PLC S7-315-2DP&lt;/a&gt;&amp;nbsp;al que voy a conectar una&amp;nbsp;&lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7374-2XH01-0AA0&amp;amp;caller=view"&gt;tarjeta simuladora de entradas / salidas digitales&lt;/a&gt;&amp;nbsp;para dar las órdenes necesarias al servomotor y visualizar su estado.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-TWqWzF4xcz8/TvhGaJYgNcI/AAAAAAAACAg/aVPwNliw3zo/s1600/01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-TWqWzF4xcz8/TvhGaJYgNcI/AAAAAAAACAg/aVPwNliw3zo/s1600/01.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-l491Bm5WC0E/TvhItogocKI/AAAAAAAACAs/Utxd4ctYl2E/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-l491Bm5WC0E/TvhItogocKI/AAAAAAAACAs/Utxd4ctYl2E/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ya nos podemos concentrar en la programación. Siemens tiene en su página web disponible un &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?aktprim=0&amp;amp;lang=es&amp;amp;referer=%2fWW%2f&amp;amp;func=cslib.csinfo&amp;amp;siteid=cseus&amp;amp;groupid=4000003&amp;amp;extranet=standard&amp;amp;viewreg=WW&amp;amp;nodeid0=10804026&amp;amp;objaction=csopen"&gt;ejemplo de programación&lt;/a&gt;. De este ejemplo he usado dos FB, el FB10 y FB11 que ya tienen programada la&amp;nbsp;comunicación&amp;nbsp;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.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Los parámetros de entrada que he necesitado para el FB10 son:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;I_O_Adresss &lt;/i&gt;- Dirección hardware del Posmo.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Initialization &lt;/i&gt;- Para la puesta en servicio del Posmo, deberá ser lo primero que activemos.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Referencing &lt;/i&gt;- 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.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Jogging_1 &lt;/i&gt;y &lt;i&gt;Jogging_2 &lt;/i&gt;- Señales para hacer girar el servomotor en un sentido o en el contrario mientras estén activadas.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Jogging_override &lt;/i&gt;- Limitación de velocidad en porcentaje para los movimientos de Jog.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Start &lt;/i&gt;- Señal para iniciar una secuencia de desplazamiento. &lt;b&gt;Debe ser activada al menos un ciclo de scan después haber modificado los parametros del bloque a ejecutar&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;No_intermediate_stop &lt;/i&gt;y &lt;i&gt;No_stop &lt;/i&gt;- 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.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Automatic_operation&lt;/i&gt;, &lt;i&gt;External_blockchange&lt;/i&gt;, &lt;i&gt;Read_in_enable &lt;/i&gt;y &lt;i&gt;Brake_release &lt;/i&gt;- No son necesarias en mi ejemplo.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Fault_acknowledgement &lt;/i&gt;- Esta señal permite borrar los fallos y avisos del Posmo. También tiene el efecto de detener el servomotor si está en movimiento.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Block_number &lt;/i&gt;- Número de bloque que se ejecutará cuando se dé la señal &lt;i&gt;Start&lt;/i&gt;. Para mi ejemplo usaré el bloque número 3 para el posicionamiento en MDI y el 13 para realizar el referenciado.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Override &lt;/i&gt;- Limitación general de velocidad en porcentaje.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Start_byte &lt;/i&gt;- Condiciones auxiliares de inicio, no necesarias en mi ejemplo.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;MDI_Type &lt;/i&gt;- 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.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;MDI_Velocity &lt;/i&gt;y &lt;i&gt;MDI_Acceleration &lt;/i&gt;- Velocidad y aceleración del movimiento en MDI expresadas en porcentaje respecto de la velocidad y aceleración máximas configuradas.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;MDI_Position &lt;/i&gt;- Cota en formato REAL para realizar el posicionamiento en MDI.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Timer_for_wait &lt;/i&gt;- Temporizador que usa internamente el FB10, no debemos usarlo en otra parte del programa.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;FB_Coordination &lt;/i&gt;- 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
El FB10 me devuelve la siguiente información:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Warning &lt;/i&gt;y &lt;i&gt;Fault &lt;/i&gt;- Señales que nos indican si existe alguna advertencia en el Posmo o si este está en fallo.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Ready &lt;/i&gt;- Señal que nos indica que el Posmo está listo para el servicio.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Status_word &lt;/i&gt;- Palabra donde cada bit indica el estado del Posmo, más abajo lo describiré.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Actual_block &lt;/i&gt;- Número de bloque actualmente seleccionado en el Posmo.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Warm_number&lt;/i&gt;, &lt;i&gt;Warm_info&lt;/i&gt; y&amp;nbsp;&lt;i&gt;Fault_number &lt;/i&gt;- 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
En el&amp;nbsp;&lt;i&gt;Status_word&lt;/i&gt;&amp;nbsp;tenemos la siguiente información:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Bit 0 - Sin error de seguimiento&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Bit 1 - No usado&lt;/li&gt;
&lt;li&gt;Bit 2 - En posición de consigna.&lt;/li&gt;
&lt;li&gt;Bit 3 - El servomotor está referenciado&lt;/li&gt;
&lt;li&gt;Bit 4 - El servomotor aceptó la secuencia de desplazamiento.&lt;/li&gt;
&lt;li&gt;Bit 5 - El servomotor se está moviendo.&lt;/li&gt;
&lt;li&gt;Bit 6 - El servomotor está ejecutando una secuencia de desplazamiento.&lt;/li&gt;
&lt;li&gt;Bit 7 - Alimentación de potencia presente.&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Bit 8 - Posmo alimentado.&lt;/li&gt;
&lt;li&gt;Bit 9 - Posmo listo para el servicio.&lt;/li&gt;
&lt;li&gt;Bit 10 - Servicio habilitado&lt;/li&gt;
&lt;li&gt;Bit 11 - Posmo en fallo&lt;/li&gt;
&lt;li&gt;Bit 12 - Ningún DES2 aplicado&lt;/li&gt;
&lt;li&gt;Bit 13 - Ningún DES3 aplicado&lt;/li&gt;
&lt;li&gt;Bit 14 - Posmo en bloqueo de conexión.&lt;/li&gt;
&lt;li&gt;Bit 15 - Posmo en alarma.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
Para obtener la posición instantánea del Posmo llamo al FB11 como sigue:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ofoKMh-AbZM/TvhantmTQaI/AAAAAAAACA4/PP5lBWqKEsY/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ofoKMh-AbZM/TvhantmTQaI/AAAAAAAACA4/PP5lBWqKEsY/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
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 (&lt;i&gt;FB_Coordination&lt;/i&gt;) tenga valor cero.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
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".&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El proyecto de Step7 lo tienes &lt;a href="http://goo.gl/kIfaC"&gt;aquí&lt;/a&gt; y si quieres echar un vistazo a la parametrización del Posmo también está &lt;a href="http://goo.gl/K0Dvu"&gt;disponible&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
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.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-3861050254692227096?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SqHMRCb4zzbmjksS3LR9VKm8iTE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SqHMRCb4zzbmjksS3LR9VKm8iTE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SqHMRCb4zzbmjksS3LR9VKm8iTE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SqHMRCb4zzbmjksS3LR9VKm8iTE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/861YlBo9KrA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/3861050254692227096/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para_26.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3861050254692227096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3861050254692227096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/861YlBo9KrA/probando-un-servomotor-posmo-para_26.html" title="Probando un servomotor Posmo A para posicionamiento simple (parte 2ª)" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-TWqWzF4xcz8/TvhGaJYgNcI/AAAAAAAACAg/aVPwNliw3zo/s72-c/01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para_26.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMASXsyeCp7ImA9WhRXGU0.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-3291823060175398798</id><published>2011-12-23T11:08:00.000+01:00</published><updated>2011-12-26T13:44:08.590+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T13:44:08.590+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Simocom A" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="Posmo" /><category scheme="http://www.blogger.com/atom/ns#" term="servomotor" /><title>Probando un servomotor Posmo A para posicionamiento simple (parte 1ª)</title><content type="html">El &lt;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"&gt;Simodrive Posmo A&lt;/a&gt; es un servomotor de &lt;a href="http://www.automation.siemens.com/"&gt;Siemens&lt;/a&gt;&amp;nbsp;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 &lt;a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6SN2132-1BC11-1BA1&amp;amp;caller=view"&gt;6SN2132-1BC11-1BA1&lt;/a&gt;) voy a dedicarle una entrada.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZuRwfoYNmLY/TvQsJglEOBI/AAAAAAAAB9s/9zQnRoOTfnQ/s1600/Posmo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="330" src="http://4.bp.blogspot.com/-ZuRwfoYNmLY/TvQsJglEOBI/AAAAAAAAB9s/9zQnRoOTfnQ/s400/Posmo.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;El Posmo A sobre mi mesa preparado para hacer pruebas.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
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 &lt;a href="http://es.wikipedia.org/wiki/Profibus"&gt;Profibus&lt;/a&gt;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;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.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eUn35HXdCUs/TvQuHkNrEbI/AAAAAAAAB94/Vf9uo1bD4k8/s1600/Posmo+abierto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://3.bp.blogspot.com/-eUn35HXdCUs/TvQuHkNrEbI/AAAAAAAAB94/Vf9uo1bD4k8/s400/Posmo+abierto.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Para configurarlo necesitamos el Simocom A, que podemos &lt;a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;nodeid0=10804026&amp;amp;lang=en&amp;amp;siteid=cseus&amp;amp;aktprim=0&amp;amp;extranet=standard&amp;amp;viewreg=WW&amp;amp;objid=10804026&amp;amp;treeLang=en"&gt;descargar de la página web de Siemens&lt;/a&gt;&amp;nbsp;(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 (&lt;i&gt;routing&lt;/i&gt;) a través de un PLC. Si no tenemos el servomotor también podemos hacer la configuración &lt;i&gt;off-line&lt;/i&gt;&amp;nbsp;y transferirla posteriormente.&lt;br /&gt;
&lt;br /&gt;
Mi intención es configurar el Posmo para realizar posicionamientos absolutos en modo MDI (&lt;i&gt;Manual Data Input&lt;/i&gt;), así que ejecuto el Simocom A y me conecto.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-iYJ4w6_KvVg/TvQ57zGisNI/AAAAAAAAB-E/KlcpBEL_wTQ/s1600/Dibujo01.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="419" src="http://1.bp.blogspot.com/-iYJ4w6_KvVg/TvQ57zGisNI/AAAAAAAAB-E/KlcpBEL_wTQ/s640/Dibujo01.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
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 &lt;b&gt;Posicionar&lt;/b&gt;&amp;nbsp;y como mi Posmo irá acoplado a un husillo lo configuro como &lt;b&gt;Eje lineal&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-tMp3GdJ4VMM/TvQ7C-LAbaI/AAAAAAAAB-Q/9E5nN-6NN8o/s1600/Dibujo02.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="418" src="http://2.bp.blogspot.com/-tMp3GdJ4VMM/TvQ7C-LAbaI/AAAAAAAAB-Q/9E5nN-6NN8o/s640/Dibujo02.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
A continuación voy al apartado &lt;i&gt;Mecánica&lt;/i&gt;, donde especifico el paso del husillo, o sea, lo que avanza el eje lineal con cada vuelta del servomotor. En la casilla &lt;i&gt;Juego de inversión&lt;/i&gt;&amp;nbsp;se introduce la holgura que presenta nuestra mecánica al cambiar el sentido de giro.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-7xkPbcOxdYA/TvQ7223HRwI/AAAAAAAAB-c/QFf-bMNUMfs/s1600/Dibujo03.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="322" src="http://4.bp.blogspot.com/-7xkPbcOxdYA/TvQ7223HRwI/AAAAAAAAB-c/QFf-bMNUMfs/s640/Dibujo03.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el apartado &lt;i&gt;Límites &lt;/i&gt;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&amp;nbsp;referirán&amp;nbsp;en relación porcentual a estos valores.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-ItePW9R53Q0/TvQ8iyLuvEI/AAAAAAAAB-o/fZGZMt03ZJo/s1600/Dibujo04.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="402" src="http://2.bp.blogspot.com/-ItePW9R53Q0/TvQ8iyLuvEI/AAAAAAAAB-o/fZGZMt03ZJo/s640/Dibujo04.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-2aShP9vI-aY/TvQ9G7Vf9eI/AAAAAAAAB-0/t0ZBPv5su8o/s1600/Dibujo05.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-2aShP9vI-aY/TvQ9G7Vf9eI/AAAAAAAAB-0/t0ZBPv5su8o/s640/Dibujo05.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el apartado &lt;i&gt;Vigilancia &lt;/i&gt;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.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-tDRNIlWph3c/TvQ9r7lTdoI/AAAAAAAAB_A/8rJAt6-cyEI/s1600/Dibujo06.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="422" src="http://3.bp.blogspot.com/-tDRNIlWph3c/TvQ9r7lTdoI/AAAAAAAAB_A/8rJAt6-cyEI/s640/Dibujo06.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el apartado &lt;i&gt;Regulador &lt;/i&gt;se puede modificar algún parámetro de regulación, pero con la configuración de fábrica nunca he tenido problemas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-txCtIEkOmO0/TvQ-KPzE6oI/AAAAAAAAB_M/dur4t6iLczQ/s1600/Dibujo07.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="322" src="http://4.bp.blogspot.com/-txCtIEkOmO0/TvQ-KPzE6oI/AAAAAAAAB_M/dur4t6iLczQ/s640/Dibujo07.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el apartado &lt;i&gt;Secuencias de desplazamiento&lt;/i&gt; podemos programar movimientos de forma que llamando al número de secuencia se realice el movimiento configurado.&amp;nbsp;&amp;nbsp;Los bloques 1 y 2 están reservados para&amp;nbsp;&lt;i&gt;Jogging.&amp;nbsp;&lt;/i&gt;En modo MDI , cuando se&amp;nbsp;transfieren&amp;nbsp;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.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-ta828IXFTp0/TvRCZw_DIvI/AAAAAAAAB_Y/Nu5J5V0IME4/s1600/Dibujo08.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://1.bp.blogspot.com/-ta828IXFTp0/TvRCZw_DIvI/AAAAAAAAB_Y/Nu5J5V0IME4/s640/Dibujo08.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Finalmente, en el apartado &lt;i&gt;Referenciado &lt;/i&gt;configuraremos la&amp;nbsp;secuencia&amp;nbsp;de referenciado. La secuencia que necesito es:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;avanzar hacia la derecha hasta encontrar la leva de referenciado.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;detener el movimiento.&lt;/li&gt;
&lt;li&gt;avanzar hacia la izquierda a velocidad lenta hasta perder la leva.&lt;/li&gt;
&lt;li&gt;detener el movimiento.&lt;/li&gt;
&lt;li&gt;ajustar esa posición como origen (cero).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Se podría mejorar la precisión buscando el impulso de origen del encóder, pero para mi aplicación no es necesario.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
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.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-hKVgpi27L4g/TvREsebqHQI/AAAAAAAAB_k/wYdwZzYLjG4/s1600/Dibujo09.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://2.bp.blogspot.com/-hKVgpi27L4g/TvREsebqHQI/AAAAAAAAB_k/wYdwZzYLjG4/s640/Dibujo09.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
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 &lt;i&gt;Generar programa de referenciado&lt;/i&gt;, que preparará la secuencia 13 y siguientes.&lt;br /&gt;
&lt;br /&gt;
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 &lt;i&gt;.par&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
El Simocom A nos permite probar el funcionamiento del servomotor. Para ello deberemos tomar el control desde el PC (botón &lt;b&gt;PC!&lt;/b&gt; de la barra superior). Con &lt;b&gt;F8&lt;/b&gt; desbloquearemos el regulador y ya podremos realizar movimientos en modo Jog, probar el referenciado, posicionados, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-RGtvdZ400TQ/TvRL869R5nI/AAAAAAAAB_w/yqPudiGAl1k/s1600/Manejo.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="462" src="http://4.bp.blogspot.com/-RGtvdZ400TQ/TvRL869R5nI/AAAAAAAAB_w/yqPudiGAl1k/s640/Manejo.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
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 &lt;i&gt;en referencia&lt;/i&gt; 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 &lt;a href="http://es.wikipedia.org/wiki/Codificador_rotatorio"&gt;encóder&lt;/a&gt; relativo.&lt;br /&gt;
&lt;br /&gt;
Para solucionar este inconveniente deberemos entrar en la &lt;i&gt;Lista de experto&lt;/i&gt;, para que nos muestre todos los parámetros del regulador.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-9ZTW8Sgsyu0/TvRNJ6atgeI/AAAAAAAAB_8/W85SjAFvmos/s1600/Lista+de+experto+1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-9ZTW8Sgsyu0/TvRNJ6atgeI/AAAAAAAAB_8/W85SjAFvmos/s1600/Lista+de+experto+1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Buscamos el parámetro 56 &lt;i&gt;Opciones de funcionamiento&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-_YpRN5fz66w/TvROZghu7sI/AAAAAAAACAI/8cgnFbETcE4/s1600/Lista+de+experto+2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="294" src="http://3.bp.blogspot.com/-_YpRN5fz66w/TvROZghu7sI/AAAAAAAACAI/8cgnFbETcE4/s640/Lista+de+experto+2.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Lo seleccionamos y pulsamos &lt;b&gt;F4&lt;/b&gt; para editarlo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-1h9Sm6bu3Y4/TvROqjx-A5I/AAAAAAAACAU/dI0YMqCQnxc/s1600/Lista+de+experto+3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-1h9Sm6bu3Y4/TvROqjx-A5I/AAAAAAAACAU/dI0YMqCQnxc/s1600/Lista+de+experto+3.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
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.&amp;nbsp;No olvidemos guardar en EPROM los cambios.&lt;br /&gt;
&lt;br /&gt;
Hasta aquí este ejemplo de configuración de servomotor Posmo A. En una &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para_26.html"&gt;siguiente entrada&lt;/a&gt; me meteré con la programación desde un PLC S7-300.&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-3291823060175398798?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RhBB51_tySyed-70fPNCxrtMASk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RhBB51_tySyed-70fPNCxrtMASk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RhBB51_tySyed-70fPNCxrtMASk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RhBB51_tySyed-70fPNCxrtMASk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/vMWqnTNkzZk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/3291823060175398798/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3291823060175398798?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3291823060175398798?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/vMWqnTNkzZk/probando-un-servomotor-posmo-para.html" title="Probando un servomotor Posmo A para posicionamiento simple (parte 1ª)" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ZuRwfoYNmLY/TvQsJglEOBI/AAAAAAAAB9s/9zQnRoOTfnQ/s72-c/Posmo.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/12/probando-un-servomotor-posmo-para.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MCQn88fyp7ImA9WhdbGU8.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-583755796112120944</id><published>2011-10-17T13:09:00.000+02:00</published><updated>2011-10-18T10:11:03.177+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-18T10:11:03.177+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pulsos" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="Logix" /><title>Tres maneras de generar pulsos en un controlador Logix5000</title><content type="html">Es raro que programando una máquina no sea necesaria una señal pulsante, generalmente para funciones de señalización. En controladores de &lt;a href="http://www.rockwellautomation.com/"&gt;Rockwell&lt;/a&gt;, por ejemplo del tipo &lt;a href="http://ab.rockwellautomation.com/Programmable-Controllers/SLC-500"&gt;SLC 500&lt;/a&gt;, podemos echar mano de bits de sistema que cumplen esta función. Sin embargo, en la gama de controladores &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/"&gt;Logix5000&lt;/a&gt;, 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 (&lt;b&gt;PULSO_TEMP&lt;/b&gt;), luego leyendo el tiempo del sistema (&lt;b&gt;PULSO_SIS&lt;/b&gt;) y finalmente usando tareas periódicas (&lt;b&gt;PULSO_TAREA&lt;/b&gt;).&lt;br /&gt;
&lt;br /&gt;
El código en lógica de escalera para generar un pulso con temporizadores podría tener este aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-55DUUdonz70/TpwHFC_HvyI/AAAAAAAAB7s/vpfwWJ70yTA/s1600/00.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="317" src="http://4.bp.blogspot.com/-55DUUdonz70/TpwHFC_HvyI/AAAAAAAAB7s/vpfwWJ70yTA/s400/00.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;(Pincha para ver mejor la imagen)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Otra forma de generar el pulso es leyendo el tiempo del sistema.&lt;a name='more'&gt;&lt;/a&gt; Para ello tenemos que echar mano de la instrucción &lt;b&gt;GSV&lt;/b&gt; (&lt;i&gt;Get System Value&lt;/i&gt;), 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 &lt;i&gt;Data Types → User Defined&lt;/i&gt;, con el botón derecho del ratón, pulso sobre &lt;i&gt;New Data Type...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-gJx0uNGDJAo/TpwHHwjgOSI/AAAAAAAAB8s/cdk_2j0s8aY/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-gJx0uNGDJAo/TpwHHwjgOSI/AAAAAAAAB8s/cdk_2j0s8aY/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Y genero un tipo de datos que voy a llamar &lt;b&gt;FECHA_HORA&lt;/b&gt; 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).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-yJ_URgesiOE/TpwHF14p6oI/AAAAAAAAB78/fTYrbYJNlM4/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-yJ_URgesiOE/TpwHF14p6oI/AAAAAAAAB78/fTYrbYJNlM4/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ahora declaramos una variable con este nuevo tipo de dato (yo la he llamado &lt;b&gt;T_ACTUAL&lt;/b&gt;) y ya podemos programar:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-gNnZ7AT2hX8/TpwHFZia3MI/AAAAAAAAB70/wPAvtiH2jYA/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-gNnZ7AT2hX8/TpwHFZia3MI/AAAAAAAAB70/wPAvtiH2jYA/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el primer renglón uso la instrucción &lt;b&gt;GSV&lt;/b&gt; para almacenar en la variable &lt;b&gt;T_ACTUAL&lt;/b&gt; la lectura del tiempo del sistema. En el dato &lt;i&gt;T_ACTUAL.Microseconds&lt;/i&gt; 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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Para crear una tarea periódica, en el árbol de proyecto, pulsamos con el botón derecho del ratón sobre &lt;i&gt;Tasks&lt;/i&gt; y seleccionamos &lt;i&gt;New Task...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-IlbZa2uyuYE/TpwHEVrqbfI/AAAAAAAAB7k/-jkKmYECdik/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-IlbZa2uyuYE/TpwHEVrqbfI/AAAAAAAAB7k/-jkKmYECdik/s1600/09.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Le asignamos un nombre (en mi caso &lt;b&gt;PULSOS&lt;/b&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-uPoq3LxF8i4/TpwHGPgwzXI/AAAAAAAAB8E/Lj7-miRmZBs/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-uPoq3LxF8i4/TpwHGPgwzXI/AAAAAAAAB8E/Lj7-miRmZBs/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Vamos a la pestaña &lt;i&gt;Configuration&lt;/i&gt; y en &lt;i&gt;Period&lt;/i&gt; asignamos un valor de 500 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-xpoAutxgArA/TpwHGtY1sOI/AAAAAAAAB8M/_0TL5fdc9Ig/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-xpoAutxgArA/TpwHGtY1sOI/AAAAAAAAB8M/_0TL5fdc9Ig/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Dentro de esta nueva tarea creamos un programa (&lt;b&gt;GENERADOR&lt;/b&gt;) y dentro del programa una rutina (&lt;b&gt;PULSO_TAREA&lt;/b&gt;). Esta rutina la asigno como rutina principal al programa:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-JdJTmCM4b1o/TpwHG659NVI/AAAAAAAAB8U/_m6LIrCG0_4/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-JdJTmCM4b1o/TpwHG659NVI/AAAAAAAAB8U/_m6LIrCG0_4/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
El código de esta rutina es algo tan sencillo como el siguiente renglón:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-0H9wjFH02y8/TpwHHD2j7cI/AAAAAAAAB8c/UGDQNVUd16E/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-0H9wjFH02y8/TpwHHD2j7cI/AAAAAAAAB8c/UGDQNVUd16E/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Cada 500 ms se ejecuta la rutina y en ella invierto la señal del pulso.&lt;br /&gt;
&lt;br /&gt;
En la siguiente captura de pantalla se ven los tres pulsos funcionando simultánemante:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-nI9watuFaZE/TpwHHeHCRCI/AAAAAAAAB8k/bLJYcdTJGg8/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://4.bp.blogspot.com/-nI9watuFaZE/TpwHHeHCRCI/AAAAAAAAB8k/bLJYcdTJGg8/s400/07.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Por si alguien tiene interés, el proyecto para RSLogix 5000 de esta entrada está disponible &lt;a href="http://goo.gl/DaTmX"&gt;aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-583755796112120944?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mW2fXbr4nvsf_vCwUajYWVhTLOs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mW2fXbr4nvsf_vCwUajYWVhTLOs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mW2fXbr4nvsf_vCwUajYWVhTLOs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mW2fXbr4nvsf_vCwUajYWVhTLOs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/lbQONyXdbCo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/583755796112120944/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/10/tres-maneras-de-generar-pulsos-en-un.html#comment-form" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/583755796112120944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/583755796112120944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/lbQONyXdbCo/tres-maneras-de-generar-pulsos-en-un.html" title="Tres maneras de generar pulsos en un controlador Logix5000" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-55DUUdonz70/TpwHFC_HvyI/AAAAAAAAB7s/vpfwWJ70yTA/s72-c/00.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/10/tres-maneras-de-generar-pulsos-en-un.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4BSXYyeSp7ImA9WhdUGUQ.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-4537728923843723391</id><published>2011-10-07T16:49:00.000+02:00</published><updated>2011-10-07T16:49:18.891+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-07T16:49:18.891+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OPC" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Basic" /><category scheme="http://www.blogger.com/atom/ns#" term="SoftLogix" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="RSLogix 5000" /><category scheme="http://www.blogger.com/atom/ns#" term="Logix" /><title>Comunicación OPC con un PLC Logix5000 desde Visual Basic</title><content type="html">Ya he hablado en el blog de comunicación &lt;a href="http://es.wikipedia.org/wiki/OPC"&gt;OPC&lt;/a&gt;, en concreto en &lt;a href="http://notasdeautomatizacion.blogspot.com/2009/09/comunicacion-opc-entre-un-plc-software.html"&gt;esta entrada&lt;/a&gt; traté el acceso a un WinAC desde Visual Basic. Ahora, aprovechando la configuración que tengo con &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html"&gt;SoftLogix&lt;/a&gt; sobre una máquina virtual, voy a hacer lo mismo.&lt;br /&gt;
&lt;br /&gt;
Mi prueba consistirá en crear un proyecto para SoftLogix en el que definiré un par de tags, &lt;b&gt;OPC_BIT&lt;/b&gt; y &lt;b&gt;OPC_DINT&lt;/b&gt;, 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 &lt;i&gt;Run&lt;/i&gt; y monitorizaré el contenido de los tags. Luego generaré un enlace OPC con el &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslinx/"&gt;RSLinx&lt;/a&gt; y desde un programa en &lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-basic-express"&gt;Visual Basic&lt;/a&gt; leeré y escribiré en los tags del PLC.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-e7qYLKdiaxk/To8KCCf2nZI/AAAAAAAAB6w/4jeYcWJqiqk/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-e7qYLKdiaxk/To8KCCf2nZI/AAAAAAAAB6w/4jeYcWJqiqk/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Para establecer una comunicación OPC necesitaré un servidor OPC, y &lt;a href="http://www.rockwellautomation.com/"&gt;Rockwell&lt;/a&gt; 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 &lt;a href="http://samplecode.rockwellautomation.com/idc/groups/literature/documents/gr/lnx-gr001_-es-e.pdf"&gt;Cómo obtener resultados con RSLinx Classic&lt;/a&gt; (pdf) donde se especifica para qué sirve cada versión de RSLinx.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
En el ordenador donde tengo instalado Visual Basic he instalado RSLinx Classic. Con mi SoftLogix funcionando compruebo que lo detecta.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-rqXjTM9LQX4/To8LEfpEBJI/AAAAAAAAB60/32kTyuviuo0/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-rqXjTM9LQX4/To8LEfpEBJI/AAAAAAAAB60/32kTyuviuo0/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Para obtener acceso al PLC a través de OPC deberemos configurar un &lt;i&gt;Topic&lt;/i&gt;, que es la definición de la ruta de acceso al controlador. Para ello vamos al menú de RSLinx y pulsamos sobre &lt;i&gt;DDE/OPC → Topic Configuration... &lt;/i&gt;y aparecerá una ventana donde seleccionaremos nuestro controlador y le asignaremos un &lt;i&gt;Topic&lt;/i&gt;, en mi caso &lt;b&gt;PRUEBA_OPC&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-_zlPKVy1cnA/To8LonTXIXI/AAAAAAAAB64/LUV4YdbZGfk/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-_zlPKVy1cnA/To8LonTXIXI/AAAAAAAAB64/LUV4YdbZGfk/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Aceptamos y ya podemos cerrar el RSLinx. Para comprobar que nuestro servidor OPC funciona, Rockwell suministra la herramienta &lt;i&gt;OPC Test Client&lt;/i&gt; (se instala conjuntamente con el RSLinx). La ejecutamos y vamos al menú &lt;i&gt;Server → Connect...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Qyd4d4j5tO4/To8L3_vh75I/AAAAAAAAB68/pb4LdUETO34/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Qyd4d4j5tO4/To8L3_vh75I/AAAAAAAAB68/pb4LdUETO34/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Selecciono &lt;i&gt;RSLinx OPC Server&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-h1DefqrLAKg/To8MBsqXKgI/AAAAAAAAB7A/ohU9dCJ8APM/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-h1DefqrLAKg/To8MBsqXKgI/AAAAAAAAB7A/ohU9dCJ8APM/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ahora tenemos que añadir un grupo, vamos al menú &lt;i&gt;Group → Add Group...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-G9QiEVyT9zM/To8MT0c5LwI/AAAAAAAAB7E/Ce44-yQqJVY/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-G9QiEVyT9zM/To8MT0c5LwI/AAAAAAAAB7E/Ce44-yQqJVY/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Le asignamos un nombre cualquiera y aceptamos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-ndmU5AW3ZJw/To8MaKGZEyI/AAAAAAAAB7I/kjwWoU_-MZs/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-ndmU5AW3ZJw/To8MaKGZEyI/AAAAAAAAB7I/kjwWoU_-MZs/s1600/09.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ya solo falta añadir Items (que serán nuestros tags), vamos al menú &lt;i&gt;Item → Add Item...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-q97vfNLhQ60/To8MiHxBwKI/AAAAAAAAB7M/k-q8YeAlpa0/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-q97vfNLhQ60/To8MiHxBwKI/AAAAAAAAB7M/k-q8YeAlpa0/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la ventana que aparece, en la parte inferior izquierda navegamos por el árbol del servidor OPC, seleccionamos dentro de nuestro &lt;i&gt;Topic&lt;/i&gt; la opción &lt;i&gt;online&lt;/i&gt; y a la derecha deberán mostrarse los tags de nuestro proyecto Logix5000. Selecciono el tag que me interese y pulso el botón &lt;i&gt;Add Item&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-KvGbUBJ9Opw/To8MtrCECjI/AAAAAAAAB7Q/28tZxgTkvSg/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-KvGbUBJ9Opw/To8MtrCECjI/AAAAAAAAB7Q/28tZxgTkvSg/s1600/11.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Y ya podemos ver el contenido de nuestro tag. Si modificamos su valor desde el RSLogix5000 veremos en el &lt;i&gt;OPC Test Client&lt;/i&gt; como varía.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-_znTrjUIW6w/To8M1htcoII/AAAAAAAAB7U/p85YoZPeK80/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-_znTrjUIW6w/To8M1htcoII/AAAAAAAAB7U/p85YoZPeK80/s1600/12.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Crearemos un proyecto en Visual Basic y, para tener acceso a las funciones de comunicación OPC, deberemos agregar, en mi caso, la referencia &lt;i&gt;OPC DA Automation Wrapper 2.02&lt;/i&gt; (&lt;i&gt;OPCDAAuto.DLL&lt;/i&gt;) 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 &lt;a href="http://www.control.com/thread/1003433372"&gt;foro de control.com&lt;/a&gt;&amp;nbsp; deberemos agregar &lt;i&gt;RsLinxOPCAuto.DLL&lt;/i&gt; o incluso &lt;i&gt;RsiOPCAuto.DLL&lt;/i&gt; si disponemos de versiones antiguas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-w5BekMMpoS4/To8NMxy1JkI/AAAAAAAAB7Y/Hal4wpSMCK4/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-w5BekMMpoS4/To8NMxy1JkI/AAAAAAAAB7Y/Hal4wpSMCK4/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Comprobamos que en &lt;i&gt;Espacios de nombres importados&lt;/i&gt; esté marcado &lt;i&gt;RsiOPCAuto&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-zu_dTcILzYA/To8NZZ5oPRI/AAAAAAAAB7c/u5BAW_g6Jb8/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-zu_dTcILzYA/To8NZZ5oPRI/AAAAAAAAB7c/u5BAW_g6Jb8/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Con esto ya podemos empezar a programar. Voy a adaptar el código de la clase que programé en la &lt;a href="http://notasdeautomatizacion.blogspot.com/2009/09/comunicacion-opc-entre-un-plc-software.html"&gt;entrada sobre OPC y WinAC&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;
Imports OPCAutomation&lt;br /&gt;
&lt;br /&gt;
Public Class OPC_NdA 'OPC Notas de Automatización&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Objectos para establecer la comunicación OPC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Private WithEvents ServidorOPC As OPCServer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Private WithEvents GrupoOPC As OPCGroup&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Private WithEvents GruposOPC As OPCGroups&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Private ItemOPC() As OPCItem&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Conectado As Boolean 'Para saber si la conexión está activada&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si hay algún error se indica en estas variables&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Mensaje As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Detalle_Error As String&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Constructor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Al crear el objeto, no estamos conectados&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectado = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Función para activar la conexión OPC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function Conectar() As Boolean&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si ya estoy conectado aviso y salgo.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Conectado Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Error conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "Se ha intentado crear una conexión OPC cuando ya hay una creada."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectar = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Conectando con el servidor OPC..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServidorOPC = New OPCServer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServidorOPC.Connect("RSLinx OPC Server")&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Añadiendo grupo al servidor OPC..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GruposOPC = ServidorOPC.OPCGroups&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC = GruposOPC.Add("Grupo1")&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC.IsActive = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC.UpdateRate = 1000&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC.IsSubscribed = True&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Añadiendo Items al grupo..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReDim ItemOPC(100) 'Dimensionar según las necesidades&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Introducir un ítem por cada variable del PLC en la que queramos leer o escribir&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'A cada ítem le asignamos un número, que debemos recordar para referirnos a él en el programa&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemOPC(0) = GrupoOPC.OPCItems.AddItem("[PRUEBA_OPC]OPC_DINT", 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemOPC(1) = GrupoOPC.OPCItems.AddItem("[PRUEBA_OPC]OPC_BIT", 1)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "Error: " &amp;amp; ex.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectado = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectar = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Conexión OPC realizada correctamente."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectado = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectar = True&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Función para deshacer la conexión OPC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function Desconectar() As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Desconectando..."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemOPC = Nothing&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not IsNothing(ServidorOPC) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServidorOPC.OPCGroups.RemoveAll()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServidorOPC.Disconnect()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServidorOPC = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GruposOPC = Nothing&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "Error: " &amp;amp; ex.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Desconectar = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Desconexión realizada correctamente."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conectado = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Desconectar = True&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Función para escribir en un ítem que representa una variable entera&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Se le pasa el índice del ítem y el valor que vamos a escribir&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si todo va bien devuelve True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function EscribirItemInt(ByVal Indice As Integer, ByVal Entero As Integer) As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Dims() As Integer = New Integer() {1}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Bounds() As Integer = New Integer() {1}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Serverhandles As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Errores As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Valores As Array = Array.CreateInstance(GetType(Object), Dims, Bounds)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Conectado Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Error conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "No hay establecida una conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EscribirItemInt = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Serverhandles.SetValue(ItemOPC(Indice).ServerHandle, 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Errores.SetValue(0, 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Valores.SetValue(Entero, 1)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC.SyncWrite(1, Serverhandles, Valores, Errores)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ex.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "¡Error al escribir Item! [Int, Índice " &amp;amp; Indice &amp;amp; "]"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EscribirItemInt = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EscribirItemInt = True&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Función para escribir en un ítem que representa una variable booleana&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Se le pasa el índice del ítem y el valor que vamos a escribir&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si todo va bien devuelve True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function EscribirItemBool(ByVal indice As Integer, ByVal Bit As Boolean) As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Dims() As Integer = New Integer() {1}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Bounds() As Integer = New Integer() {1}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Serverhandles As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Errores As Array = Array.CreateInstance(GetType(Integer), Dims, Bounds)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Valores As Array = Array.CreateInstance(GetType(Object), Dims, Bounds)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Conectado Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Error conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "No hay establecida una conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EscribirItemBool = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Serverhandles.SetValue(ItemOPC(indice).ServerHandle, 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Errores.SetValue(0, 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Valores.SetValue(Bit, 1)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GrupoOPC.SyncWrite(1, Serverhandles, Valores, Errores)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ex.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "¡Error al escribir Item! [Bool, Índice " &amp;amp; indice &amp;amp; "]"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EscribirItemBool = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EscribirItemBool = True&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Función para leer un ítem que representa una variable entera&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Se le pasa el índice del ítem que vamos a leer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si todo va bien devuelve el valor de la variable&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function LeerItemInt(ByVal Indice) As Integer&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Valor As Object = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Calidad As Object = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim TimeStamp As Object = Nothing&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Conectado Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Error conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "No hay establecida una conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemInt = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemOPC(Indice).Read(OPCDataSource.OPCDevice, Valor, Calidad, TimeStamp)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemInt = CInt(Valor.ToString)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ex.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "¡Error al leer Item! [Int, Índice " &amp;amp; Indice &amp;amp; "]"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemInt = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ""&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Función para leer un ítem que representa una variable booleana&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Se le pasa el índice del ítem que vamos a leer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Si todo va bien devuelve el valor de la variable&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function LeerItemBool(ByRef Indice) As Boolean&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Valor As Object = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim Calidad As Object = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim TimeStamp As Object = Nothing&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Conectado Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "Error conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = "No hay establecida una conexión OPC."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemBool = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemOPC(Indice).Read(OPCDataSource.OPCDevice, Valor, Calidad, TimeStamp)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If StrComp(Valor.ToString, "True") = 0 Or Valor = 1 Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemBool = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemBool = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ex.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = "¡Error al leer Item! [Bool, Índice " &amp;amp; Indice &amp;amp; "]"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeerItemBool = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mensaje = ""&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detalle_Error = ""&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
End Class&lt;/blockquote&gt;
&lt;br /&gt;
Con respecto al &lt;a href="http://notasdeautomatizacion.blogspot.com/2009/09/comunicacion-opc-entre-un-plc-software_03.html"&gt;código que hice para Siemens&lt;/a&gt; simplemente he cambiado en la función &lt;i&gt;Conectar&lt;/i&gt; el servidor OPC a &lt;b&gt;RSLinx OPC Server&lt;/b&gt; y he adaptado la lista de items.&lt;br /&gt;
&lt;br /&gt;
Para introducir los items deberemos especificar el nombre del &lt;i&gt;Topic&lt;/i&gt; que hayamos configurado en el RSLinx entre corchetes seguido del nombre del tag, por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
ItemOPC(0) = GrupoOPC.OPCItems.AddItem("[PRUEBA_OPC]OPC_DINT", 0)&lt;/blockquote&gt;
&lt;br /&gt;
Las funciones para leer y escribir booleanos y enteros son las mismas que las programadas en el OPC de Siemens.&lt;br /&gt;
&lt;br /&gt;
Ya solo nos queda crear una interfaz sencilla para probar la conexión:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-UH3D1m5H_3w/To8N1DaN43I/AAAAAAAAB7g/TtiyetRhgIo/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-UH3D1m5H_3w/To8N1DaN43I/AAAAAAAAB7g/TtiyetRhgIo/s1600/13.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Pulsando el botón &lt;i&gt;Conectar&lt;/i&gt; se establecerá la conexión OPC y si todo va correctamente podremos escribir y leer valores en el tag &lt;b&gt;OPC_DINT&lt;/b&gt; y cambiar el estado del booleano &lt;b&gt;OPC_BIT&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
El código de este sencillo programa lo tienes en &lt;a href="http://goo.gl/iCHJE"&gt;este proyecto de Visual Basic&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Como siempre, agradeceré cualquier comentario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-4537728923843723391?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MnN3PKriBCyFdeRjNKab5lu-22U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MnN3PKriBCyFdeRjNKab5lu-22U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MnN3PKriBCyFdeRjNKab5lu-22U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MnN3PKriBCyFdeRjNKab5lu-22U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/fiwG0zC1KCA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/4537728923843723391/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/10/comunicacion-opc-con-un-plc-logix5000.html#comment-form" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4537728923843723391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4537728923843723391?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/fiwG0zC1KCA/comunicacion-opc-con-un-plc-logix5000.html" title="Comunicación OPC con un PLC Logix5000 desde Visual Basic" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-e7qYLKdiaxk/To8KCCf2nZI/AAAAAAAAB6w/4jeYcWJqiqk/s72-c/04.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/10/comunicacion-opc-con-un-plc-logix5000.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YNSX48eSp7ImA9WhdUFk4.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-2620331664317570827</id><published>2011-10-03T10:04:00.000+02:00</published><updated>2011-10-03T10:39:58.071+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T10:39:58.071+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Basic" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="libnodave" /><category scheme="http://www.blogger.com/atom/ns#" term="Industrial Ethernet" /><category scheme="http://www.blogger.com/atom/ns#" term="Comunicación" /><title>Accediendo a un PLC Simatic a través de ethernet con Libnodave</title><content type="html">En &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/03/probando-una-biblioteca-para-acceder.html"&gt;esta entrada&lt;/a&gt; usé la biblioteca libre &lt;a href="http://libnodave.sourceforge.net/"&gt;Libnodave&lt;/a&gt; para acceder a un PLC S7-300 desde Visual Basic a través de un adaptador serie/MPI. Varios lectores me hicieron consultas sobre si era posible usarla para acceder a un PLC S7-300/400 a través de ethernet, pero al no tener disponible un controlador adecuado para hacer pruebas pues no tenía respuesta. Sin embargo, de la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/09/virtualizando-winac-rtx-el-plc-software.html"&gt;entrada anterior&lt;/a&gt; tengo preparada una máquina virtual con WinAC RTX y su puerto ethernet como puerto de comunicaciones, que creo que es un banco de pruebas ideal para hacer pruebas con Libnodave.&lt;br /&gt;
&lt;br /&gt;
Lo primero que voy a hacer es un proyecto en Step7 con un único DB, por ejemplo el DB10, con un único dato de formato BYTE. Lo transferiero al WinAC y pongo el PLC software en modo &lt;i&gt;Run&lt;/i&gt;. Me pongo &lt;i&gt;on line&lt;/i&gt; y monitorizo la variable.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-qbVUICr22L0/ToWQq5qmzbI/AAAAAAAAB6c/pOFO9SWV1wU/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-qbVUICr22L0/ToWQq5qmzbI/AAAAAAAAB6c/pOFO9SWV1wU/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el PLC no voy a tocar nada más. A continuación lo que haré será una aplicación en Visual Basic, usando la biblioteca Libnodave a través de ethernet, que se conectará al PLC y leerá y escribirá en esa variable como prueba que el sistema funciona.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
El aspecto que tendrá mi aplicación puede ser algo tan sencillo como esto:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-59JAooGS6BI/ToWSa72Tj0I/AAAAAAAAB6k/MEj7ZONkkhQ/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-59JAooGS6BI/ToWSa72Tj0I/AAAAAAAAB6k/MEj7ZONkkhQ/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Para realizar la conexión es nesaria una dirección IP (en mi caso la de la máquina virtual donde tengo el WinAC), un número de puerto (que según la documentación de Libnodave debe ser el 102), un número de rack (lo habitual aquí es un cero) y un número de slot (que será el número de slot donde tengamos configurado el PLC, lo podemos ver en la configuración hardware, en mi caso el dos).

La programación en Visual Basic va ser muy parecida a la que hice en &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/03/probando-una-biblioteca-para-acceder.html"&gt;esta entrada&lt;/a&gt;, uso la misma biblioteca de la misma forma así que no repito aquí el procedimiento para incluirla en el proyecto.

He adaptado la clase que creé en su momento para encapsular las funciones de acceso al PLC a través de ethernet, quedando de la siguiente manera:

&lt;br /&gt;
&lt;blockquote&gt;
Public Class Libnodave_WinAC&lt;br /&gt;
Dim daveSerie As libnodave.daveOSserialType&lt;br /&gt;
Dim daveInter As libnodave.daveInterface&lt;br /&gt;
Dim daveConex As libnodave.daveConnection&lt;br /&gt;
&lt;br /&gt;
Public BufferLectura(1000) As Byte&lt;br /&gt;
Public BufferEscritura(1000) As Byte&lt;br /&gt;
&lt;br /&gt;
Public Conectado As Boolean = False&lt;br /&gt;
Public Mensaje As String&lt;br /&gt;
&lt;br /&gt;
Public Function Conectar(Optional ByVal Puerto As Integer = 102, _&lt;br /&gt;
Optional ByVal IP As String = "192.168.65.18", _&lt;br /&gt;
Optional ByVal Rack As Integer = 0, _&lt;br /&gt;
Optional ByVal Slot As Integer = 2) As Boolean&lt;br /&gt;
If Conectado Then&lt;br /&gt;
Mensaje = "Conexión abortada, ya existe una conexión."&lt;br /&gt;
Conectar = False&lt;br /&gt;
Exit Function&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Dim Respuesta As Integer&lt;br /&gt;
&lt;br /&gt;
Mensaje = "Abriendo una conexión serie..."&lt;br /&gt;
daveSerie.rfd = libnodave.openSocket(Puerto, IP)&lt;br /&gt;
daveSerie.wfd = daveSerie.rfd&lt;br /&gt;
&lt;br /&gt;
If daveSerie.rfd &amp;gt; 0 Then&lt;br /&gt;
Mensaje = "Conexión OK, creando interface..."&lt;br /&gt;
&lt;br /&gt;
daveInter = New libnodave.daveInterface(daveSerie, "", _&lt;br /&gt;
0, _&lt;br /&gt;
libnodave.daveProtoISOTCP, _&lt;br /&gt;
libnodave.daveSpeed187k)&lt;br /&gt;
&lt;br /&gt;
daveInter.setTimeout(1000000)  'Make this longer if you have a very long response time&lt;br /&gt;
&lt;br /&gt;
Mensaje = "Inicialización del adaptador OK, creando conexión..."&lt;br /&gt;
daveConex = New libnodave.daveConnection(daveInter, 0, Rack, Slot)&lt;br /&gt;
Respuesta = daveConex.connectPLC()&lt;br /&gt;
&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Conexión correcta, lista para operar."&lt;br /&gt;
Conectado = True&lt;br /&gt;
Else&lt;br /&gt;
libnodave.closeSocket(daveSerie.rfd)&lt;br /&gt;
Mensaje = "Error al abrir la conexión [" &amp;amp; _&lt;br /&gt;
libnodave.daveStrerror(Respuesta) &amp;amp; "]"&lt;br /&gt;
Conectado = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "Error al abrir la conexión"&lt;br /&gt;
Conectado = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Conectar = Conectado&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Public Function Desconectar() As Boolean&lt;br /&gt;
If Conectado Then&lt;br /&gt;
daveConex.disconnectPLC()&lt;br /&gt;
libnodave.closeSocket(daveSerie.rfd)&lt;br /&gt;
Conectado = False&lt;br /&gt;
Mensaje = "Conexión correctamente terminada."&lt;br /&gt;
Desconectar = True&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "No existe conexión activa."&lt;br /&gt;
Desconectar = False&lt;br /&gt;
End If&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Public Function LeerBytesDB(ByVal NumDB As Integer, _&lt;br /&gt;
ByVal Dir As Integer, _&lt;br /&gt;
ByVal NumBytes As Integer) As Boolean&lt;br /&gt;
&lt;br /&gt;
Dim Respuesta As Integer&lt;br /&gt;
&lt;br /&gt;
Respuesta = daveConex.readBytes(Libnodave.daveDB, NumDB, Dir, NumBytes, BufferLectura)&lt;br /&gt;
&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Leídos " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
LeerBytesDB = True&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "Error al leer " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
LeerBytesDB = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Public Function EscribirBytesDB(ByVal NumDB As Integer, _&lt;br /&gt;
ByVal Dir As Integer, _&lt;br /&gt;
ByVal NumBytes As Integer) As Boolean&lt;br /&gt;
Dim Respuesta As Integer&lt;br /&gt;
&lt;br /&gt;
Respuesta = daveConex.writeBytes(Libnodave.daveDB, NumDB, Dir, NumBytes, BufferEscritura)&lt;br /&gt;
&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Escritos " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
EscribirBytesDB = True&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "Error al escribir " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
EscribirBytesDB = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
End Class&lt;/blockquote&gt;
Lo que he hecho es cambiar el protocolo serie por el protocolo ethernet. Su uso es muy sencillo, a la función &lt;b&gt;Conectar&lt;/b&gt; se le pasan la dirección IP, el puerto, el rack y el slot. Si no hay error, con las funciones &lt;b&gt;LeerBytesDB&lt;/b&gt; y &lt;b&gt;EscribirBytesDB&lt;/b&gt; accedemos a datos almacenados en cualquier DB de la memoria del PLC (son exactamente las mismas funciones que en la versión serie). Al acabar debemos desconectarnos con la función &lt;b&gt;Desconectar&lt;/b&gt;. La clase se podría completar con funciones para acceder a otras zonas de memoria permitidas por Libnodave.&lt;br /&gt;
&lt;br /&gt;
Ejecuto mi aplicación, pongo los parámetros de conexión y pulso &lt;b&gt;Conectar&lt;/b&gt;. Si todo va bien me pondrá un mensaje que el enlace está realizado. Con los botones de lectura y escritura puedo ver como modifico y leo el contenido del DB10 en mi PLC.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-UtCZF9alcms/ToWa5Nnu1fI/AAAAAAAAB6s/V_CaeRRipn0/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-UtCZF9alcms/ToWa5Nnu1fI/AAAAAAAAB6s/V_CaeRRipn0/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Si nos equivocamos al dar la dirección IP o el puerto, nos dará error. Sin embargo si ponemos un rack o slot incorrectos, puede que nos diga que la conexión está correcta, pero evidentemente no lograremos leer ni escribir nada.&lt;br /&gt;
&lt;br /&gt;
Si quieres ver el código completo de este sencillo proyecto, lo tienes &lt;a href="http://goo.gl/Ed2KR"&gt;aquí&lt;/a&gt;. Si además quieres echar un vistazo a la configuración de Step7 que he usado, descárgate &lt;a href="http://goo.gl/rj5vw"&gt;este proyecto&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Aunque esta prueba está hecha sobre un WinAC en una máquina virtual, pienso que el código servirá para acceder a un PLC S7-300/400 con puerto ethernet. Si algún lector hace la prueba, le agradeceré una reseña en los comentarios.&lt;br /&gt;
&lt;br /&gt;
Este es un ejemplo muy sencillo, símplemente para comprobar que Libnodave funciona y es sencillo de usar. Ahora mismo se me ocurren un par de antiguos proyectos en los que podría haber usado Libnodave, consiguiendo abaratar su coste, al ahorrarnos licencias. Sin embargo no debemos olvidar que Libnodave, a pesar de su buen desempeño, no tiene una empresa detrás que nos de garantía o soporte, y que si lo usamos es por nuestra cuenta y riesgo.&lt;br /&gt;
&lt;br /&gt;
Como siempre, agradeceré cualquier comentario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-2620331664317570827?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ebF9mhr1OaRdsvN2XDKfjAeIRM4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ebF9mhr1OaRdsvN2XDKfjAeIRM4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ebF9mhr1OaRdsvN2XDKfjAeIRM4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ebF9mhr1OaRdsvN2XDKfjAeIRM4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/8w9XDCH2ZQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/2620331664317570827/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/10/accediendo-un-plc-simatic-traves-de.html#comment-form" title="16 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/2620331664317570827?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/2620331664317570827?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/8w9XDCH2ZQw/accediendo-un-plc-simatic-traves-de.html" title="Accediendo a un PLC Simatic a través de ethernet con Libnodave" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-qbVUICr22L0/ToWQq5qmzbI/AAAAAAAAB6c/pOFO9SWV1wU/s72-c/00.png" height="72" width="72" /><thr:total>16</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/10/accediendo-un-plc-simatic-traves-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYAQX46eyp7ImA9WhdUE0s.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-8979120783681175126</id><published>2011-09-30T09:00:00.000+02:00</published><updated>2011-09-30T09:02:20.013+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-30T09:02:20.013+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WinAC RTX" /><category scheme="http://www.blogger.com/atom/ns#" term="PLC Software" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="Industrial Ethernet" /><category scheme="http://www.blogger.com/atom/ns#" term="Comunicación" /><title>Virtualizando WinAC RTX, el PLC software de Siemens</title><content type="html">Después de estar trabajando con el &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html"&gt;SoftLogix&lt;/a&gt; de Rockwell sobre máquinas virtuales, me he preguntado si sería posible hacer funcionar al equivalente en Siemens, el &lt;a href="https://www.automation.siemens.com/mcms/programmable-logic-controller/en/software-plc/simatic-winac-rtx/Pages/Default.aspx"&gt;WinAC RTX&lt;/a&gt;, en las mismas condiciones. Así que me he puesto manos a la obra y he instalado sobre una máquina virtual en &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; con Windows XP el paquete Simatic NET V7.1 + SP1 y WinAC RTX V4.4 + SP1 con su correspondiente licencia. Toda la instalación transcurrió sin problemas:
&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-H7LUBK292S4/ToR9AmOqD-I/AAAAAAAAB4k/QLwPrQC7nm0/s1600/01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="342" src="http://3.bp.blogspot.com/-H7LUBK292S4/ToR9AmOqD-I/AAAAAAAAB4k/QLwPrQC7nm0/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;WinAC RTX ejecutándose sobre una máquina virtual (pincha sobre la imagen para verla mejor)&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Ahora el problema es poder configurarlo y programarlo desde otro equipo a través del puerto ethernet. En la web de Siemens hay una &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=ll&amp;amp;objid=38498524&amp;amp;nodeid0=37560781&amp;amp;load=content&amp;amp;start=31&amp;amp;csSort=-DOCDATUMBEITRAG&amp;amp;subtype=133000&amp;amp;lang=es&amp;amp;siteid=cseus&amp;amp;aktprim=0&amp;amp;objaction=csview&amp;amp;extranet=standard&amp;amp;viewreg=WW"&gt;guía&lt;/a&gt; para hacerlo, está bastante clarita y los pasos que voy a ir explicando están basados en ella.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Lo primero es asegurarnos que la configuración de red de nuestra máquina virtual es coherente con nuestra red local.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-tE9D16vFliE/ToR_h3WfEJI/AAAAAAAAB4s/N8Y8M7FPB3M/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tE9D16vFliE/ToR_h3WfEJI/AAAAAAAAB4s/N8Y8M7FPB3M/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
No está de más probar a hacer un ping para comprobar que existe comunicación.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-O_cqSA8rjg0/ToSAM-yGc7I/AAAAAAAAB40/Wx3CpQ3WOUU/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="323" src="http://4.bp.blogspot.com/-O_cqSA8rjg0/ToSAM-yGc7I/AAAAAAAAB40/Wx3CpQ3WOUU/s640/03.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ahora vamos a ejecutar la herramienta de configuración de Simatic NET, &lt;i&gt;Menú Inicio → SIMATIC → Simatic NET → Configuration Console
&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-CVEre984bWY/ToSBsGF5wPI/AAAAAAAAB48/vQVwjPOG4-c/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-CVEre984bWY/ToSBsGF5wPI/AAAAAAAAB48/vQVwjPOG4-c/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la árbol de la izquierda vamos a &lt;i&gt;PC Station → SIMATIC NET Configuration → Modules → Adaptador de servidor → General&lt;/i&gt;, ponemos el modo del módulo en &lt;i&gt;Configured Mode&lt;/i&gt; y el perfil del interface en &lt;i&gt;TCP/IP (Auto)&lt;/i&gt; y aplicamos.
&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wrvMQnSikGo/ToSEYXqNb8I/AAAAAAAAB5E/q_uus-_GD3w/s1600/05.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-wrvMQnSikGo/ToSEYXqNb8I/AAAAAAAAB5E/q_uus-_GD3w/s1600/05.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;En mi caso 'Adaptador de servidor' es la denominación de la tarjeta de red&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Ya podemos cerrar la consola de configuración. El siguiente paso será introducir nuestra tarjeta de red en el configurador de componentes (&lt;i&gt;Station Configurator&lt;/i&gt;). Para ello lo abrimos y sobre un slot vacío (en mi caso el uno), con el botón derecho del ratón, pulsamos sobre &lt;i&gt;Add&lt;/i&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-kmtli3BArlw/ToSGaS-8tPI/AAAAAAAAB5M/JC6ellvBej8/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-kmtli3BArlw/ToSGaS-8tPI/AAAAAAAAB5M/JC6ellvBej8/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el menú que aparece seleccionamos como tipo de componente &lt;i&gt;IE General&lt;/i&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-gdbwnOKAScM/ToSKPTgXSUI/AAAAAAAAB5U/hFtj3lhflyk/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-gdbwnOKAScM/ToSKPTgXSUI/AAAAAAAAB5U/hFtj3lhflyk/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En Index podemos asignar el número de slot, dejo el uno y acepto.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-X08UAKRKIrg/ToSK47hurZI/AAAAAAAAB5c/y_hHDfT8XhA/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-X08UAKRKIrg/ToSK47hurZI/AAAAAAAAB5c/y_hHDfT8XhA/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Podemos revisar las propiedades de configuración, que coincidirán con los parámetros de red de nuestra máquina virtual.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-itOfJjCi-3Y/ToSLR6fuaKI/AAAAAAAAB5k/LHLxAQuwyR8/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-itOfJjCi-3Y/ToSLR6fuaKI/AAAAAAAAB5k/LHLxAQuwyR8/s1600/09.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Aceptamos y ya aparece nuestra tarjeta de red configurada y lista para aceptar conexiones.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-nX90j4ESBVs/ToSL3lJk6tI/AAAAAAAAB5s/yUKeAYajZiE/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-nX90j4ESBVs/ToSL3lJk6tI/AAAAAAAAB5s/yUKeAYajZiE/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la máquina virtual ya solo nos queda ejecutar el WinAC para tener el sistema totalmente listo para establecer un enlace a través de ethernet. 
&lt;br /&gt;
Ahora vamos al equipo donde tengamos el software de programación Step7, en mi caso es el equipo anfitrión de la máquina virtual, pero podría cualquier otro equipo conectado a mi red local. Creamos un proyecto nuevo y configuramos nuestro WinAC RTX.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-k7FUFpMNtTE/ToSPf86cswI/AAAAAAAAB50/oEWhSILBCDk/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="398" src="http://2.bp.blogspot.com/-k7FUFpMNtTE/ToSPf86cswI/AAAAAAAAB50/oEWhSILBCDk/s640/11.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Sobre el mismo slot donde configuramos la tarjeta de red en el &lt;i&gt;Station Configurator&lt;/i&gt; de la máquina virtual arrastramos el componente &lt;i&gt;Estación PC SIMATIC → CP-Industrial Ethernet → IE General → SW V7.1&lt;/i&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-csgMoQdzBmc/ToSQ4_nMG7I/AAAAAAAAB58/lUbPo9MKTJE/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="548" src="http://2.bp.blogspot.com/-csgMoQdzBmc/ToSQ4_nMG7I/AAAAAAAAB58/lUbPo9MKTJE/s640/12.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Se abrirá una ventana de configuración donde deberemos especificar la dirección IP y la máscara de red correspondentes a nuestra máquina virtual.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-XzLD9_WT2QE/ToSRV-JDqAI/AAAAAAAAB6E/qLOEVLKL-Sk/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-XzLD9_WT2QE/ToSRV-JDqAI/AAAAAAAAB6E/qLOEVLKL-Sk/s1600/13.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Compilamos y guardamos la configuración, pero aún no estamos preparados para transferirla: antes debemos abrir la configuración del interface PG/PC y tenemos que asignar la tarjeta de red de nuestro PC.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-q4bIeu-0t1E/ToSSgy9o47I/AAAAAAAAB6M/outU4KGV72Y/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-q4bIeu-0t1E/ToSSgy9o47I/AAAAAAAAB6M/outU4KGV72Y/s1600/14.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Y ahora ya podemos transmitir la configuración hardware. Una vez hecho ya podemos probar a programar y a ponernos &lt;i&gt;on line&lt;/i&gt; con el PLC software.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-0ahH85vmLPU/ToSUBD-040I/AAAAAAAAB6U/8GKmIHdHAVU/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-0ahH85vmLPU/ToSUBD-040I/AAAAAAAAB6U/8GKmIHdHAVU/s1600/15.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Listo, hasta aquí esta entrada sobre la virtualización de un WinAC RTX. En mi caso me va a resultar muy útil para hacer pruebas sin necesitar físicamente un PLC. Con esta configuración he hecho pruebas de comunicación con la biblioteca Libnodave a través de ethernet con buenos resultados y de las que hablaré en una próxima entrada.&lt;br /&gt;
&lt;br /&gt;
Como siempre agradeceré cualquier comentario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-8979120783681175126?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Eo30Y2MQpnN60Z9zh6CRc1ShW4s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Eo30Y2MQpnN60Z9zh6CRc1ShW4s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Eo30Y2MQpnN60Z9zh6CRc1ShW4s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Eo30Y2MQpnN60Z9zh6CRc1ShW4s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/1OK3i5sPen8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/8979120783681175126/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/09/virtualizando-winac-rtx-el-plc-software.html#comment-form" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/8979120783681175126?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/8979120783681175126?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/1OK3i5sPen8/virtualizando-winac-rtx-el-plc-software.html" title="Virtualizando WinAC RTX, el PLC software de Siemens" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-H7LUBK292S4/ToR9AmOqD-I/AAAAAAAAB4k/QLwPrQC7nm0/s72-c/01.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/09/virtualizando-winac-rtx-el-plc-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFQ345eyp7ImA9WhdUEkw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-857652523332686755</id><published>2011-09-28T14:14:00.000+02:00</published><updated>2011-09-28T14:55:12.023+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-28T14:55:12.023+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PLC Software" /><category scheme="http://www.blogger.com/atom/ns#" term="SoftLogix" /><category scheme="http://www.blogger.com/atom/ns#" term="Comunicación" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="Mensajes" /><category scheme="http://www.blogger.com/atom/ns#" term="RSLogix 5000" /><title>Comunicación entre controladores Logix5000: Mensajes</title><content type="html">En esta entrada voy a resumir mis pruebas con la instrucción &lt;i&gt;MSG&lt;/i&gt; de Logix. Usaré la misma configuración de la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/09/comunicacion-entre-controladores.html"&gt;entrada anterior&lt;/a&gt;: dos máquinas virtuales con un SoftLogix en cada una que se comunicarán entre sí. El control de la mensajería la hará el primer controlador (SoftLogix A). En la segunda máquina virtual (SoftLogix B) simplemente voy a crear dos tags; en el primero, &lt;b&gt;MENSAJE_DATOS_RECIBIDOS&lt;/b&gt;, estarán los datos que se escribirán desde el SoftLogix A. En el segundo, &lt;b&gt;MENSAJE_DATOS_A_ENVIAR&lt;/b&gt;, pondré los datos que serán leídos desde el SoftLogix A. Y nada más, en el SoftLogix B no voy a hacer ninguna programación, simplemente voy a monitorizar los valores de ese par de tags.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-NodUTBHfUAg/ToL5V2aiOBI/AAAAAAAAB3I/Sy_6QWAimt0/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-NodUTBHfUAg/ToL5V2aiOBI/AAAAAAAAB3I/Sy_6QWAimt0/s400/00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Mis pruebas, por tanto, consistirán en, desde el SoftLogix A, leer y escribir a través de mensajes en los tags del SoftLogix B.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;br /&gt;
En el proyecto del SoftLogix A deberé especificar la existencia en la red Ethernet del SoftLogix B. Para ello, en el árbol de proyecto, en el apartado &lt;i&gt;I/O Configuration&lt;/i&gt;, bajo la tarjeta Ethernet hay que incluir los módulos correspondientes para que quede como sigue:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-eeBkyWMgQ68/ToL69Tjq0qI/AAAAAAAAB3M/vS7v3ghm5A0/s1600/01A.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-eeBkyWMgQ68/ToL69Tjq0qI/AAAAAAAAB3M/vS7v3ghm5A0/s1600/01A.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Para cada comunicación por mensajes deberemos definir un tag de tipo &lt;i&gt;MESSAGE&lt;/i&gt;. Como voy a usar en mensaje para escribir y otro para leer, creo los tags &lt;b&gt;MENSAJE_ESCRITURA_SLB&lt;/b&gt; y &lt;b&gt;MENSAJE_LECTURA_SLB&lt;/b&gt; respectivamente. También necesitaré tags que tengan el mismo formato que los tags del SoftLogix B en los que voy a leer y escribir, así que creo &lt;b&gt;DATOS_A_ESCRIBIR_SLB&lt;/b&gt; y &lt;b&gt;DATOS_LEIDOS_SLB&lt;/b&gt;. Finalmente creo un par de booleanos para dar las órdenes de escritura y lectura: &lt;b&gt;ORDEN_ESCRITURA_SLB&lt;/b&gt; y &lt;b&gt;ORDEN_LECTURA_SLB&lt;/b&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-xL8Ae3c8mgk/ToL9QjFJ84I/AAAAAAAAB3U/e2fDpHfbtyo/s1600/01B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-xL8Ae3c8mgk/ToL9QjFJ84I/AAAAAAAAB3U/e2fDpHfbtyo/s1600/01B.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ahora voy con la programación. Simplemente consiste en lanzar la instrucción &lt;i&gt;MSG&lt;/i&gt; con la orden de lectura o escritura y si no está el mensaje activo. Cuando finaliza la comunicación se borra la orden respectiva.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-sdUQaAmO0Wk/ToMCEpMiWWI/AAAAAAAAB3c/o7fNFH8nHoo/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://2.bp.blogspot.com/-sdUQaAmO0Wk/ToMCEpMiWWI/AAAAAAAAB3c/o7fNFH8nHoo/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En cada instrucción &lt;i&gt;MSG&lt;/i&gt; deberemos asignarle el tag de tipo &lt;i&gt;MESSAGE&lt;/i&gt; correspondiente. Para configurar el mensaje pulsaremos sobre el botón de los tres puntos que aparece en la instrucción.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-VEaF1J-8oms/ToMHMw543BI/AAAAAAAAB4M/Q_vVjaNAIdA/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/-VEaF1J-8oms/ToMHMw543BI/AAAAAAAAB4M/Q_vVjaNAIdA/s400/12.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Voy a empezar con el mensaje de lectura. En la pestaña Configuration lo primero es determinar el tipo de mensaje. Para la lectura de otro controlador Logix debo seleccionar &lt;i&gt;CIP Data Table Read&lt;/i&gt;. A continuación, en &lt;i&gt;Source Element&lt;/i&gt; debo escribir el nombre de la variable del SoftLogix B que voy a leer, decirle cuantos datos de la tabla se transmitirán en &lt;i&gt;Number of Elements&lt;/i&gt; y en &lt;i&gt;Destination Element&lt;/i&gt; poner el tag del SoftLogix A donde se recogeran los datos.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-N_bZe0L6RZ8/ToMEF91c3FI/AAAAAAAAB3k/sVRZ63LhZag/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-N_bZe0L6RZ8/ToMEF91c3FI/AAAAAAAAB3k/sVRZ63LhZag/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la pestaña &lt;i&gt;Communication&lt;/i&gt; hay que especificar el controlador de donde se leeran los datos. Para ello pulsamos sobre el botón &lt;i&gt;Browse&lt;/i&gt; y seleccionamos el controlador remoto.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-FamcnPIVXiM/ToMEys7-kSI/AAAAAAAAB3s/ik9F3v_r5K4/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-FamcnPIVXiM/ToMEys7-kSI/AAAAAAAAB3s/ik9F3v_r5K4/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-liRVVygi8-Y/ToMEy4pz3uI/AAAAAAAAB30/LLAoSJmWqcA/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-liRVVygi8-Y/ToMEy4pz3uI/AAAAAAAAB30/LLAoSJmWqcA/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la instrucción &lt;i&gt;MSG&lt;/i&gt; de escritura deberemos hacer una configuración similar, deberemos configurar como tipo de mensaje &lt;i&gt;CIP Data Table Write&lt;/i&gt;, especificar el tag donde están los datos a transmitir, en número de dato y el nombre de la variable en el controlador remoto donde se almacenarán.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-JWGNL5Vo1Gs/ToMGhwXd_7I/AAAAAAAAB38/0UuE4Bamys4/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-JWGNL5Vo1Gs/ToMGhwXd_7I/AAAAAAAAB38/0UuE4Bamys4/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la pestaña &lt;i&gt;Communication&lt;/i&gt; deberemos asímismo seleccionar el controlador remoto.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-fpRughfsKu0/ToMGzt6l9AI/AAAAAAAAB4E/O7viF-Zc-Ec/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-fpRughfsKu0/ToMGzt6l9AI/AAAAAAAAB4E/O7viF-Zc-Ec/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ya tenemos todo listo para comprobar que nuestra mensajería funciona. Cargamos nuestros proyectos en los dos SoftLogix y nos ponemos on line. En los tags &lt;b&gt;DATOS_A_ESCRIBIR_SLB&lt;/b&gt; del SoftLogix A y &lt;b&gt;MENSAJE_DATOS_A_ENVIAR&lt;/b&gt; del SoftLogix B asigno valores al azar y activando los bits de órdenes de lectura y escritura en el SoftLogix A compruebo que los datos se transmiten correctamente.
&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VoxBTenMak8/ToMItnE06qI/AAAAAAAAB4c/aFR36-HraxM/s1600/13.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="157" src="http://4.bp.blogspot.com/-VoxBTenMak8/ToMItnE06qI/AAAAAAAAB4c/aFR36-HraxM/s400/13.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Datos en el SoftLogix A&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PJ0R4Z57nn0/ToMItUTN_GI/AAAAAAAAB4U/nuwxO9jlMag/s1600/14.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="130" src="http://4.bp.blogspot.com/-PJ0R4Z57nn0/ToMItUTN_GI/AAAAAAAAB4U/nuwxO9jlMag/s400/14.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Datos en el SoftLogix B&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Y hasta aquí esta sencilla prueba de la mensajería en Logix.

Los mensajes se utilizan para realizar comunicaciones controladas por la lógica de programación. Por ejemplo, yo he tenido que usarlos recientemente para transmitir señales de alarma a un servidor, pero solo cuando se detectaba un cambio en las alarmas. De esta manera se evita saturar las comunicaciones. Además hay una serie de limitaciones como que no puede haber más de 16 mensajes simultáneos, en el &lt;a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm012_-es-p.pdf"&gt;manual&lt;/a&gt; (PDF) viene todo esto muy bien explicado.&lt;br /&gt;
&lt;br /&gt;
Como siempre agradeceré cualquier comentario. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-857652523332686755?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bp7-oqNnV6YiIOgPfBM7M8j1OBk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bp7-oqNnV6YiIOgPfBM7M8j1OBk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bp7-oqNnV6YiIOgPfBM7M8j1OBk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bp7-oqNnV6YiIOgPfBM7M8j1OBk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/jPdiujSzoqM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/857652523332686755/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/09/comunicacion-entre-controladores_28.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/857652523332686755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/857652523332686755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/jPdiujSzoqM/comunicacion-entre-controladores_28.html" title="Comunicación entre controladores Logix5000: Mensajes" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-NodUTBHfUAg/ToL5V2aiOBI/AAAAAAAAB3I/Sy_6QWAimt0/s72-c/00.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/09/comunicacion-entre-controladores_28.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08MR3o5cSp7ImA9WhdWEUk.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-3826907696724594407</id><published>2011-09-04T15:25:00.000+02:00</published><updated>2011-09-04T16:18:06.429+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-04T16:18:06.429+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SoftLogix" /><category scheme="http://www.blogger.com/atom/ns#" term="Comunicación" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="Logix" /><title>Comunicación entre controladores Logix5000: Tags producidos y consumidos</title><content type="html">Para comunicar dos controladores de la gama &lt;a href="http://ab.rockwellautomation.com/Programmable-Controllers"&gt;Logix5000&lt;/a&gt; existen dos opciones: &lt;a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm011_-es-p.pdf"&gt;Tags producidos/consumidos&lt;/a&gt; [PDF] o Mensajes. Los primeros simplemente se configuran de forma que no es necesario la intervención de instrucciones de programación para su difusión: lo que escribamos en un tag productor de un controlador se verá reflejado en los tags consumidores del controlador o controladores consumidores. Los mensajes, en cambio, precisan de la instrucción MSG para su difusión.&lt;br /&gt;
&lt;br /&gt;
En esta entrada haré un resumen de mis pruebas con los tags productores/consumidores.

Como no dispongo físicamente de ningún controlador &lt;a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/407648/7921716/"&gt;CompactLogix&lt;/a&gt; o &lt;a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/360807/1837516/"&gt;ControlLogix&lt;/a&gt; con el que trastear, he preparado dos máquinas virtuales con un &lt;a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/1239772/2185365/"&gt;SoftLogix&lt;/a&gt; en cada una, tal y como hice en &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html"&gt;esta entrada&lt;/a&gt;. Las ejecutaré simultáneamente en mi ordenador a la vez que la máquina virtual donde tengo el software de programación, lo cual supone tres máquinas virtuales simultáneas sobre mi portátil, que, aparte de calentarse más que una sartén, ha aguantado estoicamente.&lt;br /&gt;
&lt;br /&gt;
Teniendo ya todo el sistema de pruebas preparado, lo primero será comprobar que los controladores se &lt;i&gt;ven entre sí&lt;/i&gt;. Para ello ejecuto el &lt;i&gt;RSLinx&lt;/i&gt; en cualquier máquina virtual y con la herramienta &lt;i&gt;RSWho&lt;/i&gt; observo que aparecen mis dos controladores SoftLogix:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" src="http://1.bp.blogspot.com/-bASrmTzEmNw/TmNsF1BczHI/AAAAAAAAB1w/HQh2LhHeA2Y/s1600/00.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
Ahora tengo que preparar dos proyectos (ver &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/preparando-un-proyecto-para-programar.html"&gt;esta entrada&lt;/a&gt;), uno para el contolador productor (SoftLogix A) y otro para el controlador consumidor (SoftLogix B). No voy a hacer ninguna programación, simplemente voy a configurar un tag productor, cambiar su valor en la monitorización de tags y comprobar que el valor se transmite al tag consumidor.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;En el SoftLogix A (productor) creo una variable llamada &lt;b&gt;PRODUCIDA&lt;/b&gt; del tipo DINT (obligatoriamente debe estar en el ámbito del controlador) y voy a sus propiedades.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-1iKAufWAVyk/TmNsWe6tY7I/AAAAAAAAB14/Ja8ri2eWWcQ/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-1iKAufWAVyk/TmNsWe6tY7I/AAAAAAAAB14/Ja8ri2eWWcQ/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Selecciono el tipo Produced y pulso sobre Conection...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-yO-4VktcJmg/TmNsmGc-MQI/AAAAAAAAB2A/tPiIc_qy2Gc/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-yO-4VktcJmg/TmNsmGc-MQI/AAAAAAAAB2A/tPiIc_qy2Gc/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Como solo voy a tener un consumidor, dejo la opción &lt;i&gt;Max Consumers&lt;/i&gt; a &lt;b&gt;1&lt;/b&gt; y acepto.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-3_pGKe7qX2c/TmNsqllKPCI/AAAAAAAAB2I/n5Cz9BkmPRg/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-3_pGKe7qX2c/TmNsqllKPCI/AAAAAAAAB2I/n5Cz9BkmPRg/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el controlador productor no hay que configurar nada más, así que voy al proyecto del SoftLogix B (consumidor) y creo otra variable del mismo tipo que la anterior (también en al ámbito del controlador) y la llamo &lt;b&gt;CONSUMIDA&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-s8hBJjb1FrQ/TmNsv8VFOJI/AAAAAAAAB2Q/TJshwhkDHWs/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-s8hBJjb1FrQ/TmNsv8VFOJI/AAAAAAAAB2Q/TJshwhkDHWs/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
A este tag consumidor hay que especificarle de dónde tiene que obtener su valor, para ello en el árbol de proyecto, bajo la tarjeta ethernet virtual del SoftLogix B (consumidor), debemos introducir la configuración del SoftLogix A (productor), que quedará así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ufHEHNKLyS4/TmNs0X7lItI/AAAAAAAAB2Y/1KEC6K9L8cM/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ufHEHNKLyS4/TmNs0X7lItI/AAAAAAAAB2Y/1KEC6K9L8cM/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Tenemos que tener la precaución de especificar la dirección IP del controlador productor.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-xXBmUgPbEjE/TmNs8DU1vjI/AAAAAAAAB2g/1ScrNRJ2HgQ/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-xXBmUgPbEjE/TmNs8DU1vjI/AAAAAAAAB2g/1ScrNRJ2HgQ/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Para evitar un error de duplicidad de control en la tarjeta de entradas/salidas digitales del SoftLogix A la he deshabilitado.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-akQsWP4WQCE/TmNtACBWGwI/AAAAAAAAB2o/swrCXpZ0U20/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-akQsWP4WQCE/TmNtACBWGwI/AAAAAAAAB2o/swrCXpZ0U20/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ahora vamos a las propiedades del tag &lt;b&gt;CONSUMIDA&lt;/b&gt;, selecionamos el tipo &lt;i&gt;Consumed&lt;/i&gt;, y pulsamos sobre el botón &lt;i&gt;Connection...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-kCdKwl1SX2U/TmNtEEgPtII/AAAAAAAAB2w/_wthF4DOZCo/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-kCdKwl1SX2U/TmNtEEgPtII/AAAAAAAAB2w/_wthF4DOZCo/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Como producor (&lt;i&gt;producer&lt;/i&gt;) seleccionamos en el menú desplegable el controlador productor (en mi caso &lt;b&gt;SL_Productor&lt;/b&gt;). En la casilla &lt;i&gt;Remote Data &lt;/i&gt;hay que especificar el nombre de la variable producida en el controlador productor, en mi caso &lt;b&gt;PRODUCIDA&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-b6j8rGJsxQg/TmNtH4IdW_I/AAAAAAAAB24/sjFY1GhrJhg/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-b6j8rGJsxQg/TmNtH4IdW_I/AAAAAAAAB24/sjFY1GhrJhg/s1600/09.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
El RPI (&lt;i&gt;Requested Packet Interval&lt;/i&gt;) es el tiempo de actualización de la variable consumida. Deberemos ser cuidadosos con este tiempo ya que un RPI bajo implica mayor consumo en los recursos de nuestra red de comunicaciones. Ademas este valor debe ser mayor que el tiempo de actualización de la red.&lt;br /&gt;
&lt;br /&gt;
Y listo, ya solo nos queda comprobar que nuestra configuración funciona. Me pongo &lt;i&gt;on-line&lt;/i&gt; con los dos SoftLogix y, monitorizando los tags, compruebo que un valor introducido en el tag &lt;b&gt;PRODUCIDA&lt;/b&gt; del controlador productor se refleja en el tag &lt;b&gt;CONSUMIDA&lt;/b&gt; del controlador consumidor.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-C4hKXpR8iW0/TmNtL08wJSI/AAAAAAAAB3A/RdBeH1ripU4/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://1.bp.blogspot.com/-C4hKXpR8iW0/TmNtL08wJSI/AAAAAAAAB3A/RdBeH1ripU4/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Cuando configuramos tags productores o consumidores podemos seleccionar conexiones &lt;i&gt;Unicast&lt;/i&gt;, que, según tengo entendido, exigen menos recursos de la red. Son conexiones punto a punto (&lt;i&gt;point to point&lt;/i&gt;) entre un controlador productor y un controlador consumidor (no se permiten conexiones múltiples). Según leo en la edición en inglés del &lt;a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm011_-en-p.pdf"&gt;manual&lt;/a&gt; (en la versión &lt;a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/pm/1756-pm011_-es-p.pdf"&gt;en español&lt;/a&gt; no figura) el controlador productor debe permitir conexiones &lt;i&gt;Unicast&lt;/i&gt;, pero es el controlador consumidor quien decide si la conexión es &lt;i&gt;unicast&lt;/i&gt; o &lt;i&gt;multicast&lt;/i&gt;. Sin embargo, en mis pruebas, si configuro el consumidor para permitir las conexiones &lt;i&gt;Unicast&lt;/i&gt;, el productor también tengo que configurarlo como &lt;i&gt;Unicast&lt;/i&gt;, si no, no funciona. &lt;br /&gt;
&lt;br /&gt;
Como siempre, agradeceré cualquier comentario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-3826907696724594407?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JThy1Ua2afiFHq3bGdK5X17yYqw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JThy1Ua2afiFHq3bGdK5X17yYqw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JThy1Ua2afiFHq3bGdK5X17yYqw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JThy1Ua2afiFHq3bGdK5X17yYqw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/RdaKV_b-t7Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/3826907696724594407/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/09/comunicacion-entre-controladores.html#comment-form" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3826907696724594407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3826907696724594407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/RdaKV_b-t7Q/comunicacion-entre-controladores.html" title="Comunicación entre controladores Logix5000: Tags producidos y consumidos" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-bASrmTzEmNw/TmNsF1BczHI/AAAAAAAAB1w/HQh2LhHeA2Y/s72-c/00.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/09/comunicacion-entre-controladores.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkECRHY4fip7ImA9WhdXF00.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-3563975803874993506</id><published>2011-08-27T22:20:00.002+02:00</published><updated>2011-08-30T12:37:45.836+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-30T12:37:45.836+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="HMI" /><category scheme="http://www.blogger.com/atom/ns#" term="PanelView" /><category scheme="http://www.blogger.com/atom/ns#" term="Factory Talk View ME" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><title>Probando Factory Talk View ME, el software de programación para  PanelView</title><content type="html">De todos los programas de &lt;a href="http://www.rockwellautomation.com/"&gt;Rockwell&lt;/a&gt; con los que he tenido que trabajar hasta ahora, el que menos me ha gustado es el software de programación de paneles de operador &lt;i&gt;&lt;a href="http://www.rockwellautomation.com/rockwellsoftware/performance/view/viewme.html"&gt;Factory Talk View Studio Machine Edition&lt;/a&gt;&lt;/i&gt; (anteriormente denominado &lt;i&gt;RSView Studio Machine Edition&lt;/i&gt;). Lo cierto es que dispone de prestaciones similares a programas análogos de otros fabricantes, pero el entorno no me ha parecido cómodo, ya que operaciones muy comunes hay que realizarlas con aplicaciones externas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_etd_krXRas/TllMcQ2rsaI/AAAAAAAAB04/KAG1BEG-T8A/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-_etd_krXRas/TllMcQ2rsaI/AAAAAAAAB04/KAG1BEG-T8A/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Este software sirve para programar la gama de paneles de operador &lt;a href="http://www.ab.com/en/epub/catalogs/12762/2181376/1239781/1670480/10791114/"&gt;&lt;i&gt;PanelView Plus Terminal&lt;/i&gt;&lt;/a&gt; y &lt;a href="http://ab.rockwellautomation.com/graphic-terminals/2711p-panelview-plus-ce-terminals"&gt;&lt;i&gt;PanelView Plus CE Computers&lt;/i&gt;&lt;/a&gt;. Nada más ejecutarlo nos ofrecerá abrir un proyecto existente o crear uno nuevo. La gestión de los proyectos es un poco especial.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Al crear uno nuevo lo almacenará en un directorio por defecto, en mi caso en "&lt;i&gt;C:\Documents and Settings\All Users\Documentos\RSView Enterprise\ME\HMI projects&lt;/i&gt;", pero no deberemos acceder directamente, en su lugar usaremos la herramienta específica &lt;i&gt;Application Manager&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-6ilPNTNQtvc/TllMgcrdKwI/AAAAAAAAB1A/cfbEVjYIyEg/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-6ilPNTNQtvc/TllMgcrdKwI/AAAAAAAAB1A/cfbEVjYIyEg/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Con ella podremos renombrar, copiar, borrar, hacer copias de seguridad y restaurarlas, importar proyectos de versiones anteriores y, a partir de una aplicación compilada, obtener el proyecto para editarlo. Este último punto es algo que echo de menos en otros fabricantes.&lt;br /&gt;
&lt;br /&gt;
Al abrir un proyecto, el aspecto de la aplicación es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ch3OHffO4KI/TllMkVl9d9I/AAAAAAAAB1I/GLDynPPrRL4/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://2.bp.blogspot.com/-Ch3OHffO4KI/TllMkVl9d9I/AAAAAAAAB1I/GLDynPPrRL4/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A la izquierda dispone de un árbol de proyecto donde tenemos acceso a los diferentes componentes. En la parte superior una barra con acceso a los objetos gráficos. Abajo está el diagnóstico que nos dará información sobre la actividad de la aplicación.&lt;br /&gt;
&lt;br /&gt;
A la hora de programar objetos gráficos, tales como botones, visualizaciones de texto, etc., es muy similar a cualquier otro software de programación. La gama de objetos es amplia y no he echado de menos ningún tipo de control. La biblioteca de símbolos predefinidos que trae listos para usar es bastante completa.&lt;br /&gt;
&lt;br /&gt;
Con el &lt;i&gt;Factory Talk View ME&lt;/i&gt; es necesario instalar también el &lt;i&gt;RSLinx Enterprise&lt;/i&gt;, que nos servirá para gestionar las comunicaciones. En el árbol de proyecto tenemos un acceso a través de &lt;i&gt;RSLinx Enterprise -&amp;gt; Communications Setup&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jRYYf5AHx8g/TllMpf5d5hI/AAAAAAAAB1Q/Knco99OyraY/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-jRYYf5AHx8g/TllMpf5d5hI/AAAAAAAAB1Q/Knco99OyraY/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aquí podemos configurar dos accesos (&lt;i&gt;shortcuts&lt;/i&gt;) al PLC que queramos monitorizar: uno para tener acceso desde nuestro equipo directamente, para permitirnos probar la aplicación sin necesidad de enviarla al panel; el otro es el acceso desde el propio panel al PLC. También podemos especificar el fichero del proyecto del PLC para poder obtener los tags en modo &lt;i&gt;off-line&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BQ7F3aaRYfU/TllMtCCinHI/AAAAAAAAB1Y/qASUoFx7vuE/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://2.bp.blogspot.com/-BQ7F3aaRYfU/TllMtCCinHI/AAAAAAAAB1Y/qASUoFx7vuE/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Hay que reconocer que todo lo que tiene que ver con comunicaciones, Rockwell lo tiene muy bien desarrollado, muy sencillo y sin complicaciones.&lt;br /&gt;
&lt;br /&gt;
El proyecto puede ser totalmente simulado en nuestro PC, de hecho he llegado a estar conectado al PLC con la misma aplicación HMI trabajando simultáneamente desde mi PC y desde un &lt;a href="http://ab.rockwellautomation.com/graphic-terminals/2711p-panelview-plus-700"&gt;&lt;i&gt;PanelView Plus 700&lt;/i&gt;&lt;/a&gt; y con resultados óptimos.&lt;br /&gt;
&lt;br /&gt;
La parte que me ha decepcionado de este software es la gestión de tags. No existe un integración real con el proyecto del PLC, lo que implica que debemos actualizar la lista de tags cada vez que los modifiquemos en el PLC. Además no existen referencias cruzadas ni la posibilidad de saber donde se usa un tag. Para solventar este problema, a partir de la versión cinco, existe la aplicación &lt;i&gt;Application Documenter&lt;/i&gt; que nos permitirá listados de tags en función de su uso y referencias cruzadas, pero que al ser una aplicación independiente, no permite interaccionar con el &lt;i&gt;Factory Talk View ME&lt;/i&gt;. Por ejemplo, para saber donde se usa una variable, echo de menos poder ir a la lista de tags y selecionar una instrucción como "ir al punto de aplicación".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-F7qkfcgLtNA/TllMxzE5fSI/AAAAAAAAB1g/dham5UiKeEQ/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://4.bp.blogspot.com/-F7qkfcgLtNA/TllMxzE5fSI/AAAAAAAAB1g/dham5UiKeEQ/s400/05.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Para realizar la transferencia de la aplicación al PanelView debemos previamente generar el runtime. Una vez generado, hay que abrir la aplicación &lt;i&gt;Transfer Utility&lt;/i&gt;, seleccionar el proyecto compilado, asignar la ruta al panel y transferir. Esta misma aplicación permite obtener los proyectos compilados que existan en el panel y realizar comparaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--chKq-bR7Jc/TllM2dnKIuI/AAAAAAAAB1o/7EKvqe4tNJc/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://3.bp.blogspot.com/--chKq-bR7Jc/TllM2dnKIuI/AAAAAAAAB1o/7EKvqe4tNJc/s400/06.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Recientemente tuve que adaptar un PanelView 700 Plus para pasar de trabajar con un &lt;a href="http://ab.rockwellautomation.com/programmable-controllers/micrologix-systems"&gt;&lt;i&gt;MicroLogix&lt;/i&gt;&lt;/a&gt; a un &lt;a href="http://ab.rockwellautomation.com/programmable-controllers/compactlogix"&gt;&lt;i&gt;CompactLogix&lt;/i&gt;&lt;/a&gt;. En el panel había configurados más de mil tags y tenía la certeza de que muchos de ellos no se usaban. Además, por imperativos del cliente, tuve que usar la versión cuatro del software, para la que no existe el &lt;i&gt;Application Documenter&lt;/i&gt;. Con lo que para saber donde se usaba un tag (o si no se usaba) tenía que ir buscándolo pantalla por pantalla y objeto por objeto. Al final la solución fue instalar la versión seis del software, importar la aplicación y con el &lt;i&gt;Application Documenter&lt;/i&gt; sacar un listado de referencias cruzadas de tags. Luego volví a la versión cuatro y, listado en mano, hacer limpieza. Además, al borrar un tag no te avisa de si está en uso y si borras lo que no debes tampoco se puede deshacer. En entornos de desarrollo de otros fabricantes existe la opción de eliminar las variables no usadas automáticamente, de existir esta funcionalidad en la aplicación de Rockwell me hubiese ahorrado algunas horas de trabajo.&lt;br /&gt;
&lt;br /&gt;
Y hasta aquí estas breves notas sobre mis primeras impresiones sobre &lt;i&gt;Factory Talk View ME&lt;/i&gt;. Es una aplicación que cumple su función, y tiene puntos fuertes como la comunicación, el simulador o el poder recuperar aplicaciones desde el runtime. Sin embargo, en mi opinión, no resulta cómodo por la falta de integración de las aplicaciones auxiliares. La ausencia de referencias cruzadas en el propio programa y tener que andar buscando donde se usan los tags me resulta engorroso, sobre todo cuando tienes que modificar un panel complejo.&lt;br /&gt;
&lt;br /&gt;
Como siempre agradeceré cualquier comentario, especialmente si puedes aportar experiencias con este software. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-3563975803874993506?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A7RW6nugd-1I0oaLbiDAXtQOpGc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A7RW6nugd-1I0oaLbiDAXtQOpGc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A7RW6nugd-1I0oaLbiDAXtQOpGc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A7RW6nugd-1I0oaLbiDAXtQOpGc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/l-GrccUXu2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/3563975803874993506/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/08/probando-factory-talk-view-me-el.html#comment-form" title="10 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3563975803874993506?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3563975803874993506?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/l-GrccUXu2s/probando-factory-talk-view-me-el.html" title="Probando Factory Talk View ME, el software de programación para  PanelView" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-_etd_krXRas/TllMcQ2rsaI/AAAAAAAAB04/KAG1BEG-T8A/s72-c/00.png" height="72" width="72" /><thr:total>10</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/08/probando-factory-talk-view-me-el.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUICSHcyeyp7ImA9WhdQE0k.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-7134448606682175386</id><published>2011-08-14T19:39:00.000+02:00</published><updated>2011-08-14T19:39:29.993+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-14T19:39:29.993+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Add-On" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="Logix" /><title>Probando los Add-Ons de Logix: control de cilindro neumático de doble efecto</title><content type="html">En &lt;a href="http://notasdeautomatizacion.blogspot.com/2010/11/ejemplo-de-control-de-un-cilindro-de.html"&gt;esta entrada&lt;/a&gt; programé un control para cilindros neumáticos de doble efecto en Step7. Ahora, aprovechando la configuración que preparé en las dos entradas anteriores, voy a traducir el mismo código a Logix. Para ello voy a programar un &lt;i&gt;Add-On&lt;/i&gt;, que es lo que viene a ser el equivalente a los bloques de función (&lt;i&gt;FB&lt;/i&gt;) de Step7.&lt;br /&gt;
&lt;br /&gt;
Voy a conservar la funcionalidad: los parámetros de entrada y salida se llaman igual en ambos sistemas y tienen exactamente la misma función. Lo único que cambia es el formato de los tiempos: en Step7 son en formato &lt;i&gt;#Time&lt;/i&gt; y en Logix son &lt;i&gt;DINT&lt;/i&gt; expresados en milisegundos.&lt;br /&gt;
&lt;br /&gt;
Empezamos &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/preparando-un-proyecto-para-programar.html"&gt;creando y configurando un proyecto en el RSLogix 5000&lt;/a&gt;. A continuación, para crear un &lt;i&gt;Add-On&lt;/i&gt; vamos al árbol de proyecto y sobre la carpeta &lt;i&gt;Add-On Instructions&lt;/i&gt;, con el botón derecho del ratón, pulsamos sobre &lt;i&gt;New Add-On Instruction...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-etYTtx_sSy8/TkV11kn7hkI/AAAAAAAABzA/-3x5608U67U/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-etYTtx_sSy8/TkV11kn7hkI/AAAAAAAABzA/-3x5608U67U/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aparecerá una ventana donde deberemos darle un nombre y, opcionalmente, una descripción, número de versión, etc. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2iif75iZbnY/TkV2ordoTNI/AAAAAAAABzI/spJjXZ1xrIY/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-2iif75iZbnY/TkV2ordoTNI/AAAAAAAABzI/spJjXZ1xrIY/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Si hemos dejado marcada la casilla &lt;i&gt;Open Definition&lt;/i&gt;, se abrirá la ventana  &lt;i&gt;Add-On Instruction Definition&lt;/i&gt;, donde podremos especificar los parámetros de entrada y salida, las variables (&lt;i&gt;tags&lt;/i&gt;) locales y una descripción extendida a modo de ayuda.&lt;br /&gt;
&lt;br /&gt;
En la siguiente captura muestro los parámetros de entrada / salida configurados:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yr5BnnVidfE/TkWTtkYSpvI/AAAAAAAABzQ/qIs9Gvdxys0/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="547" src="http://4.bp.blogspot.com/-yr5BnnVidfE/TkWTtkYSpvI/AAAAAAAABzQ/qIs9Gvdxys0/s640/02.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Las variables locales al &lt;i&gt;Add-On&lt;/i&gt; necesarias:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-G12RQB8Kn30/TkWUTO08A4I/AAAAAAAABzY/lB69K7KbWx4/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://4.bp.blogspot.com/-G12RQB8Kn30/TkWUTO08A4I/AAAAAAAABzY/lB69K7KbWx4/s640/03.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y una descripción del funcionamiento del Add-On:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QBBiip27n-Q/TkWdTxJzD4I/AAAAAAAABzg/7MdomIYynhU/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="411" src="http://2.bp.blogspot.com/-QBBiip27n-Q/TkWdTxJzD4I/AAAAAAAABzg/7MdomIYynhU/s640/04.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Respecto al código, no voy a detallarlo aquí pues quedaría demasiado largo. Es muy similar al código de Step7, adaptado, claro está, a las perculiaridades de Logix. Al final de esta entrada pondré un enlace al &lt;i&gt;Add-On&lt;/i&gt; exportado a un fichero en formato L5X (XML).&lt;br /&gt;
&lt;br /&gt;
Al crear el &lt;i&gt;Add-On&lt;/i&gt;, en el árbol de proyecto bajo &lt;i&gt;Data Types -&amp;gt; Add-On-Defined&lt;/i&gt;, veremos que aparece un nuevo tipo de dato con el mismo nombre que el &lt;i&gt;Add-On&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QkwvqLwEQgE/Tkf6gJEIjrI/AAAAAAAAB0I/XWZ8MNXQLFc/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-QkwvqLwEQgE/Tkf6gJEIjrI/AAAAAAAAB0I/XWZ8MNXQLFc/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En él figuran todos los parámetros de entrada (&lt;i&gt;Input&lt;/i&gt;), salida (&lt;i&gt;Output&lt;/i&gt;) y entrada/salida (&lt;i&gt;InOut&lt;/i&gt;). En las variables del controlador (&lt;i&gt;Controller Tags&lt;/i&gt;), por cada cilindro neumático que pretendamos controlar deberemos declarar una variable de este tipo. En este ejemplo he declarado un tag llamado CIL_DOSIFICADOR.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Vncu0HnoTok/TkgAk6-d8yI/AAAAAAAAB0Q/9TUIB8iHMNg/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Vncu0HnoTok/TkgAk6-d8yI/AAAAAAAAB0Q/9TUIB8iHMNg/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Para usar el &lt;i&gt;Add-On&lt;/i&gt; en el programa la forma de proceder será:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Asignar valores a los parámetros de entrada del tag correspondiente al cilindro.&lt;/li&gt;
&lt;li&gt;Hacer la llamada al &lt;i&gt;Add-On&lt;/i&gt; con el tag correspondiente.&lt;/li&gt;
&lt;li&gt;Leer los parámetros de salida en el mismo tag.&lt;/li&gt;
&lt;/ol&gt;Por ejemplo, en la siguiente captura de pantalla asigno las entradas de origen y avance del cilindro, hago la llamada al &lt;i&gt;Add-On&lt;/i&gt; y finalmente activo las salidas correspondientes al cilindro:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-r7g_ZyUcK5c/TkgDEzXSFEI/AAAAAAAAB0Y/bWtGKPGwdjE/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="430" src="http://4.bp.blogspot.com/-r7g_ZyUcK5c/TkgDEzXSFEI/AAAAAAAAB0Y/bWtGKPGwdjE/s640/07.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El resto de parámetros los he forzado estando &lt;i&gt;On-Line&lt;/i&gt; con el SoftLogix.&lt;br /&gt;
&lt;br /&gt;
En Step7 la asignación de parámetros de entrada/salida es más visual pues se hace en la misma llamada al FB. En Logix debe hacerse por separado. Personalmente prefiero la forma en que lo hace Step7, aunque la funcionalidad es la misma en ambos sistemas.&lt;br /&gt;
&lt;br /&gt;
El código de mi &lt;i&gt;Add-On&lt;/i&gt; lo puedes descargar &lt;a href="http://goo.gl/gFzAd"&gt;aquí&lt;/a&gt;. Para incorporarlo a un proyecto debes ir al árbol de proyecto y sobre &lt;i&gt;Add-On Instructions&lt;/i&gt;, con el botón derecho del ratón seleccionar &lt;i&gt;Import Add-On Instruction...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TrW4rLiVTfY/TkgFcnjO2xI/AAAAAAAAB0g/Ij1PyeaQGJs/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-TrW4rLiVTfY/TkgFcnjO2xI/AAAAAAAAB0g/Ij1PyeaQGJs/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y hasta aquí mi primer contacto con un &lt;i&gt;Add-On&lt;/i&gt; en Logix. Como siempre, cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-7134448606682175386?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8ApxMdXtlOMy3hAZ5r9cIElItxo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ApxMdXtlOMy3hAZ5r9cIElItxo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8ApxMdXtlOMy3hAZ5r9cIElItxo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ApxMdXtlOMy3hAZ5r9cIElItxo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/Lc8RhxD98fQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/7134448606682175386/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/08/probando-los-add-ons-de-logix-control.html#comment-form" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/7134448606682175386?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/7134448606682175386?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/Lc8RhxD98fQ/probando-los-add-ons-de-logix-control.html" title="Probando los Add-Ons de Logix: control de cilindro neumático de doble efecto" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-etYTtx_sSy8/TkV11kn7hkI/AAAAAAAABzA/-3x5608U67U/s72-c/00.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/08/probando-los-add-ons-de-logix-control.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYGQHc7cSp7ImA9WhdRGEU.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-3660021265627210981</id><published>2011-08-09T13:08:00.000+02:00</published><updated>2011-08-09T13:08:41.909+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-09T13:08:41.909+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SoftLogix" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="RSLogix 5000" /><title>Preparando un proyecto para programar un SoftLogix</title><content type="html">En la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html"&gt;entrada anterior&lt;/a&gt; preparé una máquina virtual con &lt;i&gt;SoftLogix&lt;/i&gt;, ahora voy a configurar un proyecto en el &lt;i&gt;RSLogix 5000&lt;/i&gt;, el cual tengo montado en otra máquina virtual. Así que en mi equipo anfitrión voy a ejecutar dos máquinas virtuales, de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IyD4pqtdiec/TkDmE7DaF9I/AAAAAAAABvA/MvAD3I7EXIs/s1600/path3876.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-IyD4pqtdiec/TkDmE7DaF9I/AAAAAAAABvA/MvAD3I7EXIs/s1600/path3876.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ejecuto el &lt;i&gt;RSLogix 5000&lt;/i&gt; y creo un nuevo proyecto... &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-v9hO3d9VoEc/TkDnHp_hLAI/AAAAAAAABvI/te6AzPWzedg/s1600/33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-v9hO3d9VoEc/TkDnHp_hLAI/AAAAAAAABvI/te6AzPWzedg/s1600/33.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Lo primero que me pide es el tipo de controlador, selecciono el &lt;i&gt;1789-L60 SoftLogix&lt;/i&gt; y su correspondiente número de revisión. Si no nos apareciese el número de revisión necesitaríamos instalar la versión correspondiente de &lt;i&gt;RSLogix 5000&lt;/i&gt;. Asignamos un nombre, una descripción, el número de slot que ocupa y dónde vamos a guardar nuestro proyecto.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MbbnAKnGFdo/TkDoWJzhleI/AAAAAAAABvQ/OWi4NqqPqUI/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-MbbnAKnGFdo/TkDoWJzhleI/AAAAAAAABvQ/OWi4NqqPqUI/s1600/14.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Al pulsar OK se creará. El siguiente paso será, en el árbol de proyecto, en &lt;i&gt;I/O Configuration&lt;/i&gt;, añadir los módulos virtuales que hemos configurado en nuestro &lt;i&gt;SoftLogix&lt;/i&gt;. El módulo del controlador ya está puesto, así que pulsamos sobre &lt;i&gt;New Module...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QRYwPqSYmeQ/TkDp1yIYJMI/AAAAAAAABvY/-Zu1OFdoeXI/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-QRYwPqSYmeQ/TkDp1yIYJMI/AAAAAAAABvY/-Zu1OFdoeXI/s1600/15.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En el slot número 2 estaba la tarjeta simuladora de 32 entradas y 32 salidas digitales. Para configurarla seleccionamos &lt;i&gt;Other -&amp;gt; Generic 1789 Module&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-YT0s6v42OZU/TkDqaq2jXoI/AAAAAAAABvg/G-aGBLf6nfU/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-YT0s6v42OZU/TkDqaq2jXoI/AAAAAAAABvg/G-aGBLf6nfU/s1600/16.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A continuación nos pedirá su configuración. Le asignamos un nombre, un comentario, el número de slot, y en &lt;i&gt;Conections Parameters&lt;/i&gt; ponemos los valores que se ven en la siguiente captura de pantalla:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bYSAmgu549g/TkDrP1JJ0_I/AAAAAAAABvo/tDCBQYFZe8I/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-bYSAmgu549g/TkDrP1JJ0_I/AAAAAAAABvo/tDCBQYFZe8I/s1600/17.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Estos valores están sacados del documento de Rockwell &lt;a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/qs/1789-qs001_-en-p.pdf"&gt;SoftLogix5800 Controller Starter Kit&lt;/a&gt; (PDF).&lt;br /&gt;
&lt;br /&gt;
En la siguiente ventana podremos asignar el RPI (&lt;i&gt;Requested Packet Interval&lt;/i&gt;), que he ajustado a 50 ms. El resto de opciones las dejo tal cual.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0JBygPTYgII/TkDsWkngCzI/AAAAAAAABvw/EgmXSFispiw/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-0JBygPTYgII/TkDsWkngCzI/AAAAAAAABvw/EgmXSFispiw/s1600/18.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
La tarjeta de E/S ya está lista, ahora vamos con la tarjeta &lt;i&gt;Communications -&amp;gt; SoftLogix5800 EtherNet/IP&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-JoOPnpaQ1hw/TkEI6WXXAHI/AAAAAAAABwA/vGdbpH8kJno/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-JoOPnpaQ1hw/TkEI6WXXAHI/AAAAAAAABwA/vGdbpH8kJno/s1600/19.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Le decimos la versión de &lt;i&gt;SoftLogix&lt;/i&gt;...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-g_8gd3OzPTM/TkEIzFNF5KI/AAAAAAAABv4/yPgG4Mjgq-I/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-g_8gd3OzPTM/TkEIzFNF5KI/AAAAAAAABv4/yPgG4Mjgq-I/s1600/20.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y en las propiedades le decimos el slot que ocupa, damos un nombre y una descripción, y la dirección IP de la máquina virtual donde está instalado el controlador &lt;i&gt;SoftLogix&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-B7qrOjUxyc4/TkEJ01XMcbI/AAAAAAAABwI/-qg9xPS8YI0/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-B7qrOjUxyc4/TkEJ01XMcbI/AAAAAAAABwI/-qg9xPS8YI0/s1600/21.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El resto de propiedades las dejamos tal cual.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-EZuRhF6Da1M/TkEKEK7X-aI/AAAAAAAABwQ/QnpQJWWxAY4/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-EZuRhF6Da1M/TkEKEK7X-aI/AAAAAAAABwQ/QnpQJWWxAY4/s1600/22.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En este punto ya tenemos las tarjetas configuradas. Ahora voy a ajustar la ruta (&lt;i&gt;path&lt;/i&gt;). Me aseguro que mi &lt;i&gt;SoftLogix&lt;/i&gt; se está ejecutando correctamente en su máquina virtual y pulso sobre el botón &lt;i&gt;Who Active&lt;/i&gt; del &lt;i&gt;RSLogix 5000&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tXDvhqc2uvg/TkELUi9Gd4I/AAAAAAAABwY/OMjhyUjGxDc/s1600/23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-tXDvhqc2uvg/TkELUi9Gd4I/AAAAAAAABwY/OMjhyUjGxDc/s1600/23.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Si todo va bien aparecerá bajo el driver Ethernet el controlador &lt;i&gt;SoftLogix&lt;/i&gt;. Lo seleccionamos y pulsamos sobre &lt;i&gt;Set Project Path&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3JO7aiBnzrw/TkEL-tahBiI/AAAAAAAABwg/lyvoQ1pjIi8/s1600/24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="468" src="http://3.bp.blogspot.com/-3JO7aiBnzrw/TkEL-tahBiI/AAAAAAAABwg/lyvoQ1pjIi8/s640/24.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y vamos a modo &lt;i&gt;On-line&lt;/i&gt;. Como es la primera transferencia no hay ningún proyecto en el controlador y transferimos nuestro proyecto vacío.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bnl4awwnxWI/TkEMjmJTSJI/AAAAAAAABww/CIqb62ikFbo/s1600/25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-bnl4awwnxWI/TkEMjmJTSJI/AAAAAAAABww/CIqb62ikFbo/s1600/25.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-G7cfjHg-d1o/TkEMij1ojbI/AAAAAAAABwo/-iw3BBLYuek/s1600/26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-G7cfjHg-d1o/TkEMij1ojbI/AAAAAAAABwo/-iw3BBLYuek/s1600/26.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En el árbol de proyecto, bajo &lt;i&gt;Controller Tags&lt;/i&gt; podemos ver que se han creado automáticamente variables para acceder a la tarjeta de E/S digitales.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-F3TUHoEXDNQ/TkEPglskOAI/AAAAAAAABw4/5OhBLL6Vx-Q/s1600/34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-F3TUHoEXDNQ/TkEPglskOAI/AAAAAAAABw4/5OhBLL6Vx-Q/s1600/34.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Las entradas digitales están en &lt;i&gt;Local:2:I.Data[1]&lt;/i&gt; y las salidas digitales en &lt;i&gt;Local:2:O.Data[0]&lt;/i&gt;. Para comprobar que todo funciona correctamente voy a hacer un sencillo programa donde voy a volcar las entradas en las salidas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sQbvKjJrwpY/TkEQvdvy3FI/AAAAAAAABxA/mhZsQDrVYpY/s1600/35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-sQbvKjJrwpY/TkEQvdvy3FI/AAAAAAAABxA/mhZsQDrVYpY/s1600/35.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Voy a la máquina virtual del &lt;i&gt;SoftLogix&lt;/i&gt; y, con el controlador en modo &lt;i&gt;Run&lt;/i&gt;, en las propiedades de la tarjeta simuladora, en la pestaña &lt;i&gt;I/O Data&lt;/i&gt; activo y desactivo entradas, comprobando que se reflejan en las salidas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5YdUdTd1yw0/TkESEOwqmkI/AAAAAAAABxI/SKg7qzGPsQ0/s1600/36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-5YdUdTd1yw0/TkESEOwqmkI/AAAAAAAABxI/SKg7qzGPsQ0/s1600/36.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y listo, ya tengo mi banco de pruebas listo y configurado para trastear y hacer pruebas de programación, sin la necesidad de tener físicamente un PLC.&lt;br /&gt;
&lt;br /&gt;
Como siempre, cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-3660021265627210981?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rZRw2qvu9r3Gq4SSXR8xAs-360Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rZRw2qvu9r3Gq4SSXR8xAs-360Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rZRw2qvu9r3Gq4SSXR8xAs-360Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rZRw2qvu9r3Gq4SSXR8xAs-360Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/8FTPf5Ek8z8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/3660021265627210981/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/08/preparando-un-proyecto-para-programar.html#comment-form" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3660021265627210981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3660021265627210981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/8FTPf5Ek8z8/preparando-un-proyecto-para-programar.html" title="Preparando un proyecto para programar un SoftLogix" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-IyD4pqtdiec/TkDmE7DaF9I/AAAAAAAABvA/MvAD3I7EXIs/s72-c/path3876.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/08/preparando-un-proyecto-para-programar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYMQX06cCp7ImA9WhdRGEU.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-8216804954513604019</id><published>2011-08-07T15:49:00.008+02:00</published><updated>2011-08-09T13:09:40.318+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-09T13:09:40.318+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PLC Software" /><category scheme="http://www.blogger.com/atom/ns#" term="SoftLogix" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><title>Virtualizando SoftLogix, el PLC software de Rockwell</title><content type="html">Entre su gama de controladores &lt;a href="http://www.rockwellautomation.com/"&gt;Rockwell&lt;/a&gt; dispone de un PLC software denominado &lt;a href="http://ab.rockwellautomation.com/programmable-controllers/softlogix"&gt;SoftLogix&lt;/a&gt;, sería el equivalente al &lt;a href="http://notasdeautomatizacion.blogspot.com/2009/07/primer-contacto-con-un-plc-software.html"&gt;WinAC&lt;/a&gt; de &lt;a href="https://www.automation.siemens.com/mcms/automation/en/Pages/automation-technology.aspx"&gt;Siemens&lt;/a&gt; o al &lt;a href="http://www.beckhoff.es/english/twincat/twincat_plc.htm?id=159876035060"&gt;TwinCAT&lt;/a&gt; de &lt;a href="http://www.beckhoff.es/"&gt;Beckhoff&lt;/a&gt;. Mi interés por él viene en que ya no dispongo del CompactLogix con el que realicé las dos entradas anteriores y montar un &lt;i&gt;SoftLogix &lt;/i&gt;sobre una &lt;a href="http://es.wikipedia.org/wiki/M%C3%A1quina_virtual"&gt;máquina virtual&lt;/a&gt; me permitirá realizar pruebas de programación y seguir aprendiendo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2xPOtWSC-lk/Tj5NpoNFqgI/AAAAAAAABsU/SQ6ywj_yM9o/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-2xPOtWSC-lk/Tj5NpoNFqgI/AAAAAAAABsU/SQ6ywj_yM9o/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Voy a partir de una máquina virtual en &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; con una configuración como la que se puede ver la siguiente captura: &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5ygIRe0M2NE/Tj5OYQXSvuI/AAAAAAAABsc/F_tFAVsfJzI/s1600/30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-5ygIRe0M2NE/Tj5OYQXSvuI/AAAAAAAABsc/F_tFAVsfJzI/s1600/30.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Le he asignado 256 MB de RAM, he deshabilitado el audio, el adaptador de red lo he puesto en modo puente (&lt;i&gt;bridge&lt;/i&gt;) y, como no necesito el puerto serie, también lo he deshabilitado.&lt;br /&gt;
&lt;br /&gt;
A continuación he instalado &lt;i&gt;Windows 2000 SP4&lt;/i&gt;, el &lt;i&gt;SoftLogix Revision 16&lt;/i&gt; con su correspondiente licencia y el &lt;i&gt;&lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslinx/"&gt;RSLinx&lt;/a&gt; Classic 2.54&lt;/i&gt;. La versión del &lt;i&gt;SoftLogix &lt;/i&gt;es importante ya que debe coincidir con la versión de &lt;i&gt;&lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/"&gt;RSLogix 5000&lt;/a&gt;&lt;/i&gt; que usemos para programarlo. Al ejecutar la máquina virtual tendrá el siguiente aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-v5MocCokdeI/Tj5m9FiwP3I/AAAAAAAABsk/evldw1YRJwI/s1600/32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="521" src="http://1.bp.blogspot.com/-v5MocCokdeI/Tj5m9FiwP3I/AAAAAAAABsk/evldw1YRJwI/s640/32.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
También he configurado la dirección IP de mi máquina virtual, necesaria para comunicar el &lt;i&gt;SoftLogix &lt;/i&gt;a través de Ethernet.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Zg5eUppq9O4/Tj5nMGV-yvI/AAAAAAAABss/LxnxEmWsi08/s1600/31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Zg5eUppq9O4/Tj5nMGV-yvI/AAAAAAAABss/LxnxEmWsi08/s1600/31.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ya estoy preparado para configurar mi &lt;i&gt;SoftLogix&lt;/i&gt;. Lo que se ve en pantalla es un chasis virtual donde ir colocando tarjetas. El slot 0 está reservado al &lt;i&gt;RSLinx&lt;/i&gt;, encargado de las comunicaciones. Para empezar voy a situar en el slot 1 el controlador. Para ello selcciono el slot 1 y voy al menú &lt;i&gt;Slot -&amp;gt; Create Module...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vsTehTI3yZs/Tj5o9e3U-gI/AAAAAAAABs0/QzeqKS-Web0/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-vsTehTI3yZs/Tj5o9e3U-gI/AAAAAAAABs0/QzeqKS-Web0/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A continuación nos pedirá que seleccionemos el tipo de módulo a insertar. Podemos elegir entre el controlador &lt;i&gt;SoftLogix&lt;/i&gt;, tarjetas PCI para convertir un PC en un verdadero PLC con periferia distribuida en redes DeviceNet o Control Net, control de ejes, un simulador de 32 entradas / 32 salidas digitales y un módulo adaptador para usar un puerto Ethernet del PC.&lt;br /&gt;
&lt;br /&gt;
En el slot 1 voy a situar el controlador por lo que selecciono el módulo &lt;i&gt;1789-L60 SoftLogix5860 Controller.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ck6G9yZfsFE/Tj5sY5Tj1UI/AAAAAAAABs8/QUWAUp4FKP4/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Ck6G9yZfsFE/Tj5sY5Tj1UI/AAAAAAAABs8/QUWAUp4FKP4/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Lo siguiente será configurar sus propiedades, en la primera ventana con las opciones por defecto es suficiente.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DM7sM8xnDXw/Tj5s0L1oHRI/AAAAAAAABtE/6WVmESBIMXs/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-DM7sM8xnDXw/Tj5s0L1oHRI/AAAAAAAABtE/6WVmESBIMXs/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora aumento a 50 ms el tiempo de permanencia (&lt;i&gt;dwell time&lt;/i&gt;) de la tarea continua y le digo que no voy a utilizar el puerto serie.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--FWqLj_rSZY/Tj5uJoRaIsI/AAAAAAAABtM/D-sgBtw73IA/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--FWqLj_rSZY/Tj5uJoRaIsI/AAAAAAAABtM/D-sgBtw73IA/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El controlador ya está insertado en el chasis virtual. En el slot 2 voy a poner una tarjeta virtual de 32 entradas / 32 salidas digitales.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vMwlfwBRV58/Tj5u5UOVtGI/AAAAAAAABtU/7J1ZvKHPKJc/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-vMwlfwBRV58/Tj5u5UOVtGI/AAAAAAAABtU/7J1ZvKHPKJc/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En su configuración simplemente le daremos un nombre.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--JKdx5TJTZ0/Tj5vWD1cfAI/AAAAAAAABtc/My2u3IIf6WU/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--JKdx5TJTZ0/Tj5vWD1cfAI/AAAAAAAABtc/My2u3IIf6WU/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-86YxweeyzhI/Tj5vWY_UhxI/AAAAAAAABtk/sI6E3Fi8HlA/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-86YxweeyzhI/Tj5vWY_UhxI/AAAAAAAABtk/sI6E3Fi8HlA/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El último módulo que voy a configurar es el &lt;i&gt;EtherNet/IP SoftLogix5800&lt;/i&gt; en el slot 3. Este módulo me dará conectividad a través del puerto Ethernet virtual y me permitirá programar el &lt;i&gt;SoftLogix &lt;/i&gt;desde otro PC o máquina virtual.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-UTu_RuklDL8/Tj5yE76ZvQI/AAAAAAAABts/05Wgc9rj15E/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-UTu_RuklDL8/Tj5yE76ZvQI/AAAAAAAABts/05Wgc9rj15E/s1600/09.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En su configuración apenas deberemos darle un nombre, ya que tomará los datos de red de la configuración IP del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kp8h3kbXNzM/Tj51X77EohI/AAAAAAAABt8/Fgd1nuBDu-8/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-kp8h3kbXNzM/Tj51X77EohI/AAAAAAAABt8/Fgd1nuBDu-8/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mJN9tipYtnY/Tj51Xsv8TcI/AAAAAAAABt0/HJinHLjRbRk/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mJN9tipYtnY/Tj51Xsv8TcI/AAAAAAAABt0/HJinHLjRbRk/s1600/11.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ya he finalizado la configuración de los módulos, mi chasis virtual tiene el siguiente aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-TE3ca9aF7Z8/Tj52jX6znyI/AAAAAAAABuE/JUTcCLFQcvg/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-TE3ca9aF7Z8/Tj52jX6znyI/AAAAAAAABuE/JUTcCLFQcvg/s1600/12.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El software de programación &lt;i&gt;RSLogix 5000&lt;/i&gt; lo tengo instalado en otra máquina virtual y voy a comprobar que puedo acceder desde él a mi &lt;i&gt;SoftLogix&lt;/i&gt;. Para ello ejecuto simultáneamente a la máquina virtual del &lt;i&gt;SoftLogix &lt;/i&gt;la máquina virtual desde la que voy a programar, y ejecuto en esta última el &lt;i&gt;RSLinx&lt;/i&gt;. Con la herramienta &lt;i&gt;RSWho&lt;/i&gt; exploro la red Ethernet (previamente deberá estar instalado su &lt;i&gt;driver&lt;/i&gt; en el &lt;i&gt;RSLinx&lt;/i&gt;) y aparecerá mi &lt;i&gt;SoftLogix &lt;/i&gt;con toda la configuración en sus respectivos slots:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rC6A6nCpNRw/Tj6JfBnKEwI/AAAAAAAABuU/tcCBooW6-WA/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-rC6A6nCpNRw/Tj6JfBnKEwI/AAAAAAAABuU/tcCBooW6-WA/s1600/13.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aquí doy por finalizada la configuración de mi máquina virtual con &lt;i&gt;SoftLogix&lt;/i&gt;. En la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/08/preparando-un-proyecto-para-programar.html"&gt;siguiente entrada&lt;/a&gt; hablaré de como configurar el &lt;i&gt;RSLogix 5000&lt;/i&gt; para poder programar.&lt;br /&gt;
&lt;br /&gt;
NOTA: Para propósitos de prueba y aprendizaje, Rockwell tiene disponible el software &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogixemulate/"&gt;RSLogix Emulate&lt;/a&gt;, que seguramente sería más apropiado para mis propósitos, aunque no lo tengo disponible. En la fantástica web &lt;a href="http://www.plcdev.com/"&gt;PLCDev&lt;/a&gt; hay un &lt;a href="http://www.plcdev.com/a_quick_tutorial_on_rslogix_emulator_5000"&gt;tutorial de configuración&lt;/a&gt; (en inglés).&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-8216804954513604019?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xkrXbUbjonQgxegMoDP9dGRxdk4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xkrXbUbjonQgxegMoDP9dGRxdk4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xkrXbUbjonQgxegMoDP9dGRxdk4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xkrXbUbjonQgxegMoDP9dGRxdk4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/C88MpoeIhO0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/8216804954513604019/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html#comment-form" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/8216804954513604019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/8216804954513604019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/C88MpoeIhO0/virtualizando-softlogix-el-plc-software.html" title="Virtualizando SoftLogix, el PLC software de Rockwell" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-2xPOtWSC-lk/Tj5NpoNFqgI/AAAAAAAABsU/SQ6ywj_yM9o/s72-c/00.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/08/virtualizando-softlogix-el-plc-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDQn48fip7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-5287284237600794201</id><published>2011-06-21T11:20:00.001+02:00</published><updated>2011-08-08T17:11:13.076+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:11:13.076+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="CompactLogix" /><title>Pasos previos a programar un CompactLogix L32E</title><content type="html">Teniendo ya &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/06/comunicando-con-un-plc-compactlogix.html"&gt;comunicación con mi CompactLogix L32E&lt;/a&gt;, es hora de ejecutar el &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/"&gt;RSLogix 5000&lt;/a&gt;, que es el software de programación de Rockwell necesario para esta gama de autómatas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-XgOwbJURaPs/TgBF3q0BSbI/AAAAAAAABpY/WT2OPn3ibjM/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://2.bp.blogspot.com/-XgOwbJURaPs/TgBF3q0BSbI/AAAAAAAABpY/WT2OPn3ibjM/s400/20.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Voy a usar la versión 13 en inglés, algo antigua, pero es la que me exigen. Me consta que existe en español. Al ejecutarlo tiene el siguiente aspecto: &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-hsdhOTX1YlM/TgBGZDgUHDI/AAAAAAAABpg/Z03akgshQqs/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="http://3.bp.blogspot.com/-hsdhOTX1YlM/TgBGZDgUHDI/AAAAAAAABpg/Z03akgshQqs/s400/00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Lo primero que hay que hacer es introducir el PLC, para ello vamos a &lt;i&gt;File -&amp;gt; New...&lt;/i&gt; y aparecerá la ventana &lt;i&gt;New Controller&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2cbGAk3fUyU/TgBHYlxuNQI/AAAAAAAABpo/q5242EuQjl0/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2cbGAk3fUyU/TgBHYlxuNQI/AAAAAAAABpo/q5242EuQjl0/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Elegimos el modelo de PLC, su revisión, asignamos un nombre y descripción al proyecto y especificamos dónde queremos almacenarlo. Aquí es muy importante el número de revisión, pues debe coincidir con la versión del RSLogix 5000 que tengamos. Es posible tener varias versiones del RSLogix 5000 instaladas simultáneamente. Como mi proyecto debe ser compatible con la versión 13 pues es la que selecciono.&lt;br /&gt;
&lt;br /&gt;
Al pulsar &lt;i&gt;OK&lt;/i&gt; aparecerá el árbol de proyecto con nuestro PLC. El siguiente paso va a ser añadir las tarjetas que lo acompañan. Me explicaba un técnico de Rockwell que en las últimas versiones del RSLogix 5000, si estás conectado, detecta automáticamente los componentes. En este caso debo añadirlos yo a mano.  Para ello vamos al árbol del proyecto &lt;i&gt;I/O Configuration -&amp;gt; CompactBusLocal&lt;/i&gt; y con el botón derecho del ratón pulsamos en &lt;i&gt;New Module...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-T3YEHPHMkyk/TgBK2LDVX-I/AAAAAAAABpw/mEEAIEH6FcY/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-T3YEHPHMkyk/TgBK2LDVX-I/AAAAAAAABpw/mEEAIEH6FcY/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En este caso simplemente dispongo de una tarjeta de 16 salidas digitales, la selecciono.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4SYGH8Ht8w4/TgBLU6U9sII/AAAAAAAABp4/zGy1SzSSmEg/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-4SYGH8Ht8w4/TgBLU6U9sII/AAAAAAAABp4/zGy1SzSSmEg/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Le asigno un nombre y acepto.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Fb2JDHP2TII/TgBLkCRL5LI/AAAAAAAABqA/fpZNK9MMapA/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Fb2JDHP2TII/TgBLkCRL5LI/AAAAAAAABqA/fpZNK9MMapA/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Si nos fijamos en &lt;i&gt;Controller Tags&lt;/i&gt; se han creado automáticamente las variables para acceder a la tarjeta, tanto a las salidas propiamente dichas como a variables de estado.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-onKB4MEVX-s/TgBdOxHgYgI/AAAAAAAABrI/EE0nhbUfeLQ/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="363" src="http://2.bp.blogspot.com/-onKB4MEVX-s/TgBdOxHgYgI/AAAAAAAABrI/EE0nhbUfeLQ/s400/22.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora voy a conectarme con el PLC, así que voy al menú &lt;i&gt;Communications -&amp;gt; Who Active&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-TxKmC_38RGM/TgBMg9xbBII/AAAAAAAABqI/RtViazgIWdY/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-TxKmC_38RGM/TgBMg9xbBII/AAAAAAAABqI/RtViazgIWdY/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aparecerá la ventana &lt;i&gt;Who Active&lt;/i&gt; con la conexión que previamente configuré en el RSLinx. Busco en el árbol mi PLC y lo selecciono.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vNAnCX6a6Ek/TgBNug3DGJI/AAAAAAAABqQ/97eZDifdNEQ/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-vNAnCX6a6Ek/TgBNug3DGJI/AAAAAAAABqQ/97eZDifdNEQ/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
De fábrica, el PLC viene con un firmware versión 1. Pero su versión de firmware debe coincidir con la versión de RSLogix 5000, así que toca actualizar el firmware, pulsando el botón &lt;i&gt;Update Firmware...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Seleccionaremos la versión de firmware correcta y pulsaremos &lt;i&gt;Update&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zAMOdWlU0cg/TgBO7-3LrwI/AAAAAAAABqY/_wrdWvSi7kQ/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-zAMOdWlU0cg/TgBO7-3LrwI/AAAAAAAABqY/_wrdWvSi7kQ/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
A continuación aparecerá alguna ventana de aviso y nos mostrará al progreso de la actualización (tarda unos minutos). Advertir que, una vez iniciado el proceso, no debemos desconectar el PLC ni interrumpir la transferencia o correremos el riesgo de tener que enviar nuestro autómata al servicio técnico.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-O1DEt-uHSCc/TgBQRoisiDI/AAAAAAAABqg/VAoKD3rn7Uw/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-O1DEt-uHSCc/TgBQRoisiDI/AAAAAAAABqg/VAoKD3rn7Uw/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ymTom4E1OC8/TgBQSD4InbI/AAAAAAAABqo/ATJiSG5Q4gE/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ymTom4E1OC8/TgBQSD4InbI/AAAAAAAABqo/ATJiSG5Q4gE/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En mi caso, al finalizar el proceso de actualización tuve que volver a asignarle la dirección IP al PLC con la aplicación &lt;i&gt;BOOTP/DHCP Server&lt;/i&gt;, supongo que por no tenerla configurada como estática.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos el PLC listo para transferirle un programa. Para ello vamos de nuevo a la herramienta &lt;i&gt;Who Active&lt;/i&gt; del RSLogix 5000, nos situamos sobre el PLC y pulsamos sobre &lt;i&gt;Set Project Path&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HmqVm6n2GB8/TgBSNqdgEtI/AAAAAAAABqw/XazQWgOv0co/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="http://1.bp.blogspot.com/-HmqVm6n2GB8/TgBSNqdgEtI/AAAAAAAABqw/XazQWgOv0co/s400/12.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En la barra &lt;i&gt;Path&lt;/i&gt; ya aparece la ruta al PLC para poder transferir el proyecto.&lt;br /&gt;
&lt;br /&gt;
Ya podemos ir a modo &lt;i&gt;Online&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zLgUzhoIWlI/TgBZSf8QjKI/AAAAAAAABq4/V85nHq9VlYs/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-zLgUzhoIWlI/TgBZSf8QjKI/AAAAAAAABq4/V85nHq9VlYs/s1600/21.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
La primera vez nos dirá que no hay ningún programa en el PLC, pulsaremos a &lt;i&gt;Download&lt;/i&gt; y ya tendremos control sobre el PLC.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9-vObZYKkP8/TgBaEOdD4lI/AAAAAAAABrA/i_-ZA_5zjK0/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-9-vObZYKkP8/TgBaEOdD4lI/AAAAAAAABrA/i_-ZA_5zjK0/s1600/13.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En este punto tenemos ya un programa vacío cargado en el PLC, listo para empezar a trastear.&lt;br /&gt;
&lt;br /&gt;
Para rematar esta entrada una nota sobre la llave en el frontal del PLC, que sirve para cambiar entre los modos RUN, REMOTE y PROGRAMACIÓN. En el modo RUN el programa se ajecutará sin posibilidad de modificación exterior, aunque podremos observarlo. En modo PROGRAMACIÓN no se ejecuta el programa y podemos acceder libremente al programa. En el modo REMOTE tenemos acceso al programa y podemos ajecutarlo o no a voluntad. Si pasamos la llave de RUN a REMOTE el programa seguirá ejecutándose, cosa que no sucede al pasar de PROGRAMACIÓN a REMOTE.&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-5287284237600794201?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n919MpHkhbM_KsZ_2WHpimVSyFw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n919MpHkhbM_KsZ_2WHpimVSyFw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n919MpHkhbM_KsZ_2WHpimVSyFw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n919MpHkhbM_KsZ_2WHpimVSyFw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/9MEXvX84u9o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/5287284237600794201/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/06/pasos-previos-programar-un-compactlogix.html#comment-form" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/5287284237600794201?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/5287284237600794201?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/9MEXvX84u9o/pasos-previos-programar-un-compactlogix.html" title="Pasos previos a programar un CompactLogix L32E" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-XgOwbJURaPs/TgBF3q0BSbI/AAAAAAAABpY/WT2OPn3ibjM/s72-c/20.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/06/pasos-previos-programar-un-compactlogix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEGQ3c8eyp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-8259787051591549954</id><published>2011-06-07T15:59:00.007+02:00</published><updated>2011-08-08T17:33:42.973+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:33:42.973+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Comunicación" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="CompactLogix" /><title>Comunicando con un PLC CompactLogix L32E</title><content type="html">Recientemente he estado unas horas con un técnico de &lt;a href="http://www.rockwellautomation.com/"&gt;Rockwell&lt;/a&gt; en las que he recibido unas pinceladas de cómo empezar a enfrentarme a la familia de PLC &lt;a href="http://ab.rockwellautomation.com/Programmable-Controllers/CompactLogix"&gt;CompactLogix&lt;/a&gt;. Voy a ir redactando una serie de entradas con mis avances y, aunque todo lo que escriba lo habré probado previamente, es posible que cometa errores e imprecisiones. Si ves algo que está mal o conoces alguna forma más simple o más correcta de hacer algo de lo que aquí describo, te agradeceré un comentario.&lt;br /&gt;
&lt;br /&gt;
El PLC en concreto con el que voy a hacer pruebas es un &lt;b&gt;CompactLogix L32E&lt;/b&gt;, acompañado de una fuente de alimentación y una tarjeta de 16 salidas digitales, más la correspondiente tapa de final de bus. El PLC conectado y funcionando sobre mi mesa tiene el siguiente aspecto: &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-30AqbgwjTqA/Te4pDvmu6GI/AAAAAAAABno/MQ-PyvJ-_T4/s1600/PLC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-30AqbgwjTqA/Te4pDvmu6GI/AAAAAAAABno/MQ-PyvJ-_T4/s1600/PLC.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Como características más destacadas decir que tiene 750 kb de memoria de usuario, una ranura para Compact Flash, un puerto de comunicaciones serie y un puerto ethernet. Puede expandirse con un máximo de 16 módulos. Tienes las características detalladas en la &lt;a href="http://literature.rockwellautomation.com/idc/groups/literature/documents/sg/1769-sg001_-es-p.pdf"&gt;página de Rockwell&lt;/a&gt; (PDF).&lt;br /&gt;
&lt;br /&gt;
Como el cliente para el que está destinado el PLC tiene estandarizadas versiones de software antiguas, voy a utilizar una máquina virtual con Windows 2000 donde voy a instalar todos los programas: &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/"&gt;RSLogix 5000&lt;/a&gt; (programación de PLC), &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/performance/view32/"&gt;RS View ME&lt;/a&gt; (programaciónd de HMI), &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rsnetworx/"&gt;RSNetWorx&lt;/a&gt; (configuración de redes) y &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslinx/"&gt;RSLinx&lt;/a&gt; (gestión de comunicaciones). El técnico de Rockwell tenía todo esto montado sobre &lt;a href="http://www.vmware.com/es/"&gt;VMWare&lt;/a&gt;. Aprovechando que tengo varias máquinas con &lt;a href="http://www.virtualbox.org/"&gt;Virtual Box&lt;/a&gt;, he preparado una máquina virtual con esta última, funcionando también correctamente. Para tener comunicación a través del puerto ethernet simplemente hay que tener la precaución de poner el puerto ethernet virtual en modo puente (&lt;i&gt;bridge&lt;/i&gt;) y asignar en el Windows 2000 una dirección IP y máscara coherentes con nuestra red (la primera vez tuve que reiniciar tanto mi máquina virtual como mi ordenador para que funcionase). &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
El PLC CompactLogix L32E viene de fábrica con IP dinámica. Para poder realizar una comunicación con el &lt;i&gt;RSLogix 5000&lt;/i&gt; tiene que tener asignada una IP fija. Para asignarle esta IP fija podemos conectarnos a través del puerto serie o, como haré yo, através del puerto ethernet. Para esta última opción Rockwell suministra la aplicación &lt;i&gt;BOOTP/DHCP Server&lt;/i&gt;, que busca en la red dispositivos para poder direccionarlos. En menos de un minuto, si el PLC está conectado correctamente a nuestra red, el &lt;i&gt;BOOTP/DHCP Server&lt;/i&gt; delatará su presencia mostrándo su dirección MAC.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yfK26AXvqAk/Te4pLpumgKI/AAAAAAAABnw/e3EYKf1-GV8/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-yfK26AXvqAk/Te4pLpumgKI/AAAAAAAABnw/e3EYKf1-GV8/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Si hacemos doble clic sobre el dispositivo detectado podremos asignarle una dirección IP (que tiene que ser coherente con la configuración de nuestra red).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UXWjO5fmo4k/Te4pPlygc_I/AAAAAAAABn4/XFVED_9GMF8/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-UXWjO5fmo4k/Te4pPlygc_I/AAAAAAAABn4/XFVED_9GMF8/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Al cabo de unos segundos deberá ya aparecer nuestro PLC con la dirección IP asignada.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6xg356pjaqQ/Te4pVyfZfnI/AAAAAAAABoA/H-yq5C0cE5s/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-6xg356pjaqQ/Te4pVyfZfnI/AAAAAAAABoA/H-yq5C0cE5s/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En mi caso me conecto al PLC a través de un &lt;a href="http://es.wikipedia.org/wiki/Conmutador_%28dispositivo_de_red%29"&gt;switch&lt;/a&gt;, pero me podría conectar directamente con un cable &lt;a href="http://es.wikipedia.org/wiki/RJ-45#Conexi.C3.B3n_directa_PC_a_PC_a_100_Mbps"&gt;ethernet cruzado&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Cerramos el &lt;i&gt;BOOTP/DHCP Server&lt;/i&gt; pues ya no lo necesitaremos más. Ahora vamos a abrir el &lt;i&gt;RSLinx&lt;/i&gt;. Lo primero que deberemos hacer es configurar los controladores (drivers) para comunicarnos con el PLC. Para ello vamos &lt;i&gt;Communications -&amp;gt; Configure drivers...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7h3mUHyc-9Q/Te4paL8elsI/AAAAAAAABoI/kPTkdsGmvuc/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-7h3mUHyc-9Q/Te4paL8elsI/AAAAAAAABoI/kPTkdsGmvuc/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En el menú desplegable seleccionamos &lt;i&gt;EtherNet/IP Driver&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xIYG6yoHywc/Te4pd_yo7gI/AAAAAAAABoQ/2GQ5TVFd3fk/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-xIYG6yoHywc/Te4pd_yo7gI/AAAAAAAABoQ/2GQ5TVFd3fk/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Al pulsar sobre &lt;i&gt;Add New...&lt;/i&gt; nos pedirá un nombre para el controlador.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3KEU5EUL4L4/Te4ph5VFFkI/AAAAAAAABoY/mlU81jwoIpE/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-3KEU5EUL4L4/Te4ph5VFFkI/AAAAAAAABoY/mlU81jwoIpE/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Al aceptar nos preguntará por qué adaptador de red se hará la comunicación, en mi caso dejo seleccionado &lt;i&gt;Windows Default&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-lkEKKHQ1kyg/Te4poDHAhzI/AAAAAAAABog/gQm_kC2RaLQ/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-lkEKKHQ1kyg/Te4poDHAhzI/AAAAAAAABog/gQm_kC2RaLQ/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Aceptando nuevamente deberemos tener nuestro controlador funcionando (&lt;i&gt;Running&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OxQ64HRJoWM/Te4psOOvFZI/AAAAAAAABoo/5leRI5jcFng/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-OxQ64HRJoWM/Te4psOOvFZI/AAAAAAAABoo/5leRI5jcFng/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Cerramos la ventana de configuración de controladores y vamos a ver si tenemos comunicación con el PLC. Para ello vamos al menú &lt;i&gt;Communications -&amp;gt; RSWho&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-y4D0X7Bu1vs/Te4pwukYL3I/AAAAAAAABow/HTfx9Ad_KW0/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-y4D0X7Bu1vs/Te4pwukYL3I/AAAAAAAABow/HTfx9Ad_KW0/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y vemos que figura el controlador &lt;i&gt;AB_ETHIP-1&lt;/i&gt; que acabamos de configurar.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pd9LhnF6Lo4/Te4p05fRlHI/AAAAAAAABo4/datT4FiyHI8/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-pd9LhnF6Lo4/Te4p05fRlHI/AAAAAAAABo4/datT4FiyHI8/s1600/09.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Pulsamos sobre el controlador y veremos como empieza a parpadear su icono, señal de que está buscando dispositivos. En breve deberá aparecer nuestro PLC y todos los puertos y tarjetas que tengamos conectados.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bFlop0lmVTU/Te4p4msg0RI/AAAAAAAABpA/m-iqqFLr0u0/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-bFlop0lmVTU/Te4p4msg0RI/AAAAAAAABpA/m-iqqFLr0u0/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora pulsamos el botón derecho del ratón sobre el puerto ethernet del PLC y vamos a &lt;i&gt;Module Configuration&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BkvL5JVUBf4/Te8eyPi0hNI/AAAAAAAABpI/7PequtneD2w/s1600/100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-BkvL5JVUBf4/Te8eyPi0hNI/AAAAAAAABpI/7PequtneD2w/s1600/100.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y en la pestaña &lt;i&gt;Port Configuration&lt;/i&gt; nos aseguramos que esté marcada la opción &lt;i&gt;Static&lt;/i&gt;, para que no pierda la dirección IP cuando apaguemos el PLC, y además podremos modificar la IP y la máscara de red.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-g54jE0_Ci3I/Te8fONMYYtI/AAAAAAAABpQ/Ly25KV6U2Ig/s1600/101.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-g54jE0_Ci3I/Te8fONMYYtI/AAAAAAAABpQ/Ly25KV6U2Ig/s1600/101.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y listo, ya tenemos nuestro PLC configurado y comunicando para empezar a trastear con él.&lt;br /&gt;
&lt;br /&gt;
Hasta aquí esta primera toma de contacto. Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-8259787051591549954?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hiMakNG-KuN8rx2jIUayOzNseHc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hiMakNG-KuN8rx2jIUayOzNseHc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hiMakNG-KuN8rx2jIUayOzNseHc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hiMakNG-KuN8rx2jIUayOzNseHc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/nD3KH8DEb6U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/8259787051591549954/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/06/comunicando-con-un-plc-compactlogix.html#comment-form" title="8 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/8259787051591549954?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/8259787051591549954?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/nD3KH8DEb6U/comunicando-con-un-plc-compactlogix.html" title="Comunicando con un PLC CompactLogix L32E" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-30AqbgwjTqA/Te4pDvmu6GI/AAAAAAAABno/MQ-PyvJ-_T4/s72-c/PLC.jpg" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/06/comunicando-con-un-plc-compactlogix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAERns5fyp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-7062291725949912584</id><published>2011-05-18T12:24:00.003+02:00</published><updated>2011-08-08T17:35:07.527+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:35:07.527+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Pro-face" /><category scheme="http://www.blogger.com/atom/ns#" term="HMI" /><title>Probando un panel táctil Pro-face GP4107G1D</title><content type="html">Recientemente, para una pequeña máquina, hemos estado buscando un panel táctil de reducidas dimensiones, económico, sencillo de programar, que tuviese soporte técnico cercano y que fuese fiable, y, por lo que he podido probar hasta ahora, el &lt;a href="http://proface.es/products/index.php?id=GP4107G1D&amp;amp;id1=hmi"&gt;Pro-face GP4107G1D&lt;/a&gt; cumple nuestras espectativas.&lt;br /&gt;
&lt;br /&gt;
Nuestra máquina va a ser controlada por un &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7312-1AE13-0AB0&amp;amp;caller=view"&gt;PLC S7 312&lt;/a&gt; de Siemens, por lo que la comunicación con el HMI deberá realizarse por &lt;a href="http://en.wikipedia.org/wiki/Multi_Point_Interface"&gt;MPI&lt;/a&gt;. En mis pruebas el funcionamiento de la comunicación ha sido impecable, funcionando todo a la primera.&lt;br /&gt;
&lt;br /&gt;
A pesar de que este panel resulta muy económico, ofrece caracerísticas solo presentes en paneles de gama más alta. Quizá la que más me ha llamado la atención es la posibilidad de programar scrips, lo que le otorga gran versatilidad.&lt;br /&gt;
&lt;br /&gt;
Como características más destacadas dispone de una pantalla de 3,4" y 16 niveles de gris, con iluminación programable en color verde, naranja o rojo. El aspecto que tiene mi unidad es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Neob6VxHdB8/TcvpPhZRFeI/AAAAAAAABlY/N6shklGTHE0/s1600/Panel1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://1.bp.blogspot.com/-Neob6VxHdB8/TcvpPhZRFeI/AAAAAAAABlY/N6shklGTHE0/s400/Panel1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Vista por detrás dispone de dos puertos USB: &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nv8zjRQzkR0/TcvqAki7TvI/AAAAAAAABlg/G59g2KTX3vA/s1600/Panel2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://3.bp.blogspot.com/-nv8zjRQzkR0/TcvqAki7TvI/AAAAAAAABlg/G59g2KTX3vA/s400/Panel2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El puerto más pequeño se usa para programarlo con un cable USB standard (en la imagen se ve el cable de mi cámara de fotos). En el otro puerto se puede conectar una memoria USB standard. En el lateral está el cable de alimentación a 24VDC y el conector MPI de comunicación.&lt;br /&gt;
&lt;br /&gt;
Para programarlo se usa el software &lt;a href="http://proface.es/products/software/gp-proex/"&gt;GP-Pro EX&lt;/a&gt;, que es con el que se programan los paneles Pro-face, aunque para esta gama básica no es necesario comprar licencia alguna. Mi distribuidor me facilitó la versión demo, que es plenamente funcional para esta gama de paneles. En la página de &lt;a href="http://proface.es/"&gt;Pro-face&lt;/a&gt;, previo registro, es posible descargárselo. &lt;br /&gt;
&lt;br /&gt;
NOTA: Aunque la versión que tengo del GP-Pro EX está en inglés, me consta que existe en español.&lt;br /&gt;
&lt;br /&gt;
El programa tiene este aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zfIQeMZTifs/Tcvt0jcsQOI/AAAAAAAABlw/x-sANb1Ku1o/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-zfIQeMZTifs/Tcvt0jcsQOI/AAAAAAAABlw/x-sANb1Ku1o/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En la imagen ya tengo seleccionado mi panel. Configurar la comunicación con el PLC es muy sencillo. En &lt;i&gt;System Settings -&amp;gt; Peripheral List -&amp;gt; Device/PLC&lt;/i&gt; tengo todos los parámetros necesarios. En mi caso, tal y como venía la configuración por defecto fue suficiente (ya que es coincidente con la configuración que trae por defecto el PLC):&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pOCTsek3YNg/TcvuwCZqdsI/AAAAAAAABl4/w5AfrZm_y88/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://4.bp.blogspot.com/-pOCTsek3YNg/TcvuwCZqdsI/AAAAAAAABl4/w5AfrZm_y88/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En el proyecto de Step7 no hay que configurar nada, no hay que especificarle que tiene comunicación con un panel, es suficiente con hacer la configuración en el GX-Pro EX.&lt;br /&gt;
&lt;br /&gt;
No usar un panel de Siemens tiene la desventaja de que la programación no está integrada con el proyecto de Step7. Sin embargo, para paliar esta situación tenemos una herramienta para importar los símbolos del proyecto de Step7. Con el menú &lt;i&gt;Common Settings -&amp;gt; Symbol Variable&lt;/i&gt; accedemos a la edición de los simbólicos de variables y pulsamos sobre &lt;i&gt;Utility -&amp;gt; Import -&amp;gt; Step7 Project File&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jQfP1DMGAx8/TcvxZUM4MTI/AAAAAAAABmI/9N2RtesmX3Y/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="56" src="http://3.bp.blogspot.com/-jQfP1DMGAx8/TcvxZUM4MTI/AAAAAAAABmI/9N2RtesmX3Y/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora se abrirá la herramiento para importar simbólicos desde un proyecto de Step7; debemos buscar nuestro proyecto, y seleccionar los símbolos que queramos incluir:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-oSU0tuDbphM/Tcvx70NOGDI/AAAAAAAABmQ/xSgIO7JFPIY/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-oSU0tuDbphM/Tcvx70NOGDI/AAAAAAAABmQ/xSgIO7JFPIY/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ya tenemos nuestras variables definidas en el GP-Pro EX, listas para trabajar. Si más adelante modificamos el simbólico en el proyecto de Step7, deberemos volver a importarlas.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PZESKYnsAao/TcvymzlubRI/AAAAAAAABmY/pnXwznh5G3s/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://3.bp.blogspot.com/-PZESKYnsAao/TcvymzlubRI/AAAAAAAABmY/pnXwznh5G3s/s400/05.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ya estamos listos para pasar a la fase de diseño, para ello pulsamos sobre el botón &lt;i&gt;Edit&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sVdSjlRrYZA/Tcvtde9-ZqI/AAAAAAAABlo/O1DS55siH9w/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="277" src="http://1.bp.blogspot.com/-sVdSjlRrYZA/Tcvtde9-ZqI/AAAAAAAABlo/O1DS55siH9w/s400/00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Dentro de las limitaciones técnicas del panel, puedo decir que, a pesar de ser la primera vez que toco este software, la programación me ha resultado muy sencilla. Viene con gran cantidad de controles, dibujos y formas, algunos, en mi opinión, demasiado ambiciosos. Puedes importar tus propias imágenes (eso sí, se verán en 16 tonos de gris y una resolución máxima de 200x80 puntos). Por ejempo, un botón para camiar de pantalla se configuraría así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Nti8DW0o5XU/Tcv0z_QqtwI/AAAAAAAABmg/jqgveLNidRo/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="280" src="http://3.bp.blogspot.com/-Nti8DW0o5XU/Tcv0z_QqtwI/AAAAAAAABmg/jqgveLNidRo/s400/06.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Si tienes alguna experiencia previa en la programación de paneles de operador, este te parecerá pan comido.&lt;br /&gt;
&lt;br /&gt;
Además, se puede probar el panel en el completo simulador que trae:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BKCkagotCD4/Tcv1vjZlRUI/AAAAAAAABmo/IcE2S7p7VcE/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-BKCkagotCD4/Tcv1vjZlRUI/AAAAAAAABmo/IcE2S7p7VcE/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Transferir el programa del panel también es muy sencillo, pulsando el botón &lt;i&gt;Transfer Project&lt;/i&gt; aparecerá el &lt;i&gt;Transfer Tool&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qbAfCIt4nDU/Tcv2a27XoQI/AAAAAAAABmw/cqC7VeX3OXs/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-qbAfCIt4nDU/Tcv2a27XoQI/AAAAAAAABmw/cqC7VeX3OXs/s320/08.png" width="311" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Si tienes el panel conectado por USB con el ordenador, transferir es inmediato. Pulsando &lt;i&gt;Send Project&lt;/i&gt; se hará la transmisión en un instante.&lt;br /&gt;
&lt;br /&gt;
Una de las cosas que quería hacer era cambiar a voluntad el color de retroiluminación del panel desde el PLC. Parar ello, según la ayuda, hay que escribir un 2 en la variable interna &lt;i&gt;H_BackLightColor&lt;/i&gt; para cambiar a color rojo (otros valores son: un 1 representa el fondo verde, el 3 el naranja y el 0 el color que le hayamos asignado por defecto). Pero no podemos escribir directamente desde el PLC en variables internas del panel, la solución pasa por hacer un script. Para ello vamos al menú &lt;i&gt;Common Settings -&amp;gt; Global D-Script&lt;/i&gt; y se abrirá la lista de scripts. Pulsamos sobre &lt;i&gt;Create&lt;/i&gt; y se abrirá la ventana de programación de scripts. Lo que voy a hacer es, en función de la variable booleana PANEL_FONDO_ROJO que activaré/desactivaré desde el PLC, lanzar un script que en función del estado de esta variable escriba el valor correspondiente en &lt;i&gt;H_BackLightColor&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-X6ZejQbSFx4/TdOWKR0aFiI/AAAAAAAABm4/4m-ACsZATOQ/s1600/SCRIPT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-X6ZejQbSFx4/TdOWKR0aFiI/AAAAAAAABm4/4m-ACsZATOQ/s400/SCRIPT.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Todo lo que hay que hacer es especificar como condición de disparo (&lt;i&gt;trigger&lt;/i&gt;) un cambio en la variable del PLC. En el código con un simple condicional, si la variable está a uno escribimos un 2; en caso contrario un 0. &lt;br /&gt;
&lt;br /&gt;
Para introducir variables en el script lo más cómodo es usar la herramienta &lt;i&gt;Input address&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-EiVMjP4w3xU/TdOXUvht4RI/AAAAAAAABnA/pFGPYlVpo2Y/s1600/SCRIPT2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-EiVMjP4w3xU/TdOXUvht4RI/AAAAAAAABnA/pFGPYlVpo2Y/s1600/SCRIPT2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Este es un ejemplo muy sencillo, pero el uso de scrips tiene muchas aplicaciones, por ejemplo, según me explicó el comercial, se puede programar cualquier protocolo de comunicación serie que queramos, con lo que esta gama de paneles son virtualmente conectables a cualquier aparato que disponga de puerto serie.&lt;br /&gt;
&lt;br /&gt;
Otra cosa que debemos tener en cuenta es que por defecto hay varias direcciones de memoria que apuntan al DB1 y que debemos cambiar para evitar sobreescritura de datos, si lo usamos en nuestro PLC. La primera es el área de sistema:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-JgWmTPcD2O4/TdOZLlAa1FI/AAAAAAAABnI/ZBZ9DB4x6lI/s1600/50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-JgWmTPcD2O4/TdOZLlAa1FI/AAAAAAAABnI/ZBZ9DB4x6lI/s1600/50.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
El área de sistema es interesante ya que nos permite, por ejemplo, saber el número de pantalla en la que estamos o cambiar desde el PLC a la pantalla que nos interese. Yo la he volcado al DB40, incluido el &lt;i&gt;Watchdog&lt;/i&gt;, aunque este no se use.&lt;br /&gt;
&lt;br /&gt;
El otro sitio donde se sobreescribía el DB1 era en &lt;i&gt;Common Settings -&amp;gt; Text Table&lt;/i&gt;. Pulsamos sobre &lt;i&gt;Change Language&lt;/i&gt; y, en mi caso, desactivé &lt;i&gt;Enable Language Change Feature&lt;/i&gt;, ya que mi panel va estar en español solamente.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ujzzcdz-4X4/TdOc1yQshSI/AAAAAAAABnQ/mslbmW4YwRc/s1600/tt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ujzzcdz-4X4/TdOc1yQshSI/AAAAAAAABnQ/mslbmW4YwRc/s1600/tt.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y hasta aquí estas notas sobre el panel Pro-Face GP4107G1D. Como conclusión decir que me ha gustado bastante. Es muy económico y muy fácil de programar. Si has programado algún panel con anterioridad, te harás con él enseguida. Como puntos a favor destacar que no hay que pagar ninguna licencia por el software de programación, el cable de programación es un USB standard y las comunicaciones han resultado impecables. Como pegas, con el precio que tiene, no le voy a poner ninguna. Ahora me falta comprobar que tal resiste el trato diario en planta.&lt;br /&gt;
&lt;br /&gt;
Como siempre, cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-7062291725949912584?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d5MUKnBLW74vari0hhbgGndbkI4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d5MUKnBLW74vari0hhbgGndbkI4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d5MUKnBLW74vari0hhbgGndbkI4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d5MUKnBLW74vari0hhbgGndbkI4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/wpesAfa33sg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/7062291725949912584/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/05/probando-un-panel-tactil-pro-face.html#comment-form" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/7062291725949912584?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/7062291725949912584?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/wpesAfa33sg/probando-un-panel-tactil-pro-face.html" title="Probando un panel táctil Pro-face GP4107G1D" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Neob6VxHdB8/TcvpPhZRFeI/AAAAAAAABlY/N6shklGTHE0/s72-c/Panel1.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/05/probando-un-panel-tactil-pro-face.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUADQnczfCp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-6627872449048041477</id><published>2011-03-29T21:58:00.001+02:00</published><updated>2011-08-08T17:36:13.984+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:36:13.984+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="Rockwell" /><category scheme="http://www.blogger.com/atom/ns#" term="Logix" /><title>Empezando con Rockwell: un vistazo desde Step7</title><content type="html">En vista de que pronto tendré que enfrentarme a un PLC &lt;a href="http://www.rockwellautomation.com/"&gt;Rockwell&lt;/a&gt; he estado poniéndome al día. Hace tiempo que no programo uno, el último fue un &lt;a href="http://www.ab.com/en/epub/catalogs/12762/2181376/2416247/1239758/2170841/"&gt;SLC 500&lt;/a&gt; hace ya unos añitos. Ahora me toca uno de la serie &lt;a href="http://ab.rockwellautomation.com/Programmable-Controllers/CompactLogix"&gt;CompactLogix&lt;/a&gt;, más avanzado.  Aún no dispongo del software de programación &lt;a href="http://www.rockwellautomation.com/rockwellsoftware/design/rslogix5000/"&gt;RSLogix5000&lt;/a&gt; para trastear con él, pero en la web de Rockwell hay abundante &lt;a href="http://literature.rockwellautomation.com/"&gt;literatura&lt;/a&gt; para ir echando un vistazo.&lt;br /&gt;
&lt;br /&gt;
Para alguien que, como yo, se siente cómodo programando en Step7, Rockwell tiene el documento perfecto: &lt;a href="http://samplecode.rockwellautomation.com/idc/groups/literature/documents/ap/logix-ap008_-es-p.pdf"&gt;“Guía para conversión de aplicaciones Simatic S7 a Logix5000”&lt;/a&gt; cuya lectura recomiendo (está en español). Esta entrada es un pequeño resumen de este documento con las características que más me han llamado la atención. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Una de las cosas que más me ha gustado es que trae tablas de equivalencia entre material de Rockwell y Siemens, aquí un extracto para los PLC S7-300:&lt;br /&gt;
&lt;br /&gt;
&lt;table id="internal-source-marker_0.8276616100938985"&gt;&lt;tbody&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;Siemens S7-300&lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;Rockwell&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;313C &lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L23 Serial&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;314C-DP&lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L23 EtherNet/IP, L31&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: yellow; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;315-2 DP&lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L32E, &lt;/span&gt;&lt;span style="background-color: yellow; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L32C&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: yellow; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;317-2 DP&lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L35CR, &lt;/span&gt;&lt;span style="background-color: yellow; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L35E&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;317T-2 DP&lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L43, L45&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="height: 0px;"&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;319-3 PN/DP&lt;/span&gt;&lt;/td&gt;&lt;td style="border: 1px dotted #aaa; padding: 7px 7px 7px 7px; vertical-align: top;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;L45, L61&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;(en amarillo están marcados los que me interesan).&lt;br /&gt;
&lt;br /&gt;
En el documento hay más tablas con más PLC y tarjetas.&lt;br /&gt;
&lt;br /&gt;
Hablando ya de las características de la programación, en el RSLogix5000 se &lt;b&gt;estructura&lt;/b&gt; el programa en tareas (Task), que equivalen a los bloques de organización (OB) de Siemens:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tarea continua de organización → OB de ciclo del programa&lt;/li&gt;
&lt;li&gt;Tarea periódica → OB de interrupción cíclica&lt;/li&gt;
&lt;li&gt;Tarea de evento → OB de interrupción hardware&lt;/li&gt;
&lt;/ul&gt;Las tareas las ejecuta el sistema operativo (al igual que los OB en Step7). Una tarea puede contener uno o más programas. Cada programa contiene una sección de datos y una o más rutinas de código. A cada tarea se le puede asignar una prioridad. La tarea continua, si está presente, siempre tiene la prioridad más baja.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="fullpost"&gt;&lt;a href="http://3.bp.blogspot.com/-p7-R8uLGUhw/TZH7NTliD-I/AAAAAAAABkw/PVMDxmZ4pMs/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-p7-R8uLGUhw/TZH7NTliD-I/AAAAAAAABkw/PVMDxmZ4pMs/s1600/00.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;Un controlador Logix acepta una única tarea continua, pero no es obligatorio incluirla: se puede ejecutar todo el programa con tareas periódicas y/o tareas de evento.&lt;br /&gt;
&lt;br /&gt;
La diferencia entre los conceptos programa y rutina de Logix no tiene un equivalente en Step7.&lt;br /&gt;
&lt;br /&gt;
Si queremos encontrar en Siemens una estructuración de programa similar tenemos que irnos al Simotion Scout, cuyo &lt;i&gt;Execution system&lt;/i&gt; es muy similar al &lt;i&gt;Controller Organizer&lt;/i&gt; de Logix.&lt;br /&gt;
&lt;br /&gt;
Otra diferencia fundamental es el modo de organizar la &lt;b&gt;memoria&lt;/b&gt;. Los datos en Step7 tienen direcciones absolutas en áreas seleccionables de memoria. En Logix los datos se organizan en bases de datos de &lt;i&gt;tags&lt;/i&gt;: no existe direccionamiento absoluto.&lt;br /&gt;
&lt;br /&gt;
En Logix se pueden definir variables (&lt;i&gt;tags&lt;/i&gt;) globales en la base de datos bajo el control del controlador y puede accederse a ellas mediante rutinas en cualquier parte del programa. Sin embargo, si definimos los &lt;i&gt;tags&lt;/i&gt; bajo el control del programa solo pueden utilizar en rutinas en dicho programa.&lt;br /&gt;
&lt;br /&gt;
En Logix, a una variable se le pueden asignar diferentes nombres mediante &lt;i&gt;alias&lt;/i&gt;. Uno de los usos más evidentes es asignar nombres descriptivos a los tags que por defecto se asignan a las entradas y salidas.&lt;br /&gt;
&lt;br /&gt;
En Logix existen cuatro &lt;b&gt;lenguajes&lt;/b&gt; de programación:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Diagrama de lógica de escalera (LD) – comparable con el KOP (diagrama de contactos) de Step7&lt;/li&gt;
&lt;li&gt;Texto estructurado (ST) – Equivalente al SCL de Step7&lt;/li&gt;
&lt;li&gt;Diagrama de bloques de funciones (FBD) – Equivalente al CFC de Step7&lt;/li&gt;
&lt;li&gt;Diagrama de función secuencial (SFC) – Comparable al hiGraph de Step7&lt;/li&gt;
&lt;/ul&gt;No hay un lenguaje equivalente al AWL (STL) de Step7.&lt;br /&gt;
&lt;br /&gt;
Una rutina en lenguaje LD se divide en &lt;i&gt;rungs&lt;/i&gt; (peldaños), equivalente a los segmentos de Step7. Algunos programadores los llaman &lt;i&gt;renglones&lt;/i&gt;, imagino por traducir mal &lt;i&gt;rungs&lt;/i&gt;. &lt;br /&gt;
&lt;br /&gt;
Si es necesario ejecutar &lt;b&gt;funciones&lt;/b&gt; con paso de parámetros (lo que serían los FB en Step7), en Logix existen las instrucciones &lt;i&gt;Add-on&lt;/i&gt; con área de datos privados.&lt;br /&gt;
&lt;br /&gt;
Comparación entre las instrucciones &lt;i&gt;Add-On&lt;/i&gt; y los FB:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Ambas se pueden llamar como funciones desde cualquier lugar del programa.&lt;/li&gt;
&lt;li&gt;Ambas contienen un área de datos propios de datos estáticos (este área en el &lt;i&gt;Add-on&lt;/i&gt; es totalmente privado).&lt;/li&gt;
&lt;li&gt;En una instrucción &lt;i&gt;Add-on&lt;/i&gt; no existe área de datos temporales.&lt;/li&gt;
&lt;li&gt;Ambas tienen tres tipos de parámetros: entrada (paso por valor), salida (paso por valor) y entrada-salida (paso por referencia). El parámetro de paso por referencia es una gran ventaja puesto que permite que se pasen eficientemente grandes estructuras de datos.&lt;/li&gt;
&lt;/ul&gt;Con la instrucción &lt;i&gt;Add-On&lt;/i&gt; se puede configurar una rutina previa al scan para que se ejecute cuando el controlador cambia del modo de programación al modo run, o se activa en el modo run. Bajo estas condiciones, la rutina previa al &lt;i&gt;scan&lt;/i&gt; se ejecutará una vez y normalmente se  usa para inicializar los datos. Es algo similar a lo que hace el OB100 en Step7.&lt;br /&gt;
&lt;br /&gt;
En Step7, al iniciar el ciclo de &lt;i&gt;scan&lt;/i&gt; se lee la imagen de proceso de entradas, se ejecuta el programa y se vuelcan las salidas, de forma que durante un mismo ciclo de &lt;i&gt;scan&lt;/i&gt; sus valores permancen constantes. Sin embargo en los sistemas Logix, las entradas y salidas se actualizan &lt;b&gt;asíncronamente&lt;/b&gt;, con lo cual, si se necesita que las entradas/salidas se mantengan sin variación durante la ejecución del programa, deberá ser tenido en cuenta por el programador.&lt;br /&gt;
&lt;br /&gt;
Internamente todos los tipos de datos enteros se tratan en 32 bits. Si usamos uno de 8 o 16 será convertido a 32, con lo que &lt;b&gt;siempre es más eficiente usar DINT&lt;/b&gt; que INT o SINT (estos tipos de datos se proporcionan por compatibilidad con la norma IEC61131-3).&lt;br /&gt;
&lt;br /&gt;
En Logix &lt;b&gt;no hay punteros&lt;/b&gt;. Las matrices realizan la misma función que los punteros, pero son más simples y seguras.&lt;br /&gt;
&lt;br /&gt;
Hasta aquí este resumen, seguramente me dejo conceptos importantes, pero ya los iré completando por el camino.&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario, como siempre, será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-6627872449048041477?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4Q3BTUP6tYMOcODzFWBg_hRv7Ms/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4Q3BTUP6tYMOcODzFWBg_hRv7Ms/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4Q3BTUP6tYMOcODzFWBg_hRv7Ms/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4Q3BTUP6tYMOcODzFWBg_hRv7Ms/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/fZvqafIRTIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/6627872449048041477/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/03/empezando-con-rockwell-un-vistazo-desde.html#comment-form" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/6627872449048041477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/6627872449048041477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/fZvqafIRTIA/empezando-con-rockwell-un-vistazo-desde.html" title="Empezando con Rockwell: un vistazo desde Step7" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-p7-R8uLGUhw/TZH7NTliD-I/AAAAAAAABkw/PVMDxmZ4pMs/s72-c/00.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/03/empezando-con-rockwell-un-vistazo-desde.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4CRnsyeSp7ImA9WhdUFk4.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-24333161732079326</id><published>2011-03-15T10:14:00.006+01:00</published><updated>2011-10-03T10:36:07.591+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T10:36:07.591+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Basic" /><category scheme="http://www.blogger.com/atom/ns#" term="libnodave" /><title>Accediendo a un PLC Siemens desde Visual Basic: LIBNODAVE</title><content type="html">&lt;a href="http://libnodave.sourceforge.net/"&gt;Libnodave&lt;/a&gt; es una biblioteca &lt;a href="http://es.wikipedia.org/wiki/GNU_General_Public_License"&gt;libre&lt;/a&gt; de funciones para comunicar con PLC Siemens, utilizando adaptadores MPI/PPI o Ethernet. Está disponible para descarga directa &lt;a href="http://sourceforge.net/projects/libnodave"&gt;aquí&lt;/a&gt; y viene con el código fuente, programas de prueba, bibliotecas para Linux, Windows (32 bits), .NET y ejemplos. Para programar podemos elegir una gran variedad de lenguajes y entornos: C, C++, C#, Delphi, Pascal, Perl, Visual Basic y Visual Basic for Aplications.&lt;br /&gt;
&lt;br /&gt;
Para probarlo voy a partir de la configuración que tengo hecha de las dos &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como_08.html"&gt;entradas anteriores&lt;/a&gt; en las que comunicaba un S5-95U con un 315-2DP por Profibus. Ahora lo que pretendo es conectarme desde mi ordenador al S7-300 para visualizar, en una aplicación en Visual Basic, las lecturas que hago de la periferia integrada del S5.&lt;br /&gt;
&lt;br /&gt;
Para comunicar mi PC con el 315-2DP tengo un adaptador &lt;a href="http://es.wikipedia.org/wiki/RS-232"&gt;serie&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Multi_Point_Interface"&gt;MPI&lt;/a&gt; de Siemens referencia &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7901-2BF00-0AA0&amp;amp;caller=view"&gt;6ES7901-2BF00-0AA0&lt;/a&gt;. No viene en la lista de adaptadores probados en la página de Libnodave pero ha funcionado bien, incluso a través de un adaptador USB/serie de la marca &lt;a href="http://www.prolific.com.tw/"&gt;Prolific&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Para clarificar, en el siguiente esquema represento el conexionado que tengo entre los diferentes elementos:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-VoQofPrCkd8/TX41hMqtmvI/AAAAAAAABjo/LoeaRzJ_it0/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-VoQofPrCkd8/TX41hMqtmvI/AAAAAAAABjo/LoeaRzJ_it0/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Lo que voy a hacer en este proyecto es una aplicación en &lt;a href="http://www.microsoft.com/express/Downloads/#2010-Visual-CPP"&gt;Visual Basic 2010 Express&lt;/a&gt; a la que voy a incorporar la biblioteca Libnodave para leer y escribir en el bloque de datos donde interactúo con la periferia del S5-95U: &lt;b&gt;lo único que hará mi aplicación es leer y escribir en el DB10 del 315-2DP&lt;/b&gt;. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
En los programas de Step5 y Step7 no tengo que modificar nada, el acceso es transparente para los PLC; la aplicación en el PC funcionará como &lt;a href="http://es.wikipedia.org/wiki/Interfaz_de_usuario"&gt;HMI&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en el entorno de Visual Basic. Una vez creado vamos a sus propiedades:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/--DF2so9tSFY/TX479ntPe9I/AAAAAAAABjw/lMPPCflGO-U/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--DF2so9tSFY/TX479ntPe9I/AAAAAAAABjw/lMPPCflGO-U/s1600/20.png" /&gt;&lt;/a&gt;&lt;/div&gt;
En la pestaña &lt;i&gt;Referencias&lt;/i&gt; vamos a agregar una referencia nueva:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/--yMnRWA-sS0/TX48WTgT_4I/AAAAAAAABj4/8OidXgG78u4/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--yMnRWA-sS0/TX48WTgT_4I/AAAAAAAABj4/8OidXgG78u4/s1600/21.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Vamos al directorio donde hayamos descomprimido Libnodave y dentro del subdirectorio &lt;i&gt;Dot.NET&lt;/i&gt; seleccionamos la biblioteca &lt;i&gt;libnodave.net.dll&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eX23jchmBKM/TX49EStVUVI/AAAAAAAABkA/jwYAjb7nbvw/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-eX23jchmBKM/TX49EStVUVI/AAAAAAAABkA/jwYAjb7nbvw/s1600/22.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Al aceptar, en la lista de referencias ya debería aparecer &lt;i&gt;libnodave.net&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-DLxLWVo-vo8/TX49iWId60I/AAAAAAAABkI/xsrExM9kA6o/s1600/23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-DLxLWVo-vo8/TX49iWId60I/AAAAAAAABkI/xsrExM9kA6o/s1600/23.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Con esto ya tenemos acceso a las funciones para programar nuestra comunicación. Sin embargo, si ejecutamos la aplicación nos saldrá un error de que falta una biblioteca DLL. La solución la encontré en el &lt;a href="http://sourceforge.net/projects/libnodave/forums/forum/205657/topic/1401721"&gt;foro de libnodave&lt;/a&gt;. Resulta que la biblioteca que hemos incorporado al proyecto es un "&lt;a href="http://en.wikipedia.org/wiki/Driver_wrapper"&gt;wrapper&lt;/a&gt;", o sea, una adaptación de la biblioteca de Win32 a .NET. Así que es necesario copiar manualmente la biblioteca &lt;i&gt;libnodave.dll&lt;/i&gt; que se encuentra en el subdirectorio &lt;i&gt;win&lt;/i&gt; en el mismo directorio donde esté el ejecutable de nuestro programa, esto es en los subdirectorios &lt;i&gt;\bin\Debug&lt;/i&gt; y &lt;i&gt;\bin\Release&lt;/i&gt; del directorio del proyecto en Visual Basic.&lt;br /&gt;
&lt;br /&gt;
Realizado este paso ya estamos listos para iniciar la programación. Con la biblioteca Libnodave vienen un par de ejemplos en Visual Basic, en los que me he basado. He creado la clase &lt;b&gt;NDA_LND&lt;/b&gt; para gestionar la conexión con las funciones &lt;i&gt;Conectar&lt;/i&gt; y &lt;i&gt;Desconectar&lt;/i&gt; y un par de funciones para leer y escribir en un DB. El código de la clase es el siguiente:&lt;br /&gt;
&lt;blockquote&gt;
Public Class NDA_LND&lt;br /&gt;
Dim daveSerie As libnodave.daveOSserialType&lt;br /&gt;
Dim daveInter As libnodave.daveInterface&lt;br /&gt;
Dim daveConex As libnodave.daveConnection&lt;br /&gt;
&lt;br /&gt;
Public BufferLectura(1000) As Byte&lt;br /&gt;
Public BufferEscritura(1000) As Byte&lt;br /&gt;
&lt;br /&gt;
Public Conectado As Boolean = False&lt;br /&gt;
Public Mensaje As String&lt;br /&gt;
&lt;br /&gt;
Public Function Conectar(Optional ByVal localMPI As Integer = 0, _&lt;br /&gt;
Optional ByVal plcMPI As Integer = 2, _&lt;br /&gt;
Optional ByVal portSerial As String = "COM1", _&lt;br /&gt;
Optional ByVal baud As String = "19200") As Boolean&lt;br /&gt;
If Conectado Then&lt;br /&gt;
Mensaje = "Conexión abortada, ya existe una conexión."&lt;br /&gt;
Conectar = False&lt;br /&gt;
Exit Function&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Dim Respuesta As Integer&lt;br /&gt;
&lt;br /&gt;
Mensaje = "Abriendo una conexión serie..."&lt;br /&gt;
daveSerie.rfd = libnodave.setPort(portSerial, baud, AscW("O"))&lt;br /&gt;
daveSerie.wfd = daveSerie.rfd&lt;br /&gt;
&lt;br /&gt;
If daveSerie.rfd &amp;gt; 0 Then&lt;br /&gt;
Mensaje = "Conexión serie OK, creando interface..."&lt;br /&gt;
&lt;br /&gt;
daveInter = New libnodave.daveInterface(daveSerie, "My Interface 1", _&lt;br /&gt;
localMPI, _&lt;br /&gt;
libnodave.daveProtoMPI2, _&lt;br /&gt;
libnodave.daveSpeed187k)&lt;br /&gt;
daveInter.setTimeout(1000000)  'Make this longer if you have a very long response time&lt;br /&gt;
&lt;br /&gt;
Mensaje = "Inicializando adaptador..."&lt;br /&gt;
Respuesta = daveInter.initAdapter()&lt;br /&gt;
&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Inicialización del adaptador OK, creando conexión MPI..."&lt;br /&gt;
daveConex = New libnodave.daveConnection(daveInter, plcMPI, 0, 0)  'Rack and slot don't matter in case of MPI&lt;br /&gt;
Respuesta = daveConex.connectPLC()&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Conexión MPI correcta, lista para operar."&lt;br /&gt;
Conectado = True&lt;br /&gt;
Else&lt;br /&gt;
daveInter.disconnectAdapter()&lt;br /&gt;
libnodave.closePort(daveSerie.rfd)&lt;br /&gt;
Mensaje = "Error al abrir la conexión MPI [" &amp;amp; _&lt;br /&gt;
libnodave.daveStrerror(Respuesta) &amp;amp; "]"&lt;br /&gt;
Conectado = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Else&lt;br /&gt;
libnodave.closePort(daveSerie.rfd)&lt;br /&gt;
Mensaje = "Error al inicializar el adaptador [" &amp;amp; _&lt;br /&gt;
Respuesta &amp;amp; "] " &amp;amp; libnodave.daveStrerror(Respuesta)&lt;br /&gt;
Conectado = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "Error al abrir el puerto serie " &amp;amp; portSerial&lt;br /&gt;
Conectado = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Conectar = Conectado&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Public Function Desconectar() As Boolean&lt;br /&gt;
If Conectado Then&lt;br /&gt;
daveConex.disconnectPLC()&lt;br /&gt;
daveInter.disconnectAdapter()&lt;br /&gt;
libnodave.closePort(daveSerie.rfd)&lt;br /&gt;
Conectado = False&lt;br /&gt;
Mensaje = "Conexión correctamente terminada."&lt;br /&gt;
Desconectar = True&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "No existe conexión activa."&lt;br /&gt;
Desconectar = False&lt;br /&gt;
End If&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Public Function LeerBytesDB(ByVal NumDB As Integer, _&lt;br /&gt;
ByVal Dir As Integer, _&lt;br /&gt;
ByVal NumBytes As Integer) As Boolean&lt;br /&gt;
&lt;br /&gt;
Dim Respuesta As Integer&lt;br /&gt;
&lt;br /&gt;
Respuesta = daveConex.readBytes(libnodave.daveDB, NumDB, Dir, NumBytes, BufferLectura)&lt;br /&gt;
&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Leídos " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
LeerBytesDB = True&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "Error al leer " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
LeerBytesDB = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Public Function EscribirBytesDB(ByVal NumDB As Integer, _&lt;br /&gt;
ByVal Dir As Integer, _&lt;br /&gt;
ByVal NumBytes As Integer) As Boolean&lt;br /&gt;
Dim Respuesta As Integer&lt;br /&gt;
&lt;br /&gt;
Respuesta = daveConex.writeBytes(libnodave.daveDB, NumDB, Dir, NumBytes, BufferEscritura)&lt;br /&gt;
&lt;br /&gt;
If Respuesta = 0 Then&lt;br /&gt;
Mensaje = "Escritos " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
EscribirBytesDB = True&lt;br /&gt;
Else&lt;br /&gt;
Mensaje = "Error al escribir " &amp;amp; NumBytes &amp;amp; " bytes a partir de la dirección " &amp;amp; _&lt;br /&gt;
Dir &amp;amp; " en el DB " &amp;amp; NumDB&lt;br /&gt;
EscribirBytesDB = False&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
End Class&lt;/blockquote&gt;
Aunque no está comentado, el código creo que es fácil de entender. Con la función &lt;b&gt;Conectar&lt;/b&gt; abrimos el puerto serie, inicializamos el adaptador y la conexión MPI, dejándola lista para operar. Comprobando el booleano que devuelve podemos saber si la operación se completó correctamente. Se le pasan por parámetros la dirección MPI del adaptador (por lo general la 0), la dirección MPI del PLC, el puerto serie por el cual comunicará y la velocidad de conexión:&lt;br /&gt;
&lt;blockquote&gt;
S7MPI = New NDA_LND&lt;br /&gt;
S7MPI.Conectar(LocalMPI, PLCMPI, "COM1", "19200")&lt;/blockquote&gt;
Los datos se leen con la función &lt;b&gt;LeerBytesDB&lt;/b&gt; y se depositan en &lt;b&gt;BufferLectura&lt;/b&gt;; por ejemplo, para leer las entradas analógicas se haría así:&lt;br /&gt;
&lt;blockquote&gt;
S7MPI.LeerBytesDB(10, 26, 16) 'DB10, 16 bytes a partir de la dirección 26&lt;br /&gt;
'Entradas analógicas&lt;br /&gt;
EW40.Value = libnodave.getU16from(S7MPI.BufferLectura, 0)&lt;br /&gt;
EW42.Value = libnodave.getU16from(S7MPI.BufferLectura, 2)&lt;br /&gt;
EW44.Value = libnodave.getU16from(S7MPI.BufferLectura, 4)&lt;br /&gt;
EW46.Value = libnodave.getU16from(S7MPI.BufferLectura, 6)&lt;br /&gt;
EW48.Value = libnodave.getU16from(S7MPI.BufferLectura, 8)&lt;br /&gt;
EW50.Value = libnodave.getU16from(S7MPI.BufferLectura, 10)&lt;br /&gt;
EW52.Value = libnodave.getU16from(S7MPI.BufferLectura, 12)&lt;br /&gt;
EW54.Value = libnodave.getU16from(S7MPI.BufferLectura, 14)&lt;/blockquote&gt;
y los que necesitemos escribir en &lt;b&gt;BufferEscritura&lt;/b&gt; transfiriéndolo con la función &lt;b&gt;EscribirBytesDB&lt;/b&gt; especificando el número de DB, la dirección de byte dentro del DB y el número de bytes a escribir:&lt;br /&gt;
&lt;blockquote&gt;
S7MPI.BufferEscritura(8) = Valor16bits \ 256 'División entera&lt;br /&gt;
S7MPI.BufferEscritura(9) = Valor16bits Mod 256&lt;br /&gt;
S7MPI.EscribirBytesDB(10, 42, 10) 'DB10, 10 bytes a partir de la dirección 42&lt;/blockquote&gt;
Una vez terminadas la operaciones debemos &lt;b&gt;Desconectar&lt;/b&gt;, si no se quedará el puerto serie ocupado.&lt;br /&gt;
&lt;blockquote&gt;
S7MPI.Desconectar()&lt;/blockquote&gt;
El proyecto completo en Visual Basic lo tienes &lt;a href="http://goo.gl/Sgwer"&gt;aquí&lt;/a&gt;. Si lo ejecutas tendrá el siguiente aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-HSqdK5VEnu4/TX8qbD2JdoI/AAAAAAAABkQ/YEDcXxOqwFM/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://3.bp.blogspot.com/-HSqdK5VEnu4/TX8qbD2JdoI/AAAAAAAABkQ/YEDcXxOqwFM/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
Con Libnodave viene documentación que deberás leer para adaptar el código a otros adaptadores. En mi caso, al inicializar el adaptador tuve que cambiar el protocolo a &lt;i&gt;daveProtoMPI2&lt;/i&gt; para que funcionase.&lt;br /&gt;
&lt;br /&gt;
Aunque en mi ejemplo solo leo y escribo de bloques de datos se puede acceder a más áreas de memoria, habría que completar las funciones de la clase. Si alguien completa el código me gustaría echarle un vistazo.&lt;br /&gt;
&lt;br /&gt;
La velocidad de comunicación no es muy buena, el adaptador serie/MPI se comunica con el PC a 19200 baudios, lo cual constituye un cuello de botella. Libnodave también permite la comunicación Ethernet, si tengo ocasión la probaré, el incremento de velocidad tiene que ser notable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Actualización&lt;/b&gt;: en &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/10/accediendo-un-plc-simatic-traves-de.html"&gt;esta entrada&lt;/a&gt; pruebo Libnodave a través de ethernet.&lt;br /&gt;
&lt;br /&gt;
En resumen, el autor de Libnodave ha hecho un trabajo fantástico, en las pruebas ha tenido un comportamiento impecable. Sin embargo no debemos olvidar que no tiene el soporte de una empresa detrás y que si lo usamos es por nuestra cuenta y riesgo.&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-24333161732079326?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7XB-kfoN-kQoVWyScG5TnFox7mg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7XB-kfoN-kQoVWyScG5TnFox7mg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7XB-kfoN-kQoVWyScG5TnFox7mg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7XB-kfoN-kQoVWyScG5TnFox7mg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/BMGjNI_b290" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/24333161732079326/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/03/probando-una-biblioteca-para-acceder.html#comment-form" title="15 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/24333161732079326?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/24333161732079326?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/BMGjNI_b290/probando-una-biblioteca-para-acceder.html" title="Accediendo a un PLC Siemens desde Visual Basic: LIBNODAVE" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-VoQofPrCkd8/TX41hMqtmvI/AAAAAAAABjo/LoeaRzJ_it0/s72-c/02.png" height="72" width="72" /><thr:total>15</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/03/probando-una-biblioteca-para-acceder.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4ERnkyeyp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-2741877859973010719</id><published>2011-03-08T12:31:00.003+01:00</published><updated>2011-08-08T17:38:27.793+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:38:27.793+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Profibus" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><title>Reutilizando un PLC Simatic S5-95U como cabecera Profibus (parte 2ª)</title><content type="html">En la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como.html"&gt;primera parte&lt;/a&gt; dejamos al S5-95U preparado para funcionar como cabecera Profibus, ahora vamos a la parte de Step7. &lt;br /&gt;
&lt;br /&gt;
Preparamos un proyecto de Step7 con un PLC 315-2DP y le asignamos una red Profibus con una velocidad de 1,5 Mbit/s (la máxima que soporta el S5-95U). En el catálogo buscamos "S5-95U" y lo arrastramos sobre la red Profibus, asignándole una dirección libre, en mi caso la 7.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-s7LeIcwvrQU/TXYFHvxeabI/AAAAAAAABh0/LLW9xq3LZbQ/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="314" src="http://1.bp.blogspot.com/-s7LeIcwvrQU/TXYFHvxeabI/AAAAAAAABh0/LLW9xq3LZbQ/s400/00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Seleccionamos el componente que acabamos de insertar y copiamos el Módulo universal sobre los slots 1 y 2. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-4Z--gft8fhA/TXYFfSSS_hI/AAAAAAAABh8/GDmjLIV_P94/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="314" src="http://4.bp.blogspot.com/-4Z--gft8fhA/TXYFfSSS_hI/AAAAAAAABh8/GDmjLIV_P94/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;En las propiedades de cada módulo universal pulsamos sobre el botón &lt;i&gt;Entrada directa...&lt;/i&gt; y donde pone &lt;i&gt;Byte identificador (decimal):&lt;/i&gt; introducimos el primer código decimal con el que configuramos la comunicación Profibus en el DB1 del S5-95U, en mi caso 223.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JQ_L-c8upCs/TXYGVp2uHaI/AAAAAAAABiE/V-wZNIXD-VA/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-JQ_L-c8upCs/TXYGVp2uHaI/AAAAAAAABiE/V-wZNIXD-VA/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;Con ese código ya interpreta qué cantidad y tipo de datos se van a comunicar, tan solo debemos decirle la dirección de entradas que ocuparán los datos recibidos, en mi caso a partir de la 256.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-lG71-1CBM2A/TXYG3Bx9egI/AAAAAAAABiM/vN-bRDIWNYw/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-lG71-1CBM2A/TXYG3Bx9egI/AAAAAAAABiM/vN-bRDIWNYw/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;Realizamos el proceso análogo para las salidas en el otro módulo universal, poniendo, para mi ejemplo, el valor 239.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VmFSryz5z7c/TXYHMxxE3lI/AAAAAAAABiU/6Zxq3IWzbQo/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-VmFSryz5z7c/TXYHMxxE3lI/AAAAAAAABiU/6Zxq3IWzbQo/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;Y como dirección de salida pongo la 256:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--9yvvl20Shs/TXYHYX_oefI/AAAAAAAABic/hTMnVS62_AM/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--9yvvl20Shs/TXYHYX_oefI/AAAAAAAABic/hTMnVS62_AM/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;Y listo, guardamos y compilamos la configuración, y la transferimos al PLC. Si todo va bien y pasamos el S5-95U de &lt;i&gt;Stop&lt;/i&gt; a &lt;i&gt;Run&lt;/i&gt; podremos ver que el piloto rojo BF se apaga, lo que significa que ambos PLC se entienden.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos la configuración lista. Ya solo nos queda hacer un programa en el 315-2DP para probar el funcionamiento. Lo que he hecho es agrupar todos los datos necesarios (entradas y salidas digitales, analógicas y contadores) en un DB, y con un FC hacer la interpretación de los datos.&lt;br /&gt;
&lt;br /&gt;
NOTA: para quien tenga interés, al final de esta entrada están los enlaces a los proyectos se Step5 y Step7 con todo el código.&lt;br /&gt;
&lt;br /&gt;
Leer las entradas del S5-95U es tan sencillo como copiar zonas de la entrada en periferia hacia mi DB:&lt;br /&gt;
&lt;blockquote&gt;L     PEW  256                    // ENTRADAS DIGITALES&lt;br /&gt;
T     DB10.DBW    0&lt;br /&gt;
&lt;br /&gt;
L     PEW  258                    // ENTRADAS DE ALARMA Y BYTE DE DIAGNOSIS&lt;br /&gt;
T     DB10.DBW    2&lt;br /&gt;
&lt;br /&gt;
L     PED  260                    // CONTADORES RÁPIDOS&lt;br /&gt;
T     DB10.DBD    4&lt;br /&gt;
&lt;br /&gt;
L     PED  264                    // ENTRADAS ANALÓGICAS&lt;br /&gt;
T     DB10.DBD    8&lt;br /&gt;
L     PED  268&lt;br /&gt;
T     DB10.DBD   12&lt;br /&gt;
L     PED  272&lt;br /&gt;
T     DB10.DBD   16&lt;br /&gt;
L     PED  276&lt;br /&gt;
T     DB10.DBD   20&lt;/blockquote&gt;Leo los bits que me indican si existe desbordamiento en las entradas digitales, ejemplo para la primera entrada:&lt;br /&gt;
&lt;blockquote&gt;// LECTURA DE LOS BITS DE DESBORDAMIENTO&lt;br /&gt;
U     DB10.DBX    8.0&lt;br /&gt;
=     "COM_S5".EA_OV[0]&lt;/blockquote&gt;Y proceso el valor de la entrada analógica:&lt;br /&gt;
&lt;blockquote&gt;// PROCESADO DE VALORES&lt;br /&gt;
L     "COM_S5".EA_RAW[0]&lt;br /&gt;
L     2#11111111111000&lt;br /&gt;
UW    &lt;br /&gt;
SRW   3&lt;br /&gt;
T     "COM_S5".EA[0]&lt;/blockquote&gt;Transfiero el estado de las salidas digitales:&lt;br /&gt;
&lt;blockquote&gt;L     DB10.DBW   42&lt;br /&gt;
T     PAW  256&lt;/blockquote&gt;Preparo y transfiero el valor a sacar por la salida analógica:&lt;br /&gt;
&lt;blockquote&gt;L     "COM_S5".AA&lt;br /&gt;
SLW   4&lt;br /&gt;
L     2#111111111110000&lt;br /&gt;
UW    &lt;br /&gt;
T     PAW  258&lt;/blockquote&gt;Y finalmente transfiero las órdenes y valores para resetear y cambiar los valores de preselección de los contadores rápidos:&lt;br /&gt;
&lt;blockquote&gt;L     DB10.DBW   46&lt;br /&gt;
T     PAW  260                    // ORDENES DE RESETEAR CONTADORES&lt;br /&gt;
&lt;br /&gt;
L     DB10.DBD   48&lt;br /&gt;
T     PAD  262                    // VALORES DE PRESELECCIÓN DE CONTADORES&lt;/blockquote&gt;Viendo el DB10 y sus comentarios debería ser sencillo saber donde leer y escribir para tener acceso a todas las entradas y salidas. Las entradas y salidas digitales son triviales. El valor de las entradas analógicas se debe leer en la tabla (&lt;i&gt;array&lt;/i&gt;) &lt;b&gt;EA&lt;/b&gt;, donde se deposita su lectura ya procesada, y se debe interpretar un valor de 2046 como 10 V. Para los contadores rápidos A y B hay sendas señales de reset (&lt;b&gt;CONT_A_RESET&lt;/b&gt; y &lt;b&gt;CONT_B_RESET&lt;/b&gt;), lo que hacen es poner los contadores a cero y asignar nuevos valores de preselección (&lt;b&gt;CONT_A_PRES&lt;/b&gt; y &lt;b&gt;CONT_B_PRES&lt;/b&gt;). La lectura de los contadores la tenemos en &lt;b&gt;CONTADOR_A&lt;/b&gt; y &lt;b&gt;CONTADOR_B&lt;/b&gt;. Finalmente, en la salida analógica (&lt;b&gt;AA&lt;/b&gt;) deberemos escribir un valor entre 0 y 1024, significando este último valor 10 V o 20 mA.&lt;br /&gt;
&lt;br /&gt;
El programa para el S5-95U lo puedes bajar &lt;a href="http://goo.gl/vlbVI"&gt;aquí&lt;/a&gt; y para el 315-2DP &lt;a href="http://goo.gl/TlgKH"&gt;aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-2741877859973010719?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aDFQp7NO5PUcbCSpyKYuJQXKYu0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aDFQp7NO5PUcbCSpyKYuJQXKYu0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aDFQp7NO5PUcbCSpyKYuJQXKYu0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aDFQp7NO5PUcbCSpyKYuJQXKYu0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/YmVo91ao_Nc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/2741877859973010719/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como_08.html#comment-form" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/2741877859973010719?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/2741877859973010719?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/YmVo91ao_Nc/reutilizando-un-plc-simatic-s5-95u-como_08.html" title="Reutilizando un PLC Simatic S5-95U como cabecera Profibus (parte 2ª)" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-s7LeIcwvrQU/TXYFHvxeabI/AAAAAAAABh0/LLW9xq3LZbQ/s72-c/00.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como_08.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcHQ3s9fSp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-664503130097551051</id><published>2011-03-07T11:49:00.004+01:00</published><updated>2011-08-08T17:40:32.565+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:40:32.565+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step5" /><category scheme="http://www.blogger.com/atom/ns#" term="Profibus" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><title>Reutilizando un PLC Simatic S5-95U como cabecera Profibus (parte 1ª)</title><content type="html">Ya que la anterior entrada he retomado el contacto con mi &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6es5095-8MD03&amp;amp;caller=view"&gt;PLC S5-95U&lt;/a&gt;, voy a recuperar una vieja idea: reutilizarlo como cabecera Profibus. La idea es aprovechar su gran conectividad (entradas y salidas digitales, contadores rápidos y señales analógicas) desde un PLC más moderno, por ejemplo desde un &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6ES7315-2AG10-0AB0&amp;amp;caller=view"&gt;PLC 315-2DP&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Lo que voy a hacer en esta primera parte es configurar el S5-95U para acceder a toda su periferia integrada, parametrizarlo como esclavo Profibus y hacer una sencilla programación para transmitir y recibir datos. En una segunda parte haré la integración del S5-95U en una red Profibus y el tratamiento de los datos en un S7-300.&lt;br /&gt;
&lt;br /&gt;
NOTA: &lt;a href="http://notasdeautomatizacion.blogspot.com/2009/09/recordando-step5-parte-1.html"&gt;Aquí&lt;/a&gt; hice una introducción a Step5 que quedó incompleta. Esta entrada podría considerarse su continuación.&lt;br /&gt;
&lt;br /&gt;
Para realizar esta entrada me he basado en este documento de Siemens: &lt;a href="https://support.automation.siemens.com/WW/llisapi.dll?func=ll&amp;amp;objid=264755&amp;amp;nodeid0=10805085&amp;amp;load=content&amp;amp;start=11&amp;amp;csSort=DOCBETREFF&amp;amp;subtype=130000&amp;amp;lang=es&amp;amp;siteid=cseus&amp;amp;aktprim=0&amp;amp;objaction=csview&amp;amp;extranet=standard&amp;amp;viewreg=WW"&gt;Conectar un S5-95U-DP Esclavo a un maestro CPU315-2DP&lt;/a&gt;. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
El primer pasó será configurar el S5-95U para tener acceso a todas las posibilidades que ofrece su periferia integrada (no dispongo de periferia externa). Para ello debemos configurar su DB1, que es un bloque de datos especial que nos permite parametrizar las funciones del PLC.&lt;br /&gt;
&lt;br /&gt;
Para editarlo lo recomendable es realizar un borrado total del PLC para tener un DB1 funcional ajustado con valores por defecto, y a partir de ahí adaptarlo a nuestras necesidades. &lt;br /&gt;
&lt;br /&gt;
Para decirle que vamos a usar las 8 entradas analógicas modificamos en el identificador de bloque &lt;b&gt;OBA&lt;/b&gt; su número a 8: &lt;b&gt;AI 8&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
El bloque &lt;b&gt;OBI&lt;/b&gt; sirve para parametrizar las entradas de alarma, pero no me interesa, ya que las voy a utilizar como entradas digitales ordinarias, así que no es necesario modificar nada aquí.&lt;br /&gt;
&lt;br /&gt;
En el bloque &lt;b&gt;OBC&lt;/b&gt; configuraremos las entradas de contador rápido. &lt;b&gt;CAP 999&lt;/b&gt; para el contador A con incremento por flanco positivo y valor de preselección (valor máximo del contador) 999 - este valor se puede modificar posteriormente. De forma idéntica el contador B &lt;b&gt;CBP 999&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Como no voy a usar temporizadores, en el bloque &lt;b&gt;SDP&lt;/b&gt; voy a poner el parámetro &lt;b&gt;T&lt;/b&gt; a cero, para que no se evalúen y ganar algo de tiempo ciclo.&lt;br /&gt;
&lt;br /&gt;
Finalmente me queda por modificar el bloque &lt;b&gt;DPS&lt;/b&gt; que es el que configura la conexión Profibus. Para activarlo debemos sustituir los caracteres # al principio y al final del bloque por espacios. El primer valor es &lt;b&gt;TLN&lt;/b&gt; y le asigno la dirección Profibus del esclavo, en mi caso la 7. El segundo valor &lt;b&gt;DPAE&lt;/b&gt; es un par de números que son la codificación en decimal del byte de configuración, y sirven para especificar qué cantidad de datos se van a transmitir. Para construir estos números tenemos que ir a la documentación de Siemens y leemos:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Estructura del byte de configuración: &lt;br /&gt;
&lt;table border="1" cellspacing="1" style="width: 550px;"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td valign="middle" width="20%"&gt;&lt;b&gt;Bit 7&lt;/b&gt;&lt;/td&gt; &lt;td valign="middle" width="18%"&gt;&lt;b&gt;Bit 6&lt;/b&gt;&lt;/td&gt; &lt;td valign="middle" width="34%"&gt;&lt;b&gt;Bit 5 y Bit 4&lt;/b&gt;&lt;/td&gt; &lt;td valign="middle" width="28%"&gt;&lt;b&gt;Bit 3, 2, 1 y 0&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="middle" width="20%"&gt;128&lt;/td&gt; &lt;td valign="middle" width="18%"&gt;64&lt;/td&gt; &lt;td valign="middle" width="34%"&gt;32 16&amp;nbsp;&lt;/td&gt; &lt;td valign="middle" width="28%"&gt;8 4 2 1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="middle" width="20%"&gt;Consistencia&lt;/td&gt; &lt;td valign="middle" width="18%"&gt;Formato&amp;nbsp;Long&lt;/td&gt; &lt;td valign="middle" width="34%"&gt;Datos de envío o recepción&lt;/td&gt; &lt;td valign="middle" width="28%"&gt;Longitud de datos&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign="middle" width="20%"&gt;0: Byte o Word&lt;br /&gt;
1: Longitud completa&amp;nbsp;&lt;/td&gt; &lt;td valign="middle" width="18%"&gt;0: Estructura en byte&lt;br /&gt;
1: Estructura en Word&lt;/td&gt; &lt;td valign="middle" width="34%"&gt;00: prohibido&lt;br /&gt;
01: Datos de envío al maestro&lt;br /&gt;
10: Datos de recepción del maestro&lt;br /&gt;
11: Datos de envío y recepción&amp;nbsp;&lt;/td&gt; &lt;td valign="middle" width="28%"&gt;0000: 1 Byte o Word&lt;br /&gt;
0001: 2 Byte o Word&lt;br /&gt;
0001: 2 Byte o Word&lt;br /&gt;
0010: 3 Byte o Word&lt;br /&gt;
0011: 4 Byte o Word&lt;br /&gt;
0100: 8 Byte o Word&lt;br /&gt;
1111: 16 Byte o Word&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;Ejemplo:&lt;/b&gt;&lt;br /&gt;
16 WORD de entrada digitales con consistencia como datos de envío al maestro 11011111 = 223 decimal&lt;br /&gt;
16 WORD de salidas digitales con consistencia como datos de recepción desde el maestro 11101111 = 239 decimal&lt;/blockquote&gt;&lt;br /&gt;
Precisamente el valor que pone de ejemplo es el máximo de datos a transmitir o recibir, y son los valores que voy a usar. Es importante anotar estos valores, ya que nos harán falta cuando hagamos la configuración de la red Profibus en Step7.&lt;br /&gt;
&lt;br /&gt;
Con todo lo visto hasta ahora, el DB1 debería presentar el siguiente aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-GVuOeupkb3o/TXSsl4g7P1I/AAAAAAAABhk/0H6iwLNBDa8/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-GVuOeupkb3o/TXSsl4g7P1I/AAAAAAAABhk/0H6iwLNBDa8/s1600/10.png" /&gt;&lt;/a&gt;&lt;/div&gt;Para que los parámetros del DB1 hagan efecto debemos pasar el PLC de &lt;i&gt;Stop&lt;/i&gt; a &lt;i&gt;Run&lt;/i&gt;. Si el PLC se queda en &lt;i&gt;Stop&lt;/i&gt; es que hemos cometido algún error; debemos ser estrictos al escribir el DB, sobre todo respetando los espacios. En el manual se especifica un procedimiento para detectar donde nos hemos equivocado mediante diagnosis en el PLC, pero me ha parecido un poco farragoso. Con un poco de cuidado no deberíamos tener problemas.&lt;br /&gt;
&lt;br /&gt;
Con el PLC configurado nos queda hacer un sencillo programa para transmitir el estado de las entradas y activar las salidas de la periferia integrada. Para ello he creado el FB1 con el siguiente código,&lt;br /&gt;
&lt;br /&gt;
Activo las salidas digitales y la salida analógica según me llegan por Profibus:&lt;br /&gt;
&lt;blockquote&gt;NAME: FB1&lt;br /&gt;
&lt;br /&gt;
L PW 128&lt;br /&gt;
T AW 32&lt;br /&gt;
&lt;br /&gt;
L PW 130&lt;br /&gt;
T AW 40&lt;/blockquote&gt;Voy a usar dos bits para poner a cero las entradas de contador y a la vez modificar el valor de preselección. Si recibo la orden de poner a cero se copia el valor de preselección (que también se recibe por Profibus) sobre el valor del contador.&lt;br /&gt;
&lt;blockquote&gt;L PY 132&lt;br /&gt;
T MB 0&lt;br /&gt;
UN M 0.0&lt;br /&gt;
SPB =M000&lt;br /&gt;
L PW 134&lt;br /&gt;
T PW 36&lt;br /&gt;
&lt;br /&gt;
M000: UN M 0.1&lt;br /&gt;
SPB =M001&lt;br /&gt;
L PW 136&lt;br /&gt;
T PW 38&lt;/blockquote&gt;A continuación se transmiten de forma correlativa en formato WORD las entradas digitales, las entradas de alarma, el byte de diagnosis, los contadores rápidos y las entradas analógicas.&lt;br /&gt;
&lt;blockquote&gt;M001: L EW 32&lt;br /&gt;
T PW 128&lt;br /&gt;
&lt;br /&gt;
L EW 34&lt;br /&gt;
T PW 130&lt;br /&gt;
&lt;br /&gt;
L EW 36&lt;br /&gt;
T PW 132&lt;br /&gt;
&lt;br /&gt;
L EW 38&lt;br /&gt;
T PW 134&lt;br /&gt;
&lt;br /&gt;
L EW 40&lt;br /&gt;
T PW 136&lt;br /&gt;
&lt;br /&gt;
L EW 42&lt;br /&gt;
T PW 138&lt;br /&gt;
&lt;br /&gt;
L EW 44&lt;br /&gt;
T PW 140&lt;br /&gt;
&lt;br /&gt;
L EW 46&lt;br /&gt;
T PW 142&lt;br /&gt;
&lt;br /&gt;
L EW 48&lt;br /&gt;
T PW 144&lt;br /&gt;
&lt;br /&gt;
L EW 50&lt;br /&gt;
T PW 146&lt;br /&gt;
&lt;br /&gt;
L EW 52&lt;br /&gt;
T PW 148&lt;br /&gt;
&lt;br /&gt;
L EW 54&lt;br /&gt;
T PW 150&lt;/blockquote&gt;Finalmente reseteamos los bits que forman el byte de diagnóstico.&lt;br /&gt;
&lt;blockquote&gt;R E 35.0&lt;br /&gt;
R E 35.1&lt;br /&gt;
R E 35.2&lt;br /&gt;
R E 35.3&lt;br /&gt;
R E 35.4&lt;br /&gt;
R E 35.5&lt;br /&gt;
R E 35.6&lt;br /&gt;
R E 35.7&lt;br /&gt;
&lt;br /&gt;
BE&lt;/blockquote&gt;&lt;br /&gt;
Llamamos en el OB1 al FB1 y listo, ya tenemos el S5-95U listo para nuestro propósito.&lt;br /&gt;
&lt;br /&gt;
He transmitido por Profibus el byte de diagnosis ya que resulta interesante. El S5-95U tiene un pila de respaldo. Si esta pila se agota, en cuanto apaguemos el PLC perderemos el programa, así que no estará de más avisar que esto puede suceder al maestro Profibus. En la documentación podemos ver cómo es este byte de diagnósis:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CVpYozWZ8e4/TXSz_BQWIlI/AAAAAAAABhs/8fS_ieNSjNI/s1600/30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-CVpYozWZ8e4/TXSz_BQWIlI/AAAAAAAABhs/8fS_ieNSjNI/s1600/30.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
En el S5-95U vienen preprogramados dos FB (FB250 y FB251) para procesar señales analógicas. Ya que cada llamada a uno de ellos conlleva un retardo de 2,4 ms en el tiempo ciclo, he preferido transmitir el valor leído de las señales analógicas en "crudo" y procesarlas en Step7. &lt;br /&gt;
&lt;br /&gt;
Las entradas de alarma, si se configuran en el DB1, activan el OB3 (OB de alarma). Como no le he encontrado utilidad, no las he configurado y se usan como cuatro entradas digitales ordinarias.&lt;br /&gt;
&lt;br /&gt;
Para las entradas de contador rápido debemos tener en cuenta que se ponen a cero con cada paso de &lt;i&gt;Stop&lt;/i&gt; a &lt;i&gt;Run&lt;/i&gt;. Los contadores se incrementan con cada flanco positivo que reciban; si necesitásemos flancos negativos habría que modificar el DB1. Al llegar al valor de preselección regresan a cero. Para ponerlos a cero desde programa deberemos sobre escribirlos con un valor (16 bits sin signo), que quedará configurado como nuevo valor de preselección. Existe la posibilidad, modificando el DB1, de agruparlos como un único contador de 32 bits.&lt;br /&gt;
&lt;br /&gt;
En la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como_08.html"&gt;segunda parte&lt;/a&gt; me meteré con la configuración en Step7.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-664503130097551051?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VD6J3BkaOFetdNU8USGLxDJ-3Fk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VD6J3BkaOFetdNU8USGLxDJ-3Fk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VD6J3BkaOFetdNU8USGLxDJ-3Fk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VD6J3BkaOFetdNU8USGLxDJ-3Fk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/kJmMZ1kHTK4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/664503130097551051/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/664503130097551051?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/664503130097551051?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/kJmMZ1kHTK4/reutilizando-un-plc-simatic-s5-95u-como.html" title="Reutilizando un PLC Simatic S5-95U como cabecera Profibus (parte 1ª)" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-GVuOeupkb3o/TXSsl4g7P1I/AAAAAAAABhk/0H6iwLNBDa8/s72-c/10.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/03/reutilizando-un-plc-simatic-s5-95u-como.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcNRHkyfCp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-4241711352160118837</id><published>2011-03-02T14:23:00.008+01:00</published><updated>2011-08-08T17:41:35.794+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:41:35.794+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step5" /><category scheme="http://www.blogger.com/atom/ns#" term="S5/S7 for Windows" /><title>Probando "S5/S7 for Windows" para programar en Step5</title><content type="html">Usar el editor de Siemens en MS-DOS de &lt;a href="http://en.wikipedia.org/wiki/Simatic_S5_PLC"&gt;Step5&lt;/a&gt; es un dolor de cabeza, al menos para mí, ya que tengo un contacto muy esporádico con él y cada vez es como empezar de nuevo. Reconozco que si dominas el entorno en MS-DOS y memorizas los comandos necesarios la edición es muy rápida, pero si tienes que trabajar con él cada dos o tres años para hacer alguna pequeña adaptación... pues es una lata.&lt;br /&gt;
&lt;br /&gt;
En esta &lt;a href="http://notasdeautomatizacion.blogspot.com/2009/09/recordando-step5-parte-1.html"&gt;entrada&lt;/a&gt; empecé a crear una guía como recordatorio rápido para el entorno en MS-DOS pero aún no me he animado a continuarla, más que nada porque no he vuelto a tocar ningún S5.&lt;br /&gt;
&lt;br /&gt;
Pero recientemente ha pasado por mis manos un portátil que tiene instalado el software "&lt;a href="http://www.ibhsoftec-sps.de/english/Selection_S5_S7.htm"&gt;S5/S7 for Windows&lt;/a&gt;" de la empresa &lt;a href="http://www.ibhsoftec-sps.de/english/first.htm"&gt;IBHsoftec&lt;/a&gt; y he aprovechado para echarle un vistazo. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Así que conecto el cable serie de programación de Step5 entre mi &lt;a href="http://support.automation.siemens.com/WW/llisapi.dll?func=cslib.csinfo&amp;amp;lang=es&amp;amp;objid=6es5095-8MD03&amp;amp;caller=view"&gt;S5-95U&lt;/a&gt; y el portátil, enciendo el PLC y ejecuto el programa, que tiene este aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZTDv1p4JWBs/TW42tyjI2cI/AAAAAAAABfk/jqEVx8iKnVw/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ZTDv1p4JWBs/TW42tyjI2cI/AAAAAAAABfk/jqEVx8iKnVw/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;En la parte inferior izquierda hay dos pestañas &lt;i&gt;Offline / Online&lt;/i&gt;, pulso en la de &lt;i&gt;Online&lt;/i&gt; y aparecen todas las opciones de comunicación:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xd9h0fVuA-U/TW433D_LGBI/AAAAAAAABfs/s62pFkmHhPE/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-xd9h0fVuA-U/TW433D_LGBI/AAAAAAAABfs/s62pFkmHhPE/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;Como tengo mi PLC conectado al puerto serie COM1 hago doble clic sobre él y enseguida aparece. No he tenido que configurar nada en el puerto, la detección es impecable. Pulso el botón derecho del ratón sobre el PLC y aparece un menú de opciones, donde puedo pasar el PLC a &lt;i&gt;Start&lt;/i&gt; o &lt;i&gt;Stop&lt;/i&gt;, diagnosticarlo, hacer un borrado total, etc. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-f-SUDsabBrE/TW45DRKX7kI/AAAAAAAABf0/hrqwUDcc3Cc/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-f-SUDsabBrE/TW45DRKX7kI/AAAAAAAABf0/hrqwUDcc3Cc/s1600/02.png" /&gt;&lt;/a&gt;&lt;/div&gt;Voy a ver el diagnóstico, pulso sobre &lt;i&gt;Module state...&lt;/i&gt; y aparece el Status de la CPU. En mi caso me avisa de un fallo en la batería (que está completamente descargada).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9pH3cRN7GLI/TW9GLvdvHJI/AAAAAAAABhM/tg5Q7Qctl40/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-9pH3cRN7GLI/TW9GLvdvHJI/AAAAAAAABhM/tg5Q7Qctl40/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;En la barra de botones hay un botón para ver los bloques de programa que están en el PLC, lo pulso.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-OeOywVwCzuU/TW453Fq-AnI/AAAAAAAABf8/i6rNGB_4RX8/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-OeOywVwCzuU/TW453Fq-AnI/AAAAAAAABf8/i6rNGB_4RX8/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;Y aparecen los bloques que tiene por defecto (al no tener batería, el programa anterior ha desaparecido). Voy a crear un proyecto nuevo, para ello vuelvo a la pestaña &lt;i&gt;Online&lt;/i&gt; y sobre la carpeta donde quiera guardarlo pulso el botón derecho y selecciono &lt;i&gt;New Step5 project...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-R7sokXTc1Eg/TW46hRwqvKI/AAAAAAAABgE/JgHDptu0Klk/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-R7sokXTc1Eg/TW46hRwqvKI/AAAAAAAABgE/JgHDptu0Klk/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;Y aparece el proyecto con un montón de opciones para movernos por él y encontrar rápidamente cualquier operando. Tiene pinta de ser muy útil en proyectos grandes y farragosos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dEZ7F5muKng/TW47iwFwUbI/AAAAAAAABgM/64zMp1OksSs/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-dEZ7F5muKng/TW47iwFwUbI/AAAAAAAABgM/64zMp1OksSs/s1600/07.png" /&gt;&lt;/a&gt;&lt;/div&gt;Ahora voy al menú &lt;i&gt;View&lt;/i&gt; y pulso sobre &lt;i&gt;Offline - block list&lt;/i&gt; para ver los bloques guardados en el proyecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Z_ccdlpO6B0/TW48asZs3WI/AAAAAAAABgU/WYonPI4YvIA/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Z_ccdlpO6B0/TW48asZs3WI/AAAAAAAABgU/WYonPI4YvIA/s1600/08.png" /&gt;&lt;/a&gt;&lt;/div&gt;Como acabamos de crearlo no hay ninguno, así que con el botón derecho del ratón pulsamos sobre &lt;i&gt;New block...&lt;/i&gt; y creo el necesario OB1.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QGi5r0YHIJM/TW485lRGZ4I/AAAAAAAABgc/GcGoXiMhdvk/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://1.bp.blogspot.com/-QGi5r0YHIJM/TW485lRGZ4I/AAAAAAAABgc/GcGoXiMhdvk/s400/09.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Lo abrimos y escribimos un segmento de prueba:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ROHAu86wI-8/TW49SPvtX0I/AAAAAAAABgk/yuC9I9cdJeM/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-ROHAu86wI-8/TW49SPvtX0I/AAAAAAAABgk/yuC9I9cdJeM/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Lo transferimos al PLC pulsando sobre el botón &lt;i&gt;Transfer Block to the PLC.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CDToikRtNyE/TW49nSHTGvI/AAAAAAAABgs/BxQ1Gv0496c/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-CDToikRtNyE/TW49nSHTGvI/AAAAAAAABgs/BxQ1Gv0496c/s1600/11.png" /&gt;&lt;/a&gt;&lt;/div&gt;Y pulsamos el icono de las "gafitas" para ponernos &lt;i&gt;online&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xfDvMiBqqSo/TW4-DcJLrOI/AAAAAAAABg0/MF9ijdlLMgw/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-xfDvMiBqqSo/TW4-DcJLrOI/AAAAAAAABg0/MF9ijdlLMgw/s400/12.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;La edición del DB1 es tan sencilla como ir a los bloques &lt;i&gt;online&lt;/i&gt;, abrir el DB1, editarlo con la comodidad que el entorno Windows ofrece y transferirlo de vuelta al PLC.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VtLe7TXVZs8/TW4-5ll-RPI/AAAAAAAABg8/nL58Jp3Qjjg/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="335" src="http://1.bp.blogspot.com/-VtLe7TXVZs8/TW4-5ll-RPI/AAAAAAAABg8/nL58Jp3Qjjg/s400/13.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Este software me ha gustado mucho. Si conoces un poco Step5 te manejarás con soltura enseguida ya que es muy intuitivo. No he tenido la oportunidad (ni creo que la tenga) de trabajar a fondo en un proyecto con él, pero sin duda es muy recomendable. Solo el hecho de pasar de un entorno MS-DOS a uno Windows es, para mí, un alivio.&lt;br /&gt;
&lt;br /&gt;
Dependiendo de la licencia que compres puedes tener acceso a programar Step5, Step7 o ambos, los precios los tienes en esta &lt;a href="http://www.ibhsoftec-sps.de/downloads/english/Prices/pricelist.pdf"&gt;tarifa (pdf)&lt;/a&gt;. Si quieres probarlo también tienes una &lt;a href="http://www.ibhsoftec-sps.de/english/Download_S5_S7_V6_Demo.htm"&gt;versión demo&lt;/a&gt; disponible. La he instalado en mi portátil y tiene limitaciones, no permite editar bloques mayores de 100 bytes y solo puedes trabajar con un simulador interno de PLC.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DfFPkut73Fs/TW5Birl2mkI/AAAAAAAABhE/TggV2nVH0Dg/s1600/51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-DfFPkut73Fs/TW5Birl2mkI/AAAAAAAABhE/TggV2nVH0Dg/s1600/51.png" /&gt;&lt;/a&gt;&lt;/div&gt;Sin embargo tener esta versión demo instalada resulta muy útil. Nos permite explorar los programas en Step5 con mucha comodidad y para imprimirlos viene fenomenal.&lt;br /&gt;
&lt;br /&gt;
También está disponible una guía para empezar a usar el programa, que puedes descargar de &lt;a href="http://www.ibhsoftec-sps.de/english/Downloads_Demos.htm"&gt;aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Como conclusión puedo asegurar que es un software del que me gustaría disponer, pero la escasa cantidad de PLC Step5 que programo no justifican su compra (y menos en los tiempos que corren). Para alguien que tenga que lidiar con ellos frecuentemente es una opción muy a tener en cuenta.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Actualización:&lt;/b&gt; Me han preguntado en un comentario si es posible realizar la conexión a través de un adaptador USB-serie, y, aprovechando que tengo por aquí uno de la marca &lt;a href="http://www.prolific.com.tw/"&gt;Prolific&lt;/a&gt;, lo he probado. En la página web de IBHsoftec dice que se pueden usar estos adaptadores y en el documento "&lt;a href="http://www.ibhsoftec-sps.de/downloads/english/Manuals/S5_for_Windows_Getting_Started.pdf"&gt;S5 for Windows Getting Started&lt;/a&gt;" explica como configurarlo, pero yo no he conseguido hacerlo funcionar, ni siquiera me aparece el puerto en el programa. El que no funcione puede deberse a que no estoy trabajando con la última versión del &lt;i&gt;S5 for Windows&lt;/i&gt; (lo probé en la 6.2.2 y la última es la 6.6.9), a que este modelo de adaptador no sea compatible (estaría bien una lista de adaptadores compatibles) o a que simplemente he hecho algo mal. Si alguien ha hecho funcionar uno de estos adaptadores que avise.&lt;br /&gt;
&lt;br /&gt;
Como siempre agradeceré cualquier comentario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-4241711352160118837?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/59nrNPWEqLgOAQcw8uuvEssxw3o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/59nrNPWEqLgOAQcw8uuvEssxw3o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/59nrNPWEqLgOAQcw8uuvEssxw3o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/59nrNPWEqLgOAQcw8uuvEssxw3o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/uKxixFbvpN8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/4241711352160118837/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/03/probando-s5s7-for-windows-para.html#comment-form" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4241711352160118837?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/4241711352160118837?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/uKxixFbvpN8/probando-s5s7-for-windows-para.html" title="Probando &quot;S5/S7 for Windows&quot; para programar en Step5" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ZTDv1p4JWBs/TW42tyjI2cI/AAAAAAAABfk/jqEVx8iKnVw/s72-c/00.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/03/probando-s5s7-for-windows-para.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYDQHg6fip7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-3637008664934758360</id><published>2011-02-10T21:27:00.007+01:00</published><updated>2011-08-08T17:42:51.616+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:42:51.616+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Profibus" /><category scheme="http://www.blogger.com/atom/ns#" term="atornillador" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="Rexroth" /><title>Comunicación Profibus entre un atornillador Rexroth CS351 y un PLC Siemens S7-300 (parte 2ª y última)</title><content type="html">En la &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/01/comunicacion-profibus-entre-un.html"&gt;entrada anterior&lt;/a&gt; dejé el atornillador configurado, ahora vamos a introducirlo en la red Profibus de Step7. &lt;br /&gt;
&lt;br /&gt;
EL primer paso será abrir la herramienta de configuración hardware de Step7 para instalar el archivo &lt;a href="http://www.profibus.com/products/gsd-files/"&gt;GSD&lt;/a&gt; que generamos en la entrada anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RKsL-FwEKvQ/TVQ2bMidImI/AAAAAAAABc8/bSxxlfCz7oY/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-RKsL-FwEKvQ/TVQ2bMidImI/AAAAAAAABc8/bSxxlfCz7oY/s1600/00.png" /&gt;&lt;/a&gt;&lt;/div&gt;Lo seleccionamos y lo instalamos. Es posible que nos pida cerrar previamente los proyectos que tengamos abiertos. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-t52wcfQzU8o/TVQ3Ldi4jxI/AAAAAAAABdE/9VFZyK94JL0/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-t52wcfQzU8o/TVQ3Ldi4jxI/AAAAAAAABdE/9VFZyK94JL0/s1600/01.png" /&gt;&lt;/a&gt;&lt;/div&gt;Aquí es recomendable recordar el nombre del componente (en mi caso &lt;i&gt;IMpdp fuer KE/SE/CS&lt;/i&gt;) para luego poder buscarlo en el catálogo.&lt;br /&gt;
&lt;br /&gt;
Abrimos la configuración hardware del proyecto, donde ya tengo insertado un PLC 313C-2DP y una red Profibus, y en el catálogo buscamos nuestro atornillador.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5hTtWBloVGk/TVQ4yXbA4ZI/AAAAAAAABdM/Pv_toYAMq5A/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://4.bp.blogspot.com/-5hTtWBloVGk/TVQ4yXbA4ZI/AAAAAAAABdM/Pv_toYAMq5A/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Lo arrastramos sobre la red Profibus y nos pedirá una dirección.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--2ReeenhQJo/TVQ5OI33E3I/AAAAAAAABdU/dWJC9h_NpQo/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--2ReeenhQJo/TVQ5OI33E3I/AAAAAAAABdU/dWJC9h_NpQo/s1600/03.png" /&gt;&lt;/a&gt;&lt;/div&gt;Seleccionamos el atornillador, ya conectado a la red Profibus, y arrastramos desde el catálogo al interior del módulo la configuración del mapeado de entradas y salidas. Podemos asignar las direcciones de entradas y salidas que más nos convengan.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qlI6p1RTJjM/TVQ6bv9iXDI/AAAAAAAABdc/4wZrM1882LY/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://3.bp.blogspot.com/-qlI6p1RTJjM/TVQ6bv9iXDI/AAAAAAAABdc/4wZrM1882LY/s400/04.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y listo, ya tenemos nuestro atornillador configurado. Pulsamos en &lt;i&gt;Guardar y compilar&lt;/i&gt;, cerramos la aplicación de configuración hardware y ya estamos listos para programar.&lt;br /&gt;
&lt;br /&gt;
Yo he cambiado las direcciones de los dos bytes de entradas y los dos de salidas a la dirección 100, y para poder diagnosticarlos los he puesto en una tabla de variables:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WeWa42495BE/TVQ-IZbLQKI/AAAAAAAABdk/oL6zafRIavo/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-WeWa42495BE/TVQ-IZbLQKI/AAAAAAAABdk/oL6zafRIavo/s640/05.png" width="566" /&gt;&lt;/a&gt;&lt;/div&gt;Para leer los datos de par de apriete y ángulo girado debemos ir al manual titulado "Project planning manual", en el apartado 7.4.4 titulado "Formats of the results output" tenemos una tabla con el formato de cada dato. Por ejemplo, en el caso del par es un &lt;i&gt;INT32&lt;/i&gt;. Un poco más abajo aparece un ejemplo de cómo debemos leer ese dato, lo que, a efectos prácticos, significa que debo cambiar el orden de todos los bytes.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-knYwc4dfvD0/TVRAoQb-XSI/AAAAAAAABds/38xwKUEtdYw/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-knYwc4dfvD0/TVRAoQb-XSI/AAAAAAAABds/38xwKUEtdYw/s1600/06.png" /&gt;&lt;/a&gt;&lt;/div&gt;Para saber donde leer el dato tenemos que tomar la dirección base de entradas de datos que hayamos configurado (en mi caso la 128) e ir sumando los tamaños de los datos que se transmiten.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TUWFI3DrAEI/AAAAAAAABcg/HxwPPQFUV2U/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="342" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TUWFI3DrAEI/AAAAAAAABcg/HxwPPQFUV2U/s400/22.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Por ejemplo, según vemos en la imagen anterior el valor de par ocupa cuatro bytes a partir del quinto byte. Como la dirección base es 128 podemos leer el par en la dirección PED133 de la zona de entradas de periferia.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt; Para invertir el orden de todos los bytes he creado el FC13:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-me1K3PzhJt8/TVRCVPAFhiI/AAAAAAAABd0/PeVcezkV9D8/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://4.bp.blogspot.com/-me1K3PzhJt8/TVRCVPAFhiI/AAAAAAAABd0/PeVcezkV9D8/s400/07.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;El código es bastante sencillo:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;FUNCTION FC13 : VOID&lt;br /&gt;
TITLE =INVERTIR LOS BYTES EN UN DWORD&lt;br /&gt;
//DEVUELVE UN DINT&lt;br /&gt;
VERSION : 0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VAR_INPUT&lt;br /&gt;
DATO : DWORD ; &lt;br /&gt;
END_VAR&lt;br /&gt;
VAR_OUTPUT&lt;br /&gt;
DATO_INV : DINT ; &lt;br /&gt;
END_VAR&lt;br /&gt;
VAR_TEMP&lt;br /&gt;
AUX_DWORD : DWORD ; &lt;br /&gt;
AUX_DINT : DINT ; &lt;br /&gt;
END_VAR&lt;br /&gt;
BEGIN&lt;br /&gt;
NETWORK&lt;br /&gt;
TITLE =http://notasdeautomatizacion.blogspot.com&lt;br /&gt;
&lt;br /&gt;
L     #DATO; &lt;br /&gt;
T     #AUX_DWORD; &lt;br /&gt;
&lt;br /&gt;
L     LB     0; &lt;br /&gt;
T     LB     7; &lt;br /&gt;
&lt;br /&gt;
L     LB     1; &lt;br /&gt;
T     LB     6; &lt;br /&gt;
&lt;br /&gt;
L     LB     2; &lt;br /&gt;
T     LB     5; &lt;br /&gt;
&lt;br /&gt;
L     LB     3; &lt;br /&gt;
T     LB     4; &lt;br /&gt;
&lt;br /&gt;
L     #AUX_DINT; &lt;br /&gt;
T     #DATO_INV; &lt;br /&gt;
END_FUNCTION&lt;/blockquote&gt;&lt;br /&gt;
Con esto ya tenemos el valor del par de apriete, en formato entero. En mi caso, las dos últimas cifras representan decimales; el número de decimales depende del par de apriete nominal de nuestra herramienta de atornillado, consultad en el manual.&lt;br /&gt;
&lt;br /&gt;
De forma parecida obtendremos el resto de valores que hayamos configurado en la comunicación.&lt;br /&gt;
&lt;br /&gt;
Ahora ya solo queda programar una lógica de activación de las señales de entrada y salida para controlar el atornillador desde el PLC y esto es algo que viene muy bien explicado en el manual, en el apartado 6 "Control signals", con diagramas temporales de activación para cada operación que necesitemos realizar, aunque también es cierto que simplemente por el nombre de cada señal ya se intuye como debemos tratarlas.&lt;br /&gt;
&lt;br /&gt;
Y hasta aquí estas notas sobre el atornillador Rexroth CS351. Como conclusiones puedo decir que ha sido sencillo de configurar y la comunicación no ha ofrecido problemas. No me he metido en programar ciclos de atornillado con el software BS350 (lo hacía el cliente) pero por lo que pude ver es muy sencillo e intuitivo.&lt;br /&gt;
&lt;br /&gt;
Como siempre, cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-3637008664934758360?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/h3mUlzOBHVptrObS_BU22fIYGjM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h3mUlzOBHVptrObS_BU22fIYGjM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/h3mUlzOBHVptrObS_BU22fIYGjM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h3mUlzOBHVptrObS_BU22fIYGjM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/za1Lu0H9oeY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/3637008664934758360/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/02/comunicacion-profibus-entre-un.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3637008664934758360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/3637008664934758360?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/za1Lu0H9oeY/comunicacion-profibus-entre-un.html" title="Comunicación Profibus entre un atornillador Rexroth CS351 y un PLC Siemens S7-300 (parte 2ª y última)" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-RKsL-FwEKvQ/TVQ2bMidImI/AAAAAAAABc8/bSxxlfCz7oY/s72-c/00.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/02/comunicacion-profibus-entre-un.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUHRXczfSp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-1279905995325079124</id><published>2011-01-29T19:52:00.005+01:00</published><updated>2011-08-08T17:43:54.985+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:43:54.985+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="Profibus" /><category scheme="http://www.blogger.com/atom/ns#" term="atornillador" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><category scheme="http://www.blogger.com/atom/ns#" term="Rexroth" /><title>Comunicación Profibus entre un atornillador Rexroth CS351 y un PLC Siemens S7-300 (parte 1ª)</title><content type="html">Recientemente me han pedido comunicar un atornillador automático &lt;a href="http://www.boschrexroth.com/dcc/Vornavigation/VorNavi.cfm?Language=EN&amp;amp;VHist=&amp;amp;PageID=p331894"&gt;CS351&lt;/a&gt; de &lt;a href="http://www.boschrexroth.com/"&gt;Rexroth&lt;/a&gt; con un &lt;a href="http://es.wikipedia.org/wiki/Controlador_l%C3%B3gico_programable"&gt;PLC&lt;/a&gt; &lt;a href="http://automation.siemens.com/"&gt;Siemens&lt;/a&gt; de la serie &lt;a href="https://www.automation.siemens.com/mcms/programmable-logic-controller/en/simatic-s7-controller/s7-300/Pages/Default.aspx"&gt;S7-300&lt;/a&gt;. La idea es seleccionar una receta a través de &lt;a href="http://es.wikipedia.org/wiki/Interfaz_de_usuario"&gt;HMI&lt;/a&gt; con la secuencia de tornillos a apretar y que el PLC vaya activando el número de programa correspondiente en el atornillador, comprobando los resultados e indicando en un panel de visualización los resultados y pasos a seguir por el operario. El PLC también gestionará una sencilla maniobra neumática. En esta entrada mostraré las notas que he tomado para configurar la comunicación &lt;a href="http://es.wikipedia.org/wiki/Profibus"&gt;Profibus&lt;/a&gt; atornillador-PLC.&lt;br /&gt;
&lt;br /&gt;
El aspecto de la unidad de control del atornillador es este (cutre-foto con mi móvil):&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hi9aumk7Vho/TUQxalFIm-I/AAAAAAAABaQ/86hUPQ_PsVk/s1600/CS351_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hi9aumk7Vho/TUQxalFIm-I/AAAAAAAABaQ/86hUPQ_PsVk/s1600/CS351_1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;La unidad de atornillado con la que tengo que trabajar no viene con puerto Profibus, así que tengo que instalar una tarjeta de comunicación &lt;a href="http://www.boschrexroth.com/dcc/Vornavigation/VorNavi.cfm?Language=EN&amp;amp;VHist=&amp;amp;PageID=p332094"&gt;IMpdp&lt;/a&gt;. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Para configurar el atornillador necesitaremos el software de Rexroth &lt;a href="http://www.boschrexroth.com/dcc/Vornavigation/VorNavi.cfm?Language=EN&amp;amp;VHist=&amp;amp;PageID=p332294"&gt;BS350&lt;/a&gt;. No está disponible para descarga y deberemos ponernos en contacto con nuestro distribuidor para obtenerlo. Existen distintas versiones del programa y deberemos utilizar la que se corresponda con el firmware que lleve nuestro atornillador; en mi caso tengo el firmware V2.20, así que instalaré el BS350 V2.20, que tiene este aspecto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hi9aumk7Vho/TURH_m3h5dI/AAAAAAAABaY/CFlb6OC3A7s/s1600/00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://1.bp.blogspot.com/_hi9aumk7Vho/TURH_m3h5dI/AAAAAAAABaY/CFlb6OC3A7s/s400/00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;El software está en español y bien traducido, lo cual siempre es de agradecer.&lt;br /&gt;
&lt;br /&gt;
Para conectarnos al atornillador, para realizar la configuración, tenemos dos opciones. Una es a través de un cable &lt;a href="http://es.wikipedia.org/wiki/RJ-45#Cable_cruzado"&gt;ethernet cruzado&lt;/a&gt; y la otra es a través del puerto USB en el frontal de la unidad de control. Yo me decanté por la segunda opción. Un cable normal de impresora funcionará perfectamente. Al instalar el controlador USB es recomendable tener el atornillador cerca, para conectarlo cuando nos lo pida y completar la instalación. Si sigues las instrucciones paso a paso no tendrás problemas.&lt;br /&gt;
&lt;br /&gt;
El primer paso será seleccionar cómo nos conectaremos, para ello vamos a &lt;i&gt;PC-&amp;gt;Interfaz&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hi9aumk7Vho/TURL0SkxSUI/AAAAAAAABac/33sljkFbc4Y/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://1.bp.blogspot.com/_hi9aumk7Vho/TURL0SkxSUI/AAAAAAAABac/33sljkFbc4Y/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Y seleccionamos el modo de conexión, en mi caso USB.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TURMPB0andI/AAAAAAAABag/L37G8lOMTDA/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TURMPB0andI/AAAAAAAABag/L37G8lOMTDA/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Ahora iniciaremos la sesión pulsando sobre el botón de la llave.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TURMng8VTcI/AAAAAAAABak/Fe54wgbVhNo/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TURMng8VTcI/AAAAAAAABak/Fe54wgbVhNo/s1600/04.png" /&gt;&lt;/a&gt;&lt;/div&gt;Nos pedirá usuario y contraseña:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hi9aumk7Vho/TURR7k4Y8yI/AAAAAAAABao/P94TbwWc6IY/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hi9aumk7Vho/TURR7k4Y8yI/AAAAAAAABao/P94TbwWc6IY/s1600/05.png" /&gt;&lt;/a&gt;&lt;/div&gt;La unidad de atornillado ya ha estado trabajando y ya tiene una configuración programas de atornillado creados, así que, para evitar problemas, lo mejor es hacer una copia de seguridad. Para ello vamos al menú &lt;i&gt;Datos-&amp;gt;Copia de seguridad...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TURS4qurGgI/AAAAAAAABaw/JUNJpA52gPI/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TURS4qurGgI/AAAAAAAABaw/JUNJpA52gPI/s400/06.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Seleccionamos el canal de atornillado (en mi caso solo tengo un atornillador, con lo que selecciono el primero) y guardo la copia de seguridad.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TURTm79K1pI/AAAAAAAABa4/cjVNrneTiEk/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TURTm79K1pI/AAAAAAAABa4/cjVNrneTiEk/s400/07.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Como elegí guardar también el firmware, tarda un ratillo. Al guardar una copia de seguridad tenemos toda la configuración en un fichero, que nos servirá para restaurar en caso de desastre. Si queremos ver la configuración y no estamos conectados al atornillador, la copia de seguridad no nos sirve. Para eso tenemos la opción &lt;i&gt;Archivo-&amp;gt;Guardar célula de atornillado&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TURVE8hkrJI/AAAAAAAABbA/e25RAbPaeBI/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TURVE8hkrJI/AAAAAAAABbA/e25RAbPaeBI/s400/08.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Seleccionamos lo que queramos guardar.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hi9aumk7Vho/TURVZGHw_II/AAAAAAAABbI/7SMa8CKWKJc/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="263" src="http://3.bp.blogspot.com/_hi9aumk7Vho/TURVZGHw_II/AAAAAAAABbI/7SMa8CKWKJc/s400/09.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Y listo, ya tenemos los datos previos a salvo.&lt;br /&gt;
&lt;br /&gt;
Vamos a configurar la tarjeta IMpdp Profibus, para ello pulsamos sobre &lt;i&gt;Configurar el canal de atornillado&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TURWWRsilQI/AAAAAAAABbQ/IWdgUOEQkFM/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TURWWRsilQI/AAAAAAAABbQ/IWdgUOEQkFM/s1600/12.png" /&gt;&lt;/a&gt;&lt;/div&gt;Se abrirá la ventana donde saldrá la nueva tarjeta, en color rojo ya que no la hemos configurado.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TURW2qhZuMI/AAAAAAAABbY/b-mHI8AjiE4/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TURW2qhZuMI/AAAAAAAABbY/b-mHI8AjiE4/s400/15.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Nota: si no ves la tarjeta IMpdp haz doble clic sobre el icono de una carpeta bajo CS.&lt;br /&gt;
&lt;br /&gt;
Hacemos doble clic sobre la tarjeta y se abrirá la ventana de configuración.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hi9aumk7Vho/TURXeCHY3DI/AAAAAAAABbg/_RP_GPN4824/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_hi9aumk7Vho/TURXeCHY3DI/AAAAAAAABbg/_RP_GPN4824/s1600/13.png" /&gt;&lt;/a&gt;&lt;/div&gt;Seleccionamos IMpdp y aparecerán sus parámetros.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TURYFhJHRPI/AAAAAAAABbo/b_JAU6jyyiI/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TURYFhJHRPI/AAAAAAAABbo/b_JAU6jyyiI/s1600/14.png" /&gt;&lt;/a&gt;&lt;/div&gt;Aquí deberemos especificar la dirección Profibus (3), la cantidad entradas/salidas (16 estradas y 16 salidas), y la cantidad de datos recibidos (12 bytes) y enviados (32 bytes). Esta ha sido mi configuración, pero hay que adaptarla a cada caso. Con el botón &lt;i&gt;Crear archivo GSD&lt;/i&gt; se generará un archivo GSD con el que deberemos configurar la red Profibus.&lt;br /&gt;
&lt;br /&gt;
Enviamos la configuración recién creada con el botón &lt;i&gt;Enviar&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TURaKXZWLHI/AAAAAAAABbw/XREjjb0ypeE/s1600/100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TURaKXZWLHI/AAAAAAAABbw/XREjjb0ypeE/s1600/100.png" /&gt;&lt;/a&gt;&lt;/div&gt;Y desaparecerá el color rojo, con lo que nuestra configuración es correcta.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hi9aumk7Vho/TURak0lhoUI/AAAAAAAABb4/VdHq4cKbTfg/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://3.bp.blogspot.com/_hi9aumk7Vho/TURak0lhoUI/AAAAAAAABb4/VdHq4cKbTfg/s320/16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;El siguiente paso será especificar el contenido de los datos que se transmitirán en Profibus, para ello vamos al menú &lt;i&gt;Sistema-&amp;gt;Tabla de asignación PLC SE/CS&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hi9aumk7Vho/TURbmit2A2I/AAAAAAAABcA/gReFlmwuaeM/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://3.bp.blogspot.com/_hi9aumk7Vho/TURbmit2A2I/AAAAAAAABcA/gReFlmwuaeM/s400/17.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Para lo que pretendo hacer la configuración por defecto es suficiente con una salvedad: la señal de habilitación la asigno a la entrada 1.0, así desde el PLC podré habilitar el atornillador a voluntad. El resto de entradas me permitirán cambiar el número de programa de atornillado y acusar fallos. Para saber qué hace cada señal podemos dejar el puntero del ratón sobre cada una y saldrá una breve descripción. Con las salidas podremos obtener el número de programa seleccionado, saber si hay algún error, si el atornillador está listo, etc. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hi9aumk7Vho/TURdG1zBGKI/AAAAAAAABcQ/vOy7M3gx8bw/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://3.bp.blogspot.com/_hi9aumk7Vho/TURdG1zBGKI/AAAAAAAABcQ/vOy7M3gx8bw/s400/19.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Configuradas las entradas y salidas, vamos a especificar qué variables vamos a cominicar con el atornillador, para ello vamos al menú &lt;i&gt;Sistema-&amp;gt;Datos bus de campo CS&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TURd2xZwVpI/AAAAAAAABcY/Bo1wbMK2hjk/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TURd2xZwVpI/AAAAAAAABcY/Bo1wbMK2hjk/s400/20.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Seleccionamos las variables que necesitamos, en mi caso son el número de programa, par mínimo, par de apriete, par máximo, ángulo mínimo, ángulo de giro, ángulo máximo, código de error y tipo de error. En total 28 bytes, que cabe en los 32 que configuré.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TUWFI3DrAEI/AAAAAAAABcg/HxwPPQFUV2U/s1600/22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="343" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TUWFI3DrAEI/AAAAAAAABcg/HxwPPQFUV2U/s400/22.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Ya solo nos queda pulsar el botón enviar y ya tenemos el atornillador configurado.&lt;br /&gt;
&lt;br /&gt;
Por supuesto, en la completa documentación que viene con el atornillador (en formato PDF) está todo esto explicado en mayor profundidad.&lt;br /&gt;
&lt;br /&gt;
Como esta entrada se está alargando demasiado, dejaré para una &lt;a href="http://notasdeautomatizacion.blogspot.com/2011/02/comunicacion-profibus-entre-un.html"&gt;próxima&lt;/a&gt; la configuración de la red Profibus con el software de Siemens y algún ejemplo de programación.&lt;br /&gt;
&lt;br /&gt;
Como siempre, cualquier comentario será bienvenido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-1279905995325079124?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lgqvZkDc6OlX08z3BJW4RHYu-Hg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lgqvZkDc6OlX08z3BJW4RHYu-Hg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lgqvZkDc6OlX08z3BJW4RHYu-Hg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lgqvZkDc6OlX08z3BJW4RHYu-Hg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/R-FYMbCCfCg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/1279905995325079124/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2011/01/comunicacion-profibus-entre-un.html#comment-form" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/1279905995325079124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/1279905995325079124?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/R-FYMbCCfCg/comunicacion-profibus-entre-un.html" title="Comunicación Profibus entre un atornillador Rexroth CS351 y un PLC Siemens S7-300 (parte 1ª)" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hi9aumk7Vho/TUQxalFIm-I/AAAAAAAABaQ/86hUPQ_PsVk/s72-c/CS351_1.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2011/01/comunicacion-profibus-entre-un.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQBQXkzfCp7ImA9WhdRGEw.&quot;"><id>tag:blogger.com,1999:blog-226572436930860787.post-1862255029402000933</id><published>2010-12-02T17:20:00.005+01:00</published><updated>2011-08-08T17:45:50.784+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T17:45:50.784+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tiempo de ciclo" /><category scheme="http://www.blogger.com/atom/ns#" term="Step7" /><category scheme="http://www.blogger.com/atom/ns#" term="WinCC Flexible" /><category scheme="http://www.blogger.com/atom/ns#" term="Siemens" /><title>Visualización del tiempo ciclo con Step7 + WinCC Flexible</title><content type="html">Una de las cosas que, en mi opinión, no debe faltar en una máquina que disponga de panel de visualización, es una pantalla dedicada al tiempo ciclo. Es curioso ver como en muchas inspecciones de máquinas, el ingeniero de métodos y tiempos, cronómetro en mano, comprueba que nuestra máquina dé cadencia. Si en vez de eso, le damos una tabla de tiempos tomados de forma precisa por el PLC, le simplificaremos la labor y seguramente lo agradecerá... y ya sabemos que el ingeniero de métodos y tiempos es un tipo con el que conviene llevarse bien ;) &lt;br /&gt;
&lt;br /&gt;
Nota: entiéndase tiempo de ciclo como el tiempo que transcurre desde que obtenemos una pieza terminada y la siguiente.&lt;br /&gt;
&lt;br /&gt;
Para ello voy a suponer que mi máquina está comandada por un &lt;a href="https://www.automation.siemens.com/mcms/programmable-logic-controller/en/simatic-s7-controller/s7-300/Pages/Default.aspx"&gt;PLC S7-300&lt;/a&gt; y como &lt;a href="http://es.wikipedia.org/wiki/Interfaz_de_usuario"&gt;HMI&lt;/a&gt; tengo un panel táctil de &lt;a href="https://www.automation.siemens.com/"&gt;Siemens&lt;/a&gt; como el &lt;a href="https://www.automation.siemens.com/mcms/human-machine-interface/en/operator-interfaces/multi-panels/series-270/simatic-mp277-10inch-touch/Pages/Default.aspx?HTTPS=REDIR"&gt;MP277&lt;/a&gt;, y sobre esta base voy a programar lo que sería una visualización sencilla de los últimos diez tiempos de ciclo.&lt;br /&gt;
&lt;br /&gt;
En este ejemplo el PLC calculará el tiempo ciclo y mediante una variable booleana le indicará al panel que recoja el dato. Luego el panel leerá el dato y lo introducirá en una tabla de valores, los visualizará por orden de recepción (primero el más reciente) y marcará con color verde el menor y con color amarillo el mayor. La visualización quedará tal como se muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TPfBwlt0fxI/AAAAAAAABZY/YDain1bS9IQ/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TPfBwlt0fxI/AAAAAAAABZY/YDain1bS9IQ/s400/05.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Empecemos con la programación en el PLC. &lt;a name='more'&gt;&lt;/a&gt; He programado un bloque de función (FB) donde calculo el tiempo ciclo. Como entradas tiene una señal de habilitación &lt;b&gt;HABILIT&lt;/b&gt;, que es necesario activar para que se ponga a controlar (p. ej. solo interesa el tiempo ciclo en modo automático). A continuación debemos introducir una señal &lt;b&gt;CONTROL &lt;/b&gt;que se active una única vez al terminar cada ciclo de máquina. Podría ser, por ejemplo, un detector de pieza en salida, pero yo prefiero poner el estado final de la lógica de funcionamiento. El tiempo ciclo será el intervalo entre dos flancos positivos consecutivos en dicha señal. La entrada &lt;b&gt;T_LIMITE&lt;/b&gt; sirve para descartar tiempos ciclo muy altos (p. ej. si el operario salió a tomar el bocadillo), solo se considerarán los tiempos de ciclo inferiores. Si queremos visualizar todos, hay que poner aquí un tiempo suficientemente alto.&lt;br /&gt;
&lt;br /&gt;
En las salidas tenemos un booleano &lt;b&gt;PULSO&lt;/b&gt; que, cada vez que hay un nuevo tiempo de ciclo, da un pulso de dos segundos, que nos servirá para decirle al panel que recoja un nuevo dato. Finalmente en la salida &lt;b&gt;T_CICLO&lt;/b&gt; tendremos el tiempo de ciclo medido en milisegundos (formato TIME). Nótese que el tiempo de ciclo mínimo a medir será de dos segundos (más un pequeño margen de seguridad), en máquinas más rápidas este código no sirve.&lt;br /&gt;
&lt;br /&gt;
Una llamada al FB descrito puede ser como esta:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_hi9aumk7Vho/TPfB5czA5II/AAAAAAAABZc/Habgwe5s1Fs/s1600/00.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hi9aumk7Vho/TPfB5czA5II/AAAAAAAABZc/Habgwe5s1Fs/s1600/00.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Nota: los tiempos se gestionan internamente, el FB no consume temporizadores Simatic.&lt;br /&gt;
&lt;br /&gt;
Está programado en diagrama de contactos (KOP) y para incorporarlo a un proyecto de Step7 copia el siguiente código a un fichero fuente y compílalo:&lt;br /&gt;
&lt;blockquote&gt;FUNCTION_BLOCK FB13&lt;br /&gt;
TITLE =CONTROL TIEMPO CICLO&lt;br /&gt;
//http://notasdeautomatizacion.blogspot.com&lt;br /&gt;
VERSION : 0.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VAR_INPUT&lt;br /&gt;
HABILIT : BOOL ; //HABILITACIÓN&lt;br /&gt;
CONTROL : BOOL ; //SEÑAL DE CONTROL DE TIEMPO CICLO&lt;br /&gt;
T_LIMITE : TIME ; //TIEMPO MÁXIMO PARA CONSIDERAR UN TIEMPO CICLO&lt;br /&gt;
END_VAR&lt;br /&gt;
VAR_OUTPUT&lt;br /&gt;
PULSO : BOOL ; //PULSO PARA INDICAR UN NUEVO TIEMPO CICLO&lt;br /&gt;
T_CICLO : TIME ; //TIEMPO CICLO (EN MILISEGUNDOS)&lt;br /&gt;
END_VAR&lt;br /&gt;
VAR&lt;br /&gt;
PRIMER_CTRL : BOOL ; &lt;br /&gt;
FP_HABILIT : BOOL ; &lt;br /&gt;
FP_CTRL : BOOL ; &lt;br /&gt;
T_INI_CICLO : TIME ; &lt;br /&gt;
T_AUX_PULSO : TIME ; &lt;br /&gt;
END_VAR&lt;br /&gt;
VAR_TEMP&lt;br /&gt;
TIME_TICKS : TIME ; &lt;br /&gt;
END_VAR&lt;br /&gt;
BEGIN&lt;br /&gt;
NETWORK&lt;br /&gt;
TITLE =LECTURA DEL TIEMPO DEL SISTEMA&lt;br /&gt;
//EN MILISEGUNDOS TRASCURRIDOS DESDE EL ÚLTIMO ARRANQUE DEL PLC&lt;br /&gt;
CALL "TIME_TCK" (&lt;br /&gt;
RET_VAL                  := #TIME_TICKS);&lt;br /&gt;
NOP   0; &lt;br /&gt;
NETWORK&lt;br /&gt;
TITLE =PRIMER CONTROL&lt;br /&gt;
//CUANDO SE HABILITA NO SE TIENE EN CUENTA LA PRIMERA SEÑAL DE CONTROL&lt;br /&gt;
//(EL PRIMER TIEMPO CICLO SE DA CON LA SEGUNDA SEÑAL DE CONTROL)&lt;br /&gt;
U     #HABILIT; &lt;br /&gt;
FP    #FP_HABILIT; &lt;br /&gt;
S     #PRIMER_CTRL; &lt;br /&gt;
NETWORK&lt;br /&gt;
TITLE =SEÑAL DE CONTROL DE TIEMPO CICLO&lt;br /&gt;
//EL TIEMPO CICLO SE CALCULA ENTRE DOS FLANCOS POSITIVOS DE LA SEÑAL DE CONTROL&lt;br /&gt;
//CUANDO HAY UN NUEVO TIEMPO CICLO SE DA UN PULSO DE DOS SEGUNDOS&lt;br /&gt;
U     #CONTROL; &lt;br /&gt;
FP    #FP_CTRL; &lt;br /&gt;
U     #HABILIT; &lt;br /&gt;
=     L      4.0; &lt;br /&gt;
U     L      4.0; &lt;br /&gt;
UN    #PRIMER_CTRL; &lt;br /&gt;
=     L      4.1; &lt;br /&gt;
U     L      4.1; &lt;br /&gt;
SPBNB _001; &lt;br /&gt;
L     #TIME_TICKS; &lt;br /&gt;
L     #T_INI_CICLO; &lt;br /&gt;
-D    ; &lt;br /&gt;
T     #T_CICLO; &lt;br /&gt;
_001: NOP   0; &lt;br /&gt;
U     L      4.1; &lt;br /&gt;
SPBNB _002; &lt;br /&gt;
L     #TIME_TICKS; &lt;br /&gt;
T     #T_INI_CICLO; &lt;br /&gt;
_002: NOP   0; &lt;br /&gt;
U     L      4.1; &lt;br /&gt;
U(    ; &lt;br /&gt;
L     #T_CICLO; &lt;br /&gt;
L     #T_LIMITE; &lt;br /&gt;
&amp;lt;=D   ; &lt;br /&gt;
)     ; &lt;br /&gt;
=     L      4.2; &lt;br /&gt;
U     L      4.2; &lt;br /&gt;
SPBNB _003; &lt;br /&gt;
L     #TIME_TICKS; &lt;br /&gt;
L     T#2S; &lt;br /&gt;
+D    ; &lt;br /&gt;
T     #T_AUX_PULSO; &lt;br /&gt;
_003: NOP   0; &lt;br /&gt;
U     L      4.2; &lt;br /&gt;
BLD   102; &lt;br /&gt;
S     #PULSO; &lt;br /&gt;
U     L      4.0; &lt;br /&gt;
U     #PRIMER_CTRL; &lt;br /&gt;
=     L      4.1; &lt;br /&gt;
U     L      4.1; &lt;br /&gt;
SPBNB _004; &lt;br /&gt;
L     #TIME_TICKS; &lt;br /&gt;
T     #T_INI_CICLO; &lt;br /&gt;
_004: NOP   0; &lt;br /&gt;
U     L      4.1; &lt;br /&gt;
BLD   102; &lt;br /&gt;
R     #PRIMER_CTRL; &lt;br /&gt;
NETWORK&lt;br /&gt;
TITLE =PULSO DE LECTURA DE TIEMPO CICLO&lt;br /&gt;
//RESET AL PASAR DOS SEGUNDOS DESDE SU ACTIVACIÓN&lt;br /&gt;
U     #PULSO; &lt;br /&gt;
U(    ; &lt;br /&gt;
L     #TIME_TICKS; &lt;br /&gt;
L     #T_AUX_PULSO; &lt;br /&gt;
&amp;gt;=D   ; &lt;br /&gt;
)     ; &lt;br /&gt;
R     #PULSO; &lt;br /&gt;
END_FUNCTION_BLOCK&lt;/blockquote&gt;&lt;br /&gt;
Nota: si una vez compilado te falla la conversión de AWL a KOP, desactiva en las opciones del editor de Step7, en la pestaña FUP/KOP, la casilla &lt;i&gt;Comprobar los tipos de operandos&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Hasta aquí la parte de programación en el PLC, ahora vamos al WinCC Flexible.&lt;br /&gt;
&lt;br /&gt;
Lo primero será enlazar la variable del PLC que nos indicará que hay un nuevo tiempo ciclo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hi9aumk7Vho/TPfCdi-YvGI/AAAAAAAABZk/1clH0ftinwY/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="328" src="http://1.bp.blogspot.com/_hi9aumk7Vho/TPfCdi-YvGI/AAAAAAAABZk/1clH0ftinwY/s400/01.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Importante&lt;/b&gt;: en esta variable deberemos cambiar el modo de adquisición a &lt;i&gt;Ciclo continuo&lt;/i&gt;, para así ir obteniendo los tiempos incluso sin estar en la pantalla donde se utiliza.&lt;br /&gt;
&lt;br /&gt;
También debemos enlazar la variable donde hay que leer el tiempo de ciclo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TPfCe6ItnCI/AAAAAAAABZs/DesyxiyGD98/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TPfCe6ItnCI/AAAAAAAABZs/DesyxiyGD98/s400/03.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora crearemos dos tablas de variables (internas, sin conexión con el PLC) con la cantidad de tiempos de ciclo que queramos mostrar, en mi caso diez. La primera, &lt;b&gt;TIEMPOS&lt;/b&gt;, servirá para almacenar los tiempos de ciclo ordenados, en formato entero (16 bits) y la segunda, &lt;b&gt;MARCAR&lt;/b&gt;, voy a usarla para marcar los colores de la representación de los tiempos de ciclo mayor y menor.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TPfCfV3xd_I/AAAAAAAABZw/Fu83vJAgo7g/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TPfCfV3xd_I/AAAAAAAABZw/Fu83vJAgo7g/s400/04.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Creadas las variables necesarias, pasamos a la programación del script. Agregamos un script nuevo al proyecto (lo he llamado &lt;b&gt;TIEMPO_CICLO&lt;/b&gt;) y copiamos el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;'SE LLAMARÁ AL SCRIPT CADA VEZ QUE CAMBIE "PULSO CICLO"&lt;br /&gt;
'PERO SOLO SE AÑADIRÁ UN TIEMPO SI ES TRUE&lt;br /&gt;
If SmartTags("PULSO CICLO") = True Then&lt;br /&gt;
&lt;br /&gt;
Const NUM_TIEMPOS = 10 'NÚMERO DE TIEMPOS QUE SE ALMACENAN&lt;br /&gt;
&lt;br /&gt;
Dim INDICE 'ÍNDICE PARA RECORRER LOS TIEMPOS&lt;br /&gt;
Dim INDICE_CORTO 'ÍNDICE DEL TIEMPO MÁS CORTO&lt;br /&gt;
Dim INDICE_LARGO 'ÍNDICE DEL TIEMPO MÁS LARGO&lt;br /&gt;
&lt;br /&gt;
'HACEMOS SITIO EN LA TABLA DE TIEMPOS&lt;br /&gt;
'SE DESCARTA EL ÚLTIMO TIEMPO Y SE MUEVEN HACIA ABAJO&lt;br /&gt;
For INDICE = NUM_TIEMPOS - 1 To 1 Step -1&lt;br /&gt;
SmartTags("TIEMPOS")(INDICE) = SmartTags("TIEMPOS")(INDICE -1)&lt;br /&gt;
Next&lt;br /&gt;
&lt;br /&gt;
'SE ALMACENA EL TIEMPO CICLO ACTUAL COMO EL MÁS RECIENTE&lt;br /&gt;
'EN DÉCIMAS DE SEGUNDO&lt;br /&gt;
SmartTags("TIEMPOS")(0) = SmartTags("T_CICLO") / 100&lt;br /&gt;
&lt;br /&gt;
'BÚSQUEDA DE LOS TIEMPO MÁS CORTO Y MÁS LARGO&lt;br /&gt;
INDICE_CORTO = 0&lt;br /&gt;
INDICE_LARGO = 0&lt;br /&gt;
For INDICE = 1 To NUM_TIEMPOS - 1&lt;br /&gt;
If SmartTags("TIEMPOS")(INDICE) &amp;lt; SmartTags("TIEMPOS")(INDICE_CORTO) And _&lt;br /&gt;
SmartTags("TIEMPOS")(INDICE) &amp;gt; 0 Then&lt;br /&gt;
INDICE_CORTO = INDICE&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
If SmartTags("TIEMPOS")(INDICE) &amp;gt; SmartTags("TIEMPOS")(INDICE_LARGO) Then&lt;br /&gt;
INDICE_LARGO = INDICE&lt;br /&gt;
End If&lt;br /&gt;
Next&lt;br /&gt;
&lt;br /&gt;
'SI LOS ÍNDICE CORTO Y LARGO SON IGUALES NO SE HACE NADA&lt;br /&gt;
If INDICE_CORTO &amp;lt;&amp;gt; INDICE_LARGO Then&lt;br /&gt;
&lt;br /&gt;
For INDICE = 0 To NUM_TIEMPOS - 1&lt;br /&gt;
SmartTags("MARCAR")(INDICE) = 0 'FONDO BLANCO&lt;br /&gt;
&lt;br /&gt;
If INDICE = INDICE_LARGO Then&lt;br /&gt;
SmartTags("MARCAR")(INDICE) = 2 'FONDO AMARILLO&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
If INDICE = INDICE_CORTO Then&lt;br /&gt;
SmartTags("MARCAR")(INDICE) = 1 'FONDO VERDE&lt;br /&gt;
End If  &lt;br /&gt;
Next&lt;br /&gt;
&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
End If&lt;/blockquote&gt;&lt;br /&gt;
En el script debemos adaptar la constante &lt;b&gt;NUM_TIEMPOS&lt;/b&gt; al número de tiempos de ciclo que deseemos mostrar. Básicamente, lo que hace es ir incorporando, de manera ordenada, los tiempos de ciclo descartando el más antiguo. Como expresar el tiempo en milisegundos puede ser excesivo, se divide entre cien para mostrarlo en décimas de segundo. Luego se repasa la tabla de tiempos buscando el más breve y el más largo, asignando en el índice correspondiente de la tabla &lt;b&gt;MARCAR &lt;/b&gt;un uno si es el más breve o un dos si es el más largo (el resto se mantienen a cero).&lt;br /&gt;
&lt;br /&gt;
El siguiente paso es saber cuándo ejecutar el script, y para ello tenemos la variable &lt;b&gt;PULSO CICLO&lt;/b&gt; (o el nombre que le hayas asignado). Vamos a sus eventos y en &lt;i&gt;Cambio de valor&lt;/i&gt; asignamos nuestro script, así logramos que se ejecute cada vez que se detecte un pulso. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hi9aumk7Vho/TPfCeDr2KXI/AAAAAAAABZo/33SDO_P5SDM/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_hi9aumk7Vho/TPfCeDr2KXI/AAAAAAAABZo/33SDO_P5SDM/s400/02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora solo nos queda preparar nuestra pantalla de tiempos de ciclo, con diez (o los que hayamos programado) campos de salida:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hi9aumk7Vho/TPfCfyaJDbI/AAAAAAAABZ0/EPNrnVTNx5E/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_hi9aumk7Vho/TPfCfyaJDbI/AAAAAAAABZ0/EPNrnVTNx5E/s400/06.png" width="398" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Para que cambien los colores de fondo de la representación de los tiempos más largo y más corto, debemos activar para cada campo de salida &lt;i&gt;Animaciones -&amp;gt; Apariencia&lt;/i&gt; y asignar como variable &lt;b&gt;MARCAR &lt;/b&gt;con su índice correspondiente.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hi9aumk7Vho/TPfCc4oAmXI/AAAAAAAABZg/wjHGa2PeF2U/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_hi9aumk7Vho/TPfCc4oAmXI/AAAAAAAABZg/wjHGa2PeF2U/s400/07.png" width="397" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Y con esto ya tendríamos la visualización de tiempos de ciclo terminada.&lt;br /&gt;
&lt;br /&gt;
Me quedo con la sensación de que esta aplicación es más larga de explicar que de implementar. Es evidente que hay muchas maneras de mejorarla: se pueden guardar los tiempos en un histórico, representarlos gráficamente y lo que se nos ocurra (y nos permita el WinCC Flexible). Si alguien implementa alguna mejora o se le ocurre alguna manera más eficiente de hacer esto mismo, estaría encantado de echarle un vistazo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/226572436930860787-1862255029402000933?l=notasdeautomatizacion.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GEJXpcHCRCWZTyjTl-i0GsVKOmk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GEJXpcHCRCWZTyjTl-i0GsVKOmk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GEJXpcHCRCWZTyjTl-i0GsVKOmk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GEJXpcHCRCWZTyjTl-i0GsVKOmk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/NotasDeAutomatizacin/~4/POuAzuEWdfU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://notasdeautomatizacion.blogspot.com/feeds/1862255029402000933/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://notasdeautomatizacion.blogspot.com/2010/12/visualizacion-del-tiempo-ciclo-con.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/1862255029402000933?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/226572436930860787/posts/default/1862255029402000933?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NotasDeAutomatizacin/~3/POuAzuEWdfU/visualizacion-del-tiempo-ciclo-con.html" title="Visualización del tiempo ciclo con Step7 + WinCC Flexible" /><author><name>GR</name><uri>http://www.blogger.com/profile/16097531750734003921</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-u12f9JcyW8U/TkQz3hEXTAI/AAAAAAAAByg/peypSztCwk4/s220/path3002.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_hi9aumk7Vho/TPfBwlt0fxI/AAAAAAAABZY/YDain1bS9IQ/s72-c/05.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://notasdeautomatizacion.blogspot.com/2010/12/visualizacion-del-tiempo-ciclo-con.html</feedburner:origLink></entry></feed>

