подправлены внешний вид и коменты
This commit is contained in:
parent
ef623e8b0b
commit
f5210ce050
@ -1,4 +1,4 @@
|
||||
#include "crc_algs.h"
|
||||
#include "modbus/crc_algs.h"
|
||||
|
||||
|
||||
uint32_t CRC_calc;
|
||||
|
51
modbus.cpp
51
modbus.cpp
@ -11,6 +11,9 @@
|
||||
*
|
||||
* @section Функции и макросы
|
||||
*
|
||||
* ### Инициализация:
|
||||
* - MODBUS_FirstInit() — Инициализация модуля Modbus.
|
||||
*
|
||||
* ### Доступ к coils:
|
||||
* - MB_Set_Coil_Local() — Установить coil по локальному адресу.
|
||||
* - MB_Reset_Coil_Local() — Сбросить coil по локальному адресу.
|
||||
@ -36,8 +39,6 @@
|
||||
* - RS_Define_Size_of_RX_Message() — Определение размера принимаемого сообщения.
|
||||
* - RS_Init() — Инициализация UART.
|
||||
*
|
||||
* ### Инициализация:
|
||||
* - MODBUS_FirstInit() — Инициализация модуля Modbus.
|
||||
*
|
||||
* @section Структура данных Modbus
|
||||
*
|
||||
@ -52,21 +53,27 @@
|
||||
* @section Инструкция по подключению
|
||||
* Настройте modbus_config.h дефайны для нужной работы UART
|
||||
*
|
||||
* После для запуска Modbus:
|
||||
* Минимум для запуска Modbus:
|
||||
* @verbatim
|
||||
//----------------Прием модбас----------------//
|
||||
#include "rs_message.h"
|
||||
MODBUS_FirstInit();
|
||||
|
||||
void loop()
|
||||
{
|
||||
RS_Process(&hmodbus1);(&hmodbus1, &MODBUS_MSG);
|
||||
RS_Process(&hmodbus1);
|
||||
}
|
||||
* @endverbatim
|
||||
* Для RTOS:
|
||||
* @verbatim
|
||||
#include "rs_message.h"
|
||||
MODBUS_FirstInit();
|
||||
|
||||
xTaskCreatePinnedToCore(RS_Task, "Modbus", 4096, &hmodbus1, 2, NULL, 1);
|
||||
* @endverbatim
|
||||
*
|
||||
******************************************************************************/
|
||||
#include "crc_algs.h"
|
||||
#include "rs_message.h"
|
||||
#include "modbus/crc_algs.h"
|
||||
#include "modbus/rs_message.h"
|
||||
uint32_t dbg_temp, dbg_temp2, dbg_temp3; // for debug
|
||||
RS_HandleTypeDef hmodbus1;
|
||||
|
||||
@ -94,7 +101,7 @@ void MODBUS_FirstInit(void)
|
||||
hmodbus1.pMessagePtr = &MODBUS_MSG;
|
||||
hmodbus1.rx_pin = MODBUS_RX_PIN;
|
||||
hmodbus1.tx_pin = MODBUS_TX_PIN;
|
||||
hmodbus1.taskDelay = RS_IN_FREERTOS;
|
||||
hmodbus1.taskDelay = RS_IN_RTOS;
|
||||
// INIT
|
||||
hmodbus1.RS_STATUS = RS_Init(&hmodbus1, &rs_huart, MODBUS_SPEED, 0);
|
||||
|
||||
@ -342,14 +349,14 @@ uint8_t MB_Read_Coils(RS_MsgTypeDef *modbus_msg)
|
||||
shift = 0; // set shift to zero for the next step
|
||||
|
||||
//-----------READ COILS--------------
|
||||
modbus_msg->DATA[ind] = (*(coils+ind)&mask_for_coils) >> start_shift;
|
||||
modbus_msg->DWDATA[ind] = (*(coils+ind)&mask_for_coils) >> start_shift;
|
||||
if(ind > 0)
|
||||
modbus_msg->DATA[ind-1] |= ((*(coils+ind)&mask_for_coils) << 16) >> start_shift;
|
||||
modbus_msg->DWDATA[ind-1] |= ((*(coils+ind)&mask_for_coils) << 16) >> start_shift;
|
||||
|
||||
}
|
||||
// т.к. DATA 16-битная, для 8-битной передачи, надо поменять местами верхний и нижний байты
|
||||
// т.к. DWDATA 16-битная, для 8-битной передачи, надо поменять местами верхний и нижний байты
|
||||
for(; ind >= 0; --ind)
|
||||
modbus_msg->DATA[ind] = ByteSwap16(modbus_msg->DATA[ind]);
|
||||
modbus_msg->DWDATA[ind] = ByteSwap16(modbus_msg->DWDATA[ind]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -377,7 +384,7 @@ uint8_t MB_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg)
|
||||
int i;
|
||||
for (i = 0; i<modbus_msg->Qnt; i++)
|
||||
{
|
||||
modbus_msg->DATA[i] = *(pHoldRegs++);
|
||||
modbus_msg->DWDATA[i] = *(pHoldRegs++);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -406,9 +413,9 @@ uint8_t MB_Read_Input_Regs(RS_MsgTypeDef *modbus_msg)
|
||||
for (i = 0; i<modbus_msg->Qnt; i++)
|
||||
{
|
||||
if(*((int16_t *)pInRegs) > 0)
|
||||
modbus_msg->DATA[i] = (*pInRegs++);
|
||||
modbus_msg->DWDATA[i] = (*pInRegs++);
|
||||
else
|
||||
modbus_msg->DATA[i] = (*pInRegs++);
|
||||
modbus_msg->DWDATA[i] = (*pInRegs++);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -510,10 +517,10 @@ uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg)
|
||||
// get current coils
|
||||
temp_reg = *(coils+ind);
|
||||
// set coils
|
||||
setted_coils = ByteSwap16(modbus_msg->DATA[ind]) << start_shift;
|
||||
setted_coils = ByteSwap16(modbus_msg->DWDATA[ind]) << start_shift;
|
||||
if(ind > 0)
|
||||
{
|
||||
setted_coils |= ((ByteSwap16(modbus_msg->DATA[ind-1]) << start_shift) >> 16);
|
||||
setted_coils |= ((ByteSwap16(modbus_msg->DWDATA[ind-1]) << start_shift) >> 16);
|
||||
}
|
||||
// write coils
|
||||
|
||||
@ -552,7 +559,7 @@ uint8_t MB_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg)
|
||||
//-----------WRITTING REGS-----------
|
||||
for (int i = 0; i<modbus_msg->Qnt; i++)
|
||||
{
|
||||
*(pHoldRegs++) = modbus_msg->DATA[i];
|
||||
*(pHoldRegs++) = modbus_msg->DWDATA[i];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -573,7 +580,7 @@ void MB_WriteObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef
|
||||
*/
|
||||
uint8_t MB_Read_Device_Identification(RS_MsgTypeDef *modbus_msg)
|
||||
{
|
||||
char *mbdata = (char *)modbus_msg->DATA;
|
||||
char *mbdata = (char *)modbus_msg->DWDATA;
|
||||
unsigned ind = 0;
|
||||
switch(modbus_msg->DevId.ReadDevId)
|
||||
{
|
||||
@ -769,7 +776,7 @@ RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
|
||||
|
||||
//---------------DATA----------------
|
||||
//-----------[data bytes]------------
|
||||
uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->DATA;
|
||||
uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->DWDATA;
|
||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
|
||||
{ // set data
|
||||
modbus_uart_buff[ind++] = *tmp_data_addr;
|
||||
@ -790,7 +797,7 @@ RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
|
||||
|
||||
//---------------DATA----------------
|
||||
//-----------[data bytes]------------
|
||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DATA;
|
||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DWDATA;
|
||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
|
||||
{ // set data
|
||||
if (i%2 == 0) // HI byte
|
||||
@ -878,7 +885,7 @@ RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modb
|
||||
MB_DEBUG_PRINT("[MB] Request is invalid (ByteCnt not match DataSize)");
|
||||
return RS_PARSE_MSG_ERR;
|
||||
}
|
||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DATA;
|
||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DWDATA;
|
||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // /2 because we transmit 8 bits, not 16 bits
|
||||
{ // set data
|
||||
if (i%2 == 0)
|
||||
|
12
modbus.h
12
modbus.h
@ -12,9 +12,8 @@
|
||||
#ifndef __MODBUS_H_
|
||||
#define __MODBUS_H_
|
||||
|
||||
#include "modbus_config.h"
|
||||
#include "modbus_data.h"
|
||||
//#include "settings.h" // for modbus settings
|
||||
#include "modbus/modbus_config.h"
|
||||
#include "modbus/modbus_data.h"
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_SETTINGS
|
||||
@ -22,11 +21,6 @@
|
||||
* @brief Some defines for modbus
|
||||
@{
|
||||
*/
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////---SETTINGS---/////////////////////////////
|
||||
// USER SETTINGS FOR MODBUS IN interface_config.h
|
||||
//////////////////////////---SETTINGS---/////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
/////////////////////---USER MESSAGE DEFINES---//////////////////////
|
||||
@ -141,7 +135,7 @@ typedef struct // RS_MsgTypeDef
|
||||
uint16_t Qnt; ///< Quantity of modbus data
|
||||
uint8_t ByteCnt; ///< Quantity of bytes of data in message to transmit/receive
|
||||
|
||||
uint16_t DATA[DATA_SIZE]; ///< Modbus Data
|
||||
uint16_t DWDATA[DATA_SIZE]; ///< Modbus Data (Words)
|
||||
MB_ExceptionTypeDef Except_Code; ///< Exception Code for the command
|
||||
|
||||
uint16_t MB_CRC; ///< Modbus CRC
|
||||
|
@ -7,8 +7,7 @@
|
||||
#ifndef _MODBUS_CONFIG_H_
|
||||
#define _MODBUS_CONFIG_H_
|
||||
|
||||
#define RS_IN_FREERTOS 20 ///< значение - период таска
|
||||
|
||||
#define RS_IN_RTOS 20 ///< значение - период таска
|
||||
|
||||
// Включить/выключить debug
|
||||
#define RS_DEBUG 1 ///< Отладка приема/передачи UART
|
||||
@ -21,7 +20,7 @@
|
||||
|
||||
// PERIPH FUNCTIONS AND HANDLERS
|
||||
#define HUART_TypeDef HardwareSerial
|
||||
#define rs_huart Serial1 //используемый uart
|
||||
#define rs_huart Serial2 //используемый uart1`
|
||||
#define MODBUS_SPEED 115200
|
||||
#define MODBUS_RX_PIN 8
|
||||
#define MODBUS_TX_PIN 9
|
||||
|
@ -135,7 +135,7 @@ extern MB_DataStructureTypeDef MB_DATA;
|
||||
typedef struct
|
||||
{
|
||||
unsigned length;
|
||||
char *name;
|
||||
const char *name;
|
||||
}MB_DeviceObjectTypeDef;
|
||||
/**
|
||||
* @brief Структура для объектов Modbus
|
||||
|
@ -35,7 +35,7 @@
|
||||
*
|
||||
* @note
|
||||
* - В режиме Arduino loop необходимо вызывать RS_Process() в основном цикле.
|
||||
* - В режиме FreeRTOS требуется определить макрос RS_IN_FREERTOS,
|
||||
* - В режиме FreeRTOS требуется определить макрос RS_IN_RTOS,
|
||||
* создать задачу RS_Task и подключить RS_UART_RX_Handler() к ISR UART.
|
||||
* - UART используется через стандартный Arduino Stream API (write, read, available).
|
||||
*
|
||||
@ -50,7 +50,7 @@ void loop() {
|
||||
RS_Process(&hRS);
|
||||
}
|
||||
* @endverbatim
|
||||
* Пример использования с FreeRTOS:
|
||||
* Пример использования с RTOS:
|
||||
* @verbatim
|
||||
RS_HandleTypeDef hRS;
|
||||
RS_MsgTypeDef msg;
|
||||
@ -65,11 +65,7 @@ void eventSerial() {
|
||||
* @endverbatim
|
||||
**************************************************************************/
|
||||
|
||||
#include "rs_message.h"
|
||||
|
||||
#ifdef RS_IN_FREERTOS
|
||||
#include <FreeRTOS.h>
|
||||
#endif
|
||||
#include "modbus/rs_message.h"
|
||||
|
||||
uint8_t RS_Buffer[MSG_SIZE_MAX]; // uart buffer
|
||||
|
||||
@ -187,7 +183,7 @@ RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *
|
||||
return RS_OK;
|
||||
}
|
||||
|
||||
#ifdef RS_IN_FREERTOS
|
||||
#ifdef RS_IN_RTOS
|
||||
|
||||
/**
|
||||
* @brief Задача обработки UART приёма (FreeRTOS).
|
||||
@ -203,7 +199,7 @@ void RS_Task(void *pvParameters) {
|
||||
vTaskDelay(pdMS_TO_TICKS(hRS->taskDelay));
|
||||
}
|
||||
}
|
||||
#endif // RS_IN_FREERTOS
|
||||
#endif // RS_IN_RTOS
|
||||
|
||||
|
||||
/**
|
||||
|
@ -21,7 +21,7 @@
|
||||
*************************************************************************/
|
||||
#ifndef __RS_LIB_H_
|
||||
#define __RS_LIB_H_
|
||||
#include "modbus.h"
|
||||
#include "modbus/modbus.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////---DEFINES---////////////////////////////
|
||||
@ -148,7 +148,7 @@ typedef struct // RS_HandleTypeDef
|
||||
uint8_t ID; ///< ID of RS "channel"
|
||||
RS_MsgTypeDef *pMessagePtr; ///< pointer to message struct
|
||||
uint8_t *pBufferPtr; ///< pointer to message buffer
|
||||
#ifdef RS_IN_FREERTOS
|
||||
#ifdef RS_IN_RTOS
|
||||
uint16_t taskDelay; ///< freertos buffer
|
||||
#endif
|
||||
uint32_t RS_Message_Size; ///< size of whole message, not only data
|
||||
|
Loading…
Reference in New Issue
Block a user