@@ -170,4 +170,82 @@ unsigned int Input_Operations_Number(int Function_code) | |||
flage = false; | |||
} while (flage); | |||
return Operations_Number; | |||
} | |||
/********************************************************************************************* | |||
* 功能 : 检测写入数据 | |||
* 描述 : 检测写入数据格式是否正确 | |||
* 输入 : Write_date 写入的数据 Write_date_number写入数据的组数 | |||
* 输出 : true 写入数据格式正确 | |||
* false 写入数据格式错误 | |||
*********************************************************************************************/ | |||
bool Check_Write_date(string Write_date, int Write_date_number) | |||
{ | |||
int Write_date_len = 2 * Write_date_number + Write_date_number - 1; | |||
if (Write_date.length() != Write_date_len) | |||
return false; | |||
int Space_number = 0; | |||
int j = -1; | |||
for (unsigned int i = 0; i < Write_date.length(); i++) | |||
{ | |||
if (Write_date[i] == 0x20)//空格位置判定 | |||
{ | |||
if (i - j == 3) | |||
{ | |||
Space_number++; | |||
j = i; | |||
} | |||
else | |||
return false; | |||
} | |||
if ((Write_date[i] >= 0x30 && Write_date[i] <= 0x39)) // 1-9 | |||
continue; | |||
else if ((Write_date[i] >= 0x41 && Write_date[i] <= 0x5A)) //A-Z | |||
continue; | |||
else if ((Write_date[i] >= 0x61 && Write_date[i] <= 0x7A)) //a-z | |||
continue; | |||
else | |||
return false; | |||
} | |||
if (Space_number != Write_date_number - 1) | |||
return false; | |||
return true; | |||
} | |||
/********************************************************************************************* | |||
* 功能 : 输入写入数据 | |||
* 描述 : 根据写入数量和功能码类型输入相应的数据 | |||
* 输入 : Function_code 选择的功能码类型 Operations_Number对应 功能码类型的操作数量 | |||
* 输出 : Write_date 写入的数据 | |||
*********************************************************************************************/ | |||
string Write_date(int Function_code, unsigned int Operations_Number) | |||
{ | |||
int i = 1; | |||
string Write_date; | |||
unsigned int Write_date_number; | |||
if (Function_code == 0x01 || Function_code == 0x03) | |||
return Write_date;//读线圈不需要输入写入数据 | |||
if (Function_code == 0x0F) //读线圈 | |||
{ | |||
Write_date_number = Operations_Number / 8; | |||
if (Operations_Number % 8) | |||
Write_date_number++; | |||
} | |||
if (Function_code == 0x10) | |||
Write_date_number = Operations_Number * 2; | |||
printf("请输入N组写入数据(2位16进制为一组,空格间隔)例如:00 00 01 00 20 05\n"); | |||
do | |||
{ | |||
if (i == 1) | |||
{ | |||
i = 0; | |||
printf("请输入%d组写入数据 :", Write_date_number); | |||
} | |||
else | |||
printf("请重新输入%d组写入数据 :", Write_date_number); | |||
getline(cin, Write_date); | |||
cin.clear(); | |||
cin.sync(); | |||
} while (!Check_Write_date(Write_date, Write_date_number)); | |||
return Write_date; | |||
} |
@@ -1,4 +1,38 @@ | |||
#include "main.h" | |||
//#include <stdlib.h> | |||
bool Check_Write_date(string Write_date, int Write_date_number) | |||
{ | |||
int Write_date_len = 2 * Write_date_number + Write_date_number - 1; | |||
if (Write_date.length() != Write_date_len) | |||
return false; | |||
int Space_number = 0; | |||
int j = -1; | |||
for (unsigned int i = 0; i < Write_date.length(); i++) | |||
{ | |||
if (Write_date[i] == 0x20)//空格位置判定 | |||
{ | |||
if (i - j == 3) | |||
{ | |||
Space_number++; | |||
j = i; | |||
} | |||
else | |||
return false; | |||
} | |||
if ((Write_date[i] >= 0x30 && Write_date[i] <= 0x39)) // 1-9 | |||
continue; | |||
else if ((Write_date[i] >= 0x41 && Write_date[i] <= 0x5A)) //A-Z | |||
continue; | |||
else if ((Write_date[i] >= 0x61 && Write_date[i] <= 0x7A)) //a-z | |||
continue; | |||
else | |||
return false; | |||
} | |||
if (Space_number != Write_date_number - 1) | |||
return false; | |||
return true; | |||
} | |||
int main() | |||
{ | |||
@@ -6,35 +40,37 @@ int main() | |||
//unsigned int Port_number; | |||
//Input_IP(IP, &Port_number); | |||
//Tcp_client(IP, Port_number); | |||
int Function_code = 0x01; | |||
unsigned int Operations_Number; | |||
int Function_code = 0x0F; | |||
unsigned int Operations_Number = 30; | |||
unsigned int Write_date_number ; | |||
while (1) | |||
{ | |||
if (Function_code == 0x01 || Function_code == 0x03) | |||
return 0;//读线圈不需要输入改变数据 | |||
int i = 1; | |||
bool flage = true; | |||
printf(" 功能码 0x01 0x03 0x0F 0x10\n"); | |||
printf("操作数量 1-2000 1-125 1-1968 1-123\n"); | |||
string Write_date; | |||
if (Function_code == 0x0F) //读线圈 | |||
{ | |||
Write_date_number = Operations_Number / 8; | |||
if (Operations_Number % 8) | |||
Write_date_number++; | |||
} | |||
if (Function_code == 0x10) | |||
Write_date_number = Operations_Number * 2; | |||
printf("请输入N组写入数据(2位16进制为一组,空格间隔)例如:00 00 01 00 20 05\n"); | |||
do | |||
{ | |||
if (i == 1) | |||
{ | |||
i = 0; | |||
cout << "请输入操作(十进制)数量:"; | |||
printf("请输入%d组写入数据 :", Write_date_number); | |||
} | |||
else | |||
cout << "请重新输入操作(十进制)数量"; | |||
cin >> Operations_Number; | |||
printf("请重新输入%d组写入数据 :",Write_date_number); | |||
getline(cin, Write_date); | |||
cin.clear(); | |||
cin.sync(); | |||
if (Function_code == 0x01 && Operations_Number >= 1 && Operations_Number <= 2000) | |||
flage = false; | |||
if (Function_code == 0x03 && Operations_Number >= 1 && Operations_Number <= 125) | |||
flage = false; | |||
if (Function_code == 0x0F && Operations_Number >= 1 && Operations_Number <= 1968) | |||
flage = false; | |||
if (Function_code == 0x10 && Operations_Number >= 1 && Operations_Number <= 123) | |||
flage = false; | |||
} while (flage); | |||
} while (!Check_Write_date(Write_date, Write_date_number)); | |||
printf("%02X", Operations_Number); | |||
getchar(); | |||
} | |||