|
UniSet
2.6.0
|
00001 /* 00002 * Copyright (c) 2015 Pavel Vainerman. 00003 * 00004 * This program is free software: you can redistribute it and/or modify 00005 * it under the terms of the GNU Lesser General Public License as 00006 * published by the Free Software Foundation, version 2.1. 00007 * 00008 * This program is distributed in the hope that it will be useful, but 00009 * WITHOUT ANY WARRANTY; without even the implied warranty of 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 * Lesser General Lesser Public License for more details. 00012 * 00013 * You should have received a copy of the GNU Lesser General Public License 00014 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00015 */ 00016 // -------------------------------------------------------------------------- 00017 #ifndef _MTR_H_ 00018 #define _MTR_H_ 00019 // ----------------------------------------------------------------------------- 00020 #include <string> 00021 #include <map> 00022 #include <unordered_map> 00023 #include <list> 00024 #include <ostream> 00025 #include <cstring> 00026 #include <cmath> 00027 #include "modbus/ModbusTypes.h" 00028 #include "ComPort.h" 00029 // ------------------------------------------------------------------------- 00030 namespace uniset 00031 { 00032 // ----------------------------------------------------------------------------- 00033 class ModbusRTUMaster; 00034 // ----------------------------------------------------------------------------- 00035 namespace MTR 00036 { 00037 // реализованные в данном интерфейсе типы данных 00038 enum MTRType 00039 { 00040 mtUnknown, 00041 mtT1, 00042 mtT2, 00043 mtT3, 00044 mtT4, 00045 mtT5, 00046 mtT6, 00047 mtT7, 00048 mtT8, 00049 mtT9, 00050 mtT10, 00051 mtT16, 00052 mtT17, 00053 mtF1, 00054 mtT_Str16, 00055 mtT_Str8 00056 }; 00057 // ------------------------------------------------------------------------- 00058 std::string type2str( MTRType t ); 00059 MTRType str2type( const std::string& s ); 00060 size_t wsize( MTRType t ); 00061 // ------------------------------------------------------------------------- 00062 // Информация 00063 const ModbusRTU::ModbusData regModelNumber = 0x01; 00064 const ModbusRTU::ModbusData regSerialNumber = 0x09; 00065 00066 std::string getModelNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr ); 00067 std::string getSerialNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr ); 00068 // ------------------------------------------------------------------------- 00069 // Настройки связи (чтение - read03, запись - write06) 00070 const ModbusRTU::ModbusData regUpdateConfiguration = 53; 00071 const ModbusRTU::ModbusData regAddress = 55; 00072 const ModbusRTU::ModbusData regBaudRate = 56; 00073 const ModbusRTU::ModbusData regStopBit = 57; /* 0 - Stop bit, 1 - Stop bits */ 00074 const ModbusRTU::ModbusData regParity = 58; 00075 const ModbusRTU::ModbusData regDataBits = 59; 00076 00077 enum mtrBaudRate 00078 { 00079 br1200 = 0, 00080 br2400 = 1, 00081 br4800 = 2, 00082 br9600 = 3, 00083 br19200 = 4, 00084 br38400 = 5, 00085 br57600 = 6, 00086 br115200 = 7 00087 }; 00088 00089 enum mtrParity 00090 { 00091 mpNoParity = 0, 00092 mpOddParity = 1, 00093 mpEvenParity = 2 00094 }; 00095 00096 enum mtrDataBits 00097 { 00098 db8Bits = 0, 00099 db7Bits = 1 00100 }; 00101 00102 bool setAddress( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusAddr newAddr ); 00103 bool setBaudRate( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrBaudRate br ); 00104 bool setStopBit( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, bool state ); 00105 bool setParity( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrParity p ); 00106 bool setDataBits( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrDataBits d ); 00107 ComPort::Parity get_parity( ModbusRTU::ModbusData data ); 00108 ComPort::Speed get_speed( ModbusRTU::ModbusData data ); 00109 // ------------------------------------------------------------------------- 00110 enum MTRError 00111 { 00112 mtrNoError, 00113 mtrBadDeviceType, 00114 mtrDontReadConfile, 00115 mtrSendParamFailed, 00116 mtrUnknownError 00117 }; 00118 std::ostream& operator<<(std::ostream& os, MTRError& e ); 00119 // Настройка из конф. файла 00120 MTRError update_configuration( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, 00121 const std::string& mtrconfile, int verbose = 0 ); 00122 // --------------------------- 00123 // вспомогательные функции и типы данных 00124 typedef std::list<ModbusRTU::ModbusData> DataList; 00125 typedef std::unordered_map<ModbusRTU::ModbusData, DataList> DataMap; 00126 const int attempts = 3; // 00127 static const ModbusRTU::ModbusData skip[] = {48, 49, 59}; // registers which should not write 00128 00129 bool send_param( ModbusRTUMaster* mb, DataMap& dmap, ModbusRTU::ModbusAddr addr, int verb ); 00130 bool read_param( const std::string& str, std::string& str1, std::string& str2 ); 00131 DataMap read_confile( const std::string& f ); 00132 void update_communication_params( ModbusRTU::ModbusAddr reg, ModbusRTU::ModbusData data, 00133 ModbusRTUMaster* mb, ModbusRTU::ModbusAddr& addr, int verb ); 00134 // ------------------------------------------------------------------------- 00135 static const size_t u2size = 2; 00136 // ------------------------------------------------------------------------- 00137 class T1 00138 { 00139 public: 00140 T1(): val(0) {} 00141 T1( unsigned short v ): val(v) {} 00142 T1( const ModbusRTU::ModbusData* data ): val(data[0]) {} 00143 ~T1() {} 00144 // ------------------------------------------ 00146 static size_t wsize() 00147 { 00148 return 1; 00149 } 00151 static MTRType type() 00152 { 00153 return mtT1; 00154 } 00155 // ------------------------------------------ 00156 unsigned short val; 00157 }; 00158 std::ostream& operator<<(std::ostream& os, T1& t ); 00159 // ------------------------------------------------------------------------- 00160 class T2 00161 { 00162 public: 00163 T2(): val(0) {} 00164 T2( signed short v ): val(v) {} 00165 T2( const ModbusRTU::ModbusData* data ): val(data[0]) {} 00166 ~T2() {} 00167 // ------------------------------------------ 00169 static size_t wsize() 00170 { 00171 return 1; 00172 } 00174 static MTRType type() 00175 { 00176 return mtT2; 00177 } 00178 // ------------------------------------------ 00179 signed short val; 00180 }; 00181 std::ostream& operator<<(std::ostream& os, T2& t ); 00182 // ------------------------------------------------------------------------- 00183 class T3 00184 { 00185 public: 00186 // ------------------------------------------ 00188 typedef union 00189 { 00190 unsigned short v[u2size]; 00191 signed int val; // :32 00192 } T3mem; 00193 // ------------------------------------------ 00194 // конструкторы на разные случаи... 00195 T3() 00196 { 00197 memset(raw.v, 0, sizeof(raw.v)); 00198 } 00199 00200 T3( signed int i ) 00201 { 00202 raw.val = i; 00203 } 00204 00205 T3( unsigned short v1, unsigned short v2 ) 00206 { 00207 raw.v[0] = v1; 00208 raw.v[1] = v2; 00209 } 00210 00211 T3( const ModbusRTU::ModbusData* data, size_t size ) 00212 { 00213 if( size >= u2size ) 00214 { 00215 // У MTR обратный порядок слов в ответе 00216 raw.v[0] = data[1]; 00217 raw.v[1] = data[0]; 00218 } 00219 } 00220 00221 ~T3() {} 00222 // ------------------------------------------ 00224 static size_t wsize() 00225 { 00226 return u2size; 00227 } 00229 static MTRType type() 00230 { 00231 return mtT3; 00232 } 00233 // ------------------------------------------ 00234 // функции преобразования к разным типам 00235 operator long() 00236 { 00237 return raw.val; 00238 } 00239 00240 T3mem raw; 00241 }; 00242 std::ostream& operator<<(std::ostream& os, T3& t ); 00243 // -------------------------------------------------------------------------- 00244 class T4 00245 { 00246 public: 00247 // ------------------------------------------ 00248 // конструкторы на разные случаи... 00249 T4(): sval(""), raw(0) {} 00250 T4( uint16_t v1 ): raw(v1) 00251 { 00252 char c[3]; 00253 memcpy(c, &v1, 2); 00254 c[2] = '\0'; 00255 sval = std::string(c); 00256 } 00257 00258 T4( const ModbusRTU::ModbusData* data ): 00259 raw(data[0]) 00260 { 00261 char c[3]; 00262 memcpy(c, &(data[0]), 2); 00263 c[2] = '\0'; 00264 sval = std::string(c); 00265 } 00266 00267 ~T4() {} 00268 // ------------------------------------------ 00270 static size_t wsize() 00271 { 00272 return 1; 00273 } 00275 static MTRType type() 00276 { 00277 return mtT4; 00278 } 00279 // ------------------------------------------ 00280 std::string sval; 00281 unsigned short raw; 00282 }; 00283 std::ostream& operator<<(std::ostream& os, T4& t ); 00284 // -------------------------------------------------------------------------- 00285 class T5 00286 { 00287 public: 00288 // ------------------------------------------ 00290 typedef union 00291 { 00292 unsigned short v[u2size]; 00293 struct u_T5 00294 { 00295 unsigned int val: 24; 00296 signed char exp; // :8 00297 } __attribute__( ( packed ) ) u2; 00298 long lval; 00299 } T5mem; 00300 // ------------------------------------------ 00301 // конструкторы на разные случаи... 00302 T5(): val(0) 00303 { 00304 memset(raw.v, 0, sizeof(raw.v)); 00305 } 00306 T5( unsigned short v1, unsigned short v2 ) 00307 { 00308 raw.v[0] = v1; 00309 raw.v[1] = v2; 00310 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00311 } 00312 00313 T5( long v ) 00314 { 00315 raw.lval = v; 00316 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00317 } 00318 00319 T5( const ModbusRTU::ModbusData* data, size_t size ): val(0) 00320 { 00321 if( size >= u2size ) 00322 { 00323 // При получении данных от MTR слова необходимо перевернуть 00324 raw.v[0] = data[1]; 00325 raw.v[1] = data[0]; 00326 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00327 } 00328 } 00329 00330 ~T5() {} 00331 // ------------------------------------------ 00333 static size_t wsize() 00334 { 00335 return u2size; 00336 } 00338 static MTRType type() 00339 { 00340 return mtT5; 00341 } 00342 // ------------------------------------------ 00343 double val; 00344 T5mem raw; 00345 }; 00346 std::ostream& operator<<(std::ostream& os, T5& t ); 00347 // -------------------------------------------------------------------------- 00348 class T6 00349 { 00350 public: 00351 // ------------------------------------------ 00353 typedef union 00354 { 00355 unsigned short v[u2size]; 00356 struct u_T6 00357 { 00358 signed int val: 24; 00359 signed char exp; // :8 00360 } u2; 00361 long lval; 00362 } T6mem; 00363 // ------------------------------------------ 00364 // конструкторы на разные случаи... 00365 T6(): val(0) 00366 { 00367 memset(raw.v, 0, sizeof(raw.v)); 00368 } 00369 T6( unsigned short v1, unsigned short v2 ) 00370 { 00371 raw.v[0] = v1; 00372 raw.v[1] = v2; 00373 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00374 } 00375 00376 T6( long v ) 00377 { 00378 raw.lval = v; 00379 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00380 } 00381 00382 T6( const ModbusRTU::ModbusData* data, size_t size ) 00383 { 00384 if( size >= u2size ) 00385 { 00386 // При получении данных от MTR слова необходимо перевернуть 00387 raw.v[0] = data[1]; 00388 raw.v[1] = data[0]; 00389 val = raw.u2.val * pow( (long)10, (long)raw.u2.exp ); 00390 } 00391 } 00392 00393 ~T6() {} 00394 // ------------------------------------------ 00396 static size_t wsize() 00397 { 00398 return u2size; 00399 } 00401 static MTRType type() 00402 { 00403 return mtT6; 00404 } 00405 // ------------------------------------------ 00406 double val = { 0.0 }; 00407 T6mem raw; 00408 }; 00409 std::ostream& operator<<(std::ostream& os, T6& t ); 00410 // -------------------------------------------------------------------------- 00411 class T7 00412 { 00413 public: 00414 // ------------------------------------------ 00416 typedef union 00417 { 00418 unsigned short v[u2size]; 00419 struct u_T7 00420 { 00421 unsigned int val: 16; 00422 unsigned char ic; // :8 - Inductive/capacitive 00423 unsigned char ie; // :8 - Import/export 00424 } __attribute__( ( packed ) ) u2; 00425 long lval; 00426 } T7mem; 00427 // ------------------------------------------ 00428 // конструкторы на разные случаи... 00429 T7(): val(0) 00430 { 00431 memset(raw.v, 0, sizeof(raw.v)); 00432 } 00433 T7( unsigned short v1, unsigned short v2 ) 00434 { 00435 raw.v[0] = v1; 00436 raw.v[1] = v2; 00437 val = raw.u2.val * pow( (long)10, (long) - 4 ); 00438 } 00439 T7( const long v ) 00440 { 00441 raw.lval = v; 00442 val = raw.u2.val * pow( (long)10, (long) - 4 ); 00443 } 00444 00445 T7( const ModbusRTU::ModbusData* data, size_t size ) 00446 { 00447 if( size >= u2size ) 00448 { 00449 // При получении данных от MTR слова необходимо перевернуть 00450 raw.v[0] = data[1]; 00451 raw.v[1] = data[0]; 00452 val = raw.u2.val * pow( (long)10, (long) - 4 ); 00453 } 00454 } 00455 00456 ~T7() {} 00457 // ------------------------------------------ 00459 static size_t wsize() 00460 { 00461 return u2size; 00462 } 00464 static MTRType type() 00465 { 00466 return mtT7; 00467 } 00468 // ------------------------------------------ 00469 double val = { 0.0 }; 00470 T7mem raw; 00471 }; 00472 std::ostream& operator<<(std::ostream& os, T7& t ); 00473 // -------------------------------------------------------------------------- 00474 class T8 00475 { 00476 public: 00477 // ------------------------------------------ 00479 typedef union 00480 { 00481 unsigned short v[u2size]; 00482 struct u_T8 00483 { 00484 unsigned short mon: 8; 00485 unsigned short day: 8; 00486 unsigned short hour: 8; 00487 unsigned short min: 8; 00488 } __attribute__( ( packed ) ) u2; 00489 } T8mem; 00490 // ------------------------------------------ 00491 // конструкторы на разные случаи... 00492 T8() 00493 { 00494 memset(raw.v, 0, sizeof(raw.v)); 00495 } 00496 T8( unsigned short v1, unsigned short v2 ) 00497 { 00498 raw.v[0] = v1; 00499 raw.v[1] = v2; 00500 } 00501 00502 T8( const ModbusRTU::ModbusData* data, size_t size ) 00503 { 00504 if( size >= u2size ) 00505 { 00506 // При получении данных от MTR слова необходимо перевернуть 00507 raw.v[1] = data[0]; 00508 raw.v[0] = data[1]; 00509 } 00510 } 00511 00512 inline unsigned short day() 00513 { 00514 return raw.u2.day; 00515 } 00516 inline unsigned short mon() 00517 { 00518 return raw.u2.mon; 00519 } 00520 inline unsigned short hour() 00521 { 00522 return raw.u2.hour; 00523 } 00524 inline unsigned short min() 00525 { 00526 return raw.u2.min; 00527 } 00528 00529 ~T8() {} 00530 // ------------------------------------------ 00532 static size_t wsize() 00533 { 00534 return u2size; 00535 } 00537 static MTRType type() 00538 { 00539 return mtT8; 00540 } 00541 // ------------------------------------------ 00542 T8mem raw; 00543 }; 00544 std::ostream& operator<<(std::ostream& os, T8& t ); 00545 // -------------------------------------------------------------------------- 00546 class T9 00547 { 00548 public: 00549 // ------------------------------------------ 00551 typedef union 00552 { 00553 unsigned short v[u2size]; 00554 struct u_T9 00555 { 00556 unsigned short hour: 8; 00557 unsigned short min: 8; 00558 unsigned short sec: 8; 00559 unsigned short ssec: 8; 00560 } __attribute__( ( packed ) ) u2; 00561 } T9mem; 00562 // ------------------------------------------ 00563 // конструкторы на разные случаи... 00564 T9() 00565 { 00566 memset(raw.v, 0, sizeof(raw.v)); 00567 } 00568 T9( unsigned short v1, unsigned short v2 ) 00569 { 00570 raw.v[0] = v1; 00571 raw.v[1] = v2; 00572 } 00573 00574 T9( const ModbusRTU::ModbusData* data, size_t size ) 00575 { 00576 if( size >= u2size ) 00577 { 00578 // При получении данных от MTR слова необходимо перевернуть 00579 raw.v[0] = data[1]; 00580 raw.v[1] = data[0]; 00581 } 00582 } 00583 00584 inline unsigned short hour() 00585 { 00586 return raw.u2.hour; 00587 } 00588 inline unsigned short min() 00589 { 00590 return raw.u2.min; 00591 } 00592 inline unsigned short sec() 00593 { 00594 return raw.u2.sec; 00595 } 00596 inline unsigned short ssec() 00597 { 00598 return raw.u2.ssec; 00599 } 00600 00601 ~T9() {} 00602 // ------------------------------------------ 00604 static size_t wsize() 00605 { 00606 return u2size; 00607 } 00609 static MTRType type() 00610 { 00611 return mtT9; 00612 } 00613 // ------------------------------------------ 00614 T9mem raw; 00615 }; 00616 std::ostream& operator<<(std::ostream& os, T9& t ); 00617 // ------------------------------------------------------------------------- 00618 class T10 00619 { 00620 public: 00621 // ------------------------------------------ 00623 typedef union 00624 { 00625 unsigned short v[u2size]; 00626 struct u_T10 00627 { 00628 unsigned short year: 16; 00629 unsigned short mon: 8; 00630 unsigned short day: 8; 00631 } __attribute__( ( packed ) ) u2; 00632 } T10mem; 00633 // ------------------------------------------ 00634 // конструкторы на разные случаи... 00635 T10() 00636 { 00637 memset(raw.v, 0, sizeof(raw.v)); 00638 } 00639 T10( unsigned short v1, unsigned short v2 ) 00640 { 00641 raw.v[0] = v1; 00642 raw.v[1] = v2; 00643 } 00644 00645 T10( const ModbusRTU::ModbusData* data, size_t size ) 00646 { 00647 if( size >= u2size ) 00648 { 00649 // При получении данных от MTR слова необходимо перевернуть 00650 raw.v[0] = data[1]; 00651 raw.v[1] = data[0]; 00652 } 00653 } 00654 00655 inline unsigned short year() 00656 { 00657 return raw.u2.year; 00658 } 00659 inline unsigned short mon() 00660 { 00661 return raw.u2.mon; 00662 } 00663 inline unsigned short day() 00664 { 00665 return raw.u2.day; 00666 } 00667 00668 ~T10() {} 00669 // ------------------------------------------ 00671 static size_t wsize() 00672 { 00673 return u2size; 00674 } 00676 static MTRType type() 00677 { 00678 return mtT10; 00679 } 00680 // ------------------------------------------ 00681 T10mem raw; 00682 }; 00683 std::ostream& operator<<(std::ostream& os, T10& t ); 00684 // -------------------------------------------------------------------------- 00685 00686 class T16 00687 { 00688 public: 00689 T16(): val(0) {} 00690 T16( unsigned short v ): val(v) 00691 { 00692 fval = (float)(val) / 100.0; 00693 } 00694 T16( const ModbusRTU::ModbusData* data ): val(data[0]) 00695 { 00696 fval = (float)(val) / 100.0; 00697 } 00698 T16( float f ): fval(f) 00699 { 00700 val = lroundf(fval * 100); 00701 } 00702 00703 ~T16() {} 00704 // ------------------------------------------ 00706 static size_t wsize() 00707 { 00708 return 1; 00709 } 00711 static MTRType type() 00712 { 00713 return mtT16; 00714 } 00715 // ------------------------------------------ 00716 operator float() 00717 { 00718 return fval; 00719 } 00720 operator unsigned short() 00721 { 00722 return val; 00723 } 00724 00725 unsigned short val = { 0 }; 00726 float fval = { 0.0 }; 00727 }; 00728 std::ostream& operator<<(std::ostream& os, T16& t ); 00729 // -------------------------------------------------------------------------- 00730 class T17 00731 { 00732 public: 00733 T17(): val(0) {} 00734 T17( signed short v ): val(v) 00735 { 00736 fval = (float)(v) / 100.0; 00737 } 00738 T17( unsigned short v ): val(v) 00739 { 00740 fval = (float)( (signed short)(v) ) / 100.0; 00741 } 00742 00743 T17( const ModbusRTU::ModbusData* data ): val(data[0]) 00744 { 00745 fval = (float)(val) / 100.0; 00746 } 00747 T17( float f ): fval(f) 00748 { 00749 val = lroundf(fval * 100); 00750 } 00751 ~T17() {} 00752 // ------------------------------------------ 00754 static size_t wsize() 00755 { 00756 return 1; 00757 } 00759 static MTRType type() 00760 { 00761 return mtT17; 00762 } 00763 // ------------------------------------------ 00764 operator float() 00765 { 00766 return fval; 00767 } 00768 operator signed short() 00769 { 00770 return val; 00771 } 00772 00773 signed short val = { 0 }; 00774 float fval = { 0 }; 00775 }; 00776 std::ostream& operator<<(std::ostream& os, T17& t ); 00777 // -------------------------------------------------------------------------- 00778 class F1 00779 { 00780 public: 00781 // ------------------------------------------ 00783 typedef union 00784 { 00785 unsigned short v[2]; 00786 float val; // 00787 } F1mem; 00788 // ------------------------------------------ 00789 // конструкторы на разные случаи... 00790 F1() 00791 { 00792 memset(raw.v, 0, sizeof(raw.v)); 00793 } 00794 F1( unsigned short v1, unsigned short v2 ) 00795 { 00796 raw.v[0] = v1; 00797 raw.v[1] = v2; 00798 } 00799 00800 F1( float f ) 00801 { 00802 raw.val = f; 00803 } 00804 00805 F1( const ModbusRTU::ModbusData* data, size_t size ) 00806 { 00807 if( size >= u2size ) 00808 { 00809 // При получении данных от MTR слова необходимо перевернуть 00810 raw.v[0] = data[1]; 00811 raw.v[1] = data[0]; 00812 } 00813 } 00814 00815 ~F1() {} 00816 // ------------------------------------------ 00818 static size_t wsize() 00819 { 00820 return u2size; 00821 } 00823 static MTRType type() 00824 { 00825 return mtF1; 00826 } 00827 // ------------------------------------------ 00828 operator float() 00829 { 00830 return raw.val; 00831 } 00832 operator long() 00833 { 00834 return lroundf(raw.val); 00835 } 00836 00837 F1mem raw; 00838 }; 00839 std::ostream& operator<<(std::ostream& os, F1& t ); 00840 // -------------------------------------------------------------------------- 00841 class T_Str16 00842 { 00843 public: 00844 // ------------------------------------------ 00845 // конструкторы на разные случаи... 00846 T_Str16(): sval("") {} 00847 T_Str16( const ModbusRTU::ReadInputRetMessage& ret ) 00848 { 00849 char c[17]; 00850 ModbusRTU::ModbusData data[8]; 00851 00852 for( int i = 0; i < 8; i++ ) 00853 data[i] = ModbusRTU::SWAPSHORT(ret.data[i]); 00854 00855 memcpy(c, &data, 16); 00856 c[16] = '\0'; 00857 sval = std::string(c); 00858 } 00859 00860 ~T_Str16() {} 00861 // ------------------------------------------ 00863 static size_t wsize() 00864 { 00865 return 8; 00866 } 00868 static MTRType type() 00869 { 00870 return mtT_Str16; 00871 } 00872 // ------------------------------------------ 00873 std::string sval; 00874 }; 00875 std::ostream& operator<<(std::ostream& os, T_Str16& t ); 00876 // -------------------------------------------------------------------------- 00877 00878 class T_Str8 00879 { 00880 public: 00881 // ------------------------------------------ 00882 // конструкторы на разные случаи... 00883 T_Str8(): sval("") {} 00884 T_Str8( const ModbusRTU::ReadInputRetMessage& ret ) 00885 { 00886 char c[9]; 00887 ModbusRTU::ModbusData data[4]; 00888 00889 for( int i = 0; i < 4; i++ ) 00890 data[i] = ModbusRTU::SWAPSHORT(ret.data[i]); 00891 00892 memcpy(c, &data, 8); 00893 c[8] = '\0'; 00894 sval = std::string(c); 00895 } 00896 00897 ~T_Str8() {} 00898 // ------------------------------------------ 00900 static size_t wsize() 00901 { 00902 return 4; 00903 } 00905 static MTRType type() 00906 { 00907 return mtT_Str8; 00908 } 00909 // ------------------------------------------ 00910 std::string sval; 00911 }; 00912 std::ostream& operator<<(std::ostream& os, T_Str8& t ); 00913 // -------------------------------------------------------------------------- 00914 } // end of namespace MTR 00915 // -------------------------------------------------------------------------- 00916 } // end of namespace uniset 00917 // -------------------------------------------------------------------------- 00918 #endif // _MTR_H_ 00919 // -----------------------------------------------------------------------------
1.7.6.1