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

最低0.47元/天 解锁文章
3269

被折叠的 条评论
为什么被折叠?



