Browse Source

完成Write_Data模块

Modbus_TCP
zcn1123 4 years ago
parent
commit
42f2842066
2 changed files with 131 additions and 17 deletions
  1. +78
    -0
      Modbus_communication/Modbus_TCP/common.cpp
  2. +53
    -17
      Modbus_communication/Modbus_TCP/main.cpp

+ 78
- 0
Modbus_communication/Modbus_TCP/common.cpp View File

@@ -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;
}

+ 53
- 17
Modbus_communication/Modbus_TCP/main.cpp View File

@@ -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();
}


Loading…
Cancel
Save