====== Blinking Modbus ====== En el Firmware de la CIAA tenemos dos ejemplos de uso del protocolo Modbus, blinking_modbus_slave y blinking_modbus_master. Estos están armados de manera tal que si programamos una placa con el ejemplo slave, otra con con el master y las interconectamos a través del la uart 0 (RS485), el estado de las entradas de la primera se verá reflejado en las salidas de la segunda y viceversa. Ambos ejemplos transportan los mensajes por el puerto serie conforme al formato Modbus ASCII a una velocidad de 115200 baudios, 8 bits de datos, sin paridad y 1 bit de stop. ===== Blinkin Modbus Slave ===== En este ejemplo, se puede ver el uso de Modbus en modo slave, comunicando los mensajes en formato ASCII. ==== Descripción de tareas ==== === InitTask === Es la tarea encargada de inicalizar el kernel de la CIAA, abrir los dispositivos utilizado y los distintos componentes del Stack Modbus. Además configura la alarma ActivateModbusTask para que sea activada luego de 100 ticks (100 milisegundos) y con una periodicidad de 5 ticks (5 milisegundos). Es importate aclarar que es la primera en ejecutarse y luego no vuelve a ejecutarse más. === ModbusSlave === Se encarga de atender las tareas del Stack Modbus. Para esto se llama a la función ciaaModbus_gatewayMainTask() pasando como argumento el handler del gateway utilizado. ==== Comandos Modbus ==== Los comandos que se pueden ejecutar son 0x03 Read Holding Registers y 0x10 Write Multiple Registers. En ambos casos el stack Modbus ejecuta el call back correspondiente pasando los siguientes argumentos: static uint16_t cmd0x03ReadHoldingReg( uint16_t start, uint16_t quantity, uint8_t * exceptioncode, uint8_t * buf ); start: dirección de inicio para comenzar a leer registros (este valor es recibido desde el master) quantity: cantidad de registros consecutivos que se desean leer (este valor es recibido desde el master) exceptioncode: código de excepción en caso de producirse un error (debe ser escrito por el slave) buf: valores de los registros leídos (debe ser escrito por el slave) retorno: cantidad de registros leídos (debe coincidir con quantity). En caso de producirse un error, retornar -1 static void cmd0x10WriteMultipleReg( uint16_t start, uint16_t quantity, uint8_t bytecount, uint8_t * exceptioncode, uint8_t * buf ); start: dirección de inicio para comenzar a escribir registros (este valor es recibido desde el master) quantity: cantidad de registros consecutivos que se desean escribir (este valor es recibido desde el master) bytecount: cantidad de bytes que se van a escribir (este valor es recibido desde el master) exceptioncode: código de excepción en caso de producirse un error (debe ser escrito por el slave) buf: valores a escribir en registros (es recibido desde el master) Estas callback no deben bloquearse ya que son ejecutadas desde la tarea ModbusSlave. ===== Blinkin Modbus Master ===== En este ejemplo, se puede ver el uso de Modbus en modo master, comunicando los mensajes en formato ASCII. ==== Descripción de tareas ==== === InitTask === Es la tarea encargada de inicalizar el kernel de la CIAA, abrir los dispositivos utilizado y los distintos componentes del Stack Modbus. Además configura dos alarmas: * ActivateModbusTask: Utilizada para activar la tarea que atiende el Stack Modbus. Se activada luego de 5 ticks (5 milisegundos) y con una periodicidad de 5 ticks (5 milisegundos). * AlarmCallBackPollingSlave: Utilizada para ejecutar el call back CallBackActivatePollingSlave. Esta función activar la tarea PollingSlave si se encuentra suspendida. Se activada luego de 5 ticks (5 milisegundos) y con una periodicidad de 100 ticks (100 milisegundos). Es importate aclarar que es la primera en ejecutarse y luego no vuelve a ejecutarse más. === ModbusMaster === Se encarga de atender las tareas del Stack Modbus. Para esto se llama a la función ciaaModbus_gatewayMainTask() pasando como argumento el handler del gateway utilizado. === PollingSlave === Esta tarea ejecuta las funciones 0x03 y 0x10 sobre el slave, la primera es para leer el estado de las entradas y la segunda es para escribir las salidas.