微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机的MODBUS C语言程序(从机)

51单片机的MODBUS C语言程序(从机)

时间:11-28 来源:互联网 点击:

{

case 1://读取线圈状态(读取点 16位以内)

case 3://读取保持寄存器(一个或多个)

case 5://强制单个线圈

case 6://设置单个寄存器

if(receCount >= 8)

{//接收完成一组数据

//应该关闭接收中断

if(receBuf[0]==localAddr && checkoutError==0)

{

crcData = crc16(receBuf,6);

if(crcData == receBuf[7]+(receBuf[6]<8))

{//校验正确

if(receBuf[1] == 1)

{//读取线圈状态(读取点 16位以内)

readCoil();

}

else if(receBuf[1] == 3)

{//读取保持寄存器(一个或多个)

readRegisters();

}

else if(receBuf[1] == 5)

{//强制单个线圈

forceSingleCoil();

}

else if(receBuf[1] == 6)

{

//presetSingleRegister();

}

}

}

receCount = 0;

checkoutError = 0;

}

break;

case 15://设置多个线圈

tempData = receBuf[6];

tempData += 9; //数据个数

if(receCount >= tempData)

{

if(receBuf[0]==localAddr && checkoutError==0)

{

crcData = crc16(receBuf,tempData-2);

if(crcData == (receBuf[tempData-2]<8)+ receBuf[tempData-1])

{

//forceMultipleCoils();

}

}

receCount = 0;

checkoutError = 0;

}

break;

case 16://设置多个寄存器

tempData = (receBuf[4]<8) + receBuf[5];

tempData = tempData // 2; //数据个数

tempData += 9;

if(receCount >= tempData)

{

if(receBuf[0]==localAddr && checkoutError==0)

{

crcData = crc16(receBuf,tempData-2);

if(crcData == (receBuf[tempData-2]<8)+ receBuf[tempData-1])

{

presetMultipleRegisters();

}

}

receCount = 0;

checkoutError = 0;

}

break;

default:

break;

}

}

}//void checkComm0(void)

//取线圈状态 返回0表示成功

uint16 getCoilVal(uint16 addr,uint16 //tempData)

{

uint16 result = 0;

uint16 tempAddr;

tempAddr = addr & 0xfff;

//只取低8位地址

switch(tempAddr & 0xff)

{

case 0:

break;

case 1:

//tempData = testCoil;

break;

case 2:

break;

case 3:

break;

case 4:

break;

case 5:

break;

case 6:

break;

case 7:

break;

case 8:

break;

case 9:

break;

case 10:

break;

case 11:

break;

case 12:

break;

case 13:

break;

case 14:

break;

case 15:

break;

case 16:

break;

default:

break;

}

return result;

}//uint16 getCoilVal(uint16 addr,uint16 //data)

//设定线圈状态 返回0表示成功

uint16 setCoilVal(uint16 addr,uint16 tempData)

{

uint16 result = 0;

uint16 tempAddr;

tempAddr = addr & 0xfff;

switch(tempAddr & 0xff)

{

case 0:

break;

case 1:

testCoil = tempData;

break;

case 2:

break;

case 3:

break;

case 4:

break;

case 5:

break;

case 6:

break;

case 7:

break;

case 8:

break;

case 9:

break;

case 10:

break;

case 11:

break;

case 12:

break;

case 13:

break;

case 14:

break;

case 15:

break;

case 16:

break;

default:

break;

}

return result;

}//uint16 setCoilVal(uint16 addr,uint16 data)

//取寄存器值 返回0表示成功

uint16 getRegisterVal(uint16 addr,uint16 //tempData)

{

uint16 result = 0;

uint16 tempAddr;

tempAddr = addr & 0xfff;

switch(tempAddr & 0xff)

{

case 0:

break;

case 1:

break;

case 2:

break;

case 3:

break;

case 4:

break;

case 5:

break;

case 6:

break;

case 7:

break;

case 8:

break;

case 9:

break;

case 10:

break;

case 11:

break;

case 12:

break;

case 13:

break;

case 14:

break;

case 15:

break;

case 16:

//tempData = testRegister;

break;

default:

break;

}

return result;

}//uint16 getRegisterVal(uint16 addr,uint16 &data)

//设置寄存器值 返回0表示成功

uint16 setRegisterVal(uint16 addr,uint16 tempData)

{

uint16 result = 0;

uint16 tempAddr;

tempAddr = addr & 0xfff;

switch(tempAddr & 0xff)

{

case 0:

break;

case 1:

break;

case 2:

break;

case 3:

break;

case 4:

break;

case 5:

break;

case 6:

break;

case 7:

break;

case 8:

break;

case 9:

break;

case 10:

break;

case 11:

break;

case 12:

break;

case 13:

break;

case 14:

break;

case 15:

break;

case 16:

testRegister = tempData;

break;

default:

break;

}

return result;

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top