Buenas, estoy estudiando el ejemplo que menciono de CCS, para tener una idea de como
implementar en C el protocolo modbus, lo hice en ASM hace unos años, pero ahora lo
necesito en C, revisando el codigo y simulandolo no funciona (segun mi razonamiento y
la simulacion que hago en el isis), explico por que...
1.-En la recepcion de datos series, el codigo calcula el Checksum a todo lo que llega, lo cual
es erroneo, ya que no hay que hacerlo al CRC que viene por el puerto serie, esto es
de poca importancia y facil de corregir.
2.-En el Modbus RTU (como el que esta implementado) despues de un tiempo de silencio en la red
de 3 1/2 caracter, se considera que termino la transmision, y el software en este caso, lo
toma lisa y llanamente como un time out (error), y no como un mensaje que debe procesar.
Aparte, para tomar como un mensaje que ha llegado correctamente necesita que el CRC sea =0,
lo cual es imposible, debido a que se ha ido almacenando lo que se calculo mientras llegaba
el mensaje (ver IF).
// Purpose: Check if we have timed out waiting for a response
// Inputs: None
// Outputs: None
#int_timer2
void modbus_timeout_now(void)
{
if((modbus_serial_state == MODBUS_GETDATA) && (modbus_serial_crc.d == 0x0000) && (!modbus_serial_new))
{
modbus_rx.len-=2;
modbus_serial_new=TRUE;
}
else
modbus_serial_new=FALSE;
modbus_serial_crc.d=0xFFFF;
modbus_serial_state=MODBUS_GETADDY;
modbus_enable_timeout(FALSE);
}
Alguien lo ha implementado, y le funciona?, son mis apreciaciones correctas? o me estoy equivocando.
Saludos.
Gracias por adelantado.
Alejandro.