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
b4a61b20
Commit
b4a61b20
authored
Jun 23, 2017
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(Modbus): исправил ошибки в обработке ошибок обмена,
небольшой рефакторинг типов, добавил вспомогательную функция (numBytes).
parent
42f55201
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
100 additions
and
78 deletions
+100
-78
MBSlave.cc
Utilities/MBTester/MBSlave.cc
+4
-10
MBTCPServer.cc
Utilities/MBTester/MBTCPServer.cc
+2
-4
mbrtutester.cc
Utilities/MBTester/mbrtutester.cc
+1
-1
MBTCPTestServer.cc
extensions/ModbusMaster/tests/MBTCPTestServer.cc
+18
-15
run_test_mbtcpmaster.sh
extensions/ModbusMaster/tests/run_test_mbtcpmaster.sh
+1
-1
test_mbtcpmaster.cc
extensions/ModbusMaster/tests/test_mbtcpmaster.cc
+1
-1
ModbusClient.h
include/modbus/ModbusClient.h
+1
-1
ModbusTypes.h
include/modbus/ModbusTypes.h
+7
-8
ModbusClient.cc
src/Communications/Modbus/ModbusClient.cc
+7
-7
ModbusTypes.cc
src/Communications/Modbus/ModbusTypes.cc
+45
-30
test_modbustypes.cc
tests/test_modbustypes.cc
+13
-0
No files found.
Utilities/MBTester/MBSlave.cc
View file @
b4a61b20
...
@@ -119,12 +119,9 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
...
@@ -119,12 +119,9 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
d
.
b
[
6
]
=
1
;
d
.
b
[
6
]
=
1
;
// Фомирование ответа:
// Фомирование ответа:
unsigned
int
bcnt
=
query
.
count
/
ModbusRTU
::
BitsPerByte
;
size_t
bcnt
=
ModbusRTU
::
numBytes
(
query
.
count
)
;
if
(
(
query
.
count
%
ModbusRTU
::
BitsPerByte
)
>
0
)
for
(
size_t
i
=
0
;
i
<
bcnt
;
i
++
)
bcnt
++
;
for
(
unsigned
int
i
=
0
;
i
<
bcnt
;
i
++
)
{
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
...
@@ -163,12 +160,9 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
...
@@ -163,12 +160,9 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
}
}
else
else
{
{
unsigned
int
bcnt
=
query
.
count
/
ModbusRTU
::
BitsPerByte
;
size_t
bcnt
=
ModbusRTU
::
numBytes
(
query
.
count
);
if
(
(
query
.
count
%
ModbusRTU
::
BitsPerByte
)
>
0
)
bcnt
++
;
for
(
unsigned
in
t
i
=
0
;
i
<
bcnt
;
i
++
)
for
(
size_
t
i
=
0
;
i
<
bcnt
;
i
++
)
{
{
if
(
i
==
1
)
if
(
i
==
1
)
reply
.
addData
(
replyVal2
);
reply
.
addData
(
replyVal2
);
...
...
Utilities/MBTester/MBTCPServer.cc
View file @
b4a61b20
...
@@ -155,12 +155,10 @@ ModbusRTU::mbErrCode MBTCPServer::readInputStatus( ReadInputStatusMessage& query
...
@@ -155,12 +155,10 @@ ModbusRTU::mbErrCode MBTCPServer::readInputStatus( ReadInputStatusMessage& query
}
}
else
else
{
{
int
bcnt
=
query
.
count
/
ModbusRTU
::
BitsPerByte
;
if
(
(
query
.
count
%
ModbusRTU
::
BitsPerByte
)
>
0
)
size_t
bcnt
=
ModbusRTU
::
numBytes
(
query
.
count
);
bcnt
++
;
for
(
auto
i
=
0
;
i
<
bcnt
;
i
++
)
for
(
size_t
i
=
0
;
i
<
bcnt
;
i
++
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
}
}
...
...
Utilities/MBTester/mbrtutester.cc
View file @
b4a61b20
...
@@ -712,7 +712,7 @@ int main( int argc, char** argv )
...
@@ -712,7 +712,7 @@ int main( int argc, char** argv )
tofile
=
s
.
str
();
tofile
=
s
.
str
();
}
}
mb
.
fileTransfer
(
slaveaddr
,
reg
,
tofile
.
c_str
()
,
tout
);
mb
.
fileTransfer
(
slaveaddr
,
reg
,
tofile
,
tout
);
}
}
break
;
break
;
...
...
extensions/ModbusMaster/tests/MBTCPTestServer.cc
View file @
b4a61b20
...
@@ -121,6 +121,13 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
...
@@ -121,6 +121,13 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
d
.
b
[
4
]
=
1
;
d
.
b
[
4
]
=
1
;
d
.
b
[
6
]
=
1
;
d
.
b
[
6
]
=
1
;
if
(
query
.
count
==
0
)
{
if
(
verbose
)
cout
<<
"(readCoilStatus): ERROR qount=0"
<<
endl
;
return
ModbusRTU
::
erBadDataValue
;
}
if
(
query
.
count
<=
1
)
if
(
query
.
count
<=
1
)
{
{
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
...
@@ -132,10 +139,10 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
...
@@ -132,10 +139,10 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
}
}
// Фомирование ответа:
// Фомирование ответа:
int
num
=
0
;
// добавленное количество данных
ModbusData
num
=
0
;
// добавленное количество данных
ModbusData
reg
=
query
.
start
;
size_t
bcnt
=
numBytes
(
query
.
count
)
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
for
(
;
num
<
bcnt
;
num
++
)
{
{
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
...
@@ -143,14 +150,6 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
...
@@ -143,14 +150,6 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
reply
.
addData
(
d
);
reply
.
addData
(
d
);
}
}
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if
(
reply
.
bcnt
<
query
.
count
)
{
cerr
<<
"(readCoilStatus): Получили меньше чем ожидали. "
<<
" Запросили "
<<
query
.
count
<<
" получили "
<<
reply
.
bcnt
<<
endl
;
}
return
ModbusRTU
::
erNoError
;
return
ModbusRTU
::
erNoError
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
...
@@ -168,6 +167,13 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q
...
@@ -168,6 +167,13 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q
d
.
b
[
3
]
=
1
;
d
.
b
[
3
]
=
1
;
d
.
b
[
7
]
=
1
;
d
.
b
[
7
]
=
1
;
if
(
query
.
count
==
0
)
{
if
(
verbose
)
cout
<<
"(readInputStatus): ERROR qount=0"
<<
endl
;
return
ModbusRTU
::
erBadDataValue
;
}
if
(
replyVal
==
std
::
numeric_limits
<
uint32_t
>::
max
()
)
if
(
replyVal
==
std
::
numeric_limits
<
uint32_t
>::
max
()
)
{
{
size_t
bnum
=
0
;
size_t
bnum
=
0
;
...
@@ -185,10 +191,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q
...
@@ -185,10 +191,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q
}
}
else
else
{
{
size_t
bcnt
=
query
.
count
/
ModbusRTU
::
BitsPerByte
;
size_t
bcnt
=
ModbusRTU
::
numBytes
(
query
.
count
);
if
(
(
query
.
count
%
ModbusRTU
::
BitsPerByte
)
>
0
)
bcnt
++
;
for
(
size_t
i
=
0
;
i
<
bcnt
;
i
++
)
for
(
size_t
i
=
0
;
i
<
bcnt
;
i
++
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
...
...
extensions/ModbusMaster/tests/run_test_mbtcpmaster.sh
View file @
b4a61b20
...
@@ -15,7 +15,7 @@ cd -
...
@@ -15,7 +15,7 @@ cd -
--mbtcp-filter-value
1
\
--mbtcp-filter-value
1
\
--mbtcp-gateway-iaddr
localhost
\
--mbtcp-gateway-iaddr
localhost
\
--mbtcp-gateway-port
20048
\
--mbtcp-gateway-port
20048
\
--mbtcp-polltime
50
--mbtcp-recv-timeout
500
--mbtcp-polltime
50
--mbtcp-recv-timeout
500
#--mbtcp-log-add-levels any
#--mbtcp-log-add-levels any
#--mbtcp-default-mbinit-ok 1
#--mbtcp-default-mbinit-ok 1
#--dlog-add-levels any
#--dlog-add-levels any
...
...
extensions/ModbusMaster/tests/test_mbtcpmaster.cc
View file @
b4a61b20
...
@@ -71,7 +71,7 @@ static void InitTest()
...
@@ -71,7 +71,7 @@ static void InitTest()
throw
;
throw
;
}
}
//
mbs->setVerbose(true);
//
mbs->setVerbose(true);
CHECK
(
mbs
!=
nullptr
);
CHECK
(
mbs
!=
nullptr
);
mbs
->
execute
();
mbs
->
execute
();
...
...
include/modbus/ModbusClient.h
View file @
b4a61b20
...
@@ -132,7 +132,7 @@ namespace uniset
...
@@ -132,7 +132,7 @@ namespace uniset
\param part_timeout_msec - таймаут на получение очередной части файла.
\param part_timeout_msec - таймаут на получение очередной части файла.
*/
*/
void
fileTransfer
(
ModbusRTU
::
ModbusAddr
addr
,
ModbusRTU
::
ModbusData
idFile
,
void
fileTransfer
(
ModbusRTU
::
ModbusAddr
addr
,
ModbusRTU
::
ModbusData
idFile
,
const
char
*
save2filename
,
timeout_t
part_timeout_msec
=
2000
)
const
std
::
string
&
save2filename
,
timeout_t
part_timeout_msec
=
2000
)
throw
(
ModbusRTU
::
mbException
);
throw
(
ModbusRTU
::
mbException
);
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
...
...
include/modbus/ModbusTypes.h
View file @
b4a61b20
...
@@ -151,6 +151,7 @@ namespace uniset
...
@@ -151,6 +151,7 @@ namespace uniset
std
::
string
b2str
(
const
ModbusByte
b
);
std
::
string
b2str
(
const
ModbusByte
b
);
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
float
dat2f
(
const
ModbusData
dat1
,
const
ModbusData
dat2
);
float
dat2f
(
const
ModbusData
dat1
,
const
ModbusData
dat2
);
size_t
numBytes
(
const
size_t
nbits
);
// сколько байт нужно для указанного количества бит
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
isWriteFunction
(
SlaveFunctionCode
c
);
bool
isWriteFunction
(
SlaveFunctionCode
c
);
bool
isReadFunction
(
SlaveFunctionCode
c
);
bool
isReadFunction
(
SlaveFunctionCode
c
);
...
@@ -392,7 +393,7 @@ namespace uniset
...
@@ -392,7 +393,7 @@ namespace uniset
* \return TRUE - если есть
* \return TRUE - если есть
* \return FALSE - если НЕ найдено
* \return FALSE - если НЕ найдено
*/
*/
bool
setBit
(
u
nsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
);
bool
setBit
(
u
int8_t
dnum
,
uint8_t
bnum
,
bool
state
);
/*! получение данных.
/*! получение данных.
* \param bnum - номер байта(0..MAXLENPACKET)
* \param bnum - номер байта(0..MAXLENPACKET)
...
@@ -400,7 +401,7 @@ namespace uniset
...
@@ -400,7 +401,7 @@ namespace uniset
* \return TRUE - если есть
* \return TRUE - если есть
* \return FALSE - если НЕ найдено
* \return FALSE - если НЕ найдено
*/
*/
bool
getData
(
u
nsigned
char
bnum
,
DataBits
&
d
)
const
;
bool
getData
(
u
int8_t
bnum
,
DataBits
&
d
)
const
;
/*! очистка данных */
/*! очистка данных */
void
clear
();
void
clear
();
...
@@ -492,7 +493,7 @@ namespace uniset
...
@@ -492,7 +493,7 @@ namespace uniset
* \return TRUE - если есть
* \return TRUE - если есть
* \return FALSE - если НЕ найдено
* \return FALSE - если НЕ найдено
*/
*/
bool
setBit
(
u
nsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
);
bool
setBit
(
u
int8_t
dnum
,
uint8_t
bnum
,
bool
state
);
/*! получение данных.
/*! получение данных.
* \param dnum - номер байта (0..MAXLENPACKET)
* \param dnum - номер байта (0..MAXLENPACKET)
...
@@ -500,7 +501,7 @@ namespace uniset
...
@@ -500,7 +501,7 @@ namespace uniset
* \return TRUE - если есть
* \return TRUE - если есть
* \return FALSE - если НЕ найдено
* \return FALSE - если НЕ найдено
*/
*/
bool
getData
(
u
nsigned
char
dnum
,
DataBits
&
d
)
const
;
bool
getData
(
u
int8_t
dnum
,
DataBits
&
d
)
const
;
/*! очистка данных */
/*! очистка данных */
void
clear
();
void
clear
();
...
@@ -727,7 +728,7 @@ namespace uniset
...
@@ -727,7 +728,7 @@ namespace uniset
// -1 - error
// -1 - error
int
addBit
(
bool
state
);
int
addBit
(
bool
state
);
bool
setBit
(
in
t
nbit
,
bool
state
);
bool
setBit
(
uint8_
t
nbit
,
bool
state
);
inline
size_t
last
()
const
inline
size_t
last
()
const
{
{
...
@@ -740,9 +741,7 @@ namespace uniset
...
@@ -740,9 +741,7 @@ namespace uniset
* \return TRUE - если есть
* \return TRUE - если есть
* \return FALSE - если НЕ найдено
* \return FALSE - если НЕ найдено
*/
*/
bool
getData
(
unsigned
char
dnum
,
DataBits
&
d
);
bool
getData
(
uint8_t
dnum
,
DataBits
&
d
);
bool
getBit
(
unsigned
char
bnum
);
void
clear
();
void
clear
();
inline
bool
isFull
()
const
inline
bool
isFull
()
const
...
...
src/Communications/Modbus/ModbusClient.cc
View file @
b4a61b20
...
@@ -69,7 +69,7 @@ namespace uniset
...
@@ -69,7 +69,7 @@ namespace uniset
{
{
ReadCoilRetMessage
ret
(
qreply
);
ReadCoilRetMessage
ret
(
qreply
);
if
(
ret
.
bcnt
!=
(
count
*
2
)
)
if
(
ret
.
bcnt
!=
numBytes
(
count
)
)
throw
mbException
(
erBadDataValue
);
throw
mbException
(
erBadDataValue
);
return
ret
;
return
ret
;
...
@@ -90,7 +90,7 @@ namespace uniset
...
@@ -90,7 +90,7 @@ namespace uniset
{
{
ReadInputStatusRetMessage
ret
(
qreply
);
ReadInputStatusRetMessage
ret
(
qreply
);
if
(
ret
.
bcnt
!=
(
count
*
2
)
)
if
(
ret
.
bcnt
!=
numBytes
(
count
)
)
throw
mbException
(
erBadDataValue
);
throw
mbException
(
erBadDataValue
);
return
ret
;
return
ret
;
...
@@ -309,15 +309,15 @@ namespace uniset
...
@@ -309,15 +309,15 @@ namespace uniset
throw
mbException
(
res
);
throw
mbException
(
res
);
}
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
void
ModbusClient
::
fileTransfer
(
ModbusAddr
addr
,
ModbusData
numfile
,
void
ModbusClient
::
fileTransfer
(
ModbusAddr
addr
,
ModbusData
numfile
,
const
char
*
save2filename
,
timeout_t
part_timeout_msec
)
const
std
::
string
&
save2filename
,
timeout_t
part_timeout_msec
)
throw
(
ModbusRTU
::
mbException
)
throw
(
ModbusRTU
::
mbException
)
{
{
//#warning Необходимо реализовать
//#warning Необходимо реализовать
// throw mbException(erUnExpectedPacketType);
// throw mbException(erUnExpectedPacketType);
mbErrCode
res
=
erNoError
;
mbErrCode
res
=
erNoError
;
FILE
*
fdsave
=
fopen
(
save2filename
,
"w"
);
FILE
*
fdsave
=
fopen
(
save2filename
.
c_str
()
,
"w"
);
if
(
fdsave
==
NULL
)
if
(
fdsave
==
NULL
)
{
{
...
@@ -329,8 +329,8 @@ namespace uniset
...
@@ -329,8 +329,8 @@ namespace uniset
throw
mbException
(
erHardwareError
);
throw
mbException
(
erHardwareError
);
}
}
u
nsigned
short
maxpackets
=
65535
;
u
int16_t
maxpackets
=
65535
;
u
nsigned
short
curpack
=
0
;
u
int16_t
curpack
=
0
;
PassiveTimer
ptTimeout
(
part_timeout_msec
);
PassiveTimer
ptTimeout
(
part_timeout_msec
);
...
...
src/Communications/Modbus/ModbusTypes.cc
View file @
b4a61b20
...
@@ -474,7 +474,7 @@ namespace uniset
...
@@ -474,7 +474,7 @@ namespace uniset
{
{
ModbusByte
ubyte
=
0
;
ModbusByte
ubyte
=
0
;
for
(
unsigned
in
t
i
=
0
;
i
<
b
.
size
();
i
++
)
for
(
size_
t
i
=
0
;
i
<
b
.
size
();
i
++
)
{
{
if
(
b
[
i
]
)
if
(
b
[
i
]
)
ubyte
|=
1
<<
i
;
ubyte
|=
1
<<
i
;
...
@@ -485,7 +485,7 @@ namespace uniset
...
@@ -485,7 +485,7 @@ namespace uniset
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
const
DataBits
&
DataBits
::
operator
=
(
const
ModbusByte
&
r
)
const
DataBits
&
DataBits
::
operator
=
(
const
ModbusByte
&
r
)
{
{
for
(
unsigned
in
t
i
=
0
;
i
<
b
.
size
();
i
++
)
for
(
size_
t
i
=
0
;
i
<
b
.
size
();
i
++
)
b
[
i
]
=
r
&
(
1
<<
i
);
b
[
i
]
=
r
&
(
1
<<
i
);
return
(
*
this
);
return
(
*
this
);
...
@@ -495,7 +495,7 @@ namespace uniset
...
@@ -495,7 +495,7 @@ namespace uniset
{
{
os
<<
"["
;
os
<<
"["
;
for
(
in
t
i
=
d
.
b
.
size
()
-
1
;
i
>=
0
;
i
--
)
for
(
size_
t
i
=
d
.
b
.
size
()
-
1
;
i
>=
0
;
i
--
)
os
<<
d
.
b
[
i
];
os
<<
d
.
b
[
i
];
os
<<
"]"
;
os
<<
"]"
;
...
@@ -533,7 +533,7 @@ namespace uniset
...
@@ -533,7 +533,7 @@ namespace uniset
{
{
ModbusData
udata
=
0
;
ModbusData
udata
=
0
;
for
(
unsigned
in
t
i
=
0
;
i
<
b
.
size
();
i
++
)
for
(
size_
t
i
=
0
;
i
<
b
.
size
();
i
++
)
{
{
if
(
b
[
i
]
)
if
(
b
[
i
]
)
udata
|=
1
<<
i
;
udata
|=
1
<<
i
;
...
@@ -546,7 +546,7 @@ namespace uniset
...
@@ -546,7 +546,7 @@ namespace uniset
{
{
const
size_t
sz
=
b
.
size
();
const
size_t
sz
=
b
.
size
();
for
(
unsigned
in
t
i
=
0
;
i
<
sz
;
i
++
)
for
(
size_
t
i
=
0
;
i
<
sz
;
i
++
)
b
[
i
]
=
r
&
(
1
<<
i
);
b
[
i
]
=
r
&
(
1
<<
i
);
return
(
*
this
);
return
(
*
this
);
...
@@ -556,7 +556,7 @@ namespace uniset
...
@@ -556,7 +556,7 @@ namespace uniset
{
{
os
<<
"["
;
os
<<
"["
;
for
(
in
t
i
=
d
.
b
.
size
()
-
1
;
i
>=
0
;
i
--
)
for
(
size_
t
i
=
d
.
b
.
size
()
-
1
;
i
>=
0
;
i
--
)
os
<<
d
.
b
[
i
];
os
<<
d
.
b
[
i
];
os
<<
"]"
;
os
<<
"]"
;
...
@@ -613,7 +613,7 @@ namespace uniset
...
@@ -613,7 +613,7 @@ namespace uniset
memset
(
data
,
0
,
sizeof
(
data
));
memset
(
data
,
0
,
sizeof
(
data
));
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ReadCoilRetMessage
::
setBit
(
u
nsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
)
bool
ReadCoilRetMessage
::
setBit
(
u
int8_t
dnum
,
uint8_t
bnum
,
bool
state
)
{
{
if
(
dnum
<
bcnt
&&
bnum
<
BitsPerByte
)
if
(
dnum
<
bcnt
&&
bnum
<
BitsPerByte
)
{
{
...
@@ -635,7 +635,7 @@ namespace uniset
...
@@ -635,7 +635,7 @@ namespace uniset
return
true
;
return
true
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ReadCoilRetMessage
::
getData
(
u
nsigned
char
dnum
,
DataBits
&
d
)
const
bool
ReadCoilRetMessage
::
getData
(
u
int8_t
dnum
,
DataBits
&
d
)
const
{
{
if
(
dnum
<
bcnt
)
if
(
dnum
<
bcnt
)
{
{
...
@@ -656,7 +656,7 @@ namespace uniset
...
@@ -656,7 +656,7 @@ namespace uniset
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
// assert(sizeof(ModbusMessage)>=sizeof(ReadCoilRetMessage));
// assert(sizeof(ModbusMessage)>=sizeof(ReadCoilRetMessage));
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -814,7 +814,7 @@ namespace uniset
...
@@ -814,7 +814,7 @@ namespace uniset
memset
(
data
,
0
,
sizeof
(
data
));
memset
(
data
,
0
,
sizeof
(
data
));
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ReadInputStatusRetMessage
::
setBit
(
u
nsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
)
bool
ReadInputStatusRetMessage
::
setBit
(
u
int8_t
dnum
,
uint8_t
bnum
,
bool
state
)
{
{
if
(
dnum
<
bcnt
&&
bnum
<
BitsPerByte
)
if
(
dnum
<
bcnt
&&
bnum
<
BitsPerByte
)
{
{
...
@@ -836,7 +836,7 @@ namespace uniset
...
@@ -836,7 +836,7 @@ namespace uniset
return
true
;
return
true
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ReadInputStatusRetMessage
::
getData
(
u
nsigned
char
dnum
,
DataBits
&
d
)
const
bool
ReadInputStatusRetMessage
::
getData
(
u
int8_t
dnum
,
DataBits
&
d
)
const
{
{
if
(
dnum
<
bcnt
)
if
(
dnum
<
bcnt
)
{
{
...
@@ -857,7 +857,7 @@ namespace uniset
...
@@ -857,7 +857,7 @@ namespace uniset
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
// assert(sizeof(ModbusMessage)>=sizeof(ReadCoilRetMessage));
// assert(sizeof(ModbusMessage)>=sizeof(ReadCoilRetMessage));
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -1005,7 +1005,7 @@ namespace uniset
...
@@ -1005,7 +1005,7 @@ namespace uniset
memcpy
(
&
data
,
&
(
m
.
data
[
1
]),
bcnt
);
memcpy
(
&
data
,
&
(
m
.
data
[
1
]),
bcnt
);
// переворачиваем данные
// переворачиваем данные
for
(
unsigned
in
t
i
=
0
;
i
<
cnt
;
i
++
)
for
(
size_
t
i
=
0
;
i
<
cnt
;
i
++
)
data
[
i
]
=
SWAPSHORT
(
data
[
i
]);
data
[
i
]
=
SWAPSHORT
(
data
[
i
]);
memcpy
(
&
crc
,
&
(
m
.
data
[
bcnt
+
1
]),
szCRC
);
memcpy
(
&
crc
,
&
(
m
.
data
[
bcnt
+
1
]),
szCRC
);
...
@@ -1049,7 +1049,7 @@ namespace uniset
...
@@ -1049,7 +1049,7 @@ namespace uniset
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
// assert(sizeof(ModbusMessage)>=sizeof(ReadOutputRetMessage));
// assert(sizeof(ModbusMessage)>=sizeof(ReadOutputRetMessage));
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -1264,7 +1264,7 @@ namespace uniset
...
@@ -1264,7 +1264,7 @@ namespace uniset
ModbusMessage
ReadInputRetMessage
::
transport_msg
()
ModbusMessage
ReadInputRetMessage
::
transport_msg
()
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -1343,7 +1343,7 @@ namespace uniset
...
@@ -1343,7 +1343,7 @@ namespace uniset
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
int
ForceCoilsMessage
::
addBit
(
bool
state
)
int
ForceCoilsMessage
::
addBit
(
bool
state
)
{
{
in
t
qnum
=
quant
%
BitsPerByte
;
size_
t
qnum
=
quant
%
BitsPerByte
;
if
(
qnum
==
0
)
if
(
qnum
==
0
)
bcnt
++
;
bcnt
++
;
...
@@ -1355,13 +1355,13 @@ namespace uniset
...
@@ -1355,13 +1355,13 @@ namespace uniset
return
(
quant
-
1
);
return
(
quant
-
1
);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
setBit
(
in
t
nbit
,
bool
state
)
bool
ForceCoilsMessage
::
setBit
(
uint8_
t
nbit
,
bool
state
)
{
{
if
(
nbit
<
0
||
nbit
>=
quant
)
if
(
nbit
<
0
||
nbit
>=
quant
)
return
false
;
return
false
;
in
t
bnum
=
nbit
/
BitsPerByte
;
size_
t
bnum
=
nbit
/
BitsPerByte
;
in
t
qnum
=
nbit
%
BitsPerByte
;
size_
t
qnum
=
nbit
%
BitsPerByte
;
DataBits
b
(
data
[
bnum
]);
DataBits
b
(
data
[
bnum
]);
b
.
b
[
qnum
]
=
state
;
b
.
b
[
qnum
]
=
state
;
...
@@ -1369,7 +1369,7 @@ namespace uniset
...
@@ -1369,7 +1369,7 @@ namespace uniset
return
true
;
return
true
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
getData
(
u
nsigned
char
dnum
,
DataBits
&
d
)
bool
ForceCoilsMessage
::
getData
(
u
int8_t
dnum
,
DataBits
&
d
)
{
{
if
(
dnum
<
bcnt
)
if
(
dnum
<
bcnt
)
{
{
...
@@ -1390,7 +1390,7 @@ namespace uniset
...
@@ -1390,7 +1390,7 @@ namespace uniset
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusMessage
ForceCoilsMessage
::
transport_msg
()
ModbusMessage
ForceCoilsMessage
::
transport_msg
()
{
{
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
ModbusMessage
mm
;
ModbusMessage
mm
;
// копируем заголовок
// копируем заголовок
...
@@ -1625,7 +1625,7 @@ namespace uniset
...
@@ -1625,7 +1625,7 @@ namespace uniset
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusMessage
WriteOutputMessage
::
transport_msg
()
ModbusMessage
WriteOutputMessage
::
transport_msg
()
{
{
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
ModbusMessage
mm
;
ModbusMessage
mm
;
// копируем заголовок
// копируем заголовок
...
@@ -2343,7 +2343,7 @@ namespace uniset
...
@@ -2343,7 +2343,7 @@ namespace uniset
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
// assert(sizeof(ModbusMessage)>=sizeof(DiagnosticMessage));
// assert(sizeof(ModbusMessage)>=sizeof(DiagnosticMessage));
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -2456,7 +2456,7 @@ namespace uniset
...
@@ -2456,7 +2456,7 @@ namespace uniset
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusMessage
MEIMessageRDI
::
transport_msg
()
ModbusMessage
MEIMessageRDI
::
transport_msg
()
{
{
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
ModbusMessage
mm
;
ModbusMessage
mm
;
// копируем заголовок
// копируем заголовок
...
@@ -2679,7 +2679,7 @@ namespace uniset
...
@@ -2679,7 +2679,7 @@ namespace uniset
ModbusMessage
MEIMessageRetRDI
::
transport_msg
()
ModbusMessage
MEIMessageRetRDI
::
transport_msg
()
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -2820,7 +2820,7 @@ namespace uniset
...
@@ -2820,7 +2820,7 @@ namespace uniset
// копируем
// копируем
memcpy
(
data
,
buf
,
len
);
memcpy
(
data
,
buf
,
len
);
count
=
len
/
sizeof
(
ModbusData
);
count
=
len
/
sizeof
(
ModbusData
);
// выравниваем до границы слова..
// выравниваем до границы слова..
if
(
len
%
sizeof
(
ModbusData
)
)
if
(
len
%
sizeof
(
ModbusData
)
)
...
@@ -2841,7 +2841,7 @@ namespace uniset
...
@@ -2841,7 +2841,7 @@ namespace uniset
{
{
ModbusMessage
mm
;
ModbusMessage
mm
;
// assert(sizeof(ModbusMessage)>=sizeof(ReadOutputRetMessage));
// assert(sizeof(ModbusMessage)>=sizeof(ReadOutputRetMessage));
assert
(
sizeof
(
ModbusMessage
)
>=
(
unsigned
int
)
szModbusHeader
+
szData
()
);
assert
(
sizeof
(
ModbusMessage
)
>=
szModbusHeader
+
szData
()
);
// копируем заголовок и данные
// копируем заголовок и данные
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
memcpy
(
&
mm
.
pduhead
,
this
,
szModbusHeader
);
...
@@ -2961,14 +2961,14 @@ namespace uniset
...
@@ -2961,14 +2961,14 @@ namespace uniset
std
::
string
ModbusRTU
::
addr2str
(
const
ModbusAddr
addr
)
std
::
string
ModbusRTU
::
addr2str
(
const
ModbusAddr
addr
)
{
{
ostringstream
s
;
ostringstream
s
;
s
<<
"0x"
<<
hex
<<
setfill
(
'0'
)
<<
setw
(
2
)
<<
(
unsigned
shor
t
)
addr
;
s
<<
"0x"
<<
hex
<<
setfill
(
'0'
)
<<
setw
(
2
)
<<
(
in
t
)
addr
;
return
s
.
str
();
return
s
.
str
();
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
std
::
string
ModbusRTU
::
b2str
(
const
ModbusByte
b
)
std
::
string
ModbusRTU
::
b2str
(
const
ModbusByte
b
)
{
{
ostringstream
s
;
ostringstream
s
;
s
<<
hex
<<
setfill
(
'0'
)
<<
setw
(
2
)
<<
(
unsigned
shor
t
)
b
;
s
<<
hex
<<
setfill
(
'0'
)
<<
setw
(
2
)
<<
(
in
t
)
b
;
return
s
.
str
();
return
s
.
str
();
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
...
@@ -3634,7 +3634,7 @@ namespace uniset
...
@@ -3634,7 +3634,7 @@ namespace uniset
s
<<
id
;
s
<<
id
;
return
s
.
str
();
return
s
.
str
();
}
}
// ----------------------------------------------------------------------
-
// ----------------------------------------------------------------------
ModbusRTU
::
RegID
ModbusRTU
::
genRegID
(
const
ModbusRTU
::
ModbusData
mbreg
,
const
int
fn
)
ModbusRTU
::
RegID
ModbusRTU
::
genRegID
(
const
ModbusRTU
::
ModbusData
mbreg
,
const
int
fn
)
{
{
// диапазоны:
// диапазоны:
...
@@ -3646,5 +3646,20 @@ namespace uniset
...
@@ -3646,5 +3646,20 @@ namespace uniset
// fn необходимо привести к диапазону 0..max
// fn необходимо привести к диапазону 0..max
return
max
+
mbreg
+
max
+
uniset
::
lcalibrate
(
fn
,
0
,
fn_max
,
0
,
max
,
false
);
return
max
+
mbreg
+
max
+
uniset
::
lcalibrate
(
fn
,
0
,
fn_max
,
0
,
max
,
false
);
}
}
// ----------------------------------------------------------------------
size_t
ModbusRTU
::
numBytes
(
const
size_t
nbits
)
{
if
(
nbits
==
0
)
return
0
;
if
(
nbits
<
ModbusRTU
::
BitsPerByte
)
return
1
;
size_t
bcnt
=
(
nbits
/
ModbusRTU
::
BitsPerByte
);
if
(
nbits
%
BitsPerByte
)
bcnt
++
;
return
bcnt
;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
}
// end of namespace uniset
}
// end of namespace uniset
tests/test_modbustypes.cc
View file @
b4a61b20
...
@@ -112,6 +112,19 @@ TEST_CASE("checkCRC", "[modbus][checkCRC]" )
...
@@ -112,6 +112,19 @@ TEST_CASE("checkCRC", "[modbus][checkCRC]" )
// ModbusCRC checkCRC( ModbusByte* start, int len );
// ModbusCRC checkCRC( ModbusByte* start, int len );
}
}
// ---------------------------------------------------------------
// ---------------------------------------------------------------
TEST_CASE
(
"numBytes function"
,
"[modbus][numbytes]"
)
{
REQUIRE
(
ModbusRTU
::
numBytes
(
0
)
==
0
);
REQUIRE
(
ModbusRTU
::
numBytes
(
1
)
==
1
);
REQUIRE
(
ModbusRTU
::
numBytes
(
8
)
==
1
);
REQUIRE
(
ModbusRTU
::
numBytes
(
10
)
==
2
);
REQUIRE
(
ModbusRTU
::
numBytes
(
16
)
==
2
);
REQUIRE
(
ModbusRTU
::
numBytes
(
256
)
==
32
);
REQUIRE
(
ModbusRTU
::
numBytes
(
257
)
==
33
);
}
// ---------------------------------------------------------------
#if 0
#if 0
#warning VERY LONG TIME TEST
#warning VERY LONG TIME TEST
TEST_CASE("genRegID", "[modbus][genRegID]" )
TEST_CASE("genRegID", "[modbus][genRegID]" )
...
...
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