rllib  1
rlsiemenstcpclient.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                  rlsiemenstcpclient.cpp  -  description
00003                              -------------------
00004     begin                : Wed Jan 07 2004
00005     copyright            : (C) 2004 by Rainer Lehrig
00006     email                : lehrig@t-online.de
00007 
00008     S7_200 update        : Wed Mar 21 2007
00009     copyright            : (C) 2007 by Aljosa Merljak
00010     Email                : aljosa.merljak@datapan.si
00011  ***************************************************************************/
00012 
00013 /***************************************************************************
00014  *                                                                         *
00015  *   This library is free software; you can redistribute it and/or modify  *
00016  *   it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as        *
00017  *   published by the Free Software Foundation                             *
00018  *                                                                         *
00019  ***************************************************************************/
00020 #include <string.h>
00021 #include "rlsiemenstcpclient.h"
00022 #include "rlsiemenstcp.h"
00023 #define BUFSIZE 2048
00024 
00025 typedef union
00026 {
00027   unsigned char  b[4];
00028   unsigned short us[2];
00029   short          s[2];
00030   unsigned int   ui;
00031   int            i;
00032   float          f;
00033 }SWAP;
00034 
00035 rlSiemensTCPClient::rlSiemensTCPClient(const char *mbxname, const char *shmname, int shmsize, int _have_to_swap)
00036                    :rlMailbox(mbxname), rlSharedMemory(shmname, shmsize)
00037 {
00038   have_to_swap = _have_to_swap;
00039 }
00040 
00041 rlSiemensTCPClient::~rlSiemensTCPClient()
00042 {
00043 }
00044 
00045 int rlSiemensTCPClient::write(int slave, int org, int dbnr, int start_adr, int len, const unsigned char *inbuf, int function=rlSiemensTCP::WriteByte)
00046 {
00047   unsigned char buf[BUFSIZE+8];
00048   int len_byte;
00049 
00050   if(len <= 0)     return -1;
00051   if(slave < 0)    return -1;
00052   if(slave >= 256) return -1;
00053   len_byte = len;
00054   buf[0] = slave;
00055   buf[1] = org;
00056   buf[2] = dbnr / 256;
00057   buf[3] = dbnr & 0x0ff;
00058   buf[4] = start_adr / 256;
00059   buf[5] = start_adr & 0x0ff;
00060   buf[6] = len / 256;
00061   buf[7] = len & 0x0ff;
00062   buf[8] = function;
00063   memcpy(&buf[9],inbuf,len_byte);
00064   rlMailbox::write((void *) buf, len_byte + 9);
00065   return 0;
00066 }
00067 
00068 int rlSiemensTCPClient::writeBit(int slave, int org, int dbnum, int start, int offset, int len, const unsigned char *val)
00069 {
00070   if(len < 0)       return -1;
00071   if(len > BUFSIZE) return -1;
00072   if(slave < 0)     return -1;
00073   if(slave > 255)   return -1;
00074   int start_adr = start * 8 + offset;
00075   return write(slave,org,dbnum,start_adr,len,val,rlSiemensTCP::WriteBit);
00076 }
00077 
00078 int rlSiemensTCPClient::writeByte(int slave, int org, int dbnum, int start, int len, const unsigned char *val)
00079 {
00080   if(len < 0)       return -1;
00081   if(len > BUFSIZE) return -1;
00082   if(slave < 0)     return -1;
00083   if(slave > 255)   return -1;
00084   return write(slave,org,dbnum,start,len,val,rlSiemensTCP::WriteByte);
00085 }
00086 
00087 int rlSiemensTCPClient::writeFloat(int slave, int org, int dbnum, int start, int len, const float *val)
00088 {
00089   SWAP swap;
00090   int i,len_byte;
00091   unsigned char buf[BUFSIZE];
00092 
00093   len_byte = len * 4;
00094   if(len_byte < 0)       return -1;
00095   if(len_byte > BUFSIZE) return -1;
00096   if(slave < 0)     return -1;
00097   if(slave > 255)   return -1;
00098   if(have_to_swap == 1)
00099   {
00100     for(i=0; i<len_byte; i+=4)
00101     {
00102       swap.f   = val[i/4];
00103       buf[i+3] = swap.b[0];  
00104       buf[i+2] = swap.b[1];  
00105       buf[i+1] = swap.b[2];  
00106       buf[i]   = swap.b[3];  
00107     }
00108   }
00109   else
00110   {
00111     for(i=0; i<len_byte; i+=4)
00112     {
00113       swap.f   = val[i/4];
00114       buf[i]   = swap.b[0];  
00115       buf[i+1] = swap.b[1];  
00116       buf[i+2] = swap.b[2];  
00117       buf[i+3] = swap.b[3];       
00118     }
00119   }  
00120   return write(slave,org,dbnum,start,len_byte,buf,rlSiemensTCP::WriteByte);
00121 }
00122 
00123 int rlSiemensTCPClient::writeDword(int slave, int org, int dbnum, int start, int len, const int *val)
00124 {
00125   SWAP swap;
00126   int i,len_byte;
00127   unsigned char buf[BUFSIZE];
00128   
00129   len_byte = len * 4;
00130   if(len_byte < 0)       return -1;
00131   if(len_byte > BUFSIZE) return -1;
00132   if(slave < 0)     return -1;
00133   if(slave > 255)   return -1;
00134   if(have_to_swap == 1)
00135   {
00136     for(i=0; i<len_byte; i+=4)
00137     {
00138       swap.i   = val[i/4];
00139       buf[i+3] = swap.b[0];  
00140       buf[i+2] = swap.b[1];  
00141       buf[i+1] = swap.b[2];  
00142       buf[i]   = swap.b[3];  
00143     }
00144   }  
00145   else
00146   {
00147     for(i=0; i<len_byte; i+=4)
00148     {
00149       swap.i   = val[i/4];
00150       buf[i]   = swap.b[0];  
00151       buf[i+1] = swap.b[1];  
00152       buf[i+2] = swap.b[2];  
00153       buf[i+3] = swap.b[3];       
00154     }
00155   }  
00156   return write(slave,org,dbnum,start,len_byte,buf,rlSiemensTCP::WriteByte);
00157 }
00158 
00159 int rlSiemensTCPClient::writeShort(int slave, int org, int dbnum, int start, int len, const short *val)
00160 {
00161   SWAP swap;
00162   int i,len_byte;
00163   unsigned char buf[BUFSIZE];
00164   
00165   len_byte = len * 2;
00166   if(len_byte < 0)       return -1;
00167   if(len_byte > BUFSIZE) return -1;
00168   if(slave < 0)     return -1;
00169   if(slave > 255)   return -1;
00170   if(have_to_swap == 1)
00171   {
00172     for(i=0; i<len_byte; i+=2)
00173     {
00174       swap.s[0] = val[i/2];
00175       buf[i+1]  = swap.b[0];  
00176       buf[i]    = swap.b[1];  
00177     }
00178   }  
00179   else
00180   {
00181     for(i=0; i<len_byte; i+=2)
00182     {
00183       swap.s[0] = val[i/2];
00184       buf[i]    = swap.b[0];  
00185       buf[i+1]  = swap.b[1];  
00186     }
00187   }  
00188   return write(slave,org,dbnum,start,len_byte,buf,rlSiemensTCP::WriteByte);
00189 }
00190 
00191 int rlSiemensTCPClient::writeUDword(int slave, int org, int dbnum, int start, int len, const unsigned int *val)
00192 {
00193   SWAP swap;
00194   int i,len_byte;
00195   unsigned char buf[BUFSIZE];
00196   
00197   len_byte = len * 4;
00198   if(len_byte < 0)       return -1;
00199   if(len_byte > BUFSIZE) return -1;
00200   if(slave < 0)     return -1;
00201   if(slave > 255)   return -1;
00202   if(have_to_swap == 1)
00203   {
00204     for(i=0; i<len_byte; i+=4)
00205     {
00206       swap.ui  = val[i/4];
00207       buf[i+3] = swap.b[0];  
00208       buf[i+2] = swap.b[1];  
00209       buf[i+1] = swap.b[2];  
00210       buf[i]   = swap.b[3];  
00211     }
00212   }  
00213   else
00214   {
00215     for(i=0; i<len_byte; i+=4)
00216     {
00217       swap.ui  = val[i/4];
00218       buf[i]   = swap.b[0];  
00219       buf[i+1] = swap.b[1];  
00220       buf[i+2] = swap.b[2];  
00221       buf[i+3] = swap.b[3];       
00222     }
00223   }  
00224   return write(slave,org,dbnum,start,len_byte,buf,rlSiemensTCP::WriteByte);
00225 }
00226 
00227 int rlSiemensTCPClient::writeUShort(int slave, int org, int dbnum, int start, int len, const unsigned short *val)
00228 {
00229   SWAP swap;
00230   int i,len_byte;
00231   unsigned char buf[BUFSIZE];
00232   
00233   len_byte = len * 2;
00234   if(len_byte < 0)       return -1;
00235   if(len_byte > BUFSIZE) return -1;
00236   if(slave < 0)     return -1;
00237   if(slave > 255)   return -1;
00238   if(have_to_swap == 1)
00239   {
00240     for(i=0; i<len_byte; i+=2)
00241     {
00242       swap.us[0] = val[i/2];
00243       buf[i+1]   = swap.b[0];  
00244       buf[i]     = swap.b[1];  
00245     }
00246   }
00247   else
00248   {
00249     for(i=0; i<len_byte; i+=2)
00250     {
00251       swap.us[0] = val[i/2];
00252       buf[i]     = swap.b[0];  
00253       buf[i+1]   = swap.b[1];  
00254     }
00255   }      
00256   return write(slave,org,dbnum,start,len_byte,buf,rlSiemensTCP::WriteByte);
00257 }
00258 
00259 int rlSiemensTCPClient::read(int offset, int len)
00260 {
00261   return rlSharedMemory::read(offset,buf,len);
00262 }
00263 
00264 float rlSiemensTCPClient::Float(int index)
00265 {
00266   SWAP swap;
00267   if(index*4+4 > (int) BUFSIZE) return 0.0f;
00268   if(have_to_swap == 1)
00269   {
00270     swap.b[0] = buf[4*index+3];  
00271     swap.b[1] = buf[4*index+2];  
00272     swap.b[2] = buf[4*index+1];  
00273     swap.b[3] = buf[4*index];
00274   }
00275   else
00276   {
00277     swap.b[0] = buf[4*index];  
00278     swap.b[1] = buf[4*index+1];  
00279     swap.b[2] = buf[4*index+2];  
00280     swap.b[3] = buf[4*index+3];
00281   }    
00282   return swap.f;
00283 }
00284 
00285 int rlSiemensTCPClient::Dword(int index)
00286 {
00287   SWAP swap;
00288   if(index*4+4 > (int) BUFSIZE) return 0;
00289   if(have_to_swap == 1)
00290   {
00291     swap.b[0] = buf[4*index+3];  
00292     swap.b[1] = buf[4*index+2];  
00293     swap.b[2] = buf[4*index+1];  
00294     swap.b[3] = buf[4*index];
00295   }    
00296   else
00297   {
00298     swap.b[0] = buf[4*index];  
00299     swap.b[1] = buf[4*index+1];  
00300     swap.b[2] = buf[4*index+2];  
00301     swap.b[3] = buf[4*index+3];
00302   }    
00303   return swap.i;
00304 }
00305 
00306 int rlSiemensTCPClient::Short(int index)
00307 {
00308   SWAP swap;
00309   if(index*2+2 > (int) BUFSIZE) return 0;
00310   if(have_to_swap == 1)
00311   {
00312     swap.b[0] = buf[2*index+1];  
00313     swap.b[1] = buf[2*index];  
00314   }    
00315   else
00316   {
00317     swap.b[0] = buf[2*index];  
00318     swap.b[1] = buf[2*index+1];  
00319   }    
00320   return swap.s[0];
00321 }
00322 
00323 unsigned int rlSiemensTCPClient::UDword(int index)
00324 {
00325   SWAP swap;
00326   if(index*4+4 > (int) BUFSIZE) return 0;
00327   if(have_to_swap == 1)
00328   {
00329     swap.b[0] = buf[4*index+3];  
00330     swap.b[1] = buf[4*index+2];  
00331     swap.b[2] = buf[4*index+1];  
00332     swap.b[3] = buf[4*index];  
00333   }  
00334   else
00335   {
00336     swap.b[0] = buf[4*index];  
00337     swap.b[1] = buf[4*index+1];  
00338     swap.b[2] = buf[4*index+2];  
00339     swap.b[3] = buf[4*index+3];
00340   }    
00341   return swap.ui;
00342 }
00343 
00344 unsigned int rlSiemensTCPClient::UShort(int index)
00345 {
00346   SWAP swap;
00347   if(index*2+4 > (int) BUFSIZE) return 0;
00348   if(have_to_swap == 1)
00349   {
00350     swap.b[0] = buf[2*index+1];  
00351     swap.b[1] = buf[2*index];  
00352   }    
00353   else
00354   {
00355     swap.b[0] = buf[2*index];  
00356     swap.b[1] = buf[2*index+1];  
00357   }    
00358   return swap.us[0];
00359 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines