?? rscomm.c
字號:
#include <msp430x42x.h>
#include <string.h>
#include "inc\Port.h"
#include "inc\Common.h"
#include "inc\Type.h"
#include "inc\Interrupt.h"
#include "inc\General.h"
#include "inc\Mem.h"
#include "inc\Data.h"
#include "CDdata.c"
/*****************************************************************
判斷是否是廣播操作 99999999
*****************************************************************/
int Addr_9_9( void )
{
char i;
for( i=2; i<6; i++ )
if( Comm.Buf[i] != 0x99 ) return -1;
return 0;
}
/*****************************************************************
判斷是否為非法表號00000000
*****************************************************************/
int Addr_0_0( void )
{
char i;
for( i=2; i<6; i++ )
if( Comm.Buf[i] != 0x00 ) return -1;
return 0;
}
/*****************************************************************
Get Communication Variable 獲取DI0,DI1對應的數據地址和長度
*****************************************************************/
int GetComVar( int* Addr, int* Info )
{
int i, Tmp;
Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL; //D10,D11
for( i = 0 ; i < CommNum ; i++ )
if( Tmp == ComTab[i].ComID )
{
*Addr = (int)ComTab[i].Addr;
*Info = ComTab[i++].ComInfo;
return 0;
}
return -1;
}
/*****************************************************************
Read Data to
*****************************************************************/
unsigned char Com_Read(void)
{
int Addr, Info,Tmp;
char Len,MemType,EventNum,Total;
unsigned char Err_Byte=0;
Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL;
if( GetComVar( &Addr, &Info ) == -1 ) //數據標識錯
{
Err_Byte |= RS_State_IVID;
return Err_Byte;
}
if( ( Info & EN_R ) == 0 ) //權限不夠,不可讀
{
Err_Byte |= RS_State_RgtE;
return Err_Byte;
}
switch( Tmp )
{
case 0x7010: //事件記錄
case 0x7020:
case 0x7030:
case 0x7040:
case 0x7050:
case 0x7060:
case 0x7070:
case 0x7080:
case 0x7090:
Len = Info & RS_LEN;
MemType = (Info>>6)&0x07;
MEM_Read( (char*)&Total, (long)Addr+1, 1, MemType );
if( Total==0 )
{
memset( (char*)&Comm.Buf[15], 0xFF, Len );
}
if( Total==1 )
{
E2P_Read( (char*)&EventNum, (long)Addr, 1 );
if( EventNum==0 ) EventNum=19;
else EventNum-=1;
TempAddr=(long)Addr+EventNum*Len/2+2;
AT24C_Read( &Comm.Buf[15],TempAddr,Len/2 );
memset( (char*)&Comm.Buf[15+Len/2], 0xFF, Len/2 );
}
if( Total>1)
{
E2P_Read( (char*)&EventNum, (long)Addr, 1 );
if( EventNum<2 ) EventNum+=20;
EventNum-=2;
TempAddr=(long)Addr+EventNum*Len/2+2;
AT24C_Read( &Comm.Buf[15],TempAddr,Len );
}
break;
case 0xC330:
case 0xC340:
case 0xC350:
case 0xC360:
case 0xC370:
case 0xC380:
case 0xC390:
case 0xC320:
case 0xC410:
E2P_Read( (char*)&Len,(long)Addr+22,1);
if( Len > MaxSeg ) Len = MaxSeg;
Len = 2*Len;
AT24C_Read( &Comm.Buf[15], (long)Addr, Len );
break;
case 0xC41E:
E2P_Read( (char*)&Len,SeasNum,1);
if( Len > MaxSeg ) Len = MaxSeg;
Len = Len+1;
AT24C_Read( &Comm.Buf[15], (long)Addr, Len );
Comm.Buf[15] &=0x7F;
break;
case 0xC035: //繼電器操作 需要密碼支持的命令 relay operation
Len = Info & RS_LEN;
if( P1IN & P_RelayAsk )
Comm.Buf[15]=0x5F;
else
Comm.Buf[15]=0x50;
break;
case 0xA000: // read all parameters
Len = Info & RS_LEN;
FRAM_Read( (char*)&Comm.Buf[15], EC_Pp0,20);
memcpy( (char*)&Comm.Buf[35], Energy.Real_VRMS,2);
memcpy( (char*)&Comm.Buf[37], Clk.Sec,7);
E2P_Read( (char*)&Comm.Buf[44], LatchEvents,1);
if( P1IN & P_RelayAsk )
Comm.Buf[45]=0x5F;
else
Comm.Buf[45]=0x50;
break;
default:
Len = Info & RS_LEN;
MemType = (Info>>6)&0x07;
MEM_Read( &Comm.Buf[15], (long)Addr, Len, MemType );
break;
}
Rs_Len = 7+Len;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[10], &Buffer, 4 );
Comm.Buf[14]=Flag.Meter;
return Err_Byte;
}
/*****************************************************************
write data into meter
*****************************************************************/
unsigned char Com_Write(void)
{
int Addr, Info,Tmp;
char MemType,Len;
unsigned char Err_Byte=0;
Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL;
if( GetComVar( &Addr, &Info ) == -1 ) //數據標識錯
{
Err_Byte |= RS_State_IVID;
return Err_Byte;
}
if( ( Info & EN_W ) == 0 ) //權限不夠,不可寫
{
Err_Byte |= RS_State_RgtE;
return Err_Byte;
}
FRAM_Read( (char*)&Buffer[0],Meter_Pass,4);
if( memcmp( &Comm.Buf[14], Buffer, 4 ) != 0 )
{
Err_Byte |= RS_State_PswE;
return Err_Byte;
}
switch( Tmp )
{
case 0xC035: //繼電器操作 需要密碼支持的命令
if( Comm.Buf[18]==0x50 ) Flag.Relay |= F_Off;
if( Comm.Buf[18]==0x5F ) Flag.Relay |= F_On;
break;
case 0xC330:
case 0xC340:
case 0xC350:
case 0xC360:
case 0xC370:
case 0xC380:
case 0xC390:
case 0xC320:
case 0xC410:
Len = Rs_Len-10;
if( Len>20 ) Len=20;
AT24C_Read( (char*)&Buffer[0],Addr,20);
memcpy( (char*)&Buffer[0],(char*)&Comm.Buf[18],Len);
MEM_DBWrite( Addr, (char*)&Buffer[0], 20,Mem_E2PROM);
Len = Len/2;
E2P_Write( Addr+22, (char*)&Len, 1);
E2P_Write( Addr+E2PROMBAK+22, (char*)&Len, 1);
break;
case 0xC41E:
Len = Info & RS_LEN;
MEM_DBWrite( Addr, (char*)&Comm.Buf[18], 11,Mem_E2PROM);
break;
case 0xC011: //Soft Time
MEM_DBWrite( Addr, (char*)&Comm.Buf[18], 7 ,Mem_FRAM); //FRAM
memcpy( (char*)&Clk.Sec[0], (char*)&Comm.Buf[18], 7); //RAM
break;
default:
Len = Info & RS_LEN;
MemType = (Info>>6)&0x07;
MEM_DBWrite( Addr, &Comm.Buf[18], Len ,MemType);
break;
}
Rs_Len = 5;
memcpy( (char*)&Buffer, &Rs_Addr0, 4 );
memcpy( (char*)&Rs_Addr0, &Comm.Buf[10], 4 );
memcpy( (char*)&Comm.Buf[8], &Buffer, 4 );
Comm.Buf[12]=Flag.Meter;
return Err_Byte;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -