Commit d6629a3f authored by Pavel Vainerman's avatar Pavel Vainerman

(Modbus): сделана предварительная реализация запроса и ответа на функцию 43/14 (0x2B/0x0E)

parent 9a9332fb
...@@ -3,8 +3,9 @@ ...@@ -3,8 +3,9 @@
//#include <string.h> //#include <string.h>
//#include <errno.h> //#include <errno.h>
#include <sstream> #include <sstream>
#include <UniSetTypes.h> #include "UniSetTypes.h"
#include "MBSlave.h" #include "MBSlave.h"
#include "config.h"
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
...@@ -48,6 +49,7 @@ MBSlave::MBSlave( ModbusRTU::ModbusAddr addr, const std::string dev, const std:: ...@@ -48,6 +49,7 @@ MBSlave::MBSlave( ModbusRTU::ModbusAddr addr, const std::string dev, const std::
rscomm->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) ); rscomm->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) );
rscomm->connectFileTransfer( sigc::mem_fun(this, &MBSlave::fileTransfer) ); rscomm->connectFileTransfer( sigc::mem_fun(this, &MBSlave::fileTransfer) );
rscomm->connectDiagnostics( sigc::mem_fun(this, &MBSlave::diagnostics) ); rscomm->connectDiagnostics( sigc::mem_fun(this, &MBSlave::diagnostics) );
rscomm->connectMEIRDI( sigc::mem_fun(this, &MBSlave::read4314) );
rscomm->setRecvTimeout(2000); rscomm->setRecvTimeout(2000);
...@@ -467,3 +469,36 @@ ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query, ...@@ -467,3 +469,36 @@ ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query,
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply )
{
if( verbose )
cout << "(read4314): " << query << endl;
if( query.devID == rdiVendorName )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiVendorName,"etersoft");
reply.addData(rdiProductCode, PACKAGE_NAME);
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
return erNoError;
}
else if( query.devID == rdiProductCode )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiProductCode,PACKAGE_NAME);
return erNoError;
}
else if( query.devID == rdiMajorMinorRevision )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
return erNoError;
}
return ModbusRTU::erOperationFailed;
}
// -------------------------------------------------------------------------
...@@ -94,6 +94,9 @@ class MBSlave ...@@ -94,6 +94,9 @@ class MBSlave
ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply ); ModbusRTU::MEIMessageRetRDI& reply );
ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply );
/*! интерфейс ModbusRTUSlave для обмена по RS */ /*! интерфейс ModbusRTUSlave для обмена по RS */
ModbusRTUSlaveSlot* rscomm; ModbusRTUSlaveSlot* rscomm;
ModbusRTU::ModbusAddr addr; /*!< адрес данного узла */ ModbusRTU::ModbusAddr addr; /*!< адрес данного узла */
......
...@@ -80,6 +80,9 @@ class MBTCPServer ...@@ -80,6 +80,9 @@ class MBTCPServer
ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply ); ModbusRTU::MEIMessageRetRDI& reply );
ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply );
/*! обработка запросов на чтение ошибок */ /*! обработка запросов на чтение ошибок */
ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
ModbusRTU::JournalCommandRetMessage& reply ); ModbusRTU::JournalCommandRetMessage& reply );
......
...@@ -147,7 +147,7 @@ fi ...@@ -147,7 +147,7 @@ fi
AC_SUBST(UNISET_CODEGEN) AC_SUBST(UNISET_CODEGEN)
echo "UNISET_CODEGEN: $UNISET_CODEGEN" echo "UNISET_CODEGEN: $UNISET_CODEGEN"
UNISET_CFLAGS="-I \$(top_builddir)/include" UNISET_CFLAGS="-I \$(top_builddir) -I \$(top_builddir)/include"
AC_SUBST(UNISET_CFLAGS) AC_SUBST(UNISET_CFLAGS)
UNISET_LIBS="\$(top_builddir)/lib/libUniSet.la" UNISET_LIBS="\$(top_builddir)/lib/libUniSet.la"
AC_SUBST(UNISET_LIBS) AC_SUBST(UNISET_LIBS)
......
...@@ -60,6 +60,9 @@ class ModbusRTUSlaveSlot: ...@@ -60,6 +60,9 @@ class ModbusRTUSlaveSlot:
virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply ); ModbusRTU::DiagnosticRetMessage& reply );
virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply );
virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
ModbusRTU::JournalCommandRetMessage& reply ); ModbusRTU::JournalCommandRetMessage& reply );
......
...@@ -167,6 +167,14 @@ class ModbusServer ...@@ -167,6 +167,14 @@ class ModbusServer
virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply )=0; ModbusRTU::DiagnosticRetMessage& reply )=0;
/*! Обработка запроса 43(0x2B).
\param query - запрос
\param reply - ответ. Заполняется в обработчике.
\return Результат обработки
*/
virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply )=0;
/*! Обработка запроса по журналу (0x65) /*! Обработка запроса по журналу (0x65)
\param query - запрос \param query - запрос
......
...@@ -972,7 +972,7 @@ ModbusMessage ReadOutputRetMessage::transport_msg() ...@@ -972,7 +972,7 @@ ModbusMessage ReadOutputRetMessage::transport_msg()
// копируем // копируем
memcpy(&(mm.data[ind]),dtmp,bcnt); memcpy(&(mm.data[ind]),dtmp,bcnt);
delete[] dtmp; delete dtmp;
ind+=bcnt; ind+=bcnt;
...@@ -1183,7 +1183,7 @@ ModbusMessage ReadInputRetMessage::transport_msg() ...@@ -1183,7 +1183,7 @@ ModbusMessage ReadInputRetMessage::transport_msg()
// копируем // копируем
memcpy(&(mm.data[ind]),dtmp,bcnt); memcpy(&(mm.data[ind]),dtmp,bcnt);
delete[] dtmp; delete dtmp;
ind+=bcnt; ind+=bcnt;
...@@ -1547,7 +1547,7 @@ ModbusMessage WriteOutputMessage::transport_msg() ...@@ -1547,7 +1547,7 @@ ModbusMessage WriteOutputMessage::transport_msg()
// копируем данные // копируем данные
memcpy(&(mm.data[ind]),dtmp,bcnt); memcpy(&(mm.data[ind]),dtmp,bcnt);
delete[] dtmp; delete dtmp;
ind+=bcnt; ind+=bcnt;
...@@ -2250,7 +2250,7 @@ ModbusMessage DiagnosticMessage::transport_msg() ...@@ -2250,7 +2250,7 @@ ModbusMessage DiagnosticMessage::transport_msg()
// копируем // копируем
memcpy(&(mm.data[ind]),dtmp,sizeof(ModbusData)*count); memcpy(&(mm.data[ind]),dtmp,sizeof(ModbusData)*count);
delete[] dtmp; delete dtmp;
ind+=sizeof(ModbusData)*count; ind+=sizeof(ModbusData)*count;
...@@ -2617,7 +2617,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, MEIMessageRetRDI& m ) ...@@ -2617,7 +2617,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, MEIMessageRetRDI& m )
{ {
os << endl; os << endl;
for( RDIObjectList::iterator it=m.dlist.begin(); it!=m.dlist.end(); it++ ) for( RDIObjectList::iterator it=m.dlist.begin(); it!=m.dlist.end(); it++ )
os << " " << rdi2str(it->id) << " : " << it->val << endl; os << " " << (int)(it->id) << " : " << it->val << endl;
} }
return os; return os;
...@@ -2633,7 +2633,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os,RDIObjectList& dlist ) ...@@ -2633,7 +2633,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os,RDIObjectList& dlist )
if( !dlist.empty() ) if( !dlist.empty() )
{ {
for( RDIObjectList::iterator it=dlist.begin(); it!=dlist.end(); it++ ) for( RDIObjectList::iterator it=dlist.begin(); it!=dlist.end(); it++ )
os << " " << rdi2str(it->id) << " : " << it->val << endl; os << " " << (int)(it->id) << " : " << it->val << endl;
} }
return os; return os;
...@@ -2745,7 +2745,7 @@ ModbusMessage JournalCommandRetMessage::transport_msg() ...@@ -2745,7 +2745,7 @@ ModbusMessage JournalCommandRetMessage::transport_msg()
// копируем // копируем
memcpy(&(mm.data[ind]),dtmp,bcnt); memcpy(&(mm.data[ind]),dtmp,bcnt);
delete[] dtmp; delete dtmp;
ind += bcnt; ind += bcnt;
...@@ -3493,31 +3493,3 @@ void ModbusTCP::MBAPHeader::swapdata() ...@@ -3493,31 +3493,3 @@ void ModbusTCP::MBAPHeader::swapdata()
len = SWAPSHORT(len); len = SWAPSHORT(len);
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
std::string ModbusRTU::rdi2str( int id )
{
if( id == rdiVendorName )
return "VendorName";
if( id == rdiProductCode )
return "ProductName";
if( id == rdiMajorMinorRevision )
return "MajorMinorRevision";
if( id == rdiVendorURL )
return "VendorURL";
if( id == rdiProductName )
return "ProductName";
if( id == rdiModelName )
return "ModelName";
if( id == rdiUserApplicationName )
return "UserApplicationName";
ostringstream s;
s << id;
return s.str();
}
// -----------------------------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment