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