284 lines
7.7 KiB
C
284 lines
7.7 KiB
C
#include "drv_uart.h"
|
|
|
|
#include "bsp_flash.h"
|
|
#include "bsp_queue.h"
|
|
|
|
#include "db_config.h"
|
|
|
|
#include "version_manager.h"
|
|
#include "gpio_manager.h"
|
|
#include "comm_manager.h"
|
|
#include "flash_manager.h"
|
|
#include "eeprom_manager.h"
|
|
#include "bmu_manager.h"
|
|
#include "kit_data.h"
|
|
#include "protocol_comm.h"
|
|
|
|
typedef enum
|
|
{
|
|
kModbusProtocal_None,
|
|
kModbusProtocal_BlueSun,
|
|
kModbusProtocal_End,
|
|
}ModbusProtocal;
|
|
|
|
typedef enum
|
|
{
|
|
kCanProtocal_None, //使用CAN并机的时候需要将外can协议设置为闲置
|
|
kCanProtocal_Bcu,
|
|
kCanProtocal_Bcu_invt, //英威腾协议
|
|
kCanProtocal_End,
|
|
}CanProtocal;
|
|
|
|
typedef struct
|
|
{
|
|
CanCommSend send;
|
|
CanCommPoll poll;
|
|
CanCommReceive receive;
|
|
}ProtocalCanItem;
|
|
|
|
extern QueueItem inter_can_queue;
|
|
extern QueueItem exter_can_queue;
|
|
extern ModbusItem w5500_modbus_tcp_array[W5500_MODBUS_NUM];
|
|
extern const UintArgFunCall tcp_server_poll[W5500_MODBUS_NUM];
|
|
|
|
QueueItem *queue_can[kcan_dev_e_End] =
|
|
{
|
|
&exter_can_queue,
|
|
&inter_can_queue,
|
|
};
|
|
|
|
|
|
/************************************************CAN*****************************************************/
|
|
ProtocalCanItem protocal_can[kcan_dev_e_End];
|
|
|
|
void protocol_can_none_init(can_dev_e can)
|
|
{
|
|
protocol_can_set_call(can, NULL, NULL, NULL);
|
|
}
|
|
|
|
typedef void (*CanProtocalCall)(can_dev_e can);
|
|
CanProtocalCall protocol_can_init_array[kCanProtocal_End] =
|
|
{
|
|
protocol_can_none_init,
|
|
protocol_can_bcu_init,
|
|
};
|
|
|
|
/************************************************modbus*****************************************************/
|
|
void protocal_modbus_none_init(ModbusItem * const mb_item, uint8_t addr)
|
|
{
|
|
register_modbus_fun(mb_item, kModbusFun_0x01, NULL);
|
|
register_modbus_fun(mb_item, kModbusFun_0x02, NULL);
|
|
register_modbus_fun(mb_item, kModbusFun_0x03, NULL);
|
|
register_modbus_fun(mb_item, kModbusFun_0x04, NULL);
|
|
register_modbus_fun(mb_item, kModbusFun_0x06, NULL);
|
|
register_modbus_fun(mb_item, kModbusFun_0x10, NULL);
|
|
}
|
|
|
|
/************************************************Model*****************************************************/
|
|
typedef void (*UniteProtocalInit)(void * const item, uint16_t addr);
|
|
typedef enum
|
|
{
|
|
UniteProtocalType_Hmi,
|
|
UniteProtocalType_Modbus,
|
|
UniteProtocalType_Iec104,
|
|
UniteProtocalType_End,
|
|
}UniteProtocalType;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
bool is_used_model;
|
|
UniteProtocalType type;
|
|
UniteProtocalInit init;
|
|
}UniteProtocol;
|
|
|
|
|
|
UniteProtocol unite_protocol_init_array[kModbusProtocal_End] =
|
|
{
|
|
false, UniteProtocalType_Modbus, protocol_modbus_bcu_init
|
|
//false, UniteProtocalType_Modbus, protocol_modbus_blusun_init
|
|
};
|
|
|
|
/************************************************Init*****************************************************/
|
|
void protocol_comm_init(void)
|
|
{
|
|
uint16_t protocol, addr;
|
|
uint32_t i, j;
|
|
|
|
bms_analyse_model_data();
|
|
|
|
//485通讯协议
|
|
for(j = 0; j < kModbusIdx_End; j++)
|
|
{
|
|
addr = get_eeprom_data(kEep_InterRS485_SlaveID_Protocol + j, kEepromDataType_High);
|
|
protocol = get_eeprom_data(kEep_InterRS485_SlaveID_Protocol + j, kEepromDataType_Low);
|
|
if((protocol < kModbusProtocal_End))// && (unite_protocol_init_array[protocol].type == UniteProtocalType_Modbus)
|
|
{
|
|
if((bms_get_modbus_model_task_num(j) > 0) && (unite_protocol_init_array[protocol].is_used_model == true))
|
|
{
|
|
modbus_rtu_array[j]->is_read_write_data = true;
|
|
bms_set_tag_data(kTagData_GateIdx, protocol);
|
|
for(i = 0; i < bms_get_modbus_model_task_num(j); i++)
|
|
{
|
|
bsp_modbus_register_task(modbus_rtu_array[j], bms_get_modbus_model_head_addr(j, i));
|
|
}
|
|
}
|
|
if(unite_protocol_init_array[protocol].init != NULL)
|
|
{
|
|
if(unite_protocol_init_array[protocol].type == UniteProtocalType_Hmi)
|
|
{
|
|
;//上位机预留
|
|
}
|
|
else
|
|
{
|
|
unite_protocol_init_array[protocol].init(modbus_rtu_array[j], addr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < kcan_dev_e_End;i++)
|
|
{
|
|
protocol = get_eeprom_data(kEep_InterCanProtocol_Baudrate + i, kEepromDataType_High);
|
|
//测试
|
|
protocol = 1;
|
|
if((protocol < kCanProtocal_End) && (protocol_can_init_array[protocol] != NULL))
|
|
{
|
|
protocol_can_init_array[protocol](i);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void protocol_can_set_call(can_dev_e can, CanCommReceive rx, CanCommSend tx, CanCommPoll poll)
|
|
{
|
|
if(can < kcan_dev_e_End)
|
|
{
|
|
protocal_can[can].send = tx;
|
|
protocal_can[can].poll = poll;
|
|
protocal_can[can].receive = rx;
|
|
}
|
|
}
|
|
|
|
|
|
void protocol_can_poll(uint32_t base_time, can_dev_e can)
|
|
{
|
|
CanMsg msg;
|
|
uint32_t cnt = 0;
|
|
|
|
if(can < kcan_dev_e_End)
|
|
{
|
|
if(protocal_can[can].receive != NULL)
|
|
{
|
|
while ((bsp_queue_pop_instance(queue_can[can], (uint8_t *)&msg) == kKit_Ret_Ok) && (++cnt < 100))
|
|
{
|
|
protocal_can[can].receive(&msg, can);
|
|
}
|
|
}
|
|
|
|
if(protocal_can[can].send != NULL)
|
|
{
|
|
protocal_can[can].send(base_time, can);
|
|
}
|
|
|
|
if(protocal_can[can].poll != NULL)
|
|
{
|
|
protocal_can[can].poll(base_time, can);
|
|
}
|
|
}
|
|
}
|
|
|
|
static uint32_t inter_modbus_count = 0,inter2_modbus_count = 0,inter3_modbus_count = 0;
|
|
void modbus_rtu_inter_handler(uint32_t base_time)
|
|
{
|
|
inter_modbus_count++;
|
|
bsp_modbus_poll(modbus_rtu_array[kModbusIdx_Inter], true);
|
|
}
|
|
|
|
|
|
void modbus_rtu_extern_handler(uint32_t base_time)
|
|
{
|
|
inter2_modbus_count++;
|
|
bsp_modbus_poll(modbus_rtu_array[kModbusIdx_Exter1], true);
|
|
}
|
|
|
|
|
|
void modbus_rtu_externII_handler(uint32_t base_time)
|
|
{
|
|
inter3_modbus_count++;
|
|
bsp_modbus_poll(modbus_rtu_array[kModbusIdx_Exter2], true);
|
|
}
|
|
|
|
typedef void (* UintArgCall) (uint32_t arg);
|
|
#if W5500_MODBUS_NUM > 0
|
|
void protocol_w5500_modbus_tcp_server1_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[0]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[0], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 1
|
|
void protocol_w5500_modbus_tcp_server2_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[1]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[1], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 2
|
|
void protocol_w5500_modbus_tcp_server3_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[2]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[2], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 3
|
|
void protocol_w5500_modbus_tcp_server4_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[3]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[3], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 4
|
|
void protocol_w5500_modbus_tcp_server5_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[4]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[4], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 5
|
|
void protocol_w5500_modbus_tcp_server6_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[5]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[5], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 6
|
|
void protocol_w5500_modbus_tcp_server7_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[6]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[6], true);
|
|
}
|
|
#endif
|
|
#if W5500_MODBUS_NUM > 7
|
|
void protocol_w5500_modbus_tcp_server8_poll(uint32_t base_time)
|
|
{
|
|
//bsp_iec104_poll(&w5500_iec104_array[7]);
|
|
bsp_modbus_poll(&w5500_modbus_tcp_array[7], true);
|
|
}
|
|
#endif
|
|
|
|
const UintArgCall tcp_server_poll[W5500_MODBUS_NUM] =
|
|
{
|
|
protocol_w5500_modbus_tcp_server1_poll,
|
|
protocol_w5500_modbus_tcp_server2_poll,
|
|
protocol_w5500_modbus_tcp_server3_poll,
|
|
protocol_w5500_modbus_tcp_server4_poll,
|
|
protocol_w5500_modbus_tcp_server5_poll,
|
|
protocol_w5500_modbus_tcp_server6_poll,
|
|
protocol_w5500_modbus_tcp_server7_poll,
|
|
protocol_w5500_modbus_tcp_server8_poll,
|
|
};
|
|
|
|
|
|
|