78211b4f-31bd-4a4b-bc32-d651db7dc418.cfg 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <MacroInfo xmlns="http://schemas.flexem.com/fs/model/1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><AddressCollection><MacroAddressInfo><AddressIndex>1</AddressIndex><BitAddress><Abbreviation>LB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>a868feeb-a779-4a71-b020-f5a889a07f33</Id><RegisterId>254</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>LB0</Name><WordAddress><Abbreviation>LW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>578aa61d-ea7b-4a18-8ad0-c769ce4803d9</Id><RegisterId>65791</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo><MacroAddressInfo><AddressIndex>2</AddressIndex><AddressType>Word</AddressType><BitAddress><Abbreviation>LB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>9673b9b2-fbce-40e2-9af7-9de7e041384c</Id><RegisterId>254</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>LW0</Name><ReferenceCount>10</ReferenceCount><WordAddress><Abbreviation>LW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>c80b002a-cc47-4c8c-a3c0-5a910945ecca</Id><RegisterId>65791</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo><MacroAddressInfo><AddressIndex>3</AddressIndex><AddressType>Word</AddressType><BitAddress><Abbreviation>LB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:LB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>472f1305-2b08-4198-8338-43e84a63d249</Id><RegisterId>254</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>RW0</Name><ReferenceCount>5</ReferenceCount><WordAddress><Abbreviation>RW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:RW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>ab40f3a9-d838-419f-a8cb-b10b9297708c</Id><RegisterId>65789</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo><MacroAddressInfo><AddressIndex>4</AddressIndex><AddressType>Word</AddressType><BitAddress><Abbreviation>SRB0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><DataTypeIsVisible>true</DataTypeIsVisible><DeviceAndAbbreviation>LOCAL:[本地寄存器]:SRB0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>87454f50-b9a4-4693-ad8f-c4e78ad7f98c</Id><RegisterId>257</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></BitAddress><Name>SRW0</Name><WordAddress><Abbreviation>SRW0</Abbreviation><AddressLabelIsVisible>true</AddressLabelIsVisible><AddressType>Word</AddressType><DeviceAndAbbreviation>LOCAL:[本地寄存器]:SRW0</DeviceAndAbbreviation><DeviceId>5942dc1f-588b-4485-88a4-8a07f240b2f8</DeviceId><Id>f3f05a1f-273a-4992-b0fa-ba3220120c85</Id><RegisterId>65792</RegisterId><SpeedIsVisible>true</SpeedIsVisible><SysRegIsEnabled>true</SysRegIsEnabled><SysRegIsVisible>true</SysRegIsVisible><UseStationReferenceIsVisible>true</UseStationReferenceIsVisible><WordCount>1</WordCount><WordCountIsVisible>true</WordCountIsVisible><Version>4</Version><TagName/><NewSubAddressIndexType>Constant</NewSubAddressIndexType></WordAddress></MacroAddressInfo></AddressCollection><Description>获取房间信息</Description><Name>Test2</Name><NameWithSuffix>Test2.c</NameWithSuffix><NeedRebuild>true</NeedRebuild><SourceCode>#include &lt;macro.h&gt;&#xD;
  2. #include &lt;string.h&gt;&#xD;
  3. #include &lt;stdio.h&gt;&#xD;
  4. &#xD;
  5. // 定义常量&#xD;
  6. #define MAX_ROOMS 24&#xD;
  7. #define BUFFER_SIZE 4096&#xD;
  8. #define NAME_BUFFER_LEN 100&#xD;
  9. #define VALUE_BUFFER_LEN 20&#xD;
  10. &#xD;
  11. // 字段最大长度&#xD;
  12. #define FIELD_ATM_LEN 7&#xD;
  13. #define FIELD_CH2O_LEN 4&#xD;
  14. #define FIELD_LUX_LEN 10&#xD;
  15. #define FIELD_TVOC_LEN 3&#xD;
  16. #define FIELD_CO2_LEN 3&#xD;
  17. #define FIELD_PM_LEN 3&#xD;
  18. &#xD;
  19. void ParseJsonField(&#xD;
  20. const unsigned char* json, // JSON 响应字符串&#xD;
  21. const char* key, // 要查找的键名,如 "atm"&#xD;
  22. unsigned char* value, // 输出缓冲区&#xD;
  23. int max_len // 输出缓冲区最大长度&#xD;
  24. ) {&#xD;
  25. // 构造查找字符串: "\"key\":"&#xD;
  26. unsigned char pattern[32] = {0};&#xD;
  27. snprintf(pattern, sizeof(pattern), "\"%s\":", key);&#xD;
  28. &#xD;
  29. unsigned char *pos = strstr(json, pattern);&#xD;
  30. if (pos == NULL) {&#xD;
  31. strcpy(value, "0");&#xD;
  32. return;&#xD;
  33. }&#xD;
  34. &#xD;
  35. // 跳过 "\"key\":"&#xD;
  36. pos += strlen(pattern);&#xD;
  37. &#xD;
  38. // 跳过空白字符(空格、制表符等)&#xD;
  39. while (*pos == ' ' || *pos == '\t' || *pos == '\n' || *pos == '\r') {&#xD;
  40. pos++;&#xD;
  41. }&#xD;
  42. &#xD;
  43. int k = 0;&#xD;
  44. &#xD;
  45. // 判断是否为字符串值(以引号开头)&#xD;
  46. if (*pos == '"') {&#xD;
  47. pos++; // 跳过开头的引号&#xD;
  48. while (pos[k] != '"' &amp;&amp; k &lt; max_len - 1) {&#xD;
  49. value[k] = pos[k];&#xD;
  50. k++;&#xD;
  51. }&#xD;
  52. value[k] = '\0';&#xD;
  53. }&#xD;
  54. // 否则为数字或布尔值等(直接取有效字符)&#xD;
  55. else {&#xD;
  56. while (k &lt; max_len - 1) {&#xD;
  57. char c = pos[k];&#xD;
  58. if (c == ',' || c == '}' || c == ' ' || c == '\t' || c == '\n' || c == '\r') {&#xD;
  59. break; // 遇到分隔符结束&#xD;
  60. }&#xD;
  61. value[k] = c;&#xD;
  62. k++;&#xD;
  63. }&#xD;
  64. value[k] = '\0';&#xD;
  65. }&#xD;
  66. &#xD;
  67. // 如果没提取到任何内容,设为 "0"&#xD;
  68. if (k == 0) {&#xD;
  69. strcpy(value, "0");&#xD;
  70. }&#xD;
  71. }&#xD;
  72. int MacroMain()&#xD;
  73. {&#xD;
  74. // 数据缓冲区&#xD;
  75. unsigned char httpRequest[BUFFER_SIZE] = {0};&#xD;
  76. unsigned char recvBuffer[BUFFER_SIZE] = {0};&#xD;
  77. &#xD;
  78. // 存储解析结果&#xD;
  79. unsigned char atm[FIELD_ATM_LEN] = {0};&#xD;
  80. unsigned char ch2o[FIELD_CH2O_LEN] = {0};&#xD;
  81. unsigned char lux[FIELD_LUX_LEN] = {0};&#xD;
  82. unsigned char tvoc[FIELD_TVOC_LEN] = {0};&#xD;
  83. unsigned char co2[FIELD_CO2_LEN] = {0};&#xD;
  84. unsigned char pm[FIELD_PM_LEN] = {0};&#xD;
  85. &#xD;
  86. // 房间ID(字符串)&#xD;
  87. char tId[20] = {0};&#xD;
  88. &#xD;
  89. // 网络信息&#xD;
  90. unsigned char host[50] = {0};&#xD;
  91. unsigned short port = 0;&#xD;
  92. int socketHandle = 0;&#xD;
  93. int sentBytes = 0, recvBytes = 0;&#xD;
  94. &#xD;
  95. // 初始化服务器地址和端口&#xD;
  96. if (GetDWord(@RW0@, 100) == 0) {&#xD;
  97. const unsigned char YS1[] = "124.221.147.225";&#xD;
  98. SetMem(YS1, @RW0@, 100, strlen(YS1));&#xD;
  99. SetWord(@RW0@, 120, 58888);&#xD;
  100. }&#xD;
  101. &#xD;
  102. // 获取服务器信息&#xD;
  103. GetMem(host, @RW0@, 100, 40);&#xD;
  104. port = GetWord(@RW0@, 120);&#xD;
  105. &#xD;
  106. // 获取房间ID(字符串)&#xD;
  107. GetMem(tId, @LW0@, 77777, 19); // 最多复制19字节&#xD;
  108. &#xD;
  109. // 构建 HTTP 请求(使用动态 host 和 port)&#xD;
  110. snprintf(httpRequest, sizeof(httpRequest),&#xD;
  111. "GET /coldchain/hmi/getRoomInfoById?tId=%s HTTP/1.1\r\n"&#xD;
  112. "Host: %s:%d\r\n"&#xD;
  113. "Token: SZrN75oijJZLCgXg3K98zW4fbXT2soio\r\n"&#xD;
  114. "Connection: Keep-Alive\r\n"&#xD;
  115. "Accept: application/json, text/plain, */*\r\n"&#xD;
  116. "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0\r\n"&#xD;
  117. "Accept-Encoding: gzip, deflate, br, zstd\r\n"&#xD;
  118. "\r\n",&#xD;
  119. tId, host, port);&#xD;
  120. &#xD;
  121. // 建立连接&#xD;
  122. socketHandle = OpenSocket(host, port, 1);&#xD;
  123. SetWord(@LW0@, 0, socketHandle);&#xD;
  124. &#xD;
  125. if (socketHandle &gt;= 1000) {&#xD;
  126. Debug(0, "Socket opened: %d", socketHandle);&#xD;
  127. sentBytes = SendSocket(socketHandle, httpRequest, strlen(httpRequest));&#xD;
  128. SetWord(@LW0@, 1, sentBytes);&#xD;
  129. Debug(0, "Sent %d bytes", sentBytes);&#xD;
  130. &#xD;
  131. Delay(500);&#xD;
  132. recvBytes = RecvSocket(socketHandle, recvBuffer, sizeof(recvBuffer) - 1, 2000);&#xD;
  133. SetWord(@LW0@, 20, recvBytes);&#xD;
  134. recvBuffer[recvBytes] = '\0'; // 确保字符串结束&#xD;
  135. &#xD;
  136. Debug(0, "HTTP Response: %s", recvBuffer);&#xD;
  137. // ================== 使用函数解析各个字段 ==================&#xD;
  138. ParseJsonField(recvBuffer, "atm", atm, FIELD_ATM_LEN);&#xD;
  139. ParseJsonField(recvBuffer, "ch2o", ch2o, FIELD_CH2O_LEN);&#xD;
  140. ParseJsonField(recvBuffer, "lux", lux, FIELD_LUX_LEN);&#xD;
  141. ParseJsonField(recvBuffer, "tvoc", tvoc, FIELD_TVOC_LEN);&#xD;
  142. ParseJsonField(recvBuffer, "co2", co2, FIELD_CO2_LEN);&#xD;
  143. ParseJsonField(recvBuffer, "pm", pm, FIELD_PM_LEN);&#xD;
  144. &#xD;
  145. // ================== 调试输出所有结果 ==================&#xD;
  146. Debug(0, "Parsed Data:");&#xD;
  147. Debug(0, " atm : %s", atm);&#xD;
  148. Debug(0, " ch2o : %s", ch2o);&#xD;
  149. Debug(0, " lux : %s", lux);&#xD;
  150. Debug(0, " tvoc : %s", tvoc);&#xD;
  151. Debug(0, " co2 : %s", co2);&#xD;
  152. Debug(0, " pm : %s", pm);&#xD;
  153. &#xD;
  154. // ================== 可选:写入寄存器供 HMI 使用 ==================&#xD;
  155. // 示例:将字符串写入内存区(根据您的系统调整)&#xD;
  156. SetMem(atm, @LW0@, 101111, FIELD_ATM_LEN-1);&#xD;
  157. SetMem(ch2o, @LW0@, 102222, FIELD_CH2O_LEN-1);&#xD;
  158. SetMem(lux, @LW0@, 103333, FIELD_LUX_LEN-1);&#xD;
  159. SetMem(tvoc, @LW0@, 104444, FIELD_TVOC_LEN-1);&#xD;
  160. SetMem(co2, @LW0@, 105555, FIELD_CO2_LEN-1);&#xD;
  161. SetMem(pm, @LW0@, 106666, FIELD_PM_LEN-1);&#xD;
  162. &#xD;
  163. // 关闭连接&#xD;
  164. CloseSocket(socketHandle);&#xD;
  165. &#xD;
  166. } else {&#xD;
  167. Debug(0, "Failed to open socket to %s:%d", host, port);&#xD;
  168. }&#xD;
  169. &#xD;
  170. return 0;&#xD;
  171. }</SourceCode><UniqueId>78211b4f-31bd-4a4b-bc32-d651db7dc418</UniqueId><Version>1</Version></MacroInfo>