|
UniSet
2.0.0
|
00001 // -------------------------------------------------------------------------- 00002 #ifndef _MTR_H_ 00003 #define _MTR_H_ 00004 // ----------------------------------------------------------------------------- 00005 #include <string> 00006 #include <map> 00007 #include <list> 00008 #include <ostream> 00009 #include <cstring> 00010 #include <cmath> 00011 #include "modbus/ModbusTypes.h" 00012 #include "ComPort.h" 00013 // ----------------------------------------------------------------------------- 00014 class ModbusRTUMaster; 00015 // ----------------------------------------------------------------------------- 00016 namespace MTR 00017 { 00018 // реализованные в данном интерфейсе типы данных 00019 enum MTRType 00020 { 00021 mtUnknown, 00022 mtT1, 00023 mtT2, 00024 mtT3, 00025 mtT4, 00026 mtT5, 00027 mtT6, 00028 mtT7, 00029 mtT8, 00030 mtT9, 00031 mtT10, 00032 mtT16, 00033 mtT17, 00034 mtF1, 00035 mtT_Str16, 00036 mtT_Str8 00037 }; 00038 // ------------------------------------------------------------------------- 00039 std::string type2str( MTRType t ); 00040 MTRType str2type( const std::string& s ); 00041 int wsize( MTRType t ); 00042 // ------------------------------------------------------------------------- 00043 // Информация 00044 const ModbusRTU::ModbusData regModelNumber = 0x01; 00045 const ModbusRTU::ModbusData regSerialNumber = 0x09; 00046 00047 std::string getModelNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr ); 00048 std::string getSerialNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr ); 00049 // ------------------------------------------------------------------------- 00050 // Настройки связи (чтение - read03, запись - write06) 00051 const ModbusRTU::ModbusData regUpdateConfiguration = 53; 00052 const ModbusRTU::ModbusData regAddress = 55; 00053 const ModbusRTU::ModbusData regBaudRate = 56; 00054 const ModbusRTU::ModbusData regStopBit = 57; /* 0 - Stop bit, 1 - Stop bits */ 00055 const ModbusRTU::ModbusData regParity = 58; 00056 const ModbusRTU::ModbusData regDataBits = 59; 00057 00058 enum mtrBaudRate 00059 { 00060 br1200 = 0, 00061 br2400 = 1, 00062 br4800 = 2, 00063 br9600 = 3, 00064 br19200 = 4, 00065 br38400 = 5, 00066 br57600 = 6, 00067 br115200 = 7 00068 }; 00069 00070 enum mtrParity 00071 { 00072 mpNoParity = 0, 00073 mpOddParity = 1, 00074 mpEvenParity = 2 00075 }; 00076 00077 enum mtrDataBits 00078 { 00079 db8Bits = 0, 00080 db7Bits = 1 00081 }; 00082 00083 bool setAddress( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusAddr newAddr ); 00084 bool setBaudRate( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrBaudRate br ); 00085 bool setStopBit( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, bool state ); 00086 bool setParity( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrParity p ); 00087 bool setDataBits( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrDataBits d ); 00088 ComPort::Parity get_parity( ModbusRTU::ModbusData data ); 00089 ComPort::Speed get_speed( ModbusRTU::ModbusData data ); 00090 // ------------------------------------------------------------------------- 00091 enum MTRError 00092 { 00093 mtrNoError, 00094 mtrBadDeviceType, 00095 mtrDontReadConfile, 00096 mtrSendParamFailed, 00097 mtrUnknownError 00098 }; 00099 std::ostream& operator<<(std::ostream& os, MTRError& e ); 00100 // Настройка из конф. файла 00101 MTRError update_configuration( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, 00102 const std::string& mtrconfile, int verbose=0 ); 00103 // --------------------------- 00104 // вспомогательные функции и типы данных 00105 typedef std::list<ModbusRTU::ModbusData> DataList; 00106 typedef std::map<ModbusRTU::ModbusData,DataList> DataMap; 00107 const int attempts = 3; // 00108 static const ModbusRTU::ModbusData skip[] = {48, 49, 59}; // registers which should not write 00109 00110 bool send_param( ModbusRTUMaster* mb, DataMap& dmap, ModbusRTU::ModbusAddr addr, int verb ); 00111 bool read_param( const std::string& str, std::string& str1, std::string& str2 ); 00112 DataMap read_confile( const std::string& f ); 00113 void update_communication_params( ModbusRTU::ModbusAddr reg, ModbusRTU::ModbusData data, 00114 ModbusRTUMaster* mb, ModbusRTU::ModbusAddr& addr, int verb ); 00115 // ------------------------------------------------------------------------- 00116 static const int u2size = 2; 00117 // ------------------------------------------------------------------------- 00118 class T1 00119 { 00120 public: 00121 T1():val(0){} 00122 T1( unsigned short v ):val(v){} 00123 T1( const ModbusRTU::ModbusData* data ):val(data[0]){} 00124 ~T1(){} 00125 // ------------------------------------------ 00127 static unsigned int wsize(){ return 1; } 00129 static MTRType type(){ return mtT1; } 00130 // ------------------------------------------ 00131 unsigned short val; 00132 }; 00133 std::ostream& operator<<(std::ostream& os, T1& t ); 00134 // ------------------------------------------------------------------------- 00135 class T2 00136 { 00137 public: 00138 T2():val(0){} 00139 T2( signed short v ):val(v){} 00140 T2( const ModbusRTU::ModbusData* data ):val(data[0]){} 00141 ~T2(){} 00142 // ------------------------------------------ 00144 static unsigned int wsize(){ return 1; } 00146 static MTRType type(){ return mtT2; } 00147 // ------------------------------------------ 00148 signed short val; 00149 }; 00150 std::ostream& operator<<(std::ostream& os, T2& t ); 00151 // ------------------------------------------------------------------------- 00152 class T3 00153 { 00154 public: 00155 // ------------------------------------------ 00157 typedef union 00158 { 00159 unsigned short v[u2size]; 00160 signed int val; // :32 00161 } T3mem; 00162 // ------------------------------------------ 00163 // конструкторы на разные случаи... 00164 T3(){ memset(raw.v,0,sizeof(raw.v)); } 00165 00166 T3( signed int i ){ raw.val = i; } 00167 00168 T3( unsigned short v1, unsigned short v2 ) 00169 { 00170 raw.v[0] = v1; 00171 raw.v[1] = v2; 00172 } 00173 00174 T3( const ModbusRTU::ModbusData* data, int size ) 00175 { 00176 if( size >= u2size ) 00177 { 00178 // У MTR обратный порядок слов в ответе 00179 raw.v[0] = data[1]; 00180 raw.v[1] = data[0]; 00181 } 00182 } 00183 00184 ~T3(){} 00185 // ------------------------------------------ 00187 static unsigned int wsize(){ return u2size; } 00189 static MTRType type(){ return mtT3; } 00190 // ------------------------------------------ 00191 // функции преобразования к разным типам 00192 operator long() { return raw.val; } 00193 00194 T3mem raw; 00195 }; 00196 std::ostream& operator<<(std::ostream& os, T3& t ); 00197 // -------------------------------------------------------------------------- 00198 class T4 00199 { 00200 public: 00201 // ------------------------------------------ 00202 // конструкторы на разные случаи... 00203 T4():sval(""),raw(0){} 00204 T4( unsigned short v1 ):raw(v1) 00205 { 00206 char c[3]; 00207 memcpy(c,&v1,sizeof(c)); 00208 sval = std::string(c); 00209 } 00210 00211 T4( const ModbusRTU::ModbusData* data ): 00212 raw(data[0]) 00213 { 00214 char c[3]; 00215 memcpy(c,&(data[0]),sizeof(c)); 00216 sval = std::string(c); 00217 } 00218 00219 ~T4(){} 00220 // ------------------------------------------ 00222 static unsigned int wsize(){ return 1; } 00224 static MTRType type(){ return mtT4; } 00225 // ------------------------------------------ 00226 std::string sval; 00227 unsigned short raw; 00228 }; 00229 std::ostream& operator<<(std::ostream& os, T4& t ); 00230 // -------------------------------------------------------------------------- 00231 class T5 00232 { 00233 public: 00234 // ------------------------------------------ 00236 typedef union 00237 { 00238 unsigned short v[u2size]; 00239 struct u_T5 00240 { 00241 unsigned int val:24; 00242 signed char exp; // :8 00243 } __attribute__( ( packed ) ) u2; 00244 long lval; 00245 } T5mem; 00246 // ------------------------------------------ 00247 // конструкторы на разные случаи... 00248 T5():val(0){ memset(raw.v,0,sizeof(raw.v)); } 00249 T5( unsigned short v1, unsigned short v2 ) 00250 { 00251 raw.v[0] = v1; 00252 raw.v[1] = v2; 00253 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00254 } 00255 00256 T5( long v ) 00257 { 00258 raw.lval = v; 00259 } 00260 00261 T5( const ModbusRTU::ModbusData* data, int size ) 00262 { 00263 if( size >= u2size ) 00264 { 00265 // При получении данных от MTR слова необходимо перевернуть 00266 raw.v[0] = data[1]; 00267 raw.v[1] = data[0]; 00268 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00269 } 00270 } 00271 00272 ~T5(){} 00273 // ------------------------------------------ 00275 static unsigned int wsize(){ return u2size; } 00277 static MTRType type(){ return mtT5; } 00278 // ------------------------------------------ 00279 double val; 00280 T5mem raw; 00281 }; 00282 std::ostream& operator<<(std::ostream& os, T5& t ); 00283 // -------------------------------------------------------------------------- 00284 class T6 00285 { 00286 public: 00287 // ------------------------------------------ 00289 typedef union 00290 { 00291 unsigned short v[u2size]; 00292 struct u_T6 00293 { 00294 signed int val:24; 00295 signed char exp; // :8 00296 } u2; 00297 long lval; 00298 } T6mem; 00299 // ------------------------------------------ 00300 // конструкторы на разные случаи... 00301 T6():val(0){ memset(raw.v,0,sizeof(raw.v)); } 00302 T6( unsigned short v1, unsigned short v2 ) 00303 { 00304 raw.v[0] = v1; 00305 raw.v[1] = v2; 00306 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00307 } 00308 00309 T6( long v ) 00310 { 00311 raw.lval = v; 00312 } 00313 00314 T6( const ModbusRTU::ModbusData* data, int size ) 00315 { 00316 if( size >= u2size ) 00317 { 00318 // При получении данных от MTR слова необходимо перевернуть 00319 raw.v[0] = data[1]; 00320 raw.v[1] = data[0]; 00321 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00322 } 00323 } 00324 00325 ~T6(){} 00326 // ------------------------------------------ 00328 static unsigned int wsize(){ return u2size; } 00330 static MTRType type(){ return mtT6; } 00331 // ------------------------------------------ 00332 double val; 00333 T6mem raw; 00334 }; 00335 std::ostream& operator<<(std::ostream& os, T6& t ); 00336 // -------------------------------------------------------------------------- 00337 class T7 00338 { 00339 public: 00340 // ------------------------------------------ 00342 typedef union 00343 { 00344 unsigned short v[u2size]; 00345 struct u_T7 00346 { 00347 unsigned int val:16; 00348 unsigned char ic; // :8 - Inductive/capacitive 00349 unsigned char ie; // :8 - Import/export 00350 }__attribute__( ( packed ) ) u2; 00351 long lval; 00352 } T7mem; 00353 // ------------------------------------------ 00354 // конструкторы на разные случаи... 00355 T7():val(0){ memset(raw.v,0,sizeof(raw.v)); } 00356 T7( unsigned short v1, unsigned short v2 ) 00357 { 00358 raw.v[0] = v1; 00359 raw.v[1] = v2; 00360 val = raw.u2.val * pow( (long)10, (long)-4 ); 00361 } 00362 T7( const long v ) 00363 { 00364 raw.lval = v; 00365 } 00366 00367 T7( const ModbusRTU::ModbusData* data, int size ) 00368 { 00369 if( size >= u2size ) 00370 { 00371 // При получении данных от MTR слова необходимо перевернуть 00372 raw.v[0] = data[1]; 00373 raw.v[1] = data[0]; 00374 val = raw.u2.val * pow( (long)10, (long)-4 ); 00375 } 00376 } 00377 00378 ~T7(){} 00379 // ------------------------------------------ 00381 static unsigned int wsize(){ return u2size; } 00383 static MTRType type(){ return mtT7; } 00384 // ------------------------------------------ 00385 double val; 00386 T7mem raw; 00387 }; 00388 std::ostream& operator<<(std::ostream& os, T7& t ); 00389 // -------------------------------------------------------------------------- 00390 class T8 00391 { 00392 public: 00393 // ------------------------------------------ 00395 typedef union 00396 { 00397 unsigned short v[u2size]; 00398 struct u_T8 00399 { 00400 unsigned short mon:8; 00401 unsigned short day:8; 00402 unsigned short hour:8; 00403 unsigned short min:8; 00404 }__attribute__( ( packed ) ) u2; 00405 } T8mem; 00406 // ------------------------------------------ 00407 // конструкторы на разные случаи... 00408 T8(){ memset(raw.v,0,sizeof(raw.v)); } 00409 T8( unsigned short v1, unsigned short v2 ) 00410 { 00411 raw.v[0] = v1; 00412 raw.v[1] = v2; 00413 } 00414 00415 T8( const ModbusRTU::ModbusData* data, int size ) 00416 { 00417 if( size >= u2size ) 00418 { 00419 // При получении данных от MTR слова необходимо перевернуть 00420 raw.v[1] = data[0]; 00421 raw.v[0] = data[1]; 00422 } 00423 } 00424 00425 inline unsigned short day(){ return raw.u2.day; } 00426 inline unsigned short mon(){ return raw.u2.mon; } 00427 inline unsigned short hour(){ return raw.u2.hour; } 00428 inline unsigned short min(){ return raw.u2.min; } 00429 00430 ~T8(){} 00431 // ------------------------------------------ 00433 static unsigned int wsize(){ return u2size; } 00435 static MTRType type(){ return mtT8; } 00436 // ------------------------------------------ 00437 T8mem raw; 00438 }; 00439 std::ostream& operator<<(std::ostream& os, T8& t ); 00440 // -------------------------------------------------------------------------- 00441 class T9 00442 { 00443 public: 00444 // ------------------------------------------ 00446 typedef union 00447 { 00448 unsigned short v[u2size]; 00449 struct u_T9 00450 { 00451 unsigned short hour:8; 00452 unsigned short min:8; 00453 unsigned short sec:8; 00454 unsigned short ssec:8; 00455 }__attribute__( ( packed ) ) u2; 00456 } T9mem; 00457 // ------------------------------------------ 00458 // конструкторы на разные случаи... 00459 T9(){ memset(raw.v,0,sizeof(raw.v)); } 00460 T9( unsigned short v1, unsigned short v2 ) 00461 { 00462 raw.v[0] = v1; 00463 raw.v[1] = v2; 00464 } 00465 00466 T9( const ModbusRTU::ModbusData* data, int size ) 00467 { 00468 if( size >= u2size ) 00469 { 00470 // При получении данных от MTR слова необходимо перевернуть 00471 raw.v[0] = data[1]; 00472 raw.v[1] = data[0]; 00473 } 00474 } 00475 00476 inline unsigned short hour(){ return raw.u2.hour; } 00477 inline unsigned short min(){ return raw.u2.min; } 00478 inline unsigned short sec(){ return raw.u2.sec; } 00479 inline unsigned short ssec(){ return raw.u2.ssec; } 00480 00481 ~T9(){} 00482 // ------------------------------------------ 00484 static unsigned int wsize(){ return u2size; } 00486 static MTRType type(){ return mtT9; } 00487 // ------------------------------------------ 00488 T9mem raw; 00489 }; 00490 std::ostream& operator<<(std::ostream& os, T9& t ); 00491 // ------------------------------------------------------------------------- 00492 class T10 00493 { 00494 public: 00495 // ------------------------------------------ 00497 typedef union 00498 { 00499 unsigned short v[u2size]; 00500 struct u_T10 00501 { 00502 unsigned short year:16; 00503 unsigned short mon:8; 00504 unsigned short day:8; 00505 }__attribute__( ( packed ) ) u2; 00506 } T10mem; 00507 // ------------------------------------------ 00508 // конструкторы на разные случаи... 00509 T10(){ memset(raw.v,0,sizeof(raw.v)); } 00510 T10( unsigned short v1, unsigned short v2 ) 00511 { 00512 raw.v[0] = v1; 00513 raw.v[1] = v2; 00514 } 00515 00516 T10( const ModbusRTU::ModbusData* data, int size ) 00517 { 00518 if( size >= u2size ) 00519 { 00520 // При получении данных от MTR слова необходимо перевернуть 00521 raw.v[0] = data[1]; 00522 raw.v[1] = data[0]; 00523 } 00524 } 00525 00526 inline unsigned short year(){ return raw.u2.year; } 00527 inline unsigned short mon(){ return raw.u2.mon; } 00528 inline unsigned short day(){ return raw.u2.day; } 00529 00530 ~T10(){} 00531 // ------------------------------------------ 00533 static unsigned int wsize(){ return u2size; } 00535 static MTRType type(){ return mtT10; } 00536 // ------------------------------------------ 00537 T10mem raw; 00538 }; 00539 std::ostream& operator<<(std::ostream& os, T10& t ); 00540 // -------------------------------------------------------------------------- 00541 00542 class T16 00543 { 00544 public: 00545 T16():val(0){} 00546 T16( unsigned short v ):val(v) 00547 { 00548 fval = (float)(val)/100.0; 00549 } 00550 T16( const ModbusRTU::ModbusData* data ):val(data[0]) 00551 { 00552 fval = (float)(val)/100.0; 00553 } 00554 T16( float f ):fval(f) 00555 { 00556 val = lroundf(fval*100); 00557 } 00558 00559 ~T16(){} 00560 // ------------------------------------------ 00562 static unsigned int wsize(){ return 1; } 00564 static MTRType type(){ return mtT16; } 00565 // ------------------------------------------ 00566 operator float(){ return fval; } 00567 operator unsigned short(){ return val; } 00568 00569 unsigned short val; 00570 float fval; 00571 }; 00572 std::ostream& operator<<(std::ostream& os, T16& t ); 00573 // -------------------------------------------------------------------------- 00574 class T17 00575 { 00576 public: 00577 T17():val(0){} 00578 T17( signed short v ):val(v) 00579 { 00580 fval = (float)(v)/100.0; 00581 } 00582 T17( unsigned short v ):val(v) 00583 { 00584 fval = (float)( (signed short)(v) )/100.0; 00585 } 00586 00587 T17( const ModbusRTU::ModbusData* data ):val(data[0]) 00588 { 00589 fval = (float)(val)/100.0; 00590 } 00591 T17( float f ):fval(f) 00592 { 00593 val = lroundf(fval*100); 00594 } 00595 ~T17(){} 00596 // ------------------------------------------ 00598 static unsigned int wsize(){ return 1; } 00600 static MTRType type(){ return mtT17; } 00601 // ------------------------------------------ 00602 operator float(){ return fval; } 00603 operator signed short(){ return val; } 00604 00605 signed short val; 00606 float fval; 00607 }; 00608 std::ostream& operator<<(std::ostream& os, T17& t ); 00609 // -------------------------------------------------------------------------- 00610 class F1 00611 { 00612 public: 00613 // ------------------------------------------ 00615 typedef union 00616 { 00617 unsigned short v[2]; 00618 float val; // 00619 } F1mem; 00620 // ------------------------------------------ 00621 // конструкторы на разные случаи... 00622 F1(){ memset(raw.v,0,sizeof(raw.v)); } 00623 F1( unsigned short v1, unsigned short v2 ) 00624 { 00625 raw.v[0] = v1; 00626 raw.v[1] = v2; 00627 } 00628 00629 F1( float f ) 00630 { 00631 raw.val = f; 00632 } 00633 00634 F1( const ModbusRTU::ModbusData* data, int size ) 00635 { 00636 if( size >= u2size ) 00637 { 00638 // При получении данных от MTR слова необходимо перевернуть 00639 raw.v[0] = data[1]; 00640 raw.v[1] = data[0]; 00641 } 00642 } 00643 00644 ~F1(){} 00645 // ------------------------------------------ 00647 static unsigned int wsize(){ return u2size; } 00649 static MTRType type(){ return mtF1; } 00650 // ------------------------------------------ 00651 operator float(){ return raw.val; } 00652 operator long(){ return lroundf(raw.val); } 00653 00654 F1mem raw; 00655 }; 00656 std::ostream& operator<<(std::ostream& os, F1& t ); 00657 // -------------------------------------------------------------------------- 00658 class T_Str16 00659 { 00660 public: 00661 // ------------------------------------------ 00662 // конструкторы на разные случаи... 00663 T_Str16():sval(""){} 00664 T_Str16( const ModbusRTU::ReadInputRetMessage& ret ) 00665 { 00666 char c[17]; 00667 ModbusRTU::ModbusData data[8]; 00668 for( int i=0; i<8; i++ ) 00669 data[i] = ModbusRTU::SWAPSHORT(ret.data[i]); 00670 00671 memcpy(c,&data,16); 00672 c[16] = '\0'; 00673 sval = std::string(c); 00674 } 00675 00676 ~T_Str16(){} 00677 // ------------------------------------------ 00679 static unsigned int wsize(){ return 8; } 00681 static MTRType type(){ return mtT_Str16; } 00682 // ------------------------------------------ 00683 std::string sval; 00684 }; 00685 std::ostream& operator<<(std::ostream& os, T_Str16& t ); 00686 // -------------------------------------------------------------------------- 00687 00688 class T_Str8 00689 { 00690 public: 00691 // ------------------------------------------ 00692 // конструкторы на разные случаи... 00693 T_Str8():sval(""){} 00694 T_Str8( const ModbusRTU::ReadInputRetMessage& ret ) 00695 { 00696 char c[9]; 00697 ModbusRTU::ModbusData data[4]; 00698 for( int i=0; i<4; i++ ) 00699 data[i] = ModbusRTU::SWAPSHORT(ret.data[i]); 00700 memcpy(c,&data,8); 00701 c[8] = '\0'; 00702 sval = std::string(c); 00703 } 00704 00705 ~T_Str8(){} 00706 // ------------------------------------------ 00708 static unsigned int wsize(){ return 4; } 00710 static MTRType type(){ return mtT_Str8; } 00711 // ------------------------------------------ 00712 std::string sval; 00713 }; 00714 std::ostream& operator<<(std::ostream& os, T_Str8& t ); 00715 // -------------------------------------------------------------------------- 00716 } // end of namespace MTR 00717 // -------------------------------------------------------------------------- 00718 #endif // _MTR_H_ 00719 // -----------------------------------------------------------------------------
1.7.6.1