下载资源后端资源详情
template.zip
大小:138.35KB
价格:38积分
下载量:0
评分:
5.0
上传者:nswdwy279
更新日期:2025-09-22

T5L与PC上位机modbus通信

资源文件列表(大概)

文件名
大小
template/
-
template/FUNC_HANDLER/
-
template/FUNC_HANDLER/datatype/
-
template/FUNC_HANDLER/datatype/datatype.h
541B
template/FUNC_HANDLER/func_handler.c
1KB
template/FUNC_HANDLER/func_handler.h
163B
template/GUI_APP/
-
template/GUI_APP/start_win.c
5.65KB
template/GUI_APP/start_win.h
447B
template/HARDWARE/
-
template/HARDWARE/MODBUS/
-
template/HARDWARE/MODBUS/crc16.c
3.57KB
template/HARDWARE/MODBUS/crc16.h
122B
template/HARDWARE/MODBUS/modbus.c
2.88KB
template/HARDWARE/MODBUS/modbus.h
2.79KB
template/HARDWARE/UART2/
-
template/HARDWARE/UART2/uart2.c
1.36KB
template/HARDWARE/UART2/uart2.h
273B
template/OBJ/
-
template/OBJ/crc16.lst
6.39KB
template/OBJ/crc16.obj
6.66KB
template/OBJ/func_handler.lst
3.28KB
template/OBJ/func_handler.obj
7.85KB
template/OBJ/main.lst
1.68KB
template/OBJ/main.obj
8.8KB
template/OBJ/modbus.lst
6.59KB
template/OBJ/modbus.obj
16.65KB
template/OBJ/STARTUP_M5.lst
15.38KB
template/OBJ/STARTUP_M5.obj
1012B
template/OBJ/start_win.lst
11.1KB
template/OBJ/start_win.obj
23.08KB
template/OBJ/sys.lst
8.06KB
template/OBJ/sys.obj
18.14KB
template/OBJ/T5L51.bin
6.15KB
template/OBJ/template
86.35KB
template/OBJ/template.build_log.htm
1.29KB
template/OBJ/template.hex
16.2KB
template/OBJ/template.lnp
316B
template/OBJ/template.map
97.55KB
template/OBJ/template.SBR
49.8KB
template/OBJ/uart2.lst
4.26KB
template/OBJ/uart2.obj
12.67KB
template/USER/
-
template/USER/main.c
312B
template/USER/STARTUP_M5.A51
6.62KB
template/USER/sys.c
2.94KB
template/USER/sys.h
788B
template/USER/T5LOS8051.h
3.96KB
template/USER/template.uvgui.35553
89.5KB
template/USER/template.uvgui.Administrator
68.18KB
template/USER/template.uvgui.fish
82.43KB
template/USER/template.uvopt
8.15KB
template/USER/template.uvproj
15.23KB

资源内容介绍

T5L与PC上位机modbus通信
#include "start_win.h"#include "modbus.h"#include <stdio.h>#include "crc16.h"#define START_WIN_DATA_VP0x2000//寄存器数组xdata INT16U Reg[256];MODBUS_SEND_PACKET response06,packet;MODBUS_03_PACKET response03;RESPONSE_10_PACKET response10;u8 buff[100];//对接受到的modbus消息进行处理void modbus_msg_handler(u8 *msg,u16 msg_len){//我这里为了演示方便,就不做任何业务逻辑处理了,就直接把收到的msg数据包以十六进制显示在屏幕上//如果是在实际的项目中,你们需要根据你们的项目要求,在这里写相应的业务层代码//u8 slave_addr = msg[0];//第一个字节为从机地址//u8 func_code = msg[1];//第二个字节为功能码//至于msg后面的字节内容应该根据func_code功能码来判断u16 i;u16 len = 0;for(i=0;i<msg_len;i++){len += sprintf(buff+len,"%02X ",(u16)msg[i]);}buff[len+1] = 0;sys_write_vp(START_WIN_DATA_VP,buff,len/2+2);//显示到屏幕上Judgment_Func_Code(msg);}/***************************************函数名称:Judgment_Func_Code()函数功能:判断接收到的报文是否是给自己的,属于什么校验码入口参数:经过CRC校验成功后的缓冲数组出口参数:无****************************************/void Judgment_Func_Code(INT8U *msg){if(msg[0] == 0x01){switch(msg[1]){case 0x03: Modbus_fun3(msg); break;case 0x06:Modbud_fun6(msg); break;case 0x10:Modbud_fun10(msg); break;}}}/***************************************函数名称:Modbus_fun3()函数功能:功能码03的执行函数,读一个或多个保持寄存器入口参数:经过CRC校验成功后的缓冲数组出口参数:无****************************************/void Modbus_fun3(INT8U *msg) // 3号功能码处理 ---主机要读取本从机的寄存器{INT16U count; INT16U Regadd; INT16U Reglen; INT16U byte; INT16U i; Regadd = msg[2]*256 + msg[3]; // 得到要读取的寄存器的首地址 Reglen = msg[4]*256 + msg[5]; // 得到要读取的寄存器的数量 // 填充从机地址、功能码、返回数据的字节数 response03.slave_addr = 0x01; // 本设备地址 response03.func_code = MODBUS_FUNC_CODE_03; // 功能码,0x03 表示读取保持寄存器byte = Reglen * 2; // 每个寄存器占 2 字节,返回的字节数 = 寄存器数量 * 2 response03.datas_count = byte; // 返回的字节数//将读到的寄存器值保存到data数组中 for (i = 0; i < Reglen; i++) {response03.datas[i] = Get_Reg(Regadd + i); }// 计算并添加 CRC 校验码 count = 3 + byte;//将校验码加在数据数组最后 response03.datas[i] = crc16(((u8*)&response03)+1, count); // 计算数据的 CRC 校验码 //将响应报文发送,起始地址通过+1跳过nonemodbus_send_bytes(((u8*)&response03)+1,count+2);}/***************************************函数名称:Modbud_fun6()函数功能:功能码06的执行函数,写一个寄存器入口参数:经过CRC校验成功后的缓冲数组出口参数:无****************************************/void Modbud_fun6(INT8U *msg) //6号功能码处理{ INT16U Regadd;INT16U val;INT16U crc; Regadd = msg[2]*256 + msg[3]; //得到要修改的地址 val = msg[4]*256 + msg[5]; //修改后的值//测试Set_Reg(Regadd,val);//以下为回应主机if(Get_Reg(Regadd) == val){// 填充从机地址和功能码response06.slave_addr = 0x01; // 本设备地址response06.func_code = MODBUS_FUNC_CODE_06; // 功能码,0x06response06.start_addr = Regadd; //寄存器地址response06.data_len = val; //修改的值,虽然名为data_len,但用来保存寄存器值也可以// 计算并添加 CRC 校验码crc = crc16((u8*)&response06, 6); // 计算数据的 CRC 校验码response06.crc = crc; // 设置 CRC 校验码modbus_send_bytes((u8*)&response06,8);}}/***************************************函数名称:Modbud_fun10()函数功能:功能码10的执行函数,写多个寄存器入口参数:经过CRC校验成功后的缓冲数组出口参数:无****************************************/void Modbud_fun10(INT8U *msg){INT16U Regadd;INT16U Reglen;INT16U val;INT8U i,j;Regadd = msg[2]*256 + msg[3]; //得到要修改的开始地址 Reglen = msg[4]*256 + msg[5]; //要修改的寄存器个数//将数据写入for(i = 0, j = 0; i < Reglen; i++, j++){val = msg[7+i+j]*256 + msg[8+i+j];Set_Reg(Regadd+i,val);}//填充响应报文response10.slave_addr = 0x01;response10.func_code = MODBUS_FUNC_CODE_10;response10.start_addr = Regadd;response10.byte_num = Reglen;//前面有6字节数据response10.crc = crc16((u8*)&response10, 6);//发送响应报文,加上CRC校验2字节数据modbus_send_bytes((u8*)&response10,8);}/***************************************函数名称:Init_Reg()函数功能:对寄存器数组初始化入口参数:无出口参数:无****************************************/void Init_Reg(void){Set_Reg(0x0000,0x1234);Set_Reg(0x0001,0x1234);Set_Reg(0x0002,0x1234);Set_Reg(0x0003,0x1234);Set_Reg(0x0004,0x1234);Set_Reg(0x0005,0x1234);}/***************************************函数名称:Set_Reg()函数功能:接口函数,写寄存器数组入口参数:寄存器地址,要写入寄存器的值出口参数:无****************************************/void Set_Reg(INT16U addr,INT16U value){Reg[addr] = value;}/***************************************函数名称:Get_Reg()函数功能:接口函数,读寄存器数组入口参数:被读寄存器的地址出口参数:被读寄存器的值****************************************/INT16U Get_Reg(INT16U addr){return Reg[addr];}void start_win_btn_click_handler(u16 btn_val){if(btn_val==0x01){//发送一个0x03功能码的数据包给0x01地址的从机packet.slave_addr = 0x01;//从机地址packet.func_code = MODBUS_FUNC_CODE_03;//代表读寄存器packet.start_addr = 0x0005;//从这个起始地址开始读packet.data_len = 0x0003;//要读3个寄存器modbus_send_packet((u8*)&packet);}}

用户评论 (0)

发表评论

captcha

相关资源

国外17家股票数据,包含特斯拉股票,可供股票预测模型

国外17家股票数据,包含特斯拉股票,可供股票预测模型

68.37KB10积分

DSP283系列SCI通信+Printf函数(寄存器操作,亲测可用,0积分)

DSP283系列SCI通信+Printf函数(寄存器操作,亲测可用,0积分)

859.69KB26积分

Java课程的项目作业mini-project

Course code: EBU4201 Java Programming打开游戏后,你可以看到两组兔子图像,它们之间有一个加号,三个输入字段和一个复选按钮。每组兔子图像的数量是不同的,随机数字从1到10。 其次,需要计算两部分中兔子图像的数量,分别输入到输入字段,然后计算求和,将结果输入到结果字段。 将数字输入到字段中,在输入完成后,点击“检查”按钮,你就会得到“检查”的反馈。如果所有三个输入值都正确,进行提示,为两个操作数的变化显示的兔子图像的数量和三个文本文件。如果输入的输入值不正确,进行提示,显示的Rabbit图像的数量不会改变,文本字段也不会改变。除非您修改原始错误的值并输入正确的值,否则您将不会得到下一个随机数的兔子图像。最后,当您想要关闭程序时,单击右上角的关闭按钮,您将成功退出。

3.71MB41积分

单相桥式全控整流电路带电阻负载simulink仿真

输入电压峰值为22V,负载电阻为2欧姆。触发角包括30度,60度,90度。simulink最低2018a版本,最高2024a版本

258.1KB43积分