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