Расширение функционала mkquery

Работы с данными МК по протоколу MODBUS RTU

Расширение функционала mkquery

Сообщение bp » Пт июн 18, 2010 17:49

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Написал небольшой патч для чтения/записи holding (4x) регистров через mkquery. Может кому пригодится.

Не нашел кнопочки "приложить файл", поэтому вставляю как код:
Код: Выделить всё
diff --git a/src/mkquery/mkquery.cpp b/src/mkquery/mkquery.cpp
index 45c265d..c2c0574 100644
--- a/src/mkquery/mkquery.cpp
+++ b/src/mkquery/mkquery.cpp
@@ -16,6 +16,7 @@ int verb_mode;
 int repeats_count = 5;
 int timeout = 200;
 enum Mode { UnknownMode=0, Read, Write } operation_mode;
+enum IOFunction {iofn_Mikkon=1, iofn_Holding} io_function = iofn_Mikkon;
 bool unsigned_mode;
 int addr;
 int data_count;
@@ -45,6 +46,7 @@ static void print_help()
   "    -count=[Parameters count]\n"
   "    -read\n"
   "    -write\n"
+  "    -function=[mikkon|holding]\n"
   "    -unsigned\n"
   "    -repeats=[Repeats count]\n"
   "    -timeout=[Serial port timeout (ms)]\n"
@@ -113,6 +115,14 @@ static int init()
     { operation_mode = Read;
     } else if( str == "-write" )
     { operation_mode = Write;
+    } else if( str.startsWith( "-function=" ) )
+    { str.remove(0,10);
+      if( str=="mikkon" ) io_function = iofn_Mikkon;
+      else if( str=="holding" ) io_function = iofn_Holding;
+      else
+      { cerr << "Error: invalid IO function";
+        return 1;
+      }
     } else if( str == "-v" )
     { verb_mode = 1;
     } else if( str.startsWith( "-repeats=" ) )
@@ -274,7 +284,7 @@ bool read_data()
 {
   QByteArray req,ans;
 
-  int len=0,tr=0,i,j;
+  int len=0,tr=0,i,j,rplen,dataoff;
 
   switch( data_type )
   { case( Bits   ): len = ((data_count-1)/8)+1; break;
@@ -290,16 +300,33 @@ bool read_data()
     return 1;
   }
 
-  req.resize(6);
-  req[0] = node;
-  req[1] = 0x43;
-  req[2] = 0x00;
-  req[3] = addr >> 8;
-  req[4] = addr;
-  req[5] = len;
+  switch( io_function )
+  { case( iofn_Mikkon):
+      req.resize(6);
+      req[0] = node;
+      req[1] = 0x43;
+      req[2] = 0x00;
+      req[3] = addr >> 8;
+      req[4] = addr;
+      req[5] = len;
+      rplen = 6 + len;
+      dataoff = 4;
+      break;
+    case( iofn_Holding):
+      req.resize(6);
+      req[0] = node;
+      req[1] = 0x03;
+      req[2] = addr >> 8;
+      req[3] = addr;
+      req[4] = (len / 2) >> 8;
+      req[5] = len / 2;
+      rplen = 5 + len;
+      dataoff = 3;
+  }
+
   CRC::appendCRC16( req );
 
-  ans.resize( 6 + len );
+  ans.resize( rplen );
 
   tr=repeats_count;
   while( tr-- )
@@ -317,8 +344,16 @@ bool read_data()
     if( CRC::CRC16( ans )  ) continue;
     if( ans[0] != req[0]   ) continue;
     if( ans[1] != req[1]   ) continue;
-    if( ans[2] != req[2]   ) continue;
-    if( (unsigned char)ans[3] != (unsigned char)len      ) continue;
+    switch( io_function)
+    { case iofn_Mikkon:
+        if( ans[2] != req[2]   ) continue;
+        if( (unsigned char)ans[3] != (unsigned char)len      ) continue;
+        break;
+      case iofn_Holding:
+        if( (unsigned char)ans[2] != (unsigned char)len      ) continue;
+        break;
+    }
+
     break;
   }
   if( tr<0 )
@@ -326,7 +361,7 @@ bool read_data()
   }
 
   for( i=0; i<data_count; i++ )
-  { cout << ptr_value( i, ans.constData()+4 ) << endl;
+  { cout << ptr_value( i, ans.constData()+dataoff ) << endl;
   }
 
   return 0;
@@ -401,7 +436,7 @@ static bool write_data()
 
   QByteArray req,ans;
 
-  int len=0,tr=0,i,j;
+  int len=0,tr=0,i,j,rplen,dataoff;
   bool ok;
 
   switch( data_type )
@@ -418,29 +453,47 @@ static bool write_data()
     return 1;
   }
 
-  req.resize(6+len);
-  req[0] = node;
-  req[1] = 0x43;
-  req[2] = 0x01;
-  req[3] = addr >> 8;
-  req[4] = addr;
-  req[5] = len;
+  switch( io_function )
+  { case( iofn_Mikkon):
+      req.resize(6+len);
+      req[0] = node;
+      req[1] = 0x43;
+      req[2] = 0x01;
+      req[3] = addr >> 8;
+      req[4] = addr;
+      req[5] = len;
+      dataoff = 6;
+      rplen = dataoff + len + 2;
+      break;
+    case( iofn_Holding ):
+      req.resize(7+len);
+      req[0] = node;
+      req[1] = 0x10;
+      req[2] = addr >> 8;
+      req[3] = addr;
+      req[4] = (len / 2) >> 8;
+      req[5] = len / 2;
+      req[6] = len;
+      dataoff = 7;
+      rplen = 6 + 2;
+      break;
+  }
 
   for( i=0; i<data_count; i++ )
-  { ok = value_ptr( data[i], req.data()+6, i );
+  { ok = value_ptr( data[i], req.data()+dataoff, i );
     if( !ok )
     { cerr << "Error: Data is invalid." << endl;
       return 0;
     }
   }
 
-  if( data_type == Bits )
+  if( io_function == iofn_Mikkon && data_type == Bits )
   {  req[2] = data[0].toInt() ? 0x05 : 0x03;
   }
 
   CRC::appendCRC16( req );
 
-  ans.resize( req.size() );
+  ans.resize( rplen );
 
   tr=repeats_count;
   while( tr-- )
bp
Пользователь
 
Сообщения: 7
Зарегистрирован: Вс дек 20, 2009 7:37

Расширение функционала mkquery

Сообщение proger » Ср июл 14, 2010 21:44

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Мы рассмотрели ваше предложение и добавили в mkquery поддержку holding (4x) регистров с небольшими изменениями предложенного патча.

Будем рады рассмотреть иные предложения по модернизации софта.

Большое спасибо за проделанную работу!!!
proger
Пользователь
 
Сообщения: 15
Зарегистрирован: Ср июл 14, 2010 21:30


Вернуться в MKStudio

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3