Mensajes recientes

Páginas: 1 2 3 [4] 5 6 ... 10
31
STX8091 - Familia PLC Cube / Re:AYUDA: ruido eléctrico en entradas digitales?
« Último mensaje por Soporte junio 29, 2017, 13:53:00 pm »
Buenos días Guillermo,

3-Tengo 3 fuentes de DC; vinculé todos los GND y los conecte al chasis y a la puesta a tierra del tablero.

Si la fuente con que alimentas los reles externos o entradas digitales, es diferente a la del PLC, no compartas la masa. Ya que no es utilizada entre ambos y esto mejora la aislación.

4-Los variadores tienen una conexión del chasis a GND, pero creo que es en AC. (Se entiende?) Es conveniente unir las tierras/masas AC y DC??

No, la masa de AC no debe compartirse con la de DC, ya que las perturbaciones en la linea de AC estaran disponibles en la linea de DC.

No logro dar con el problema de "ruido" y empiezo a pensar si no habrá un problema de formatos o "representación" numéricos en la comparación del valor analógico leído y el set point...

Si, me pone en duda, de si es un tema de soft o externo.

Algo a considerar es como guardas los datos en EEPROM, es conveniente que si llamas varias veces seguido a las funciones de escritura, entre cada llamado exista un pequeño delay, ya que la EEPROM suele ser más lenta que el Microporcesador para guardar un dato, por lo tanto mientras intentas guardas el siguiente dato con una llamada write, el dato anterior todavía esta en proceso de guardarse e interrumpa el proceso. Esto es muy rápido, pero puede ser una posibilidad, ya que esta en el orden de los mili-segundos.

Entonces, entre cada escritura podrías agregar un pequeño delay de seguridad:

DelayMS(50)
EepromWriteCells()
DelayMS(50)
EepromWriteCells()


Inicialmente se calibran los actuadores: se los hace recorrer a todos desde el final de carrera 0% hasta el final de carrera 100%, se toman los valores de potenciómetro "inicial" y "final", se restan y se dividen por 10, obteniéndose un valor de "escalón" para cada actuador.

....PORCIÓN RUTINA CALIBRADO....

for(new i=1;i<=5;i++) STEPS=Float:(POT_Fin-POT_Inicio)/10

         EepromWriteCells(52,6,STEPS)
         EepromWriteCells(76,6,POT_Inicio)

¿ Usas valores Float para guardar en EEPROM ? Entonces dos notas:

1)

Para guardar en EEPROM, podes guardar el float normalmente, por ejemplo:

Código: (Pawn) [Seleccionar]
EepromWriteCells(Address, Len, FloatValues[])
Para recuperar los valores floats:

Código: (Pawn) [Seleccionar]
EepromReadCells(Address, Len, ValuesTemp)
Y luego convertís a Float:

Código: (Pawn) [Seleccionar]
FloatValue[x] = Float: ValuesTemp[x]
2) Conviene usar constantes como direcciones para guardar en memoria EEPROM, ya que evita que luego te confundas con los números o que estés sobre-escribiendo alguna dirección.

Código: (Pawn) [Seleccionar]
#define EEPROM_STEPS_INDEX_ADDRESS       (52)
EepromWriteCells(EEPROM_STEPS_INDEX_ADDRESS,6,STEPS)

....PORCIÓN RUTINA CALIBRADO....

El usuario puede elegir entre estos 11 escalones (0 incluido!) mediante el HMI para determinar la posición del actuador. La siguiente linea de codigo calcula el setpoint

for(new i=1;i<=5;i++) SetPoint_Compuertas=FloatToInt(X[i+1]*STEPS) + POT_Inicio // + Offset!

El vector X contiene los numeros del 0 al 10.

Esta bien el indice X[i+1] ?. No deberia ser X ?. Solamente comento, ya que probablemente tenga que ver con otro código y sea correcto.

      
         if(POTENCIOMETRO<=SetPoint_Compuertas) OpenClose=0
         else OpenClose=1
      
         if(!OpenClose)
            {
            //Abrir
            while(POTENCIOMETRO<=SetPoint_Compuertas)
             {
               
               if(DinReadFiltered(i))
               {
                  LedOn()
                  break    //Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
               DoutSetOn(Salida)
             }
            DoutSetOff(Salida)
            }   
         else
            {
            //Cerrar
            while(POTENCIOMETRO>=SetPoint_Compuertas)
             {
               
               if(EXT_DinReadFiltered(i))
               {
                  LedOn()
                  break//Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
                Stx570_DoutSet(0, Salida)
               
             }
             Stx570_DoutClr(0, Salida)
         }
         

Otro posibilidad es que se induzca alguna tensión al momento de leer el canal analógico en el cable y te de una lectura falsa, invalidandote la lógica.
Esto suponiendo que en laboratorio te anduviera bien.

Un capacitor de 100 nF o mas, entre VIN y AGND, puede hacer mas lenta la entrada analógica respecto a cambios bruscos de tensión.

La conversión AD devuelve un SIGNED de 12 bits, que puede ser complemento a 0. El valor de Setpoint se almacena en una variable cell de 32bits. Y los datos de la EEPROM son de tipo cell, 32bits. Es posible que exista algun error de truncado, conversión, formato, y que esto lleve a una comparación errónea en el programa??

Si usas el rango 0 a 10V o 0 a 5V de las entradas, no hay complemento a dos en la conversión, ya que no lees valores de tensión negativos. Así mismo toda la lectura es en 12 bits, que cabe en los 32-bits. Pero si debes prestar atención si guardas en EEPROM tipo float, para recuperarlo correctamente como te expliqué.

Bueno, si ves que seguís sin dar con mejora, avísame y tengo reles des estado solido para que conectes en los actuadores, estos aíslan el PLC de los motores de CC.

Saludos
32
STX8081 - Familia Power I/O Board / Consulta por emails (nuevo firmware)
« Último mensaje por PabloGa junio 29, 2017, 13:24:32 pm »
Hola Boris buenas tardes,

Hace unos días trás actualicé la versión de firmware de mi PLC (estaba en 223 y pasé a 224). Todo estaba funcionando bien, y sigue funcionando bien después de la actualización. Actualicé simplemente para tener instalado "lo último".

Lo único que encontré de diferente es que los emails ahora me llegan con un "pie de email", con el siguiente formato:

AQUI VIENE MI TEXTO DEL MAIL.
y lo que sigue lo agrega el PLC ???
--

PLC
miemail@gmail.com


Aparentemente, la nueva versión de Fw le agrega este "pie de email", o se me está agregando por algún otro lado (Gmail?). Tendrá que ver con lo incluído en Build 224 "Correción para envio de mails con función SmtpSimple(), adaptado para mejorar calidad del mail y no ser considerado SPAM."

La verdad es que me gustaba más antes (sin el agregado...). O yo puedo configurar para que el "pie" salga o no salga?

Saludos !
Pablo.

33
STX8091 - Familia PLC Cube / Re:AYUDA: ruido eléctrico en entradas digitales?
« Último mensaje por guille junio 28, 2017, 17:45:43 pm »
Hola Boris,

después de probar las siguientes configuraciones:

1-RC 100ohm 10uF entre relays y actuadores - Diodo 1N4007 entre PLC y relays

2-RC 100ohm 10uf en entrada de finales de carrera inductivos - Diodo 1N4007 entre PLC y relays.

3-Tengo 3 fuentes de DC; vinculé todos los GND y los conecte al chasis y a la puesta a tierra del tablero.

4-Los variadores tienen una conexión del chasis a GND, pero creo que es en AC. (Se entiende?) Es conveniente unir las tierras/masas AC y DC??

No logro dar con el problema de "ruido" y empiezo a pensar si no habrá un problema de formatos o "representación" numéricos en la comparación del valor analógico leído y el set point...

Inicialmente se calibran los actuadores: se los hace recorrer a todos desde el final de carrera 0% hasta el final de carrera 100%, se toman los valores de potenciómetro "inicial" y "final", se restan y se dividen por 10, obteniéndose un valor de "escalón" para cada actuador.

....PORCIÓN RUTINA CALIBRADO....

for(new i=1;i<=5;i++) STEPS=Float:(POT_Fin-POT_Inicio)/10

         EepromWriteCells(52,6,STEPS)
         EepromWriteCells(76,6,POT_Inicio)

....PORCIÓN RUTINA CALIBRADO....

El usuario puede elegir entre estos 11 escalones (0 incluido!) mediante el HMI para determinar la posición del actuador. La siguiente linea de codigo calcula el setpoint

for(new i=1;i<=5;i++) SetPoint_Compuertas=FloatToInt(X[i+1]*STEPS) + POT_Inicio // + Offset!

El vector X contiene los numeros del 0 al 10.

Cuando se da arranque al programa, y remitiéndome al codigo anterior,
Citar

      for(new i=1;i<=5;i++)
      {
         POTENCIOMETRO=VinRead(i+3)
      
         LedOff()
         
         /////////////////////////DEBUG/////////////////////////////////////
         debug_point:
              if(!DinValue(DIN13)) goto debug_point
         ///////////////////////////////////////////////////////////////////

         BitSet(Salida,i-1)
            
         if(POTENCIOMETRO<=SetPoint_Compuertas) OpenClose=0
         else OpenClose=1
      
         if(!OpenClose)
            {
            //Abrir
            while(POTENCIOMETRO<=SetPoint_Compuertas)
             {
               
               if(DinReadFiltered(i))
               {
                  LedOn()
                  break    //Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
               DoutSetOn(Salida)
             }
            DoutSetOff(Salida)
            }   
         else
            {
            //Cerrar
            while(POTENCIOMETRO>=SetPoint_Compuertas)
             {
               
               if(EXT_DinReadFiltered(i))
               {
                  LedOn()
                  break//Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
                Stx570_DoutSet(0, Salida)
               
             }
             Stx570_DoutClr(0, Salida)
         }
         
         BitClr(Salida,i-1)
         
        /////////////////////////DEBUG/////////////////////////////////////
         debug_point2:
         if(!DinValue(DIN13)) goto debug_point2
             ///////////////////////////////////////////////////////////////////
         

      }

La conversión AD devuelve un SIGNED de 12 bits, que puede ser complemento a 0. El valor de Setpoint se almacena en una variable cell de 32bits. Y los datos de la EEPROM son de tipo cell, 32bits. Es posible que exista algun error de truncado, conversión, formato, y que esto lleve a una comparación errónea en el programa??

Agradezco tu ayuda ya que realmente no logro encontrar cual es el problema.

Saludos!

Guillermo.
34
Wecon / Introducción
« Último mensaje por Soporte junio 17, 2017, 12:59:31 pm »
Realice en este foro las consultas especificas del Panel HMI Wecon Touchscreen al utilizarlo con nuestra línea de PLC.

  • Uso del software de diseño.
  • Interacción con el PLC.
  • Ejemplos de conexión con el PLC.
  • Información general, etc...

35
Kinco / Introducción
« Último mensaje por Soporte junio 17, 2017, 12:56:43 pm »
Realice en este foro las consultas especificas del Panel HMI Kinco Touchscreen al utilizarlo con nuestra línea de PLC.

  • Uso del software de diseño.
  • Interacción con el PLC.
  • Ejemplos de conexión con el PLC.
  • Información general, etc...

36
STX8081 - Familia Power I/O Board / Re:uso de sql server
« Último mensaje por Soporte junio 12, 2017, 18:54:10 pm »
Buenas tardes Daniel,

Seguramente en tu servidor MySQL, debes tener un servidor web con soporte PHP.

En este caso, lo que podes hacer es utilizar el Cliente Web del PLC, para enviar una petición GET o POST al Servidor Web.

Con la petición GET o POST, lo que haces es enviar una cadena al servidor del tipo:

field1=valor&field2=valor&field3=valor&field4=valor

A modo de ejemplo, esta cadena la podes recibir con el lenguaje PHP del servidor y obtener los valores correspondientes por ej: field1=valor.

Una vez que tenes el valor, usar el mismo lenguaje PHP del servidor para llamar a MySQL e insertar datos en la base de datos (sobre esto hay mucha bibliografia y ejemplos en internet).

La nota de aplicación para usar el Cliente Web del PLC es la AN032.

Allí se explica como recibir los datos de peticiones GET o POST con PHP en un Servidor Web y se da un ejemplo.
Lo único que te queda es insertar en la base de datos, lo cual es parte del lenguaje PHP.

Debes tener actualizado el firmware del PLC a la ultima versión para utilizar las funciones.

Saludos
37
STX8081 - Familia Power I/O Board / uso de sql server
« Último mensaje por DanielS junio 12, 2017, 16:52:34 pm »
Buenas tardes,  hace algunos años que uso PLC de Slicetex. con placa de expansion de entradas. logrando ademas controlar inverter, entradas y sensores.  todo ello con el fin de la fabricación de una determinada pieza.  usamos ademas HMI virtual en una PC que colecta informacion, ademas del envio diario de un mail con estadisticas.-

veo muy util la implementacion del envio de datos a un servidor que corra SQL Server, con el fin de almacenar las condiciones en que fue generada determinada pieza, poder establecer un historial de cada una. guardar datos para que luego manejado con alguna rutina de visual  podamos realizar estadisticas mas detalladas.

Tal vez el tema ya fue propuesto o no, es solo poder hacer un insert en un determinado campo de la sql con determinadas variables que necesitemos almacenar.

Seguramente haya algun metodo alternativo, del cual desconozco.


Una Mejora superadora.

Gracias por el soporte.

Daniel
38
Weintek - Weinview / Re:Objeto Ascii
« Último mensaje por Soporte junio 08, 2017, 17:49:07 pm »
Es posible guardar 12 caracteres en una variable de un solo registro

algo como
new OT[1]

MbServGetRegisters(40009, 1, Ort, 0)

¿Obtener los caracteres escritos por el HMI en el PLC?

Bien, primero debes entender que 12 caracteres para poder almacenarse como cadena en el PLC, necesitan una variable o array de 12 elementos en el PLC, más un elemento de finalización con el valor cero que marca el "fin" de la cadena.

Entonces, necesitarías declarar una variable de 13 elementos asi:

Código: (Pawn) [Seleccionar]
new StringOT[12+1]   // Le agregué el texto "String" para que sepamos que contienen una cadena y puse una suma para ser explicito.
Por lo tanto, si queres almacenar la cadena "HOLA MUNDO!!" de 12 caracteres, podrías hacerlo de la siguiente forma:

Código: (Pawn) [Seleccionar]
StringOT[0]='H'
StringOT[1]='o'
StringOT[2]='l'
StringOT[3]='a'
StringOT[4]=' '
StringOT[5]='M'
StringOT[6]='u'
StringOT[7]='n'
StringOT[8]='d'
StringOT[9]='o'
StringOT[10]='!'
StringOT[11]='!'
StringOT[12]=0  // Valor cero de finalización.

Otro método alternativo (no utilizado acá), que solo sirve al inicializar el array es:

Código: (Pawn) [Seleccionar]
new StringOT[]="Hola Mundo!!"   // Aqui el tamaño y el cero al final se asignan automáticamente.
Con esto en mente, si en el HMI cargamos la cadena "Hola Mundo!!" a partir de la dirección 40009, nos quedaría:

40009 = "Ho"
40010 = "la"
40011 = " M"
40012 = "un"
40013 = "do"
40014 = "!!"


Desde el PLC podríamos obtenerla de la siguiente forma, leyendo 6 registros a partir de la dirección 40009:

Código: (Pawn) [Seleccionar]
   new Buffer[12]
   MbServGetRegisters(40009, 6, Buffer, 0)

Pero esto nos deja en "Buffer[]" los 6 elementos, y cada elemento con dos caracteres, ya que el HMI guarda dos por registro.

Buffer[0] = "Ho"
Buffer[1] = "la"
Buffer[2] = " M"
Buffer[3] = "un"
Buffer[4] = "do"
Buffer[5] = "!!"


Entonces tenemos que desempaquetarlo, para pasarlo a un modo "normal".

Como en Buffer[0] tenemos los caracteres "Ho", cada uno en un byte diferente, entonces, tenemos que separarlos.

Esto lo podemos hacer asi:

Código: (Pawn) [Seleccionar]
new Text[12+1]

// Toma Buffer[0] y hace cero todo, excepto el byte inferior (obtengo primer caracter "H").
Text[0] = Buffer[0] & 0xFF

// Toma Buffer[0], desplaza 8 bits a la derecha para mover el byte superior al byte inferior,
// y luego hace cero todo, excepto el byte desplazado (obtengo segundo caracter "o").
Text[1] = (Buffer[0] >> 8) & 0xFF

Y nos queda:

Text[0] = "H"
Text[1] = "o"




Todo esto se puede automatizar con una función "genérica" auxiliar:

GetHmiString(): Obtiene una cadena guardada por el HMI a partir de un registro ModBus.

ARGUMENTOS:

  • Address = Dirección ModBus donde esta la cadena (ej: 40009)
  • Qty = Cantidad Maxima de registros ModBus a leer (ej: valor 6, implica 12 caracteres)
  • Text[] = Array o cadena resultante en PLC, debe ser de una longitud minima Qty*2+1.

Código: (Pawn) [Seleccionar]

GetHmiString(Address, Qty, Text[])
{
   new Buf[40]
   MbServGetRegisters(Address, Qty, Buf, 0)
   
   for(new i=0; i<Qty; i++)
   {
      Text[i*2] = Buf[i] & 0xFF
      Text[i*2+1] = (Buf[i] >> 8) & 0xFF
   }
   
   // Fin de cadena, ultima posicion.
   Text[Qty*2]=0
}



Volviendo al ejemplo que propones y usando la función GetHmiString() que te escribo, te quedaría para leer 12 caracteres:

Código: (Pawn) [Seleccionar]
new OT[12+1]

GetHmiString(40009, 6, OT)

Listo, ya tenes la cadena en OT[ ].

Te adjunto tu programa modificado con esta función, donde imprimo como cadena en Virtual-HMI (192.168.1.81) lo que recibo del Objeto ASCII en registro 40017 (para verificar el método).

Lo importante es que entiendas como se guarda todo en memoria, puede costar entenderlo, pero es simple si encapsulas todo en funciones y así se evitan errores.

Saludos
39
Weintek - Weinview / Re:Objeto Ascii
« Último mensaje por InduxSA junio 08, 2017, 17:45:14 pm »
Si es lo que preguntaba,

Es posible guardar 12 caracteres en una variable de un solo registro

algo como
new OT[1]

MbServGetRegisters(40009, 1,Ort,0)

Saludos
40
Weintek - Weinview / Re:Objeto Ascii
« Último mensaje por Soporte junio 08, 2017, 17:22:57 pm »
El problema no lo tengo en los registros 40001 , 40002, 40018, el problema esta en los registros 40017 y 40018 de la ventana 011.

Lo que me sucede es que al ingresar un dato en cualquiera de los dos objetos una parte de los datos ingresados se muestran en el otro objeto, por ejemplo si ingreso W3311S94055 en el registro 40017 al presionar enter aparece 11S94055 en el registro 40018.

Mira, te adjunto una imagen probando tu programa (sin modificar nada):



Cada objeto ASCII según especificas en el diseño del HMI, tiene una longitud máxima de 8 registros, y como cada registro tiene 2 bytes, podes guardar hasta 16 caracteres ASCII.

En la imagen de arriba cargo 16 caracteres "1234567890123456" (8 registros) en el primer objeto y el HMI los escribe en el PLC a partir de la dirección 40017.

Luego el segundo objeto ASCII los lee a partir de la dirección 40018, es decir, empieza 1 registro después o 2 caracteres después.

Por lo tanto mostrará "34567890123456" como se aprecia en la imagen.

Para que sea mas claro:

En el PLC queda en cada registro cuando ingresas la cadena en 40017:

REGISTRO        VALOR
40017        12
40018        34
40019        56
40020        78
40021        90
40022        12
40023        34
40024        56

Por lo que es correcto ese comportamiento truncado que observas.

Decime si es esto responde a tu pregunta o es otra cosa.

Saludos



 
Páginas: 1 2 3 [4] 5 6 ... 10