metronik.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdbool.h>
  6. #include <limits.h>
  7. #include <gfambrtumst.h>
  8. /////////////////////////////////////////////////////////////////////////////
  9. static void _OnRawReadUvComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
  10. {
  11. PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete = (PFN_GFA_ILM_READ_UV_COMPLETE)pParam;
  12. uint16_t nData = 0;
  13. if(err)
  14. {
  15. if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
  16. err |= ((uint16_t)padu->pdu.b[0] << 8);
  17. }
  18. else
  19. {
  20. nData = GfaBufGetUnaligned_uint16(padu->pdu.b);
  21. }
  22. (*pfnReadUvComplete)(nTID, nSlvID, err, nData);
  23. }
  24. /////////////////////////////////////////////////////////////////////////////
  25. static void _OnRawReadTempComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
  26. {
  27. PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete = (PFN_GFA_ILM_READ_TEMP_COMPLETE)pParam;
  28. uint8_t nData = 0;
  29. if(err)
  30. {
  31. if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
  32. err |= ((uint16_t)padu->pdu.b[0] << 8);
  33. }
  34. else
  35. {
  36. nData = padu->pdu.b[0];
  37. }
  38. (*pfnReadTempComplete)(nTID, nSlvID, err, nData);
  39. }
  40. /////////////////////////////////////////////////////////////////////////////
  41. static void _OnRawUnlockComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
  42. {
  43. PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete = (PFN_GFA_ILM_READ_UNLOCK_COMPLETE)pParam;
  44. uint8_t nData = 0;
  45. if(err)
  46. {
  47. if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
  48. err |= ((uint16_t)padu->pdu.b[0] << 8);
  49. }
  50. else
  51. {
  52. nData = padu->pdu.b[0];
  53. }
  54. (*pfnUnlockComplete)(nTID, nSlvID, err, nData);
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. static void _OnRawNewAddrComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
  58. {
  59. PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete = (PFN_GFA_ILM_NEW_ADDR_COMPLETE)pParam;
  60. uint8_t nData = 0;
  61. if(err)
  62. {
  63. if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
  64. err |= ((uint16_t)padu->pdu.b[0] << 8);
  65. }
  66. else
  67. {
  68. nData = padu->pdu.b[0];
  69. }
  70. (*pfnNewAddrComplete)(nTID, nSlvID, err, nData);
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. static void _OnRawReadRangeComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
  74. {
  75. PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete = (PFN_GFA_ILM_READ_RANGE_COMPLETE)pParam;
  76. uint16_t nData = 0;
  77. if(err)
  78. {
  79. if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
  80. err |= ((uint16_t)padu->pdu.b[0] << 8);
  81. }
  82. else
  83. {
  84. nData = GfaBufGetUnaligned_uint16(padu->pdu.b);
  85. }
  86. (*pfnReadRangeComplete)(nTID, nSlvID, err, nData);
  87. }
  88. /////////////////////////////////////////////////////////////////////////////
  89. static void _OnRawReadSerialComplete(uint32_t nTID, uint8_t nSlvID, uint16_t err, LPCMODBUS_RTU_ADU padu, size_t nCbData, void *pParam)
  90. {
  91. PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete = (PFN_GFA_ILM_READ_SERIAL_COMPLETE)pParam;
  92. const uint8_t *pData = NULL;
  93. size_t nData = 0;
  94. if(err)
  95. {
  96. if(err == GFA_MB_MST_ERROR_SLAVE_ERROR && padu)
  97. err |= ((uint16_t)padu->pdu.b[0] << 8);
  98. }
  99. else
  100. {
  101. pData = padu->pdu.b;
  102. nData = nCbData;
  103. }
  104. (*pfnReadSerialComplete)(nTID, nSlvID, err, pData, nData);
  105. }
  106. /////////////////////////////////////////////////////////////////////////////
  107. /////////////////////////////////////////////////////////////////////////////
  108. /////////////////////////////////////////////////////////////////////////////
  109. bool GfaModbusRTUMstILMReadUV(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UV_COMPLETE pfnReadUvComplete)
  110. {
  111. if(!pfnReadUvComplete)
  112. return false;
  113. return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_UV, NULL, 0, sizeof(uint16_t), _OnRawReadUvComplete, pfnReadUvComplete);
  114. }
  115. /////////////////////////////////////////////////////////////////////////////
  116. bool GfaModbusRTUMstILMReadTemp(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_TEMP_COMPLETE pfnReadTempComplete)
  117. {
  118. if(!pfnReadTempComplete)
  119. return false;
  120. return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_TEMP, NULL, 0, sizeof(uint8_t), _OnRawReadTempComplete, pfnReadTempComplete);
  121. }
  122. /////////////////////////////////////////////////////////////////////////////
  123. bool GfaModbusRTUMstILMUnlock(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_UNLOCK_COMPLETE pfnUnlockComplete)
  124. {
  125. uint8_t buf[] = {0x0C, 0x31};
  126. if(!pfnUnlockComplete)
  127. return false;
  128. return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_UNLOCK, buf, sizeof(buf), sizeof(uint8_t), _OnRawUnlockComplete, pfnUnlockComplete);
  129. }
  130. /////////////////////////////////////////////////////////////////////////////
  131. bool GfaModbusRTUMstILMNewAddr(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, uint8_t nNewAddr, PFN_GFA_ILM_NEW_ADDR_COMPLETE pfnNewAddrComplete)
  132. {
  133. if(nNewAddr == MODBUS_BROADCAST_ADDRESS || nNewAddr > MODBUS_MAX_SLAVE_ID)
  134. return false;
  135. if(!pfnNewAddrComplete)
  136. return false;
  137. return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_NEW_ADDR, &nNewAddr, sizeof(nNewAddr), sizeof(uint8_t), _OnRawNewAddrComplete, pfnNewAddrComplete);
  138. }
  139. /////////////////////////////////////////////////////////////////////////////
  140. bool GfaModbusRTUMstILMReadRange(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_RANGE_COMPLETE pfnReadRangeComplete)
  141. {
  142. if(!pfnReadRangeComplete)
  143. return false;
  144. return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_RANGE, NULL, 0, sizeof(uint16_t), _OnRawReadRangeComplete, pfnReadRangeComplete);
  145. }
  146. /////////////////////////////////////////////////////////////////////////////
  147. bool GfaModbusRTUMstILMReadSerial(HMBRTUMST hMbMst, uint32_t nTID, uint8_t nSlvID, PFN_GFA_ILM_READ_SERIAL_COMPLETE pfnReadSerialComplete)
  148. {
  149. if(!pfnReadSerialComplete)
  150. return false;
  151. return GfaModbusRTUMstSendRawRequest(hMbMst, nTID, nSlvID, GFA_MB_ILM_FUNC_READ_SERIAL, NULL, 0, 5, _OnRawReadSerialComplete, pfnReadSerialComplete);
  152. }