📄 03.c
字号:
void readregister(void)//功能码3,读取保持寄存器的值
{
unsigned char j=0;
unsigned short m;
unsigned short li=0;
unsigned char *p;
unsigned char k=0;
//k=2*(rxbuf[3]+rxbuf[5]-0x40)-1;
txbuf[0]=rxbuf[0];
txbuf[1]=rxbuf[1];
txbuf[2]=rxbuf[5]; //?
li=(rxbuf[2]<<8)+rxbuf[3]-40000;
li=li/100;
switch(li)
{
case 0:
k=2*(rxbuf[3]+rxbuf[5]-0x40)-1;
// p=(unsigned char *)&SPI.dqdatatime.lowsecond;
p=(unsigned char *)&SPI.I[0];
for(m=2*(rxbuf[3]-0x40);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 1:
k=2*(rxbuf[3]+rxbuf[5]-0xA4)-1;
p=(unsigned char *)&myMAXMIN.imaxmin[0][0];
for(m=2*(rxbuf[3]-0xA4);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 2:
k=2*(rxbuf[3]+rxbuf[5]-0x08)-1;
p=(unsigned char *)&myNeed.NEEDI[0];
for(m=2*(rxbuf[3]-0x08);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 3: //最大最小值MODBUS寄存器
k=2*(rxbuf[3]+rxbuf[5]-0x6C)-1;
p=(unsigned char *)&myXIEBO.uhwave[0][0];
for(m=2*(rxbuf[3]-0x6C);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 4: //时间MODBUS寄存器
k=2*(rxbuf[3]+rxbuf[5]-0xD0)-1;
p=(unsigned char *)&mytime.tmimaxmin[0][0];
for(m=2*(rxbuf[3]-0xD0);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 5:
if(rxbuf[3]<0x3e)
{
k=2*(rxbuf[3]+rxbuf[5]-0x34)-1;
m=2*(rxbuf[3]-0x34);
p=(unsigned char *)&rel;
}
else
{ k=2*(rxbuf[3]+rxbuf[5]-0x3e)-1;
m=2*(rxbuf[3]-0x3e);
p=(unsigned char *)&Fixedvalue.alarm[0];
}
for(;m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 6:
k=2*(rxbuf[3]+rxbuf[5]-0x98)-1;
p=(unsigned char *)&againfee.timenumber;
for(m=2*(rxbuf[3]-0x98);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 10:
k=2*(rxbuf[3]+rxbuf[5]-0x28)-1;
p=(unsigned char *)&eventnote.UNIXti;
for(m=2*(rxbuf[3]-0x28);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 20:
k=2*(rxbuf[3]+rxbuf[5]-0x10)-1;
p=(unsigned char *)&systemsetup;
for(m=2*(rxbuf[3]-0x10);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 21:
k=2*(rxbuf[3]+rxbuf[5]-0x74)-1;
p=(unsigned char *)&systemsetup1;
for(m=2*(rxbuf[3]-0x74);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
case 22://模拟输入量未编
k=2*(rxbuf[3]+rxbuf[5]-0xD8)-1;
p=(unsigned char *)&systemsetup1;
for(m=2*(rxbuf[3]-0xD8);m<k;m=m+2)
{
txbuf[4+j]=*(p+m+1);
txbuf[3+j]=*(p+m);
j=j+2;
}
break;
default:
answernum=0x03;
exceptionalanswer();
break;
}
if(answernum==0x00)
{
T16=crc16(txbuf,2*rxbuf[5]+3);
high8=T16 >> 8;
low8=T16 & 0xff;
txbuf[2*rxbuf[5]+3]=high8;
txbuf[2*rxbuf[5]+4]=low8;
P3OUT |= BIT7;
i=0; //P1.1为高电平为发送模式
do
{
// while((IFG1 & UTXIFG0) == 0)
TXBUF1=txbuf[i];
while((IFG2 & UTXIFG1) == 0) // USART0 TX buffer ready?
{
_NOP();
}
i++;
}while(i<=(2*rxbuf[5]+4));
}
flag.transfer_ok=TRUE;
i=0;
answernum=0x00;
for(i=0;i<140;i++)
{
rxbuf[i]=0;
txbuf[i]=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -