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