Mensajes recientes

Páginas: 1 ... 8 9 [10]
91
STX8091 / Re:Comunicación al PLC mediante UDP
« Último mensaje por Soporte marzo 27, 2019, 19:48:55 pm »
Al no recibir nada desde el PLC, decidí utilizar un programita muy simple (packet sender) en el que mando los mismos datos y me encuentro con que el mismo PLC responde inmediatamente con datos que no se interpretar. Te adjunto la imagen de esto (por ahí reconoces que tipo de error estoy teniendo o que tipo de mensaje es) y también te muestro a continuación el código utilizado para recibir los datos (tomado de la nota de aplicación AN001).

Buenas tardes,

Parece correcta la repuesta del PLC que recibís, al menos coherente haciendo un análisis rápido. Responde que el comando que enviaste es el "6" y no hay datos de retorno (output size = 0). El protocolo con su versión "2" coincide.



Intentá cargar el siguiente programa al PLC:

Código: (Pawn) [Seleccionar]
PlcMain()
{
   // Vaciar Rx Buffer (Optional, recomendado como buena practica).
   UdpRxBufFlush()

   // Activar el evento para recibir datos UDP.
   UdpRxSetEvent()

   // Ciclo principal del programa.
   while(1)
   {
      // Conmutar led debug cada 250 mS.
      DelayMS(250)
      LedToggle()
   }
}

@OnUdpRx()
{
   // Obtener dirección IP remota y Puerto de los datos recibidos.
   // Nota: solo para fines didacticos.
   UdpRxGetAddr(RxIP[0], RxIP[1], RxIP[2], RxIP[3], RxPort)

   // Leer 6 bytes del buffer de recepcion.
   UdpRxDataRead(RxData, 0, 6, false)

   // Comprobar valor de primer byte recibido y activar/desactivar RELAY1/DOUT1.
   if(RxData[0] == 1)
      DoutSetOn(DOUT1)
   if(RxData[0] == 0)
      DoutSetOff(DOUT1)

   // Comprobar valor del segundo byte recibido y activar/desactivar RELAY2/DOUT2.
   if(RxData[1] == 1)
      DoutSetOn(DOUT2)
   if(RxData[1] == 0)
      DoutSetOff(DOUT2)

   // Comprobar valor del tercer byte recibido y activar/desactivar RELAY3/DOUT3.
   if(RxData[2] == 1)
      DoutSetOn(DOUT3)
   if(RxData[2] == 0)
      DoutSetOff(DOUT3)
}

Y desde MatLab enviar lo siguiente para activar las salidas DOUT1 a DOUT3:

Código: (MatLab) [Seleccionar]
%    Data[0] = 0           // LSB
%    Data[1] = 0
%    Data[2] = 0
%    Data[3] = 0           // MSB
%    Data[4] = 2           // Proto version
%    Data[5] = 0xFA      // type
%    Data[6] = 7           // Argument size 1 byte + 6 bytes
%    Data[7] = 0
%    Data[8] = 6           // Código de comando (UdpRx())
%    Data[9] = 6           // Argument size Cmd UdpRx Arg. Size (6 bytes)
%    // Set data values.
%    Data[9+1] = 1       // Value 1
%    Data[9+2] = 1       // Value 2
%    Data[9+3] = 1       // Value 3
%    Data[9+4] = 1       // Value 4
%    Data[9+5] = 1       // Value 5
%    Data[9+6] = 1       // Value 6

Fíjate si en MatLab, el número 0xFA se define así en hexadecimal, sino convertilo a decimal (250).

La librería STX8XXX.DLL tiene algunos mecanismos para insistir cuando el PLC no responde, ya sea por error de red, u otros inconvenientes del protocolo UDP. Pero algo debería detectar el PLC.

¿Otros protocolos como ModBus TCP o TCP, soporta MatLab?.

Saludos!
92
STX8091 / Controlador infrarrojo
« Último mensaje por Esteban E marzo 27, 2019, 19:13:25 pm »
Buenas tarde Ing. Boris: estoy necesitando controlar un aire acondicionado y solo puedo hacerlo por medio del control remoto. Y quería realizarlo mediante el plc.  Para eso quería hacerlo por medio del siguiente modulador.

https://s.click.aliexpress.com/e/5SoB3xw

La idea es tener un tramitador y un receptor para descifrar el código.


Se podrá lograr ? El plc del aire acondicionado esta a 30 metros aproximadamente.


Saludos

Esteban
93
STX8091 / Comunicación al PLC mediante UDP
« Último mensaje por Pedro1 marzo 27, 2019, 16:24:13 pm »
Hola Boris,

Estoy buscando comunicar mi PLC STX8091 con el programa MATLAB mediante el protocolo UDP. Desde el PLC puedo transmitir datos al programa sin ningún problema. A la hora de hacer la recepción de datos desde el PLC tengo ciertos inconvenientes. Revisando el foro, me encontré con que existe el protocolo CSP en el cual es necesario definir ciertos parámetros previos antes de enviar los datos. Desde el MATLAB envié un array de datos como lo indicaste en otra respuesta:
Código: [Seleccionar]
%    Data[0] = 0      // LSB
%    Data[1] = 0
%    Data[2] = 0
%    Data[3] = 0      // MSB
%    Data[4] = 2      // Proto version
%    Data[5] = 0xFA // type
%    Data[6] = 3      // Argument size 1 byte + 2 bytes
%    Data[7] = 0
%    Data[8] = 6    // Código de comando (UdpRx())
%    Data[9] = 2  // Argument size Cmd UdpRx Arg. Size (2 bytes)
%    // Set data values.
%    Data[9+1] = 1       // Value 1
%    Data[9+2] = 55     // Value 2


Al no recibir nada desde el PLC, decidí utilizar un programita muy simple (packet sender) en el que mando los mismos datos y me encuentro con que el mismo PLC responde inmediatamente con datos que no se interpretar. Te adjunto la imagen de esto (por ahí reconoces que tipo de error estoy teniendo o que tipo de mensaje es) y también te muestro a continuación el código utilizado para recibir los datos (tomado de la nota de aplicación AN001).

Código: [Seleccionar]
// Crear array de 4 celdas para almacenar una dirección IP.
 new RxIP[4]
 // Crear variable para almacenar un valor de puerto UDP.
 new RxPort
 // Crear array de 2 celdas para almacenar los datos recibidos.
 new RxData[2]
PlcMain()
{

   // Inicializar rutinas Virtual-HMI.
   VirtualHmiInit()

 // Comprobar si el buffer tiene nuevos datos sin leer.
 if(UdpRxBufIsEmpty() == 0)
 {
   // Leer 6 bytes del array y almacenarlos en RxData[].
   UdpRxDataRead(RxData, 0, 2, false)
   // Imprimir solo los 3 primeros bytes almacenados.
   nLcdPrintf(0,0,0,"Rx %03d %03d %03d ", RxData[0], RxData[1])
   LedToggle()
   DoutToggle(DOUT1)
 }

      DelayMS(500)
     
}

Desde ya, muchas gracias!

Saludos.
94
STX8091 / Re:Consulta modo PLC y soft en C#
« Último mensaje por Soporte marzo 26, 2019, 20:57:09 pm »
Ok Boris,

Teniendo un dispositivo en modo PLC (STX8091-d2)... un programa en c# en una pc de que forma puede acceder al valor de una entrada analógica (supongamos voltaje), y de una entrada digital?...

He intentado leer directamente el valor mediante las sentencias

Código: [Seleccionar]
// Establecer rango de 0-10V para canal VIN1 (llamar una sola vez para configurar).
PioBoard.Cmd.Vin.SetRange(VinCh.Vin1,
VinVoltRange.Unipolar_10V);
// Variable donde se almacenara el voltage de la entrada analogica.
float Voltage;
// Leer entrada analogica Vin1 y almacenar resultado en "Voltage".
PioBoard.Cmd.Vin.ReadVoltage(VinCh.Vin1, out Voltage);
textBox1.Text = Convert.ToString(Voltage);

Esas funciones que utilizás pertenecen al modo DAQ, como lo dicho anteriormente, son para otro modo diferente al modo PLC.

La nota de aplicación AN001 explica como transmitir/recibir datos por UDP desde el PLC.

También el ejemplo para leer memoria EEPROM que te había pasado puede usarse como base para obtener datos del PLC, y luego convertir esos datos a valores de variables.

El ejemplo 2 de la nota de aplicación AN001 te muestra de forma simple como recibir la cadena "Hola!" en C# desde el PLC.

Partiendo del ejemplo mencionado como referencia, en el PLC se transmite:

Código: (Pawn) [Seleccionar]
   Data[0] = 'H'
   Data[1] = 'o'
   Data[2] = 'l'
   Data[3] = 'a'
   Data[4] = '!'

Si eso lo cambiás por valores, por ejemplo, transmitir un entero de 32-bits, en 4 bytes:

Código: (Pawn) [Seleccionar]
   new Entero=335435

   Data[0] = Entero & 0xFF
   Data[1] = (Entero >> 8) & 0xFF
   Data[2] = (Entero >> 16) & 0xFF
   Data[3] = (Entero >> 24) & 0xFF

Al recibirlos en la computadora (ver ejemplo 2 de AN001), en C# podes decodificarlo luego con:

Código: (C#) [Seleccionar]
Int32 ValueInteger = BitConverter.ToInt32(Packet, 0);
Y al imprimir 'ValueInteger', deberías ver el valor transmitido "335435".

Si es un float, el procedimiento es similar, ya que son 32-bits o 4-bytes también:

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

   Data[0] = Value & 0xFF
   Data[1] = (Value >> 8) & 0xFF
   Data[2] = (Value >> 16) & 0xFF
   Data[3] = (Value >> 24) & 0xFF

Al recibirlos, en C# podes decodificarlo luego con:

Código: (C#) [Seleccionar]
float Value = BitConverter.ToSingle(Packet, 0);
Y al imprimir 'Value', deberías ver el valor transmitido "18.54".

Te recomiendo ver el código del ejemplo para leer memoria EEPROM, allí desde C#, decodifica datos recibidos desde el PLC en variables float, int, etc.

Saludos!

PD: UDP se recomienda como protocolo para aplicaciones en que los dispositivos están en la misma red Ethernet física.
95
STX8091 / Re:Consulta modo PLC y soft en C#
« Último mensaje por Soporte marzo 26, 2019, 20:32:16 pm »
Cuales serían las funciones que si soporta el modo PLC...

Quiero comentarte que los programas de prueba de la nota de ap 001 funcionan ambos...

Las funciones del manual en modo DAQ, son para el modo DAQ, no van a funcionar en modo PLC.

Las que funcionan en ambos, son aquellas informativas, como por ejemplo leer el número de serie, o comandos genéricos, como resetear el dispositivo, etc. Pero no creo que las estés utilizando.
96
STX8091 / Re:Consulta modo PLC y soft en C#
« Último mensaje por Mariano marzo 26, 2019, 13:40:19 pm »
Algunas funciones que no son especificas al modo DAQ, si funcionan en ambos modos.

Cuales serían las funciones que si soporta el modo PLC...

Quiero comentarte que los programas de prueba de la nota de ap 001 funcionan ambos...

Saludos
97
STX8091 / Re:Consulta modo PLC y soft en C#
« Último mensaje por Mariano marzo 26, 2019, 13:38:00 pm »
Ok Boris,

Teniendo un dispositivo en modo PLC (STX8091-d2)... un programa en c# en una pc de que forma puede acceder al valor de una entrada analógica (supongamos voltaje), y de una entrada digital?...

He intentado leer directamente el valor mediante las sentencias

Código: [Seleccionar]
// Establecer rango de 0-10V para canal VIN1 (llamar una sola vez para configurar).
PioBoard.Cmd.Vin.SetRange(VinCh.Vin1,
VinVoltRange.Unipolar_10V);
// Variable donde se almacenara el voltage de la entrada analogica.
float Voltage;
// Leer entrada analogica Vin1 y almacenar resultado en "Voltage".
PioBoard.Cmd.Vin.ReadVoltage(VinCh.Vin1, out Voltage);
textBox1.Text = Convert.ToString(Voltage);


Agregando un cuadro de texto para mostrar dicho valor analógico al programa prueba2 que escucha un array de caracteres desde el PLC (La comunicación se produce correctamente en el programa original)....

Cuando lo ejecuto en el cuadro de texto me muestra la cadena "NeuN" en lugar del voltaje aplicado en la entrada..

Si no se puede directamente de esta forma que debería hacer para poder enviar los valores float? Podría guardarlos en una variable dentro del programa pawn y transmitir dicha variable?

Si es posible por favor enviame unas líneas de código para probar o señalame que documentación debería leer...

Saludos
98
STX8091 / Re:Consulta modo PLC y soft en C#
« Último mensaje por Soporte marzo 26, 2019, 12:06:11 pm »
Una simple consulta. Estoy leyendo el manual STX80XX-UM-DAQ-AX_BX
para profundizar sobre la librería stx.8xxx.dll.

La duda es ¿Existe algún tipo de limitante en el uso de esta si el dispositivo está en modo PLC?

Buenos días.

Si, las funciones de la librería diseñadas para modo DAQ no pueden utilizarse cuando el dispositivo se encuentra en modo PLC.
Deberían devolver un código de error apropiado.

Algunas funciones que no son especificas al modo DAQ, si funcionan en ambos modos.

Saludos!
99
STX8091 / Consulta modo PLC y soft en C#
« Último mensaje por Mariano marzo 25, 2019, 20:58:58 pm »
Buenas noches Boris,

Una simple consulta. Estoy leyendo el manual STX80XX-UM-DAQ-AX_BX
para profundizar sobre la librería stx.8xxx.dll.

La duda es ¿Existe algún tipo de limitante en el uso de esta si el dispositivo está en modo PLC?

Saludos
100
Ing. Boris: Modifique la hora manualmente, cargue el código, reinicie el plc y tomo la hora actual. Y luego volví a enviar para modificar la hora y probe despues de dos minutos y estaba actualizada a la hora correcta así que por lo que probe funciona a la perfeccion.

Perfecto, entonces tu router tiene servidor NTP habilitado.

Saludos!
Páginas: 1 ... 8 9 [10]