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
b9c92a58
Commit
b9c92a58
authored
Dec 13, 2016
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(Modbus): рефакторинг кода и тестов, корректировка под 64bit
parent
de872cfc
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
164 additions
and
146 deletions
+164
-146
libuniset2.spec
conf/libuniset2.spec
+1
-0
MBExchange.cc
extensions/ModbusMaster/MBExchange.cc
+92
-89
MBTCPTestServer.cc
extensions/ModbusMaster/tests/MBTCPTestServer.cc
+9
-8
MBTCPTestServer.h
extensions/ModbusMaster/tests/MBTCPTestServer.h
+4
-4
run_test_mbtcpmaster.sh
extensions/ModbusMaster/tests/run_test_mbtcpmaster.sh
+0
-0
test_mbtcpmaster.cc
extensions/ModbusMaster/tests/test_mbtcpmaster.cc
+26
-18
test_mbtcpmultimaster.cc
extensions/ModbusMaster/tests/test_mbtcpmultimaster.cc
+2
-0
VTypes.h
extensions/include/VTypes.h
+30
-27
No files found.
conf/libuniset2.spec
View file @
b9c92a58
...
...
@@ -505,6 +505,7 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet2.pc
# history of current unpublished changes
# Modbus: refactoring code and test (for 64bit)
%changelog
* Mon Dec 12 2016 Pavel Vainerman <pv@altlinux.ru> 2.6-alt6
...
...
extensions/ModbusMaster/MBExchange.cc
View file @
b9c92a58
...
...
@@ -30,6 +30,22 @@ namespace uniset
using
namespace
std
;
using
namespace
uniset
::
extensions
;
// -----------------------------------------------------------------------------
// вспомогательная структура для предотвращения утечки памяти
struct
DataGuard
{
DataGuard
(
size_t
sz
)
{
data
=
new
ModbusRTU
::
ModbusData
[
sz
];
}
~
DataGuard
()
{
delete
[]
data
;
}
ModbusRTU
::
ModbusData
*
data
;
};
// -----------------------------------------------------------------------------
MBExchange
::
MBExchange
(
uniset
::
ObjectId
objId
,
uniset
::
ObjectId
shmId
,
const
std
::
shared_ptr
<
SharedMemory
>&
_ic
,
const
std
::
string
&
prefix
)
:
UniSetObject
(
objId
),
...
...
@@ -715,7 +731,7 @@ namespace uniset
return
true
;
auto
dev
=
p
->
dev
;
unsigned
in
t
q_count
=
p
->
p
.
rnum
;
size_
t
q_count
=
p
->
p
.
rnum
;
if
(
mblog
->
is_level3
()
)
{
...
...
@@ -754,38 +770,36 @@ namespace uniset
case
ModbusRTU
:
:
fnReadInputStatus
:
{
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mbreg
,
q_count
);
ModbusRTU
::
ModbusData
*
dat
=
new
ModbusRTU
::
ModbusData
[
q_count
]
;
unsigned
in
t
m
=
0
;
DataGuard
d
(
q_count
)
;
size_
t
m
=
0
;
for
(
unsigned
in
t
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
for
(
size_
t
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
unsigned
in
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
q_count
;
k
++
,
m
++
)
d
at
[
m
]
=
b
[
k
];
for
(
size_
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
q_count
;
k
++
,
m
++
)
d
.
data
[
m
]
=
b
[
k
];
}
p
->
initOK
=
initSMValue
(
dat
,
q_count
,
&
(
p
->
p
));
delete
[]
dat
;
p
->
initOK
=
initSMValue
(
d
.
data
,
q_count
,
&
(
p
->
p
));
}
break
;
case
ModbusRTU
:
:
fnReadCoilStatus
:
{
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
->
read01
(
dev
->
mbaddr
,
p
->
mbreg
,
q_count
);
ModbusRTU
::
ModbusData
*
dat
=
new
ModbusRTU
::
ModbusData
[
q_count
]
;
unsigned
in
t
m
=
0
;
DataGuard
d
(
q_count
)
;
size_
t
m
=
0
;
for
(
unsigned
in
t
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
for
(
size_
t
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
unsigned
in
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
q_count
;
k
++
,
m
++
)
d
at
[
m
]
=
b
[
k
];
for
(
size_
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
q_count
;
k
++
,
m
++
)
d
.
data
[
m
]
=
b
[
k
];
}
p
->
initOK
=
initSMValue
(
dat
,
q_count
,
&
(
p
->
p
));
delete
[]
dat
;
p
->
initOK
=
initSMValue
(
d
.
data
,
q_count
,
&
(
p
->
p
));
}
break
;
...
...
@@ -833,7 +847,7 @@ namespace uniset
IOBase
::
processingAsDI
(
p
,
data
[
0
],
shm
,
true
);
}
else
IOBase
::
processingAsAI
(
p
,
(
signed
shor
t
)(
data
[
0
]),
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
int16_
t
)(
data
[
0
]),
shm
,
true
);
return
true
;
}
...
...
@@ -851,7 +865,7 @@ namespace uniset
IOBase
::
processingAsDI
(
p
,
data
[
0
],
shm
,
true
);
}
else
IOBase
::
processingAsAI
(
p
,
(
signed
shor
t
)(
data
[
0
]),
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
int16_
t
)(
data
[
0
]),
shm
,
true
);
return
true
;
}
...
...
@@ -863,7 +877,7 @@ namespace uniset
IOBase
::
processingAsDI
(
p
,
data
[
0
],
shm
,
true
);
}
else
IOBase
::
processingAsAI
(
p
,
(
u
nsigned
shor
t
)
data
[
0
],
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
u
int16_
t
)
data
[
0
],
shm
,
true
);
return
true
;
}
...
...
@@ -898,22 +912,22 @@ namespace uniset
else
if
(
p
->
vType
==
VTypes
::
vtI2
)
{
VTypes
::
I2
i2
(
data
,
VTypes
::
I2
::
wsize
());
IOBase
::
processingAsAI
(
p
,
(
int
)
i2
,
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
int
32_t
)
i2
,
shm
,
true
);
}
else
if
(
p
->
vType
==
VTypes
::
vtI2r
)
{
VTypes
::
I2r
i2
(
data
,
VTypes
::
I2
::
wsize
());
IOBase
::
processingAsAI
(
p
,
(
int
)
i2
,
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
int
32_t
)
i2
,
shm
,
true
);
}
else
if
(
p
->
vType
==
VTypes
::
vtU2
)
{
VTypes
::
U2
u2
(
data
,
VTypes
::
U2
::
wsize
());
IOBase
::
processingAsAI
(
p
,
(
u
nsigned
in
t
)
u2
,
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
u
int32_
t
)
u2
,
shm
,
true
);
}
else
if
(
p
->
vType
==
VTypes
::
vtU2r
)
{
VTypes
::
U2r
u2
(
data
,
VTypes
::
U2
::
wsize
());
IOBase
::
processingAsAI
(
p
,
(
u
nsigned
in
t
)
u2
,
shm
,
true
);
IOBase
::
processingAsAI
(
p
,
(
u
int32_
t
)
u2
,
shm
,
true
);
}
return
true
;
...
...
@@ -996,7 +1010,7 @@ namespace uniset
{
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
->
read04
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
for
(
unsigned
in
t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
for
(
size_
t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
{
it
->
second
->
mbval
=
ret
.
data
[
i
];
it
->
second
->
mb_initOK
=
true
;
...
...
@@ -1010,7 +1024,7 @@ namespace uniset
{
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
->
read03
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
for
(
unsigned
in
t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
for
(
size_
t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
{
it
->
second
->
mbval
=
ret
.
data
[
i
];
it
->
second
->
mb_initOK
=
true
;
...
...
@@ -1023,13 +1037,13 @@ namespace uniset
case
ModbusRTU
:
:
fnReadInputStatus
:
{
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
unsigned
in
t
m
=
0
;
size_
t
m
=
0
;
for
(
uint
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
unsigned
in
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
for
(
size_
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
{
it
->
second
->
mbval
=
b
[
k
];
it
->
second
->
mb_initOK
=
true
;
...
...
@@ -1043,13 +1057,13 @@ namespace uniset
case
ModbusRTU
:
:
fnReadCoilStatus
:
{
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
->
read01
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
unsigned
in
t
m
=
0
;
size_
t
m
=
0
;
for
(
auto
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
unsigned
in
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
for
(
size_
t
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
{
it
->
second
->
mbval
=
b
[
k
]
?
1
:
0
;
it
->
second
->
mb_initOK
=
true
;
...
...
@@ -1102,7 +1116,7 @@ namespace uniset
ModbusRTU
::
WriteOutputMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
for
(
unsigned
in
t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
for
(
size_
t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
msg
.
addData
(
it
->
second
->
mbval
);
it
--
;
...
...
@@ -1144,7 +1158,7 @@ namespace uniset
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
for
(
unsigned
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
for
(
size_t
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
msg
.
addBit
(
(
it
->
second
->
mbval
?
true
:
false
)
);
it
--
;
...
...
@@ -1400,10 +1414,10 @@ namespace uniset
if
(
p
->
stype
==
UniversalIO
::
DI
||
p
->
stype
==
UniversalIO
::
DO
)
{
r
->
mbval
=
(
u
nsigned
shor
t
)
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
r
->
mbval
=
(
u
int16_
t
)
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
}
else
r
->
mbval
=
(
u
nsigned
shor
t
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
mbval
=
(
u
int16_
t
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
...
...
@@ -1417,7 +1431,7 @@ namespace uniset
}
else
{
IOBase
::
processingAsAI
(
p
,
(
u
nsigned
shor
t
)
r
->
mbval
,
shm
,
force
);
IOBase
::
processingAsAI
(
p
,
(
u
int16_
t
)
r
->
mbval
,
shm
,
force
);
}
}
...
...
@@ -1481,26 +1495,24 @@ namespace uniset
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
VTypes
::
F2
::
wsize
()]
;
DataGuard
d
(
VTypes
::
F2
::
wsize
())
;
for
(
size_t
k
=
0
;
k
<
VTypes
::
F2
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
float
f
=
0
;
if
(
p
->
vType
==
VTypes
::
vtF2
)
{
VTypes
::
F2
f1
(
data
,
VTypes
::
F2
::
wsize
());
VTypes
::
F2
f1
(
d
.
d
ata
,
VTypes
::
F2
::
wsize
());
f
=
(
float
)
f1
;
}
else
if
(
p
->
vType
==
VTypes
::
vtF2r
)
{
VTypes
::
F2r
f1
(
data
,
VTypes
::
F2r
::
wsize
());
VTypes
::
F2r
f1
(
d
.
d
ata
,
VTypes
::
F2r
::
wsize
());
f
=
(
float
)
f1
;
}
delete
[]
data
;
IOBase
::
processingFasAI
(
p
,
f
,
shm
,
force
);
}
}
...
...
@@ -1523,13 +1535,12 @@ namespace uniset
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
VTypes
::
F4
::
wsize
()]
;
DataGuard
d
(
VTypes
::
F4
::
wsize
())
;
for
(
size_t
k
=
0
;
k
<
VTypes
::
F4
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
VTypes
::
F4
f
(
data
,
VTypes
::
F4
::
wsize
());
delete
[]
data
;
VTypes
::
F4
f
(
d
.
data
,
VTypes
::
F4
::
wsize
());
IOBase
::
processingFasAI
(
p
,
(
float
)
f
,
shm
,
force
);
}
...
...
@@ -1546,14 +1557,14 @@ namespace uniset
if
(
p
->
vType
==
VTypes
::
vtI2
)
{
VTypes
::
I2
i2
(
v
);
VTypes
::
I2
i2
(
(
int32_t
)
v
);
for
(
size_t
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
i2
.
raw
.
v
[
k
];
}
else
if
(
p
->
vType
==
VTypes
::
vtI2r
)
{
VTypes
::
I2r
i2
(
v
);
VTypes
::
I2r
i2
(
(
int32_t
)
v
);
for
(
size_t
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
i2
.
raw
.
v
[
k
];
...
...
@@ -1564,25 +1575,24 @@ namespace uniset
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
VTypes
::
I2
::
wsize
()]
;
DataGuard
d
(
VTypes
::
I2
::
wsize
())
;
for
(
size_t
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
int
v
=
0
;
if
(
p
->
vType
==
VTypes
::
vtI2
)
{
VTypes
::
I2
i2
(
data
,
VTypes
::
I2
::
wsize
());
VTypes
::
I2
i2
(
d
.
d
ata
,
VTypes
::
I2
::
wsize
());
v
=
(
int
)
i2
;
}
else
if
(
p
->
vType
==
VTypes
::
vtI2r
)
{
VTypes
::
I2r
i2
(
data
,
VTypes
::
I2
::
wsize
());
VTypes
::
I2r
i2
(
d
.
d
ata
,
VTypes
::
I2
::
wsize
());
v
=
(
int
)
i2
;
}
delete
[]
data
;
IOBase
::
processingAsAI
(
p
,
v
,
shm
,
force
);
}
}
...
...
@@ -1616,25 +1626,24 @@ namespace uniset
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
VTypes
::
U2
::
wsize
()]
;
DataGuard
d
(
VTypes
::
U2
::
wsize
())
;
for
(
size_t
k
=
0
;
k
<
VTypes
::
U2
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
u
nsigned
in
t
v
=
0
;
u
int32_
t
v
=
0
;
if
(
p
->
vType
==
VTypes
::
vtU2
)
{
VTypes
::
U2
u2
(
data
,
VTypes
::
U2
::
wsize
());
v
=
(
u
nsigned
in
t
)
u2
;
VTypes
::
U2
u2
(
d
.
d
ata
,
VTypes
::
U2
::
wsize
());
v
=
(
u
int32_
t
)
u2
;
}
else
if
(
p
->
vType
==
VTypes
::
vtU2r
)
{
VTypes
::
U2r
u2
(
data
,
VTypes
::
U2
::
wsize
());
v
=
(
u
nsigned
in
t
)
u2
;
VTypes
::
U2r
u2
(
d
.
d
ata
,
VTypes
::
U2
::
wsize
());
v
=
(
u
int32_
t
)
u2
;
}
delete
[]
data
;
IOBase
::
processingAsAI
(
p
,
v
,
shm
,
force
);
}
}
...
...
@@ -1727,18 +1736,17 @@ namespace uniset
{
MTR
::
T3
t
(
IOBase
::
processingAsAO
(
&
(
*
it
),
shm
,
force_out
));
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T3
::
wsize
();
k
++
,
i
++
)
for
(
size_
t
k
=
0
;
k
<
MTR
::
T3
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
t
.
raw
.
v
[
k
];
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
MTR
::
T3
::
wsize
()]
;
DataGuard
d
(
MTR
::
T3
::
wsize
())
;
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T3
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
for
(
size_
t
k
=
0
;
k
<
MTR
::
T3
::
wsize
();
k
++
,
i
++
)
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
MTR
::
T3
t
(
data
,
MTR
::
T3
::
wsize
());
delete
[]
data
;
MTR
::
T3
t
(
d
.
data
,
MTR
::
T3
::
wsize
());
IOBase
::
processingAsAI
(
&
(
*
it
),
(
long
)
t
,
shm
,
force
);
}
...
...
@@ -1768,18 +1776,17 @@ namespace uniset
{
MTR
::
T5
t
(
IOBase
::
processingAsAO
(
&
(
*
it
),
shm
,
force_out
));
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T5
::
wsize
();
k
++
,
i
++
)
for
(
size_
t
k
=
0
;
k
<
MTR
::
T5
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
t
.
raw
.
v
[
k
];
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
MTR
::
T5
::
wsize
()]
;
DataGuard
d
(
MTR
::
T5
::
wsize
())
;
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T5
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
for
(
size_
t
k
=
0
;
k
<
MTR
::
T5
::
wsize
();
k
++
,
i
++
)
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
MTR
::
T5
t
(
data
,
MTR
::
T5
::
wsize
());
delete
[]
data
;
MTR
::
T5
t
(
d
.
data
,
MTR
::
T5
::
wsize
());
IOBase
::
processingFasAI
(
&
(
*
it
),
(
float
)
t
.
val
,
shm
,
force
);
}
...
...
@@ -1795,18 +1802,17 @@ namespace uniset
{
MTR
::
T6
t
(
IOBase
::
processingAsAO
(
&
(
*
it
),
shm
,
force_out
));
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T6
::
wsize
();
k
++
,
i
++
)
for
(
size_
t
k
=
0
;
k
<
MTR
::
T6
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
t
.
raw
.
v
[
k
];
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
MTR
::
T6
::
wsize
()]
;
DataGuard
d
(
MTR
::
T6
::
wsize
())
;
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T6
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
for
(
size_
t
k
=
0
;
k
<
MTR
::
T6
::
wsize
();
k
++
,
i
++
)
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
MTR
::
T6
t
(
data
,
MTR
::
T6
::
wsize
());
delete
[]
data
;
MTR
::
T6
t
(
d
.
data
,
MTR
::
T6
::
wsize
());
IOBase
::
processingFasAI
(
&
(
*
it
),
(
float
)
t
.
val
,
shm
,
force
);
}
...
...
@@ -1822,18 +1828,17 @@ namespace uniset
{
MTR
::
T7
t
(
IOBase
::
processingAsAO
(
&
(
*
it
),
shm
,
force_out
));
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T7
::
wsize
();
k
++
,
i
++
)
for
(
size_
t
k
=
0
;
k
<
MTR
::
T7
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
t
.
raw
.
v
[
k
];
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
MTR
::
T7
::
wsize
()]
;
DataGuard
d
(
MTR
::
T7
::
wsize
())
;
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
T7
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
for
(
size_
t
k
=
0
;
k
<
MTR
::
T7
::
wsize
();
k
++
,
i
++
)
d
.
d
ata
[
k
]
=
i
->
second
->
mbval
;
MTR
::
T7
t
(
data
,
MTR
::
T7
::
wsize
());
delete
[]
data
;
MTR
::
T7
t
(
d
.
data
,
MTR
::
T7
::
wsize
());
IOBase
::
processingFasAI
(
&
(
*
it
),
(
float
)
t
.
val
,
shm
,
force
);
}
...
...
@@ -1882,19 +1887,17 @@ namespace uniset
float
f
=
IOBase
::
processingFasAO
(
&
(
*
it
),
shm
,
force_out
);
MTR
::
F1
f1
(
f
);
for
(
unsigned
in
t
k
=
0
;
k
<
MTR
::
F1
::
wsize
();
k
++
,
i
++
)
for
(
size_
t
k
=
0
;
k
<
MTR
::
F1
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f1
.
raw
.
v
[
k
];
}
else
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
MTR
::
F1
::
wsize
()];
for
(
unsigned
int
k
=
0
;
k
<
MTR
::
F1
::
wsize
();
k
++
,
i
++
)
data
[
k
]
=
i
->
second
->
mbval
;
DataGuard
d
(
MTR
::
F1
::
wsize
());
MTR
::
F1
t
(
data
,
MTR
::
F1
::
wsize
());
delete
[]
data
;
for
(
size_t
k
=
0
;
k
<
MTR
::
F1
::
wsize
();
k
++
,
i
++
)
d
.
data
[
k
]
=
i
->
second
->
mbval
;
MTR
::
F1
t
(
d
.
data
,
MTR
::
F1
::
wsize
());
IOBase
::
processingFasAI
(
&
(
*
it
),
(
float
)
t
,
shm
,
force
);
}
...
...
extensions/ModbusMaster/tests/MBTCPTestServer.cc
View file @
b9c92a58
// -------------------------------------------------------------------------
#include <sstream>
#include <limits>
#include <Poco/Net/NetException.h>
#include "UniSetTypes.h"
#include "MBTCPTestServer.h"
...
...
@@ -23,7 +24,7 @@ MBTCPTestServer::MBTCPTestServer( const std::unordered_set<ModbusAddr>& _vaddr,
sslot
(
NULL
),
vaddr
(
_vaddr
),
verbose
(
verb
),
replyVal
(
-
1
),
replyVal
(
std
::
numeric_limits
<
uint32_t
>::
max
()
),
forceSingleCoilCmd
(
false
),
lastWriteOutputSingleRegister
(
0
),
lastForceCoilsQ
(
0
,
0
),
...
...
@@ -122,7 +123,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
if
(
query
.
count
<=
1
)
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
d
);
...
...
@@ -136,7 +137,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readCoilStatus( ReadCoilMessage& query,
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
d
);
...
...
@@ -167,7 +168,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readInputStatus( ReadInputStatusMessage& q
d
.
b
[
3
]
=
1
;
d
.
b
[
7
]
=
1
;
if
(
replyVal
==
-
1
)
if
(
replyVal
==
std
::
numeric_limits
<
uint32_t
>::
max
()
)
{
size_t
bnum
=
0
;
size_t
i
=
0
;
...
...
@@ -207,7 +208,7 @@ mbErrCode MBTCPTestServer::readInputRegisters( ReadInputMessage& query,
if
(
query
.
count
<=
1
)
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
query
.
start
);
...
...
@@ -221,7 +222,7 @@ mbErrCode MBTCPTestServer::readInputRegisters( ReadInputMessage& query,
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
reg
);
...
...
@@ -252,7 +253,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readOutputRegisters(
if
(
query
.
count
<=
1
)
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
query
.
start
);
...
...
@@ -266,7 +267,7 @@ ModbusRTU::mbErrCode MBTCPTestServer::readOutputRegisters(
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
if
(
replyVal
!=
-
1
)
if
(
replyVal
!=
std
::
numeric_limits
<
uint32_t
>::
max
()
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
reg
);
...
...
extensions/ModbusMaster/tests/MBTCPTestServer.h
View file @
b9c92a58
...
...
@@ -19,7 +19,7 @@ class MBTCPTestServer
verbose
=
state
;
}
inline
void
setReply
(
long
val
)
inline
void
setReply
(
uint32_t
val
)
{
replyVal
=
val
;
}
...
...
@@ -47,7 +47,7 @@ class MBTCPTestServer
{
return
forceSingleCoilCmd
;
}
inline
int
getLastWriteOutputSingleRegister
()
inline
int
16_t
getLastWriteOutputSingleRegister
()
{
return
lastWriteOutputSingleRegister
;
}
...
...
@@ -131,9 +131,9 @@ class MBTCPTestServer
std
::
unordered_set
<
uniset
::
ModbusRTU
::
ModbusAddr
>
vaddr
;
/*!< адреса данного узла */
bool
verbose
;
long
replyVal
;
uint32_t
replyVal
;
bool
forceSingleCoilCmd
;
int
lastWriteOutputSingleRegister
;
int
16_t
lastWriteOutputSingleRegister
;
uniset
::
ModbusRTU
::
ForceCoilsMessage
lastForceCoilsQ
;
uniset
::
ModbusRTU
::
WriteOutputMessage
lastWriteOutputQ
;
float
f2_test_value
=
{
0
.
0
};
...
...
extensions/ModbusMaster/tests/run_test_mbtcpmaster.sh
View file @
b9c92a58
extensions/ModbusMaster/tests/test_mbtcpmaster.cc
View file @
b9c92a58
...
...
@@ -222,12 +222,12 @@ TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word out
REQUIRE
(
ui
->
getValue
(
1004
)
==
-
10
);
REQUIRE
(
ui
->
getValue
(
1005
)
==
-
10
);
REQUIRE
(
ui
->
getValue
(
1006
)
==
-
10
);
mbs
->
setReply
(
0
);
mbs
->
setReply
(
1
);
msleep
(
polltime
+
200
);
REQUIRE
(
ui
->
getValue
(
1003
)
==
0
);
REQUIRE
(
ui
->
getValue
(
1004
)
==
0
);
REQUIRE
(
ui
->
getValue
(
1005
)
==
0
);
REQUIRE
(
ui
->
getValue
(
1006
)
==
0
);
REQUIRE
(
ui
->
getValue
(
1003
)
==
1
);
REQUIRE
(
ui
->
getValue
(
1004
)
==
1
);
REQUIRE
(
ui
->
getValue
(
1005
)
==
1
);
REQUIRE
(
ui
->
getValue
(
1006
)
==
1
);
mbs
->
setReply
(
65535
);
msleep
(
polltime
+
200
);
REQUIRE
(
ui
->
getValue
(
1003
)
==
-
1
);
...
...
@@ -236,10 +236,14 @@ TEST_CASE("MBTCPMaster: 0x03 (read register outputs or memories or read word out
REQUIRE
(
ui
->
getValue
(
1006
)
==
-
1
);
REQUIRE
(
ui
->
getValue
(
1007
)
==
65535
);
// unsigned
mbs
->
setReply
(
0xffff
);
mbs
->
setReply
(
std
::
numeric_limits
<
uint16_t
>::
max
()
);
msleep
(
polltime
+
200
);
REQUIRE
(
(
uint16_t
)
ui
->
getValue
(
1009
)
==
std
::
numeric_limits
<
uint16_t
>::
max
()
);
// U2
mbs
->
setReply
(
std
::
numeric_limits
<
int16_t
>::
max
()
);
msleep
(
polltime
+
200
);
REQUIRE
(
ui
->
getValue
(
1008
)
==
0xffffffff
);
// I2
REQUIRE
(
ui
->
getValue
(
1009
)
==
0xffffffff
);
// U2
REQUIRE
(
(
int16_t
)
ui
->
getValue
(
1008
)
==
std
::
numeric_limits
<
int16_t
>::
max
()
);
// I2
mbs
->
setReply
(
0xff
);
msleep
(
polltime
+
200
);
REQUIRE
(
ui
->
getValue
(
1008
)
==
0x00ff00ff
);
// I2
...
...
@@ -281,10 +285,14 @@ TEST_CASE("MBTCPMaster: 0x04 (read input registers or memories or read word outp
REQUIRE
(
ui
->
getValue
(
1013
)
==
-
1
);
REQUIRE
(
ui
->
getValue
(
1014
)
==
65535
);
// unsigned
mbs
->
setReply
(
0xffff
);
mbs
->
setReply
(
std
::
numeric_limits
<
uint16_t
>::
max
()
);
msleep
(
polltime
+
200
);
REQUIRE
(
ui
->
getValue
(
1015
)
==
0xffffffff
);
// I2
REQUIRE
(
ui
->
getValue
(
1016
)
==
0xffffffff
);
// U2
REQUIRE
(
(
uint16_t
)
ui
->
getValue
(
1009
)
==
std
::
numeric_limits
<
uint16_t
>::
max
()
);
// U2
mbs
->
setReply
(
std
::
numeric_limits
<
int16_t
>::
max
()
);
msleep
(
polltime
+
200
);
REQUIRE
(
(
int16_t
)
ui
->
getValue
(
1008
)
==
std
::
numeric_limits
<
int16_t
>::
max
()
);
// I2
mbs
->
setReply
(
0xff
);
msleep
(
polltime
+
200
);
REQUIRE
(
ui
->
getValue
(
1015
)
==
0x00ff00ff
);
// I2
...
...
@@ -457,23 +465,23 @@ TEST_CASE("MBTCPMaster: 0x10 (write register outputs or memories)", "[modbus][0x
REQUIRE
(
q
.
addr
==
slaveADDR
);
REQUIRE
(
q
.
start
==
31
);
REQUIRE
(
q
.
quant
==
6
);
REQUIRE
(
q
.
data
[
0
]
==
(
u
nsigned
shor
t
)(
-
100
)
);
REQUIRE
(
q
.
data
[
2
]
==
(
u
nsigned
shor
t
)(
-
10
)
);
REQUIRE
(
q
.
data
[
3
]
==
(
u
nsigned
shor
t
)(
-
32767
)
);
REQUIRE
(
q
.
data
[
0
]
==
(
u
int16_
t
)(
-
100
)
);
REQUIRE
(
q
.
data
[
2
]
==
(
u
int16_
t
)(
-
10
)
);
REQUIRE
(
q
.
data
[
3
]
==
(
u
int16_
t
)(
-
32767
)
);
}
SECTION
(
"I2"
)
{
ui
->
setValue
(
1023
,
0xffffffff
);
REQUIRE
(
ui
->
getValue
(
1023
)
==
0xffffffff
);
ui
->
setValue
(
1023
,
std
::
numeric_limits
<
uint32_t
>::
max
()
);
REQUIRE
(
(
uint32_t
)
ui
->
getValue
(
1023
)
==
std
::
numeric_limits
<
uint32_t
>::
max
()
);
msleep
(
polltime
+
200
);
ModbusRTU
::
WriteOutputMessage
q
=
mbs
->
getLastWriteOutput
();
REQUIRE
(
q
.
addr
==
slaveADDR
);
REQUIRE
(
q
.
start
==
31
);
REQUIRE
(
q
.
quant
==
6
);
REQUIRE
(
q
.
data
[
4
]
==
0xffff
);
REQUIRE
(
q
.
data
[
5
]
==
0xffff
);
REQUIRE
(
q
.
data
[
4
]
==
std
::
numeric_limits
<
uint16_t
>::
max
()
);
REQUIRE
(
q
.
data
[
5
]
==
std
::
numeric_limits
<
uint16_t
>::
max
()
);
}
}
// -----------------------------------------------------------------------------
...
...
extensions/ModbusMaster/tests/test_mbtcpmultimaster.cc
View file @
b9c92a58
...
...
@@ -127,6 +127,8 @@ TEST_CASE("MBTCPMultiMaster: rotate channel", "[modbus][mbmaster][mbtcpmultimast
InitTest
();
CHECK
(
ui
->
isExist
(
mbID
)
);
mbs1
->
setReply
(
0
);
msleep
(
polltime
+
1000
);
REQUIRE
(
ui
->
getValue
(
1003
)
==
0
);
mbs1
->
setReply
(
100
);
mbs2
->
setReply
(
10
);
...
...
extensions/include/VTypes.h
View file @
b9c92a58
...
...
@@ -19,6 +19,7 @@
#define _RTUTypes_H_
// -----------------------------------------------------------------------------
#include <string>
#include <stdint.h>
#include <cmath>
#include <cstring>
#include <ostream>
...
...
@@ -61,7 +62,7 @@ namespace uniset
/*! тип хранения в памяти */
typedef
union
{
u
nsigned
shor
t
v
[
f2Size
];
u
int16_
t
v
[
f2Size
];
float
val
;
//
}
F2mem
;
// ------------------------------------------
...
...
@@ -147,7 +148,7 @@ namespace uniset
/*! тип хранения в памяти */
typedef
union
{
u
nsigned
shor
t
v
[
f4Size
];
u
int16_
t
v
[
f4Size
];
float
val
;
//
}
F4mem
;
// ------------------------------------------
...
...
@@ -202,8 +203,8 @@ namespace uniset
/*! тип хранения в памяти */
typedef
union
{
u
nsigned
shor
t
w
;
u
nsigned
char
b
[
bsize
];
u
int16_
t
w
;
u
int8_t
b
[
bsize
];
}
Bytemem
;
// ------------------------------------------
// конструкторы на разные случаи...
...
...
@@ -212,15 +213,11 @@ namespace uniset
raw
.
w
=
0
;
}
Byte
(
u
nsigned
char
b1
,
unsigned
char
b2
)
noexcept
Byte
(
u
int8_t
b1
,
uint8_t
b2
)
noexcept
{
raw
.
b
[
0
]
=
b1
;
raw
.
b
[
1
]
=
b2
;
}
Byte
(
const
long
&
val
)
noexcept
{
raw
.
w
=
val
;
}
Byte
(
const
ModbusRTU
::
ModbusData
dat
)
noexcept
{
...
...
@@ -240,16 +237,12 @@ namespace uniset
return
vtByte
;
}
// ------------------------------------------
operator
long
()
{
return
lroundf
(
raw
.
w
);
}
operator
unsigned
short
()
operator
uint16_t
()
{
return
raw
.
w
;
}
u
nsigned
char
operator
[](
const
in
t
i
)
u
int8_t
operator
[](
const
size_
t
i
)
{
return
raw
.
b
[
i
];
}
...
...
@@ -293,7 +286,7 @@ namespace uniset
return
raw
;
}
u
nsigned
shor
t
raw
;
u
int16_
t
raw
;
};
// --------------------------------------------------------------------------
class
Signed
...
...
@@ -332,7 +325,7 @@ namespace uniset
return
raw
;
}
signed
shor
t
raw
;
int16_
t
raw
;
};
// --------------------------------------------------------------------------
class
I2
...
...
@@ -344,8 +337,8 @@ namespace uniset
/*! тип хранения в памяти */
typedef
union
{
u
nsigned
shor
t
v
[
i2Size
];
int
val
;
//
u
int16_
t
v
[
i2Size
];
int
32_t
val
;
//
}
I2mem
;
// ------------------------------------------
// конструкторы на разные случаи...
...
...
@@ -354,7 +347,7 @@ namespace uniset
memset
(
raw
.
v
,
0
,
sizeof
(
raw
.
v
));
}
I2
(
int
v
)
noexcept
I2
(
int
32_t
v
)
noexcept
{
raw
.
val
=
v
;
}
...
...
@@ -377,7 +370,7 @@ namespace uniset
return
vtI2
;
}
// ------------------------------------------
operator
int
()
operator
int
32_t
()
{
return
raw
.
val
;
}
...
...
@@ -394,7 +387,7 @@ namespace uniset
raw_backorder
.
val
=
0
;
}
I2r
(
const
int
v
)
noexcept
:
I2
(
v
)
I2r
(
const
int
32_t
v
)
noexcept
:
I2
(
v
)
{
raw_backorder
=
raw
;
std
::
swap
(
raw_backorder
.
v
[
0
],
raw_backorder
.
v
[
1
]);
...
...
@@ -421,8 +414,8 @@ namespace uniset
/*! тип хранения в памяти */
typedef
union
{
u
nsigned
shor
t
v
[
u2Size
];
u
nsigned
in
t
val
;
//
u
int16_
t
v
[
u2Size
];
u
int32_
t
val
;
//
}
U2mem
;
// ------------------------------------------
// конструкторы на разные случаи...
...
...
@@ -431,7 +424,7 @@ namespace uniset
memset
(
raw
.
v
,
0
,
sizeof
(
raw
.
v
));
}
U2
(
u
nsigned
in
t
v
)
noexcept
U2
(
u
int32_
t
v
)
noexcept
{
raw
.
val
=
v
;
}
...
...
@@ -454,11 +447,21 @@ namespace uniset
return
vtU2
;
}
// ------------------------------------------
operator
unsigned
int
()
operator
uint32_t
()
{
return
raw
.
val
;
}
operator
long
()
{
return
raw
.
val
;
}
operator
unsigned
long
()
{
return
(
uint32_t
)
raw
.
val
;
}
U2mem
raw
;
};
// --------------------------------------------------------------------------
...
...
@@ -471,7 +474,7 @@ namespace uniset
raw_backorder
.
val
=
0
;
}
U2r
(
int
v
)
noexcept
:
U2
(
v
)
U2r
(
int
32_t
v
)
noexcept
:
U2
(
v
)
{
raw_backorder
=
raw
;
std
::
swap
(
raw_backorder
.
v
[
0
],
raw_backorder
.
v
[
1
]);
...
...
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