瀏覽代碼

添加生成MBAP模块,未完善

Modbus_TCP
zcn1123 4 年之前
父節點
當前提交
cdf5978b0e
共有 2 個檔案被更改,包括 36 行新增69 行删除
  1. +22
    -0
      Modbus_communication/Modbus_TCP/common.cpp
  2. +14
    -69
      Modbus_communication/Modbus_TCP/main.cpp

+ 22
- 0
Modbus_communication/Modbus_TCP/common.cpp 查看文件

@@ -211,6 +211,7 @@ bool Check_Write_date(string Write_date, int Write_date_number)
return true;
}


/*********************************************************************************************
* 功能    : 输入写入数据
* 描述   : 根据写入数量和功能码类型输入相应的数据
@@ -248,4 +249,25 @@ string Write_date(int Function_code, unsigned int Operations_Number)
} while (!Check_Write_date(Write_date, Write_date_number));

return Write_date;
}

/*********************************************************************************************
* 功能    : 生成MBAP报头
* 描述 : MBAP报文头的包括的内容:
* +-------------+---------+--------+--------+------------------------------+
* | 域 | 长度 | 客户机 | 服务器 | 描述 |
* +-------------+---------+--------+--------+------------------------------+
* |事务元标识符 | 2个字节 | 启动 | 复制 |请求/响应事务处理的识别码 |
* +-------------+---------+--------+--------+------------------------------+
* |协议标识符 | 2个字节 | 启动 | 复制 |0=MODBUS 协议 |
* +-------------+---------+--------+--------+------------------------------+
* | 长度 | 2个字节 | 启动 | 启动 |以下字节的数量 |
* +-------------+---------+--------+--------+------------------------------+
* |单元标识符 | 1个字节 | 启动 | 复制 |连接的远程从站的识别码 |
* 输入 : 无
* 输出 : MBAP报文头内容
*********************************************************************************************/
void Crate_MBAP()
{

}

+ 14
- 69
Modbus_communication/Modbus_TCP/main.cpp 查看文件

@@ -1,79 +1,24 @@
#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;
}
#define DEVICE_ID 0x10

int main()
{
//string IP;
//unsigned int Port_number;
//Input_IP(IP, &Port_number);
//Tcp_client(IP, Port_number);
int Function_code = 0x0F;
unsigned int Operations_Number = 30;
unsigned int Write_date_number ;
while (1)
int Operations_Number = 4;
UINT8 Message[260];
Message[0] = 0x00;
Message[1] = 0x00;
Message[2] = 0x00;
Message[3] = 0x00;

Message[4] = 0x00;
Message[5] = Operations_Number;
Message[6] = DEVICE_ID;
for (int i = 0; i < 7; i++)
{
if (Function_code == 0x01 || Function_code == 0x03)
return 0;//读线圈不需要输入改变数据
int i = 1;
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;
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));
printf("%02X", Operations_Number);
getchar();
printf("%02X", Message[i]);
}
getchar();
return 0;
}

Loading…
取消
儲存