This commit is contained in:
2026-01-22 19:24:33 +08:00
commit b94a28aacf
130 changed files with 127880 additions and 0 deletions

View File

@@ -0,0 +1,300 @@
#include "proto_modbus_lib.h"
#include "stdio.h"
#include "string.h"
#include "bsp_Uart.h"
/**************************************************
*<2A><><EFBFBD>ƣ<EFBFBD> modbus_lib_crc16
*<2A><><EFBFBD>ܣ<EFBFBD> modbus crc16У<36><D0A3>
*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p_data -- У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
* len -- <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
*<2A><><EFBFBD>أ<EFBFBD> У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**************************************************/
u16 modbus_lib_crc16(u8 *p_data, u16 len)
{
u16 crc16 = 0xffff;
u16 i;
while(len--)
{
crc16 = crc16^(*p_data++);
for(i=0; i++<8; )
{
if(crc16&0x0001)
{
crc16 = (crc16>>1)^0xa001;
}
else
{
crc16>>=1;
}
}
}
return crc16;
}
/************************************
* <20><><EFBFBD><EFBFBD>: Float2u16
* <20><><EFBFBD><EFBFBD>: <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>16<31><36><EFBFBD><EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: float_data : Ҫת<D2AA><D7AA><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
h_l : <20><><EFBFBD>ظ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
u16 float_to_u16(float float_data,unsigned char h_l)
{
u16 temp = 0XFFFF;
if(h_l == U16_DATA_L)
{
temp = *((u32 *)&float_data) & 0x0000ffff;
}
else if(h_l == U16_DATA_H)
{
temp = ((*((u32 *)&float_data)) >> 16) & 0x0000ffff;
}
return temp;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: u32TOu16
* <20><><EFBFBD><EFBFBD>: <20><>ȡu32<33>ĸ<EFBFBD>16<31><36><EFBFBD><EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: u32_data : Ҫת<D2AA><D7AA><EFBFBD><EFBFBD>u32
h_l : <20><><EFBFBD>ظ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
u16 u32_to_u16(u32 u32_data,unsigned char h_l)
{
u16 temp = 0XFFFF;
if(h_l == U16_DATA_L)
{
temp = u32_data & 0x0000ffff;
}
else if(h_l == U16_DATA_H)
{
temp = (u32_data >> 16) & 0x0000ffff;
}
return temp;
}
void u32_to_u8(u32 u32_data,u8 *p_data,u8 endian)
{
if(BIG_ENDIAN == endian)
{
for(u8 i = 0;i < 4;i++)
{
p_data[i] = (u32_data >> (8 * (3 - i))) & 0xff;
}
}
else if(LITTLE_ENDIAN == endian)
{
for(u8 i = 0;i < 4;i++)
{
p_data[i] = (u32_data >> (8 * i)) & 0xff;
}
}
}
void u16_to_u8(u16 u16_data,u8 *p_data,u8 endian)
{
if(BIG_ENDIAN == endian)
{
for(u8 i = 0;i < 2;i++)
{
p_data[i] = (u16_data >> (8 * (1 - i))) & 0xff;
}
}
else if(LITTLE_ENDIAN == endian)
{
for(u8 i = 0;i < 2;i++)
{
p_data[i] = (u16_data >> (8 * i)) & 0xff;
}
}
}
float u32_to_float(u32 u32_data,unsigned char h_l)
{
float temp = 0;
temp = *((float *)&u32_data);
return temp;
}
/*<2A><>u8_endian<61><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p_u8dataת<61><D7AA>Ϊ<EFBFBD><CEAA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
u32 u8_to_u32(u8 *p_u8data,unsigned char u8_endian)
{
u32 temp = 0;
if(BIG_ENDIAN == u8_endian)
{
for(u8 i = 0;i < 4;i++)
{
temp |= p_u8data[i] << ((3 - i) * 8);
}
}
else if(LITTLE_ENDIAN == u8_endian)
{
for(u8 i = 0;i < 4;i++)
{
temp |= p_u8data[i] << (i * 8);
}
}
return temp;
}
/*<2A><>u8_endian<61><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p_u8dataת<61><D7AA>Ϊ<EFBFBD><CEAA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
u16 u8_to_u16(u8 *p_u8data,unsigned char u8_endian)
{
u32 temp = 0;
if(BIG_ENDIAN == u8_endian)
{
for(u8 i = 0;i < 2;i++)
{
temp |= p_u8data[i] << ((1 - i) * 8);
}
}
else if(LITTLE_ENDIAN == u8_endian)
{
for(u8 i = 0;i < 2;i++)
{
temp |= p_u8data[i] << (i * 8);
}
}
return temp;
}
/*<2A>ֽڶ<D6BD><DAB6><EFBFBD>ת<EFBFBD><D7AA>*/
u32 u32_endian_conv(u32 data)
{
u32 temp = 0;
temp = (((data >> 0 ) & 0xff) << 24)
| (((data >> 8 ) & 0xff) << 16)
| (((data >> 16) & 0xff) << 8 )
| (((data >> 24) & 0xff) << 0 );
return temp;
}
/*<2A>ֽڶ<D6BD><DAB6><EFBFBD>ת<EFBFBD><D7AA>*/
u16 u16_endian_conv(u16 data)
{
u16 temp = 0;
temp = (((data >> 0) & 0xff) << 8)
| (((data >> 8) & 0xff) << 0);
return temp;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: ModbusReaddata
* <20><><EFBFBD><EFBFBD>: MODBUS<55><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: Id :MODBUS<55>ӻ<EFBFBD><D3BB><EFBFBD>ַ
* addr :д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
* Num :д<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* send :<3A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
void modbus_lib_data_read(u8 id,u16 addr,u16 num,void (*send)(u8 *,u16 ))
{
u8 tx[8];
u16 crc16;
tx[0] = id;
tx[1] = 0x41;//0x03;
tx[2] = (addr >> 8) & 0xff;
tx[3] = addr & 0xff;
tx[4] = (num >> 8) & 0xff;
tx[5] = num & 0xff;
crc16 = modbus_lib_crc16(tx,6);
tx[6] = crc16 & 0xff;
tx[7] = (crc16 >> 8) & 0xff;
send(tx,8);
}
/******************************************
* <20><><EFBFBD><EFBFBD>: modbus_multiple_data_write
* <20><><EFBFBD><EFBFBD>: MODBUSд<53><D0B4><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: Id :MODBUS<55>ӻ<EFBFBD><D3BB><EFBFBD>ַ
* addr :д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
* Num :д<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* data :д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* send :<3A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
void modbus_lib_multiple_data_write(u8 id,u16 addr,u16 Num,u16 *data,void (*send)(u8 *,u16 ))
{
u8 tx[50];
u16 crc16,i;
tx[0] = id;
tx[1] = 0x10;
tx[2] = (addr >> 8) & 0xff;
tx[3] = addr & 0xff;
tx[4] = (Num >> 8) & 0xff;
tx[5] = Num & 0xff;
tx[6] = Num * 2;
for(i = 0;i < tx[6]/2;i++)
{
tx[7 + 2 * i] = (data[i] >> 8) & 0xff;
tx[8 + 2 * i] = data[i] & 0xff;
}
crc16 = modbus_lib_crc16(tx,7 + 2 * i);
tx[7 + 2 * i] = crc16 & 0xff;
tx[8 + 2 * i] = (crc16 >> 8) & 0xff;
send(tx,9 + 2 * i);
}
void modbus_lib_only_data_write(u8 id,u16 addr,u16 value,void (*send)(u8 *,u16 ))
{
u8 tx[8];
u16 crc16;
tx[0] = id;
tx[1] = 0x06;
tx[2] = (addr >> 8) & 0xff;
tx[3] = addr & 0xff;
tx[4] = (value >> 8) & 0xff;
tx[5] = value & 0xff;
crc16 = modbus_lib_crc16(tx,6);
tx[6] = crc16 & 0xff;
tx[7] = (crc16 >> 8) & 0xff;
send(tx,8);
}
//01 10 00 02 00 01 02 12 34 CRC
//id Func Startaddress RegNumber wdataaddress
u8 modbus_lib_analysis(modbus_analysis_data_t *p_modbus, u8 *p_data, u16 len)
{
u16 crc16;
u16 u16_temp;
if(NULL == p_modbus) return 0;
if(len < 8) return 0;
crc16 = modbus_lib_crc16(p_data, len-2);
u16_temp = *(p_data+len-1);
u16_temp <<= 8;
u16_temp |= *(p_data+len-2);
if(u16_temp != crc16) return 0;
p_modbus->id = *p_data;
p_modbus->func = *(p_data+1);
p_modbus->start_addr = (*(p_data+2))<<8;
p_modbus->start_addr |= *(p_data+3);
/*<2A><><EFBFBD><EFBFBD>дһ<D0B4><D2BB><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
if(0x06 == p_modbus->func)
{
p_modbus->write_data_addr = p_data+4;
}
else if(0x10 == p_modbus->func) /*д<><D0B4><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
{
p_modbus->reg_number = (*(p_data+4))<<8;
p_modbus->reg_number |= *(p_data+5);
p_modbus->write_data_addr = p_data+7;
}
else
{
p_modbus->reg_number = (*(p_data+4))<<8;
p_modbus->reg_number |= *(p_data+5);
}
return 1;
}