mbs.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #include "mbs.h"
  2. static fmodbus_t* MB[MAX_MBS];
  3. /* ----------------------- Defines ------------------------------------------*/
  4. /* ctn modbus tcp slave*/
  5. #define REG_HOLDING_START_ZH 0x0000
  6. #define REG_HOLDING_NREGS_ZH 0x8000
  7. #define REG_INPUT_START_ZH 0x0000
  8. #define REG_INPUT_REG_ZH 0x8000
  9. static USHORT MBS_BUF[MAX_MBS][REG_INPUT_REG_ZH - REG_INPUT_START_ZH] = { 0 };
  10. // static USHORT usRegInputReg_ZH[REG_INPUT_REG_ZH] = { 0 };
  11. // static USHORT usRegHoldingBuf_ZH[REG_HOLDING_NREGS_ZH] = { 0 };
  12. static enum ThreadState { STOPPED,RUNNING,SHUTDOWN } ePollThreadState;
  13. static pthread_mutex_t xLock = PTHREAD_MUTEX_INITIALIZER;
  14. // static BOOL bDoExit;
  15. void* pvPollingThread(void* pvParameter)
  16. {
  17. fmodbus_t* ctx = (fmodbus_t*)pvParameter;
  18. syslog(LOG_INFO,"%s, ++, mbsidx:%d started",__func__,ctx->mbsidx);
  19. if(eMBEnable(ctx) == MB_ENOERR)
  20. {
  21. do
  22. {
  23. if(eMBPoll(ctx) != MB_ENOERR) break;
  24. } while(TRUE);
  25. }
  26. (void)eMBDisable(ctx);
  27. syslog(LOG_INFO,"%s, --, mbsidx:%d exit",__func__,ctx->mbsidx);
  28. return NULL;
  29. }
  30. static void onReadInputBuf_ZH(fmodbus_t* ctx,USHORT* buf)
  31. {
  32. struct tm tm;
  33. buf[1 - REG_INPUT_START_ZH] = (unsigned short)(APPL.Tick);
  34. buf[2 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].com_ap*10) >> 16;
  35. buf[3 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].com_ap*10) & 0xFFFF;
  36. buf[4 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].pos_ae*10) >> 16;
  37. buf[5 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].pos_ae*10) & 0xFFFF;
  38. buf[6 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].neg_ae*10) >> 16;
  39. buf[7 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].neg_ae*10) & 0xFFFF;
  40. buf[8 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].pf*10) >> 16;
  41. buf[9 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].pf*10) & 0xFFFF;
  42. buf[10 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].pos_active_dem*10) >> 16;
  43. buf[11 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].pos_active_dem*10) & 0xFFFF;
  44. buf[12 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].neg_active_dem*10)>> 16;
  45. buf[13 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].neg_active_dem*10) & 0xFFFF;
  46. buf[14 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ua*10) >> 16;
  47. buf[15 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ua*10) & 0xFFFF;
  48. buf[16 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ub*10) >> 16;
  49. buf[17 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ub*10) & 0xFFFF;
  50. buf[18 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].uc*10) >> 16;
  51. buf[19 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].uc*10) & 0xFFFF;
  52. buf[20 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ia*10) >> 16;
  53. buf[21 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ia*10) & 0xFFFF;
  54. buf[22 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ib*10) >> 16;
  55. buf[23 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ib*10) & 0xFFFF;
  56. buf[24 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ic*10) >> 16;
  57. buf[25 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].ic*10) & 0xFFFF;
  58. buf[26 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].freq*10) >> 16;
  59. buf[27 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].freq*10) & 0xFFFF;
  60. buf[28 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].PT*10) >> 16;
  61. buf[29 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].PT*10) & 0xFFFF;
  62. buf[30 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].CT*10) >> 16;
  63. buf[31 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[2].CT*10) & 0xFFFF;
  64. buf[101 - REG_INPUT_START_ZH] = (short)APPL.Dtsd1352[2].CommState;
  65. memset(&tm,0,sizeof(struct tm));
  66. if(strptime(APPL.Dtsd1352[2].szLastUpdate,"%Y-%m-%d %H:%M:%S",&tm) == NULL)
  67. {
  68. // syslog(LOG_INFO,"Date conversion for Dtsd1352[2] failed\n");
  69. }
  70. else
  71. {
  72. buf[102 - REG_INPUT_START_ZH] = (short)(tm.tm_year + 1900);
  73. buf[103 - REG_INPUT_START_ZH] = (short)(tm.tm_mon + 1);
  74. buf[104 - REG_INPUT_START_ZH] = (short)(tm.tm_mday);
  75. buf[105 - REG_INPUT_START_ZH] = (short)(tm.tm_hour);
  76. buf[106 - REG_INPUT_START_ZH] = (short)(tm.tm_min);
  77. buf[107 - REG_INPUT_START_ZH] = (short)(tm.tm_sec);
  78. }
  79. buf[1001 - REG_INPUT_START_ZH] = (unsigned short)(APPL.Tick);
  80. buf[1002 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].com_ap*10) >> 16;
  81. buf[1003 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].com_ap*10) & 0xFFFF;
  82. buf[1004 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pos_ae*10) >> 16;
  83. buf[1005 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pos_ae*10) & 0xFFFF;
  84. buf[1006 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].neg_ae*10) >> 16;
  85. buf[1007 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].neg_ae*10) & 0xFFFF;
  86. buf[1008 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pf*10) >> 16;
  87. buf[1009 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pf*10) & 0xFFFF;
  88. buf[1010 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pos_active_dem*10) >> 16;
  89. buf[1011 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pos_active_dem*10) & 0xFFFF;
  90. buf[1012 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].neg_active_dem*10)>> 16;
  91. buf[1013 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].neg_active_dem*10) & 0xFFFF;
  92. buf[1014 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ua*10) >> 16;
  93. buf[1015 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ua*10) & 0xFFFF;
  94. buf[1016 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ub*10) >> 16;
  95. buf[1017 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ub*10) & 0xFFFF;
  96. buf[1018 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].uc*10) >> 16;
  97. buf[1019 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].uc*10) & 0xFFFF;
  98. buf[1020 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ia*10) >> 16;
  99. buf[1021 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ia*10) & 0xFFFF;
  100. buf[1022 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ib*10) >> 16;
  101. buf[1023 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ib*10) & 0xFFFF;
  102. buf[1024 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ic*10) >> 16;
  103. buf[1025 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ic*10) & 0xFFFF;
  104. buf[1026 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].freq*10) >> 16;
  105. buf[1027 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].freq*10) & 0xFFFF;
  106. buf[1028 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].PT*10) >> 16;
  107. buf[1029 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].PT*10) & 0xFFFF;
  108. buf[1030 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].CT*10) >> 16;
  109. buf[1031 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].CT*10) & 0xFFFF;
  110. buf[1032 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].com_ap*10) >> 16;
  111. buf[1033 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].com_ap*10) & 0xFFFF;
  112. buf[1034 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].com_rap*10) >> 16;
  113. buf[1035 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].com_rap*10) & 0xFFFF;
  114. buf[1036 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].uab*10);
  115. buf[1037 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].ubc*10);
  116. buf[1038 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].uac*10);
  117. buf[1039 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].apA*10) >> 16;
  118. buf[1040 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].apA*10) & 0xFFFF;
  119. buf[1041 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].apB*10) >> 16;
  120. buf[1042 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].apB*10) & 0xFFFF;
  121. buf[1043 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].apC*10) >> 16;
  122. buf[1044 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].apC*10) & 0xFFFF;
  123. buf[1045 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].rapA*10) >> 16;
  124. buf[1046 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].rapA*10) & 0xFFFF;
  125. buf[1047 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].rapB*10) >> 16;
  126. buf[1048 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].rapB*10) & 0xFFFF;
  127. buf[1049 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].rapC*10) >> 16;
  128. buf[1050 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].rapC*10) & 0xFFFF;
  129. buf[1051 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pfA*10);
  130. buf[1052 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pfB*10);
  131. buf[1053 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[3].pfC*10);
  132. buf[1101 - REG_INPUT_START_ZH] = (short)APPL.Dtsd1352[3].CommState;
  133. memset(&tm,0,sizeof(struct tm));
  134. if(strptime(APPL.Dtsd1352[3].szLastUpdate,"%Y-%m-%d %H:%M:%S",&tm) == NULL)
  135. {
  136. //syslog(LOG_INFO,"Date conversion for Dtsd1352[3] failed\n");
  137. }
  138. else
  139. {
  140. buf[1102 - REG_INPUT_START_ZH] = (short)(tm.tm_year + 1900);
  141. buf[1103 - REG_INPUT_START_ZH] = (short)(tm.tm_mon + 1);
  142. buf[1104 - REG_INPUT_START_ZH] = (short)(tm.tm_mday);
  143. buf[1105 - REG_INPUT_START_ZH] = (short)(tm.tm_hour);
  144. buf[1106 - REG_INPUT_START_ZH] = (short)(tm.tm_min);
  145. buf[1107 - REG_INPUT_START_ZH] = (short)(tm.tm_sec);
  146. }
  147. // 储能电表
  148. buf[2001 - REG_INPUT_START_ZH] = (unsigned short)(APPL.Tick);
  149. buf[2002 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].com_ap*10) >> 16;
  150. buf[2003 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].com_ap*10) & 0xFFFF;
  151. buf[2004 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pos_ae*10) >> 16;
  152. buf[2005 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pos_ae*10) & 0xFFFF;
  153. buf[2006 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].neg_ae*10) >> 16;
  154. buf[2007 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].neg_ae*10) & 0xFFFF;
  155. buf[2008 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pf*10) >> 16;
  156. buf[2009 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pf*10) & 0xFFFF;
  157. buf[2010 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pos_active_dem*10) >> 16;
  158. buf[2011 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pos_active_dem*10) & 0xFFFF;
  159. buf[2012 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].neg_active_dem*10)>> 16;
  160. buf[2013 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].neg_active_dem*10) & 0xFFFF;
  161. buf[2014 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ua*10) >> 16;
  162. buf[2015 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ua*10) & 0xFFFF;
  163. buf[2016 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ub*10) >> 16;
  164. buf[2017 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ub*10) & 0xFFFF;
  165. buf[2018 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].uc*10) >> 16;
  166. buf[2019 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].uc*10) & 0xFFFF;
  167. buf[2020 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ia*10) >> 16;
  168. buf[2021 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ia*10) & 0xFFFF;
  169. buf[2022 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ib*10) >> 16;
  170. buf[2023 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ib*10) & 0xFFFF;
  171. buf[2024 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ic*10) >> 16;
  172. buf[2025 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ic*10) & 0xFFFF;
  173. buf[2026 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].freq*10) >> 16;
  174. buf[2027 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].freq*10) & 0xFFFF;
  175. buf[2028 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].PT*10) >> 16;
  176. buf[2029 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].PT*10) & 0xFFFF;
  177. buf[2030 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].CT*10) >> 16;
  178. buf[2031 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].CT*10) & 0xFFFF;
  179. buf[2032 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].com_ap*10) >> 16;
  180. buf[2033 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].com_ap*10) & 0xFFFF;
  181. buf[2034 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].com_rap*10) >> 16;
  182. buf[2035 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].com_rap*10) & 0xFFFF;
  183. buf[2036 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].uab*10);
  184. buf[2037 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].ubc*10);
  185. buf[2038 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].uac*10);
  186. buf[2039 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].apA*10) >> 16;
  187. buf[2040 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].apA*10) & 0xFFFF;
  188. buf[2041 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].apB*10) >> 16;
  189. buf[2042 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].apB*10) & 0xFFFF;
  190. buf[2043 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].apC*10) >> 16;
  191. buf[2044 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].apC*10) & 0xFFFF;
  192. buf[2045 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].rapA*10) >> 16;
  193. buf[2046 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].rapA*10) & 0xFFFF;
  194. buf[2047 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].rapB*10) >> 16;
  195. buf[2048 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].rapB*10) & 0xFFFF;
  196. buf[2049 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].rapC*10) >> 16;
  197. buf[2050 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].rapC*10) & 0xFFFF;
  198. buf[2051 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pfA*10);
  199. buf[2052 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pfB*10);
  200. buf[2053 - REG_INPUT_START_ZH] = (int)(APPL.Dtsd1352[1].pfC*10);
  201. buf[2101 - REG_INPUT_START_ZH] = (short)APPL.Dtsd1352[1].CommState;
  202. memset(&tm,0,sizeof(struct tm));
  203. if(strptime(APPL.Dtsd1352[1].szLastUpdate,"%Y-%m-%d %H:%M:%S",&tm) == NULL)
  204. {
  205. //syslog(LOG_INFO,"Date conversion for Dtsd1352[1] failed\n");
  206. }
  207. else
  208. {
  209. buf[2102 - REG_INPUT_START_ZH] = (short)(tm.tm_year + 1900);
  210. buf[2103 - REG_INPUT_START_ZH] = (short)(tm.tm_mon + 1);
  211. buf[2104 - REG_INPUT_START_ZH] = (short)(tm.tm_mday);
  212. buf[2105 - REG_INPUT_START_ZH] = (short)(tm.tm_hour);
  213. buf[2106 - REG_INPUT_START_ZH] = (short)(tm.tm_min);
  214. buf[2107 - REG_INPUT_START_ZH] = (short)(tm.tm_sec);
  215. }
  216. }
  217. // process 03
  218. static void prepareRegHoldingBuf_ZH(fmodbus_t* ctx,int iAddress)
  219. {
  220. }
  221. // 06
  222. static void onWriteRegHoldingBuf_ZH(fmodbus_t* ctx,USHORT* buf,int iAddress)
  223. {
  224. }
  225. eMBErrorCode eMBRegInputCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  226. USHORT usAddress,USHORT usNRegs)
  227. {
  228. eMBErrorCode eStatus = MB_ENOERR;
  229. int iRegIndex;
  230. // struct chan_t* chan = &STA.chan[ctx->chanidx];
  231. // if (chan->mbsidx >= 1 && chan->mbsidx <= PCS_NBR_MAX)
  232. if(ctx->mbsidx == MBSIDX_CTN1)
  233. {
  234. // if ((usAddress >= REG_INPUT_START_PCS) && (usAddress + usNRegs <=
  235. // REG_INPUT_START_PCS + REG_INPUT_NREGS_PCS)) if ((usAddress >=
  236. // REG_HOLDING_START_ZH) && (usAddress + usNRegs <= REG_HOLDING_START_ZH +
  237. // REG_HOLDING_NREGS_ZH))
  238. }
  239. USHORT* buf = MBS_BUF[ctx->mbsidx];
  240. if((usAddress >= REG_INPUT_START_ZH) &&
  241. (usAddress + usNRegs <= REG_INPUT_START_ZH + REG_INPUT_REG_ZH))
  242. {
  243. // iRegIndex = (int)(usAddress - usRegInputStart_PCS[chan->mbsidx]);
  244. // syslog(LOG_INFO,"%s, usAddress:%d, usNRegs:%d",__func__,usAddress,usNRegs);
  245. onReadInputBuf_ZH(ctx,buf);
  246. iRegIndex = (int)(usAddress - REG_INPUT_START_ZH);
  247. while(usNRegs > 0)
  248. {
  249. *pucRegBuffer++ = (UCHAR)(buf[iRegIndex] >> 8);
  250. *pucRegBuffer++ = (UCHAR)(buf[iRegIndex] & 0xFF);
  251. iRegIndex++;
  252. usNRegs--;
  253. }
  254. }
  255. else
  256. {
  257. eStatus = MB_ENOREG;
  258. }
  259. return eStatus;
  260. }
  261. eMBErrorCode eMBRegHoldingCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  262. USHORT usAddress,USHORT usNRegs,
  263. eMBRegisterMode eMode)
  264. {
  265. eMBErrorCode eStatus = MB_ENOERR;
  266. int iRegIndex;
  267. int i = 0;
  268. // struct chan_t* chan = &STA.chan[ctx->chanidx];
  269. // if( chan->dbg > 0 ){
  270. // log_dbg("%s, chanidx:%d, mbsidx:%d, mbsdevm:%d, mbsdevidx:%d,
  271. // usAddress:%d, usNRegs:%d, eMode:%d",
  272. // __func__,
  273. // ctx->chanidx,
  274. // chan->mbsidx,
  275. // chan->mbsdevm,
  276. // chan->mbsdevidx,
  277. // usAddress,
  278. // usNRegs,
  279. // eMode);
  280. // }
  281. // if( chan->en == 0 ){
  282. // return MB_EIO;
  283. // }
  284. USHORT* buf = MBS_BUF[ctx->mbsidx];
  285. if((usAddress >= REG_HOLDING_START_ZH) &&
  286. (usAddress + usNRegs <= REG_HOLDING_START_ZH + REG_HOLDING_NREGS_ZH))
  287. {
  288. iRegIndex = (int)(usAddress - REG_HOLDING_START_ZH);
  289. switch(eMode)
  290. {
  291. /* Pass current register values to the protocol stack. */
  292. case MB_REG_READ:
  293. prepareRegHoldingBuf_ZH(ctx,(usAddress- REG_HOLDING_START_ZH));
  294. while(usNRegs > 0)
  295. {
  296. *pucRegBuffer++ = (UCHAR)(buf[iRegIndex] >> 8);
  297. *pucRegBuffer++ = (UCHAR)(buf[iRegIndex] & 0xFF);
  298. iRegIndex++;
  299. usNRegs--;
  300. }
  301. break;
  302. /* Update current register values with new values from the
  303. * protocol stack. */
  304. case MB_REG_WRITE:
  305. while(usNRegs > 0)
  306. {
  307. buf[iRegIndex] = *pucRegBuffer++ << 8;
  308. buf[iRegIndex] |= *pucRegBuffer++;
  309. iRegIndex++;
  310. usNRegs--;
  311. }
  312. onWriteRegHoldingBuf_ZH(ctx,buf,(usAddress - REG_HOLDING_START_ZH));
  313. break;
  314. }
  315. }
  316. else
  317. {
  318. eStatus = MB_ENOREG;
  319. }
  320. return eStatus;
  321. }
  322. eMBErrorCode eMBRegCoilsCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  323. USHORT usAddress,USHORT usNCoils,
  324. eMBRegisterMode eMode)
  325. {
  326. return MB_ENOREG;
  327. }
  328. eMBErrorCode eMBRegDiscreteCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  329. USHORT usAddress,USHORT usNDiscrete)
  330. {
  331. return MB_ENOREG;
  332. }
  333. int mbs_start_ctn(int port,int mbsidx)
  334. {
  335. int ret = 0;
  336. const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC };
  337. pthread_t xthrd;
  338. syslog(LOG_INFO, "%s, ++, %d %d",__func__,port,mbsidx);
  339. if(eMBTCPInit(&MB[mbsidx],port) != MB_ENOERR)
  340. {
  341. syslog(LOG_INFO,"%s, eMBTCPInit fail",__func__);
  342. ret = -1;
  343. }
  344. else if(eMBSetSlaveID(MB[mbsidx],0x34,TRUE,ucSlaveID,3) !=
  345. MB_ENOERR)
  346. {
  347. syslog(LOG_INFO,"%s, eMBSetSlaveID fail",__func__);
  348. ret = -2;
  349. }
  350. else
  351. {
  352. MB[mbsidx]->mbsidx = mbsidx;
  353. if(pthread_create(&xthrd,NULL,pvPollingThread,MB[mbsidx]) != 0)
  354. {
  355. syslog(LOG_INFO,"%s, pthread_create fail",__func__);
  356. ret = -3;
  357. }
  358. else
  359. {
  360. syslog(LOG_INFO,"%s, start ok, %d %d",__func__,port,mbsidx);
  361. }
  362. }
  363. return ret;
  364. }