source: ctrl/firmware/Main/SES/Core/Inc/modbus.h

Last change on this file was 83, checked in by Zed, 3 months ago

Modbus Master and Slave Hardware were tested.

File size: 6.3 KB
Line 
1/*
2 * modbus.h
3 *
4 * Created: 03.09.2012 08:39:40
5 *  Author: Falko
6 */
7
8
9#ifndef __MODBUS_H_
10#define __MODBUS_H_
11
12#if MODBUS_SUPPORT == TRUE
13
14#include <stdbool.h>
15
16#include "main.h"
17
18#include "common.h"
19
20    //#include "stdint.h"
21    //#include "main.h"
22
23    //! brief Anzahl der Startbits, nach Modbus Spezifikation immer 1, stop bits werden aus den Einstellungen geladen
24    #define NUMBER_OF_STARTBITS                         1U
25
26    //! brief Anzahl der Datenbits, nach Modbus Spezifikation immer 8
27    #define NUMBER_OF_DATABITS                          8U
28
29    //! brief Max Timeput zwischen zwei gesendeten char
30    #define TIMEOUT_BETWEEN_CHARACTERS          1.5
31
32    //! brief Timeput bei dem fertig gesendetes Frame erkannt wird
33    #define TIMEOUT_FRAME_COMPLETE                      3.5
34
35    //! define der Größe der Ein- und Ausgangsbuffer
36    #define RXBUFFERSIZE                                256
37    #define TXBUFFERSIZE                                256
38
39    #define FORWARD_DATA                                TRUE
40    #define SEND_TO_LOKALBUS                            1
41    #define RESPOND_TO_QUERY                            2
42
43    #define MAX_ADRESS                                  ((sizeof(sys_data_struct_t) / 2) - 1)
44
45    #define MODBUS_UART_PARITY_EVEN                     0
46    #define MODBUS_UART_PARITY_ODD                      1
47    #define MODBUS_UART_PARITY_NONE                     2
48
49//    typedef union bword
50//    {
51//      uint16_t    w;
52//       int16_t    sw;
53//       uint8_t    lb;
54//        int8_t    slb;
55//       uint8_t    b[2];
56//        int8_t    sb[2];
57//    }
58//    bword_t;
59
60   /* typedef enum mb_error_codes_enum
61    {
62      MB_ERROR_NOTHING              = 0,
63      MB_ERROR_TIMEOUT              = 1,
64      MB_ERROR_CRC                  = 2,
65      MB_ERROR_SLAVE_ADRESS         = 3,
66      MB_ERROR_FUNCTION_CODE        = 4,
67      MB_ERROR_BYTE_COUNT           = 5,
68      MB_ERROR_START_ADRESS         = 6,
69      MB_ERROR_UART_PE              = 7,                                                                                //Parity
70      MB_ERROR_UART_NE              = 8,                                                                                //Noise
71      MB_ERROR_UART_FE              = 9,                                                                                //Frame
72      MB_ERROR_UART_ORE             = 10,                                                                               //Overrun
73    }
74    mb_error_codes_t;*/
75
76
77
78    typedef enum
79    {
80      MB_QUERY_NOTHING,
81      MB_QUERY_READ_IDENT,
82      MB_QUERY_READ_DATA,
83      MB_QUERY_READ_LIPRO_DATA,
84      MB_QUERY_WRITE_LIPRO_BALANCER_VOLTAGE,
85      MB_QUERY_WRITE_BUTTONS,
86      MB_QUERY_GSM_GATEWAY,
87      MB_QUERY_REMOTEBUS_GATEWAY,
88      MB_QUERY_WRITE_TO_GC,
89      MB_QUERY_SEND_DEVICE_ADDRESS,
90      MB_QUERY_SEND_SAVE_COMMAND,
91      MB_QUERY_GATEWAY,
92      MB_QUERY_SEND_DATA
93    }
94    mb_status_t;
95
96
97    typedef struct
98    {
99      //TIM_HandleTypeDef             * timer;                                  //  Timer config
100      //TIM_OC_InitTypeDef            * timerOcConfig;                          //  Zeiger auf TimerInit Struktur
101      UART_HandleTypeDef*                       uart;                                                                           //  Zeiger auf das Uart Modul
102      GPIO_TypeDef*                                     driverEnableGPIO;                                                       //  Zuständiger einschalt Port
103      uint16_t                      driverEnableGPIOPin;                                                //  Zuständiger einschalt Pin
104      uint32_t                      mb_t15_total_timer_ticks;                                   //  max timeout zwischen einzelnen char
105      uint32_t                      mb_t35_total_timer_ticks;                                   //  timeout frame complete
106      volatile bool                 mb_rx_frame_complete;                                               //  frame complete ja/nein
107      uint32_t                      response_timeout_counter;                                   //  antwort Timeout
108                                                                                                                                                                //  QUERY (Anfrage):
109      uint8_t                       last_query_slave_adress;                                    //  zugehörige Slave Andresse
110      uint8_t                       last_query_function_code;                                   //  function Code
111      bword_t                       last_query_start_adress;                                    //  start Adresse
112      bword_t                       last_query_number_of_register;                              //  Anzahl der Register
113      bool                          last_query_timeout;                                                 //  Timeout
114      bword_t                       last_query_tcp_id;                                                  //  stack ID
115      mb_status_t                   current_query;                                                              //  Zeiger auf Statusstruktur
116      uint8_t                       rx_buffer[RXBUFFERSIZE];                                    //  Bufferarray Empfangen
117      uint8_t                       tx_buffer[TXBUFFERSIZE];                                    //  Bufferarray Senden
118      uint32_t                      rx_head;                                                                    //
119      uint32_t                      tx_head;                                                                    //
120      volatile bool                 setTxLed;                                                                   //  status Led
121      volatile bool                 setRxLed;                                                                   //  status Led
122    }
123    modbus_t;
124
125
126
127//Public Functions Modbus
128
129#ifdef __cplusplus
130extern "C" {
131#endif
132
133void mbTimerIsr(modbus_t * mb_data);                                                                                    // Timer Interrupt erkennt Fehler bei Framekomplettierung
134void mbInit(modbus_t* const mb_data, uint32_t baudrate, uint32_t parityMode, uint16_t stopBits, UART_HandleTypeDef* const usart); // Initialiserung des Moduls muss mit den passenden Parametern gefüllt werden
135bool mbGetFrameComplete(modbus_t * mb_data);                                                                    // überprüft ob ein Frame komplett ist
136void mbClearRxFrame(modbus_t * mb_data);
137void mbUartIsr(modbus_t* mb_data);                                                                                              // handelt den Interrupt
138
139
140//Public Fuctions Modbus SLAVE
141
142void mbSlaveProcessRtuQuery(modbus_t * mb_data);                                                                // Umgang mit ankommenden Anfragen und Verarbeitung dieser
143uint32_t mbSlaveCheckModbusRtuQuery(modbus_t * mb_data);                                                // Bedeutung der Anfrage und wie mit dieser umgegangen werden soll
144uint32_t mbSlaveProcessPdu( uint8_t* response_string, uint8_t * msg, uint32_t tx_position, uint8_t deviceID); // Verarbeite eine Anfrage
145
146//Public Fuctions Modbus MASTER
147
148void                  mbMasterStartRtuReadHoldingRegister(uint8_t slave_adress,  uint16_t start_adress, uint16_t number_of_registers, modbus_t * mb_data);
149bool                  mbMasterGetTimeout(modbus_t * mb_data);
150void                  mbMasterCheckResponseTimeout(modbus_t * mb_data);
151mb_error_codes_t      mbMasterCheckReadMultipleRegisterResponse(modbus_t * mb_data) ;
152mb_error_codes_t      check_write_multiple_register_response(modbus_t * mb_data) ;
153void                  mb_start_rtu_write_multiple_register(uint8_t slave_adress, uint16_t adress, uint16_t * values, uint8_t number_of_registers, modbus_t  * mb_data);
154void                              MODBUS_UART_IRQHandler(UART_HandleTypeDef* const huart, modbus_t* const modbusData);
155
156#ifdef __cplusplus
157 }
158#endif
159
160#endif
161
162#endif // __MODBUS_H_
Note: See TracBrowser for help on using the repository browser.