Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
d6629a3f
Commit
d6629a3f
authored
Mar 19, 2013
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(Modbus): сделана предварительная реализация запроса и ответа на функцию 43/14 (0x2B/0x0E)
parent
9a9332fb
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
114 additions
and
90 deletions
+114
-90
MBSlave.cc
Utilities/MBTester/MBSlave.cc
+36
-1
MBSlave.h
Utilities/MBTester/MBSlave.h
+3
-0
MBTCPServer.h
Utilities/MBTester/MBTCPServer.h
+4
-1
configure.ac
configure.ac
+1
-1
ModbusRTUSlaveSlot.h
include/modbus/ModbusRTUSlaveSlot.h
+4
-1
ModbusServer.h
include/modbus/ModbusServer.h
+8
-0
ModbusTypes.cc
src/Communications/Modbus/ModbusTypes.cc
+58
-86
No files found.
Utilities/MBTester/MBSlave.cc
View file @
d6629a3f
...
@@ -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
;
}
// -------------------------------------------------------------------------
Utilities/MBTester/MBSlave.h
View file @
d6629a3f
...
@@ -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
;
/*!< адрес данного узла */
...
...
Utilities/MBTester/MBTCPServer.h
View file @
d6629a3f
...
@@ -80,8 +80,11 @@ class MBTCPServer
...
@@ -80,8 +80,11 @@ 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
);
/*! обработка запроса на установку времени */
/*! обработка запроса на установку времени */
...
...
configure.ac
View file @
d6629a3f
...
@@ -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)
...
...
include/modbus/ModbusRTUSlaveSlot.h
View file @
d6629a3f
...
@@ -60,7 +60,10 @@ class ModbusRTUSlaveSlot:
...
@@ -60,7 +60,10 @@ 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
journalCommand
(
ModbusRTU
::
JournalCommandMessage
&
query
,
virtual
ModbusRTU
::
mbErrCode
read4314
(
ModbusRTU
::
MEIMessageRDI
&
query
,
ModbusRTU
::
MEIMessageRetRDI
&
reply
);
virtual
ModbusRTU
::
mbErrCode
journalCommand
(
ModbusRTU
::
JournalCommandMessage
&
query
,
ModbusRTU
::
JournalCommandRetMessage
&
reply
);
ModbusRTU
::
JournalCommandRetMessage
&
reply
);
virtual
ModbusRTU
::
mbErrCode
setDateTime
(
ModbusRTU
::
SetDateTimeMessage
&
query
,
virtual
ModbusRTU
::
mbErrCode
setDateTime
(
ModbusRTU
::
SetDateTimeMessage
&
query
,
...
...
include/modbus/ModbusServer.h
View file @
d6629a3f
...
@@ -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 - запрос
...
...
src/Communications/Modbus/ModbusTypes.cc
View file @
d6629a3f
...
@@ -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
;
...
@@ -2099,46 +2099,46 @@ int ModbusRTU::szRequestDiagnosticData( DiagnosticsSubFunction f )
...
@@ -2099,46 +2099,46 @@ int ModbusRTU::szRequestDiagnosticData( DiagnosticsSubFunction f )
if
(
f
==
subEcho
)
if
(
f
==
subEcho
)
return
1
;
// тут странно, вроде в стандарте количество динамическое
return
1
;
// тут странно, вроде в стандарте количество динамическое
// но везде вроде в примерах.. "одно слово"..
// но везде вроде в примерах.. "одно слово"..
if
(
f
==
dgRestartComm
)
if
(
f
==
dgRestartComm
)
return
1
;
return
1
;
if
(
f
==
dgDiagReg
)
if
(
f
==
dgDiagReg
)
return
1
;
return
1
;
if
(
f
==
dgChangeASCII
)
if
(
f
==
dgChangeASCII
)
return
1
;
return
1
;
if
(
f
==
dgForceListen
)
if
(
f
==
dgForceListen
)
return
1
;
return
1
;
if
(
f
==
dgClearCounters
)
if
(
f
==
dgClearCounters
)
return
1
;
return
1
;
if
(
f
==
dgBusMsgCount
)
if
(
f
==
dgBusMsgCount
)
return
1
;
return
1
;
if
(
f
==
dgBusErrCount
)
if
(
f
==
dgBusErrCount
)
return
1
;
return
1
;
if
(
f
==
dgBusExceptCount
)
if
(
f
==
dgBusExceptCount
)
return
1
;
return
1
;
if
(
f
==
dgMsgSlaveCount
)
if
(
f
==
dgMsgSlaveCount
)
return
1
;
return
1
;
if
(
f
==
dgNoNoResponseCount
)
if
(
f
==
dgNoNoResponseCount
)
return
1
;
return
1
;
if
(
f
==
dgSlaveNAKCount
)
if
(
f
==
dgSlaveNAKCount
)
return
1
;
return
1
;
if
(
f
==
dgSlaveBusyCount
)
if
(
f
==
dgSlaveBusyCount
)
return
1
;
return
1
;
if
(
f
==
dgBusCharOverrunCount
)
if
(
f
==
dgBusCharOverrunCount
)
return
1
;
return
1
;
if
(
f
==
dgClearOverrunCounter
)
if
(
f
==
dgClearOverrunCounter
)
return
1
;
return
1
;
...
@@ -2159,14 +2159,14 @@ DiagnosticMessage& DiagnosticMessage::operator=( ModbusMessage& m )
...
@@ -2159,14 +2159,14 @@ DiagnosticMessage& DiagnosticMessage::operator=( ModbusMessage& m )
void
DiagnosticMessage
::
init
(
ModbusMessage
&
m
)
void
DiagnosticMessage
::
init
(
ModbusMessage
&
m
)
{
{
assert
(
m
.
func
==
fnDiagnostics
);
assert
(
m
.
func
==
fnDiagnostics
);
memset
(
this
,
0
,
sizeof
(
*
this
));
memset
(
this
,
0
,
sizeof
(
*
this
));
addr
=
m
.
addr
;
addr
=
m
.
addr
;
func
=
m
.
func
;
func
=
m
.
func
;
memcpy
(
&
subf
,
&
(
m
.
data
[
0
]),
sizeof
(
subf
)
);
memcpy
(
&
subf
,
&
(
m
.
data
[
0
]),
sizeof
(
subf
)
);
int
last
=
sizeof
(
subf
);
int
last
=
sizeof
(
subf
);
subf
=
SWAPSHORT
(
subf
);
subf
=
SWAPSHORT
(
subf
);
count
=
szRequestDiagnosticData
((
DiagnosticsSubFunction
)
subf
);
count
=
szRequestDiagnosticData
((
DiagnosticsSubFunction
)
subf
);
if
(
count
>
MAXDATALEN
)
if
(
count
>
MAXDATALEN
)
...
@@ -2177,13 +2177,13 @@ void DiagnosticMessage::init( ModbusMessage& m )
...
@@ -2177,13 +2177,13 @@ void DiagnosticMessage::init( ModbusMessage& m )
memcpy
(
&
data
,
&
(
m
.
data
[
last
]),
sizeof
(
ModbusData
)
*
count
);
memcpy
(
&
data
,
&
(
m
.
data
[
last
]),
sizeof
(
ModbusData
)
*
count
);
last
+=
sizeof
(
ModbusData
)
*
count
;
last
+=
sizeof
(
ModbusData
)
*
count
;
// переворачиваем данные
// переворачиваем данные
for
(
int
i
=
0
;
i
<
count
;
i
++
)
for
(
int
i
=
0
;
i
<
count
;
i
++
)
data
[
i
]
=
SWAPSHORT
(
data
[
i
]);
data
[
i
]
=
SWAPSHORT
(
data
[
i
]);
memcpy
(
&
crc
,
&
(
m
.
data
[
last
]),
szCRC
);
memcpy
(
&
crc
,
&
(
m
.
data
[
last
]),
szCRC
);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
int
DiagnosticMessage
::
getDataLen
(
ModbusMessage
&
m
)
int
DiagnosticMessage
::
getDataLen
(
ModbusMessage
&
m
)
{
{
...
@@ -2216,7 +2216,7 @@ bool DiagnosticMessage::addData( ModbusData d )
...
@@ -2216,7 +2216,7 @@ bool DiagnosticMessage::addData( ModbusData d )
{
{
if
(
isFull
()
)
if
(
isFull
()
)
return
false
;
return
false
;
data
[
count
++
]
=
d
;
data
[
count
++
]
=
d
;
return
true
;
return
true
;
}
}
...
@@ -2235,7 +2235,7 @@ ModbusMessage DiagnosticMessage::transport_msg()
...
@@ -2235,7 +2235,7 @@ ModbusMessage DiagnosticMessage::transport_msg()
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
,
this
,
szModbusHeader
);
memcpy
(
&
mm
,
this
,
szModbusHeader
);
int
ind
=
0
;
int
ind
=
0
;
// copy bcnt
// copy bcnt
ModbusData
d
=
SWAPSHORT
(
subf
);
ModbusData
d
=
SWAPSHORT
(
subf
);
...
@@ -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
;
...
@@ -2258,11 +2258,11 @@ ModbusMessage DiagnosticMessage::transport_msg()
...
@@ -2258,11 +2258,11 @@ ModbusMessage DiagnosticMessage::transport_msg()
ModbusData
crc
=
checkCRC
(
(
ModbusByte
*
)(
&
mm
),
szModbusHeader
+
sizeof
(
subf
)
+
sizeof
(
ModbusData
)
*
count
);
ModbusData
crc
=
checkCRC
(
(
ModbusByte
*
)(
&
mm
),
szModbusHeader
+
sizeof
(
subf
)
+
sizeof
(
ModbusData
)
*
count
);
// копируем CRC (последний элемент). Без переворачивания...
// копируем CRC (последний элемент). Без переворачивания...
memcpy
(
&
(
mm
.
data
[
ind
]),
&
crc
,
szCRC
);
memcpy
(
&
(
mm
.
data
[
ind
]),
&
crc
,
szCRC
);
ind
+=
szCRC
;
ind
+=
szCRC
;
// длина сообщения...
// длина сообщения...
mm
.
len
=
szData
();
mm
.
len
=
szData
();
return
mm
;
return
mm
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
...
@@ -2297,9 +2297,9 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticMessage& m )
...
@@ -2297,9 +2297,9 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticMessage& m )
for
(
int
i
=
0
;
i
<
m
.
count
;
i
++
)
for
(
int
i
=
0
;
i
<
m
.
count
;
i
++
)
os
<<
dat2str
(
m
.
data
[
i
])
<<
" "
;
os
<<
dat2str
(
m
.
data
[
i
])
<<
" "
;
os
<<
"}"
;
os
<<
"}"
;
return
os
;
return
os
;
}
}
...
@@ -2317,9 +2317,9 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticRetMessage& m )
...
@@ -2317,9 +2317,9 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticRetMessage& m )
for
(
int
i
=
0
;
i
<
m
.
count
;
i
++
)
for
(
int
i
=
0
;
i
<
m
.
count
;
i
++
)
os
<<
dat2str
(
m
.
data
[
i
])
<<
" "
;
os
<<
dat2str
(
m
.
data
[
i
])
<<
" "
;
os
<<
"}"
;
os
<<
"}"
;
return
os
;
return
os
;
}
}
...
@@ -2354,7 +2354,7 @@ ModbusMessage MEIMessageRDI::transport_msg()
...
@@ -2354,7 +2354,7 @@ ModbusMessage MEIMessageRDI::transport_msg()
ModbusData
crc
=
checkCRC
(
(
ModbusByte
*
)(
&
mm
),
szModbusHeader
+
ind
);
ModbusData
crc
=
checkCRC
(
(
ModbusByte
*
)(
&
mm
),
szModbusHeader
+
ind
);
// копируем CRC (последний элемент). Без переворачивания...
// копируем CRC (последний элемент). Без переворачивания...
memcpy
(
&
(
mm
.
data
[
ind
]),
&
crc
,
szCRC
);
memcpy
(
&
(
mm
.
data
[
ind
]),
&
crc
,
szCRC
);
ind
+=
szCRC
;
ind
+=
szCRC
;
// длина сообщения...
// длина сообщения...
...
@@ -2377,12 +2377,12 @@ MEIMessageRDI& MEIMessageRDI::operator=( ModbusMessage& m )
...
@@ -2377,12 +2377,12 @@ MEIMessageRDI& MEIMessageRDI::operator=( ModbusMessage& m )
void
MEIMessageRDI
::
init
(
ModbusMessage
&
m
)
void
MEIMessageRDI
::
init
(
ModbusMessage
&
m
)
{
{
assert
(
m
.
func
==
fnMEI
);
assert
(
m
.
func
==
fnMEI
);
memset
(
this
,
0
,
sizeof
(
*
this
));
memset
(
this
,
0
,
sizeof
(
*
this
));
// copy not include CRC
// copy not include CRC
memcpy
(
this
,
&
m
,
szModbusHeader
+
m
.
len
);
memcpy
(
this
,
&
m
,
szModbusHeader
+
m
.
len
);
// потом проверяем
// потом проверяем
if
(
!
checkFormat
()
)
if
(
!
checkFormat
()
)
{
{
...
@@ -2404,13 +2404,13 @@ bool MEIMessageRDI::checkFormat()
...
@@ -2404,13 +2404,13 @@ bool MEIMessageRDI::checkFormat()
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
MEIMessageRDI
&
m
)
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
MEIMessageRDI
&
m
)
{
{
os
<<
"addr="
<<
addr2str
(
m
.
addr
)
os
<<
"addr="
<<
addr2str
(
m
.
addr
)
<<
" func=0x"
<<
b2str
(
m
.
func
)
<<
" func=0x"
<<
b2str
(
m
.
func
)
<<
" type=0x"
<<
b2str
(
m
.
type
)
<<
" type=0x"
<<
b2str
(
m
.
type
)
<<
" devID=0x"
<<
b2str
(
m
.
devID
)
<<
" devID=0x"
<<
b2str
(
m
.
devID
)
<<
" objID=0x"
<<
b2str
(
m
.
objID
);
<<
" objID=0x"
<<
b2str
(
m
.
objID
);
return
os
;
return
os
;
}
}
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
MEIMessageRDI
*
m
)
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
MEIMessageRDI
*
m
)
{
{
...
@@ -2448,7 +2448,7 @@ RDIObjectInfo::RDIObjectInfo( ModbusByte id, ModbusByte* dat, ModbusByte len ):
...
@@ -2448,7 +2448,7 @@ RDIObjectInfo::RDIObjectInfo( ModbusByte id, ModbusByte* dat, ModbusByte len ):
void
MEIMessageRetRDI
::
pre_init
(
ModbusMessage
&
m
)
void
MEIMessageRetRDI
::
pre_init
(
ModbusMessage
&
m
)
{
{
assert
(
m
.
func
==
fnMEI
);
assert
(
m
.
func
==
fnMEI
);
addr
=
m
.
addr
;
addr
=
m
.
addr
;
func
=
m
.
func
;
func
=
m
.
func
;
...
@@ -2470,7 +2470,7 @@ void MEIMessageRetRDI::pre_init( ModbusMessage& m )
...
@@ -2470,7 +2470,7 @@ void MEIMessageRetRDI::pre_init( ModbusMessage& m )
void
MEIMessageRetRDI
::
init
(
ModbusMessage
&
m
)
void
MEIMessageRetRDI
::
init
(
ModbusMessage
&
m
)
{
{
assert
(
m
.
func
==
fnMEI
);
assert
(
m
.
func
==
fnMEI
);
addr
=
m
.
addr
;
addr
=
m
.
addr
;
func
=
m
.
func
;
func
=
m
.
func
;
type
=
m
.
data
[
0
];
type
=
m
.
data
[
0
];
...
@@ -2494,11 +2494,11 @@ void MEIMessageRetRDI::init( ModbusMessage& m )
...
@@ -2494,11 +2494,11 @@ void MEIMessageRetRDI::init( ModbusMessage& m )
{
{
if
(
m
.
len
<
7
)
if
(
m
.
len
<
7
)
throw
mbException
(
erInvalidFormat
);
throw
mbException
(
erInvalidFormat
);
while
(
i
<
m
.
len
&&
dlist
.
size
()
<
objNum
)
while
(
i
<
m
.
len
&&
dlist
.
size
()
<
objNum
)
{
{
ModbusByte
id
=
m
.
data
[
i
];
ModbusByte
id
=
m
.
data
[
i
];
int
dlen
=
(
int
)(
m
.
data
[
i
+
1
]);
int
dlen
=
(
int
)(
m
.
data
[
i
+
1
]);
if
(
m
.
len
<
(
i
+
1
+
dlen
)
)
if
(
m
.
len
<
(
i
+
1
+
dlen
)
)
throw
mbException
(
erInvalidFormat
);
throw
mbException
(
erInvalidFormat
);
...
@@ -2510,8 +2510,8 @@ void MEIMessageRetRDI::init( ModbusMessage& m )
...
@@ -2510,8 +2510,8 @@ void MEIMessageRetRDI::init( ModbusMessage& m )
}
}
}
}
memcpy
(
&
crc
,
&
(
m
.
data
[
i
]),
szCRC
);
memcpy
(
&
crc
,
&
(
m
.
data
[
i
]),
szCRC
);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
MEIMessageRetRDI
::
MEIMessageRetRDI
()
:
MEIMessageRetRDI
::
MEIMessageRetRDI
()
:
type
(
0x00
),
type
(
0x00
),
...
@@ -2543,7 +2543,7 @@ bool MEIMessageRetRDI::addData( ModbusByte id, const std::string val )
...
@@ -2543,7 +2543,7 @@ bool MEIMessageRetRDI::addData( ModbusByte id, const std::string val )
{
{
if
(
isFull
()
)
if
(
isFull
()
)
return
false
;
return
false
;
RDIObjectInfo
r
(
id
,
val
);
RDIObjectInfo
r
(
id
,
val
);
dlist
.
push_back
(
r
);
dlist
.
push_back
(
r
);
objNum
=
dlist
.
size
();
objNum
=
dlist
.
size
();
...
@@ -2565,7 +2565,7 @@ ModbusMessage MEIMessageRetRDI::transport_msg()
...
@@ -2565,7 +2565,7 @@ ModbusMessage MEIMessageRetRDI::transport_msg()
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
,
this
,
szModbusHeader
);
memcpy
(
&
mm
,
this
,
szModbusHeader
);
mm
.
data
[
0
]
=
type
;
mm
.
data
[
0
]
=
type
;
mm
.
data
[
1
]
=
devID
;
mm
.
data
[
1
]
=
devID
;
mm
.
data
[
2
]
=
conformity
;
mm
.
data
[
2
]
=
conformity
;
...
@@ -2581,13 +2581,13 @@ ModbusMessage MEIMessageRetRDI::transport_msg()
...
@@ -2581,13 +2581,13 @@ ModbusMessage MEIMessageRetRDI::transport_msg()
mm
.
data
[
ind
++
]
=
dlen
;
mm
.
data
[
ind
++
]
=
dlen
;
memcpy
(
&
(
mm
.
data
[
ind
]),
it
->
val
.
data
(),
dlen
);
memcpy
(
&
(
mm
.
data
[
ind
]),
it
->
val
.
data
(),
dlen
);
ind
+=
dlen
;
ind
+=
dlen
;
}
}
// пересчитываем CRC по перевёрнутым данным
// пересчитываем CRC по перевёрнутым данным
ModbusData
crc
=
checkCRC
(
(
ModbusByte
*
)(
&
mm
),
szModbusHeader
+
ind
);
ModbusData
crc
=
checkCRC
(
(
ModbusByte
*
)(
&
mm
),
szModbusHeader
+
ind
);
// копируем CRC (последний элемент). Без переворачивания...
// копируем CRC (последний элемент). Без переворачивания...
memcpy
(
&
(
mm
.
data
[
ind
]),
&
crc
,
szCRC
);
memcpy
(
&
(
mm
.
data
[
ind
]),
&
crc
,
szCRC
);
ind
+=
szCRC
;
ind
+=
szCRC
;
// длина сообщения...
// длина сообщения...
...
@@ -2604,11 +2604,11 @@ int MEIMessageRetRDI::szData()
...
@@ -2604,11 +2604,11 @@ int MEIMessageRetRDI::szData()
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
MEIMessageRetRDI
&
m
)
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
MEIMessageRetRDI
&
m
)
{
{
// return mbPrintMessage(os,(ModbusByte*)(&m), szModbusHeader + m.szData() );
// return mbPrintMessage(os,(ModbusByte*)(&m), szModbusHeader + m.szData() );
os
<<
"addr="
<<
addr2str
(
m
.
addr
)
os
<<
"addr="
<<
addr2str
(
m
.
addr
)
<<
" func=0x"
<<
b2str
(
m
.
func
)
<<
" func=0x"
<<
b2str
(
m
.
func
)
<<
" type=0x"
<<
b2str
(
m
.
type
)
<<
" type=0x"
<<
b2str
(
m
.
type
)
<<
" devID=0x"
<<
b2str
(
m
.
devID
)
<<
" devID=0x"
<<
b2str
(
m
.
devID
)
<<
" conformity=0x"
<<
b2str
(
m
.
conformity
)
<<
" conformity=0x"
<<
b2str
(
m
.
conformity
)
<<
" mf=0x"
<<
b2str
(
m
.
mf
)
<<
" mf=0x"
<<
b2str
(
m
.
mf
)
<<
" objID=0x"
<<
b2str
(
m
.
objID
)
<<
" objID=0x"
<<
b2str
(
m
.
objID
)
<<
" objNum="
<<
(
int
)(
m
.
objNum
);
<<
" objNum="
<<
(
int
)(
m
.
objNum
);
...
@@ -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
();
}
// -----------------------------------------------------------------------
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment