#include"include/main.h"
#include"include/uart.h"
#include"include/modbus.h"
code U8 auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字节值表*/
code U8 auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};
#define LACAL_ADRR 0x01
extern UART_TRAN uart_tran_data;
extern UART_RECV uart_recv_data;
U8 Coil_Status_TBL[5] = {0x55,0x55,0x55,0x55,0x55}; //40个线圈 ,分为5组
U8 Switch_Status_TBL[5] = {0x00,0x00,0x00,0x00,0x00};//40个离散开关,分为5组
U8 Coil_Output_TBL[5] = {0x00,0x00,0x00,0x00,0x00};
U16 Crc16(U8 *buf, U16 DataLen)
{
U8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
U8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
U16 uIndex ; /* CRC循环中的索引 */
while (DataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *buf++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
bit frame_Parse()
{
CHAR_CONVERT Crc;
U8 Lacal_Adrr;
U8 Fun_Code;
Crc.item = Make_word(uart_recv_data.Recv_buffer[uart_recv_data.In_waiting_index_G-2],\
uart_recv_data.Recv_buffer[uart_recv_data.In_waiting_index_G-1]);
if(Crc.item != Crc16(uart_recv_data.Recv_buffer,uart_recv_data.In_waiting_index_G-2))
{
return FALSE;
}
Lacal_Adrr = uart_recv_data.Recv_buffer[0];
Fun_Code = uart_recv_data.Recv_buffer[1];
if(Lacal_Adrr != LACAL_ADRR&&Lacal_Adrr!=0)
{
return FALSE;
}
if(Lacal_Adrr == LACAL_ADRR)
{
Write_Char_To_Buffer(LACAL_ADRR);
switch(Fun_Code)
{
case 1:
{
Read_coil_status();
}
break;
case 2:
{
Read_switch_status();
}
break;
case 3:
{
Read_hold_register();
}
break;
case 4:
{
Read_input_register();
}
break;
case 5:
{
force_set_coil();
}
break;
case 6:
{
pre_single_register();
}
break;
case 15:
{
Set_multi_coils();
}
break;
case 16:
{
Pre_set_multi_register();
}
break;
default:
break;
}
}
}
U16 Make_word(U8 a,U8 b)
{
CHAR_CONVERT temp;
temp.convert.high=a;
temp.convert.low=b;
return (temp.item);
}
////////////////////////////////////////////////////////////////////////////////////
void read_coil_status_value()
{
U8 value;
P2 = 0xff;
value = P2;
Coil_Status_TBL[0] = value;
}
void Read_coil_status()
{
U16 address;
U8 count;
U8 coil_status;
U16 temp_crc;
U8 i;
Write_Char_To_Buffer(uart_recv_data.Recv_buffer[1]);
address = (uart_recv_data.Recv_buffer[2]<<8)+uart_recv_data.Recv_buffer[3];
count = (uart_recv_data.Recv_buffer[4]<<8)+uart_recv_data.Recv_buffer[5];
if(count%8 != 0)
{
count = count/8 + 1;
}
else
{
count = count/8;
}
Write_Char_To_Buffer(count);
read_coil_status_value();
for(i = 0;i < count; i++)
{
coil_status = Coil_Status_TBL[address + i];
Write_Char_To_Buffer(coil_status);
}
temp_crc = Crc16(uart_tran_data.Tran_buffer,uart_tran_data.Out_waiting_index_G);
Write_Char_To_Buffer((U8)(temp_crc>>8));
Write_Char_To_Buffer((U8)(temp_crc));
}
/////////////////////////////////////////////////////////////////////////////////
void read_switch_status_value()
{
U8 value;
P2 = 0xff;
value = P1;
Switch_Status_TBL[0] = value;
}
void Read_switch_status()
{
U16 address;
U8 count;
U8 switch_status;
U16 temp_crc;
U8 i;
Write_Char_To_Buffer(uart_recv_data.Recv_buffer[1]);
address = (uart_recv_data.Recv_buffer[2]<<8)+uart_recv_data.Recv_buffer[3];
count = (uart_recv_data.Recv_buffer[4]<<8)+uart_recv_data.Recv_buffer[5];
if(count%8 != 0)
{
count = count/8 + 1;
}
else
{
count = count/8;
}
Write_Char_To_Buffer(count);
read_switch_status_value();
for(i = 0;i < count; i++)
{
switch_status = Switch_Status_TBL[address + i];
Write_Char_To_Buffer(switch_status);
}
temp_crc = Crc16(uart_tran_data.Tran_buffer,uart_tran_data.Out_waiting_index_G);
Write_Char_To_Buffer((U8)(temp_crc>>8));
Write_Char_To_Buffer((U8)(temp_crc));
}
//////////////////////////////////////////////////////////////////////////////////////
void Read_hold_register()
{
}
//////////////////////////////////////////////////////////////////////////////////////
void Read_input_register()
{
}
//////////////////////////////////////////////////////////////////////////////////////
void force_set_coil()
{
}
//////////////////////////////////////////////////////////////////////////////////////
void pre_single_register()
{
}
//////////////////////////////////////////////////////////////////////////////////////
void Set_coil_output_value()
{
//根据具体应用添加代码
P0 = Coil_Output_TBL[0];
}
MODBUS (51实现) +proteus仿真+modbus调试工具
4星 · 超过85%的资源 需积分: 47 175 浏览量
2009-12-22
22:01:28
上传
评论 18
收藏 1.87MB RAR 举报
songshu_sky
- 粉丝: 43
- 资源: 2
最新资源
- 基于yolov5识别算法实现的DNF自动脚本源码.zip
- 基于Python实现的自动化办公项目.zip
- 基于python实现的基于PyQt5和爬虫的小说阅读系统.zip
- 机械设计整经机上纱自动化sw20非常好的设计图纸100%好用.zip
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页