|
发表于 2013-12-10 16:43:48
|
显示全部楼层
/*CRC ¸ßλ×Ö½ÚÖµ±í*/
const unsigned int auchCRCHi[] = {
0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,
0x8041, 0x00C1, 0x8140, 0x01C0, 0x8041,
0x00C1, 0x8140, 0x00C1, 0x8140, 0x01C0,
0x8041, 0x01C0, 0x8041, 0x00C1, 0x8140,
0x00C1, 0x8140, 0x01C0, 0x8041, 0x00C1,
0x8140, 0x01C0, 0x8041, 0x01C0, 0x8041,
0x00C1, 0x8140, 0x01C0, 0x8041, 0x00C1,
0x8140, 0x00C1, 0x8140, 0x01C0, 0x8041,
0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,
0x8041, 0x00C1, 0x8140, 0x00C1, 0x8140,
0x01C0, 0x8041, 0x01C0, 0x8041, 0x00C1,
0x8140, 0x01C0, 0x8041, 0x00C1, 0x8140,
0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,
0x8041, 0x00C1, 0x8140, 0x00C1, 0x8140,
0x01C0, 0x8041, 0x00C1, 0x8140, 0x01C0,
0x8041, 0x01C0, 0x8041, 0x00C1, 0x8140,
0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,
0x8041, 0x00C1, 0x8140, 0x01C0, 0x8041,
0x00C1, 0x8140, 0x00C1, 0x8140, 0x01C0,
0x8041, 0x00C1, 0x8140, 0x01C0, 0x8041,
0x01C0, 0x8041, 0x00C1, 0x8140, 0x01C0,
0x8041, 0x00C1, 0x8140, 0x00C1, 0x8140,
0x01C0, 0x8041, 0x01C0, 0x8041, 0x00C1,
0x8140, 0x00C1, 0x8140, 0x01C0, 0x8041,
0x00C1, 0x8140, 0x01C0, 0x8041, 0x01C0,
0x8041, 0x00C1, 0x8140
} ;
/*CRCµÍλ×Ö½ÚÖµ±í*/
const unsigned int auchCRCLo[] = {
0x00C0, 0xC101, 0xC303, 0x02C2, 0xC606,
0x07C7, 0x05C5, 0xC404, 0xCC0C, 0x0DCD,
0x0FCF, 0xCE0E, 0x0ACA, 0xCB0B, 0xC909,
0x08C8, 0xD818, 0x19D9, 0x1BDB, 0xDA1A,
0x1EDE, 0xDF1F, 0xDD1D, 0x1CDC, 0x14D4,
0xD515, 0xD717, 0x16D6, 0xD212, 0x13D3,
0x11D1, 0xD010, 0xF030, 0x31F1, 0x33F3,
0xF232, 0x36F6, 0xF737, 0xF535, 0x34F4,
0x3CFC, 0xFD3D, 0xFF3F, 0x3EFE, 0xFA3A,
0x3BFB, 0x39F9, 0xF838, 0x28E8, 0xE929,
0xEB2B, 0x2AEA, 0xEE2E, 0x2FEF, 0x2DED,
0xEC2C, 0xE424, 0x25E5, 0x27E7, 0xE626,
0x22E2, 0xE323, 0xE121, 0x20E0, 0xA060,
0x61A1, 0x63A3, 0xA262, 0x66A6, 0xA767,
0xA565, 0x64A4, 0x6CAC, 0xAD6D, 0xAF6F,
0x6EAE, 0xAA6A, 0x6BAB, 0x69A9, 0xA868,
0x78B8, 0xB979, 0xBB7B, 0x7ABA, 0xBE7E,
0x7FBF, 0x7DBD, 0xBC7C, 0xB474, 0x75B5,
0x77B7, 0xB676, 0x72B2, 0xB373, 0xB171,
0x70B0, 0x5090, 0x9151, 0x9353, 0x5292,
0x9656, 0x5797, 0x5595, 0x9454, 0x9C5C,
0x5D9D, 0x5F9F, 0x9E5E, 0x5A9A, 0x9B5B,
0x9959, 0x5898, 0x8848, 0x4989, 0x4B8B,
0x8A4A, 0x4E8E, 0x8F4F, 0x8D4D, 0x4C8C,
0x4484, 0x8545, 0x8747, 0x4686, 0x8242,
0x4383, 0x4181, 0x8040
};
//const Uint16 bd_485_delay[]={26667,13333,6667,3333,1666,833,417};//ÑÓʱ1¸ö×Ö·ûʱÏÞ
const Uint16 bd_485_delay[]={36667,18333,9167,4583,2292,1146,573};//ÑÓʱ1¸ö×Ö·ûʱÏÞ
void GetSoe(Uint16 no);
//-------------------------------------------------------------------
//
//ModbusÍøÂçÐÒé×Ó³ÌÐò
//
//CRCУÑ麯Êý
Uint16 CRC16(Uchar * p_crc_msg, Uint16 crc_len)
{
unsigned char crc_lo=0xff;
unsigned char crc_hi=0xff;
unsigned char crc_index;
unsigned int crc_value;
while(crc_len--)
{
crc_index=crc_hi^((*p_crc_msg++)&0xff);//080409crc_index=crc_hi^*p_crc_msg++;
//crc_hi=crc_lo^auchCRCHi[crc_index];
//crc_lo=auchCRCLo[crc_index];
if(crc_index==crc_index/2*2)
{//żÊýλȡÆä¸ß×Ö½Ú
crc_hi=crc_lo^(auchCRCHi[crc_index/2]>>8);
crc_lo=auchCRCLo[crc_index/2]>>8;
}
else
{//ÆæÊýλȡÆäµÍ×Ö½Ú
crc_hi=crc_lo^(auchCRCHi[crc_index/2]&0xff);
crc_lo=auchCRCLo[crc_index/2]&0xff;
}
}
crc_value=crc_hi<<8|crc_lo;
return crc_value;
}
//ModbusÐÒé³õʼ»¯
void InitSerModbus(Uchar flag)
{
if(flag==0x55)//Òò±£´æ¶¨ÖµµÄÍ˳ö²»ÔÙ½øÐгõʼ»¯
return;
SerModbus.Access=0;
SerModbus.Busy=0;
SerModbus.receive_count=0;
SerModbus.send_count=0;
SerModbus.send_head=0;
SerModbus.crc_len=0;
SerModbus.enable_flag=0,
SerModbus.start_flag=0;
SerModbus.end_flag=0;
SerModbus.ck_count=0;
SerModbus.ck_point=0;
SerModbus.ck_flag=0;
SerModbus.event_report=0;
SerModbus.receive_flag=0;//½ÓÊÕÖ¡¼Æʱ
SerModbus.send_flag=0;//·¢ËÍÖ¡¼Æʱ
SerModbus.r_timer=0;//½ÓÊÕÖ¡¼Æʱ
SerModbus.s_timer=0;//·¢ËÍÖ¡¼Æʱ
/*
soe_no=0;
soe_id=0;
soe_count=0;
soe_flag=0;
*/
}
//ModbusÒì³£Ó¦´ð·µ»Ø
void ErrorResponse(Uchar err)
{//err-Òì³£Âë 1-·Ç·¨¹¦ÄÜ£¬2-·Ç·¨Êý¾ÝµØÖ·£¬3-·Ç·¨Êý¾ÝÖµ
///unsigned char com_type;
unsigned int crc_result;
SerModbus.Busy=0xff;//ÖÃͨѶ״̬æ±êÖ¾
SerModbus.send_msg[1]=SerModbus.send_msg[1]|0x80;
SerModbus.send_msg[2]=err;//Òì³£Âë
SerModbus.crc_len=3;
crc_result=CRC16((Uchar *)&SerModbus.send_msg[0],SerModbus.crc_len);
SerModbus.send_msg[3]=crc_result&0xff;
SerModbus.send_msg[4]=(crc_result>>8)&0xff;
SerModbus.send_count=SerModbus.crc_len+2;
SerModbus.s_timer=0;//·¢ËͼÇʱÇåÁã
SerModbus.send_flag=0xff;//Ö÷¢ËͱêÖ¾
//com_type=COM_SER;
//ComSendCtrl(com_type);//ͨѶ¿Ú·¢ËÍ¿ØÖÆ
ComSendCtrl(Com.port_typ);
}
//Modbus½ÓÊÕͨÐÅÖ¡¿ØÖÆ
void ModbusFrameCtrl(void)
{
Uint16 crc_result,crc_receive;
//·¢ËÍÖ¡´¦Àí
if(SerModbus.send_flag)
{
//if(SerModbus.s_timer>(Uint32)bd_485_delay[dzbd]*7*SAMPLEPOINT/20000+1)
if(SerModbus.s_timer>((Uint32)bd_485_delay[dzbd]*7*SAMPLEPOINT>>14)-1)
{//ÅжϷ¢Ëͼä¸ôÍ£¶ÙʱÏÞ´óÓÚ7×Ö·ûʱÏÞ
SerModbus.enable_flag=0;
SerModbus.send_flag=0;//·¢ËͱêÖ¾ÇåÁã
SerModbus.send_count=0;
SerModbus.send_head=0;
SerModbus.Access=0;//ÊÍ·ÅÃüÁî
SerModbus.Busy=0;
Ser.port_right=0;//ÊÍ·ÅͨѶ¿Ú
com1_reset_cnt=0;
com1_de=0;//¹Ø±Õ422·¢ËÍʹÄܶË
}
}
//½ÓÊÕÖ¡´¦Àí
if(SerModbus.receive_flag && SerModbus.start_flag)
{
//if(SerModbus.r_timer>(Uint32)bd_485_delay[dzbd]*4*SAMPLEPOINT/20000+1)
if(SerModbus.r_timer>((Uint32)bd_485_delay[dzbd]*4*SAMPLEPOINT>>14)-1)
{//ÅжϽÓÊÕ¼ä¸ôÍ£¶ÙʱÏÞ´óÓÚ3.5×Ö·ûʱÏÞ
SerModbus.start_flag=0;
SerModbus.receive_flag=0;
SerModbus.end_flag=0x55;//ÖÃÖ¡½áÊø±êÖ¾
}
}
if(SerModbus.end_flag!=0x55)
{//Ö¡½ÓÊÕ´¦Àí¹ý³ÌÖÐ
return;
}
//Ö¡½ÓÊÕÍê³É
Ser.port_right=0x55;//¿ØÖÆ´®¿ÚͨѶ¿Ú
if(SerModbus.receive_count>2)
SerModbus.crc_len=SerModbus.receive_count-2;//CRC16УÑ鳤¶È
else
SerModbus.crc_len=0;
SerModbus.receive_count=0;
SerModbus.enable_flag=0;
SerModbus.receive_flag=0;
SerModbus.start_flag=0;
SerModbus.end_flag=0;
SerModbus.send_msg[0]=dzid;
SerModbus.send_msg[1]=SerModbus.receive_msg[1];
//µØÖ·Óò½âÎö
if((SerModbus.receive_msg[0]!=dzid && SerModbus.receive_msg[0]!=0) || SerModbus.crc_len==0)
{//Ö¡½ÓÊÕ½âÎöµØÖ·Óò²»Æ¥Åä
Ser.port_right=0;
return;
}
//CRC16УÑé
crc_result=CRC16((Uchar *)&SerModbus.receive_msg[0],SerModbus.crc_len);
crc_receive=SerModbus.receive_msg[SerModbus.crc_len]*256+SerModbus.receive_msg[SerModbus.crc_len+1];
if(crc_result!=crc_receive)
{//CRCУÑé²»³É¹¦,·Ç·¨Êý¾Ý
Ser.port_right=0;
return;
}
SerModbus.Access=0xff;//УÑé³É¹¦ÖÃÃüÁîÆô¶¯±êÖ¾
}
void RemoteCtrl()//¿ª³ö¼àÊÓ¿ØÖÆ
{
Uint16* p_kc_time;
if (SerModbus.ck_flag==0 || bittst((Uint16 * )&SerModbus.event_report,0)==0)
{
return;
}
p_kc_time=(Uint16*)&dzkc1_t;
if(SerModbus.ck_point<2) SerModbus.ck_point=2;
if (SerModbus.ck_count>(*(p_kc_time+SerModbus.ck_point-2))*MACROSAMPLE_TIMES)
{
bitclr(&kc_value,SerModbus.ck_point);
SerModbus.ck_count=0;
SerModbus.ck_flag=0;
SerModbus.ck_point=0;
bitclr((Uint16 * )&SerModbus.event_report,0);
}
else
SerModbus.ck_count++;
}
//ModbusÏûÏ¢¿ØÖÆ
void SerModbusCtrl(void)
{
Uchar broad_flag,opcode,flag;
Uint16 offset,s_addr,d_num,ctrl_point,byte,id,crc_result,value,i,j,k;
Uint16* p_addr;
ModbusFrameCtrl();//MODBUSͨѶ֡¿ØÖÆ
RemoteCtrl();//¿ª³ö¼àÊÓ¿ØÖÆ
//--ÎÞ½ÓÊÕÃüÁî»òÕßͨѶæ״̬³ÌÐòÁ¢¼´·µ»Ø
if ((SerModbus.Access!=0xff || Ser.port_right!=0x55) || SerModbus.Busy==0xff)
{ //--ÎÞ½ÓÊÕÃüÁî»òÕßͨѶæ״̬³ÌÐòÁ¢¼´·µ»Ø
return;
}
SerModbus.Busy=0xff;//ÖÃͨѶ״̬æ±êÖ¾
SerModbus.send_count=0;
//com_type=Com.port_typ;
//com_type=COM_SER;
broad_flag=0;
if(SerModbus.receive_msg[0]==0)
{//¹ã²¥ÃüÁî
broad_flag=0xff;
}
opcode=SerModbus.receive_msg[1];//½âÎö¹¦ÄÜÂë
if (opcode<1 || opcode>24)
{//¹¦ÄÜÂëÒì³£
ErrorResponse(1);
return;
}
switch(opcode)
{
case 1://Read Coil Status
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 2://Read Input Status--Ò£ÐÅÁ¿
///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];
///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];
d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
j=0; while((s_addr<DigitalComm[j].start_addr || s_addr>=DigitalComm[j+1].start_addr) && j<DIGITAL_NO-1){j++;}//¼ìË÷ÆðʼµØÖ·--µØÖ··¶Î§:Start_pre<=x && x<Start_next
offset = s_addr-DigitalComm[j].start_addr;//ÆðʼµØÖ·Æ«ÒÆÁ¿
//ÕÙ»½Êý¾ÝµØÖ·¼ì²â
if (d_num<1 || ((d_num-1)>>4)+6 > MACROCOMM_S_NO)
{
ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ
return;
}
//ÏìÓ¦Êý¾ÝÖ¡
//Êý¾ÝÀàÐÍΪBYTE--8bit
SerModbus.send_msg[2]=((d_num-1)>>3)+1;//×Ö½ÚÊýÄ¿
for(i=0;i<SerModbus.send_msg[2];i++)
{
//ÏìÓ¦Êý¾ÝÇøÓòË÷Òý
/*
for(k=0;k<8;k++)
{
if (offset>=DigitalComm[j].data_num)
{
if ((offset+DigitalComm[j].start_addr)>=DigitalComm[j+1].start_addr && j<DIGITAL_NO-1)
{
offset = 0;j++;
if (bittst(DigitalComm[j].p_addr,offset))
bitset((Uint16*)&value,k);//״̬Á¿ÖÃ1
else
bitclr((Uint16*)&value,k);//״̬Á¿Çå0
}
else bitclr((Uint16*)&value,k);//״̬Á¿Çå0
}
else
{
if (bittst(DigitalComm[j].p_addr,offset))
bitset((Uint16*)&value,k);//״̬Á¿ÖÃ1
else
bitclr((Uint16*)&value,k);//״̬Á¿Çå0
}
offset++;
}
*/
if (offset>=DigitalComm[j].data_num)
{
if ((offset+DigitalComm[j].start_addr)>=DigitalComm[j+1].start_addr && j<DIGITAL_NO-1)
{
offset = 0;j++;
value = *(DigitalComm[j].p_addr+offset);
}
else value=0;//״̬Á¿Çå0
}
else
{
value = *(DigitalComm[j].p_addr+(offset>>4));
if ( ((offset>>4)<<1) != offset>>3 ) { value >>=8;}//(offset/16*2 !=offset/8) is high--8bit of 16bit
}
offset +=8;
SerModbus.send_msg[i+3]=value&0xff;
}
SerModbus.crc_len=SerModbus.send_msg[2]+3;
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 3://Read Holding Registers
///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];
///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//ÆðʼµØÖ·
d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];//Êý¾Ý¸öÊý
j=0; while((s_addr<AnalogComm[j].start_addr || s_addr>=AnalogComm[j+1].start_addr ) && j<ANALOG_NO-1){j++;}//¼ìË÷ÆðʼµØÖ·--µØÖ··¶Î§:Start_pre<=x && x<Start_next
offset = s_addr-AnalogComm[j].start_addr;
if (j>=ANALOG_NO-1)
{
j=ANALOG_NO-1;
if (s_addr>=CommSoeEventAddr && s_addr < CommSoeEventAddr+CommSoeEventNum)
{//ÕÙ»½SOE---!!!ThinkRoad special function
id=(s_addr-CommSoeEventAddr)/(MACROFAULT_BYTE>>1); offset = 0;
GetSoe(id); //soe_id:0~127
bitclr(&soe_status[0],id);//ÕÙSOE³É¹¦ÔòÇåSOE״̬±êÖ¾//080414
}
else
{
ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ
return;
}
}
//ÕÙ»½Êý¾ÝµØÖ·¼ì²â
if (d_num<1 || d_num+5>MACROCOMM_S_NO)
{
ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ
return;
}
//ÏìÓ¦Êý¾ÝÖ¡
//Êý¾ÝÀàÐÍΪWORD--16bit
SerModbus.send_msg[2]=2*d_num;
for(i=0;i<d_num;i++)
{
//ÏìÓ¦Êý¾ÝÇøÓòË÷Òý
if (offset>=AnalogComm[j].data_num)
{
if ((offset+AnalogComm[j].start_addr)>=AnalogComm[j+1].start_addr && j<ANALOG_NO-1)
{
offset = 0;j++;
value=*(AnalogComm[j].p_addr+offset);
}
else value=0;
}
else value=*(AnalogComm[j].p_addr+offset);
/*********¶¨Öµ¿ØÖÆ×ÖÂß¼±äÁ¿**********/
if ((AnalogComm[j].p_addr+offset)>=(Uint16 *)&dzkg1 && (AnalogComm[j].p_addr+offset)<((Uint16 *)&dzkg1+(MACROSETDZKG_NO<<4)) && AnalogComm[j].start_addr>=CommSetDz1Addr)//!!!¿ØÖÆ×ּĴæÆ÷±äÁ¿ÉèÖÃÇøÓò
{
k=AnalogComm[j].p_addr+offset-(Uint16 *)&dzkg1;
if (bittst((Uint16 *)&dzkg1,k))
value = 1;
else
value = 0;
}
/************************************/
offset++;
SerModbus.send_msg[2*i+3]=(value>>8)&0xff;//Êý¾Ý¸ßλ×Ö½Ú
SerModbus.send_msg[2*i+4]=value&0xff;//Êý¾ÝµÍλ×Ö½Ú
}
SerModbus.crc_len=SerModbus.send_msg[2]+3;
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 4://Read Input Registers--Ò£²âÁ¿
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 5://Force Single Coil
ctrl_point=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//--Ö÷»úÐ޸Ķ¨ÖµµãºÅ
value=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
if(ctrl_point>CONTROL_NO-1)
{
ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ
return;
}
if(ctrl_point<8 && dzyk_s == 1)
{//Ò£¿Ø³ö¿Ú
if(value)//value == 0xFF00
{
SerModbus.ck_point=ctrl_point;
bitset(&kc_value,ctrl_point);
bitset((Uint16 * )&SerModbus.ck_flag,ctrl_point);
}
else
{
SerModbus.ck_point=ctrl_point;
bitclr(&kc_value,ctrl_point);
bitclr((Uint16 * )&SerModbus.ck_flag,ctrl_point);
}
bitset((Uint16 * )&SerModbus.event_report,0);
}
else CommSelCtrl(ctrl_point);
SerModbus.send_msg[2]=SerModbus.receive_msg[2];//¶¨ÖµÍ¨µÀºÅ¸ßλ×Ö½Ú
SerModbus.send_msg[3]=SerModbus.receive_msg[3];//¶¨ÖµÍ¨µÀºÅµÍλ×Ö½Ú
SerModbus.send_msg[4]=SerModbus.receive_msg[4];//Êý¾Ý¸ßλ×Ö½Ú
SerModbus.send_msg[5]=SerModbus.receive_msg[5];//Êý¾ÝµÍλ×Ö½Ú
SerModbus.crc_len=6;
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 6://Preset Single Resister--Ò£¿ØÁ¿
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 7://Read Exception Status
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 8://Reserve »ØËÍÕï¶ÏУÑ飬°ÑÕï¶ÏУÑ鱨ÎÄËÍ´Ó»ú£¬ÒÔ¶ÔͨÐÅ´¦Àí½øÐÐÆÀ¼ø
SerModbus.send_count=0;
break;
case 9://±à³Ì£¨Ö»ÓÃÓÚ484£©Ê¹Ö÷»úÄ£Äâ±à³ÌÆ÷×÷Óã¬ÐÞ¸ÄPC´Ó»úÂß¼
SerModbus.send_count=0;
break;
case 10://¿Øѯ£¨Ö»ÓÃÓÚ484£©
SerModbus.send_count=0;
break;
case 11://Fech Comm Event Ctr
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 12://Fech Comm Event Log
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 13://±à³Ì£¨Ö»ÓÃÓÚ484£©Ê¹Ö÷»úÄ£Äâ±à³ÌÆ÷×÷Óã¬ÐÞ¸ÄPC´Ó»úÂß¼
SerModbus.send_count=0;
break;
case 14://¿Øѯ£¨Ö»ÓÃÓÚ484£©
SerModbus.send_count=0;
break;
case 15://Force Mutiple Coils
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 16://Preset Multiple Regs--Ò£µ÷Á¿
///offset=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];
///d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];
s_addr=SerModbus.receive_msg[2]*256+SerModbus.receive_msg[3];//ÆðʼµØÖ·
d_num=SerModbus.receive_msg[4]*256+SerModbus.receive_msg[5];//Êý¾Ý¸öÊý
byte=SerModbus.receive_msg[6];//×Ö½Ú³¤¶È
j=0; while((s_addr<AnalogComm[j].start_addr || s_addr>=AnalogComm[j+1].start_addr) && j < ANALOG_NO-1 ){j++;}//¼ìË÷ÆðʼµØÖ·--µØÖ··¶Î§:Start_pre<=x && x<Start_next
offset = s_addr-AnalogComm[j].start_addr;
if (d_num<1 || d_num+5>MACROCOMM_S_NO /*|| d_num!=byte/2*/)
{
ErrorResponse(3);//·Ç·¨Êý¾ÝÖµ
return;
}
for(i=0;i<d_num;i++)
{
value=(SerModbus.receive_msg[i*2+7])*256+SerModbus.receive_msg[i*2+8];
//ÏìÓ¦Êý¾ÝÇøÓòË÷Òý
if (offset>=AnalogComm[j].data_num)
{
if ((offset+AnalogComm[j].start_addr)>=AnalogComm[j+1].start_addr && j<ANALOG_NO-1)
{offset = 0;j++; }
else
break;
}
*(AnalogComm[j].p_addr+offset)=value;
//¶¨ÖµÀàÐͼì²â
if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&clockrade && (AnalogComm[j].p_addr+offset)<((Uint16*)&clockrade+0x06))
{//ʱÖÓÇøÓò
p_addr = (Uint16 *)&clockwrite;
*(p_addr+ (AnalogComm[j].p_addr+offset-(Uint16*)&clockrade)) = value;
flag = 0x01;
}
else if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&nvdd_accu && (AnalogComm[j].p_addr+offset)<((Uint16*)&nvdd_accu+0x0e))
{//µç¶ÈÇøÓò
flag = 0x02;
}
else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )&DzDat0.Point[0] && (AnalogComm[j].p_addr+offset)<((Uint16* )&DzDat0.Point[0]+0x40) && AnalogComm[j].start_addr<CommSetDz1Addr)
{//Óû§ÇøÓò
flag = 0x03;
}
else if ((AnalogComm[j].p_addr+offset)>=(Uint16*)&dzkg1 && (AnalogComm[j].p_addr+offset)<((Uint16*)&dzkg1+(MACROSETDZKG_NO<<4)) && AnalogComm[j].start_addr>=CommSetDz1Addr)//!!!¿ØÖÆ×ּĴæÆ÷±äÁ¿ÉèÖÃÇøÓò
{//¿ØÖÆ×ÖÂß¼±äÁ¿ÇøÓò
flag = 0x04;
k=AnalogComm[j].p_addr+offset-(Uint16*)&dzkg1;
if(value)
bitset((Uint16 *)&dzkg1,k);
else
bitclr((Uint16 *)&dzkg1,k);
}
else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )DDRAM_DAT_ABS && (AnalogComm[j].p_addr+offset)<((Uint16* )DDRAM_DAT_ABS+0x40))
{//ÆäËü²ÎÊýÇøÓò
flag = 0x05;
}
else if ((AnalogComm[j].p_addr+offset)>=(Uint16* )&DzDat1.Point[0] && (AnalogComm[j].p_addr+offset)<((Uint16* )&DzDat1.Point[0]+0x40))
{//µ÷ÊÔÇøÓò
flag = 0x06;
}
else {ErrorResponse(3);return;}//·Ç·¨Êý¾ÝÖµ
offset++;
}
//¶¨ÖµÀàÐͼì²â
if (flag==0x01)
ClockSet();//ʱÖÓÉèÖÃ
else if(flag==0x02)
read_energy();//µç¶ÈÉèÖÃ(½«nvddֵдÈëDDRAM)
else if(flag==0x03 || flag==0x04)
bitset(&save_event_flag,0);//Óû§¶¨Öµ
else if(flag==0x06)
bitset(&save_event_flag,1);//µ÷ÊÔ¶¨Öµ
else if(flag==0x05)
;//ÆäËü²ÎÊý(×Ô¶¯±£´æ)
SerModbus.send_msg[2]=SerModbus.receive_msg[2];//¶¨ÖµÍ¨µÀºÅ¸ßλ×Ö½Ú
SerModbus.send_msg[3]=SerModbus.receive_msg[3];//¶¨ÖµÍ¨µÀºÅµÍλ×Ö½Ú
SerModbus.send_msg[4]=SerModbus.receive_msg[4];//Êý¾Ý¸ßλ×Ö½Ú
SerModbus.send_msg[5]=SerModbus.receive_msg[5];//Êý¾ÝµÍλ×Ö½Ú
SerModbus.crc_len=6;
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 17://Report Slave
SerModbus.send_count=0;
break;
case 18://£¨884ºÍMICRO84£©
SerModbus.send_count=0;
break;
case 19://ÖØÖÃͨÐÅÁ´Â·
SerModbus.send_count=0;
break;
case 20://Read Gerenal Reference
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 21://Write General Reference
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 22://Mask Write 4X Register
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 23://Read/Write 4X Registers
SerModbus.send_count=SerModbus.crc_len+2;
break;
case 24://Read FIFO Queue
SerModbus.send_count=SerModbus.crc_len+2;
break;
default:
SerModbus.send_count=0;
break;
}
//¹ã²¥ÃüÁî»òÕß·¢ËÍ×Ö½ÚΪ0Á¢¼´·µ»Ø
if(broad_flag==0xff || SerModbus.send_count==0)
{
SerModbus.Busy=0;
SerModbus.Access=0;
SerModbus.send_count=0;
Ser.port_right=0;
return;
}
// ·¢ËÍÊý¾ÝУÑé
crc_result=CRC16((Uchar *)&SerModbus.send_msg[0],SerModbus.crc_len);
SerModbus.send_msg[SerModbus.crc_len]=(crc_result>>8)&0xff;
SerModbus.send_msg[SerModbus.crc_len+1]=crc_result&0xff;
SerModbus.s_timer=0;//·¢ËͼÇʱÇåÁã
SerModbus.send_flag=0xff;//Ö÷¢ËͱêÖ¾
//com_type=COM_SER;
//ComSendCtrl(com_type);//ͨѶ¿Ú·¢ËÍ¿ØÖÆ
ComSendCtrl(Com.port_typ);
}
/*
void GetSoe(Uint16 no)
{
Uint16 * p_data;
Uint16 start,size;
p_data=(Uint16*)&fault_soe;
size=FAULT_BYTE_NO/MACROFAULT_PAGE;
start=FAULTAREA_ADDR+size*no;
ReadFm24cl((Uint16*)p_data,start,size,1,FM2416_ID);//¹²±£´æ7120×Ö½Ú¹ÊÕϼǼ 64Ìõ¹ÊÕϼǼ
}
*/
void GetSoe(Uint16 no)
{
Uint16 *p_data,*p_fault;
Uint16 start,size;
Uint16 id,i;
p_data=(Uint16*)&fault_soe;
if ((no+1) != soe_id)
{//Ö÷»úÖ÷¶¯ÕÙ»½SOE
start=FAULTAREA_ADDR+MACROFAULT_BYTE*no;
ReadFm24cl((Uint16*)p_data,start,MACROFAULT_BYTE,1,FM2416_ID);//¹²±£´æ7120×Ö½Ú¹ÊÕϼǼ 64Ìõ¹ÊÕϼǼ
}
else
{//´Ó»úÇëÇóÕÙ»½SOE
///id = soe_id-1-fault_block_wr*MACROFAULT_PAGE;
id = no-no/MACROFAULT_PAGE*MACROFAULT_PAGE;
p_fault = (Uint16* )&fault_record[id];
for(i=0;i<(MACROFAULT_BYTE>>1);i++) {*(p_data++) = *(p_fault++);}
if (soe_count>0)
{
soe_count--;
if(++soe_id>MACROFAULT_SOE) { soe_id=1; }
bitset(&soe_status[0],soe_id-1);//ÖÃSOE״̬±êÖ¾
}
if (soe_count==0) {soe_id=0;}//SOE´«ÊäÍê³É
}
}
//===========================================================================
// No more.
http://shop106094428.taobao.com/index.htm?v=1 |
|