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

📄 104lib.c

📁 IEC104程序元源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
*/                    i++;                 }                 else break;              }              break;           case TYPE_TAP :              while( ( no=readline(tmpstr,256,fp) ) != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);                 if( value == 0 ){                    ret = sscanf(tmpstr,"%s %s\n",NodeName,TagPath);/*                    strcpy( TapList[i].nodename,NodeName );                    strcpy( TapList[i].tagname,TagPath );*/                    i++;                 }                 else break;              }              break;           case TYPE_BCD :              while( ( no=readline(tmpstr,256,fp) ) != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);                 if( value == 0 ){                    ret = sscanf(tmpstr,"%s %s\n",NodeName,TagPath);/*                    strcpy( BcdList[i].nodename,NodeName );                    strcpy( BcdList[i].tagname,TagPath );*/                    i++;                 }                 else break;              }              break;           case TYPE_SOE :              while( ( no=readline(tmpstr,256,fp) ) != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);                 if( value == 0 ){                    ret = sscanf(tmpstr,"%s %s %d\n",NodeName,TagPath,&dp_flag);/*                    strcpy( SoeList[i].nodename,NodeName );                    strcpy( SoeList[i].tagname,TagPath );*/                    SoeList[i].dp_flag = dp_flag;                    if(dp_flag==1){                       SoeList[i].addr = dp_num;                       dp_num++;                    }                    else{                       SoeList[i].addr = sp_num;                       sp_num++;                    }                    i++;                 }                 else break;              }              break;           case TYPE_YKZ :              while( ( no=readline(tmpstr,256,fp) ) != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);                 if( value == 0 ){                    ret = sscanf(tmpstr,"%s %s %s %d %d\n",NodeName,TagPath,TagDesp,&TagNo,&action);                    strcpy( YkzList[i].nodename,NodeName );                    strcpy( YkzList[i].tagname,TagPath );                    strcpy( YkzList[i].tagdesp,TagDesp );                    YkzList[i].addr = TagNo;                    YkzList[i].action = action;/*printf("YKZ:%s %d %d\n",YkzList[i].tagname,YkzList[i].addr,YkzList[i].action );*/                    i++;                 }                 else break;              }              break;           case TYPE_YSJ :              while( ( no=readline(tmpstr,256,fp) ) != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);                 if( value == 0 ){                    ret = sscanf(tmpstr,"%s %s\n",NodeName,TagPath);                    strcpy( YsjList[i].nodename,NodeName );                    strcpy( YsjList[i].tagname,TagPath );                    i++;                 }                 else break;              }              break;           case TYPE_YTJ :              while( ( no=readline(tmpstr,256,fp) ) != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);                 if( value == 0 ){                    ret = sscanf(tmpstr,"%s %s %s %d\n",NodeName,TagPath,TagDesp,&TagNo);                    strcpy( YtjList[i].nodename,NodeName );                    strcpy( YtjList[i].tagname,TagPath );                    strcpy( YtjList[i].tagdesp,TagDesp );                    YtjList[i].addr=TagNo;                    i++;                 }                 else break;              }              break;           default :              printf("%s datatype(%s) error\n",filename,type);              no = readline(tmpstr,256,fp);              if( no != NULL ){                 ret = sscanf(tmpstr,"%s\n",type);                 value = findtype(type);              }              break;        }     }  }  pSPDin = (DIN_BUF *)malloc( sizeof(DIN_BUF)*SP_NUM_DD );  pDPDin = (DIN_BUF *)malloc( sizeof(DIN_BUF)*DP_NUM_DD );printf("DP_NUM=%d,SP_NUM=%d\n",DP_NUM_DD,SP_NUM_DD);  fclose(fp);}void send_msg(){ int i;   if( pShmSocket.send_len > 0 ){      if(pShmSocket.send_len>6){        pShmSocket.send_data[2] = (send_num % 256) << 1;        pShmSocket.send_data[3] = send_num / 256;        pShmSocket.send_data[4] = (recv_num % 256) << 1;        pShmSocket.send_data[5] = recv_num / 256;        send_num++;      }else if(pShmSocket.send_len==6){        if((pShmSocket.send_data[2]&0x03)==0x01){          pShmSocket.send_data[4] = (recv_num % 256) << 1;          pShmSocket.send_data[5] = recv_num / 256;        }      }      send( pShmSocket.lansock,(char *)pShmSocket.send_data,pShmSocket.send_len,0 );      if( pShmSocket.display == 1 ){         display_on( pShmSocket.send_data,pShmSocket.send_len,1 );      }      pShmSocket.send_len = 0;   }}void recv_msg(){  int  rec_count,length,status;  unsigned char ptr[1024];  fd_set  fdR;  struct  timeval timeout;  FD_ZERO( &fdR );  FD_SET( pShmSocket.lansock,&fdR );  timeout.tv_usec = 100;           /*  100 ms */  timeout.tv_sec  = 0;  signal(SIGALRM,alarm_handler);  alarm( 1 );  status = select( pShmSocket.lansock+1,&fdR,NULL,NULL,&timeout );  alarm(0);  signal(SIGALRM,SIG_DFL);  if( status < 0 ){     if( pShmSocket.display != 0 ){        printf("Err---476recv select %d(%d)\n",                status,errno);     }     return;  }  if( status==0 || FD_ISSET(pShmSocket.lansock,&fdR) == 0 ) return;  signal(SIGALRM,alarm_handler);  alarm(1);  rec_count = recv( pShmSocket.lansock,(char *)&ptr[0],2,0 );  alarm(0);  signal(SIGALRM,SIG_DFL);  if( rec_count != 2 || ptr[0] != 0x68 ){    pShmSocket.recv_len = 0;    if( errno != EINTR && errno != EWOULDBLOCK )      pShmSocket.sock_state = 0;    return;  }  length = ptr[1];  signal(SIGALRM,alarm_handler);  alarm(1);  rec_count = recv( pShmSocket.lansock,(char *)&ptr[2],length,0 );  alarm(0);  signal(SIGALRM,SIG_DFL);  if( rec_count != length ){     pShmSocket.recv_len = 0;     if( errno != EINTR && errno != EWOULDBLOCK )       pShmSocket.sock_state = 0;     return;  }  pShmSocket.recv_len = length + 2;  memcpy( pShmSocket.recv_data,ptr,pShmSocket.recv_len);  if( pShmSocket.display != 0 )    display_on( pShmSocket.recv_data,pShmSocket.recv_len,0 );  return;}void recv_process(){   int           i,j,k,len,fjflag,recv_flag;   int           i_val,ytj_obj,ykz_obj,ysj_obj;   float         f_val;   char          tmpstr[128],oper[16];   unsigned char data_buf[MAX_DATA_LEN],*ptr;   recv_flag=1;   while(recv_flag){     recv_msg();     recv_flag=0;     if( pShmSocket.recv_len < 6 ){       if(pShmSocket.recv_len>0){          pShmSocket.recv_len=0;          printf("len err!\n");       }       return;     }else{        recv_flag=1;     }     ftime(&RecvTime);     memcpy( data_buf,pShmSocket.recv_data,pShmSocket.recv_len );    if ( pShmSocket.recv_len == 6 ){      switch( data_buf[2] ){        case 0x01:           printf("* S format (state=%d) *\n",CommuState);           break;        case 0x07:           rAssociateAck();           DinTime.time = 0;           AinTime.time = 0;           PinTime.time = 0;           send_num = 0;           recv_num = 0;           Retry = 0;           WaitRespond = 0;           printf("* Ack start (state=%d) *\n",CommuState);           CommuState = STATE_RUN;     /*******?????????????************/           break;        case 0x0b:           DinTime.time = 0;           AinTime.time = 0;           PinTime.time = 0;           send_num = 0;           recv_num = 0;           Retry = 0;           WaitRespond = 0;           CommuState = STATE_RUN;           break;        case 0x43:           rTestAck();           break;        default:           printf("ERR----not dealed lengh=6 msg(%02x),Please ADDed !!\n",data_buf[2]);           break;      }     }else {      if(data_buf[10]+data_buf[11]*256 == ASDU_ADDR){         recv_num++;         if(recv_num%MAX_W==0){            rRecvAck();         }         switch(data_buf[6])         {          case  C_IC_NA:                C_IC_NA_Proc();                break;          case  C_SC_NA:                C_SC_NA_Proc();                break;          case  C_SE_NA:                C_SE_NA_Proc();                break;          default:                printf("Err---TypeId(=%d) not define in this program !\n",data_buf[6]);            break;         }      }     }    pShmSocket.recv_len = 0;   }}void send_process(){   switch( CommuState ){      case STATE_ASSOCIATE :/*         printf("* Wait for send msg (state=%d) *\n",CommuState);*/         break;      case STATE_RUN :         rRun();         break;      default :         printf("ERR-----no such state(%d),Check it!!\n",CommuState);         break;   }}void rRun(){   ftime( &NowTime );   refresh_buf();   M_SP_NA_Proc();   M_DP_NA_Proc();   M_ME_NA_Proc();   M_ST_NA_Proc();   M_SP_TB_Proc();   M_DP_TB_Proc();   M_IT_NA_Proc();   rCTRL_db();   rYT_db();}void rCTRL_db(){   char tmpstr[256];  int                 i,j,pending;  char                *tag,tmpbuf[1024],*fstr;  MSG_BUF             sbuf;  tag_val_t           value;  tag_fld_write_nm_t  *hdr;   if(YkMsg.select_flag){      if((NowTime.time-YkMsg.select_time>60)||(YkMsg.select_time-NowTime.time>60)){           if(YkMsg.ctrl_flag==2)              sprintf(tmpstr,"%s选择: %s%s(对象%d)超时",DISPATCH,YkMsg.desp,"合上",YkMsg.addr);           else              sprintf(tmpstr,"%s选择: %s%s(对象%d)超时",DISPATCH,YkMsg.desp,"拉开",YkMsg.addr);           write_log( tmpstr,"OPER_LOG" );           YkMsg.select_flag=0;           YkMsg.exec_flag=0;           YkMsg.ctrl_flag=0;           YkMsg.addr=0;      }else if(YkMsg.exec_flag){          YkMsg.select_flag=0;          YkMsg.exec_flag=0;          YkMsg.ctrl_flag=0;          YkMsg.addr=0;          strcpy(tmpstr,YkMsg.tagname);          fstr=strchr(tmpstr,'.');          if(!strcmp(fstr,".SEQ")){               rSeqCmd();          }else{             sbuf.function_code = MSG_TAG_FLD_WRITE_NM;             strcpy(sbuf.dest_proc_name,"mam");             strcpy(sbuf.dest_node_name,YkMsg.nodename);             strcpy(sbuf.orig_node_name,mynodename);             strcpy(sbuf.orig_proc_name,myprocessname);             sbuf.mtype = MESG_NORM;             sbuf.status_flags = 0;             sbuf.seri_flag = 0;             sbuf.seq_num = 0;             sbuf.msg_size = sizeof(tag_fld_write_nm_t);             sbuf.msg_data = tmpbuf;             hdr = (tag_fld_write_nm_t *)tmpbuf;             strcpy(hdr->tagpath,YkMsg.tagname);             value.ival = 1;             hdr->value = value;             hdr->array_idx = 0;             hdr->data_type = Int;             hdr->work_level = 0;             pending = msg_send(&sbuf,0,15,1,0);          }      }   }}void rSeqCmd(){ seq_init_t   *seq_cmd; char    data_buf[256]; MSG_BUF             sbuf;printf("net104 send SEQFILE\n");      strcpy(sbuf.dest_node_name, YkMsg.nodename);      map_func_code(MSG_SEQ_INIT, sbuf.dest_proc_name);      sbuf.function_code = MSG_SEQ_INIT;      sbuf.status_flags = 0;      sbuf.mtype = MESG_NORM;      sbuf.msg_size = sizeof(seq_init_t);      sbuf.msg_data = data_buf;      seq_cmd = (seq_init_t *)data_buf;      strcpy(seq_cmd->seq_file, YkMsg.tagname);      strcpy(seq_cmd->mode,"RUN");      strcpy(seq_cmd->label, YKLABEL);      strcpy(seq_cmd->ifnode, "");      strcpy(seq_cmd->option, "");      strcpy(seq_cmd->title, YkMsg.desp);      msg_send(&sbuf, 0,3,3,0);}void rYT_db(){   char tmpstr[256];  int                 i,j,pending;  char                *tag,tmpbuf[1024];  MSG_BUF             sbuf;  tag_val_t           value;  float               fvalue;  tag_fld_write_nm_t  *hdr;   if(YtMsg.select_flag){      if((NowTime.time-YtMsg.select_time>60)||(YtMsg.select_time-NowTime.time>60)){          sprintf(tmpstr,"%s选择: %s(对象%d)超时",DISPATCH,YtMsg.desp,YtMsg.addr);          write_log( tmpstr,"OPER_LOG" );          YtMsg.select_flag=0;          YtMsg.exec_flag=0;          YtMsg.addr=0;          YtMsg.value=0;      }else if(YtMsg.exec_flag){          sbuf.function_code = MSG_TAG_FLD_WRITE_NM;          strcpy(sbuf.dest_proc_name,"mam");          strcpy(sbuf.dest_node_name,YtMsg.nodename);          strcpy(sbuf.orig_node_name,mynodename);          strcpy(sbuf.orig_proc_name,myprocessname);          sbuf.mtype = MESG_NORM;          sbuf.status_flags = 0;          sbuf.seri_flag = 0;          sbuf.seq_num = 0;          sbuf.msg_size = sizeof(tag_fld_write_nm_t);          sbuf.msg_data = tmpbuf;          hdr = (tag_fld_write_nm_t *)tmpbuf;          strcpy(hdr->tagpath,YtMsg.tagname);          fvalue=(float)(YtMsg.value);          fvalue=fvalue/DES_SCALE;          fvalue=fvalue*SRC_SCALE;          value.fval = fvalue;printf("YT fvalue=%f\n",fvalue);          hdr->value = value;          hdr->array_idx = 0;          hdr->data_type = Float;          hdr->work_level = 0;          pending = msg_send(&sbuf,0,15,1,0);          sprintf(tmpstr,"%s设定: %s(=%7.3f)",DISPATCH,YtMsg.desp,value.fval);          write_log( tmpstr,"OPER_LOG" );          YtMsg.select_flag=0;          YtMsg.exec_flag=0;          YtMsg.value=0;          YtMsg.addr=0;      }   }}void rRecvAck(){    int           i,j,k,len;    unsigned char buf[MAX_DATA_LEN],*ptr;    memset( buf,0,MAX_DATA_LEN );    buf[0] = 0x68;    buf[1] = 0x04;    buf[2] = 0x00;    buf[3] = 0x00;    buf[4] = recv_num%256;    buf[5] = recv_num/256;    pShmSocket.send_len = 6;    memcpy( pShmSocket.send_data,buf,6 );    send_msg();

⌨️ 快捷键说明

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