esp_modbus_master.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /* Copyright 2018 Espressif Systems (Shanghai) PTE LTD
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include "esp_err.h" // for esp_err_t
  16. #include "mbc_master.h" // for master interface define
  17. #include "esp_modbus_master.h" // for public interface defines
  18. #include "mbc_serial_master.h" // for create function of the port
  19. #include "esp_modbus_callbacks.h" // for callback functions
  20. // This file implements public API for Modbus master controller.
  21. // These functions are wrappers for interface functions of the controller
  22. static mb_master_interface_t* master_interface_ptr = NULL;
  23. /**
  24. * Initialization of Modbus controller resources
  25. */
  26. esp_err_t mbc_master_init(mb_port_type_t port_type, void** handler)
  27. {
  28. void* port_handler = NULL;
  29. esp_err_t error = ESP_ERR_NOT_SUPPORTED;
  30. switch(port_type)
  31. {
  32. case MB_PORT_SERIAL_MASTER:
  33. error = mbc_serial_master_create(port_type, &port_handler);
  34. break;
  35. case MB_PORT_TCP_MASTER:
  36. // TCP MAster is not yet supported
  37. //error = mbc_tcp_master_create(port_type, &port_handler);
  38. return ESP_ERR_NOT_SUPPORTED;
  39. default:
  40. return ESP_ERR_NOT_SUPPORTED;
  41. }
  42. MB_MASTER_CHECK((port_handler != NULL),
  43. ESP_ERR_INVALID_STATE,
  44. "Master interface initialization failure, error=(0x%x), port type=(0x%x).",
  45. error, (uint16_t)port_type);
  46. if ((port_handler != NULL) && (error == ESP_OK)) {
  47. master_interface_ptr = (mb_master_interface_t*) port_handler;
  48. *handler = port_handler;
  49. }
  50. return error;
  51. }
  52. /**
  53. * Modbus controller destroy function
  54. */
  55. esp_err_t mbc_master_destroy(void)
  56. {
  57. esp_err_t error = ESP_OK;
  58. MB_MASTER_CHECK((master_interface_ptr != NULL),
  59. ESP_ERR_INVALID_STATE,
  60. "Master interface is not correctly initialized.");
  61. MB_MASTER_CHECK((master_interface_ptr->destroy != NULL),
  62. ESP_ERR_INVALID_STATE,
  63. "Master interface is not correctly initialized.");
  64. error = master_interface_ptr->destroy();
  65. MB_MASTER_CHECK((error == ESP_OK),
  66. error,
  67. "SERIAL master destroy failure error=(0x%x).",
  68. error);
  69. return error;
  70. }
  71. esp_err_t mbc_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t** param_info)
  72. {
  73. esp_err_t error = ESP_OK;
  74. MB_MASTER_CHECK((master_interface_ptr != NULL),
  75. ESP_ERR_INVALID_STATE,
  76. "Master interface is not correctly initialized.");
  77. MB_MASTER_CHECK((master_interface_ptr->get_cid_info != NULL),
  78. ESP_ERR_INVALID_STATE,
  79. "Master interface is not correctly initialized.");
  80. error = master_interface_ptr->get_cid_info(cid, param_info);
  81. MB_MASTER_CHECK((error == ESP_OK),
  82. error,
  83. "SERIAL master get cid info failure error=(0x%x).",
  84. error);
  85. return error;
  86. }
  87. /**
  88. * Get parameter data for corresponding characteristic
  89. */
  90. esp_err_t mbc_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t* type)
  91. {
  92. esp_err_t error = ESP_OK;
  93. MB_MASTER_CHECK((master_interface_ptr != NULL),
  94. ESP_ERR_INVALID_STATE,
  95. "Master interface is not correctly initialized.");
  96. MB_MASTER_CHECK((master_interface_ptr->get_parameter != NULL),
  97. ESP_ERR_INVALID_STATE,
  98. "Master interface is not correctly initialized.");
  99. error = master_interface_ptr->get_parameter(cid, name, value, type);
  100. MB_MASTER_CHECK((error == ESP_OK),
  101. error,
  102. "SERIAL master get parameter failure error=(0x%x) (%s).",
  103. error, esp_err_to_name(error));
  104. return error;
  105. }
  106. /**
  107. * Send custom Modbus request defined as mb_param_request_t structure
  108. */
  109. esp_err_t mbc_master_send_request(mb_param_request_t* request, void* data_ptr)
  110. {
  111. esp_err_t error = ESP_OK;
  112. MB_MASTER_CHECK((master_interface_ptr != NULL),
  113. ESP_ERR_INVALID_STATE,
  114. "Master interface is not correctly initialized.");
  115. MB_MASTER_CHECK((master_interface_ptr->send_request != NULL),
  116. ESP_ERR_INVALID_STATE,
  117. "Master interface is not correctly initialized.");
  118. error = master_interface_ptr->send_request(request, data_ptr);
  119. MB_MASTER_CHECK((error == ESP_OK),
  120. error,
  121. "SERIAL master send request failure error=(0x%x) (%s).",
  122. error, esp_err_to_name(error));
  123. return ESP_OK;
  124. }
  125. /**
  126. * Set Modbus parameter description table
  127. */
  128. esp_err_t mbc_master_set_descriptor(const mb_parameter_descriptor_t* descriptor, const uint16_t num_elements)
  129. {
  130. esp_err_t error = ESP_OK;
  131. MB_MASTER_CHECK((master_interface_ptr != NULL),
  132. ESP_ERR_INVALID_STATE,
  133. "Master interface is not correctly initialized.");
  134. MB_MASTER_CHECK((master_interface_ptr->set_descriptor != NULL),
  135. ESP_ERR_INVALID_STATE,
  136. "Master interface is not correctly initialized.");
  137. error = master_interface_ptr->set_descriptor(descriptor, num_elements);
  138. MB_MASTER_CHECK((error == ESP_OK),
  139. error,
  140. "SERIAL master set descriptor failure error=(0x%x) (%s).",
  141. error, esp_err_to_name(error));
  142. return ESP_OK;
  143. }
  144. /**
  145. * Set parameter value for characteristic selected by name and cid
  146. */
  147. esp_err_t mbc_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t* type)
  148. {
  149. esp_err_t error = ESP_OK;
  150. MB_MASTER_CHECK((master_interface_ptr != NULL),
  151. ESP_ERR_INVALID_STATE,
  152. "Master interface is not correctly initialized.");
  153. MB_MASTER_CHECK((master_interface_ptr->set_parameter != NULL),
  154. ESP_ERR_INVALID_STATE,
  155. "Master interface is not correctly initialized.");
  156. error = master_interface_ptr->set_parameter(cid, name, value, type);
  157. MB_MASTER_CHECK((error == ESP_OK),
  158. error,
  159. "SERIAL master set parameter failure error=(0x%x) (%s).",
  160. error, esp_err_to_name(error));
  161. return ESP_OK;
  162. }
  163. /**
  164. * Setup Modbus controller parameters
  165. */
  166. esp_err_t mbc_master_setup(void* comm_info)
  167. {
  168. esp_err_t error = ESP_OK;
  169. MB_MASTER_CHECK((master_interface_ptr != NULL),
  170. ESP_ERR_INVALID_STATE,
  171. "Master interface is not correctly initialized.");
  172. MB_MASTER_CHECK((master_interface_ptr->setup != NULL),
  173. ESP_ERR_INVALID_STATE,
  174. "Master interface is not correctly initialized.");
  175. error = master_interface_ptr->setup(comm_info);
  176. MB_MASTER_CHECK((error == ESP_OK),
  177. error,
  178. "SERIAL master setup failure error=(0x%x) (%s).",
  179. error, esp_err_to_name(error));
  180. return ESP_OK;
  181. }
  182. /**
  183. * Modbus controller stack start function
  184. */
  185. esp_err_t mbc_master_start(void)
  186. {
  187. esp_err_t error = ESP_OK;
  188. MB_MASTER_CHECK((master_interface_ptr != NULL),
  189. ESP_ERR_INVALID_STATE,
  190. "Master interface is not correctly initialized.");
  191. MB_MASTER_CHECK((master_interface_ptr->start != NULL),
  192. ESP_ERR_INVALID_STATE,
  193. "Master interface is not correctly initialized.");
  194. error = master_interface_ptr->start();
  195. MB_MASTER_CHECK((error == ESP_OK),
  196. error,
  197. "SERIAL master start failure error=(0x%x) (%s).",
  198. error, esp_err_to_name(error));
  199. return ESP_OK;
  200. }
  201. eMBErrorCode eMBMasterRegDiscreteCB(UCHAR * pucRegBuffer, USHORT usAddress,
  202. USHORT usNDiscrete)
  203. {
  204. eMBErrorCode error = MB_ENOERR;
  205. MB_MASTER_CHECK((master_interface_ptr != NULL),
  206. ESP_ERR_INVALID_STATE,
  207. "Master interface is not correctly initialized.");
  208. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_discrete != NULL),
  209. ESP_ERR_INVALID_STATE,
  210. "Master interface is not correctly initialized.");
  211. error = master_interface_ptr->master_reg_cb_discrete(pucRegBuffer, usAddress, usNDiscrete);
  212. return error;
  213. }
  214. eMBErrorCode eMBMasterRegCoilsCB(UCHAR* pucRegBuffer, USHORT usAddress,
  215. USHORT usNCoils, eMBRegisterMode eMode)
  216. {
  217. eMBErrorCode error = MB_ENOERR;
  218. MB_MASTER_CHECK((master_interface_ptr != NULL),
  219. ESP_ERR_INVALID_STATE,
  220. "Master interface is not correctly initialized.");
  221. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_coils != NULL),
  222. ESP_ERR_INVALID_STATE,
  223. "Master interface is not correctly initialized.");
  224. error = master_interface_ptr->master_reg_cb_coils(pucRegBuffer, usAddress,
  225. usNCoils, eMode);
  226. return error;
  227. }
  228. eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress,
  229. USHORT usNRegs, eMBRegisterMode eMode)
  230. {
  231. eMBErrorCode error = MB_ENOERR;
  232. MB_MASTER_CHECK((master_interface_ptr != NULL),
  233. ESP_ERR_INVALID_STATE,
  234. "Master interface is not correctly initialized.");
  235. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_holding != NULL),
  236. ESP_ERR_INVALID_STATE,
  237. "Master interface is not correctly initialized.");
  238. error = master_interface_ptr->master_reg_cb_holding(pucRegBuffer, usAddress,
  239. usNRegs, eMode);
  240. return error;
  241. }
  242. eMBErrorCode eMBMasterRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress,
  243. USHORT usNRegs)
  244. {
  245. eMBErrorCode error = MB_ENOERR;
  246. MB_MASTER_CHECK((master_interface_ptr != NULL),
  247. ESP_ERR_INVALID_STATE,
  248. "Master interface is not correctly initialized.");
  249. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_input != NULL),
  250. ESP_ERR_INVALID_STATE,
  251. "Master interface is not correctly initialized.");
  252. error = master_interface_ptr->master_reg_cb_input(pucRegBuffer, usAddress, usNRegs);
  253. return error;
  254. }