Hola Boris,
estoy programando en PAWN utilizando el HMI ARRAY SH300 y venia todo bien, hasta que en un momento empezó a titilar el Led DEBUG del PLC y el HMI ya no actualiza los valores que le envío, como los valores de RTC....
Después de buscar el problema me di cuenta de lo siguiente: yo inicio el servidor con el siguiente código, obtenido de de la AN023.pdf, a saber:
if(MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232) < 0)
{
// Error, pausar programa en este punto.
while(true)
{
DelayMS(2000)
LedToggle()
}
}
Me di cuenta que la función estaba retornando un valor menor a 0 y el programa quedaba pausado ahí...
Modifique el código de modo de mostrar que retornaba dicha función de inicialización y observe que me devuelve -1, o sea, "Error, el servidor ya se encuentra inicializado"..... Venia programando normal, sin errores, y de la nada apareció esto. Obviamente solo invoco esa función una vez, por lo cual no se porque me dice esto! Probé restaurar los valores de fabrica del PLC, reseteando con la combinación "DEF/BOOT" y "RESET", como indicas aquí en el foro. El error persiste!!
Porque me dice que ya esta iniciado el servidor Modbus aunque solo invoque 1 vez dicha función? Puedo seguir utilizándolo aun con este valor de error?? Que se puede hacer para volver a la normalidad?
Adjunto el código (casi) completo por las dudas:
///////////////////////////////////////////////////////////////////////////////////////////////////
PlcMain()
{
// Crear variables para almacenar información del reloj.
new Day, Month, Year, Hour, Min, Sec, DOW
//Inicia servidor ModBus
new R = MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232);
if(R < 0)
{
MbRtuServLoadRegister(42017, R)
while(true)
{
DelayMS(2000)
LedToggle()
}
}
// Inicializar placa STX570, dirección 0, conectada al puerto de expansión.
//Stx570_Init(0)
//Evento RTC
RtcOnSecondSetEvent()
//Lee EEPROM Programa A, TiempoUsoHs
EepromRead(1,9,A)
MbRtuServLoadRegisters(42001,9, A)
EepromReadByte(0,TiempoUsoHs)
MbRtuServLoadRegister(42017, TiempoUsoHs)
while(true)
{
// Obtener información del reloj.
RtcGetAll(Day, Month, Year, Hour, Min, Sec, DOW) //Reg 42010 al 42015
MbRtuServLoadRegister(42010, Day)
MbRtuServLoadRegister(42011, Month)
MbRtuServLoadRegister(42012, Year)
MbRtuServLoadRegister(42013, Hour)
MbRtuServLoadRegister(42014, Min)
MbRtuServLoadRegister(42015, Sec)
//MbRtuServLoadRegister(42017, TiempoUsoHs)
//Elige programa
MbRtuServGetRegister(42018, Programa)
//Comprueba si se ha modificado un programa
MbRtuServGetRegister(42019, Config)
//Iniciar Programa
MbRtuServGetRegister(42020, Start)
//Guarda las modificaciones realizadas sobre el programa en EEPROM
if(Config)
{
Config=0
DelayS(2)
MbRtuServLoadRegister(42019, Config)
MbRtuServGetRegisters(42001,9,A)
EepromWrite(1,9,A)
MbRtuServLoadRegisters(42001,9, A)
}
// Retorno.
return 0
}
}
//Interrupcion cada 1 seg - RTC
@OnRtcSecond()
{
CountMinReset++
MbRtuServLoadRegister(42016, CountMinReset)
if(CountMinReset==59)
{
CountMinReset = 0
TiempoUsoHs++
MbRtuServLoadRegister(42017, TiempoUsoHs)
//EepromWriteByte(0, TiempoUsoHs)
}
}
Gracias !!