更新了ModBus库

This commit is contained in:
2023-12-20 22:24:11 +08:00
parent a9be43d98e
commit 8bfef9f889
4 changed files with 115 additions and 7 deletions

View File

@@ -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等表示的标准类型.类型严格标准化
---

View File

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

View File

@@ -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;i<Mem;i++){
if(i%8==0)Buff++;
MODBUS_SET_BIT(ByteHead,i,Data[i]);}
// 计算CRC
crc=mb_crc(obj->TxBuff,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;i<Mem;i++){
if(i%8==0)Buff++;
MODBUS_SET_BIT(ByteHead,i,Data[i]);}
// 计算CRC
crc=mb_crc(obj->TxBuff,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;i<Mem;i++){
*Buff++=Pn8(Data[i],Dat_Endian);
*Buff++=Pn8(Data[i],!Dat_Endian);}
// 计算CRC
crc=mb_crc(obj->TxBuff,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;i<Mem;i++){
*Buff++=Pn8(Data[i],Dat_Endian);
*Buff++=Pn8(Data[i],!Dat_Endian);}
// 计算CRC
crc=mb_crc(obj->TxBuff,Byte+7);
*Buff++=Pn8(crc,CRC_Endian);
*Buff++=Pn8(crc,!CRC_Endian);
// 发送值
obj->tramsmit(obj->TxBuff,Byte+9);
return 0;}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

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