source: ecs_cellMon/firmware/inc/modbus_.h @ 3

Last change on this file since 3 was 3, checked in by f.jahn, 20 months ago

fw hinzugfügt-->zed

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