|
rllib
1
|
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 }
1.7.5.1