diff --git a/Modbus_communication/Modbus_TCP/common.cpp b/Modbus_communication/Modbus_TCP/common.cpp index aaabf5a..9056633 100644 --- a/Modbus_communication/Modbus_TCP/common.cpp +++ b/Modbus_communication/Modbus_TCP/common.cpp @@ -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; } \ No newline at end of file diff --git a/Modbus_communication/Modbus_TCP/main.cpp b/Modbus_communication/Modbus_TCP/main.cpp index b25b3c6..72a9431 100644 --- a/Modbus_communication/Modbus_TCP/main.cpp +++ b/Modbus_communication/Modbus_TCP/main.cpp @@ -1,4 +1,38 @@ #include "main.h" +//#include + +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(); }