在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 数据结构体变量

Uint16 *pcoils_sub;
Uint16 *pinputs_sub;
Uint16 *pholdingRegisters_sub;
Uint16 *pinputRegisters_sub;

__interrupt void SCICTX_MODBUS_ISR(void)     //发送中断(不考虑校验,校验字节已经被计算)
{
    Uint16 i, Temp;

    if((public_struc_modbus.sendlen&0xff)>bufferdepth)           //判断发送字节长度>
    {
        Temp = bufferdepth;                //发送字节长度 本程序 0-16 0x00-0x10
        ScicRegs.SCIFFTX.bit.TXFFIENA = 1; //FIFO 发送中断使能
        ScicRegs.SCIFFTX.bit.TXFFIL = 0;   //发送中断级别=0
//        ScicRegs.SCIFFTX.bit.TXFFST = 0; //FIFO状态
//        SCIC_TX_485;                     //允许发送标志(硬件接口 GPIO61 拉低)
        for(i=0; i< Temp+2; i++)
        {
//            ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)];     //发送缓存区数据
            scic_xmit(public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]);                //发送缓存区数据
//            scic_xmit(public_struc_modbus.sdata[i]);                //发送缓存区数据
        }
//        SCIC_RX_485;                   //发送完毕后允许接收(硬件接口 GPIO61 拉高)
        DELAY_US(20000);       //25000   //发送完0.02秒后接收 20000 原 10000
        public_struc_modbus.sendlen = public_struc_modbus.sendlen - bufferdepth + 0x1000;                       //?
    }
    else                                                     //判断发送字节长度<
    {
        Temp = (public_struc_modbus.sendlen&0xff);
        if((public_struc_modbus.sendlen&0xff)>0)
        {
            ScicRegs.SCIFFTX.bit.TXFFIENA = 1;               //FIFO 发送中断使能
            ScicRegs.SCIFFTX.bit.TXFFIL = 0;                 //发送中断级别=0
//            ScicRegs.SCIFFTX.bit.TXFFST = 0;                                      //FIFO状态
//            SCIC_TX_485;
            for(i=0; i< Temp+2; i++)
            {
//                ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]; //发送缓存区数据
                scic_xmit(public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]);            //发送缓存区数据
//                scic_xmit(public_struc_modbus.sdata[i]);                //发送缓存区数据
            }
//            SCIC_RX_485;
            DELAY_US(20000);//25000
            public_struc_modbus.sendlen = 0;     //一帧完毕,清除发送长度
        }
        else
        {
            if(public_struc_modbus.sendlen==0)   //发送长度置 0 (无)
            {
                ScicRegs.SCIFFTX.bit.TXFFIENA = 0; //发送关闭(为接收做准备)
            }
        }
    }

    ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;   //完整一帧结束,清除发送中断标志,(为接收做准备) Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x0080;                                                 //Issue PIE ACK
//    PieCtrlRegs.PIEACK.bit.ACK8=1;
}

__interrupt void SCICRX_MODBUS_ISR(void)             //MODBUS接收中断函数
{
    Uint16 i;

    if(ScicRegs.SCIFFRX.bit.RXFFIL != 1) //接收状态字 非 1
    {
        if(public_struc_modbus.rdata[1]==0)
        {
            for(i=1;i<8;i++)
            {
                public_struc_modbus.rdata[i]=ScicRegs.SCIRXBUF.all;                                 //读数据并保存(8个字节)
            }
        }
        if((public_struc_modbus.rdata[1]==15)||(public_struc_modbus.rdata[1]==16))                  //rdata[1]=存放功能吗  15 16
        {
            if(public_struc_modbus.recvlen == 0)                                                    //长度=0
            {
                public_struc_modbus.recvlen = public_struc_modbus.rdata[6] + 9 + 0x1000;            //计算功能码 15/16 的接收长度 = rdata[6] + 9 + 0x1000
                ScicRegs.SCIFFRX.bit.RXFFIL = 8;                                                    //FIFO深度为8
                i = public_struc_modbus.recvlen&0xff - ((public_struc_modbus.recvlen>>12)*8);       //设置中断级别
                if(i>8)
                {ScicRegs.SCIFFRX.bit.RXFFIL = 8;}                                                  //FIFO深度为8,那当接收到8个Word后,即RXFFST>=RXFFIL时,就会触发接受中断
                else
                {ScicRegs.SCIFFRX.bit.RXFFIL = i;}                                                  //FIFO深度为 0-7
            }
            else                                                                                    //长度不为0
            {
                if((public_struc_modbus.recvlen>>12)<((public_struc_modbus.recvlen&0xFF)/8))
                {
                    for(i=0;i<8;i++)
                    {
                        public_struc_modbus.rdata[i+(public_struc_modbus.recvlen>>12)*8]=ScicRegs.SCIRXBUF.all;  // Read data r[0+x]-r[7+x]
                    }
                    public_struc_modbus.recvlen = public_struc_modbus.recvlen + 0x1000;
                    i = public_struc_modbus.recvlen&0xff - ((public_struc_modbus.recvlen>>12)*8);
                    if(i>8)
                    {ScicRegs.SCIFFRX.bit.RXFFIL = 8;}
                    else
                    {ScicRegs.SCIFFRX.bit.RXFFIL = i;}
                }
                else
                {
                    for(i=0;i<((public_struc_modbus.recvlen&0xFF)%8);i++)
                    {
                        public_struc_modbus.rdata[i+(public_struc_modbus.recvlen>>12)*8]=ScicRegs.SCIRXBUF.all;  // Read data
                    }
                    if((public_struc_modbus.recvlen&0xFF) <= (i+(public_struc_modbus.recvlen>>12)*8))
                    {
                        receieve_handler(&public_struc_modbus);
                        public_struc_modbus.rdata[1] = 0;
                        ScicRegs.SCIFFRX.bit.RXFFIL = 1;
                        public_struc_modbus.recvlen = 0;
                    }
                }
            }
        }
        else //如果功能码 其他
        {
            public_struc_modbus.recvlen = 8;

            if((public_struc_modbus.rdata[1]>=1)&&(public_struc_modbus.rdata[1]<=6))  //功能码 1-6
            {
                receieve_handler(&public_struc_modbus);
                public_struc_modbus.rdata[1] = 0;
                public_struc_modbus.recvlen = 0;
                ScicRegs.SCIFFRX.bit.RXFFIL = 1;
            }
            else
            {
                receieve_handler(&public_struc_modbus);
                public_struc_modbus.rdata[1] = 0;
                ScicRegs.SCIFFRX.bit.RXFFIL = 1;
            }
        }
    }
    else //接收状态字  1
    {
        public_struc_modbus.rdata[0]=ScicRegs.SCIRXBUF.all;                         //读数据
        if(public_struc_modbus.rdata[0] == MOD_CODE)                                //字节0 - 补全MODBUS RTU 地址   ModbusSlaveAddress
        {ScicRegs.SCIFFRX.bit.RXFFIL = 7;}                                          //接收状态字 置 7
        else
        {ScicRegs.SCIFFRX.bit.RXFFIL = 1;}                                          //接收状态字 置 1
    }

//    ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;                                              // FIFO 清除
    ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1;                                              // Clear Overflow flag
    ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;                                              // Clear Interrupt flag

    PieCtrlRegs.PIEACK.all|=0x0080;                                                 // Issue PIE ack
}
//#ifdef FLASH
//#pragma CODE_SECTION(SCIC_Modbus_Init,"ramfuncs")
//#endif
void SCIC_Modbus_Init(void)
{
    InitScicGpio();                                                                 //初始化收发管脚

    InitSCICDIR();                                                                  //初始化收发控制管脚

    scic_fifo_init();                                                               // Initialize the SCIC FIFO Initial send data.  After each transmission this data

    scic_echoback_init();                                                           // Initialize the SCIC echo_back

    EALLOW;
    PieVectTable.SCIRXINTC = &SCICRX_MODBUS_ISR;                                    //配置SCIC接收中断
    PieVectTable.SCITXINTC = &SCICTX_MODBUS_ISR;                                    //配置SCIC发送中断
    EDIS;

//    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;                                            //主程序中已定义 此处删除
    PieCtrlRegs.PIEIER8.bit.INTx5=1;                                                // PIE Group 8, int5
    PieCtrlRegs.PIEIER8.bit.INTx6=1;                                                // PIE Group 8, INT6

    IER|=M_INT8; // Enable CPU INT                                                  //使能SCIC GROUP 8

    public_struc_modbus.recvlen = 0;                                                //初始化接收长度
    public_struc_modbus.sendlen = 0;                                                //初始化发送长度

    Uint16 i;

    public_struc_modbus.pcoils = &public_struc_modbus.coils;
    public_struc_modbus.pinputs = &public_struc_modbus.inputs;
    public_struc_modbus.pholdingRegisters = &public_struc_modbus.holdingRegisters;
    public_struc_modbus.pinputRegisters = &public_struc_modbus.inputRegisters;

    pcoils_sub =(Uint16 *) public_struc_modbus.pcoils;
    pinputs_sub =(Uint16 *) public_struc_modbus.pinputs;
    pholdingRegisters_sub =(Uint16 *) public_struc_modbus.pholdingRegisters;
    pinputRegisters_sub =(Uint16 *) public_struc_modbus.pinputRegisters;

    for(i=0;i<sizeof(public_struc_modbus.coils);i++)
    {
        (i%2==1)?(*(pcoils_sub+i)=1):(*(pcoils_sub+i)=0);
    }
    for(i=0;i<sizeof(public_struc_modbus.inputs);i++)
    {
        (i%2==0)?(*(pinputs_sub+i)=1):(*(pinputs_sub+i)=0);
    }
    for(i=0;i<sizeof(public_struc_modbus.holdingRegisters);i++)                     //3区保持寄存器初始化
    {
        *(pholdingRegisters_sub+i)=i+1;
    }
    for(i=0;i<sizeof(public_struc_modbus.inputRegisters);i++)                       //4区输入寄存器初始化
    {
        *(pinputRegisters_sub+i)=i+1;
    }

    memset(public_struc_modbus.rdata,0,sizeof(public_struc_modbus.rdata));          //初始化寄存器并分配空间
}

//#ifdef FLASH
//#pragma CODE_SECTION(receieve_handler,"ramfuncs")
//#endif
void receieve_handler(MBSLSTRU *pModbusSlave)                                                                               //接收到字符串后处理
{
    Uint16 i, lentemp = public_struc_modbus.recvlen & 0xff;
    Uint16 *pcoils_sub, *pinputs_sub, *pholdingRegisters_sub, *pinputRegisters_sub;                                         //

    ModbusData pTempData;                                                                                                   //临时保存数据

//    struct ScicRecvMsgQueueStruc KD_ScicRecvMsg;

    pcoils_sub =(Uint16 *) pModbusSlave->pcoils;                                                                            //线圈
    pinputs_sub =(Uint16 *) pModbusSlave->pinputs;                                                                          //输入态
    pholdingRegisters_sub =(Uint16 *) pModbusSlave->pholdingRegisters;                                                      //保持寄存器
    pinputRegisters_sub =(Uint16 *) pModbusSlave->pinputRegisters;                                                          //输入寄存器

    memset(pModbusSlave->sdata,0,sizeof(pModbusSlave->sdata));                                                              //初始化寄存器并分配空间

    pTempData.crc = ((pModbusSlave->rdata[lentemp-2])<<8)+pModbusSlave->rdata[lentemp-1];                                   //接收总字节校验码

    pModbusSlave->sdata[0] = pModbusSlave->rdata[0];                                                                        //0字节 为 RTU 地址, 发送时考虑返回

    if(pModbusSlave->rdata[0]==MOD_CODE)                                                                                    //数据地址与本客户端一致 ModbusSlaveAddress
    {//从地址检查
        pModbusSlave->sdata[1] = pModbusSlave->rdata[1];                                                                    //第1字节 为 RTU 功能码 ,发送时考虑返回

        if(CRC16(pModbusSlave->rdata, lentemp-2) == pTempData.crc)                                                          //如果校验CRC准确,接收正确
        {
            pTempData.contentIdx = (pModbusSlave->rdata[2]<<8)+pModbusSlave->rdata[3];                                      //2字节 3字节 内容索引
            pTempData.numofregisters = (pModbusSlave->rdata[4]<<8)+pModbusSlave->rdata[5];                                  //4字节 5字节 这里不表示寄存器数目,表示线圈的状态

            if((pTempData.contentIdx+pTempData.numofregisters)>65535)                                                       //数值超限判定 > 65535
            {
                pModbusSlave->sdata[1]|= 0x80;                                                                              //发送1字节 赋值 0x80
                pModbusSlave->sdata[2]|= 0x03;                                                                              //发送2字节 赋值 0x03

                i=CRC16(pModbusSlave->sdata, 3);                                                                            //前三字节做CRC16校验

                pModbusSlave->sdata[3]= (i>>8)&0xff;                                                                        //3字节 CRC16 高位 赋值 赋值 (i>>8)&0xff
                pModbusSlave->sdata[4]= i&0xff;                                                                             //4字节 CRC16 地位 赋值  i&0xff

                pModbusSlave->sendlen=5;                                                                                    //发送长度 5字节

                ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;                                                        //填写发送长度
                ScicRegs.SCIFFTX.bit.TXFFIENA = 1;                                                                          //发送使能
            }
            else                                                                                                            //数值超限判定 <=40
            {
                switch(pModbusSlave->rdata[1])                                                                              //功能码字 第一字节
                {
                    case MB_FUNC_READ_COIL:                                                                                 //功能码字=1--表示线圈

                        pModbusSlave->sdata[2] = (pTempData.numofregisters+7)/8;                                            //向上取整

                        for(i=0;i<pTempData.numofregisters;i++)
                        {
                            pModbusSlave->sdata[3+(i/8)] |= (*(pcoils_sub+i+pTempData.contentIdx) << (i%8));
                        }

                        i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);

                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;
                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;

                        pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];

                        if(pModbusSlave->sendlen > bufferdepth)
                        {ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}
                        else
                        {ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}

                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_READ_INPUT:                                                                                //功能码字=2--表示输入态

                        pModbusSlave->sdata[2] = (pTempData.numofregisters+7)/8;                                            //向上取整

                        for(i=0;i<pTempData.numofregisters;i++)
                        {
                            pModbusSlave->sdata[3+(i/8)]|=*(pinputs_sub+i+pTempData.contentIdx) << (i%8);
                        }

                        i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);

                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;
                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;

                        pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];

                        if(pModbusSlave->sendlen > bufferdepth)
                        {ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}
                        else
                        {ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}

                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_READ_HOLDINGREGISTERS:                                                                     //功能码字=3--表示保持寄存器

                        pModbusSlave->sdata[2] = pTempData.numofregisters*2;                                                //向上取整

                        for(i=0;i<(pTempData.numofregisters);i++)
                        {
                            pModbusSlave->sdata[3+i*2+1]=*(pholdingRegisters_sub+i+pTempData.contentIdx) ;                  //发送高16位
                            pModbusSlave->sdata[3+i*2+1] = (pModbusSlave->sdata[3+i*2+1]) & 0xff;

                            pModbusSlave->sdata[3+i*2]=*(pholdingRegisters_sub+i+pTempData.contentIdx) ;                    //发送低16位
                            pModbusSlave->sdata[3+i*2]=(pModbusSlave->sdata[3+i*2])>>8;
                        }

                        i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);

                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;
                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;

                        pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];

                        if(pModbusSlave->sendlen > bufferdepth)
                        {ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}
                        else
                        {ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}

                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_READ_INPUTREGISTERS:                                                                       //功能码字=4--表示输入寄存器

                        pModbusSlave->sdata[2] = pTempData.numofregisters*2;                                                //向上取整

                        for(i=0;i<(pTempData.numofregisters);i++)
                        {
                            pModbusSlave->sdata[3+i*2+1]=*(pinputRegisters_sub+i+pTempData.contentIdx) ;
                            pModbusSlave->sdata[3+i*2+1] = (pModbusSlave->sdata[3+i*2+1]) & 0xff;

                            pModbusSlave->sdata[3+i*2]=*(pinputRegisters_sub+i+pTempData.contentIdx) ;
                            pModbusSlave->sdata[3+i*2]=(pModbusSlave->sdata[3+i*2])>>8;
                        }

                        i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);

                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;
                        pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;

                        pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];

                        if(pModbusSlave->sendlen > bufferdepth)
                        {ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}
                        else
                        {ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}

                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_FORCE_COIL:                                                                                //功能码字=5--表示

                        for(i=2;i<8;i++)
                        {
                            pModbusSlave->sdata[i] = pModbusSlave->rdata[i];
                        }

                        if(pTempData.numofregisters==0xFF00)
                        {
                            *(pcoils_sub+pTempData.contentIdx)=1;
                            pModbusSlave->sendlen=8;
                        }
                        else
                        {
                            if(pTempData.numofregisters==0x0000)
                            {
                                *(pcoils_sub+pTempData.contentIdx)=0;
                                pModbusSlave->sendlen=8;
                            }
                            else//命令错误
                            {
                                pModbusSlave->sdata[1]= 0x85;
                                pModbusSlave->sdata[2]= 0x03;

                                i=CRC16(pModbusSlave->sdata, 3);

                                pModbusSlave->sdata[3]= (i>>8)&0xff;
                                pModbusSlave->sdata[4]= i&0xff;

                                pModbusSlave->sendlen=5;
                            }
                        }

                        ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;
                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_WRITE_HOLDINGREGISTER:                                                                     //功能码字=6--表示

                        for(i=2;i<8;i++)
                        {
                            pModbusSlave->sdata[i] = pModbusSlave->rdata[i];
                        }

                        *(pholdingRegisters_sub+pTempData.contentIdx)=pTempData.numofregisters;

                        pModbusSlave->sendlen=8;

                        ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;
                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_FORCE_NCOILS:                                                                              //功能码字=15--表示

                        for(i=0;i<pTempData.numofregisters;i++)
                        {
                            *(pcoils_sub+i+pTempData.contentIdx) = ((pModbusSlave->rdata[i/8+7])>>(i%8))&0x01;
                        }

                        for(i=2;i<7;i++)
                        {
                            pModbusSlave->sdata[i] = pModbusSlave->rdata[i];
                        }

                        i=CRC16(pModbusSlave->sdata, 7);

                        pModbusSlave->sdata[7]=(i>>8)&0xff;
                        pModbusSlave->sdata[8]=i&0xff;

                        pModbusSlave->sendlen=9;

                        ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;
                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    case MB_FUNC_WRITE_NREGISTERS:                                                                          //功能码字=16--表示

                        for(i=0;i<pTempData.numofregisters;i++)
                        {
                            *(pholdingRegisters_sub+i+pTempData.contentIdx) =(Uint16)(pModbusSlave->rdata[i*2+7]<<8) + (pModbusSlave->rdata[i*2+8]&0xFF);
                        }

                        for(i=2;i<6;i++)
                        {
                            pModbusSlave->sdata[i] = pModbusSlave->rdata[i];
                        }

                        i=CRC16(pModbusSlave->sdata, 6);

                        pModbusSlave->sdata[6]=(i>>8)&0xff;
                        pModbusSlave->sdata[7]=i&0xff;

                        pModbusSlave->sendlen=8;

                        ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;
                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;

                    default:                                                                                                //功能码字=其他--表示

                        pModbusSlave->sdata[2]= 0x03;

                        i=CRC16(pModbusSlave->sdata, 3);

                        pModbusSlave->sdata[3]= (i>>8)&0xff;
                        pModbusSlave->sdata[4]= i&0xff;

                        pModbusSlave->sendlen=5;

                        ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;
                        ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
                        break;
                }
            }
        }
        else                                                                                                                //如果校验CRC校验码错误
        {
            pModbusSlave->sdata[1]|= 0x80;                                                                                  //返回错误功能码 01 80 03 CRC1-H CRC2-L
            pModbusSlave->sdata[2]|= 0x03;                                                                                  //

            i=CRC16(pModbusSlave->sdata, 3);

            pModbusSlave->sdata[3]= (i>>8)&0xff;                                                                            //CRC16-H
            pModbusSlave->sdata[4]= i&0xff;                                                                                 //CRC16-L

            pModbusSlave->sendlen=5;                                                                                        //5个字节

            ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;
            ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
        }
    }
    else                                                                                                                    //RTU地址错误不处理
    {     }
}
//#ifdef FLASH
//#pragma CODE_SECTION(CRC16,"ramfuncs")
//#endif
Uint16 CRC16 (Uint16 *nData, Uint16 wLength)                                                                                //CRC16校验函数
{
    static const Uint16 wCRCTable[] =
    {
       0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
       0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
       0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
       0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
       0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
       0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
       0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
       0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,
       0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,
       0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,
       0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,
       0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,
       0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,
       0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,
       0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,
       0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,
       0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,
       0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,
       0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,
       0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,
       0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,
       0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,
       0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,
       0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,
       0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,
       0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,
       0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,
       0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,
       0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
       0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
       0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
       0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040
//         0x00000,0x0C0C1,0x0C181,0x00140,0x0C301,0x003C0,0x00280,0x0C241,
//         0x0C601,0x006C0,0x00780,0x0C741,0x00500,0x0C5C1,0x0C481,0x00440,
//         0x0CC01,0x00CC0,0x00D80,0x0CD41,0x00F00,0x0CFC1,0x0CE81,0x00E40,
//         0x00A00,0x0CAC1,0x0CB81,0x00B40,0x0C901,0x009C0,0x00880,0x0C841,
//         0x0D801,0x018C0,0x01980,0x0D941,0x01B00,0x0DBC1,0x0DA81,0x01A40,
//         0x01E00,0x0DEC1,0x0DF81,0x01F40,0x0DD01,0x01DC0,0x01C80,0x0DC41,
//         0x01400,0x0D4C1,0x0D581,0x01540,0x0D701,0x017C0,0x01680,0x0D641,
//         0x0D201,0x012C0,0x01380,0x0D341,0x01100,0x0D1C1,0x0D081,0x01040,
//         0x0F001,0x030C0,0x03180,0x0F141,0x03300,0x0F3C1,0x0F281,0x03240,
//         0x03600,0x0F6C1,0x0F781,0x03740,0x0F501,0x035C0,0x03480,0x0F441,
//         0x03C00,0x0FCC1,0x0FD81,0x03D40,0x0FF01,0x03FC0,0x03E80,0x0FE41,
//         0x0FA01,0x03AC0,0x03B80,0x0FB41,0x03900,0x0F9C1,0x0F881,0x03840,
//         0x02800,0x0E8C1,0x0E981,0x02940,0x0EB01,0x02BC0,0x02A80,0x0EA41,
//         0x0EE01,0x02EC0,0x02F80,0x0EF41,0x02D00,0x0EDC1,0x0EC81,0x02C40,
//         0x0E401,0x024C0,0x02580,0x0E541,0x02700,0x0E7C1,0x0E681,0x02640,
//         0x02200,0x0E2C1,0x0E381,0x02340,0x0E101,0x021C0,0x02080,0x0E041,
//         0x0A001,0x060C0,0x06180,0x0A141,0x06300,0x0A3C1,0x0A281,0x06240,
//         0x06600,0x0A6C1,0x0A781,0x06740,0x0A501,0x065C0,0x06480,0x0A441,
//         0x06C00,0x0ACC1,0x0AD81,0x06D40,0x0AF01,0x06FC0,0x06E80,0x0AE41,
//         0x0AA01,0x06AC0,0x06B80,0x0AB41,0x06900,0x0A9C1,0x0A881,0x06840,
//         0x07800,0x0B8C1,0x0B981,0x07940,0x0BB01,0x07BC0,0x07A80,0x0BA41,
//         0x0BE01,0x07EC0,0x07F80,0x0BF41,0x07D00,0x0BDC1,0x0BC81,0x07C40,
//         0x0B401,0x074C0,0x07580,0x0B541,0x07700,0x0B7C1,0x0B681,0x07640,
//         0x07200,0x0B2C1,0x0B381,0x07340,0x0B101,0x071C0,0x07080,0x0B041,
//         0x05000,0x090C1,0x09181,0x05140,0x09301,0x053C0,0x05280,0x09241,
//         0x09601,0x056C0,0x05780,0x09741,0x05500,0x095C1,0x09481,0x05440,
//         0x09C01,0x05CC0,0x05D80,0x09D41,0x05F00,0x09FC1,0x09E81,0x05E40,
//         0x05A00,0x09AC1,0x09B81,0x05B40,0x09901,0x059C0,0x05880,0x09841,
//         0x08801,0x048C0,0x04980,0x08941,0x04B00,0x08BC1,0x08A81,0x04A40,
//         0x04E00,0x08EC1,0x08F81,0x04F40,0x08D01,0x04DC0,0x04C80,0x08C41,
//         0x04400,0x084C1,0x08581,0x04540,0x08701,0x047C0,0x04680,0x08641,
//         0x08201,0x042C0,0x04380,0x08341,0x04100,0x081C1,0x08081,0x04040
    };

    Uint16 nTemp;
    Uint16 wCRCWord = 0xFFFF;

    while (wLength--)
    {
        nTemp = (*nData++ ^ wCRCWord)&0xff;
        wCRCWord >>= 8;
        wCRCWord  ^= wCRCTable[nTemp];
    }
    wCRCWord = (Uint16) ((wCRCWord<<8)+(wCRCWord>>8));
    return wCRCWord;
}

void scic_rx_test()
{
    if(SCIC_TXRX_485_ST==1)                                                         //发送状态正确
    {
        scicsendmsg = "\r\nEnter a character:\0";                                   //发送语句  \r-13  \n-10
        scic_msg(scicsendmsg);                                                      //发送函数
    }

    if((ScicRegs.SCIFFRX.bit.RXFFST == 1)&&(SCIC_TXRX_485_ST==0))                   //接收状态正确并且状态字接收
    {

        scicReceivedChar = ScicRegs.SCIRXBUF.all;                                   //把接收BUF里的数据赋值给ReceivedChar
        scic_xmit(scicReceivedChar);                                                //发送ReceivedChar
        SCIC_TX_485;                                                               //高电平
        scicsendmsg = "be send!\0";                                                 //发送语句
        scic_msg(scicsendmsg);                                                      //发送函数
    }
}

void scic_xmit(int Schar)                                                               // SCIC发送一个字符函数
{
    SCIC_TX_485;
    while (ScicRegs.SCIFFTX.bit.TXFFST != 0) { }                                    //表示未发送完毕时等待
    ScicRegs.SCITXBUF=Schar;
    SCIC_RX_485;                                                                    //拉低
}

void scic_msg(char *scisendcmsg)                                                    //发送整个数组的函数
{
    int i;
    i = 0;
    while(scicsendmsg[i] != '\0')                                                   //发送一个字符串 并且 以  \0 字符结束
    {
        scic_xmit(scicsendmsg[i]);
        i++;
    }
}


void scic_fifo_init()
{
    ScicRegs.SCICTL2.bit.TXINTENA =1;
    ScicRegs.SCICTL2.bit.RXBKINTENA =1;

    ScicRegs.SCIHBAUD    =0x0001;
    ScicRegs.SCILBAUD    =0x00E7;

    ScicRegs.SCIFFCT.all =0x00;             //为默认值 效果为  禁用自动波特率调整  fifo传送延时为0

    ScicRegs.SCIFFTX.bit.SCIFFENA = 1;      //使能sci fifo功能
    ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1;    //重新使能发送fifo操作
    ScicRegs.SCIFFTX.bit.TXFFIENA = 1;      //fifo 发送中断使能
    ScicRegs.SCIFFTX.bit.TXFFIL = 0;        //发送中断级别,此时为上电默认值0

    ScicRegs.SCIFFRX.bit.RXFFOVRCLR = 1;    //清接收fifo溢出标志
    ScicRegs.SCIFFRX.bit.RXFFINTCLR = 1;    //清接收fifo中断标志位
    ScicRegs.SCIFFRX.bit.RXFFIENA = 1;      //使能fifo接收中断
    ScicRegs.SCIFFRX.bit.RXFFIL = 1;        //fifo接收中断级别为8
    ScicRegs.SCIFFRX.bit.RXFIFORESET=1;     //重新使能接收fifo操作
}

void scic_echoback_init(void)
{
// Note: Clocks were turned on to the SCIC peripheral in the InitSysCtrl() function
    ScicRegs.SCICCR.all =0x0007;            // 1 stop bit, No loopback, No parity,8 char bits,async mode, idle-line protocol
//    ScicRegs.SCICTL1.all =0x0003;           // enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
    ScicRegs.SCICTL1.all =0x0023;           // Relinquish SCI from Reset
    ScicRegs.SCICTL1.bit.RXERRINTENA=1;
}

void DATA_TRANSFER_DSP_HMI(void)
{
    //系统运行参数赋值
    sys_mod_quantity=*(pholdingRegisters_sub+0);
    sys_DC_VOLTAGE_set=*(pholdingRegisters_sub+1);
    sys_wired_mode=*(pholdingRegisters_sub+2);
    sys_LO_V=*(pholdingRegisters_sub+3);
    sys_OL_V=*(pholdingRegisters_sub+4);
    sys_OV_V=*(pholdingRegisters_sub+5);
    sys_OV_HZ=*(pholdingRegisters_sub+6);
    sys_OL_HZ=*(pholdingRegisters_sub+7);
    sys_mini_current=*(pholdingRegisters_sub+8);
    sys_maxi_current=*(pholdingRegisters_sub+9);
    sys_IGBT_over_temperature=*(pholdingRegisters_sub+10);
    sys_VH_O=*(pholdingRegisters_sub+11);
    sys_CH_O=*(pholdingRegisters_sub+12);

    sys_COMPENSATION_mode=*(pholdingRegisters_sub+13);

    sys_HLCOMPENSATION_transf=*(pholdingRegisters_sub+14);
    sys_HL_COMPENSATIONA_direction=(*(pholdingRegisters_sub+15)&0x0001);
    sys_HL_COMPENSATIONB_direction=((*(pholdingRegisters_sub+15))&0x0002)>>1;
    sys_HL_COMPENSATIONC_direction=((*(pholdingRegisters_sub+15))&0x0004)>>2;

    sys_HLGRID_transf=*(pholdingRegisters_sub+16);
    sys_HL_GRIDA_direction=(*(pholdingRegisters_sub+17)&0x0001);
    sys_HL_GRIDB_direction=((*(pholdingRegisters_sub+17))&0x0002)>>1;
    sys_HL_GRIDC_direction=((*(pholdingRegisters_sub+17))&0x0004)>>2;
    sys_HL_GRID_position=((*(pholdingRegisters_sub+17))&0x0008)>>3;

    sys_HLDEVICE_transf=*(pholdingRegisters_sub+18);
    sys_HL_DEVICEA_direction=*(pholdingRegisters_sub+19);
    sys_HL_DEVICEB_direction=((*(pholdingRegisters_sub+19))&0x0002)>>1;
    sys_HL_DEVICEC_direction=((*(pholdingRegisters_sub+19))&0x0004)>>2;

    sys_odd_sel_1=*(pholdingRegisters_sub+20);
    sys_odd_sel_2=*(pholdingRegisters_sub+21);
    sys_even_sel_1=*(pholdingRegisters_sub+22);
    sys_even_sel_2=*(pholdingRegisters_sub+23);

    sys_mod_start_mode=*(pholdingRegisters_sub+24);
    sys_limit_current=*(pholdingRegisters_sub+25);
    sys_mod_power_on_off=*(pholdingRegisters_sub+26);

    sys_meter_mode=*(pholdingRegisters_sub+27);
    sys_cap_on_off_logic_mode=*(pholdingRegisters_sub+28);
    sys_cap_relay_total=*(pholdingRegisters_sub+29);
    sys_cap_capacity=*(pholdingRegisters_sub+30);
    sys_cap_on_off_delay_time=*(pholdingRegisters_sub+31);
    sys_cap_live_time_max=*(pholdingRegisters_sub+32);
    sys_cap_rest_time_min=*(pholdingRegisters_sub+33);
    sys_extinguish_pf=*(pholdingRegisters_sub+34);
    sys_extinguish_pf_Tan=*(pholdingRegisters_sub+35);
    sys_generate_pf=*(pholdingRegisters_sub+36);
    sys_generate_pf_tan=*(pholdingRegisters_sub+37);
    sys_mod_cap_unit=*(pholdingRegisters_sub+38);
    sys_device_comp_max=*(pholdingRegisters_sub+39);
    sys_mod_DA1=*(pholdingRegisters_sub+40);
    sys_mod_DA2=*(pholdingRegisters_sub+41);
    sys_test_cur_max=*(pholdingRegisters_sub+42);
    sys_test_Q_instruction=*(pholdingRegisters_sub+43);
    sys_test_3_instruction=*(pholdingRegisters_sub+44);
    sys_test_5_instruction=*(pholdingRegisters_sub+45);
    sys_test_7_instruction=*(pholdingRegisters_sub+46);
    sys_LC_on_num=*(pholdingRegisters_sub+47);
    LC_Relay_ON(sys_LC_on_num);
    sys_LC_off_num=*(pholdingRegisters_sub+48);
    LC_Relay_OFF(sys_LC_off_num);

    //系统信息上传
    //电网三相电压有效值
    *(pinputRegisters_sub+0)=cal_ua_rms*10; //floatToIEEE754_H(cal_ua_rms);
    *(pinputRegisters_sub+1)=cal_ub_rms*10; //cal_ub_rms*10;
    *(pinputRegisters_sub+2)=cal_uc_rms*10;
    //电源侧三相电流有效值
    *(pinputRegisters_sub+3)=cal_ias_rms*10;
    *(pinputRegisters_sub+4)=cal_ibs_rms*10;
    *(pinputRegisters_sub+5)=cal_ics_rms*10;
    //负载侧三相电流有效值
    *(pinputRegisters_sub+6)=cal_ial_rms*10;
    *(pinputRegisters_sub+7)=cal_ibl_rms*10;
    *(pinputRegisters_sub+8)=cal_icl_rms*10;
    //装置侧三相补偿电流有效值
    *(pinputRegisters_sub+9)=cal_iad_rms*10;
    *(pinputRegisters_sub+10)=cal_ibd_rms*10;
    *(pinputRegisters_sub+11)=cal_icd_rms*10;
    //本模块三相补偿电流有效值
    *(pinputRegisters_sub+12)=cal_iac_rms*10;
    *(pinputRegisters_sub+13)=cal_ibc_rms*10;
    *(pinputRegisters_sub+14)=cal_icc_rms*10;
    //电网频率
    *(pinputRegisters_sub+15)=cal_Grid_frequency*10;
    //直流母线上下电压
    *(pinputRegisters_sub+16)=cal_DC_U_rms*10;
    *(pinputRegisters_sub+17)=cal_DC_D_rms*10;
    //IGBT温度
    *(pinputRegisters_sub+18)=cal_TEMP_IGBTA_rms*10;
    *(pinputRegisters_sub+19)=cal_TEMP_IGBTB_rms*10;
    *(pinputRegisters_sub+20)=0;
    //电网相序
    *(pinputRegisters_sub+21)=cal_Phase_seq;
    //电源侧功率及功率因数
    *(pinputRegisters_sub+22)=cal_aPs*10;
    *(pinputRegisters_sub+23)=cal_bPs*10;
    *(pinputRegisters_sub+24)=cal_cPs*10;

    *(pinputRegisters_sub+25)=cal_aQs*10;
    *(pinputRegisters_sub+26)=cal_bQs*10;
    *(pinputRegisters_sub+27)=cal_cQs*10;

    *(pinputRegisters_sub+28)=cal_aSs*10;
    *(pinputRegisters_sub+29)=cal_bSs*10;
    *(pinputRegisters_sub+30)=cal_cSs*10;

    *(pinputRegisters_sub+31)=cal_flag_apfs;
    *(pinputRegisters_sub+32)=cal_flag_bpfs;
    *(pinputRegisters_sub+33)=cal_flag_bpfs;

    *(pinputRegisters_sub+34)=cal_aPFs*1000;
    *(pinputRegisters_sub+35)=cal_bPFs*1000;
    *(pinputRegisters_sub+36)=cal_cPFs*1000;

    *(pinputRegisters_sub+37)=cal_Har_aPFs*1000;
    *(pinputRegisters_sub+38)=cal_Har_bPFs*1000;
    *(pinputRegisters_sub+39)=cal_Har_cPFs*1000;

    *(pinputRegisters_sub+40)=cal_ind_caps_flag;
    *(pinputRegisters_sub+41)=cal_pfs_average*1000;
    *(pinputRegisters_sub+42)=cal_har_pfs_average*1000;
    //负载侧功率及功率因数
    *(pinputRegisters_sub+43)=cal_aPl*10;
    *(pinputRegisters_sub+44)=cal_bPl*10;
    *(pinputRegisters_sub+45)=cal_cPl*10;

    *(pinputRegisters_sub+46)=cal_aQl*10;
    *(pinputRegisters_sub+47)=cal_bQl*10;
    *(pinputRegisters_sub+48)=cal_bQl*10;

    *(pinputRegisters_sub+49)=cal_aSl*10;
    *(pinputRegisters_sub+50)=cal_bSl*10;
    *(pinputRegisters_sub+51)=cal_cSl*10;

    *(pinputRegisters_sub+52)=cal_flag_apfl;
    *(pinputRegisters_sub+53)=cal_flag_bpfl;
    *(pinputRegisters_sub+54)=cal_flag_bpfl;

    *(pinputRegisters_sub+55)=cal_aPFl*1000;
    *(pinputRegisters_sub+56)=cal_bPFl*1000;
    *(pinputRegisters_sub+57)=cal_cPFl*1000;

    *(pinputRegisters_sub+58)=cal_Har_aPFl*1000;
    *(pinputRegisters_sub+59)=cal_Har_bPFl*1000;
    *(pinputRegisters_sub+60)=cal_Har_cPFl*1000;

    *(pinputRegisters_sub+61)=cal_ind_capl_flag;
    *(pinputRegisters_sub+62)=cal_pfl_average*1000;
    *(pinputRegisters_sub+63)=cal_har_pfl_average*1000;
    //电网电压、电源侧电流、负载侧电流谐波总含量
    *(pinputRegisters_sub+64)=cal_THDu_a_total*10;
    *(pinputRegisters_sub+65)=cal_THDu_b_total*10;
    *(pinputRegisters_sub+66)=cal_THDu_c_total*10;

    *(pinputRegisters_sub+67)=cal_THDi_as_total*10;
    *(pinputRegisters_sub+68)=cal_THDi_bs_total*10;
    *(pinputRegisters_sub+69)=cal_THDi_cs_total*10;

    *(pinputRegisters_sub+70)=cal_THDi_al_total*10;
    *(pinputRegisters_sub+71)=cal_THDi_bl_total*10;
    *(pinputRegisters_sub+72)=cal_THDi_cl_total*10;
    //告警码
    *(pinputRegisters_sub+73)=err_err_byte[0];
    *(pinputRegisters_sub+74)=err_err_byte[1];
    *(pinputRegisters_sub+75)=err_err_byte[2];
    //LC继电器状态
    *(pinputRegisters_sub+76)=cap_relay_status_top;
    *(pinputRegisters_sub+76)=((*(pinputRegisters_sub+76))<<8)|(cap_relay_status_bottom);
    //     *(pinputRegisters_sub+77)=(cap_relay_status_bottom<<16);
    //投入LC电流测试
    *(pinputRegisters_sub+78)=cal_diff_cur[0];
    *(pinputRegisters_sub+79)=cal_diff_cur[1];
    *(pinputRegisters_sub+80)=cal_diff_cur[2];
    *(pinputRegisters_sub+81)=cal_diff_cur[3];
    *(pinputRegisters_sub+82)=cal_diff_cur[4];
    *(pinputRegisters_sub+83)=cal_diff_cur[5];
    *(pinputRegisters_sub+84)=cal_diff_cur[6];
    *(pinputRegisters_sub+85)=cal_diff_cur[7];
    *(pinputRegisters_sub+86)=cal_diff_cur[8];
    *(pinputRegisters_sub+87)=cal_diff_cur[9];
    *(pinputRegisters_sub+88)=cal_diff_cur[10];
    *(pinputRegisters_sub+89)=cal_diff_cur[11];
    *(pinputRegisters_sub+90)=cal_diff_cur[12];
    *(pinputRegisters_sub+91)=cal_diff_cur[13];
    *(pinputRegisters_sub+92)=cal_diff_cur[14];
    *(pinputRegisters_sub+93)=cal_diff_cur[15];
    //A相电源侧各次谐波含量
    *(pinputRegisters_sub+94)=cal_thdi_as[1];
    *(pinputRegisters_sub+94)=((*(pinputRegisters_sub+94))<<8)|((int)cal_thdi_as[2]);
    *(pinputRegisters_sub+95)=cal_thdi_as[3];
    *(pinputRegisters_sub+95)=((*(pinputRegisters_sub+95))<<8)|((int)cal_thdi_as[4]);
    *(pinputRegisters_sub+96)=cal_thdi_as[5];
    *(pinputRegisters_sub+96)=((*(pinputRegisters_sub+96))<<8)|((int)cal_thdi_as[6]);
    *(pinputRegisters_sub+97)=cal_thdi_as[7];
    *(pinputRegisters_sub+97)=((*(pinputRegisters_sub+97))<<8)|((int)cal_thdi_as[8]);
    *(pinputRegisters_sub+98)=cal_thdi_as[9];
    *(pinputRegisters_sub+98)=((*(pinputRegisters_sub+98))<<8)|((int)cal_thdi_as[10]);
    *(pinputRegisters_sub+99)=cal_thdi_as[11];
    *(pinputRegisters_sub+99)=((*(pinputRegisters_sub+99))<<8)|((int)cal_thdi_as[12]);
    *(pinputRegisters_sub+100)=cal_thdi_as[13];
    *(pinputRegisters_sub+100)=((*(pinputRegisters_sub+100))<<8)|((int)cal_thdi_as[14]);
    *(pinputRegisters_sub+101)=cal_thdi_as[15];
    *(pinputRegisters_sub+101)=((*(pinputRegisters_sub+101))<<8)|((int)cal_thdi_as[16]);
    *(pinputRegisters_sub+102)=cal_thdi_as[17];
    *(pinputRegisters_sub+102)=((*(pinputRegisters_sub+102))<<8)|((int)cal_thdi_as[18]);
    *(pinputRegisters_sub+103)=cal_thdi_as[19];
    *(pinputRegisters_sub+103)=((*(pinputRegisters_sub+103))<<8)|((int)cal_thdi_as[21]);
    *(pinputRegisters_sub+104)=cal_thdi_as[23];
    *(pinputRegisters_sub+104)=((*(pinputRegisters_sub+104))<<8)|((int)cal_thdi_as[25]);
    *(pinputRegisters_sub+105)=cal_thdi_as[27];
    *(pinputRegisters_sub+105)=((*(pinputRegisters_sub+105))<<8)|((int)cal_thdi_as[29]);
    *(pinputRegisters_sub+106)=cal_thdi_as[31];
    *(pinputRegisters_sub+106)=((*(pinputRegisters_sub+106))<<8)|((int)cal_thdi_as[33]);
    *(pinputRegisters_sub+107)=cal_thdi_as[35];
    *(pinputRegisters_sub+107)=((*(pinputRegisters_sub+107))<<8)|((int)cal_thdi_as[37]);
    *(pinputRegisters_sub+108)=cal_thdi_as[39];
    *(pinputRegisters_sub+108)=((*(pinputRegisters_sub+108))<<8)|((int)cal_thdi_as[41]);
    *(pinputRegisters_sub+109)=cal_thdi_as[43];
    *(pinputRegisters_sub+109)=((*(pinputRegisters_sub+109))<<8)|((int)cal_thdi_as[45]);
    *(pinputRegisters_sub+110)=cal_thdi_as[47];
    *(pinputRegisters_sub+110)=((*(pinputRegisters_sub+110))<<8)|((int)cal_thdi_as[49]);
    //B相电源侧各次谐波含量
    *(pinputRegisters_sub+111)=cal_thdi_bs[1];
    *(pinputRegisters_sub+111)=((*(pinputRegisters_sub+111))<<8)|((int)cal_thdi_bs[2]);
    *(pinputRegisters_sub+112)=cal_thdi_bs[3];
    *(pinputRegisters_sub+112)=((*(pinputRegisters_sub+112))<<8)|((int)cal_thdi_bs[4]);
    *(pinputRegisters_sub+113)=cal_thdi_bs[5];
    *(pinputRegisters_sub+113)=((*(pinputRegisters_sub+113))<<8)|((int)cal_thdi_bs[6]);
    *(pinputRegisters_sub+114)=cal_thdi_bs[7];
    *(pinputRegisters_sub+114)=((*(pinputRegisters_sub+114))<<8)|((int)cal_thdi_bs[8]);
    *(pinputRegisters_sub+115)=cal_thdi_bs[9];
    *(pinputRegisters_sub+115)=((*(pinputRegisters_sub+115))<<8)|((int)cal_thdi_bs[10]);
    *(pinputRegisters_sub+116)=cal_thdi_bs[11];
    *(pinputRegisters_sub+116)=((*(pinputRegisters_sub+116))<<8)|((int)cal_thdi_bs[12]);
    *(pinputRegisters_sub+117)=cal_thdi_bs[13];
    *(pinputRegisters_sub+117)=((*(pinputRegisters_sub+117))<<8)|((int)cal_thdi_bs[14]);
    *(pinputRegisters_sub+118)=cal_thdi_bs[15];
    *(pinputRegisters_sub+118)=((*(pinputRegisters_sub+118))<<8)|((int)cal_thdi_bs[16]);
    *(pinputRegisters_sub+119)=cal_thdi_bs[17];
    *(pinputRegisters_sub+119)=((*(pinputRegisters_sub+119))<<8)|((int)cal_thdi_bs[18]);
    *(pinputRegisters_sub+120)=cal_thdi_bs[19];
    *(pinputRegisters_sub+120)=((*(pinputRegisters_sub+120))<<8)|((int)cal_thdi_bs[21]);
    *(pinputRegisters_sub+121)=cal_thdi_bs[23];
    *(pinputRegisters_sub+121)=((*(pinputRegisters_sub+121))<<8)|((int)cal_thdi_bs[25]);
    *(pinputRegisters_sub+122)=cal_thdi_bs[27];
    *(pinputRegisters_sub+122)=((*(pinputRegisters_sub+122))<<8)|((int)cal_thdi_bs[29]);
    *(pinputRegisters_sub+123)=cal_thdi_bs[31];
    *(pinputRegisters_sub+123)=((*(pinputRegisters_sub+123))<<8)|((int)cal_thdi_bs[33]);
    *(pinputRegisters_sub+124)=cal_thdi_bs[35];
    *(pinputRegisters_sub+124)=((*(pinputRegisters_sub+124))<<8)|((int)cal_thdi_bs[37]);
    *(pinputRegisters_sub+125)=cal_thdi_bs[39];
    *(pinputRegisters_sub+125)=((*(pinputRegisters_sub+125))<<8)|((int)cal_thdi_bs[41]);
    *(pinputRegisters_sub+126)=cal_thdi_bs[43];
    *(pinputRegisters_sub+126)=((*(pinputRegisters_sub+126))<<8)|((int)cal_thdi_bs[45]);
    *(pinputRegisters_sub+127)=cal_thdi_bs[47];
    *(pinputRegisters_sub+127)=((*(pinputRegisters_sub+127))<<8)|((int)cal_thdi_bs[49]);
    //C相电源侧各次谐波含量
    *(pinputRegisters_sub+128)=cal_thdi_cs[1];
    *(pinputRegisters_sub+128)=((*(pinputRegisters_sub+128))<<8)|((int)cal_thdi_cs[2]);
    *(pinputRegisters_sub+129)=cal_thdi_cs[3];
    *(pinputRegisters_sub+129)=((*(pinputRegisters_sub+129))<<8)|((int)cal_thdi_cs[4]);
    *(pinputRegisters_sub+130)=cal_thdi_cs[5];
    *(pinputRegisters_sub+130)=((*(pinputRegisters_sub+130))<<8)|((int)cal_thdi_cs[6]);
    *(pinputRegisters_sub+131)=cal_thdi_cs[7];
    *(pinputRegisters_sub+131)=((*(pinputRegisters_sub+131))<<8)|((int)cal_thdi_cs[8]);
    *(pinputRegisters_sub+132)=cal_thdi_cs[9];
    *(pinputRegisters_sub+132)=((*(pinputRegisters_sub+132))<<8)|((int)cal_thdi_cs[10]);
    *(pinputRegisters_sub+133)=cal_thdi_cs[11];
    *(pinputRegisters_sub+133)=((*(pinputRegisters_sub+133))<<8)|((int)cal_thdi_cs[12]);
    *(pinputRegisters_sub+134)=cal_thdi_cs[13];
    *(pinputRegisters_sub+134)=((*(pinputRegisters_sub+134))<<8)|((int)cal_thdi_cs[14]);
    *(pinputRegisters_sub+135)=cal_thdi_cs[15];
    *(pinputRegisters_sub+135)=((*(pinputRegisters_sub+135))<<8)|((int)cal_thdi_cs[16]);
    *(pinputRegisters_sub+136)=cal_thdi_cs[17];
    *(pinputRegisters_sub+136)=((*(pinputRegisters_sub+136))<<8)|((int)cal_thdi_cs[18]);
    *(pinputRegisters_sub+137)=cal_thdi_cs[19];
    *(pinputRegisters_sub+137)=((*(pinputRegisters_sub+137))<<8)|((int)cal_thdi_cs[21]);
    *(pinputRegisters_sub+138)=cal_thdi_cs[23];
    *(pinputRegisters_sub+138)=((*(pinputRegisters_sub+138))<<8)|((int)cal_thdi_cs[25]);
    *(pinputRegisters_sub+139)=cal_thdi_cs[27];
    *(pinputRegisters_sub+139)=((*(pinputRegisters_sub+139))<<8)|((int)cal_thdi_cs[29]);
    *(pinputRegisters_sub+140)=cal_thdi_cs[31];
    *(pinputRegisters_sub+140)=((*(pinputRegisters_sub+140))<<8)|((int)cal_thdi_cs[33]);
    *(pinputRegisters_sub+141)=cal_thdi_cs[35];
    *(pinputRegisters_sub+141)=((*(pinputRegisters_sub+141))<<8)|((int)cal_thdi_cs[37]);
    *(pinputRegisters_sub+142)=cal_thdi_cs[39];
    *(pinputRegisters_sub+142)=((*(pinputRegisters_sub+142))<<8)|((int)cal_thdi_cs[41]);
    *(pinputRegisters_sub+143)=cal_thdi_cs[43];
    *(pinputRegisters_sub+143)=((*(pinputRegisters_sub+143))<<8)|((int)cal_thdi_cs[45]);
    *(pinputRegisters_sub+144)=cal_thdi_cs[47];
    *(pinputRegisters_sub+144)=((*(pinputRegisters_sub+144))<<8)|((int)cal_thdi_cs[49]);
    //A相负载侧各次谐波含量
    *(pinputRegisters_sub+145)=cal_thdi_al[1];
    *(pinputRegisters_sub+145)=((*(pinputRegisters_sub+145))<<8)|((int)cal_thdi_al[2]);
    *(pinputRegisters_sub+146)=cal_thdi_al[3];
    *(pinputRegisters_sub+146)=((*(pinputRegisters_sub+146))<<8)|((int)cal_thdi_al[4]);
    *(pinputRegisters_sub+147)=cal_thdi_al[5];
    *(pinputRegisters_sub+147)=((*(pinputRegisters_sub+147))<<8)|((int)cal_thdi_al[6]);
    *(pinputRegisters_sub+148)=cal_thdi_al[7];
    *(pinputRegisters_sub+148)=((*(pinputRegisters_sub+148))<<8)|((int)cal_thdi_al[8]);
    *(pinputRegisters_sub+149)=cal_thdi_al[9];
    *(pinputRegisters_sub+149)=((*(pinputRegisters_sub+149))<<8)|((int)cal_thdi_al[10]);
    *(pinputRegisters_sub+150)=cal_thdi_al[11];
    *(pinputRegisters_sub+150)=((*(pinputRegisters_sub+150))<<8)|((int)cal_thdi_al[12]);
    *(pinputRegisters_sub+151)=cal_thdi_al[13];
    *(pinputRegisters_sub+151)=((*(pinputRegisters_sub+151))<<8)|((int)cal_thdi_al[14]);
    *(pinputRegisters_sub+152)=cal_thdi_al[15];
    *(pinputRegisters_sub+152)=((*(pinputRegisters_sub+152))<<8)|((int)cal_thdi_al[16]);
    *(pinputRegisters_sub+153)=cal_thdi_al[17];
    *(pinputRegisters_sub+153)=((*(pinputRegisters_sub+153))<<8)|((int)cal_thdi_al[18]);
    *(pinputRegisters_sub+154)=cal_thdi_al[19];
    *(pinputRegisters_sub+154)=((*(pinputRegisters_sub+154))<<8)|((int)cal_thdi_al[21]);
    *(pinputRegisters_sub+155)=cal_thdi_al[23];
    *(pinputRegisters_sub+155)=((*(pinputRegisters_sub+155))<<8)|((int)cal_thdi_al[25]);
    *(pinputRegisters_sub+156)=cal_thdi_al[27];
    *(pinputRegisters_sub+156)=((*(pinputRegisters_sub+156))<<8)|((int)cal_thdi_al[29]);
    *(pinputRegisters_sub+157)=cal_thdi_al[31];
    *(pinputRegisters_sub+157)=((*(pinputRegisters_sub+157))<<8)|((int)cal_thdi_al[33]);
    *(pinputRegisters_sub+158)=cal_thdi_al[35];
    *(pinputRegisters_sub+158)=((*(pinputRegisters_sub+158))<<8)|((int)cal_thdi_al[37]);
    *(pinputRegisters_sub+159)=cal_thdi_al[39];
    *(pinputRegisters_sub+159)=((*(pinputRegisters_sub+159))<<8)|((int)cal_thdi_al[41]);
    *(pinputRegisters_sub+160)=cal_thdi_al[43];
    *(pinputRegisters_sub+160)=((*(pinputRegisters_sub+160))<<8)|((int)cal_thdi_al[45]);
    *(pinputRegisters_sub+161)=cal_thdi_al[47];
    *(pinputRegisters_sub+161)=((*(pinputRegisters_sub+161))<<8)|((int)cal_thdi_al[49]);
    //B相负载侧各次谐波含量
    *(pinputRegisters_sub+162)=cal_thdi_bl[1];
    *(pinputRegisters_sub+162)=((*(pinputRegisters_sub+162))<<8)|((int)cal_thdi_bl[2]);
    *(pinputRegisters_sub+163)=cal_thdi_bl[3];
    *(pinputRegisters_sub+163)=((*(pinputRegisters_sub+163))<<8)|((int)cal_thdi_bl[4]);
    *(pinputRegisters_sub+164)=cal_thdi_bl[5];
    *(pinputRegisters_sub+164)=((*(pinputRegisters_sub+164))<<8)|((int)cal_thdi_bl[6]);
    *(pinputRegisters_sub+165)=cal_thdi_bl[7];
    *(pinputRegisters_sub+165)=((*(pinputRegisters_sub+165))<<8)|((int)cal_thdi_bl[8]);
    *(pinputRegisters_sub+166)=cal_thdi_bl[9];
    *(pinputRegisters_sub+166)=((*(pinputRegisters_sub+166))<<8)|((int)cal_thdi_bl[10]);
    *(pinputRegisters_sub+167)=cal_thdi_bl[11];
    *(pinputRegisters_sub+167)=((*(pinputRegisters_sub+167))<<8)|((int)cal_thdi_bl[12]);
    *(pinputRegisters_sub+168)=cal_thdi_bl[13];
    *(pinputRegisters_sub+168)=((*(pinputRegisters_sub+168))<<8)|((int)cal_thdi_bl[14]);
    *(pinputRegisters_sub+169)=cal_thdi_bl[15];
    *(pinputRegisters_sub+169)=((*(pinputRegisters_sub+169))<<8)|((int)cal_thdi_bl[16]);
    *(pinputRegisters_sub+170)=cal_thdi_bl[17];
    *(pinputRegisters_sub+170)=((*(pinputRegisters_sub+170))<<8)|((int)cal_thdi_bl[18]);
    *(pinputRegisters_sub+171)=cal_thdi_bl[19];
    *(pinputRegisters_sub+171)=((*(pinputRegisters_sub+171))<<8)|((int)cal_thdi_bl[21]);
    *(pinputRegisters_sub+172)=cal_thdi_bl[23];
    *(pinputRegisters_sub+172)=((*(pinputRegisters_sub+172))<<8)|((int)cal_thdi_bl[25]);
    *(pinputRegisters_sub+173)=cal_thdi_bl[27];
    *(pinputRegisters_sub+173)=((*(pinputRegisters_sub+173))<<8)|((int)cal_thdi_bl[29]);
    *(pinputRegisters_sub+174)=cal_thdi_bl[31];
    *(pinputRegisters_sub+174)=((*(pinputRegisters_sub+174))<<8)|((int)cal_thdi_bl[33]);
    *(pinputRegisters_sub+175)=cal_thdi_bl[35];
    *(pinputRegisters_sub+175)=((*(pinputRegisters_sub+175))<<8)|((int)cal_thdi_bl[37]);
    *(pinputRegisters_sub+176)=cal_thdi_bl[39];
    *(pinputRegisters_sub+176)=((*(pinputRegisters_sub+176))<<8)|((int)cal_thdi_bl[41]);
    *(pinputRegisters_sub+177)=cal_thdi_bl[43];
    *(pinputRegisters_sub+177)=((*(pinputRegisters_sub+177))<<8)|((int)cal_thdi_bl[45]);
    *(pinputRegisters_sub+178)=cal_thdi_bl[47];
    *(pinputRegisters_sub+178)=((*(pinputRegisters_sub+178))<<8)|((int)cal_thdi_bl[49]);
    //C相负载侧各次谐波含量
    *(pinputRegisters_sub+179)=cal_thdi_cl[1];
    *(pinputRegisters_sub+179)=((*(pinputRegisters_sub+179))<<8)|((int)cal_thdi_cl[2]);
    *(pinputRegisters_sub+180)=cal_thdi_cl[3];
    *(pinputRegisters_sub+180)=((*(pinputRegisters_sub+180))<<8)|((int)cal_thdi_cl[4]);
    *(pinputRegisters_sub+181)=cal_thdi_cl[5];
    *(pinputRegisters_sub+181)=((*(pinputRegisters_sub+181))<<8)|((int)cal_thdi_cl[6]);
    *(pinputRegisters_sub+182)=cal_thdi_cl[7];
    *(pinputRegisters_sub+182)=((*(pinputRegisters_sub+182))<<8)|((int)cal_thdi_cl[8]);
    *(pinputRegisters_sub+183)=cal_thdi_cl[9];
    *(pinputRegisters_sub+183)=((*(pinputRegisters_sub+183))<<8)|((int)cal_thdi_cl[10]);
    *(pinputRegisters_sub+184)=cal_thdi_cl[11];
    *(pinputRegisters_sub+184)=((*(pinputRegisters_sub+184))<<8)|((int)cal_thdi_cl[12]);
    *(pinputRegisters_sub+185)=cal_thdi_cl[13];
    *(pinputRegisters_sub+185)=((*(pinputRegisters_sub+185))<<8)|((int)cal_thdi_cl[14]);
    *(pinputRegisters_sub+186)=cal_thdi_cl[15];
    *(pinputRegisters_sub+186)=((*(pinputRegisters_sub+186))<<8)|((int)cal_thdi_cl[16]);
    *(pinputRegisters_sub+187)=cal_thdi_cl[17];
    *(pinputRegisters_sub+187)=((*(pinputRegisters_sub+187))<<8)|((int)cal_thdi_cl[18]);
    *(pinputRegisters_sub+188)=cal_thdi_cl[19];
    *(pinputRegisters_sub+188)=((*(pinputRegisters_sub+188))<<8)|((int)cal_thdi_cl[21]);
    *(pinputRegisters_sub+189)=cal_thdi_cl[23];
    *(pinputRegisters_sub+189)=((*(pinputRegisters_sub+189))<<8)|((int)cal_thdi_cl[25]);
    *(pinputRegisters_sub+190)=cal_thdi_cl[27];
    *(pinputRegisters_sub+190)=((*(pinputRegisters_sub+190))<<8)|((int)cal_thdi_cl[29]);
    *(pinputRegisters_sub+191)=cal_thdi_cl[31];
    *(pinputRegisters_sub+191)=((*(pinputRegisters_sub+191))<<8)|((int)cal_thdi_cl[33]);
    *(pinputRegisters_sub+192)=cal_thdi_cl[35];
    *(pinputRegisters_sub+192)=((*(pinputRegisters_sub+192))<<8)|((int)cal_thdi_cl[37]);
    *(pinputRegisters_sub+193)=cal_thdi_cl[39];
    *(pinputRegisters_sub+193)=((*(pinputRegisters_sub+193))<<8)|((int)cal_thdi_cl[41]);
    *(pinputRegisters_sub+194)=cal_thdi_cl[43];
    *(pinputRegisters_sub+194)=((*(pinputRegisters_sub+194))<<8)|((int)cal_thdi_cl[45]);
    *(pinputRegisters_sub+195)=cal_thdi_cl[47];
    *(pinputRegisters_sub+195)=((*(pinputRegisters_sub+195))<<8)|((int)cal_thdi_cl[49]);
    //A相电压各次谐波含量
    *(pinputRegisters_sub+196)=cal_thdu_a[1];
    *(pinputRegisters_sub+196)=((*(pinputRegisters_sub+196))<<8)|((int)cal_thdu_a[2]);
    *(pinputRegisters_sub+197)=cal_thdu_a[3];
    *(pinputRegisters_sub+197)=((*(pinputRegisters_sub+197))<<8)|((int)cal_thdu_a[4]);
    *(pinputRegisters_sub+198)=cal_thdu_a[5];
    *(pinputRegisters_sub+198)=((*(pinputRegisters_sub+198))<<8)|((int)cal_thdu_a[6]);
    *(pinputRegisters_sub+199)=cal_thdu_a[7];
    *(pinputRegisters_sub+199)=((*(pinputRegisters_sub+199))<<8)|((int)cal_thdu_a[8]);
    *(pinputRegisters_sub+200)=cal_thdu_a[9];
    *(pinputRegisters_sub+200)=((*(pinputRegisters_sub+200))<<8)|((int)cal_thdu_a[10]);
    *(pinputRegisters_sub+201)=cal_thdu_a[11];
    *(pinputRegisters_sub+201)=((*(pinputRegisters_sub+201))<<8)|((int)cal_thdu_a[12]);
    *(pinputRegisters_sub+202)=cal_thdu_a[13];
    *(pinputRegisters_sub+202)=((*(pinputRegisters_sub+202))<<8)|((int)cal_thdu_a[14]);
    *(pinputRegisters_sub+203)=cal_thdu_a[15];
    *(pinputRegisters_sub+203)=((*(pinputRegisters_sub+203))<<8)|((int)cal_thdu_a[16]);
    *(pinputRegisters_sub+204)=cal_thdu_a[17];
    *(pinputRegisters_sub+204)=((*(pinputRegisters_sub+204))<<8)|((int)cal_thdu_a[18]);
    *(pinputRegisters_sub+205)=cal_thdu_a[19];
    *(pinputRegisters_sub+205)=((*(pinputRegisters_sub+205))<<8)|((int)cal_thdu_a[21]);
    *(pinputRegisters_sub+206)=cal_thdu_a[23];
    *(pinputRegisters_sub+206)=((*(pinputRegisters_sub+206))<<8)|((int)cal_thdu_a[25]);
    *(pinputRegisters_sub+207)=cal_thdu_a[27];
    *(pinputRegisters_sub+207)=((*(pinputRegisters_sub+207))<<8)|((int)cal_thdu_a[29]);
    *(pinputRegisters_sub+208)=cal_thdu_a[31];
    *(pinputRegisters_sub+208)=((*(pinputRegisters_sub+208))<<8)|((int)cal_thdu_a[33]);
    *(pinputRegisters_sub+209)=cal_thdu_a[35];
    *(pinputRegisters_sub+209)=((*(pinputRegisters_sub+209))<<8)|((int)cal_thdu_a[37]);
    *(pinputRegisters_sub+210)=cal_thdu_a[39];
    *(pinputRegisters_sub+210)=((*(pinputRegisters_sub+210))<<8)|((int)cal_thdu_a[41]);
    *(pinputRegisters_sub+211)=cal_thdu_a[43];
    *(pinputRegisters_sub+211)=((*(pinputRegisters_sub+211))<<8)|((int)cal_thdu_a[45]);
    *(pinputRegisters_sub+212)=cal_thdu_a[47];
    *(pinputRegisters_sub+212)=((*(pinputRegisters_sub+212))<<8)|((int)cal_thdu_a[49]);
    //B相电压各次谐波含量
    *(pinputRegisters_sub+213)=cal_thdu_b[1];
    *(pinputRegisters_sub+213)=((*(pinputRegisters_sub+213))<<8)|((int)cal_thdu_b[2]);
    *(pinputRegisters_sub+214)=cal_thdu_b[3];
    *(pinputRegisters_sub+214)=((*(pinputRegisters_sub+214))<<8)|((int)cal_thdu_b[4]);
    *(pinputRegisters_sub+215)=cal_thdu_b[5];
    *(pinputRegisters_sub+215)=((*(pinputRegisters_sub+215))<<8)|((int)cal_thdu_b[6]);
    *(pinputRegisters_sub+216)=cal_thdu_b[7];
    *(pinputRegisters_sub+216)=((*(pinputRegisters_sub+216))<<8)|((int)cal_thdu_b[8]);
    *(pinputRegisters_sub+217)=cal_thdu_b[9];
    *(pinputRegisters_sub+217)=((*(pinputRegisters_sub+217))<<8)|((int)cal_thdu_b[10]);
    *(pinputRegisters_sub+218)=cal_thdu_b[11];
    *(pinputRegisters_sub+218)=((*(pinputRegisters_sub+218))<<8)|((int)cal_thdu_b[12]);
    *(pinputRegisters_sub+219)=cal_thdu_b[13];
    *(pinputRegisters_sub+219)=((*(pinputRegisters_sub+219))<<8)|((int)cal_thdu_b[14]);
    *(pinputRegisters_sub+220)=cal_thdu_b[15];
    *(pinputRegisters_sub+220)=((*(pinputRegisters_sub+220))<<8)|((int)cal_thdu_b[16]);
    *(pinputRegisters_sub+221)=cal_thdu_b[17];
    *(pinputRegisters_sub+221)=((*(pinputRegisters_sub+221))<<8)|((int)cal_thdu_b[18]);
    *(pinputRegisters_sub+222)=cal_thdu_b[19];
    *(pinputRegisters_sub+222)=((*(pinputRegisters_sub+222))<<8)|((int)cal_thdu_b[21]);
    *(pinputRegisters_sub+223)=cal_thdu_b[23];
    *(pinputRegisters_sub+223)=((*(pinputRegisters_sub+223))<<8)|((int)cal_thdu_b[25]);
    *(pinputRegisters_sub+224)=cal_thdu_b[27];
    *(pinputRegisters_sub+224)=((*(pinputRegisters_sub+224))<<8)|((int)cal_thdu_b[29]);
    *(pinputRegisters_sub+225)=cal_thdu_b[31];
    *(pinputRegisters_sub+225)=((*(pinputRegisters_sub+225))<<8)|((int)cal_thdu_b[33]);
    *(pinputRegisters_sub+226)=cal_thdu_b[35];
    *(pinputRegisters_sub+226)=((*(pinputRegisters_sub+226))<<8)|((int)cal_thdu_b[37]);
    *(pinputRegisters_sub+227)=cal_thdu_b[39];
    *(pinputRegisters_sub+227)=((*(pinputRegisters_sub+227))<<8)|((int)cal_thdu_b[41]);
    *(pinputRegisters_sub+228)=cal_thdu_b[43];
    *(pinputRegisters_sub+228)=((*(pinputRegisters_sub+228))<<8)|((int)cal_thdu_b[45]);
    *(pinputRegisters_sub+229)=cal_thdu_b[47];
    *(pinputRegisters_sub+229)=((*(pinputRegisters_sub+229))<<8)|((int)cal_thdu_b[49]);
    //C相电压各次谐波含量
    *(pinputRegisters_sub+230)=cal_thdi_cl[1];
    *(pinputRegisters_sub+230)=((*(pinputRegisters_sub+230))<<8)|((int)cal_thdi_cl[2]);
    *(pinputRegisters_sub+231)=cal_thdi_cl[3];
    *(pinputRegisters_sub+231)=((*(pinputRegisters_sub+231))<<8)|((int)cal_thdi_cl[4]);
    *(pinputRegisters_sub+232)=cal_thdi_cl[5];
    *(pinputRegisters_sub+232)=((*(pinputRegisters_sub+232))<<8)|((int)cal_thdi_cl[6]);
    *(pinputRegisters_sub+233)=cal_thdi_cl[7];
    *(pinputRegisters_sub+233)=((*(pinputRegisters_sub+233))<<8)|((int)cal_thdi_cl[8]);
    *(pinputRegisters_sub+234)=cal_thdi_cl[9];
    *(pinputRegisters_sub+234)=((*(pinputRegisters_sub+234))<<8)|((int)cal_thdi_cl[10]);
    *(pinputRegisters_sub+235)=cal_thdi_cl[11];
    *(pinputRegisters_sub+235)=((*(pinputRegisters_sub+235))<<8)|((int)cal_thdi_cl[12]);
    *(pinputRegisters_sub+236)=cal_thdi_cl[13];
    *(pinputRegisters_sub+236)=((*(pinputRegisters_sub+236))<<8)|((int)cal_thdi_cl[14]);
    *(pinputRegisters_sub+237)=cal_thdi_cl[15];
    *(pinputRegisters_sub+237)=((*(pinputRegisters_sub+237))<<8)|((int)cal_thdi_cl[16]);
    *(pinputRegisters_sub+238)=cal_thdi_cl[17];
    *(pinputRegisters_sub+238)=((*(pinputRegisters_sub+238))<<8)|((int)cal_thdi_cl[18]);
    *(pinputRegisters_sub+239)=cal_thdi_cl[19];
    *(pinputRegisters_sub+239)=((*(pinputRegisters_sub+239))<<8)|((int)cal_thdi_cl[21]);
    *(pinputRegisters_sub+240)=cal_thdi_cl[23];
    *(pinputRegisters_sub+240)=((*(pinputRegisters_sub+240))<<8)|((int)cal_thdi_cl[25]);
    *(pinputRegisters_sub+241)=cal_thdi_cl[27];
    *(pinputRegisters_sub+241)=((*(pinputRegisters_sub+241))<<8)|((int)cal_thdi_cl[29]);
    *(pinputRegisters_sub+242)=cal_thdi_cl[31];
    *(pinputRegisters_sub+242)=((*(pinputRegisters_sub+242))<<8)|((int)cal_thdi_cl[33]);
    *(pinputRegisters_sub+243)=cal_thdi_cl[35];
    *(pinputRegisters_sub+243)=((*(pinputRegisters_sub+243))<<8)|((int)cal_thdi_cl[37]);
    *(pinputRegisters_sub+244)=cal_thdi_cl[39];
    *(pinputRegisters_sub+244)=((*(pinputRegisters_sub+244))<<8)|((int)cal_thdi_cl[41]);
    *(pinputRegisters_sub+245)=cal_thdi_cl[43];
    *(pinputRegisters_sub+245)=((*(pinputRegisters_sub+245))<<8)|((int)cal_thdi_cl[45]);
    *(pinputRegisters_sub+246)=cal_thdi_cl[47];
    *(pinputRegisters_sub+246)=((*(pinputRegisters_sub+246))<<8)|((int)cal_thdi_cl[49]);

//    memset(public_struc_modbus.rdata,0,sizeof(public_struc_modbus.rdata));          //初始化寄存器并分配空间
}

uint32_t floatToIEEE754_H(float value)
{
    // Use a union to interpret the float as a 32-bit integer
    union {
        float f;
        uint32_t u;
    } converter;
    converter.f = value; // Assign the float value to the union
    return converter.u>>16;  // Return the 32-bit integer representation
}

uint32_t floatToIEEE754_L(float value)
{
    // Use a union to interpret the float as a 32-bit integer
    union {
        float f;
        uint32_t u;
    } converter;

    converter.f = value; // Assign the float value to the union
    return converter.u;  // Return the 32-bit integer representation
}

//float ieee754ToFloat(uint32_t ieee)
//{
//    // Extract the sign bit (1 bit)
//    int sign = (ieee >> 31) & 1;
//
//    // Extract the exponent (8 bits)
//    int exponent = (ieee >> 23) & 0xFF;
//
//    // Extract the mantissa (23 bits)
//    uint32_t mantissa = ieee & 0x7FFFFF;
//
//    // Handle special cases
//    if (exponent == 255) {
//        if (mantissa == 0) {
//            return sign ? -INFINITY : INFINITY; // Infinity
//        } else {
//            return NAN; // Not a Number (NaN)
//        }
//    } else if (exponent == 0) {
//        // Denormalized numbers (exponent = 0)
//        float result = (mantissa / (float)(1 << 23)) * pow(2, -126);
//        return sign ? -result : result;
//    }
//
//    // Normalized numbers
//    float result = (1 + (mantissa / (float)(1 << 23))) * pow(2, exponent - 127);
//    return sign ? -result : result;
//}

上面源程序中:定义了SCIC 控制字初始化函数,收发中断函数,CRC16校验函数,收发处理函数。数据传送接收赋值函数。 

sys_XXX 等变量是接收数据(从上位机MODBUS Master下发下来的数据)

cal_XXX 等变量是发送数据(发送给上位机MODBUS Master的数据)

注:程序中IEEE754是用于处理32位浮点数的函数,如果有兴趣额可以放开自己试一下

3、如何在主函数中调用。

#include "PeripheralHeaderIncludes.h" //TI公司标准头文件
#include "DSP2833x_Project.h"    //
#include "string.h"       //用于清零数组
#include <EUCO_MODBUS.h>  //包含MODBUS协议头文件
//##################################################################################//

void main(void) //主函数入口
{
//  Step 1. Initialize System Control:PLL, WatchDog, enable Peripheral Clocks;
//  This example function is found in the DSP2833x_SysCtrl.c file.
    InitSysCtrl();      //系统控制初始化

//  This example function is found in the HVPM_Sensorless-DevInit_F2833x.c file.
    DeviceInit();       //设备初始化 30M 5倍频150M赫兹

    #ifdef FLASH
    memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,&RamfuncsLoadEnd-&RamfuncsLoadStart);   //将执行代码从RAM中拷贝到FLASH中,下次上电后从FLASH加载程序并运行
    #endif

    InitFlash();     //初始化DSP片内闪存 (掉电再上电可运行)

    DELAY_US(5000);  //延迟5ms完成程序装载, 函数包含在DSP2833x_usDelay.asm

//  Step 2. Initialize GPIO: This example function is found in the DSP2833x_Gpio.c file;
//  and illustrates how to set the GPIO to it's default state.
    InitGpio();      //系统应用的GPIO口初始化 DSP2833x_Gpio.c

// Step 3. Clear all interrupts and initialize PIE vector table: Disable CPU interrupts
    DINT;            //清除所有中断初始化中断向量表: 禁止CPU全局中断

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
    InitPieCtrl();  
// 初始化PIE中断向量表,并使其指向中断服务子程序(ISR) 这个函数放在了DSP2833x_PieVect.c源文件里面.
// 中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
// Disable CPU interrupts and clear all CPU interrupt flags:
    IER = 0x0000;                                                                   // 中断使能寄存器 禁止CPU中断和清除所有CPU中断标志
    IFR = 0x0000;                                                                   // 中断标志寄存器 禁止CPU中断和清除所有CPU中断标志

// Initialize the PIE vector table with pointers to the shell Interrupt Service Routines (ISR).
// This will populate the entire table, even if the interrupt is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
    InitPieVectTable();                                                             
// PIE 向量表指针指向中断服务程(ISR)完成其初始化. 即使在程序里不需要使用中断功能,也要对 PIE 向量表进行初始化.这样做是为了避免PIE引起的错误.

SCIC_Modbus_Init(); //P3 初始化SCICMODBUS控制寄存器及数据寄存器初始化 该函数在MODBUS.c中


for(;;)//主循环开始
{

        DATA_TRANSFER_DSP_HMI(); // 用于循环接收发送 MODBUS 数据, 该函数在MODBUS.c中

}
}

行了,先写到这里。 反正测试可以用,并且利用昆仑通态和显控科技的屏幕都还行。 以昆仑通态截屏为例:

输入寄存器:

保持寄存器

屏幕发下来给DSP的数据,看看,还能对上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值