⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm103.c

📁 串口103规约
💻 C
📖 第 1 页 / 共 3 页
字号:
				sum+=ch;
				break;
			case 5:
				step++;
				sum+=ch;
				if(l==0) step=7;
				break;
			case 6:
				sum+=ch;
				l--;
				if(l==0) step=7;       
				break;
			case 7:
				if(ch!=sum) return -14;
				step++;
				break;
			case 8:
				step++;
				if((ch==0x16)&&(frame_l==len)) return 2;
				else return -15;
				break;
			}
		}
	}
	return -16;
}
static struct  COMM103_DEVICE_DATABASE * COMM103MsgVerfyFcb(struct COMM103_DEVICE_MAP *ndp,int frametype){
	u_char fcb,i,addr,fun;
	struct  COMM103_DEVICE_DATABASE *dp;
	if(frametype==1){
		fcb=ndp->recvbuf[1];
		addr=ndp->recvbuf[2];
	}
	else if(frametype==2){
		fcb=ndp->recvbuf[4];
		addr=ndp->recvbuf[5];
	}
	else return NULL;
	dp=NULL;
	for(i=0;i<ndp->devicenum;i++){
		if(ndp->commdevice_database[i]==NULL)continue;
		if(ndp->commdevice_database[i]->map_addr==addr)dp=ndp->commdevice_database[i];
	}
	if(dp==NULL){
		if(addr==0xff)COMM103SetTime(&ndp->recvbuf[6]);
		return NULL;
	}
	fun=fcb&0x0f;
	fcb&=0x20;
	/*dp->state=COMM103_DEVSTATE_NORMAL;*/
	if(get_dev_sta(dp->dev_addr)!=RET_NORMAL){dp->state=COMM103_DEVSTATE_NEEDRESET;return NULL;}/*装置未接通*/
	if((dp->state==COMM103_DEVSTATE_NEEDRESET)&&(fun!=0)&&(fun!=7))return NULL;/*装置通但没有收到复位报文*/
	if(fun==0){COMM103ClearLevelOneQue(dp);COMM103UpSendAsdu5(dp,4);}
	if(fun==7)COMM103UpSendAsdu5(dp,3);
#ifdef  _COMM103_SEND_DEBUG_
		printf("VerfyFcb: frametype=%d addr=%d fun=%d fcb=%02x \n",frametype,addr,fun,fcb);
#endif
	if(dp->state!=COMM103_DEVSTATE_NORMAL)return NULL;
	switch(fun){
	case 0:
	case 7:
		dp->fcb=0;
		ndp->resendlenth=0;
		COMM103SendCommFIX(dp,0,ndp->board_addr,ndp->commno);
		break;
	case 3:
		if(frametype!=2)return NULL;
		if(dp->fcb!=fcb){
			dp->fcb=fcb;
			ndp->resendlenth=0;
			COMM103SendCommFIX(dp,0,ndp->board_addr,ndp->commno);
			if((ndp->recvbuf[6]==10)||(ndp->recvbuf[6]==21))COMM103GinCheck(&ndp->recvbuf[6],ndp->recvlenth-8,ndp->gintype);
			if(dp->grpqh!=0xff)COMM103DealQHCall(ndp,dp);
			COMM103SendMsgtoMon(ndp,dp->dev_addr);
		}
		else {
			COMM103SendCommFIX(dp,1,ndp->board_addr,ndp->commno);
		}
		break;
	case 10:
		if(dp->fcb!=fcb){
			dp->fcb=fcb;
			ndp->resendlenth=0;
			COMM103SendCommNOFIX(ndp,dp,8,ndp->board_addr,ndp->commno,ndp->gintype);
		}
		else {
			COMM103ReSendCommNOFIX(ndp,dp);
		}
		break;
	case 11:
		dp->fcb=fcb;
		ndp->resendlenth=0;
		COMM103SendCommFIX(dp,9,ndp->board_addr,ndp->commno);
		break;
	case 9:
		ndp->resendlenth=0;
		COMM103SendCommFIX(dp,11,ndp->board_addr,ndp->commno);
		break;
	}
	return dp;
}
static void COMM103UpSendAsdu5(struct COMM103_DEVICE_DATABASE *dp,u_char cot){
	u_char	buf[30]={0x05,0x81,0x00,0x00,0xff,0x00,0x03};
	u_char  gon[10]={"南瑞继保"};
	u_char  i,j;
	buf[2]=cot;
	buf[3]=dp->map_addr;
	buf[5]=cot-1;
	COMM103Memcopy(&buf[7],gon,8,0);;
	for(i=15;i<19;i++)buf[i]=0;
	COMM103IsertinLeveloneQue(dp,buf,19);
	dp->state=COMM103_DEVSTATE_NORMAL;
}
static void COMM103SendCommFIX(struct COMM103_DEVICE_DATABASE *dp,u_char fun,u_char badd,u_char comno){
	u_char	buf[10];
	buf[0]=0x10;
	buf[1]=COMM103GetLinkControl(dp,fun);
	buf[2]=dp->map_addr;
	buf[3]=buf[1]+buf[2];
	buf[4]=0x16;
	send_sio_message(badd,comno,buf,5);
}
static void COMM103GinCheck(u_char *buf,int lenth,u_char gintype){
	u_char ptr,len,i,tmph,tmpl,tmpr;
	u_char siz,num;

	return;
	if(gintype==0)return;
	if(buf[0]==11){
		tmph=buf[7];buf[7]=buf[8];buf[8]=tmph;return;
	}
	if((buf[0]!=10)&&(buf[0]!=21))return;
	len=buf[7]&0x3f;
	ptr=8;
	for(i=0;i<len;i++){
		if(ptr>lenth)return;
		tmpr=ptr;
		tmph=buf[ptr++];
		tmpl=buf[ptr++];
		buf[tmpr++]=tmpl;
		buf[tmpr++]=tmph;
		ptr++;ptr++;
		siz=buf[ptr++];
		num=(buf[ptr++]&0x7f);
		ptr+=(siz*num);
	}
}
static void COMM103SendCommNOFIX(struct COMM103_DEVICE_MAP *ndp,struct COMM103_DEVICE_DATABASE *dp,u_char fun,u_char badd,u_char comno,u_char gintype){
	u_char	sum,buf[COMM103_LEVELONE_BUFLEN];
	int len,i;
	len=COMM103GetmsgFromLeveloneQue(dp,buf);
	if(len<=0){COMM103SendCommFIX(dp,9,badd,comno);return;}
	COMM103GinCheck(buf,len,gintype);/**/
	sum=0;
	for(i=0;i<len;i++)sum+=buf[i+6];
	buf[0]=0x68;
	buf[1]=len+2;
	buf[2]=len+2;
	buf[3]=0x68;
	buf[4]=COMM103GetLinkControl(dp,8);
	buf[5]=dp->map_addr;
	sum+=(buf[4]+buf[5]);
	buf[len+6]=sum;
	buf[len+7]=0x16;
	ndp->resendlenth=len+8;
	COMM103Memcopy(ndp->resendbuf,buf,ndp->resendlenth,0);
	send_sio_message(badd,comno,buf,len+8);

}
static void COMM103ReSendCommNOFIX(struct COMM103_DEVICE_MAP *ndp,struct COMM103_DEVICE_DATABASE *dp){
	if(ndp->resendlenth==0)COMM103SendCommFIX(dp,1,ndp->board_addr,ndp->commno);
	else send_sio_message(ndp->board_addr,ndp->commno,ndp->resendbuf,ndp->resendlenth);
}
static void COMM103GenCallChanged(struct can_asdu21 *asdup,u_char addr,u_char scn){
	asdup->asdu_type=21;
	asdup->vsq=0x81;
	asdup->cot=9;
	asdup->address=addr;
	asdup->fun=254;
	asdup->inf=245;
	asdup->RII=scn;
	asdup->NOG=0;
}

static void COMM103SendMsgtoMon(struct COMM103_DEVICE_MAP *ndp,u_short addr){
	struct	can_asdu *asdup;
	asdup=(struct can_asdu *)&ndp->recvbuf[1];
	asdup->board_addr=ndp->board_addr;
	asdup->cmd=ASDU_DATA;
	asdup->return_id=0xff;
	asdup->dev_addr[0]=addr&0xff;
	asdup->dev_addr[1]=((addr&0xff00)>>8);
	asdup->address=addr&0xff;
	if(asdup->asdu_type==7){
		COMM103GenCallChanged((struct can_asdu21 *)asdup,addr&0xff,ndp->recvbuf[12]);
		ndp->recvlenth=16;
	}
#ifdef  _COMM103_RECV_DEBUG_
			printf("command:len=%d\n",ndp->recvlenth);
			COMM103BufShow(&ndp->recvbuf[1],ndp->recvlenth-3);
#endif
	dispatch_top((int)ndp->comm103recvid,MSGQ_TYPE,&ndp->recvbuf[1],ndp->recvlenth-3,0);
}

static void COMM103DealQHCall(struct COMM103_DEVICE_MAP *ndp,struct COMM103_DEVICE_DATABASE *dp){
	struct	asdu10 *asdup;
	asdup=(struct	asdu10 *)&ndp->recvbuf[6];
	if((asdup->GIN[0]==dp->grpqh)&&(asdup->inf==243)&&(asdup->asdu_type==21)){
		asdup->inf=241;asdup->GIN[1]=0;asdup->KOD=1;
		dp->qhstate=COMM103_CALLINGQH_COMMAND;
	}
}

static void COMM103SetTime(u_char *timebuf){
	struct   TIME     t;
	struct   asdu6    *asdu6_p;
	u_int temp;
	asdu6_p=(struct   asdu6    *)timebuf;
	if(asdu6_p->asdu_type==6) {
		temp=(u_short)asdu6_p->time[0]+(u_short)asdu6_p->time[1]*256;
		t.msecond=temp%1000;
		t.second=temp/1000;
			t.minute=(asdu6_p->time[2])&0x3f;
			t.hour=(asdu6_p->time[3])&0x1f;
			t.day=(asdu6_p->time[4])&0x1f;
			t.month=(asdu6_p->time[5])&0x0f;
			t.year=((asdu6_p->time[6])&0x7f)+2000;
		if(gps_valid_flag==NO) settime(&t);
	}
}
static void COMM103Memcopy(u_char *targetbuf,u_char *sourcebuf,int len,u_char type){
	int i;
	if(len<0)return;
	if(type==0){
		for(i=0;i<len;i++)*targetbuf++=*sourcebuf++;
	}
	else if(type==1){
		targetbuf+=(len-1);sourcebuf+=(len-1);
		for(i=0;i<len;i++)*targetbuf--=*sourcebuf--;
	}
	return;
}
static	int	COMM103_answer_one_entry_list(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu *can_asdup,int len)
{
	u_char	*deptr,temp[50],rri;
	struct	can_asdu11  *asdu_p;
	struct	DEV_ENTRY_DES_DATA  *entry_p;
	struct	ELEMENT *ginp;
	struct	can_asdu10 *asdu10p;
	u_int	x,n,index;
	

	asdu10p=(struct can_asdu10 *)can_asdup;
	if(asdu10p->KOD!=1)return len;
	x=0;deptr=&asdu10p->GIN[0];index=0;
	for(n=0;n<(asdu10p->NGD&0x3f);n++){
		if(deptr[x+1]!=0){
			rri=asdu10p->RII;
			COMM103Memcopy(temp,&deptr[x],deptr[x+4]+6,0);
			index=1;
			break;
		}
	}
	if(index==0)return len;

	asdu_p=(struct can_asdu11 *)can_asdup;
	asdu_p->cmd=ASDU_DATA;
	asdu_p->return_id=0;
	asdu_p->dev_addr[0]=dp->dev_addr&0xff;
	asdu_p->dev_addr[1]=(dp->dev_addr&0xff00)>>8;
	asdu_p->asdu_type=11;
	asdu_p->vsq=0x81;
	asdu_p->cot=42;
	asdu_p->address=dp->dev_addr&0xff;
	asdu_p->fun=254;
	asdu_p->inf=243;
	asdu_p->RII=rri;

	deptr=(u_char *)&asdu_p->GIN[0];
	index=(dp->dev_addr*0x10000)+(temp[0]*0x100)+temp[1];
	asdu_p->NDE=0;
	entry_p=search_index_TypeDatabase(index);

	if(entry_p!=NULL) {
	     deptr[0]=temp[0];
	     deptr[1]=temp[1];
	     x=3;
	     if(strlen(&entry_p->description.GID[0])!=0) {
			 if(entry_p->description.GDD0!=0){
		     deptr[x++]=10;
		     deptr[x++]=entry_p->description.GDD0;
		     deptr[x++]=entry_p->description.GDD1;
		     deptr[x++]=1;
		     for(n=0;n<entry_p->description.GDD1;n++) deptr[x++]=entry_p->description.GID[n];
		     asdu_p->NDE++;
			 }
	     }
	     if(strlen(&entry_p->dimention.GID[0])!=0) {
			 if(entry_p->dimention.GDD0!=0){
		     deptr[x++]=9;
		     deptr[x++]=entry_p->dimention.GDD0;
		     deptr[x++]=entry_p->dimention.GDD1;
		     deptr[x++]=1;
		     for(n=0;n<entry_p->dimention.GDD1;n++) deptr[x++]=entry_p->dimention.GID[n];
		     asdu_p->NDE++;
			 }
	     }
	     if(entry_p->range.flag==YES) {
			 if(entry_p->range.GDD0!=0){
		     deptr[x++]=3;
		     deptr[x++]=entry_p->range.GDD0;
		     deptr[x++]=entry_p->range.GDD1;
		     deptr[x++]=entry_p->range.GDD2;
		     for(n=0;n<entry_p->range.GDD1*entry_p->range.GDD2;n++) deptr[x++]=entry_p->range.GID[n];
		     asdu_p->NDE++;
			 }
	     }
	     if(entry_p->precision.flag==YES) {
			 if(entry_p->precision.GDD0!=0){
		     deptr[x++]=5;
		     deptr[x++]=entry_p->precision.GDD0;
		     deptr[x++]=entry_p->precision.GDD1;
		     deptr[x++]=entry_p->precision.GDD2;
		     for(n=0;n<entry_p->precision.GDD1*entry_p->precision.GDD2;n++) deptr[x++]=entry_p->precision.GID[n];
		     asdu_p->NDE++;
			 }
	     }
		 for(n=0;n<temp[4]+4;n++) deptr[x++]=temp[n+2];
		 asdu_p->NDE++;
		 return x+12;
	}
	return len;
}

#define COMM103BUFSHOWLINELENTH 30
extern void COMM103BufShow(u_char *buf,int len){
	u_char tmpbuf[200];
	int ret,ptr,i;
	ret=len;
	ptr=0;
	myprintf("bufshowbegin=%d \n",len);
	while((ret-COMM103BUFSHOWLINELENTH)>0){
		for(i=0;i<COMM103BUFSHOWLINELENTH;i++)sprintf(&tmpbuf[i*3],"%02x ",buf[ptr+i]);
		send_to_console(MY_DBGMES,tmpbuf,COMM103BUFSHOWLINELENTH*3);
		myprintf("\n");
		ptr+=COMM103BUFSHOWLINELENTH;
		ret-=COMM103BUFSHOWLINELENTH;
	}
	for(i=0;i<ret;i++)sprintf(&tmpbuf[i*3],"%02x ",buf[ptr+i]);
	send_to_console(MY_DBGMES,tmpbuf,ret*3);
	myprintf("\nbufshowend\n");
}

#ifdef  _COMM103_WATCH_DEBUG_
void COMM103DeviceShow(void){
	int i,j;
	printf("board addr=%d ",COMM103_deviceshowptr->board_addr);
	printf("commNO=%d ",COMM103_deviceshowptr->commno);
	printf("devicenum=%d ",COMM103_deviceshowptr->devicenum);
	printf("gintype=%d ",COMM103_deviceshowptr->gintype);
	printf("return_id=%d \n",COMM103_deviceshowptr->return_id);
	for(i=0;i<COMM103_deviceshowptr->devicenum;i++){
		printf("device addr=%d ",COMM103_deviceshowptr->commdevice_database[i]->dev_addr);
		printf("mapaddr=%d ",COMM103_deviceshowptr->commdevice_database[i]->map_addr);
		printf("grpnum=%d\n    ",COMM103_deviceshowptr->commdevice_database[i]->groupnum);
		for(j=0;j<COMM103_deviceshowptr->commdevice_database[i]->groupnum;j++){
			printf("converttype=%d ",COMM103_deviceshowptr->commdevice_database[i]->groupindex[j]->converttype);
			printf("gin=%02x00 ",COMM103_deviceshowptr->commdevice_database[i]->groupindex[j]->ginhight);
			printf("des=%s ",COMM103_deviceshowptr->commdevice_database[i]->groupindex[j]->des);
		}
		printf("\n");
	}
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -