ZIPT5L与PC上位机modbus通信 138.35KB

nswdwy279需要积分:9(1积分=1元)

资源文件列表:

template.zip 大约有53个文件
  1. template/
  2. template/FUNC_HANDLER/
  3. template/FUNC_HANDLER/datatype/
  4. template/FUNC_HANDLER/datatype/datatype.h 541B
  5. template/FUNC_HANDLER/func_handler.c 1KB
  6. template/FUNC_HANDLER/func_handler.h 163B
  7. template/GUI_APP/
  8. template/GUI_APP/start_win.c 5.65KB
  9. template/GUI_APP/start_win.h 447B
  10. template/HARDWARE/
  11. template/HARDWARE/MODBUS/
  12. template/HARDWARE/MODBUS/crc16.c 3.57KB
  13. template/HARDWARE/MODBUS/crc16.h 122B
  14. template/HARDWARE/MODBUS/modbus.c 2.88KB
  15. template/HARDWARE/MODBUS/modbus.h 2.79KB
  16. template/HARDWARE/UART2/
  17. template/HARDWARE/UART2/uart2.c 1.36KB
  18. template/HARDWARE/UART2/uart2.h 273B
  19. template/OBJ/
  20. template/OBJ/crc16.lst 6.39KB
  21. template/OBJ/crc16.obj 6.66KB
  22. template/OBJ/func_handler.lst 3.28KB
  23. template/OBJ/func_handler.obj 7.85KB
  24. template/OBJ/main.lst 1.68KB
  25. template/OBJ/main.obj 8.8KB
  26. template/OBJ/modbus.lst 6.59KB
  27. template/OBJ/modbus.obj 16.65KB
  28. template/OBJ/STARTUP_M5.lst 15.38KB
  29. template/OBJ/STARTUP_M5.obj 1012B
  30. template/OBJ/start_win.lst 11.1KB
  31. template/OBJ/start_win.obj 23.08KB
  32. template/OBJ/sys.lst 8.06KB
  33. template/OBJ/sys.obj 18.14KB
  34. template/OBJ/T5L51.bin 6.15KB
  35. template/OBJ/template 86.35KB
  36. template/OBJ/template.build_log.htm 1.29KB
  37. template/OBJ/template.hex 16.2KB
  38. template/OBJ/template.lnp 316B
  39. template/OBJ/template.map 97.55KB
  40. template/OBJ/template.SBR 49.8KB
  41. template/OBJ/uart2.lst 4.26KB
  42. template/OBJ/uart2.obj 12.67KB
  43. template/USER/
  44. template/USER/main.c 312B
  45. template/USER/STARTUP_M5.A51 6.62KB
  46. template/USER/sys.c 2.94KB
  47. template/USER/sys.h 788B
  48. template/USER/T5LOS8051.h 3.96KB
  49. template/USER/template.uvgui.35553 89.5KB
  50. template/USER/template.uvgui.Administrator 68.18KB
  51. template/USER/template.uvgui.fish 82.43KB
  52. template/USER/template.uvopt 8.15KB
  53. 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_VP 0x2000 //寄存器数组 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跳过none modbus_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; // 功能码,0x06 response06.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); } }
100+评论
captcha
    类型标题大小时间
    ZIP国外17家股票数据,包含特斯拉股票,可供股票预测模型68.37KB4月前
    ZIPDSP283系列SCI通信+Printf函数(寄存器操作,亲测可用,0积分)859.69KB4月前
    ZIPJava课程的项目作业mini-project3.71MB4月前
    ZIP单相桥式全控整流电路带电阻负载simulink仿真258.1KB4月前
    ZIP小汪音乐无损下载器!!!!!!!!!!!!!!4.51MB4月前
    ZIP46号计算机3班陈创新2408090109546.docx.zip18.36MB4月前
    ZIPtcp_wrappers-devel-7.6-77.el7.x86_64.rpm.zip336B4月前
    ZIPtcpdump-4.9.2-4.el7_7.1.x86_64.rpm.zip329B4月前