📄 comm103.c
字号:
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 + -