Mostrar Mensajes

Esta sección te permite ver todos los mensajes hechos por este usuario, recuerda que solo puedes ver los mensajes en áreas en donde tu tienes acceso.


Mensajes - Soporte

Páginas: 1 [2] 3 4 ... 61
16
STX8081 / Re:Problema con las últimas versiones (packed string)
« : agosto 10, 2018, 19:05:45 pm »
Hola Pablo.

Leyendo, encontré otra forma de manejar "packed string" de forma más natural en Pawn.

Asi como para indexar un string "unpacked" se utiliza "[ ]", para un "packed" string se puede utilizar corchetes "{ }".

Ejemplo:

Código: (Pawn) [Seleccionar]
new PackedString[] = !"Hola"

if(string{0} == 'H')
{
   // Primer caracter es letra "H" del Packed String.
}

new UnpackedString[] = "Hola"

if(string[0] == 'H')
{
   // Primer caracter es letra "H" del Unpacked String.
}

También es posible definir espacio para un string packed en cantidad de caracteres:

Código: (Pawn) [Seleccionar]
new PackedString[100 char]
El código anterior, definirá en memoria un array equivalente para 100 caracters, es decir 100/4=25 enteros de 32 bits.

Entonces la función nLcdPrintMultLines() la podes dejar como estaba antes, pero remplazando los [ ] por { } al indexar un Packed String.

Te adjunto el proyecto en .ZIP.

Código: (Pawn) [Seleccionar]
nLcdPrintMultLines(x, y, const String[])
{
   new Buffer[100 char] // Definir un string para 100 caracteres
   new i=0, j=0
   new Stop = FALSE
   
   // Parsear cadena.
   while(Stop == FALSE)
   {
      // Copiar una línea de String[] en Buffer[].
      while(String{i} != '\n' && String{i} != '\0')
      {
         Buffer{j++} = String{i++}
      }
     
      // Si hay carateres en Buffer[], imprimir.
      if(j != 0)
      {
         // Agregar terminador de fin de cadena.
         Buffer{j} = '\0'
         
         // Imprimir en VirtualHMI Buffer[] e incrementar numero de línea.
         nLcdPrintf(x, y++, LCD_CLRLINE, "%s", Buffer)
         
         // Agregar Delay para asegurar fin de transmisión.
         DelayMS(150)
      }
     
      // Fin de caracteres en String[] ?.
      if(String{i} == '\0')
      {
         // Si, parar Loop.
         Stop = TRUE
      }
      else
      {
         // No, ajustar variables para próxima línea.
         i++
         j = 0
      }
   }
}

Creo que esta forma te deja el código mejor si utilizás la opción de compilación "Packed string".

Saludos!

17
Buenos días Silvana.

Lo que no logro es que me llegue la notificación por mail de que se lleno la memoria del PLC.
A los mails los ingrese en Mail.p y también he modificado el tiempo en que me llega la notificación por mail en Timeout.p para probar que pasaba al cabo de una hora pero no logro que me llegue el mail. Tambien inserté los mails en la web pero tampoco. Que estoy haciendo mal?

Primero, verificar que las notificaciones estén activadas con "Si".



También debes colocar direcciones validas de email en todos los campos. El remitente puede ser cualquier dirección donde quieras que los receptores respondan.

Segundo no esta de más decir que el PLC debe estar conectado a un router o red con acceso a internet, para que puedan salir los mails.

Tercero, verificar que dentro de la configuración de StxLadder, en menú "PLC > Configurar PLC > Red" tengas especificado la dirección correcta del Router/Gateway IP.
Es la dirección dentro de tu red del router, al que accedes para configurar internet.



Cuarto, verificar que los mails no estén llegando a tu carpeta/bandeja de "Correo no deseado" o "Spam" en tu buzón de mail.
En ese caso, si llegan, los marcas como "no spam".

En archivo Debug.inc, a la constante DEBUG_CODE podes ponerle el valor 10, y recompilar. Eso hace que el programa empiece con la memoria "casi llena", y a los 5 registros se llene. Podes de esa forma simular una notificación de memoria llena y realizar la prueba.

Otras consulta: sólo puedo ver los datos si estoy conectada con el puerto ethernet, se puede lograr sin estar conectada por cable?

¿Te referís a hacerlo por Wi-Fi?

Si el PLC está conectado por cable ethernet a una red o router en la que tengas Wi-Fi, luego podes acceder al PLC con Wi-Fi desde el navegador.

Para la página web no hay problemas.

Para la parte de lectura de memoria EEPROM con el programa de Visual C#, al utilizar protocolo UDP, es conveniente hacerlo dentro de la misma red o con Wi-Fi de buena señal, ya que dicho protocolo no tiene los mismos controles de errores que el protocolo TCP que usa el web server.

Saludos!

18
STX8081 / Re:Problema con las últimas versiones
« : agosto 07, 2018, 12:13:52 pm »
Buenos días Pablo.

La verdad es que tenía la sensación de que estaba super-holgado de memoria en mi PLC, pero evidentemente no es así (probablemente esté holgado de memoria flash para almacenar el programa en sí, pero jugado con la cantidad de RAM usada para variables).

En flash no creo que tengas inconveniente. Igual, la nueva versión de StxLadder te informa cuanto consume el proyecto en todos las áreas de memoria.

Voy a tener que revisar bien el código antes de hacer cualquier upgrade de versiones, porque me parece que sí uso strings via subíndice en alguna parte, y me podría dar cualquier resultado

Te adjunto una función de conversión que se llama MyUnpackString() y lo que hace es "desempaquetar" (unpack) un "packed string".

Luego la voy a incluir en el firmware, por eso por ahora el nombre es MyUnpackString().

Esto es para tener compatibilidad con código existente, donde es más facil el "parseo" con los string tipo "unpacked".

Por ejemplo, par usarlo, dentro de las funciones que me pasas haces:

Código: (Pawn) [Seleccionar]
ReemplazarEspacios(const PackedString[])
{
   new Buffer[30]
   new String[100]  // Nuevo.
   new i=0

   // Unpack "PackedString" en "String" para facilitar algoritmo.
   MyUnpackString(PackedString, 0, String, 0)

   // Resto igual ...
}

Código: (Pawn) [Seleccionar]
nLcdPrintMultLines(x, y, const PackedString[])
{
   new Buffer[100]
   new String[100]  // Nuevo.
   new i=0, j=0, c
   new Stop = FALSE
   
   // Unpack "PackedString" en "String" para facilitar algoritmo.
   MyUnpackString(PackedString, 0, String, 0)

   // Resto igual ...
}

Te adjunto el ejemplo funcional en el proyecto .ZIP que contienen la función MyUnpackString().



Lo que te recomiendo es hacer un "backup" del proyecto que funciona bien.

Luego pasar a StxLadder 1.9.2 y con la opción de compilación "Packed string", ver si compila y cuanta memoria RAM ahorraste.

Luego modificar con MyUnpackString() las funciones que indexan caracteres y probar el código.

También, muchas veces se declaran arrays globales y no se usan todo el tiempo en el programa, solo en forma temporal, por ahí fijate de optimizar, reutilizando arrays. Las variables que se inicializan en una función, cuentan como una variable global en cuanto a memoria RAM utilizada.



Hay otra forma que consiste en no utilizar la opción "Packed string" de compilación, y colocar el caracter "!" delante de cualquier string constante para hacerlo "packed" individualmente.

Ejemplo:

Código: (Pawn) [Seleccionar]
new String[] = !"Texto literal" // Packed.

nLcdPrintf(0, 0, LCD_CLRLINE, !"Hola mundo")  // Packed.

nLcdPrintf(0, 0, LCD_CLRLINE, !"%s", String)  // Packed.

Pero de esta forma debes ir linea por linea colocando el caracter "!" para ahorrar memoria, pero con la ventaja que controlas cuando no lo queres "packed" al string.

De esta forma, cada string que la antecede el símbolo "!" es "packed" y se ahorra memoria RAM, ya que cada caracter ocupa un byte de esta forma. Recordar que en Pawn, las cadenas literales (constantes) se almacenan en memoria RAM, no en ROM.

Saludos!

19
El proyecto en el PLC, tiene los siguientes puntos de interés:

En archivo "Samples.inc", tenes la constante SAMPLES_PERIOD, en ella podes especificar el intervalo de muestreo en segundos para cada registro.

Por ejemplo, podes utilizar 60, para tomar cada un minuto, o 60*10 para registrar cada 10 minutos.



En archivo "Vin.p" podes configurar los rangos de cada canal analógico.

Cada muestra analogica, es un promedio de 1000 muestras tomadas en 60 segundos, esto se especifica en la linea:

Código: (Pawn) [Seleccionar]
VinFilterAOn(1000, 60000)
También, cada muestra se analogica se registra con las funciones:

VinReadT(), VinReadHR(), VinReadE(), VinReadIR() y VinReadUV()

Que en este caso, solo devuelven el voltaje leido.

Pero podes escalar su valor devuelto dentro de dichas funciones, para que retornen a magnitud física correcta, ejemplo temperatura, humedad relativa, etc. Entonces, luego los registros contendrán los valores reales.



En archivo "Samples.inc", declaro la siguiente enumeración:

Código: (Pawn) [Seleccionar]
enum SampleDataEnum
{
   Data_TimeStamp,     // Fecha/Hora de la muestra.
   Float: Data_T,      // Tempertatura (VIN1).
   Float: Data_HR,     // Humedad Relativa (VIN2).
   Float: Data_E,      // Iluminancia (VIN3).
   Float: Data_IR,     // Radiación IR (VIN4).
   Float: Data_UV,     // Radiación UV (VIN5).
   Data_DIN,           // Estado de todas las entradas digitales (DIN1, DIN2, etc).
}

Sí te fijas, cada campo contiene las muestras de cada registro.

Fíjate que en Data_DIN almaceno el estado de todas las entradas digitales, esto es para maximizar el uso de memoria, utilizando una sola variable para almacenar el estado en cada bit de las entradas (por ejemplo DIN1 y DIN2, donde tenes CO2 y AIR).

La terminología que utilizo es "registro" para cada grupo de muestras (que contiene todos los datos). Y muestra para el valor individual.
Sin embargo, en el programa a veces uso los términos indistintamente, pero es la idea.



Las páginas web las podes modificar libremente, quizas para entender bien, te convenga leer la nota de aplicacion AN030:

http://slicetex.com/docs/an/an030/



Una vez que se llena la memoria, se genera la notificación si configuraste tu email.

Te va a notificar cada 8 horas.

Esto podes cambiarlo desde el archivo "Timeout.p", en el código:

Código: (Pawn) [Seleccionar]
   //
   // Comprobar si Timeout2 ha expirado.
   //
   
   if(Timeout2Check() == 1)
   {
      // Habilitar nuevamente todas las notificaciones por e-mail.
      MailNotifyStopClearAll()
     
      //
      // Recargar timeout con 3600*8 segundos (8 hs)
      //
     
      Timeout2Reload(3600*8)
   }

Cambiando el valor 3600*8 con el valor adecuado en segundos, podes aumentar/disminuir ese lapso.



En el programa de Visual C#, la parte de código siguiente, es donde proceso cada muestra para poder almacenarla en un archivo de texto y luego importar desde Excel. No deberia necesitar cambio (a menos que registres más sensores), ya que el PLC interpreta la magnitud fisica, y el programa solo lee el valor almacenado.

Código: (C#) [Seleccionar]
                    //
                    // Muestra 1, TimeStamp
                    //

                    // Convertir 4 bytes en Entero de 32-bits.
                    int TimeStamp = BitConverter.ToInt32(EepromBytes, EepromIndex);

                    // Obtener fecha/hora de muestra a partir de TimeStamp.
                    DateTime SampleTime = PioBoard.Cmd.BoardInfo.TimeStampToDateTime((uint)TimeStamp);

                    //
                    // Muestra 2 a 7
                    //

                    // Convertir 4 bytes en Float de 32-bits.
                    float Sample2 = BitConverter.ToSingle(EepromBytes, EepromIndex + 4 * 1);

                    // Convertir 4 bytes en Float de 32-bits.
                    float Sample3 = BitConverter.ToSingle(EepromBytes, EepromIndex + 4 * 2);

                    // Convertir 4 bytes en Float de 32-bits.
                    float Sample4 = BitConverter.ToSingle(EepromBytes, EepromIndex + 4 * 3);

                    // Convertir 4 bytes en Float de 32-bits.
                    float Sample5 = BitConverter.ToSingle(EepromBytes, EepromIndex + 4 * 4);

                    // Convertir 4 bytes en Float de 32-bits.
                    float Sample6 = BitConverter.ToSingle(EepromBytes, EepromIndex + 4 * 5);

                    // Convertir 4 bytes en Entero de 32-bits.
                    int Sample7 = BitConverter.ToInt32(EepromBytes, EepromIndex + 4 * 6);

                    // Obtener valores de entradas digitales.
                    int Din1 = Tools.BitRead((uint)Sample7, 0) ? 1:0;
                    int Din2 = Tools.BitRead((uint)Sample7, 1) ? 1:0;

                    // Crear línea de texto.
                    sb.AppendFormat("{0} | {1} | {2} | {3} | {4} | {5} | {6} | {7} | {8}", reg + 1, TimeStamp == 0 ? "N/D": SampleTime.ToString(), Sample2, Sample3, Sample4, Sample5, Sample6, Din1, Din2);
                    sb.AppendLine();




20
Buenas tardes Silvana,

Adjunto en archivos ZIP te paso el proyecto para el PLC para registrar datos como un DataLogger y el proyecto para Visual C# para recuperar los datos registrados.

Son programas simples, pero con bastante código por lo cual puede resultarte un poco abrumador al comienzo para entenderlos, ya que está escrito considerando todas las posibilidades.

Te recomiendo verlos, familiarizarte un poco, y cualquier cosa, podemos convenir algún horario y te doy una explicación breve telefónica.

Sin embargo, hacen lo que pedís, registran los datos cada 10 minutos y cuando se llena la memoria te envia una notificación por e-mail.

También podés acceder vía página web al dispositivo para configurar tu e-mail, vaciar memoria, reiniciar sistema, etc.



Para utilizarlos, primero que nada necesitas actualizar el PLC con la última versión de firmware disponible (actualmente la V215) desde la página web:

http://slicetex.com/hw/stx8091/soft.php

También, utilizar la última versión de StxLadder.



Una vez que cargues el proyecto en el PLC, podés acceder al mismo desde tu navegador web a la página del PLC, mediante la dirección "192.168.1.81" (o la que utilices en tu red con el PLC).

En la página "Resumen" te da información util del sistema.



Por ejemplo porcentaje de uso de la memoria, los dias remanentes antes de que se llene, si tenes configurado la notificación por mail, etc.

También te dice la cantidad de registros disponibles, donde cada registro contiene información de las muestreas (7 variables, hora/fecha, entradas analógicas y digitales). Por lo tanto, 7 variables de 4 bytes cada una, son 28 bytes por registro. En total, podes registrar 1159 registros, y a una velocidad de 10 minutos son 8 días de registro antes de llenar la memoria.

En la página "Registros" te muestra información de los últimos 24 registros adquiridos:





También te recomiendo ir a la página "Config > Service" y ejecutar la acción "Volver memoria a parámetros de fábrica", para poner la configuración del sistema a valores por defecto.

Luego reiniciar el sistema, para que los cambios tengan efecto.

Desde esa misma página podes vaciar la "memoria de registros".



En Visual C#, tenes el programa para recuperar todos los registros en EEPROM almacenados.



Este programa asume que el PLC esta en la dirección IP 192.168.1.81.

Podes ejecutar el programa con el ejecutable:

EepromVisualAccess\bin\Debug\EepromVisualAccess.exe

Sí te pide acceso al firewall al ejecutar, dale permiso con la clave de administrador de windows.

Una vez que se conecta, le podes decir cuantos registros leer y te los guarda en un archivo de texto, separados por carácter "|", por lo cual luego podes importarlo desde excel como una tabla.

En el ZIP, te puse como hacerlo en Excel con fotos.



Si querés modificar el programa en Visual C#, debes abrir el mismo con "Microsoft Visual C# 2015 o superior".

En el siguiente post, te doy algunos detalles más.

Saludos!





21
STX8081 / Re:Problema con las últimas versiones
« : agosto 04, 2018, 21:05:50 pm »
El problema se manifiesta así: al compilar el programa (ya con el nuevo entorno), me tira el siguiente error:

Error de Memoria: Insuficiente memoria RAM: El proyecto requiere 19668 bytes y el dispositivo tiene disponible 16384 bytes. Disminuya variables globales, variables locales inicializadas, comparta/reutilice variables globales, utilice packed strings, agrupe datos, etc.


Hola Pablo.

En las últimas versiones de firmware y StxLadder, se hace una correcta comprobación de memoria RAM utilizada antes de cargar el proyecto al PLC. Por lo tanto, quiere decir que tu código utilizaba más memoria de la permitida.

Esto en general no causa problemas porque es probable que justo no interacciones con otros sectores de RAM utilizado por el sistema operativo, pero si llegara a pasar, se te cuelga el PLC.

La solución en general es bajar la memoria RAM utilizada, que en tu caso, seguramente es por utilizar muchas cadenas/strings, ya que cada carácter consume 4 bytes en Pawn.

Lo que te aconsejo, es cargar la última versión de firmware y StxLadder, y compilar con la opción:

"Packed literal strings" , que se encuentra en "Proyecto > Propiedades > Compilador (pestaña)".



Seguramente, el porcentaje de RAM utilizada se te va reducir bastante, y te va a dar "Compilación correcta".

Sí lo compila (muy probable), tenés seguridad de que el PLC sea más estable respecto a la memoria utilizada RAM en tu proyecto.

La opción "Packed literal strings" hace que se agrupen "4" carácteres de una cadena, en una celda de 32-bits, ya que si esta opción se utiliza un carácter por celda, lo que es un desperdicio de memoria, porque 3 bytes quedan libres sin utilizar.

En general no necesitarias otro tipo de cambio en tu código, a menos que indexes en algún lugar una cadena, caracter por caracter, por ejemplo:

Código: (Pawn) [Seleccionar]
new String[]="Hola"

if(String[0]='H')
{
    // Letra H
}

Pero si solo operas con cadenas de forma normal, utilizando las funciones, no hay problemas (si debes actualizar firmware).

Sí utilizas la función StrFormat(), el tercer argumento debe ser "true" o "PACKED":

StrFormat(..., ..., true, "...", ...)

StrFormat(..., ..., PACKED, "...", ...)



En el link abajo, paso el POST donde se muestra el por qué de esta nueva característica de StxLadder, ya que en previas versiones había un calculo erróneo sobre la estimación de RAM utilizada por el proyecto y podía sobrepasar los límites admitidos.

http://foro.slicetex.com/index.php?topic=335.msg1805#msg1805

Además te da tips para disminuir uso de memoria RAM y utilizar "packed strings" .

Cualquier duda, avísame.

Saludos!










22
buenos días, quisiera que me orienten como podría realizar la automatización: la idea es que el sistema de alimentación principal de una vivienda se a través de alimentación fotovoltaica , y al memento de que el sistema fotovoltaico tenga sus baterías en baja carga conmute a la red de alimentación publica. por otro lado el sistema controle si esta presente la alimentación de la red publica necesaria (220 vol/380 vol ); y conmute nuevamente cuando las baterías recuperen la carga necesaria el equipo que tengo en un  PLC - CUBE  STX8091H03A1-FXD1.-
espero pueda guiarme.

Buenos días.

En este caso debería utilizar dos indicaciones  en su sistema y colocarlas en una entrada digital DIN del PLC.

  • DIN1 = Indicación batería baja: Con esto le dice al PLC que hay batería baja.
  • DIN2 = Indicación de red pública: Con esto le dice al PLC que hay energía eléctrica presente.

Entonces:

DIN1=0, conmuta con salida de PLC a sistema con baterías.

DIN1=1 y DIN2=1, conmuta con salida del PLC a red pública.

DIN1=1 y DIN2=0, desconecta energía eléctrica del sistema antes que baterías se dañen.

Para obtener indicación de red pública, puede utilizar un rele de 220VCA, y alimentarlo desde la red para que conmute e introduzca un "1" o "0" en la entrada DIN.

Para obtener indicación de batería baja, debe consultar con su equipo o sistema para poder leer dicha señal de forma correcta.

Saludos!






23
STX8091 / Re:Código para el registro de variables en tabla
« : agosto 01, 2018, 13:19:27 pm »
Buenos días.

Gracias por su pronta respuesta. Quisiera registrar cada 10 minutos las variables ambientales, y que ese registro sea el promedio de muestras tomadas durante un minuto (para tener mas certeza del dato registrado en memoria). Por ejemplo adquirir una muestra por segundo y luego de un minuto promediar las muestras (serían 60) y ese dato promediado lo registro en memoria.
Así en una hora tendría 12 muestras guardadas en la memoria. Necesito medir durante todo el día, los días que alcance según las caracteristicas de mi PLC 8091.

Entonces serían 6 muestras por hora, de cada variable analógica. Y cada muestra a almacenar, es un promedio de las últimas 60 muestras tomadas cada 1 segundo.

Bien, realizo un ejemplo, me va a llevar unos días ya que tiene que estar pensado para que luego puedas recuperar los datos almacenados y poder notificar/chequear el momento en que la memoria esta llena.

Te aviso por este medio cuando tenga el ejemplo.

Saludos!

24
STX8091 / Re:Código para el registro de variables en tabla
« : julio 31, 2018, 20:47:09 pm »
Le adjunto mi primer codigo y la tabla tipo que quisiera generar, por supuesto que es muy simple.
Por ahora estoy con la tensión en VIN1 (luego la convertire a T), creo una variable para almacenarla y si la hora del plc es confiable muestro en el virtual HMI la fecha, la hora y el valor en VIN1 y si hay espacio en la memoria escribo un numero arbitrario.
Ahora necesitaría hacer un array por cada variable, poder ordenarlas en una tabla y grabar junto a la fecha y hora en que se registró cada dato.

No está mal el programa, sin embargo, hay otras formas de almacenar hora/fecha en una sola variable de 32-bits, que es utilizando TimeStamp (números de segundos desde 1/1/1970 00:00 hs) , de esta forma se ahorra memoria y es mas fácil registrar fecha/hora.

Lo mismo que para guardar cada dato analógico, se utiliza una variable Float, que tiene 32-bits (4 bytes).

Luego cuando me responda, le escribo un programa inicial mostrándole la diferencia.

Saludos!

25
STX8091 / Re:Código para el registro de variables en tabla
« : julio 31, 2018, 20:42:44 pm »
Buenas tardes Silvana.

Le escribo para pedirle asesoramiento. Estoy tratando de escribir la primera parte de un código que iré desarrollando por etapas. Voy a medir las variables analogicas T(VIN1), HR(VIN2), Iluminancia(VIN3), Radiación IR(VIN4), Radiación UV(VIN5) y las variables digitales CO2(DIN1) y calidad del aire(DIN2).

Bien, primero que nada hay que estimar la cantidad de memoria EEPROM que utilizará.

Para ello es necesario saber la tasa de muestreo (¿cada cuánto tiempo realiza una muestra?) y la cantidad de tiempo que desea almacenar.

En base a ese dato, podemos estimar o limitar el total de muestra a tomar de cada variable analógica, para repartirlas en memoria EEPROM.

Por ahora solo quiero registrar en memoria las variables medidas con un tiempo de muestreo fijo y ordenarlas en una planilla con fecha y hora, cuando se llegue al tope de memoria activar un evento para enviar datos por mail o simplemente ver en la pantalla de virtual HMI de mi celular la indicación de descargar los datos.
Por ahora necesito crear una tabla y registrar los datos y luego tener acceso a ellos con alguna planilla tipo excel.

Bien es posible que al llegar al tope le avise por mail o también, puede consultar el mismo a tráves de una página web en el dispositivo (recomendado frente a VirtualHMI).

Para descargar toda la memoria EEPROM (si utiliza muchos datos), será necesario realizar un pequeño program en Visual C#, tomando como base el siguiente ejemplo:

http://foro.slicetex.com/index.php?topic=301.0

El cual le permite leer toda la memoria y guardar los datos en un archivo compatible con Excel.

Respondame lo que le pregunte al principio, sobre cada cuanto debe tomar una muestra y el tiempo total, así estimo la memoria necesaria y le hago un ejemplo para comenzar.

Saludos!



26
STX8081 / Re:Duda con recepción de paquetes UDP
« : julio 30, 2018, 17:36:55 pm »
Buenas tardes Pablo.

La duda es sobre los parámetros del protocolo CSP. Supongamos que yo tengo que enviar 10 bytes de payload, cuáles son los valores correctos para los bytes "CMDIN_ARGSIZEx" del array?.

Para 10 bytes te quedaría algo así el array a transmitir:

Código: (Pawn) [Seleccionar]

   // Configurar CSP Header 
   Data[CMDIN_PASS_OFFSET] = 0
   Data[CMDIN_PASS_OFFSET+1] = 0
   Data[CMDIN_PASS_OFFSET+2] = 0
   Data[CMDIN_PASS_OFFSET+3] = 0
   Data[CMDIN_PROTO_OFFSET] = CMDSERV_PROTO_VERSION
   Data[CMDIN_TYPE_OFFSET] = CMD_TYPE_QUIET

   Data[CMDIN_ARGSIZE0_OFFSET] = 1+10    // Datos a transmitir + 1
   Data[CMDIN_ARGSIZE1_OFFSET] = 0

   Data[CMDIN_ID_OFFSET] = PBCMD_UdpRx

   Data[CMDIN_ARGS_OFFSET] = 10  // Cmd UdpRx Arg. Size (10 bytes)

   // Set data values (valores a transmitir).
   Data[CMDIN_ARGS_OFFSET+1] = 1
   Data[CMDIN_ARGS_OFFSET+2] = 2
   Data[CMDIN_ARGS_OFFSET+3] = 3
   Data[CMDIN_ARGS_OFFSET+4] = 4
   Data[CMDIN_ARGS_OFFSET+5] = 5
   Data[CMDIN_ARGS_OFFSET+6] = 6
   Data[CMDIN_ARGS_OFFSET+7] = 7
   Data[CMDIN_ARGS_OFFSET+8] = 8
   Data[CMDIN_ARGS_OFFSET+9] = 9
   Data[CMDIN_ARGS_OFFSET+10] = 10


Offset  Parameters          Value
06      CMDIN_ARGSIZE0     03  -- Aquí tengo que poner 03, o tengo que poner 0B
07      CMDIN_ARGSIZE1     00  -- Este siempre lo dejo en cero
09      CMDIN_ARGS            0A  -- Aquí le pongo siempre 0A porque envío 10 bytes de payload.

En realidad no entiendo el significado de los parámetros CMDIN_ARGSIZE0 y CMDIN_ARGSIZE1, puesto que en realidad el tamaño de la payload ya va en CMDIN_ARGS. Es como que tienen la misma función.

El campo CMDIN_ARGSIZE0 y CMDIN_ARGSIZE1, dan el valor total de bytes a transmitir del comando. Pero en este caso, el subcomando "PBCMD_UdpRx" requiere que se le diga cuantos bytes de información esta recibiendo en CMDIN_ARGS.

Entonces, si transmitís 10 bytes de datos útiles, 1 byte debés utilizarlo para indicar su longitud en CMDIN_ARGS.

Por lo tanto: CMDIN_ARGSIZE0 = CMDIN_ARGS + 1

Te consulto una duda que me surgió con relación a la recepción de paquetes UDP, que en algunos momentos me anda medio errático (hay paquetes que llegan, y otros que no llegan).

UDP no es un protocolo confiable, más si la transmisión esta en redes lejanas o con trafico.

Pero,  a veces me a resultado que luego de energizarse la placa, algunos paquetes iniciales UDP se pierden, pero luego funciona correctamente.

Esto lo solucioné enviando previamente un paquete vacio (NULL) o sin función alguna, que actualiza tablas ARP y conectividad en algunos sistemas.

Por ejemplo:

Código: (Pawn) [Seleccionar]

   // Configurar CSP Header 
   Data[CMDIN_PASS_OFFSET] = 0
   Data[CMDIN_PASS_OFFSET+1] = 0
   Data[CMDIN_PASS_OFFSET+2] = 0
   Data[CMDIN_PASS_OFFSET+3] = 0
   Data[CMDIN_PROTO_OFFSET] = CMDSERV_PROTO_VERSION
   Data[CMDIN_TYPE_OFFSET] = CMD_TYPE_QUIET

   Data[CMDIN_ARGSIZE0_OFFSET] = 0
   Data[CMDIN_ARGSIZE1_OFFSET] = 0

   Data[CMDIN_ID_OFFSET] = 0

Podes enviarlo antes de cada transmisión (algunas veces o esperar luego del mismo) y luego transmitir los datos útiles.

Saludos!

27
STX8081 / Re:Duda con respecto a "prevención de cortocircuitos"
« : julio 30, 2018, 16:53:51 pm »
Pero me agarró la siguiente preocupación: qué pasa si en alguna de las luces que enciendo con el PLC se produjera (por ejemplo) un cortocircuito en el portalámparas. El PLC tiene previsto pistas que vuelen como protección para estas circunstancias ?

Mi miedo es que por un cortocircuito estúpido en una lámpara se me prenda fuego la casa en algún momento en que no estoy.

Buenas tardes Pablo.

En caso de cortocircuito, la pista del PLC, si se excede cierta corriente, por ejemplo arriba de 6-10 amperes, se va a cortar (nunca he realizado un ensayo destructivo). Es difícil que se prenda fuego, pero no imposible, ya que hay que ver como interactua todo en su conjunto, cobertura de cables, reles, componentes cercanos, borneras de plástico, etc, etc.

Por lo tanto, para seguridad total, lo que tenés que hacer es colocar fusibles en serie que para cuando se supere una corriente anormal en cada lampara (por ejemplo 0.5A o 1A, dependiendo de la potencia).

Podrías ver si conseguís para 220VCA algún PolySwitch (PTC) que son fusibles clásicos que se recuperan luego de superado el cortocircuito o directamente utilizar los fusibles que se destruyen luego del corto.

Saludos!


28
Kinco / Re:Modbus RTU
« : julio 30, 2018, 16:42:35 pm »
...
dirección 1, función 3 , desde la posición 102 , 4 datos..

He podido hacerlo de manera individual.. consultando por cada uno , pero necesito realizar 1 sola  la consulta de los 4 datos y poder mostrarlos de manera individual en la pantalla.. es posible que me brinden un ejemplo o una guía.

Buenas tardes.

Sí necesitás mostrar 4 valores, hasta dondé sé, con el componente "Number Display" vas leyendo de a una dirección, luego pones 4 componentes iguales para leer cada dirección y mostrar los 4 valores en la pantalla.

Desconozco un componente que lea los 4 valores de una sola vez.

Revisá el manual, puede haber alguno que se adapte a lo que necesitás.

Saludos!


29
PD3060-PT100 / Re:URGENTE! Presencia de ruido en Modulo PD3060
« : julio 25, 2018, 16:31:41 pm »
Si, tenemos disponible un transformador de 24V que esta separado de la alimentación del PLC y del módulo. Luego pruebo polarizando la entrada digital con este y veo si ayuda.

Muy bien. Recordar que debe ser tensión continua. Saludos!

30
PD3060-PT100 / Re:URGENTE! Presencia de ruido en Modulo PD3060
« : julio 25, 2018, 11:38:03 am »
No, el relé se acciona independientemente a través de un interruptor en el tablero. Lo único que hace ese relé es dejar pasar una referencia de masa al PLC para ser leída por este en una de sus entradas digitales.

Que extraño porque las entradas digitales están aisladas. Sin embargo, sí la "masa" que usas de referencia en el rele para la entradas digitales, es la misma que la masa de alimentación de corriente continua de la fuente para el PLC, por ahí puede estar pasando el ruido a la lógica interna.

¿Es posible colocar un rele más pequeño o de otro tipo? ¿O utilizar diferentes fuentes para la polarización de entradas digitales (sin compartir masa con el PLC)?.


Páginas: 1 [2] 3 4 ... 61