From 8bfef9f8898035f2ab963794522a13044f0270f0 Mon Sep 17 00:00:00 2001 From: XerolySkinner Date: Wed, 20 Dec 2023 22:24:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86ModBus=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +- .../bsp_UART/mb_ModBusRTU/mbm_ModBusRTU.c | 2 +- .../bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.c | 103 ++++++++++++++++++ .../bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.h | 5 + 4 files changed, 115 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b5f90f4..f52a304 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,17 @@ ## 🍣主要功能(不断更新中): -- 全文使用Doxygen良好注释,带有中文使用文档输出.内部有函数调用图等图例和类,函数使用方法. +- 全文使用Doxygen良好注释,带有中文使用文档输出.内部有函数调用图等图例和类,函数使用方法. -- 栈,队列的实现,分别使用链表方式和内存重分配方式写了两个版本,方便根据实际情况取舍使用.队列和栈做了压入弹出函数的成员函数,方便做通信时的函数队列. +- 栈,队列的实现,分别使用链表方式和内存重分配方式写了两个版本,方便根据实际情况取舍使用.队列和栈做了压入弹出函数的成员函数,方便做通信时的函数队列. -- 软件IIC的库,派生出AT储存芯片和OLED显示屏的驱动函数,还有MPU6050的DMP已适配STM32版本,开包即用. +- 软件IIC的库,派生出AT储存芯片和OLED显示屏的驱动函数,还有MPU6050的DMP已适配STM32版本,开包即用. -- 软件SPI的库正在测试中,预计不久后上线,预期派生出DS1302和MAX6675的驱动函数. +- 软件SPI的库正在测试中,预计不久后上线,预期派生出DS1302和MAX6675的驱动函数. -- PID库正在测试中,并且包括了增量式和位置式两种方式写的不同PID算法,有舍去积分项的PD提供使用,还有限幅和积分饱和相关的简单实现.方便套环和并环使用. +- PID库正在测试中,并且包括了增量式和位置式两种方式写的不同PID算法,有舍去积分项的PD提供使用,还有限幅和积分饱和相关的简单实现.方便套环和并环使用. -- varint头文件中已经预先声明了u8之类的类型,全局使用u8,u32等表示的标准类型.类型严格标准化 +- varint头文件中已经预先声明了u8之类的类型,全局使用u8,u32等表示的标准类型.类型严格标准化 --- diff --git a/bsp_Device/bsp_UART/mb_ModBusRTU/mbm_ModBusRTU.c b/bsp_Device/bsp_UART/mb_ModBusRTU/mbm_ModBusRTU.c index 835cdab..f67fb09 100644 --- a/bsp_Device/bsp_UART/mb_ModBusRTU/mbm_ModBusRTU.c +++ b/bsp_Device/bsp_UART/mb_ModBusRTU/mbm_ModBusRTU.c @@ -72,7 +72,7 @@ _mb_master mb_Master_create(const char* str,...){ str += (strlen(field) + 1); } // 初始化值 - result->VarBuff=(void*)malloc(128); + result->VarBuff=(void*)malloc(512); result->VarNum=0; va_end(list); diff --git a/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.c b/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.c index 2aad0a1..9e4856a 100644 --- a/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.c +++ b/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.c @@ -395,4 +395,107 @@ u8 mb_Slave_Ack(_mb_slave obj){ } return 0; } + +////////////////////////////////////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------------------------------------- +// 有人云 +u8 yr_Slave_WR_Out_COILS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u8* Data){ + u8 Byte=ceil_div(Mem,8); + u8* Buff=obj->TxBuff; + u16 crc; + // 填入顺序项 + *Buff++=ID; + *Buff++=0x45; + *Buff++=Pn8(Addr,Dat_Endian); + *Buff++=Pn8(Addr,!Dat_Endian); + *Buff++=Pn8(Mem,Dat_Endian); + *Buff++=Pn8(Mem,!Dat_Endian); + *Buff++=Byte; + u8* ByteHead=Buff; + // 数据导入 + for(u32 i=0;iTxBuff,Byte+7); + *Buff++=Pn8(crc,CRC_Endian); + *Buff++=Pn8(crc,!CRC_Endian); + // 发送值 + obj->tramsmit(obj->TxBuff,Byte+9); + return 0;} +//---------------------------------------------------------------------------------------------------- +u8 yr_Slave_WR_In_COILS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u8* Data){ + u8 Byte=ceil_div(Mem,8); + u8* Buff=obj->TxBuff; + u16 crc; + // 填入顺序项 + *Buff++=ID; + *Buff++=0x42; + *Buff++=Pn8(Addr,Dat_Endian); + *Buff++=Pn8(Addr,!Dat_Endian); + *Buff++=Pn8(Mem,Dat_Endian); + *Buff++=Pn8(Mem,!Dat_Endian); + *Buff++=Byte; + u8* ByteHead=Buff; + // 数据导入 + for(u32 i=0;iTxBuff,Byte+7); + *Buff++=Pn8(crc,CRC_Endian); + *Buff++=Pn8(crc,!CRC_Endian); + // 发送值 + obj->tramsmit(obj->TxBuff,Byte+9); + return 0;} +//---------------------------------------------------------------------------------------------------- +// 向外发送 +u8 yr_Slave_WR_Hold_REGS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u16* Data){ + u8 Byte=Mem*2; + u8* Buff=obj->TxBuff; + u16 crc; + // 填入顺序项 + *Buff++=ID; + *Buff++=0x46; + *Buff++=Pn8(Addr,Dat_Endian); + *Buff++=Pn8(Addr,!Dat_Endian); + *Buff++=Pn8(Mem,Dat_Endian); + *Buff++=Pn8(Mem,!Dat_Endian); + *Buff++=Byte; + // 数据导入 + for(u32 i=0;iTxBuff,Byte+7); + *Buff++=Pn8(crc,CRC_Endian); + *Buff++=Pn8(crc,!CRC_Endian); + // 发送值 + obj->tramsmit(obj->TxBuff,Byte+9); + return 0;} +//---------------------------------------------------------------------------------------------------- +// 向外发送 +u8 yr_Slave_WR_In_REGS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u16* Data){ + u8 Byte=Mem*2; + u8* Buff=obj->TxBuff; + u16 crc; + // 填入顺序项 + *Buff++=ID; + *Buff++=0x44; + *Buff++=Pn8(Addr,Dat_Endian); + *Buff++=Pn8(Addr,!Dat_Endian); + *Buff++=Pn8(Mem,Dat_Endian); + *Buff++=Pn8(Mem,!Dat_Endian); + *Buff++=Byte; + // 数据导入 + for(u32 i=0;iTxBuff,Byte+7); + *Buff++=Pn8(crc,CRC_Endian); + *Buff++=Pn8(crc,!CRC_Endian); + // 发送值 + obj->tramsmit(obj->TxBuff,Byte+9); + return 0;} ////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.h b/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.h index 37f519e..1f3cb34 100644 --- a/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.h +++ b/bsp_Device/bsp_UART/mb_ModBusRTU/mbs_ModBusRTU.h @@ -98,6 +98,11 @@ u8 mb_Slave_RD_IN_COIL_Ack(_mb_slave obj,u16 Mem,u8* Data); u8 mb_Slave_RD_HOLD_REG_Ack(_mb_slave obj,u8 Mem,u16* Data); u8 mb_Slave_RD_IN_REG_Ack(_mb_slave obj,u8 Mem,u16* Data); //---------------------------------------------------------------------------------------------------- +u8 yr_Slave_WR_In_REGS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u16* Data); +u8 yr_Slave_WR_Hold_REGS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u16* Data); +u8 yr_Slave_WR_In_COILS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u8* Data); +u8 yr_Slave_WR_Out_COILS_Ask(_mb_slave obj,u8 ID,u16 Addr,u16 Mem,u8* Data); +//---------------------------------------------------------------------------------------------------- #define mb_Slave_get(x,y) mb_Slave_Unpack(x,y,mb_Slave_Lencount(y)) u8 mb_Slave_Unpack(_mb_slave obj,u8* Buff,u32 len); u8 mb_Slave_Ack(_mb_slave obj);