UniSet  2.6.0
MTR.h
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 // -----------------------------------------------------------------------------