// /** // ************************************************************************************************ // * @file pcs_nr.c // * @author 国轩储能 // * @version V1.0 // * @date 2018-11-20 // * @brief 南瑞pcs通讯 // * @attention // ************************************************************************************************ // **/ // #include "ModbusTcp_Client.h" // #include "os_my_var.h" // #include "pcs_nr.h" // #include "socket.h" // #include "w5500.h" // u16 pcs_run_data1[48]; // pcs1 运行数据 // u32 time_pcs; // void __bsp_Pcs_FrameSend_W5500(const u8 *pMsg, u8 count); // void Pcs_RecFrame_1st(const u8 *p); // void Pcs_RecFrame_2nd(const u8 *p); // void (*Func_PcsHandleFrame[2])(const u8 *p) = {Pcs_RecFrame_1st, Pcs_RecFrame_2nd}; // 定义PCS接收帧 // // 定义PCS发送帧 // FrameSend_TypeDef PCSFrameArray[PCS_FRAME_COUNT] = // { // {0, 1, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st}, // {1, 0, 0x000a, 36, ModbusTcpCli_SendFrame04, Pcs_RecFrame_2nd}, // {2, 3, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st}, // {3, 4, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st}, // {4, 0, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st}, // }; // ModbusTcpCli_TypeDef ModbusTcpCli_Pcs = {1, __bsp_Pcs_FrameSend_W5500}; // 1: 从机地址, __bsp_Pcs_FrameSend_W5500:发送函数 // /**************************************************** // * 函 数 名:CopyPCS1_DataRun // * 函数功能:读取PCS1运行数据 // * 入口参数:register_addr 寄存器地址 count 数量 p 缓冲区指针 // * 说 明:无 // *****************************************************/ // void CopyPCS1_DataRun(u16 register_addr, u16 count, u16 *p) // { // u16 offset, i; // offset = register_addr - MODBUS_ADDR_PCS1_RUN; // for (i = 0; i < count; i++) // *p++ = pcs_run_data1[offset + i]; // } // /**************************************************** // * 函 数 名:PCS1_ParSet_YK // * 函数功能:PCS遥控参数设置 // * 入口参数:register_addr: 寄存器地址, data: 0 断开 1 闭合 // * 说 明:无 // *****************************************************/ // void PCS1_ParSet_YK(u16 register_addr, u16 data) // { // u16 register_pcs, value; // OS_RESULT result; // u8 *pMsg; // register_pcs = register_addr - MODBUS_ADDR_YK_PCS1 + MODBUS_ADDRRESS_PCS_YK; // if (getSn_SR(SOCK_PCS1) == SOCK_ESTABLISHED) // { // value = data ? 0xFF00 : 0; // 0 断开 1 吸合 // ModbusTcpCli_SendFrame05(register_pcs, value, &ModbusTcpCli_Pcs); // /* 等待收到数据,不阻塞任务 */ // result = os_mbx_wait(&pcs_set_mailbox, (void *)&pMsg, TIME_200MS); // // OS_R_OK,表示消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待 // // OS_R_MBX,表示在设置的超时时间范围内收到消息 // if ((result == OS_R_OK || result == OS_R_MBX) && (pMsg[7] == 0x05)) // 成功获得消息 // { // value = value; // 调试用 // } // } // } // /**************************************************** // * 函 数 名:PCS_ParSet_YK // * 函数功能:PCS遥控直流断路器 // * 入口参数:data: 数量, stack_id 电池堆编号(1开始) // * 说 明:无 // *****************************************************/ // void PCS_DCBreaker_YK(u8 data) // { // PCS1_ParSet_YK(MODBUS_ADDR_PCS1_DC_BREAKER_HMI, data); // PCS1 // } // /**************************************************** // * 函 数 名:PCS1_ParSet_YT // * 函数功能:PCS遥调参数设置 // * 入口参数:register_addr 寄存器地址 count 数量 p 缓冲区指针 // * 说 明:无 // *****************************************************/ // void PCS1_ParSet_YT(u16 register_addr, int16_t data) // { // OS_RESULT result; // u8 *pMsg; // u16 register_pcs, temp; // // if(data < 0) // 设置功率-10,pcs显示-11 // // data++; // register_pcs = register_addr - MODBUS_ADDR_YT_PCS1 + MODBUS_ADDRRESS_PCS_YT; // ModbusTcpCli_SendFrame06(register_pcs, data, &ModbusTcpCli_Pcs); // /* 等待PCS数据,不阻塞任务 */ // result = os_mbx_wait(&pcs_set_mailbox, (void *)&pMsg, TIME_200MS); // // OS_R_OK,表示消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待 // // OS_R_MBX,表示在设置的超时时间范围内收到消息。 // if ((result == OS_R_OK || result == OS_R_MBX) && (pMsg[7] == 0x06)) // 成功获得消息 // { // temp = temp; // } // } // /**************************************************** // * 函 数 名:PCS1_NetHandle // * 函数功能:处理PCS发过来数据帧 // * 入口参数:p 缓冲区指针 // * 说 明:无 // *****************************************************/ // // void PCS1_NetHandle(const u8 *p, u16 register_addr) // //{ // // // 00 00 00 00 00 05 01 04 字节数 dataH dataL // // u8 offset, i, temp1, temp2, count; // // // // count = p[8]/2; // // offset = register_addr - MODBUS_ADDR_PCS1_RUN; // // if(p[7] == MODBUS_FUNCTION_CODE_04) // 读取PCS运行数据 // // { // // for(i = 0; i < count; i++) // // { // // temp1 = p[9 + 2*i]; // // temp2 = p[9 + 2*i +1]; // // pcs_run_data1[offset + i] = (temp1 << 8) + temp2; // // } // // } // // } // /**************************************************** // * 函 数 名:SendFrame_ReadPcsData // * 函数功能:发送获取PCS1数据报文 // * 入口参数:register_addr 寄存器地址 count 数量 // * 说 明:无 // ****************************************************/ // void ReadPcsData(void) // { // u32 time1, time2; // static u8 cur_index = 0; // 1#pcs帧序号 // OS_RESULT result; // u8 *pMsg; // FrameSend_TypeDef PCSFrame = PCSFrameArray[cur_index]; // 指向当前帧 // if (getSn_SR(SOCK_PCS1) == SOCK_ESTABLISHED) // { // // 从发送数据帧到消息邮箱收到数据,办公室实测最短时间20ms,最长40ms // PCSFrame.Send(PCSFrame.start_addr, PCSFrame.reg_count, &ModbusTcpCli_Pcs); // 发送 // time1 = DWT_CYCCOUNT; // /* 等待PCS数据,不阻塞任务 */ // result = os_mbx_wait(&pcs_yc_mailbox, (void *)&pMsg, TIME_200MS); // // OS_R_OK,表示消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待 // // OS_R_MBX,表示在设置的超时时间范围内收到消息。 // if (result == OS_R_OK || result == OS_R_MBX) // 成功获得消息 // { // time2 = DWT_CYCCOUNT; // time_pcs = (time2 - time1) / 168; // #if defined(__HUAIBEI) // PCSFrame.Receive(pMsg); // #elif defined(__PRODUCT_TEST) // SG_PCS1_NetHandle(rec_buf_pcs1); // 处理PCS发过来数据帧 // #else // #error no such macro!; // #endif // } // cur_index = PCSFrame.next_index; // Battery_ImportantData[INDEX_STATE_PCS1].com_state = STATE_OK; // } // else // Battery_ImportantData[INDEX_STATE_PCS1].com_state = STATE_FAULT; // } // void Pcs_RecFrame_1st(const u8 *p) // { // // 字节数 // // 00 00 00 00 00 04 01 03 2 dataH dataL // u8 offset, i, temp1, temp2, count; // count = p[8] / 2; // offset = 0; // register_addr - MODBUS_ADDR_PCS1_RUN; // if (p[7] == MODBUS_FUNCTION_CODE_04) // 读取PCS运行数据 // { // for (i = 0; i < count; i++) // { // temp1 = p[9 + 2 * i]; // temp2 = p[9 + 2 * i + 1]; // pcs_run_data1[offset + i] = (temp1 << 8) + temp2; // } // } // } // void Pcs_RecFrame_2nd(const u8 *p) // { // u8 offset, i, temp1, temp2, count; // count = p[8] / 2; // offset = 10; // register_addr - MODBUS_ADDR_PCS1_RUN; // if (p[7] == MODBUS_FUNCTION_CODE_04) // 读取PCS运行数据 // { // for (i = 0; i < count; i++) // { // temp1 = p[9 + 2 * i]; // temp2 = p[9 + 2 * i + 1]; // pcs_run_data1[offset + i] = (temp1 << 8) + temp2; // } // } // } // void __bsp_Pcs_FrameSend_W5500(const u8 *pMsg, u8 count) // { // w5500_send(SOCK_PCS1, pMsg, count); // // ModbusTcpCli_Pcs1 ModbusTcpCli_TypeDef // }