Slicetex Electronics - Foro
PLC - DAQ => STX8081 => Mensaje iniciado por: PabloGa en marzo 16, 2021, 12:36:38 pm
-
Hola Boris buen día,
Estoy tratando de resolver un problema de conectividad en el que llevo meses y no lo puedo resolver.
Tengo 2 tipos de conectividad en uso, en las que tengo problemas: a) Subida de datos a ThingSpeak b) Un servicio de notificación que es llama PushingBox, que es muy util y se invoca por http.
El problema es que de un momento para otro "dejan de andar": los correspondientes http utilizados para ThingSpeak o PushingBox dejan de realizar su función, y retornan códigos de error. Eso es así de un momento para otro, y no se subsana más .... HASTA QUE hago un PLC reset.
El sistema funciona bien por unos 5 días (a veces solo 2), y luego deja de andar la conectividad. Todo lo demás anda perfecto (incluyendo los emails y ModBus).
He actualizado firmware y PLCLadder a lo último, pensando que allí había algunas mejoras sobre la parte de stacks y TCPIP, pero no, el problema persiste.
Ya tengo hecho un pequeño código que todos los días "detecta" la situación y me envía un email para avisarme y resetar el PLC y así todo comienza a funcionar de nuevo. El problema es que resetear el PLC es demasiado "hard", y podría estar apagando dispositivos que están encendidos, y se pierden también los totalizadores y variables que están en RAM.
La solución que estoy buscando es una de dos: a) Encontrar la causa de este problema o bien b) Como puedo ejecutar comandos para resetear completamente la parte de conectividad a internet (stacks, resolucion de nombres, etc, etc) que sea EQUIVALENTE a un PLC RESET ... pero sin hacer PLC RESET. Será esto factible? Si esto se puede hacer, yo puedo detectar diariamente cuándo se da la situación anómala, y "reseteo" lo necesario para que vuelva a funcionar.
Ya he probado a ejecutar ResolvClearCache() + HttpSendClose() + HttpSendSetCompletedEvent() cuando la situación se da, pero no soluciona el problema. No equivale a resetar el PLC.
Desde ya muchas gracias,
Pablo.
-
Buenas tardes Pablo,
El problema es que de un momento para otro "dejan de andar": los correspondientes http utilizados para ThingSpeak o PushingBox dejan de realizar su función, y retornan códigos de error. Eso es así de un momento para otro, y no se subsana más .... HASTA QUE hago un PLC reset.
El sistema funciona bien por unos 5 días (a veces solo 2), y luego deja de andar la conectividad. Todo lo demás anda perfecto (incluyendo los emails y ModBus).
¿Cuál código de error te devuelve las funciones? ¿Y qué función?.
La solución que estoy buscando es una de dos: a) Encontrar la causa de este problema o bien b) Como puedo ejecutar comandos para resetear completamente la parte de conectividad a internet (stacks, resolucion de nombres, etc, etc) que sea EQUIVALENTE a un PLC RESET ... pero sin hacer PLC RESET. Será esto factible?.
Por lo que me comentás parece algo particular del protocolo HTTP, ya que el resto te sigue funcionando.
¿En alguna función relacionada, de argumento variable o con datos tipo array/string, podés estar estar pasando cadenas con formato demasiado largas? ¿O es simpre fija la información y acotada a un límite?.
No hay una forma de hacer un reset de memoria a todo el stack TCP/IP, sin justamente reiniciar. Lo que si, si tenés el fragmento de código que sospechás que no funciona y que pueda ser el origen del problema, seria ideal para tener una pista de la raiz del error, y ver que medida tomar. ¿Lo has identificado como para compartirlo?.
Esta semana voy a estar de viaje, pero si podés bridarme más información, lo veo al regresar.
Saludos!
-
Hola Boris, muchas gracias por tu respuesta.
Efectivamente, el problema es solo al usar http.
Este es un extracto del código que uso. La función "ThingSpeakUp" se ejecuta una vez por minuto. Cuando la transacción http finaliza, ejecuta "@OnHttpSendCompleted()". Según mi análisis, lo que ocurre es que @OnHttpSendCompleted() no se estaría ejecutando (deja de ejecutarse porque por alguna razón no se completó la transacción), y por ende ThingSpeakError queda = 255, que es el valor con el que se inicializó al iniciar la funcionalidad.
La forma que yo tengo de "detectar" este problema es -precisamente- detectando que ThingSpeakError se queda clavado en 255.
Buen viaje, y lo seguimos más adelante.
Gracias desde ya,
Pablo
// --------------------------------------------------------------------------------
// Funcion : ThingSpeakUp
// Descripcion : Sube la información a ThingSpeak
// SE EJECUTA 1 VEZ POR MINUTO
// --------------------------------------------------------------------------------
ThingSpeakUP()
{
// Comprobar que no haya otras conexiones http en curso, ni el envío de email en curso
if(ThingSpeakSending == 0 && EmailSending == 0)
{
// Marca que hay un envío en curso
ThingSpeakSending = 1
// Inicializar cliente Thingspeak
ThingSpeakInit()
// Limpia las variables con el string que se enviara a ThingSpeak:
ThingSpeak_String1 = ""
ThingSpeak_String2 = ""
ThingSpeak_String3 = ""
ThingSpeak_String4 = ""
ThingSpeak_String5 = ""
ThingSpeak_String6 = ""
ThingSpeak_String = ""
StrFormat(ThingSpeak_String1, 50, true, "field1=%d.%d&field2=%d&", Dato1,Dato1_d,Dato2)
StrFormat(ThingSpeak_String2, 50, true, "field3=%d&", Letra1+Letra2+Letra3)
StrFormat(ThingSpeak_String3, 50, true, "field4=%d.%d&", Dato2,Dato2_d)
StrFormat(ThingSpeak_String4, 50, true, "field5=%d&field6=%d&", Tiempo_1,Tiempo_2)
StrFormat(ThingSpeak_String5, 50, true, "field7=%d.%d&", Dato3,Dato3_d)
StrFormat(ThingSpeak_String6, 50, true, "field8=%d", Dato4)
// Concatena los 6 segmentos
StrFormat(ThingSpeak_String, 100, true, "%s%s%s%s%s%s", ThingSpeak_String1,ThingSpeak_String2,ThingSpeak_String3,ThingSpeak_String4,ThingSpeak_String5,ThingSpeak_String6)
// Aquí hace la subida de la info a ThingSpeak
HttpSendGet("/update?key=%s&%s", THINGSPEAK_APIKEY, ThingSpeak_String)
}
return 0
}
// --------------------------------------------------------------------------------
// Funcion : ThingSpeakInit
// Descripcion : Inicializa las funcionalidades para ThingSpeak
// --------------------------------------------------------------------------------
ThingSpeakInit()
{
ThingSpeakError = 255
// Inicializar cliente HTTP.
HttpSendInit("api.thingspeak.com", 80, HTTP_SEND_OPT_DEFAULT, 60)
// Activar evento OnHttpSendCompleted()
HttpSendSetCompletedEvent()
return 0
}
// ********************************************************************************
// Funcion : OnHttpSendCompleted()
// Descripcion : Evento generado al finalizar transaccion HTTP.
// ********************************************************************************
@OnHttpSendCompleted()
{
// Aquí si el evento http es por ThingSpeak
if (ThingSpeakSending == 1)
{
// Actualizar flag de error.
ThingSpeakError = !HttpSendCheckValidTransaction()
}
// marca la finalización del comando http y habilita el siguiente
ThingSpeakSending = 0
return 0
}