Mensajes recientes

Páginas: 1 ... 7 8 [9] 10
81
STX8091 / Entradas digitales DIN7 y DIN8
« Último mensaje por EBD mayo 09, 2019, 00:08:26 am »
Buenas,

Mi situación es la siguiente:
Tengo un módulo que trabaja con 5V digitales para operar y necesita comunicarse con el PLC a través de alguna entrada digital, por lo que es necesario polarizar las entradas con (DIC+)=5V. Sin embargo, al utilizar 5V de polarización me inhabilita a usar las entradas DIN7 y DIN8 ya que la tensión mínima de polarización para estas dos entradas es de por lo menos 7V.
Esto me genera un problema ya que necesito todas las entradas del PLC.

Quería saber la razón para que las entradas DIN7 y DIN8 sean distintas a las demás y si tiene alguna solución sencilla para poder utilizar todas las entradas en este contexto.

Desde ya muchas gracias.
Saludos.
82
STX8091 / Re:control de temperatura y presion en el tiempo
« Último mensaje por Soporte mayo 07, 2019, 18:25:55 pm »
hola boris, como estas? disculpa las molestias, necesito realizar un control de temperatura y presion colocando un setpoint en ambas variables y tambien en el tiempo, me vendria perfecto hacerlo con un control PID, pero no el soft no cuenta con el modulo, podrias darme una mano para realizarlo? estoy trabajando con un stx8092 y una pantalla kinco, desde ya muchas gracias

Buenas tardes.

Coméntame, ¿cómo estás leyendo la temperatura y presión?.

Además, para controlar el sistema, ¿utilizarías una salida relé para modificar la temperatura o presión?.

¿Qué lenguaje estás utilizando?.

Gracias, Saludos!
83
STX8091 / Control PID de temperatura y presión en el tiempo
« Último mensaje por Mecatronico26 mayo 07, 2019, 10:55:49 am »
hola boris, como estas? disculpa las molestias, necesito realizar un control de temperatura y presion colocando un setpoint en ambas variables y tambien en el tiempo, me vendria perfecto hacerlo con un control PID, pero no el soft no cuenta con el modulo, podrias darme una mano para realizarlo? estoy trabajando con un stx8092 y una pantalla kinco, desde ya muchas gracias
84
STX8091 / Re:Empaquetado de bytes (convertir a Float)
« Último mensaje por Soporte mayo 03, 2019, 19:26:53 pm »
Buenas tardes Pedro,

Frente a esta situación, decidí hacer uso de la función PackBytes(Src[], SrcIdx, Dst[], DstIdx, Count). Lo primero que hice fue probar el ejemplo que se encuentra en el Manual de Programación Pawn del PLC en la pagina 175 y obtengo el siguiente error:

Error del compilador PAWN: PlcMain.p(72) : error 035: argument type mismatch (argument 3)

Ese error lo da porque la función espera que Dst[] sea un array, y en tu programa "Dst" la tenés declarada como variable, si la declaras como array de un solo elemento 'new Dst[1]' el error se va.

Valor=(RxData[8]*(2^24))+RxData[8]*(2^16)+(RxData[5]*(2^7))+RxData[6]

La forma correcta de esa línea de código seria utilizando operaciones de bits, con desplazamientos "<<" y OR's "|", como te muestro a continuación:

Código: (Pawn) [Seleccionar]
Valor=(RxData[8]<<24)|(RxData[7]<<16)|(RxData[6]<<8)|(RxData[5])
Así mismo, para esto existe la función nativa "Float: PackInt16ToFloat(Int16Low, Int16High)" que empaqueta dos variables que contengan cada una un registro de 16-bits y retorna su equivalente Float. Donde Int16Low es el registro ModBus con los dos bytes menos significativos e Int16High es el registro ModBus con los dos bytes más significativos.

Ejemplo:

Código: (Pawn) [Seleccionar]
   new Float: Value

   // Empaquetar/Unir 2 enteros de 16-bits en un Float de 32-bits.
   Value = PackInt16ToFloat(Reg16Low, Reg16High)

Donde Reg16Low es el registro ModBus con los bytes menos significativos y Reg16High el registro con los bytes más significativos.

Si estás leyendo de a Bytes, solo debes empaquetar los bytes para formar dos valores de 16-bits:

Código: (Pawn) [Seleccionar]
   Value = PackInt16ToFloat(((RxData[1]<<8)|(RxData[0])), ((RxData[3]<<24)|(RxData[2]<<16)))
Hay muchas formas de hacer esto, pero te pasé las más directas.

Te adjunto un proyecto que ejemplifica las funciones de conversión de bytes y tipos de datos.

Te recomiendo tener instalada última versión de firmware y software.

Si algo no queda claro, quedo a disposición.

Saludos!
85
STX8091 / Empaquetado de bytes (convertir a Float)
« Último mensaje por Pedro1 mayo 03, 2019, 14:06:34 pm »
Hola Boris,
Estoy desarrollando un programa que recibe una cierta cantidad de bytes a través del protocolo ModBus provenientes de un sensor de pH. De los 21 bytes que recibo del sensor, solo son de interés 4. Es decir, estoy recibiendo el valor de pH en 4 bytes separados (debido a que utiliza un formato punto flotante de precisión simple) y debo empaquetarlos ordenadamente para luego obtener el valor final de la medida.
En un primer momento, multiplique el byte mas significativo por 2^24 para luego sumarle el segundo byte mas significativo multiplicado por 2^16 y de la misma manera con los 2 bytes menos significativos. Sin embargo, no obtuve los resultados esperados.
Frente a esta situación, decidí hacer uso de la función PackBytes(Src[], SrcIdx, Dst[], DstIdx, Count). Lo primero que hice fue probar el ejemplo que se encuentra en el Manual de Programación Pawn del PLC en la pagina 175 y obtengo el siguiente error:

Error del compilador PAWN: PlcMain.p(72) : error 035: argument type mismatch (argument 3)

Te adjunto el código del programa completo.

Código: [Seleccionar]
PlcMain()
{
VirtualHmiInit()
// Direccion del servidor o esclavo ModBus.
#define SLAVE_ADDR (1)
// Crear variable que indica si esperamos una respuesta del Servidor.
new WaitResponse = 0
// Variable para almacenar datos.
new RxData[21]
// Crear variable para almacenar estado.
new MbStat
// Definir un array de 4 celdas, y en cada celda almacenar un carácter.
new Src[4]
// Variable de destino tipo celda.
new Dst

// Inicializar Cliente ModBus RTU.
// Velocidad 9600 bps, formato 8E1, timeout 10 segundos, interface RS232.
MbRtuClInit(19200, SERIAL_8N2, 10, MB_RTU_INTERFACE_RS485)

for(;;)
   {
 // Realizar transaccion ModBus si DIN5 = 1.
   if(WaitResponse == 0)
      {
      // Enviar peticion para leer "Holding Registers".
      if(MbRtuClSendReadHoldingReg(SLAVE_ADDR, 2089, 10) < 0)
         {
         // Error en transmision.
         }
      else
         {
         WaitResponse = 1
         }
       }

   // Obtener Estado de Libreria.
   MbStat = MbRtuClGetLibStatus()

   // Comprobar si llego respuesta del Server.
   if(MbStat == 0 && WaitResponse == 1)
      {
       // Si, leer registros recibidos.
       //MbRtuClGetRxReg(RxData, 0, 2, 0)
       MbRtuClGetRxBytes(RxData, 0, 21, 0)
       // Mostrar valores de registros en LCD.

       // Intento de empaquetar los bytes
       //Valor=(RxData[8]*(2^24))+RxData[8]*(2^16)+(RxData[5]*(2^7))+RxData[6]
       
     
       // Definir un array de 4 celdas, y en cada celda almacenar un carácter.
       Src[0] = RxData[7]
       Src[1] = RxData[8]
       Src[2] = RxData[5]
       Src[3] = RxData[6]
       // Empaquetar 4 bytes del array Src[] en variable llamada Dst:
       PackBytes(Src, 0, Dst, 0, 4)

       nLcdPrintf(0, 0, LCD_CLRALL, "%d %d", RxData[0], Dst)
       nLcdPrintf(0, 1, LCD_NONE, "%x %x %x %x %x", RxData[1],RxData[2],RxData[3],RxData[4],RxData[5])
       nLcdPrintf(0, 2, LCD_NONE, "%x %x %x %x %x", RxData[6],RxData[7],RxData[8],RxData[9],RxData[10])
       nLcdPrintf(0, 3, LCD_NONE, "%x %x %x %x %x", RxData[11],RxData[12],RxData[13],RxData[14],RxData[15])
       nLcdPrintf(0, 4, LCD_NONE, "%x %x %x %x %x", RxData[16],RxData[17],RxData[18],RxData[19],RxData[20])
       WaitResponse = 0
      }
     DelayS(5)
 // Comprobar errores.
    if(MbStat < 0)
      {
       // Error!... ver código de error en MbStat.
       WaitResponse = 0
      }
   }
}

Espero tu respuesta.

Saludos y gracias!

86
STX8091 / Re:Agregar nuevo Cliente PLC al servidor TCP
« Último mensaje por Soporte abril 29, 2019, 17:42:42 pm »
Buenas tardes Mariano, paso a contestarte a continuación:

Necesiraría información sobre el evento OnTcpServerRx().
Hay alguna nota de aplicación que explique las funciones disponibles y relacionadas a este evento?

Aquí te paso el link donde están las funciones descriptas:

http://foro.slicetex.com/index.php?topic=165.msg780#msg780

Y dos ejemplos:

http://foro.slicetex.com/index.php?topic=165.msg775#msg775

http://foro.slicetex.com/index.php?topic=165.msg776#msg776

Tengo pendiente crear el PDF en la nota de aplicación.

Aquí (OnTcpServerRx()) entiendo que se procesa la recepción de datos de clientes remotos. Por ahora tengo un sólo cliente y lo que quiero es agregar un segundo. Quisiera saber como identificar en el programa del server cual es el cliente que se está conectando.

Si, cada vez que se reciben nuevos datos, se llama al evento OnTcpServerRx().

Como el servidor TCP puede manejar más de un cliente, la única forma que tenés de identificarlo, es conociendo su "ID" (identificador), un número mayor a cero.

Este "ID" es el que usas para comunicarte con los clientes conectados, actualmente el PLC admite dos conexiones, es decir 2 números ID, 1 y 2 (esto se puede aumentar si en necesario). Por lo que para comunicarte con los clientes, solo debes usar el ID en las funciones.

Cuando recibis datos es fácil, porque desde el evento obtenes los ID de conexiones que tienen datos nuevos, y usas esos ID para enviar una repuesta.

Para transmitir asincrónicamente (es decir cuando se te ocurra desde el servidor), es conveniente que compruebes que el ID pertenece a una conexión abierta (ya que el cliente puede haber cerrado la conexión).

Los ID (1 y 2, por ejemplo), pueden pertenecer a cualquier cliente conectado. Si lo que querés es mostrar en el Webserver, algo más especifico, podés hacer que cada PLC al transmitir datos especifique en un byte un número propio, entonces sabes de donde viene y los datos recibidos los podes identificar de uno u otro PLC, y a su vez darle una repuesta especifica.

Si sabés de que PLC viene, podes ir almacenando esos datos en una variable especifica y mostrar en el servidor web.

Generalmente, las aplicaciones cliente-servidor TCP, son del tipo:

Cliente envia Mensaje -> Servidor (procesa mensaje) -> Respuesta al cliente desde el servidor.

Esto es para que organices de esa forma el programa y te sea más fácil administrar varios clientes.


El código completo de este evento del server es:

Código: [Seleccionar]
@OnTcpServerRx()
{
// new Identidad se definio en globales
// Obtener conexiones con datos sin leer.

while((Identidad=TcpServerGetUnreadId()) > 0)
{       
// Leer 2 datos y almacena en RxData[].
TcpServerRead(Identidad, RxData, 2)
if(RxData[0] == 0){
   DoutSetOff(DOUT1); //DOUT1 Led que corresponde a Bomba3
                   TcpServerSend(Identidad, TxData, 2);
                }
if(RxData[0] == 1){
                   DoutSetOn(DOUT1);
                   TcpServerSend(Identidad, TxData, 2);
                }
         }
}

Entiendo que en la variable Identidad (definida como global), debería encontrarse cual es el cliente conectado; si es así no sé como podría manipularla para mostrarla en el web server por ejemplo.

Claro, el evento se dispara porque hay un dato nuevo recibido, y con TcpServerGetUnreadId() buscás el ID (o conexión) que tiene datos recibidos sin leer. Luego usas ese ID, para transmitir una repuesta.

No es complicado, pero si tenés duda quedo a disposición.

Saludos!
87
STX8091 / Agregar nuevo Cliente PLC al servidor TCP
« Último mensaje por Mariano abril 28, 2019, 20:16:19 pm »
Estimado Boris, buenas noches,

Necesiraría información sobre el evento OnTcpServerRx().

Aquí entiendo que se procesa la recepción de datos de clientes remotos. Por ahora tengo un sólo cliente y lo que quiero es agregar un segundo. Quisiera saber como identificar en el programa del server cual es el cliente que se está conectando.
El código completo de este evento del server es:

Código: [Seleccionar]
@OnTcpServerRx()
{
// new Identidad se definio en globales
// Obtener conexiones con datos sin leer.

while((Identidad=TcpServerGetUnreadId()) > 0)
{       
// Leer 2 datos y almacena en RxData[].
TcpServerRead(Identidad, RxData, 2)
      DoutSetOn(DOUT10);   //Enciende indicador led ambar puerta tablero plc tanque
segundero_com=0;     // nuevo.....................................
     
      ultimo_data_0_rural=RxData[0];
      ultimo_data_1_rural=RxData[1];
     
//Comprobar si debemos activar/desactivar
      //salidas digitales DOUT1 y/o DOUT2.
      //según bits recibidos en RxData[0] y [1]
     
if(RxData[0] == 0){
DoutSetOff(DOUT1); //DOUT1 Led que corresponde a Bomba3
         TcpServerSend(Identidad, TxData, 2);
         }
if(RxData[0] == 1){
         DoutSetOn(DOUT1);
         TcpServerSend(Identidad, TxData, 2);
         }
     
if(RxData[1] == 0){DoutSetOff(DOUT2);}
if(RxData[1] == 1){DoutSetOn(DOUT2) ;}
}
}

Entiendo que en la variable Identidad (definida como global), debería encontrarse cual es el cliente conectado; si es así no sé como podría manipularla para mostrarla en el web server por ejemplo.
Hay alguna nota de aplicación que explique las funciones disponibles y relacionadas a este evento?

Saludos
88
STX8091 / Re:No hay acceso a web server
« Último mensaje por Soporte abril 22, 2019, 19:56:56 pm »
Ya esta solucionado.
Se habia borrado el forwarding en el router.

Saludos y disculpas

Buenas tardes. Justo te iba a proponer revisar el port-forwarding del router. Ningún problema. Saludos!
89
STX8091 / Re:No hay acceso a web server
« Último mensaje por Mariano abril 22, 2019, 18:41:46 pm »
Hola Boris

Ya esta solucionado.
Se habia borrado el forwarding en el router.

Saludos y disculpas
90
STX8091 / No hay acceso a web server (solucionado)
« Último mensaje por Mariano abril 22, 2019, 14:46:40 pm »
Buenas tardes Boris.

Tengo el siguiente inconveniente. Un webserver en un plc puede ser accedido desde LAN mediante wifi pero no desde internet remota.
Evidentemente la conexion entre plc y router esta bien. En el mismo router esta conectada una antena en modo access point para comunicacion con otro plc cliente. Puedo acceder a la antena y verificar que el enlace esta activo. Asi mismo no hay comunicacion entre plc's.
Te comento tambien q puedo desde el wifi del router acceder a internet normalmente.
La falla entonces parece ser una caida de la comunicacion ethernet? Ya probe reiniciando todos los dispositivos.
Que acciones me recomendarias tomar para restaurar el sistema?

Ya probe recargar el programa y le instale el ultimo firmware v221.
Sigue con la misma falla.

Saludos

Páginas: 1 ... 7 8 [9] 10