pcs.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // /**
  2. // ************************************************************************************************
  3. // * @file pcs_nr.c
  4. // * @author 国轩储能
  5. // * @version V1.0
  6. // * @date 2018-11-20
  7. // * @brief 南瑞pcs通讯
  8. // * @attention
  9. // ************************************************************************************************
  10. // **/
  11. // #include "ModbusTcp_Client.h"
  12. // #include "os_my_var.h"
  13. // #include "pcs_nr.h"
  14. // #include "socket.h"
  15. // #include "w5500.h"
  16. // u16 pcs_run_data1[48]; // pcs1 运行数据
  17. // u32 time_pcs;
  18. // void __bsp_Pcs_FrameSend_W5500(const u8 *pMsg, u8 count);
  19. // void Pcs_RecFrame_1st(const u8 *p);
  20. // void Pcs_RecFrame_2nd(const u8 *p);
  21. // void (*Func_PcsHandleFrame[2])(const u8 *p) = {Pcs_RecFrame_1st, Pcs_RecFrame_2nd}; // 定义PCS接收帧
  22. // // 定义PCS发送帧
  23. // FrameSend_TypeDef PCSFrameArray[PCS_FRAME_COUNT] =
  24. // {
  25. // {0, 1, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st},
  26. // {1, 0, 0x000a, 36, ModbusTcpCli_SendFrame04, Pcs_RecFrame_2nd},
  27. // {2, 3, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st},
  28. // {3, 4, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st},
  29. // {4, 0, 0x0000, 10, ModbusTcpCli_SendFrame04, Pcs_RecFrame_1st},
  30. // };
  31. // ModbusTcpCli_TypeDef ModbusTcpCli_Pcs = {1, __bsp_Pcs_FrameSend_W5500}; // 1: 从机地址, __bsp_Pcs_FrameSend_W5500:发送函数
  32. // /****************************************************
  33. // * 函 数 名:CopyPCS1_DataRun
  34. // * 函数功能:读取PCS1运行数据
  35. // * 入口参数:register_addr 寄存器地址 count 数量 p 缓冲区指针
  36. // * 说 明:无
  37. // *****************************************************/
  38. // void CopyPCS1_DataRun(u16 register_addr, u16 count, u16 *p)
  39. // {
  40. // u16 offset, i;
  41. // offset = register_addr - MODBUS_ADDR_PCS1_RUN;
  42. // for (i = 0; i < count; i++)
  43. // *p++ = pcs_run_data1[offset + i];
  44. // }
  45. // /****************************************************
  46. // * 函 数 名:PCS1_ParSet_YK
  47. // * 函数功能:PCS遥控参数设置
  48. // * 入口参数:register_addr: 寄存器地址, data: 0 断开 1 闭合
  49. // * 说 明:无
  50. // *****************************************************/
  51. // void PCS1_ParSet_YK(u16 register_addr, u16 data)
  52. // {
  53. // u16 register_pcs, value;
  54. // OS_RESULT result;
  55. // u8 *pMsg;
  56. // register_pcs = register_addr - MODBUS_ADDR_YK_PCS1 + MODBUS_ADDRRESS_PCS_YK;
  57. // if (getSn_SR(SOCK_PCS1) == SOCK_ESTABLISHED)
  58. // {
  59. // value = data ? 0xFF00 : 0; // 0 断开 1 吸合
  60. // ModbusTcpCli_SendFrame05(register_pcs, value, &ModbusTcpCli_Pcs);
  61. // /* 等待收到数据,不阻塞任务 */
  62. // result = os_mbx_wait(&pcs_set_mailbox, (void *)&pMsg, TIME_200MS);
  63. // // OS_R_OK,表示消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待
  64. // // OS_R_MBX,表示在设置的超时时间范围内收到消息
  65. // if ((result == OS_R_OK || result == OS_R_MBX) && (pMsg[7] == 0x05)) // 成功获得消息
  66. // {
  67. // value = value; // 调试用
  68. // }
  69. // }
  70. // }
  71. // /****************************************************
  72. // * 函 数 名:PCS_ParSet_YK
  73. // * 函数功能:PCS遥控直流断路器
  74. // * 入口参数:data: 数量, stack_id 电池堆编号(1开始)
  75. // * 说 明:无
  76. // *****************************************************/
  77. // void PCS_DCBreaker_YK(u8 data)
  78. // {
  79. // PCS1_ParSet_YK(MODBUS_ADDR_PCS1_DC_BREAKER_HMI, data); // PCS1
  80. // }
  81. // /****************************************************
  82. // * 函 数 名:PCS1_ParSet_YT
  83. // * 函数功能:PCS遥调参数设置
  84. // * 入口参数:register_addr 寄存器地址 count 数量 p 缓冲区指针
  85. // * 说 明:无
  86. // *****************************************************/
  87. // void PCS1_ParSet_YT(u16 register_addr, int16_t data)
  88. // {
  89. // OS_RESULT result;
  90. // u8 *pMsg;
  91. // u16 register_pcs, temp;
  92. // // if(data < 0) // 设置功率-10,pcs显示-11
  93. // // data++;
  94. // register_pcs = register_addr - MODBUS_ADDR_YT_PCS1 + MODBUS_ADDRRESS_PCS_YT;
  95. // ModbusTcpCli_SendFrame06(register_pcs, data, &ModbusTcpCli_Pcs);
  96. // /* 等待PCS数据,不阻塞任务 */
  97. // result = os_mbx_wait(&pcs_set_mailbox, (void *)&pMsg, TIME_200MS);
  98. // // OS_R_OK,表示消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待
  99. // // OS_R_MBX,表示在设置的超时时间范围内收到消息。
  100. // if ((result == OS_R_OK || result == OS_R_MBX) && (pMsg[7] == 0x06)) // 成功获得消息
  101. // {
  102. // temp = temp;
  103. // }
  104. // }
  105. // /****************************************************
  106. // * 函 数 名:PCS1_NetHandle
  107. // * 函数功能:处理PCS发过来数据帧
  108. // * 入口参数:p 缓冲区指针
  109. // * 说 明:无
  110. // *****************************************************/
  111. // // void PCS1_NetHandle(const u8 *p, u16 register_addr)
  112. // //{
  113. // // // 00 00 00 00 00 05 01 04 字节数 dataH dataL
  114. // // u8 offset, i, temp1, temp2, count;
  115. // //
  116. // // count = p[8]/2;
  117. // // offset = register_addr - MODBUS_ADDR_PCS1_RUN;
  118. // // if(p[7] == MODBUS_FUNCTION_CODE_04) // 读取PCS运行数据
  119. // // {
  120. // // for(i = 0; i < count; i++)
  121. // // {
  122. // // temp1 = p[9 + 2*i];
  123. // // temp2 = p[9 + 2*i +1];
  124. // // pcs_run_data1[offset + i] = (temp1 << 8) + temp2;
  125. // // }
  126. // // }
  127. // // }
  128. // /****************************************************
  129. // * 函 数 名:SendFrame_ReadPcsData
  130. // * 函数功能:发送获取PCS1数据报文
  131. // * 入口参数:register_addr 寄存器地址 count 数量
  132. // * 说 明:无
  133. // ****************************************************/
  134. // void ReadPcsData(void)
  135. // {
  136. // u32 time1, time2;
  137. // static u8 cur_index = 0; // 1#pcs帧序号
  138. // OS_RESULT result;
  139. // u8 *pMsg;
  140. // FrameSend_TypeDef PCSFrame = PCSFrameArray[cur_index]; // 指向当前帧
  141. // if (getSn_SR(SOCK_PCS1) == SOCK_ESTABLISHED)
  142. // {
  143. // // 从发送数据帧到消息邮箱收到数据,办公室实测最短时间20ms,最长40ms
  144. // PCSFrame.Send(PCSFrame.start_addr, PCSFrame.reg_count, &ModbusTcpCli_Pcs); // 发送
  145. // time1 = DWT_CYCCOUNT;
  146. // /* 等待PCS数据,不阻塞任务 */
  147. // result = os_mbx_wait(&pcs_yc_mailbox, (void *)&pMsg, TIME_200MS);
  148. // // OS_R_OK,表示消息邮箱中有消息,立即从消息邮箱中获得消息,无需等待
  149. // // OS_R_MBX,表示在设置的超时时间范围内收到消息。
  150. // if (result == OS_R_OK || result == OS_R_MBX) // 成功获得消息
  151. // {
  152. // time2 = DWT_CYCCOUNT;
  153. // time_pcs = (time2 - time1) / 168;
  154. // #if defined(__HUAIBEI)
  155. // PCSFrame.Receive(pMsg);
  156. // #elif defined(__PRODUCT_TEST)
  157. // SG_PCS1_NetHandle(rec_buf_pcs1); // 处理PCS发过来数据帧
  158. // #else
  159. // #error no such macro!;
  160. // #endif
  161. // }
  162. // cur_index = PCSFrame.next_index;
  163. // Battery_ImportantData[INDEX_STATE_PCS1].com_state = STATE_OK;
  164. // }
  165. // else
  166. // Battery_ImportantData[INDEX_STATE_PCS1].com_state = STATE_FAULT;
  167. // }
  168. // void Pcs_RecFrame_1st(const u8 *p)
  169. // {
  170. // // 字节数
  171. // // 00 00 00 00 00 04 01 03 2 dataH dataL
  172. // u8 offset, i, temp1, temp2, count;
  173. // count = p[8] / 2;
  174. // offset = 0; // register_addr - MODBUS_ADDR_PCS1_RUN;
  175. // if (p[7] == MODBUS_FUNCTION_CODE_04) // 读取PCS运行数据
  176. // {
  177. // for (i = 0; i < count; i++)
  178. // {
  179. // temp1 = p[9 + 2 * i];
  180. // temp2 = p[9 + 2 * i + 1];
  181. // pcs_run_data1[offset + i] = (temp1 << 8) + temp2;
  182. // }
  183. // }
  184. // }
  185. // void Pcs_RecFrame_2nd(const u8 *p)
  186. // {
  187. // u8 offset, i, temp1, temp2, count;
  188. // count = p[8] / 2;
  189. // offset = 10; // register_addr - MODBUS_ADDR_PCS1_RUN;
  190. // if (p[7] == MODBUS_FUNCTION_CODE_04) // 读取PCS运行数据
  191. // {
  192. // for (i = 0; i < count; i++)
  193. // {
  194. // temp1 = p[9 + 2 * i];
  195. // temp2 = p[9 + 2 * i + 1];
  196. // pcs_run_data1[offset + i] = (temp1 << 8) + temp2;
  197. // }
  198. // }
  199. // }
  200. // void __bsp_Pcs_FrameSend_W5500(const u8 *pMsg, u8 count)
  201. // {
  202. // w5500_send(SOCK_PCS1, pMsg, count);
  203. // // ModbusTcpCli_Pcs1 ModbusTcpCli_TypeDef
  204. // }