Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

251 rader
8.0 KiB

  1. #include "common.h"
  2. /*********************************************************************************************
  3. * 功能    : 检测socket版本
  4. * 描述   : 检测socket版本是否一致
  5. * 输入 : 无
  6. * 输出 : true socket版本一致
  7. * false socket版本不一致
  8. *********************************************************************************************/
  9. bool InitSocket_Version(void)
  10. {
  11. WORD sockVersion = MAKEWORD(2, 2);//使用winsocket2.2版本
  12. WSADATA wsaData;
  13. if (WSAStartup(sockVersion, &wsaData) != 0)
  14. {
  15. return false;
  16. }
  17. return true;
  18. }
  19. /*********************************************************************************************
  20. * 功能    : IP地址有效性检测
  21. * 描述   : 检测输入的IP地址是否合法
  22. * 输入 : IP 输入的IP地址
  23. * 输出 : true IP地址合法
  24. * false IP地址非法
  25. *********************************************************************************************/
  26. bool Check_IP(string IP)
  27. {
  28. int s[4];
  29. string ip = IP;
  30. if (ip.length() < 7 || ip.length() > 15) //长度判定
  31. return false;
  32. if (sscanf_s(IP.c_str(), "%d.%d.%d.%d", &s[0], &s[1], &s[2], &s[3]) != 4) //IPV4格式正确
  33. {
  34. return false;
  35. }
  36. string newip = to_string(s[0]) + "." + to_string(s[1]) + "." + to_string(s[2]) + "." + to_string(s[3]);
  37. if (ip != newip) //前导0
  38. return false;
  39. if ((s[0] & 0xffffff00) || (s[1] & 0xffffff00) || (s[2] & 0xffffff00) || (s[3] & 0xffffff00)) //判断每一段大小是否符合要求
  40. {
  41. return false;
  42. }
  43. return true;
  44. }
  45. /*********************************************************************************************
  46. * 功能    : 获取从站IP地址和端口号
  47. * 描述   : 终端输入从站IP地址和端口号
  48. * 输入 : IP 地址 (IPV4)
  49. * *Port_number 端口号(1-65535)
  50. * 输出 : 无
  51. *********************************************************************************************/
  52. void Input_IP(string& IP, unsigned int *Port_number)
  53. {
  54. int i = 1;
  55. do
  56. {
  57. if (i == 1)
  58. {
  59. cout << "请输入从站IP:";
  60. i = 0;
  61. }
  62. else
  63. cout << "IP地址格式不正确,请重新输入从站IP:";
  64. cin >> IP;
  65. } while (!Check_IP(IP));
  66. i = 1;
  67. cout << "IP地址输格式入正确,请输入从站端口号:";
  68. do
  69. {
  70. if (i != 1)
  71. cout << "请重新输入从站端口号:";
  72. cin >> *Port_number;
  73. i = 0;
  74. } while (*Port_number == 0 || *Port_number > 65535); //端口不能为0 ,端口号范围0---65535
  75. }
  76. /*********************************************************************************************
  77. * 功能    : 选择功能码
  78. * 描述   : 在功能码 0x01 0x03 0x0F 0x10中选择一个功能码
  79. * 输入 : 无
  80. * 输出 : Function_code 选择的功能码
  81. *********************************************************************************************/
  82. int Input_Function_code(void)
  83. {
  84. int Function_code;
  85. cin >> hex;
  86. int i = 1;
  87. printf("功能码 : 0x01 0x03 0x0F 0x10 \n");
  88. printf("说明 : 读线圈 读寄存器 写多个线圈 写多个寄存器\n");
  89. do
  90. {
  91. if (i == 1)
  92. {
  93. i = 0;
  94. cout << "请输入选择的功能码:";
  95. }
  96. else
  97. cout << "输入功能码错误,请重新选择的功能码";
  98. cin >> Function_code;
  99. cin.clear();
  100. cin.sync();
  101. } while (Function_code != 0x01 && Function_code != 0x03 && Function_code != 0x0F && Function_code != 0x10);
  102. return Function_code;
  103. }
  104. /*********************************************************************************************
  105. * 功能    : 输入操作起始地址码
  106. * 描述   : 起始地址码,最大值65535
  107. * 输入 : 无
  108. * 输出 : Starting_address 操作起始地址码
  109. *********************************************************************************************/
  110. unsigned int Input_Starting_address(void)
  111. {
  112. unsigned int Starting_address;
  113. int i = 1;
  114. printf("请输入操作(十进制)起始地址 \n");
  115. do
  116. {
  117. if (i == 1)
  118. {
  119. i = 0;
  120. cout << "请输入操作(十进制)起始地址:";
  121. }
  122. else
  123. cout << "请重新输入操作(十进制)起始地址";
  124. cin >> Starting_address;
  125. cin.clear();
  126. cin.sync();
  127. } while (Starting_address > 65535 || Starting_address < 0);
  128. return Starting_address;
  129. }
  130. /*********************************************************************************************
  131. * 功能    : 输入操作数量
  132. * 描述   : 操作数量,0x01 1-200 0x03 1-125 0x0xF 1-1968 0x10 1-123
  133. * 输入 : Function_code 选择的功能码类型
  134. * 输出 : Operations_Number 对应功能码类型的操作数量
  135. *********************************************************************************************/
  136. unsigned int Input_Operations_Number(int Function_code)
  137. {
  138. unsigned int Operations_Number;
  139. int i = 1;
  140. bool flage = true;
  141. printf(" 功能码 0x01 0x03 0x0F 0x10\n");
  142. printf("操作数量 1-2000 1-125 1-1968 1-123\n");
  143. do
  144. {
  145. if (i == 1)
  146. {
  147. i = 0;
  148. cout << "请输入操作(十进制)数量:";
  149. }
  150. else
  151. cout << "请重新输入操作(十进制)数量";
  152. cin >> Operations_Number;
  153. cin.clear();
  154. cin.sync();
  155. if (Function_code == 0x01 && Operations_Number >= 1 && Operations_Number <= 2000)
  156. flage = false;
  157. if (Function_code == 0x03 && Operations_Number >= 1 && Operations_Number <= 125)
  158. flage = false;
  159. if (Function_code == 0x0F && Operations_Number >= 1 && Operations_Number <= 1968)
  160. flage = false;
  161. if (Function_code == 0x10 && Operations_Number >= 1 && Operations_Number <= 123)
  162. flage = false;
  163. } while (flage);
  164. return Operations_Number;
  165. }
  166. /*********************************************************************************************
  167. * 功能    : 检测写入数据
  168. * 描述   : 检测写入数据格式是否正确
  169. * 输入 : Write_date 写入的数据 Write_date_number写入数据的组数
  170. * 输出 : true 写入数据格式正确
  171. * false 写入数据格式错误
  172. *********************************************************************************************/
  173. bool Check_Write_date(string Write_date, int Write_date_number)
  174. {
  175. int Write_date_len = 2 * Write_date_number + Write_date_number - 1;
  176. if (Write_date.length() != Write_date_len)
  177. return false;
  178. int Space_number = 0;
  179. int j = -1;
  180. for (unsigned int i = 0; i < Write_date.length(); i++)
  181. {
  182. if (Write_date[i] == 0x20)//空格位置判定
  183. {
  184. if (i - j == 3)
  185. {
  186. Space_number++;
  187. j = i;
  188. }
  189. else
  190. return false;
  191. }
  192. if ((Write_date[i] >= 0x30 && Write_date[i] <= 0x39)) // 1-9
  193. continue;
  194. else if ((Write_date[i] >= 0x41 && Write_date[i] <= 0x5A)) //A-Z
  195. continue;
  196. else if ((Write_date[i] >= 0x61 && Write_date[i] <= 0x7A)) //a-z
  197. continue;
  198. else
  199. return false;
  200. }
  201. if (Space_number != Write_date_number - 1)
  202. return false;
  203. return true;
  204. }
  205. /*********************************************************************************************
  206. * 功能    : 输入写入数据
  207. * 描述   : 根据写入数量和功能码类型输入相应的数据
  208. * 输入 : Function_code 选择的功能码类型 Operations_Number对应 功能码类型的操作数量
  209. * 输出 : Write_date 写入的数据
  210. *********************************************************************************************/
  211. string Write_date(int Function_code, unsigned int Operations_Number)
  212. {
  213. int i = 1;
  214. string Write_date;
  215. unsigned int Write_date_number;
  216. if (Function_code == 0x01 || Function_code == 0x03)
  217. return Write_date;//读线圈不需要输入写入数据
  218. if (Function_code == 0x0F) //读线圈
  219. {
  220. Write_date_number = Operations_Number / 8;
  221. if (Operations_Number % 8)
  222. Write_date_number++;
  223. }
  224. if (Function_code == 0x10)
  225. Write_date_number = Operations_Number * 2;
  226. printf("请输入N组写入数据(2位16进制为一组,空格间隔)例如:00 00 01 00 20 05\n");
  227. do
  228. {
  229. if (i == 1)
  230. {
  231. i = 0;
  232. printf("请输入%d组写入数据 :", Write_date_number);
  233. }
  234. else
  235. printf("请重新输入%d组写入数据 :", Write_date_number);
  236. getline(cin, Write_date);
  237. cin.clear();
  238. cin.sync();
  239. } while (!Check_Write_date(Write_date, Write_date_number));
  240. return Write_date;
  241. }