在AVP28335(兼容德州仪器TMS320-28335) 上实现ModbusSlaveRTU-485源码及注释。

希望能给感兴趣的小伙伴以帮助。(这个程序是根据优快云中小伙伴的程序修改,在原来文件中发现很多坑 ,现在发现最主要的几个坑如下。

坑1:传输数据只能传输200个无符号<200的无符号整数;

坑2:3,4区数据寄存器只能放置<=400(dec)的数据,不能传输最大数为65535(dec);

坑3:传输数据时,Master一般要求加CRC16校验码的2个字节,原来源代码中故意少发两个字节,导致测试软件接收不到。

坑4:没有针对IEEE754 32位 浮点数表式方法的处理。

为了不让后面的小伙伴在这里在花费时间研究,我把已知的坑给填了,并源码放在这里。

呵呵,先给出2个截图,用来吹嘘一下这个程序真的可以用。

第一部分:截图看结果,真的可以用。

1、输入寄存器截图

2、保持寄存器截图

先给出两张图 每张图左边图是 AVP28335 系统的Slave 端数据,右边是Modscan32测试软件数据。 

第一张图是3区输入寄存器数据;第二张图是4区 保持寄存器数据。

地址:=1 显示数据 长度 100

下面将给出部署方法,有点困了,明天再说吧。:)

第二部分、此程序部署前提条件:

1、使用芯片德州仪器或湖南进芯28335的SCIC-串口;(SCIA SCIB 基本相同)

2、使用了收发控制管脚 GPIO61;(其实不使用更好处理)

3、外围电路采用 Max485芯片;(电气原理图省略,典型应用图纸图纸,算了,还是给一张图吧)

4、编译环境CCS15 芯片28335 编译器6.0.1

第三部分、编程,主要文件及部署方法:

1、创建头文件,该文件是Modbus 485 Slave 数据结构体文件:

文件名:MODBUS.h

文件内容:


#ifndef INCLUDE_MODBUS_H_
#define INCLUDE_MODBUS_H_

//SCIC-MODBUS 485 应用数据结构体

//MODBUS数据结构
typedef enum {
    MB_FUNC_READ_COIL = 1,
    MB_FUNC_READ_INPUT,
    MB_FUNC_READ_HOLDINGREGISTERS,
    MB_FUNC_READ_INPUTREGISTERS,
    MB_FUNC_FORCE_COIL,
    MB_FUNC_WRITE_HOLDINGREGISTER,
    MB_FUNC_FORCE_NCOILS = 15,
    MB_FUNC_WRITE_NREGISTERS = 16
} ModbusFunctionCode;

//MODBUS错误数据结构
typedef enum {
    MB_ERROR_ILLEGALFUNC = 1,
    MB_ERROR_ILLEGALADDR,
    MB_ERROR_ILLEGALDATA,
    MB_ERROR_SLVFAILURE,
    MB_ERROR_ACKNOWLEDGE,
    MB_ERROR_SLVBUSY,
    MB_ERROR_NEGACKNOWLEDGE,
    MB_ERROR_MEMPARITY,
    MB_ERROR_GATEWAYPATHUN
} ModbusError;

//状态机常数
typedef enum {
    MB_CREATE,
    MB_START,
    MB_TIMER_T35_WAIT,
    MB_IDLE,
    MB_RECEIVE,
    MB_PROCESS,
    MB_TRANSMIT,
    MB_DESTROY
} ModbusState;

//MODBUS数据结构
typedef struct ModbusData ModbusData;
struct ModbusData {
    Uint16 slaveAddress;
    Uint16 functionCode;
    Uint32 contentIdx;
    Uint32 numofregisters;
    Uint16 content[125];//20
    Uint16 size;
    Uint16 crc;
};

//P3方式互联网找的程序(modbus.c)
extern void SCIC_Modbus_Init(void);

//CoilsMap 数据结构
typedef struct ModbusCoilsMap ModbusCoilsMap;
struct ModbusCoilsMap{
    Uint16   dummy1;
//    Uint16   dummy2;
//    Uint16   dummy3;
//    Uint16   dummy4;
//    Uint16   dummy5;
//    Uint16   dummy6;
//    Uint16   dummy7;
//    Uint16   dummy8;
//    Uint16   dummy9;
//    Uint16   dummy10;
//    Uint16   dummy11;
//    Uint16   dummy12;
//    Uint16   dummy13;
//    Uint16   dummy14;
//    Uint16   dummy15;
//    Uint16   dummy16;
//    Uint16   dummy17;
//    Uint16   dummy18;
//    Uint16   dummy19;
//    Uint16   dummy20;
//    Uint16   dummy21;
//    Uint16   dummy22;
//    Uint16   dummy23;
//    Uint16   dummy24;
//    Uint16   dummy25;
//    Uint16   dummy26;
//    Uint16   dummy27;
//    Uint16   dummy28;
//    Uint16   dummy29;
//    Uint16   dummy30;
//    Uint16   dummy31;
//    Uint16   dummy32;
//    Uint16   dummy33;
//    Uint16   dummy34;
//    Uint16   dummy35;
//    Uint16   dummy36;
//    Uint16   dummy37;
//    Uint16   dummy38;
//    Uint16   dummy39;
//    Uint16   dummy40;
//    Uint16   dummy41;
//    Uint16   dummy42;
//    Uint16   dummy43;
//    Uint16   dummy44;
//    Uint16   dummy45;
//    Uint16   dummy46;
//    Uint16   dummy47;
//    Uint16   dummy48;
//    Uint16   dummy49;
//    Uint16   dummy50;
//    Uint16   dummy51;
//    Uint16   dummy52;
//    Uint16   dummy53;
//    Uint16   dummy54;
//    Uint16   dummy55;
//    Uint16   dummy56;
//    Uint16   dummy57;
//    Uint16   dummy58;
//    Uint16   dummy59;
//    Uint16   dummy60;
//    Uint16   dummy61;
//    Uint16   dummy62;
//    Uint16   dummy63;
//    Uint16   dummy64;
//    Uint16   dummy65;
//    Uint16   dummy66;
//    Uint16   dummy67;
//    Uint16   dummy68;
//    Uint16   dummy69;
//    Uint16   dummy70;
//    Uint16   dummy71;
//    Uint16   dummy72;
//    Uint16   dummy73;
//    Uint16   dummy74;
//    Uint16   dummy75;
//    Uint16   dummy76;
//    Uint16   dummy77;
//    Uint16   dummy78;
//    Uint16   dummy79;
//    Uint16   dummy80;
//    Uint16   dummy81;
//    Uint16   dummy82;
//    Uint16   dummy83;
//    Uint16   dummy84;
//    Uint16   dummy85;
//    Uint16   dummy86;
//    Uint16   dummy87;
//    Uint16   dummy88;
//    Uint16   dummy89;
//    Uint16   dummy90;
//    Uint16   dummy91;
//    Uint16   dummy92;
//    Uint16   dummy93;
//    Uint16   dummy94;
//    Uint16   dummy95;
//    Uint16   dummy96;
//    Uint16   dummy97;
//    Uint16   dummy98;
//    Uint16   dummy99;
//    Uint16   dummy100;
};

//InputsMap 数据结构
typedef struct ModbusInputsMap ModbusInputsMap;
struct ModbusInputsMap{
    Uint16     dummy1;
//    Uint16     dummy2;
//    Uint16     dummy3;
//    Uint16     dummy4;
//    Uint16     dummy5;
//    Uint16     dummy6;
//    Uint16     dummy7;
//    Uint16     dummy8;
//    Uint16     dummy9;
//    Uint16     dummy10;
//    Uint16     dummy11;
//    Uint16     dummy12;
//    Uint16     dummy13;
//    Uint16     dummy14;
//    Uint16     dummy15;
//    Uint16     dummy16;
//    Uint16     dummy17;
//    Uint16     dummy18;
//    Uint16     dummy19;
//    Uint16     dummy20;
//    Uint16     dummy21;
//    Uint16     dummy22;
//    Uint16     dummy23;
//    Uint16     dummy24;
//    Uint16     dummy25;
//    Uint16     dummy26;
//    Uint16     dummy27;
//    Uint16     dummy28;
//    Uint16     dummy29;
//    Uint16     dummy30;
//    Uint16     dummy31;
//    Uint16     dummy32;
//    Uint16     dummy33;
//    Uint16     dummy34;
//    Uint16     dummy35;
//    Uint16     dummy36;
//    Uint16     dummy37;
//    Uint16     dummy38;
//    Uint16     dummy39;
//    Uint16     dummy40;
//    Uint16     dummy41;
//    Uint16     dummy42;
//    Uint16     dummy43;
//    Uint16     dummy44;
//    Uint16     dummy45;
//    Uint16     dummy46;
//    Uint16     dummy47;
//    Uint16     dummy48;
//    Uint16     dummy49;
//    Uint16     dummy50;
//    Uint16     dummy51;
//    Uint16     dummy52;
//    Uint16     dummy53;
//    Uint16     dummy54;
//    Uint16     dummy55;
//    Uint16     dummy56;
//    Uint16     dummy57;
//    Uint16     dummy58;
//    Uint16     dummy59;
//    Uint16     dummy60;
//    Uint16     dummy61;
//    Uint16     dummy62;
//    Uint16     dummy63;
//    Uint16     dummy64;
//    Uint16     dummy65;
//    Uint16     dummy66;
//    Uint16     dummy67;
//    Uint16     dummy68;
//    Uint16     dummy69;
//    Uint16     dummy70;
//    Uint16     dummy71;
//    Uint16     dummy72;
//    Uint16     dummy73;
//    Uint16     dummy74;
//    Uint16     dummy75;
//    Uint16     dummy76;
//    Uint16     dummy77;
//    Uint16     dummy78;
//    Uint16     dummy79;
//    Uint16     dummy80;
//    Uint16     dummy81;
//    Uint16     dummy82;
//    Uint16     dummy83;
//    Uint16     dummy84;
//    Uint16     dummy85;
//    Uint16     dummy86;
//    Uint16     dummy87;
//    Uint16     dummy88;
//    Uint16     dummy89;
//    Uint16     dummy90;
//    Uint16     dummy91;
//    Uint16     dummy92;
//    Uint16     dummy93;
//    Uint16     dummy94;
//    Uint16     dummy95;
//    Uint16     dummy96;
//    Uint16     dummy97;
//    Uint16     dummy98;
//    Uint16     dummy99;
//    Uint16     dummy100;
};

//HoldingRegistersMap数据结构
typedef struct ModbusHoldingRegistersMap ModbusHoldingRegistersMap;
struct ModbusHoldingRegistersMap {
    Uint16  dummy1;
    Uint16  dummy2;
    Uint16  dummy3;
    Uint16  dummy4;
    Uint16  dummy5;
    Uint16  dummy6;
    Uint16  dummy7;
    Uint16  dummy8;
    Uint16  dummy9;
    Uint16  dummy10;
    Uint16  dummy11;
    Uint16  dummy12;
    Uint16  dummy13;
    Uint16  dummy14;
    Uint16  dummy15;
    Uint16  dummy16;
    Uint16  dummy17;
    Uint16  dummy18;
    Uint16  dummy19;
    Uint16  dummy20;
    Uint16  dummy21;
    Uint16  dummy22;
    Uint16  dummy23;
    Uint16  dummy24;
    Uint16  dummy25;
    Uint16  dummy26;
    Uint16  dummy27;
    Uint16  dummy28;
    Uint16  dummy29;
    Uint16  dummy30;
    Uint16  dummy31;
    Uint16  dummy32;
    Uint16  dummy33;
    Uint16  dummy34;
    Uint16  dummy35;
    Uint16  dummy36;
    Uint16  dummy37;
    Uint16  dummy38;
    Uint16  dummy39;
    Uint16  dummy40;
    Uint16  dummy41;
    Uint16  dummy42;
    Uint16  dummy43;
    Uint16  dummy44;
    Uint16  dummy45;
    Uint16  dummy46;
    Uint16  dummy47;
    Uint16  dummy48;
    Uint16  dummy49;
    Uint16  dummy50;
//    Uint16  dummy51;
//    Uint16  dummy52;
//    Uint16  dummy53;
//    Uint16  dummy54;
//    Uint16  dummy55;
//    Uint16  dummy56;
//    Uint16  dummy57;
//    Uint16  dummy58;
//    Uint16  dummy59;
//    Uint16  dummy60;
//    Uint16  dummy61;
//    Uint16  dummy62;
//    Uint16  dummy63;
//    Uint16  dummy64;
//    Uint16  dummy65;
//    Uint16  dummy66;
//    Uint16  dummy67;
//    Uint16  dummy68;
//    Uint16  dummy69;
//    Uint16  dummy70;
//    Uint16  dummy71;
//    Uint16  dummy72;
//    Uint16  dummy73;
//    Uint16  dummy74;
//    Uint16  dummy75;
//    Uint16  dummy76;
//    Uint16  dummy77;
//    Uint16  dummy78;
//    Uint16  dummy79;
//    Uint16  dummy80;
//    Uint16  dummy81;
//    Uint16  dummy82;
//    Uint16  dummy83;
//    Uint16  dummy84;
//    Uint16  dummy85;
//    Uint16  dummy86;
//    Uint16  dummy87;
//    Uint16  dummy88;
//    Uint16  dummy89;
//    Uint16  dummy90;
//    Uint16  dummy91;
//    Uint16  dummy92;
//    Uint16  dummy93;
//    Uint16  dummy94;
//    Uint16  dummy95;
//    Uint16  dummy96;
//    Uint16  dummy97;
//    Uint16  dummy98;
//    Uint16  dummy99;
//    Uint16  dummy100;
};

//InputRegistersMap数据结构
typedef struct ModbusInputRegistersMap ModbusInputRegistersMap;
struct ModbusInputRegistersMap {
    Uint16  dummy1;
    Uint16  dummy2;
    Uint16  dummy3;
    Uint16  dummy4;
    Uint16  dummy5;
    Uint16  dummy6;
    Uint16  dummy7;
    Uint16  dummy8;
    Uint16  dummy9;
    Uint16  dummy10;
    Uint16  dummy11;
    Uint16  dummy12;
    Uint16  dummy13;
    Uint16  dummy14;
    Uint16  dummy15;
    Uint16  dummy16;
    Uint16  dummy17;
    Uint16  dummy18;
    Uint16  dummy19;
    Uint16  dummy20;
    Uint16  dummy21;
    Uint16  dummy22;
    Uint16  dummy23;
    Uint16  dummy24;
    Uint16  dummy25;
    Uint16  dummy26;
    Uint16  dummy27;
    Uint16  dummy28;
    Uint16  dummy29;
    Uint16  dummy30;
    Uint16  dummy31;
    Uint16  dummy32;
    Uint16  dummy33;
    Uint16  dummy34;
    Uint16  dummy35;
    Uint16  dummy36;
    Uint16  dummy37;
    Uint16  dummy38;
    Uint16  dummy39;
    Uint16  dummy40;
    Uint16  dummy41;
    Uint16  dummy42;
    Uint16  dummy43;
    Uint16  dummy44;
    Uint16  dummy45;
    Uint16  dummy46;
    Uint16  dummy47;
    Uint16  dummy48;
    Uint16  dummy49;
    Uint16  dummy50;
    Uint16  dummy51;
    Uint16  dummy52;
    Uint16  dummy53;
    Uint16  dummy54;
    Uint16  dummy55;
    Uint16  dummy56;
    Uint16  dummy57;
    Uint16  dummy58;
    Uint16  dummy59;
    Uint16  dummy60;
    Uint16  dummy61;
    Uint16  dummy62;
    Uint16  dummy63;
    Uint16  dummy64;
    Uint16  dummy65;
    Uint16  dummy66;
    Uint16  dummy67;
    Uint16  dummy68;
    Uint16  dummy69;
    Uint16  dummy70;
    Uint16  dummy71;
    Uint16  dummy72;
    Uint16  dummy73;
    Uint16  dummy74;
    Uint16  dummy75;
    Uint16  dummy76;
    Uint16  dummy77;
    Uint16  dummy78;
    Uint16  dummy79;
    Uint16  dummy80;
    Uint16  dummy81;
    Uint16  dummy82;
    Uint16  dummy83;
    Uint16  dummy84;
    Uint16  dummy85;
    Uint16  dummy86;
    Uint16  dummy87;
    Uint16  dummy88;
    Uint16  dummy89;
    Uint16  dummy90;
    Uint16  dummy91;
    Uint16  dummy92;
    Uint16  dummy93;
    Uint16  dummy94;
    Uint16  dummy95;
    Uint16  dummy96;
    Uint16  dummy97;
    Uint16  dummy98;
    Uint16  dummy99;
    Uint16  dummy100;
    Uint16  dummy101;
    Uint16  dummy102;
    Uint16  dummy103;
    Uint16  dummy104;
    Uint16  dummy105;
    Uint16  dummy106;
    Uint16  dummy107;
    Uint16  dummy108;
    Uint16  dummy109;
    Uint16  dummy110;
    Uint16  dummy111;
    Uint16  dummy112;
    Uint16  dummy113;
    Uint16  dummy114;
    Uint16  dummy115;
    Uint16  dummy116;
    Uint16  dummy117;
    Uint16  dummy118;
    Uint16  dummy119;
    Uint16  dummy120;
    Uint16  dummy121;
    Uint16  dummy122;
    Uint16  dummy123;
    Uint16  dummy124;
    Uint16  dummy125;
    Uint16  dummy126;
    Uint16  dummy127;
    Uint16  dummy128;
    Uint16  dummy129;
    Uint16  dummy130;
    Uint16  dummy131;
    Uint16  dummy132;
    Uint16  dummy133;
    Uint16  dummy134;
    Uint16  dummy135;
    Uint16  dummy136;
    Uint16  dummy137;
    Uint16  dummy138;
    Uint16  dummy139;
    Uint16  dummy140;
    Uint16  dummy141;
    Uint16  dummy142;
    Uint16  dummy143;
    Uint16  dummy144;
    Uint16  dummy145;
    Uint16  dummy146;
    Uint16  dummy147;
    Uint16  dummy148;
    Uint16  dumm1y49;
    Uint16  dummy150;
    Uint16  dummy151;
    Uint16  dummy152;
    Uint16  dummy153;
    Uint16  dummy154;
    Uint16  dummy155;
    Uint16  dummy156;
    Uint16  dummy157;
    Uint16  dummy158;
    Uint16  dummy159;
    Uint16  dummy160;
    Uint16  dummy161;
    Uint16  dummy162;
    Uint16  dummy163;
    Uint16  dummy164;
    Uint16  dummy165;
    Uint16  dummy166;
    Uint16  dummy167;
    Uint16  dummy168;
    Uint16  dummy169;
    Uint16  dummy170;
    Uint16  dummy171;
    Uint16  dummy172;
    Uint16  dummy173;
    Uint16  dummy174;
    Uint16  dummy175;
    Uint16  dummy176;
    Uint16  dummy177;
    Uint16  dummy178;
    Uint16  dummy179;
    Uint16  dummy180;
    Uint16  dummy181;
    Uint16  dummy182;
    Uint16  dummy183;
    Uint16  dummy184;
    Uint16  dummy185;
    Uint16  dummy186;
    Uint16  dummy187;
    Uint16  dummy188;
    Uint16  dummy189;
    Uint16  dummy190;
    Uint16  dummy191;
    Uint16  dummy192;
    Uint16  dummy193;
    Uint16  dummy194;
    Uint16  dummy195;
    Uint16  dummy196;
    Uint16  dummy197;
    Uint16  dummy198;
    Uint16  dummy199;
    Uint16  dummy200;
    Uint16  dummy201;
    Uint16  dummy202;
    Uint16  dummy203;
    Uint16  dummy204;
    Uint16  dummy205;
    Uint16  dummy206;
    Uint16  dummy207;
    Uint16  dummy208;
    Uint16  dummy209;
    Uint16  dummy210;
    Uint16  dummy211;
    Uint16  dummy212;
    Uint16  dummy213;
    Uint16  dummy214;
    Uint16  dummy215;
    Uint16  dummy216;
    Uint16  dummy217;
    Uint16  dummy218;
    Uint16  dummy219;
    Uint16  dummy220;
    Uint16  dummy221;
    Uint16  dummy222;
    Uint16  dummy223;
    Uint16  dummy224;
    Uint16  dummy225;
    Uint16  dummy226;
    Uint16  dummy227;
    Uint16  dummy228;
    Uint16  dummy229;
    Uint16  dummy230;
    Uint16  dummy231;
    Uint16  dummy232;
    Uint16  dummy233;
    Uint16  dummy234;
    Uint16  dummy235;
    Uint16  dummy236;
    Uint16  dummy237;
    Uint16  dummy238;
    Uint16  dummy239;
    Uint16  dummy240;
    Uint16  dummy241;
    Uint16  dummy242;
    Uint16  dummy243;
    Uint16  dummy244;
    Uint16  dummy245;
    Uint16  dummy246;
    Uint16  dummy247;
    Uint16  dummy248;
    Uint16  dummy249;
    Uint16  dummy250;
};

//MODBUS Slave数据结构
typedef struct ModbusSlaveStruc{
    ModbusState state;
    Uint16 rdata[51];       //30
    Uint16 sdata[251];      //100 //250
    Uint16 recvlen;
    Uint16 sendlen;
    ModbusCoilsMap coils,*pcoils;
    ModbusInputsMap inputs,*pinputs;
    ModbusHoldingRegistersMap holdingRegisters,*pholdingRegisters;
    ModbusInputRegistersMap inputRegisters,*pinputRegisters;
}MBSLSTRU;

#endif /* INCLUDE_MODBUS_H_ */

该文件定义了3个枚举数据,5个结构数据。 主要完成 MODBUS SLAVE 的帧结构,功能码01,02 ,03,04 数据结构,错误码帧,状态机数据结构。 一般情况创建项目后放在头文件目录中,便于引用。 

2,创建Modbus Slave RTU 源文件

MODBUS_COM.c

#include <DSP2833x_Device.h>
#include <DSP2833x_Examples.h>
#include <MODBUS.h>                                                            

//MODBUS SLAVE 数据结构体头文件
#include <string.h>                                                   //用于清零数组

extern void receieve_handler(MBSLSTRU *pModbusSlave);                 //数据接收处理
extern Uint16 CRC16 (Uint16 *nData, Uint16 wLength);                  //CRC16校验函数
extern uint32_t floatToIEEE754_H(float value);             //32位浮点数处理函数高16位
extern uint32_t floatToIEEE754_L(float value);             //32位浮点数处理函数低16位
//extern float ieee754ToFloat(uint32_t ieee);

//SCIC通信用
//#define ModbusSlaveAddress 1         //地址,本程序段用MOD_CODE替换,便于更改地址                                                     //MODBUS SLAVE RTU 地址
#define bufferdepth 0x10 //10     //20                                                  //BUFFER 发送起始深度 (0x10 = 16 字节)

//CycleQueue ScicRecvMsgQueue;
//struct ScicRecvMsgQueueStruc ScicRecvMsgBox[ScicRecvMsgLen], *pScicRecvMsgQueueStruc;

MBSLSTRU public_struc_modbus;                         //MODBUS SLAVE 数据结构体变量

U
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值