前段时间用西门子提供的Prodave5.5开发了基于YFIOServer的驱动程序,很可惜以太网方式它不支持,所以只好用西门子的softnet来开发相应的驱动了。

 

SoftNet的服务程序

目前采用的是同步方式的读写,可支持自恢复功能。

(采用异步方式初次读写可以成功,下次在读写时却失败,不是很明白!)

读写核心代码:

 
  
  1. int fix_field_read(int Addr,int intNum,BYTE *bDataValue,long lngMode,int blockno)  
  2. {  
  3.  struct S7_READ_PARA read_para;  
  4.  int32 iRet;  
  5.  ord16 orderid=0;  
  6.  long lngTimeNum=0;  
  7.  long lngOK=1;  
  8.       
  9.  read_para.access=S7_ACCESS_SYMB_ADDRESS;  
  10.     switch(lngMode)  
  11.  {  
  12.  case MODE_I:   
  13.   sprintf(read_para.var_name,"IB%d,%d",Addr,intNum);  
  14.   break;  
  15.  case MODE_Q:   
  16.   sprintf(read_para.var_name,"QB%d,%d",Addr,intNum);  
  17.   break;  
  18.  case MODE_M:   
  19.   sprintf(read_para.var_name,"MB%d,%d",Addr,intNum);  
  20.   break;  
  21.  case MODE_DB:  
  22.         sprintf(read_para.var_name,"DB%d,B%d,%d",blockno,Addr,intNum);    
  23.   break;  
  24.  }  
  25.  //IOF->ShowMessage(1,1,read_para.var_name,"--");  
  26.            
  27.  iRet=s7_read_req(cp_descr,cp_cref,0,&read_para);  
  28.     if(iRet!=S7_OK)  
  29.  {  
  30.   //IOF->ShowMessage(1,1,read_para.var_name,"s7_read_req");  
  31.         return 1000;  
  32.  }      
  33.  do 
  34.  {   
  35.   iRet=s7_receive(cp_descr,&cp_cref,&orderid);  
  36.   switch(iRet)  
  37.   {  
  38.    case S7_READ_CNF:  
  39.     {   
  40.      //--------------------------------                
  41.      if(s7_get_read_cnf(( void *)0,(ord16 *)&intNum,(void *)bDataValue)!=S7_OK)  
  42.      {  
  43.       return 1001;  
  44.      }  
  45.                     lngTimeNum=IOD->Overtime+1;  
  46.      //----------------------------------  
  47.      lngOK=0;  
  48.     }  
  49.        break;  
  50.    default:  
  51.     Sleep(1);   //等待1ms  
  52.     break;  
  53.   }  
  54.       
  55.  } while(lngTimeNum++<IOD->Overtime && iRet!=S7_ABORT_IND);  
  56.       
  57.  return lngOK;  
  58. }  
  59.  
  60. int fix_field_write(int Addr,int intNum,BYTE *bDataValue,long lngMode,int blockno)  
  61. {  
  62.       
  63.  struct S7_WRITE_PARA write_para;  
  64.  int32 iRet;  
  65.  ord16 orderid=0;  
  66.  long lngTimeNum=0;  
  67.  long lngOK=1,i;  
  68.       
  69.  write_para.access=S7_ACCESS_SYMB_ADDRESS;  
  70.     switch(lngMode)  
  71.  {  
  72.  case MODE_I:   
  73.   return 999;  
  74.   break;  
  75.  case MODE_Q:   
  76.   sprintf(write_para.var_name,"QB%d,%d",Addr,intNum);  
  77.   break;  
  78.  case MODE_M:   
  79.   sprintf(write_para.var_name,"MB%d,%d",Addr,intNum);  
  80.   break;  
  81.  case MODE_DB:  
  82.         sprintf(write_para.var_name,"DB%d,B%d,%d",blockno,Addr,intNum);  
  83.      //IOF->ShowMessage(1,1,write_para.var_name,"fix_field_write");  
  84.   break;  
  85.  }  
  86.     write_para.var_length=intNum;  
  87.     for(i=0;i<intNum;i++)  
  88.  {  
  89.        write_para.value[i]=bDataValue[i];   
  90.  }  
  91.            
  92.  iRet=s7_write_req(cp_descr,cp_cref,0,&write_para,(void *)0);  
  93.     if(iRet!=S7_OK)  
  94.  {  
  95.         //IOF->ShowMessage(1,1,"Error:s7_write_req","fix_field_write");  
  96.         return 1000;  
  97.  }      
  98.  do 
  99.  {   
  100.   iRet=s7_receive(cp_descr,&cp_cref,&orderid);  
  101.   switch(iRet)  
  102.   {  
  103.    case S7_WRITE_CNF:  
  104.     {   
  105.      //--------------------------------                
  106.      if(s7_get_write_cnf()!=S7_OK)  
  107.      {  
  108.       return 1001;  
  109.      }  
  110.                     lngTimeNum=IOD->Overtime+1;  
  111.      //----------------------------------  
  112.      lngOK=0;  
  113.     }  
  114.        break;  
  115.    default:  
  116.     Sleep(1);   //等待1ms  
  117.     break;  
  118.   }  
  119.       
  120.  } while(lngTimeNum++<IOD->Overtime && iRet!=S7_ABORT_IND);  
  121.       
  122.  return lngOK;  
  123. }  
  124.  

注意:I和Q变量不知为什么,读写失败。