From b7797340610bcc5fdc6416c3412ebc2c919d5b67 Mon Sep 17 00:00:00 2001 From: pgh_dd <1041315949@qq.com> Date: Tue, 25 Jul 2023 20:02:06 +0800 Subject: [PATCH 1/3] "modbustcp_20230725" --- APP_Framework/Applications/app_test/Kconfig | 5 +- APP_Framework/Applications/app_test/Makefile | 4 + .../app_test/test_modbus_tcp/Makefile | 11 + .../app_test/test_modbus_tcp/modbus_tcp.c | 729 ++++++++++++++++++ .../app_test/test_modbus_tcp/modbus_tcp.h | 141 ++++ .../test_modbus_tcp/test_modbus_tcp.c | 248 ++++++ 6 files changed, 1137 insertions(+), 1 deletion(-) create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/Makefile create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/modbus_tcp.c create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/modbus_tcp.h create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c diff --git a/APP_Framework/Applications/app_test/Kconfig b/APP_Framework/Applications/app_test/Kconfig index 3a103a6b3..55f0ad243 100644 --- a/APP_Framework/Applications/app_test/Kconfig +++ b/APP_Framework/Applications/app_test/Kconfig @@ -239,6 +239,9 @@ menu "test app" menuconfig USER_TEST_TIMER bool "Config test soft timer" default n - + + menuconfig USER_TEST_MODBUS_TCP + bool "Config test modbus_tcp" + default n endif endmenu diff --git a/APP_Framework/Applications/app_test/Makefile b/APP_Framework/Applications/app_test/Makefile index 200e9e02a..b4408d781 100644 --- a/APP_Framework/Applications/app_test/Makefile +++ b/APP_Framework/Applications/app_test/Makefile @@ -101,5 +101,9 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) SRC_FILES += test_timer.c endif + ifeq ($(CONFIG_USER_TEST_MODBUS_TCP),y) + SRC_DIR += test_modbus_tcp + endif + include $(KERNEL_ROOT)/compiler.mk endif diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/Makefile b/APP_Framework/Applications/app_test/test_modbus_tcp/Makefile new file mode 100644 index 000000000..34093f67d --- /dev/null +++ b/APP_Framework/Applications/app_test/test_modbus_tcp/Makefile @@ -0,0 +1,11 @@ +ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) +SRC_FILES := modbus_tcp.c test_modbus_tcp.c +include $(KERNEL_ROOT)/compiler.mk +endif + +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FEATURES),y) + include $(APPDIR)/Make.defs + CSRCS += modbus_tcp.c test_modbus_tcp.c + include $(APPDIR)/Application.mk +endif diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/modbus_tcp.c b/APP_Framework/Applications/app_test/test_modbus_tcp/modbus_tcp.c new file mode 100644 index 000000000..7e7f57ee4 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_modbus_tcp/modbus_tcp.c @@ -0,0 +1,729 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/* + * @Description:包含modbusTCP请求报文的包装解析,以及报文收发,和每种功能码对应操作的实现。 + * @Version: V1.0.0 + * @Author: pgh_dd 1041315949@qq.com + * @Date: 2023-05-24 04:00:02 + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 16:36:53 + */ + + + +#include"modbus_tcp.h" + +u16_t Func0x_response_length[20]= +{ + 0,9,9,9,9,12,12,0,0,0,0,0,0,0,0,12,12 +}; + + +/** + * @description: 初始化功能码解析器 + * @param {MbParserType*}mbp {u8_t} type + * @return {void} + * @Date: 2023-07-25 16:59:23 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +void MbparserInit(MbParserType*mbp,u8_t type) +{ + mbp->func_set[R_RW_COIL]=FuncReadRwCoilX01; + mbp->func_set[R_R_COIL]=FuncReadRCoilX02; + mbp->func_set[R_RW_REG]=FuncReadRwRegX03; + mbp->func_set[R_R_REG]=FuncReadRRegX04; + mbp->func_set[W_RW_COIL]=FuncWriteRwCoilX05; + mbp->func_set[W_RW_REG]=FuncWriteRwRegX06; + mbp->func_set[W_MRW_REG]=FuncWriteRwMregsX10; + mbp->func_set[W_MRW_COIL]=FuncWriteRwMcoilsX0f; + mbp->func_set[REPORT_SlAVE_ID]=FuncReportSlaveIDX11; +}; + + +/** + * @description:初始化存储区 + * @return {int} + * @Date: 2023-07-25 17:01:47 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +int MbMemoryInit(MBmemoryType*mbm) +{ + mbm->rcoil_mem=(coils8_t*)malloc(sizeof(coils8_t)*RCOILMEM); + mbm->rreg_mem=(reg_t*)malloc(sizeof(reg_t)*RREGMEM); + mbm->rwcoil_mem=(coils8_t*)malloc(sizeof(coils8_t)*RWCOILMEM); + mbm->rwreg_mem=(reg_t*)malloc(sizeof(reg_t)*RWREGMEM); + + memset(mbm->rwreg_mem,0,RWREGMEM); + memset(mbm->rreg_mem,0,RREGMEM); + memset(mbm->rcoil_mem,0,RCOILMEM); + memset(mbm->rwcoil_mem,0,RWCOILMEM); + + // mbm->rwreg_mem[0]=3; + // mbm->rwreg_mem[1]=0x30ff; + mbm->rwcoil_mem[0]=1;mbm->rwcoil_mem[2]=1;mbm->rwcoil_mem[4]=1; + + if(mbm->rcoil_mem==NULL||mbm->rreg_mem==NULL||mbm->rwcoil_mem==NULL||mbm->rwreg_mem==NULL) + { + lw_error("memory is not full\n"); + return -1; + } + return 0; +} + +/** + * @description: 释放存储区 + * @return {void} + * @Date: 2023-07-25 17:02:22 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +void MbMemoryFree(MBmemoryType*mbm) +{ + free(mbm->rcoil_mem); + free(mbm->rreg_mem); + free(mbm->rwcoil_mem); + free(mbm->rwreg_mem); +} + +/** + * @description: 创建tcp通信套接字 + * @param {int} port + * @return {int} + * @Date: 2023-07-25 17:02:39 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +int CreateSocket(int port) +{ + int fd = -1, clientfd; + fd = socket(AF_INET, SOCK_STREAM, 0); + if(fd==-1)return -1; + int recv_len; + char *recv_buf; + struct sockaddr_in tcp_addr; + socklen_t addr_len; + + tcp_addr.sin_family = AF_INET; + tcp_addr.sin_addr.s_addr = INADDR_ANY; + tcp_addr.sin_port = htons(port); + memset(&(tcp_addr.sin_zero), 0, sizeof(tcp_addr.sin_zero)); + + if (bind(fd, (struct sockaddr *)&tcp_addr, sizeof(struct sockaddr)) == -1) { + lw_error("Unable to bind\n"); + close(fd); + return -1; + } + + lw_print("tcp bind success, start to receive.\n"); + lw_notice("\nLocal Port:%d\n", port); + + // setup socket fd as listening mode + if (listen(fd,128) != 0 ) { + lw_error("Unable to listen\n"); + close(fd); + return -1; + } + lw_print("Tcp start to listen.\n"); + return fd; +} + +/** + * @description: 读取请求报文的MBAP头部分 + * @param {int} fd {MbapType*}mbap + * @return {} + * @Date: 2023-07-25 17:03:04 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +int ReadMbtcpMBAP(int fd,MbapType*mbap) +{ + char buf[MODBUS_MBAP]; + read(fd,buf,MODBUS_MBAP); + mbap->tid=(((u16_t)buf[0])<<8)+(u16_t)buf[1];//高位左移8位再加低位 + mbap->pid=(((u16_t)buf[2])<<8)+(u16_t)buf[3]; + mbap->len=(((u16_t)buf[4])<<8)+(u16_t)buf[5]; + mbap->uid=((u8_t)buf[6]); + +}; + +/** + * @description: 读取请求报文的PDU部分 + * @param {int} fd {PduType*}pdu + * @return {} + * @Date: 2023-07-25 17:03:04 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +int ReadMbtcpPDU(int fd,PduType*pdu) +{ + char buf[MODBUS_PDUHEAD]; + + int n=read(fd,buf,MODBUS_PDUHEAD); + + + pdu->func=(u8_t)buf[0];//高位左移8位再加低位 + + if(n>3) + { + pdu->addr=(((u16_t)buf[1])<<8)+(u16_t)buf[2]; + pdu->operand1=(u8_t)buf[3]; + pdu->operand2=(u8_t)buf[4]; + } +}; + +/** + * @description: 制作响应报文 + * @param {MbapType*mbap,PduType*pdu,u8_t**resp,u16_t buf_len} + * @return {} + * @Date: 2023-07-25 17:11:23 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +void MakeResponse(MbapType*mbap,PduType*pdu,u8_t**resp,u16_t buf_len) +{ + buf_len-=6; + //这个长度实际是从数据长度位置到结束的长度,因此要将响应报文的总长减去事务头、协议、长度三个两字节数共6个 + (*resp)[0]=(u8_t)(mbap->tid>>8);(*resp)[1]=(u8_t)(0xff&mbap->tid); + (*resp)[2]=(u8_t)(mbap->pid>>8);(*resp)[3]=(u8_t)(0xff&mbap->pid); + (*resp)[4]=(u8_t)(buf_len>>8);(*resp)[5]=(u8_t)(0xff&buf_len); + (*resp)[6]=mbap->uid; + (*resp)[7]=pdu->func; +} + + +/** + * @description: 功能码0x1,负责读取从设备线圈的状态 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {} + * @Date: 2023-07-25 17:12:00 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + * @LastEditTime: 2023-07-25 17:10:31 + */ +int FuncReadRwCoilX01(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x01\n"); + printf("coils num:%d\n"); + u16_t coils_num=((u16_t)pdu->operand1<<8)+(u16_t)pdu->operand2;//线圈个数 + u16_t bytes_num=(coils_num/8+((coils_num%8)!=0));//输出的字节长度 + u16_t buf_len=Func0x_response_length[R_RW_COIL]+bytes_num;//response报文所占长度 + + *resp=(u8_t*)malloc(buf_len); memset(*resp,0,buf_len); + MakeResponse(mbap,pdu,resp,buf_len); + (*resp)[8]=(u8_t)bytes_num; + u8_t*sub_mem=mem->rwcoil_mem; + for(int i=0;iaddr]==1?((u8_t)1<<(i%8)):0); + } + + return buf_len; + // u8_t +}; + +/** + * @Description: 0x2功能码,读离散输入状态 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {} + * @Date: 2023-07-25 17:20:13 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncReadRCoilX02(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x02\n"); + + u16_t coils_num=((u16_t)pdu->operand1<<8)+(u16_t)pdu->operand2;//线圈个数 + u16_t bytes_num=(coils_num/8+((coils_num%8)!=0));//输出的字节长度 + u16_t buf_len=Func0x_response_length[R_RW_COIL]+bytes_num;//response报文所占长度 + + *resp=(u8_t*)malloc(buf_len); memset(*resp,0,buf_len); + MakeResponse(mbap,pdu,resp,buf_len); + (*resp)[8]=(u8_t)bytes_num; + u8_t*sub_mem=mem->rcoil_mem; + for(int i=0;iaddr]==1?((u8_t)1<<(i%8)):0); + } + + return buf_len; +}; + + +/** + * @Description: 读保持寄存器 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {} + * @Date: 2023-07-25 17:21:01 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncReadRwRegX03(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x03\n"); + u16_t data_len=((u16_t)pdu->operand1<<8)+(u16_t)pdu->operand2; + + u16_t buf_len=Func0x_response_length[R_RW_REG]+data_len*2; + *resp=(u8_t*)malloc(buf_len); + + MakeResponse(mbap,pdu,resp,buf_len); + + (*resp)[8]=(u8_t)data_len*2; + + u16_t*sub_mem=mem->rwreg_mem; + + u16_t addr_mem=pdu->addr,addr_resp=9; + int c=0; + while(c>8); + (*resp)[addr_resp+1]=(u8_t)(sub_mem[addr_mem]&0xff); + addr_resp+=2;addr_mem++; + c++; + } + + return buf_len; +}; + +/** + * @Description: 0x4功能码,读输入寄存器 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {} + * @Date: 2023-07-25 17:21:22 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncReadRRegX04(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x04\n"); + u16_t data_len=((u16_t)pdu->operand1<<8)+(u16_t)pdu->operand2; + + u16_t buf_len=Func0x_response_length[R_R_REG]+data_len*2; + *resp=(u8_t*)malloc(buf_len); + + MakeResponse(mbap,pdu,resp,buf_len); + + (*resp)[8]=(u8_t)data_len*2; + + u16_t*sub_mem=mem->rreg_mem; + + u16_t addr_mem=pdu->addr,addr_resp=9; + + int c=0; + while(c>8); + (*resp)[addr_resp+1]=(u8_t)(sub_mem[addr_mem]&0xff); + addr_resp+=2;addr_mem++; + c++; + } + + return buf_len; +}; + +/** + * @Description: 0x5功能码,写单个线圈 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {int} + * @Date: 2023-07-25 17:21:51 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncWriteRwCoilX05(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x05\n"); + u16_t addr_coil=pdu->addr; + u16_t operand=(((u16_t)pdu->operand1)<<8)+(u16_t)pdu->operand2; + if(operand==0xff00||operand==0x0000) + { + mem->rwcoil_mem[addr_coil]=(operand==0xff00?1:0); + } + + u16_t buf_len=Func0x_response_length[W_RW_COIL]; + *resp=(u8_t*)malloc(buf_len); + + MakeResponse(mbap,pdu,resp,buf_len); + + (*resp)[8]=(u8_t)((pdu->addr)>>8); + (*resp)[9]=(u8_t)(pdu->addr&0xff); + (*resp)[10]=(u8_t)(pdu->operand1); + (*resp)[11]=(u8_t)(pdu->operand2); + + printf("write data:%x\n",operand); + + return buf_len; + +}; + +/** + * @Description: 0x6功能码,写单个保持寄存器 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {int} + * @Date: 2023-07-25 17:22:38 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncWriteRwRegX06(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x06\n"); + u16_t addr_reg=pdu->addr; + u16_t reg_data=(u16_t)((pdu->operand1)<<8)+(u16_t)(pdu->operand2); + mem->rwreg_mem[addr_reg]=reg_data; + u16_t buf_len=Func0x_response_length[W_RW_REG]; + *resp=(u8_t*)malloc(buf_len); + + MakeResponse(mbap,pdu,resp,buf_len); + + (*resp)[8]=(u8_t)((pdu->addr)>>8); + (*resp)[9]=(u8_t)(pdu->addr&0xff); + (*resp)[10]=(u8_t)(pdu->operand1); + (*resp)[11]=(u8_t)(pdu->operand2); + + printf("write data:%x\n",reg_data); + return buf_len; +}; + +/** + * @Description: 0xf功能码,写多个线圈 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {int} + * @Date: 2023-07-25 17:23:16 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncWriteRwMcoilsX0f(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x0f\n"); + u16_t coils_num=(((u16_t)(pdu->operand1))<<8)+(u16_t)(pdu->operand2); + + u16_t res_num=coils_num/8+(coils_num%8!=0)+1; + + u8_t*recv_buf=(u8_t*)malloc(sizeof(u8_t)*res_num); + + int n=read(fd,(char*)recv_buf,res_num); + + + u8_t*sub_mem=mem->rwcoil_mem; + + for(int i=0;iaddr+i]=((recv_buf[1+i/8]&(1<<(i%8)))==0?0:1); + } + + + u16_t buf_len=Func0x_response_length[W_MRW_COIL]; + *resp=(u8_t*)malloc(buf_len); + + MakeResponse(mbap,pdu,resp,buf_len); + + (*resp)[8]=(u8_t)((pdu->addr)>>8); + (*resp)[9]=(u8_t)(pdu->addr&0xff); + (*resp)[10]=(u8_t)(pdu->operand1); + (*resp)[11]=(u8_t)(pdu->operand2); + + free(recv_buf); + + + + return buf_len; +}; + +/** + * @Description: 0x10功能码,写多个保持寄存器 + * @param {MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp} + * @return {int} + * @Date: 2023-07-25 17:23:56 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncWriteRwMregsX10(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x10\n"); + u16_t data_num=(((u16_t)(pdu->operand1))<<8)+(u16_t)(pdu->operand2); + u16_t res_num=data_num*2+1; + u8_t*recv_buf=(u8_t*)malloc(sizeof(u8_t)*res_num); + + + int n=read(fd,(char*)recv_buf,res_num); + + // printf("%x %x %x\n",recv_buf[0],recv_buf[1],recv_buf[2]); + + u16_t*sub_mem=mem->rwreg_mem; + + for(int i=0;iaddr+i]=(((u16_t)(recv_buf[1+i*2]))<<8)+(u16_t)(recv_buf[1+i*2+1]); + } + + + u16_t buf_len=Func0x_response_length[W_MRW_REG]; + *resp=(u8_t*)malloc(buf_len); + + MakeResponse(mbap,pdu,resp,buf_len); + + (*resp)[8]=(u8_t)((pdu->addr)>>8); + (*resp)[9]=(u8_t)(pdu->addr&0xff); + (*resp)[10]=(u8_t)(pdu->operand1); + (*resp)[11]=(u8_t)(pdu->operand2); + + + free(recv_buf); + + return buf_len; +}; + +/** + * @Description: 报告从设备id + * @param {int} fd + * @return {} + * @Date: 2023-07-25 17:24:43 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int FuncReportSlaveIDX11(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp) +{ + printf("enter x11\n"); + +}; + +/** + * @Description: 发送响应报文 + * @param {int} fd + * @param {u16_t} n + * @return {} + * @Date: 2023-07-25 17:24:55 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int SendResponse(int fd,u8_t**buf,u16_t n) +{ + printf("Response:"); + for(int i=0;iuid);printf("%d",mbap->uid);printf("\n"); + + printf("Please input function code:"); + scanf("%x",&pdu->func);printf("%x",pdu->func);printf("\n"); + + printf("The address:"); + scanf("%d",&pdu->addr);printf("%d",pdu->addr);printf("\n"); + + switch (pdu->func) + { + case R_RW_COIL: + case R_R_COIL:printf("The number of coils you want read:");break; + case R_RW_REG: + case R_R_REG:printf("The number of registers you want read:");break; + + case W_RW_COIL:printf("The value of coil you want write(1 or 0):");break; + case W_RW_REG:printf("The value of register you want write:");break; + + case W_MRW_COIL:printf("The number of coils you want write:");break; + case W_MRW_REG:printf("The number of registers you want write:");break; + + default: + break; + } + u16_t num; + scanf("%d",&num);printf("%d\n",num); + if(pdu->func==W_RW_COIL) + { + pdu->operand2=0; + pdu->operand1=(num==1?0xff:0); + } + else { + pdu->operand1=(u8_t)(num>>8); + pdu->operand2=(u8_t)(num&0x00ff); + } + + + if(pdu->func==W_MRW_REG) + { + send_buf_length=num*2+1+12; + *request=(u8_t*)malloc(send_buf_length); + memset(*request,0,send_buf_length); + printf("input register data(decimal integer,in total %d):",num); + (*request)[12]=(u8_t)(num*2); + for(int i=0;i>8); + (*request)[i*2+13+1]=(u8_t)(tem&0x00ff); + } + printf("\n"); + } + else if(pdu->func==W_MRW_COIL) + { + send_buf_length=num/8+(num%8!=0)+1+12; + *request=(u8_t*)malloc(send_buf_length); + memset(*request,0,send_buf_length); + printf("input coil data(0 or 1,in total %d):",num); + (*request)[12]=(u8_t)(num/8+(num%8!=0)); + for(int i=0;iaddr]==1?((u8_t)1<<(i%8)):0); + } + } + printf("\n"); + } + else + { + send_buf_length=12; + *request=(u8_t*)malloc(send_buf_length); + if((*request)==NULL)printf("erro\n"); + + } + + (*request)[0]=(u8_t)(mbap->tid>>8);(*request)[1]=(u8_t)(0xff&mbap->tid); + (*request)[2]=(u8_t)(mbap->pid>>8);(*request)[3]=(u8_t)(0xff&mbap->pid); + (*request)[4]=(u8_t)((send_buf_length-6)>>8);(*request)[5]=(u8_t)(0xff&(send_buf_length-6)); + (*request)[6]=mbap->uid; + (*request)[7]=pdu->func; + (*request)[8]=(u8_t)(pdu->addr>>8);(*request)[9]=(u8_t)(0xff&pdu->addr); + (*request)[10]=pdu->operand1;(*request)[11]=pdu->operand2; + + printf("messege is:"); + for(int i=0;ifunc,1);//读取功能码 + + u8_t byte_num=0; + u8_t *recv_buf; + switch (pdu->func) + { + case R_R_COIL: + case R_R_REG: + case R_RW_COIL: + case R_RW_REG: + data_num=(((u16_t)(pdu->operand1))<<8)+(u16_t)(pdu->operand2); + read(fd,&byte_num,1); + recv_buf=(u8_t*)malloc(byte_num); + read(fd,recv_buf,byte_num); + /* code */ + break; + case W_RW_COIL: + case W_RW_REG: + case W_MRW_REG: + case W_MRW_COIL: + recv_buf=(u8_t*)malloc(4); + read(fd, recv_buf,4); + break; + default: + break; + } + + printf("Response: TID:%x func code:%x byte num:%x\n",mbap->tid,pdu->func,byte_num); + + if(pdu->func==R_R_COIL||pdu->func==R_RW_COIL) + { + printf("coils:"); + for(int i=0;ifunc==R_R_REG||pdu->func==R_RW_REG) + { + printf("registers:"); + // for(int i=0;i +#include +#include +#include +#include +#include "lwip/sys.h" + +#define PORT 8888 +#define RCOILMEM 1000 +#define RREGMEM 1000 +#define RWCOILMEM 1000 +#define RWREGMEM 1000 + +#define MBTCP 1 +#define MBRTU 2 +//功能码 +#define R_RW_COIL 0x01 +#define R_R_COIL 0x02 +#define R_RW_REG 0x03 +#define R_R_REG 0x04 +#define W_RW_COIL 0x05 +#define W_RW_REG 0x06 +#define DIAGNOSTIC 0x08 +#define GET_COUNTER 0x0B +#define W_MRW_COIL 0x0F +#define W_MRW_REG 0x10 +#define REPORT_SlAVE_ID 0x11 + + +typedef u8_t coils8_t; +typedef u16_t reg_t; + +#define MODBUS_MBAP 7 +#define MODBUS_PDUHEAD 5 + + +//定义存储区结构体 +typedef struct MbMemory +{ + coils8_t*rcoil_mem; + reg_t*rreg_mem; + coils8_t*rwcoil_mem; + reg_t*rwreg_mem; +}MBmemoryType; +//初始化存储区的函数 +int MbMemoryInit(MBmemoryType*mb); +//释放存储区 +void MbMemoryFree(MBmemoryType*mb); + + +//协议的固定部分为12个字节,当功能码为写多个数据时,后续还有不定长的数据部分 +typedef struct mbap +{ + //MbapType + u16_t tid; + u16_t pid; + u16_t len; + u8_t uid; + + /* data */ +}MbapType; + +typedef struct pdu +{ + u8_t func; + + u16_t addr; + + u8_t operand1; + u8_t operand2; + /* data */ +}PduType; + +int CreateSocket(int port); + +int ReadMbtcpMBAP(int fd,MbapType*mb_s); +int ReadMbtcpPDU(int fd,PduType*mb_s); + + +//操作函数 + +int FuncReadRwCoilX01(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReadRCoilX02(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReadRwRegX03(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReadRRegX04(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwCoilX05(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwRegX06(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwMcoilsX0f(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwMregsX10(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); + +int FuncReportSlaveIDX11(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +//位地址转换字节地址 + +//定义解析器结构体 +typedef struct mbparser +{ + int (*func_set[20])(MBmemoryType*,int,MbapType*,PduType*,u8_t**resp); +}MbParserType; +//解析器初始化,实际上就是每个功能码对应的操作函数的注册 +void MbparserInit(MbParserType*mbp,u8_t flag); + +void MakeResponse(MbapType*,PduType*,u8_t**,u16_t); + +int SendResponse(int fd,u8_t**buf,u16_t n); + + +// void func(PDU*pdu); + +// void delete_modbus_request(); +//主机程序 +int GenerateModbusRequest(MbapType*,PduType*,u8_t flag,u8_t**request); + +void SendModbus(int fd,u8_t**request,int n); + +void GetRequest(int fd,MbapType*,PduType*); +#endif diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c b/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c new file mode 100644 index 000000000..e2376e9e0 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c @@ -0,0 +1,248 @@ +/* +* Copyright (c) 2022 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file lwip_tcp_socket_demo.c +* @brief TCP socket demo based on LwIP +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2022-03-21 +*/ + +#include +#include"modbus_tcp.h" + +#ifdef ADD_XIZI_FEATURES +#include +#include +#include "lwip/sys.h" +#endif + +#ifdef ADD_NUTTX_FEATURES +#include +#include +#include +#include "stdio.h" +#endif + +#define TCP_DEMO_BUF_SIZE 65535 +#define TCP_DEMO_SEND_TIMES 20 +#define LWIP_TCP_DEMO_TASK_STACK_SIZE 4096 +#define LWIP_TCP_DEMO_TASK_PRIO 20 + +static pthread_t tcp_client_task; +static pthread_t tcp_server_task; + +static char tcp_demo_ipaddr[] = {192, 168, 31, 77}; +static char tcp_demo_netmask[] = {255, 255, 255, 0}; +static char tcp_demo_gwaddr[] = {192, 168, 31, 1}; + +#ifdef ADD_NUTTX_FEATURES +#define lw_print printf +#define lw_notice printf +#define lw_error printf + +#define LWIP_DEMO_TIMES 3 +#define LWIP_TARGET_PORT 4840 +#endif + +static uint16_t tcp_socket_port = 8888; +static char tcp_ip_str[128] = {0}; + +/******************************************************************************/ +static void TcpSocketConfigParam(char *ip_str) +{ + int ip1, ip2, ip3, ip4, port = 0; + + if(ip_str == NULL) + return; + + if(sscanf(ip_str, "%d.%d.%d.%d:%d", &ip1, &ip2, &ip3, &ip4, &port)) { + printf("config ip %s port %d\n", ip_str, port); + strcpy(tcp_ip_str, ip_str); + if(port) + tcp_socket_port = port; + return; + } + + if(sscanf(ip_str, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4)) { + printf("config ip %s\n", ip_str); + strcpy(tcp_ip_str, ip_str); + } +} + +static void *ModbusTcpServer(void *arg) +{ + + u8_t uid=1;//定义从设备id和存储区 + + MBmemoryType mbm;//定义存储区 + if(MbMemoryInit(&mbm)==-1)//初始化存储区,包括对四个存储区进行内存分配 + { + return 0; + }; + + MbParserType mb_parser;//初始化功能码解析器 + MbparserInit(&mb_parser,MBTCP);//初始化解析器,将功能码对应函数注册 + + int fd=CreateSocket(PORT);//创建监听套接字 + if(fd==-1)return 0; + + int recv_len; + char *recv_buf; + struct sockaddr_in tcp_addr; + socklen_t addr_len; + + while(1) + { + struct sockaddr_in tcp_addr; + socklen_t addr_len; + + printf("wait accept\n"); + int clientfd = accept(fd, (struct sockaddr *)&tcp_addr, (socklen_t*)&addr_len); + + if(clientfd==-1) + { + lw_error("Unable to listen\n"); + return 0; + } + + while(1) + { + MbapType mbap; + PduType pdu; + ReadMbtcpMBAP(clientfd,&mbap);//读取数据前7字节为mbap初始化 + + if(mbap.uid!=uid){//检验是否为此从机 + close(clientfd); + break; + } + + + ReadMbtcpPDU(clientfd,&pdu);//读取pdu和一些定长部分 + + printf("OP:%x\n",pdu.func); + printf("ADDR:%x\n",pdu.addr); + + u8_t* response_buf;//定义操作返回的指针 + u8_t buf_len=mb_parser.func_set[pdu.func](&mbm,clientfd,&mbap,&pdu,&response_buf); + + SendResponse(clientfd,&response_buf,buf_len); + // return NULL; + //执行操作 + + } + close(clientfd); + } + close(fd); + MbMemoryFree(&mbm);//释放存储区 +} + +void Test_ModbusTcpServer(int argc, char *argv[]) +{ + if(argc >= 2) { + lw_print("lw: [%s] target ip %s\n", __func__, argv[1]); + TcpSocketConfigParam(argv[1]); + } + +#ifdef ADD_XIZI_FEATURES + lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr); + +#endif + +#ifdef ADD_NUTTX_FEATURES + pthread_attr_t attr = PTHREAD_ATTR_INITIALIZER; + attr.priority = LWIP_TCP_DEMO_TASK_PRIO; + attr.stacksize = LWIP_TCP_DEMO_TASK_STACK_SIZE; +#endif + + ModbusTcpServer(NULL); +} + +PRIV_SHELL_CMD_FUNCTION(Test_ModbusTcpServer, a modbusS test sample, PRIV_SHELL_CMD_MAIN_ATTR); + +static void *ModbusTcpClient(void *arg) +{ + u16_t counter=0; + int fd = -1; + int ret; + + // lw_print("2023-05-27 Peng Guanhua\n"); + lw_print("%s start\n", __func__); + + fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { + lw_print("Socket error\n"); + return NULL; + } + + char tcp_ip_str[128]="192.168.31.148"; + u16_t tcp_socket_port=6000; + + + printf("%s\n",tcp_ip_str); + struct sockaddr_in tcp_sock; + tcp_sock.sin_family = AF_INET; + tcp_sock.sin_port = htons(tcp_socket_port); + tcp_sock.sin_addr.s_addr = inet_addr(tcp_ip_str); + printf("%s\n",tcp_ip_str); + + memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); + + ret = connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr)); + + if (ret < 0) { + lw_print("Unable to connect %s:%d = %d\n", tcp_ip_str, tcp_socket_port, ret); + close(fd); + return NULL; + } + + lw_print("TCP connect %s:%d success, start.\n", tcp_ip_str, tcp_socket_port); + + + while (1) { + + MbapType mbap={counter,0,0,0}; + PduType pdu; + u8_t*request; + + int mesg_len=GenerateModbusRequest(&mbap,&pdu,MBTCP,&request); + SendModbus(fd,&request,mesg_len); + GetRequest(fd,&mbap,&pdu); + counter++; + } + + close(fd); + return NULL; +} + +void Test_ModbusTcpClient(int argc, char *argv[]) +{ + if(argc >= 2) { + lw_print("lw: [%s] target ip %s\n", __func__, argv[1]); + TcpSocketConfigParam(argv[1]); + } + +#ifdef ADD_XIZI_FEATURES + lwip_config_tcp(0, tcp_demo_ipaddr, tcp_demo_netmask, tcp_demo_gwaddr); + +#endif +#ifdef ADD_NUTTX_FEATURES + pthread_attr_t attr = PTHREAD_ATTR_INITIALIZER; + attr.priority = LWIP_TCP_DEMO_TASK_PRIO; + attr.stacksize = LWIP_TCP_DEMO_TASK_STACK_SIZE; +#endif + + ModbusTcpClient(NULL); +} +PRIV_SHELL_CMD_FUNCTION(Test_ModbusTcpClient, a modbustcpC test sample, PRIV_SHELL_CMD_MAIN_ATTR); + From 10482724a996925330008ea026fae30aef883601 Mon Sep 17 00:00:00 2001 From: pgh_dd <1041315949@qq.com> Date: Tue, 25 Jul 2023 22:10:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?"=E6=B7=BB=E5=8A=A0=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=96=87=E4=BB=B6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app_test/test_modbus_tcp/README.md | 340 ++++++++++++++++++ .../test_modbus_tcp/img/modbusTCP_C1.png | Bin 0 -> 28917 bytes .../test_modbus_tcp/img/modbusTCP_C2.png | Bin 0 -> 10857 bytes .../test_modbus_tcp/img/modbusTCP_C3.png | Bin 0 -> 10649 bytes .../test_modbus_tcp/img/modbusTCP_C4.png | Bin 0 -> 10950 bytes .../test_modbus_tcp/img/modbusTCP_C5.png | Bin 0 -> 10632 bytes .../test_modbus_tcp/img/modbusTCP_C6.png | Bin 0 -> 11141 bytes .../test_modbus_tcp/img/modbusTCP_S1.png | Bin 0 -> 27843 bytes .../test_modbus_tcp/img/modbusTCP_S2.png | Bin 0 -> 23644 bytes .../test_modbus_tcp/img/modbusTCP_S3.png | Bin 0 -> 16429 bytes .../test_modbus_tcp/img/modbusTCP_S4.png | Bin 0 -> 5522 bytes .../test_modbus_tcp/img/modbusTCP_S5.png | Bin 0 -> 2813 bytes .../test_modbus_tcp/img/modbusTCP_S6.png | Bin 0 -> 3461 bytes .../test_modbus_tcp/img/modbusTCP_S7.png | Bin 0 -> 10904 bytes 14 files changed, 340 insertions(+) create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/README.md create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C1.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C2.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C3.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C4.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C5.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C6.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S1.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S2.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S3.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S4.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S5.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S6.png create mode 100644 APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S7.png diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/README.md b/APP_Framework/Applications/app_test/test_modbus_tcp/README.md new file mode 100644 index 000000000..153cd6d86 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_modbus_tcp/README.md @@ -0,0 +1,340 @@ +# ##modbus-tcp## + +## 1. 简介 + +在xiuos平台实现modbusTCP协议,包括协议报文组装、解析和数据传输,支持主从通信。 + +## 2. 数据结构设计说明 + +### 2.1 数据结构定义 + +首先,需要定义设备存储区的结构体,包括两种存储类型,16位的寄存器和线圈。 + +```c +//定义存储区结构体 +typedef struct MbMemory +{ + coils8_t*rcoil_mem; + reg_t*rreg_mem; + coils8_t*rwcoil_mem; + reg_t*rwreg_mem; +}MBmemoryType; +``` + +​ 然后便是关于ModbusTCP协议相关的结构体定义,包括MBAP和PDU,后续数据区视情况而定,长短不固定。 + +```c +//协议的固定部分为12个字节,当功能码为写多个数据时,后续还有不定长的数据部分 +typedef struct mbap +{ + //MbapType + u16_t tid; + u16_t pid; + u16_t len; + u8_t uid; + + /* data */ +}MbapType; + +typedef struct pdu +{ + u8_t func; + + u16_t addr; + + u8_t operand1; + u8_t operand2; + /* data */ +}PduType; +``` + +### 2.1 从设备请求解析和响应部分 + +​ 主要定义请求的解析器结构,以及每种功能码对应的解析函数,和发送响应的函数。 + +```c +//定义解析器结构体 +typedef struct mbparser +{ + int (*func_set[20])(MBmemoryType*,int,MbapType*,PduType*,u8_t**resp); +}MbParserType; + +//功能码解析函数 +int FuncReadRwCoilX01(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReadRCoilX02(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReadRwRegX03(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReadRRegX04(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwCoilX05(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwRegX06(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwMcoilsX0f(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncWriteRwMregsX10(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); +int FuncReportSlaveIDX11(MBmemoryType*mem,int fd,MbapType*mbap,PduType*pdu,u8_t**resp); + + +/** + * @description: 制作响应报文 + * @param {MbapType*mbap,PduType*pdu,u8_t**resp,u16_t buf_len} + * @return {} + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +void MakeResponse(MbapType*,PduType*,u8_t**,u16_t); + +/** + * @Description: 发送响应报文 + * @param {int} fd 套接字对应文件描述符 + * @param {u16_t} n 报文大小 + * @return {int} + * @Date: 2023-07-25 17:24:55 + * @Author: pgh_dd 1041315949@qq.com + */ +int SendResponse(int fd,u8_t**buf,u16_t n); + + +``` + +### 2.2 主设备的请求包装和发送部分 + +```c +/** + * @Description: 读取键盘输入,并生成请求报文 + * @param {u8_t} flag + * @return {int} + * @Date: 2023-07-25 17:25:26 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +int GenerateModbusRequest(MbapType*,PduType*,u8_t flag,u8_t**request); + +/** + * @Description: 发送请求报文 + * @param {int fd,u8_t**request,int n} + * @return {} + * @Date: 2023-07-25 17:26:10 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +void SendModbus(int fd,u8_t**request,int n); + +/** + * @Description: 读取请求报文 + * @param {int fd,MbapType*mbap,PduType*pdu} + * @return {void} + * @Date: 2023-07-25 17:26:49 + * @Author: pgh_dd 1041315949@qq.com + * @LastEditors: pgh_dd 1041315949@qq.com + */ +void GetRequest(int fd,MbapType*,PduType*); +``` + + + +## 3. 测试程序说明 + +​ modbusTCP协议基于TCP协议,因此其主从通信实际上是基于TCP的S/C通信,因此分为服务端和客户端。 + +​ 服务端部分(从设备)程序实际上是一个被动接受请求报文的TCP服务器程序,除了一些基础参数的定义外,主要包括一个无限循环的服务程序,包括报文的接收,以及对存储区的操作,和生成发送响应。 + +```c +static void *ModbusTcpServer(void *arg) +{ + //设置IP和子网掩码网关 + u8_t uid=1;//定义从设备id和存储区 + + MBmemory mbm;//定义存储区 + if(mb_memory_init(&mbm)==-1)//初始化存储区,包括对四个存储区进行内存分配 + { + return 0; + }; + + MBparser mb_parser;//初始化功能码解析器 + MBparser_init(&mb_parser,MBTCP);//初始化解析器,将功能码对应函数注册 + + int fd=create_socket(PORT);//创建监听套接字 + if(fd==-1)return 0; + + if (listen(fd, 10) != 0 ) { + lw_error("Unable to listen\n"); + close(fd); + return 0; + } + + while(1) + { + //建立连接,因为每次接受的连接可能不是同一个设备发来的,因此需要把建立连接部分放在循环体内。 + struct sockaddr_in tcp_addr; + socklen_t addr_len; + + printf("wait accept\n"); + int clientfd = accept(fd, (struct sockaddr *)&tcp_addr, (socklen_t*)&addr_len); + + if(clientfd==-1) + { + lw_error("Unable to listen\n"); + return 0; + } + + while(1) + { + MBAP mbap; + PDU pdu; + read_mbtcp_MBAP(clientfd,&mbap);//读取数据前7字节为mbap初始化 + + if(mbap.uid!=uid){//检验是否为此从机 + close(clientfd); + break; + } + + + read_mbtcp_PDU(clientfd,&pdu);//读取pdu和一些定长部分 + + printf("OP:%x\n",pdu.func); + printf("ADDR:%x\n",pdu.addr); + + u8_t** response_buf;//定义操作返回的指针 + u8_t buf_len=mb_parser.func_set[pdu.func](&mbm,clientfd,&mbap,&pdu,response_buf);//请求的解析和对存储区的操作 + + send_response(clientfd,response_buf,buf_len);//发送响应 + // return NULL; + //执行操作 + + } + close(clientfd); + } + close(fd); + mb_memory_free(&mbm);//释放存储区 +} + +``` + +​ 客户端部分(主设备)是一个主动发送请求的TCP客户端程序,主要包括一个接受键盘输入的循环体,可以接受用户输入的指令,然后包装成Modbus请求报文,并发送给ModbusTCP服务器,然后接受响应报文。 + +```c +static void *ModbusTcpClient(void *arg) +{ + u16_t counter=0; + int fd = -1; + int ret; + + // lw_print("2023-05-27 Peng Guanhua\n"); + lw_print("%s start\n", __func__); + + fd = socket(AF_INET, SOCK_STREAM, 0);//定义服务器套接字 + if (fd < 0) { + lw_print("Socket error\n"); + return NULL; + } + + char tcp_ip_str[128]="192.168.31.148";//服务器ip和端口号 + u16_t tcp_socket_port=6000; + + /*建立套接字连接*/ + printf("%s\n",tcp_ip_str); + struct sockaddr_in tcp_sock; + tcp_sock.sin_family = AF_INET; + tcp_sock.sin_port = htons(tcp_socket_port); + tcp_sock.sin_addr.s_addr = inet_addr(tcp_ip_str); + printf("%s\n",tcp_ip_str); + + memset(&(tcp_sock.sin_zero), 0, sizeof(tcp_sock.sin_zero)); + + ret = connect(fd, (struct sockaddr *)&tcp_sock, sizeof(struct sockaddr)); + + if (ret < 0) { + lw_print("Unable to connect %s:%d = %d\n", tcp_ip_str, tcp_socket_port, ret); + close(fd); + return NULL; + } + + lw_print("TCP connect %s:%d success, start.\n", tcp_ip_str, tcp_socket_port); + + + + while (1) { + + MBAP mbap={counter,0,0,0}; + PDU pdu; + u8_t*request; + + int mesg_len=generate_modbus_request(&mbap,&pdu,MBTCP,&request);//此函数中接收键盘输入,并生成请求报文。 + send_modbus(fd,&request,mesg_len);//发送请求报文。 + get_response(fd,&mbap,&pdu);//接收响应报文,并显示 + counter++; + } + + close(fd); + return NULL; +} +``` + + + +## 4. 运行结果 + +### 4.1 从设备通信测试 + +从设备测试,在终端上将TCP服务端程序打开,如图1,等待主设备的连接。 + +![alt 图1从设备等到主设备连接](./img/modbusTCP_S1.png) + +​ 主设备采用Modbus Poll应用程序,建立TCP连接,如图2所示。 + +![alt 图2主设备与从设备建立TCP连接](./img/modbusTCP_S2.png) + +​ 此时modbus poll程序便会不断的向从设备发送请求,如图3。 + +![alt 图3从设备接收从设备请求报文并响应](./img/modbusTCP_S3.png) + +​ 可以看到解析出的功能码、地址以及对应的响应报文,然后我们在modbus poll上修改一下存储区数据。如图4所示。 + +![alt 图4](./img/modbusTCP_S4.png) + +因为修改的是寄存器存储区的值,因此对应0x10功能码,然后看看从设备的反映。如图5所示。 + +![alt 图5](./img/modbusTCP_S6.png) + +可见成功收到功能码,并返回了响应的报文。 + +![alt 图6](./img/modbusTCP_S5.png) + +modbus poll显示响应成功,存储区已成功修改期望的值。 + +![alt 图7](./img/modbusTCP_S7.png) + +可见存储区已成功修改。 + +线圈部分的查询修改同理,不再赘述。 + +### 4.2主设备通信测试 + +​ 首先打开modbus slave应用程序,用以作为从设备,然后将存储区数据修改,用以测试,并打开TCP端口,等待主设备的连接,如图8所示。 + +![alt 图8](./img/modbusTCP_C2.png) + +​ 同样在终端打开从设备程序,从设备的ip,port在源码中已定义好,所以打开时已经连接上,如图9所示。 + + + +![alt 图9](./img/modbusTCP_C1.png) + +​ 开始输入从设备id,功能码,以及其他信息用以生成请求报文。 + +![alt 图10](./img/modbusTCP_C3.png) + +​ 如图10所示,输入功能码3,对应读取寄存器功能,地址从0开始,数量4,然后便会生成请求报文,然后发送,结果如图11所示。 + +![alt](./img/modbusTCP_C4.png) + +​ 可见,已成功查询到寄存器的值。 + +​ 然后测试写入功能,输入功能码15(0xf),对应写入多个线圈功能,如图12,modbus slave对应的响应结果如图13所示。 + +​ ![alt 图12](./img/modbusTCP_C5.png) + +​ 写入线圈的值为5个,分别为1 0 1 0 1。发送成功后,modbus salve中显示如图13所示。 + +![alt 图13](./img/modbusTCP_C6.png) + +​ 可见,已成功修改。 + +​ 其他功能码测试过程类似,不再赘述。 \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C1.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C1.png new file mode 100644 index 0000000000000000000000000000000000000000..5561b12c4df250ee4c36c30a1491b2940a2f9b80 GIT binary patch literal 28917 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%0D2LqLTud)7+Wu6;RVQ|ug(llB|r`qN%^yKkpU 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 literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C2.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C2.png new file mode 100644 index 0000000000000000000000000000000000000000..86ae5e38adabbc5f7886089e7f9404e45b8b3636 GIT binary patch literal 10857 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 JJT!a#e*kaDvQPj3 literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C3.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C3.png new file mode 100644 index 0000000000000000000000000000000000000000..89a1b8d9326fff0b4282b211b0f908a2a340e206 GIT binary patch literal 10649 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 b4w;@qIiF)5Q4z0PUeZ+6RjE+2`S?Eo4BRwJ literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C4.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C4.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9af533d4e7576d8f4fa68ebd6d9fbc5758c1f7 GIT binary patch literal 10950 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 v=*M8Aex*8>FHn0B+s^s{{ literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C5.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C5.png new file mode 100644 index 0000000000000000000000000000000000000000..da53192850683f04010eb0fe258cc0a538fdad42 GIT binary patch literal 10632 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 D1_P%} literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C6.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_C6.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9c230ecd51aaa42c9acc5b40383d84cc62ab3f GIT binary patch literal 11141 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 KowAGe5B~?oK1_oE literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S1.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S1.png new file mode 100644 index 0000000000000000000000000000000000000000..174c7d1f86678ec2653c99ecc20d0eb447f24938 GIT binary patch literal 27843 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 REVTlFv7z~eYJKN>{{e?2j=2B; literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S5.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S5.png new file mode 100644 index 0000000000000000000000000000000000000000..31ad122b8562b39c710e6c3f9ee014bd1ca2939e GIT binary patch literal 2813 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 Gru`GG;$WZv literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S6.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S6.png new file mode 100644 index 0000000000000000000000000000000000000000..f06a4bf299f79c0b13b98f318d629a261d80488d GIT binary patch literal 3461 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 literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S7.png b/APP_Framework/Applications/app_test/test_modbus_tcp/img/modbusTCP_S7.png new file mode 100644 index 0000000000000000000000000000000000000000..fdbec3295c031812a1e24f51f9e2bea5917e9cc3 GIT binary patch literal 10904 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 Date: Mon, 31 Jul 2023 12:51:36 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BB=93=E5=BA=93=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app_test/test_modbus_tcp/test_modbus_tcp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c b/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c index e2376e9e0..b0565511d 100644 --- a/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c +++ b/APP_Framework/Applications/app_test/test_modbus_tcp/test_modbus_tcp.c @@ -147,7 +147,7 @@ static void *ModbusTcpServer(void *arg) MbMemoryFree(&mbm);//释放存储区 } -void Test_ModbusTcpServer(int argc, char *argv[]) +void TestModbusTcpServer(int argc, char *argv[]) { if(argc >= 2) { lw_print("lw: [%s] target ip %s\n", __func__, argv[1]); @@ -168,7 +168,7 @@ void Test_ModbusTcpServer(int argc, char *argv[]) ModbusTcpServer(NULL); } -PRIV_SHELL_CMD_FUNCTION(Test_ModbusTcpServer, a modbusS test sample, PRIV_SHELL_CMD_MAIN_ATTR); +PRIV_SHELL_CMD_FUNCTION(TestModbusTcpServer, a modbusS test sample, PRIV_SHELL_CMD_MAIN_ATTR); static void *ModbusTcpClient(void *arg) { @@ -225,7 +225,7 @@ static void *ModbusTcpClient(void *arg) return NULL; } -void Test_ModbusTcpClient(int argc, char *argv[]) +void TestModbusTcpClient(int argc, char *argv[]) { if(argc >= 2) { lw_print("lw: [%s] target ip %s\n", __func__, argv[1]); @@ -244,5 +244,5 @@ void Test_ModbusTcpClient(int argc, char *argv[]) ModbusTcpClient(NULL); } -PRIV_SHELL_CMD_FUNCTION(Test_ModbusTcpClient, a modbustcpC test sample, PRIV_SHELL_CMD_MAIN_ATTR); +PRIV_SHELL_CMD_FUNCTION(TestModbusTcpClient, a modbustcpC test sample, PRIV_SHELL_CMD_MAIN_ATTR);