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
ad03b191
Commit
ad03b191
authored
May 08, 2015
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(ModbusSlave): реализовал поддержку nbit для функци записи..(0x06,0x10,..)
parent
281ac286
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
120 additions
and
13 deletions
+120
-13
libuniset2.spec
conf/libuniset2.spec
+4
-1
MBSlave.cc
extensions/ModbusSlave/MBSlave.cc
+38
-5
MBSlave.h
extensions/ModbusSlave/MBSlave.h
+2
-0
mbslave-test-configure.xml
extensions/ModbusSlave/tests/mbslave-test-configure.xml
+12
-4
test_mbslave.cc
extensions/ModbusSlave/tests/test_mbslave.cc
+63
-1
tests_with_sm.sh
extensions/ModbusSlave/tests/tests_with_sm.sh
+1
-2
No files found.
conf/libuniset2.spec
View file @
ad03b191
...
...
@@ -12,7 +12,7 @@
Name: libuniset2
Version: 2.0
Release: alt
29
Release: alt
30
Summary: UniSet - library for building distributed industrial control systems
...
...
@@ -409,6 +409,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%changelog
* Fri May 08 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt30
- ModbusSlave: added support nbit='' for 0x06 and 0x10 function (setbug #7337)
* Tue May 05 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt29
- SM: add reserv mechanism for initializing (setbug #7289)
- SM: fixed bug in 'heartbeat'
...
...
extensions/ModbusSlave/MBSlave.cc
View file @
ad03b191
...
...
@@ -950,6 +950,7 @@ bool MBSlave::initItem( UniXML::iterator& it )
}
i
->
second
.
bitreg
->
bvec
[
nbit
]
=
std
::
move
(
p
);
dinfo
<<
myname
<<
"(initItem): add new bit: "
<<
i
->
second
.
bitreg
.
get
()
<<
endl
;
return
true
;
}
else
...
...
@@ -1221,10 +1222,9 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
int
count
)
{
dinfo
<<
myname
<<
"(much_real_write):
read
mbID="
dinfo
<<
myname
<<
"(much_real_write):
write
mbID="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
"("
<<
(
int
)
reg
<<
")"
<<
" count="
<<
count
<<
endl
;
int
i
=
0
;
auto
it
=
iomap
.
end
();
...
...
@@ -1280,12 +1280,45 @@ ModbusRTU::mbErrCode MBSlave::real_write_it( IOMap::iterator& it, ModbusRTU::Mod
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
ModbusRTU
::
ModbusData
mbval
=
dat
[
i
++
]
;
IOProperty
*
p
(
&
it
->
second
)
;
try
if
(
p
->
bitreg
)
return
real_bitreg_write_it
(
p
->
bitreg
,
dat
[
i
++
]);
return
real_write_prop
(
p
,
dat
,
i
,
count
);
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_bitreg_write_it
(
std
::
shared_ptr
<
BitRegProperty
>&
bp
,
const
ModbusRTU
::
ModbusData
val
)
{
dinfo
<<
myname
<<
"(real_bitreg_write_it): write mbID="
<<
ModbusRTU
::
dat2str
(
bp
->
mbreg
)
<<
"("
<<
(
int
)
bp
->
mbreg
<<
") val="
<<
val
<<
endl
;
ModbusRTU
::
DataBits16
d
(
val
);
for
(
int
i
=
0
;
i
<
ModbusRTU
::
BitsPerData
;
i
++
)
{
IOProperty
*
p
(
&
it
->
second
);
IOProperty
*
p
(
&
(
bp
->
bvec
[
i
])
);
if
(
p
->
si
.
id
==
DefaultObjectId
)
continue
;
ModbusRTU
::
ModbusData
dat
[]
=
{
d
[
i
]};
dinfo
<<
myname
<<
"(real_bitreg_write_it): set "
<<
ModbusRTU
::
dat2str
(
bp
->
mbreg
)
<<
"("
<<
(
int
)
bp
->
mbreg
<<
")"
<<
" bit["
<<
i
<<
"]="
<<
(
int
)
dat
[
0
]
<<
" sid="
<<
p
->
si
.
id
<<
endl
;
int
k
=
0
;
real_write_prop
(
p
,
dat
,
k
,
1
);
}
return
ModbusRTU
::
erNoError
;
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_write_prop
(
IOProperty
*
p
,
ModbusRTU
::
ModbusData
*
dat
,
int
&
i
,
int
count
)
{
ModbusRTU
::
ModbusData
mbval
=
dat
[
i
++
];
try
{
if
(
p
->
amode
==
MBSlave
::
amRO
)
return
ModbusRTU
::
erBadDataAddress
;
...
...
extensions/ModbusSlave/MBSlave.h
View file @
ad03b191
...
...
@@ -449,6 +449,8 @@ class MBSlave:
ModbusRTU
::
mbErrCode
real_write_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
*
dat
,
int
&
i
,
int
count
);
ModbusRTU
::
mbErrCode
real_bitreg_write_it
(
std
::
shared_ptr
<
BitRegProperty
>&
bp
,
const
ModbusRTU
::
ModbusData
val
);
ModbusRTU
::
mbErrCode
real_write_prop
(
IOProperty
*
p
,
ModbusRTU
::
ModbusData
*
dat
,
int
&
i
,
int
count
);
MBSlave
();
bool
initPause
;
...
...
extensions/ModbusSlave/tests/mbslave-test-configure.xml
View file @
ad03b191
...
...
@@ -153,10 +153,18 @@
<item
id=
"2015"
default=
"2222"
accessmode=
"wo"
mbs=
"1"
mbreg=
"125"
iotype=
"AI"
name=
"TestAccessMode2"
textname=
"Тестовый регистр для проверки access mode"
/>
<item
id=
"2016"
default=
"1000"
accessmode=
"rw"
mbs=
"1"
mbreg=
"126"
iotype=
"AI"
name=
"TestAccessMode3"
textname=
"Тестовый регистр для проверки access mode"
/>
<!-- nbit test -->
<item
id=
"2017"
default=
"1"
mbs=
"1"
mbreg=
"127"
nbit=
"0"
iotype=
"AI"
name=
"Test nbit 0"
textname=
"Тестовый регистр для проверки nbit"
/>
<item
id=
"2018"
default=
"1"
mbs=
"1"
mbreg=
"127"
nbit=
"1"
iotype=
"DI"
name=
"Test nbit 1"
textname=
"Тестовый регистр для проверки nbit"
/>
<item
id=
"2019"
default=
"1"
mbs=
"1"
mbreg=
"127"
nbit=
"5"
iotype=
"AI"
name=
"Test nbit 5"
textname=
"Тестовый регистр для проверки nbit"
/>
<!-- nbit read test -->
<item
id=
"2017"
default=
"1"
mbs=
"1"
mbreg=
"127"
nbit=
"0"
iotype=
"AI"
name=
"Test read nbit 0"
textname=
"Тестовый регистр для проверки чтения nbit"
/>
<item
id=
"2018"
default=
"1"
mbs=
"1"
mbreg=
"127"
nbit=
"1"
iotype=
"DI"
name=
"Test read nbit 1"
textname=
"Тестовый регистр для проверки чтения nbit"
/>
<item
id=
"2019"
default=
"1"
mbs=
"1"
mbreg=
"127"
nbit=
"5"
iotype=
"AI"
name=
"Test read nbit 5"
textname=
"Тестовый регистр для проверки чтения nbit"
/>
<!-- nbit write test -->
<item
id=
"2020"
mbs=
"1"
mbreg=
"128"
nbit=
"0"
iotype=
"AI"
name=
"Test write nbit 0"
textname=
"Тестовый регистр для проверки записи nbit"
/>
<item
id=
"2021"
mbs=
"1"
mbreg=
"128"
nbit=
"1"
iotype=
"DI"
name=
"Test write nbit 1"
textname=
"Тестовый регистр для проверки записи nbit"
/>
<item
id=
"2022"
mbs=
"1"
mbreg=
"128"
nbit=
"5"
iotype=
"AI"
name=
"Test write nbit 5"
textname=
"Тестовый регистр для проверки записи nbit"
/>
<item
id=
"2023"
mbs=
"1"
mbreg=
"129"
nbit=
"0"
iotype=
"AI"
name=
"Test write nbit 0 (reg2)"
textname=
"Тестовый регистр для проверки записи nbit (reg 2)"
/>
<item
id=
"2024"
mbs=
"1"
mbreg=
"129"
nbit=
"1"
iotype=
"DI"
name=
"Test write nbit 1 (reg2)"
textname=
"Тестовый регистр для проверки записи nbit (reg 2)"
/>
<item
id=
"2025"
mbs=
"1"
mbreg=
"129"
nbit=
"5"
iotype=
"AI"
name=
"Test write nbit 5 (reg2)"
textname=
"Тестовый регистр для проверки записи nbit (reg 2)"
/>
<item
id=
"10000"
iotype=
"DI"
name=
"TestMode_S"
textname=
"Тестовый датчик"
/>
...
...
extensions/ModbusSlave/tests/test_mbslave.cc
View file @
ad03b191
...
...
@@ -940,7 +940,7 @@ TEST_CASE("access mode", "[modbus][mbslvae][mbtcpslave]")
}
}
// -------------------------------------------------------------
TEST_CASE
(
"Read(0x03,0x04): nbit"
,
"[modbus][mbslave][mbtcpslave][nbit]"
)
TEST_CASE
(
"Read(0x03,0x04): nbit"
,
"[modbus][mbslave][mbtcpslave][
read
nbit]"
)
{
using
namespace
VTypes
;
InitTest
();
...
...
@@ -968,4 +968,66 @@ TEST_CASE("Read(0x03,0x04): nbit", "[modbus][mbslave][mbtcpslave][nbit]")
}
// -------------------------------------------------------------
TEST_CASE
(
"Write(0x06,0x10): nbit"
,
"[modbus][mbslave][mbtcpslave][writenbit]"
)
{
using
namespace
VTypes
;
InitTest
();
SECTION
(
"Test: read nbit.."
)
{
ModbusRTU
::
ModbusData
tREG
=
128
;
SECTION
(
"Test: write06"
)
{
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
slaveaddr
,
tREG
,
3
);
REQUIRE
(
ret
.
start
==
tREG
);
REQUIRE
(
ret
.
data
==
3
);
REQUIRE
(
ui
->
getValue
(
2020
)
==
1
);
REQUIRE
(
ui
->
getValue
(
2021
)
==
1
);
REQUIRE
(
ui
->
getValue
(
2022
)
==
0
);
ret
=
mb
->
write06
(
slaveaddr
,
tREG
,
0
);
REQUIRE
(
ret
.
start
==
tREG
);
REQUIRE
(
ret
.
data
==
0
);
REQUIRE
(
ui
->
getValue
(
2020
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2021
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2022
)
==
0
);
}
SECTION
(
"Test: write10"
)
{
ModbusRTU
::
WriteOutputMessage
msg
(
slaveaddr
,
tREG
);
msg
.
addData
(
3
);
msg
.
addData
(
3
);
ModbusRTU
::
WriteOutputRetMessage
ret
=
mb
->
write10
(
msg
);
REQUIRE
(
ret
.
start
==
tREG
);
REQUIRE
(
ret
.
quant
==
2
);
REQUIRE
(
ui
->
getValue
(
2020
)
==
1
);
REQUIRE
(
ui
->
getValue
(
2021
)
==
1
);
REQUIRE
(
ui
->
getValue
(
2022
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2023
)
==
1
);
REQUIRE
(
ui
->
getValue
(
2024
)
==
1
);
REQUIRE
(
ui
->
getValue
(
2025
)
==
0
);
ModbusRTU
::
WriteOutputMessage
msg2
(
slaveaddr
,
tREG
);
msg2
.
addData
(
0
);
msg2
.
addData
(
0
);
ModbusRTU
::
WriteOutputRetMessage
ret2
=
mb
->
write10
(
msg2
);
REQUIRE
(
ret2
.
start
==
tREG
);
REQUIRE
(
ret2
.
quant
==
2
);
REQUIRE
(
ui
->
getValue
(
2020
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2021
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2022
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2023
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2024
)
==
0
);
REQUIRE
(
ui
->
getValue
(
2025
)
==
0
);
}
}
}
// -------------------------------------------------------------
/*! \todo Доделать тесты на считывание с разными prop_prefix.. */
extensions/ModbusSlave/tests/tests_with_sm.sh
View file @
ad03b191
...
...
@@ -12,5 +12,4 @@ cd -
--mbs-name
MBSlave1
--mbs-type
TCP
--mbs-inet-addr
127.0.0.1
--mbs-inet-port
20048
--mbs-my-addr
0x01
\
--mbs-askcount-id
SVU_AskCount_AS
--mbs-respond-id
RespondRTU_S
--mbs-respond-invert
1
\
--mbs-filter-field
mbs
--mbs-filter-value
1
# --dlog-add-levels any
#--dlog-add-levels any
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