// /**
// ************************************************************************************************
// * @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
// }
