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
b410c1e4
Commit
b410c1e4
authored
Sep 28, 2010
by
Pavel Vaynerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MBSlave optimization
parent
15fb591c
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
90 additions
and
146 deletions
+90
-146
libuniset.spec
conf/libuniset.spec
+4
-1
MBSlave.cc
extensions/ModbusSlave/MBSlave.cc
+82
-144
MBSlave.h
extensions/ModbusSlave/MBSlave.h
+4
-1
No files found.
conf/libuniset.spec
View file @
b410c1e4
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
Name: libuniset
Name: libuniset
Version: 0.99
Version: 0.99
Release: eter
5
Release: eter
6
Summary: UniSet - library for building distributed industrial control systems
Summary: UniSet - library for building distributed industrial control systems
License: GPL
License: GPL
Group: Development/C++
Group: Development/C++
...
@@ -184,6 +184,9 @@ rm -f %buildroot%_libdir/*.la
...
@@ -184,6 +184,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
%changelog
* Tue Sep 28 2010 Pavel Vainerman <pv@etersoft.ru> 0.99-eter5
- MBSlave (RTU|TCP) optimization
* Mon Sep 20 2010 Ilya Shpigor <elly@altlinux.org> 0.99-eter4
* Mon Sep 20 2010 Ilya Shpigor <elly@altlinux.org> 0.99-eter4
- new build 0.99-eter4
- new build 0.99-eter4
...
...
extensions/ModbusSlave/MBSlave.cc
View file @
b410c1e4
...
@@ -850,8 +850,6 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
...
@@ -850,8 +850,6 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(readOutputRegisters): "
<<
query
<<
endl
;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(readOutputRegisters): "
<<
query
<<
endl
;
try
{
if
(
query
.
count
<=
1
)
if
(
query
.
count
<=
1
)
{
{
ModbusRTU
::
ModbusData
d
=
0
;
ModbusRTU
::
ModbusData
d
=
0
;
...
@@ -860,60 +858,18 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
...
@@ -860,60 +858,18 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
reply
.
addData
(
d
);
reply
.
addData
(
d
);
else
else
reply
.
addData
(
0
);
reply
.
addData
(
0
);
pingOK
=
true
;
return
ret
;
return
ret
;
}
}
// Фомирование ответа:
// Фомирование ответа:
int
num
=
0
;
// добавленное количество данных
ModbusRTU
::
mbErrCode
ret
=
much_real_read
(
query
.
start
,
buf
,
query
.
count
);
ModbusRTU
::
ModbusData
d
=
0
;
ModbusRTU
::
ModbusData
reg
=
query
.
start
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
ModbusRTU
::
mbErrCode
ret
=
real_read
(
reg
,
d
);
if
(
ret
==
ModbusRTU
::
erNoError
)
if
(
ret
==
ModbusRTU
::
erNoError
)
reply
.
addData
(
d
);
else
reply
.
addData
(
0
);
}
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if
(
reply
.
count
<
query
.
count
)
{
{
dlog
[
Debug
::
WARN
]
<<
myname
for
(
int
i
=
0
;
i
<
query
.
count
;
i
++
)
<<
"(readInputRegisters): query.count="
<<
(
int
)
query
.
count
reply
.
addData
(
buf
[
i
]
);
<<
" > reply.count="
<<
reply
.
count
<<
endl
;
}
pingOK
=
true
;
return
ModbusRTU
::
erNoError
;
}
catch
(
UniSetTypes
::
NameNotFound
&
ex
)
{
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(readOutputRegisters): "
<<
ex
<<
endl
;
return
ModbusRTU
::
erBadDataAddress
;
}
catch
(
Exception
&
ex
)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readOutputRegisters): "
<<
ex
<<
endl
;
}
catch
(
CORBA
::
SystemException
&
ex
)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readOutputRegisters): СORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
catch
(...)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readOutputRegisters): catch ..."
<<
endl
;
}
}
pingOK
=
false
;
return
ret
;
return
ModbusRTU
::
erTimeOut
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
...
@@ -923,26 +879,12 @@ ModbusRTU::mbErrCode MBSlave::writeOutputRegisters( ModbusRTU::WriteOutputMessag
...
@@ -923,26 +879,12 @@ ModbusRTU::mbErrCode MBSlave::writeOutputRegisters( ModbusRTU::WriteOutputMessag
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(writeOutputRegisters): "
<<
query
<<
endl
;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(writeOutputRegisters): "
<<
query
<<
endl
;
ModbusRTU
::
mbErrCode
ret
=
ModbusRTU
::
erNoError
;
// Формирование ответа:
// Формирование ответа:
int
write_ok
=
0
;
ModbusRTU
::
mbErrCode
ret
=
much_real_write
(
query
.
start
,
query
.
data
,
query
.
quant
);
ModbusRTU
::
ModbusData
reg
=
query
.
start
;
for
(
int
num
=
0
;
num
<
query
.
quant
;
num
++
,
reg
++
)
{
ret
=
real_write
(
reg
,
query
.
data
[
num
]);
if
(
ret
==
ModbusRTU
::
erNoError
)
if
(
ret
==
ModbusRTU
::
erNoError
)
write_ok
++
;
}
// формируем ответ
if
(
write_ok
>
0
)
reply
.
set
(
query
.
start
,
query
.
quant
);
reply
.
set
(
query
.
start
,
query
.
quant
);
return
ret
;
return
ret
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
writeOutputSingleRegister
(
ModbusRTU
::
WriteSingleOutputMessage
&
query
,
ModbusRTU
::
mbErrCode
MBSlave
::
writeOutputSingleRegister
(
ModbusRTU
::
WriteSingleOutputMessage
&
query
,
ModbusRTU
::
WriteSingleOutputRetMessage
&
reply
)
ModbusRTU
::
WriteSingleOutputRetMessage
&
reply
)
...
@@ -957,11 +899,38 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO
...
@@ -957,11 +899,38 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO
return
ret
;
return
ret
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
ModbusRTU
::
ModbusData
mbval
)
int
count
)
{
{
try
int
i
=
0
;
IOMap
::
iterator
it
=
iomap
.
end
();
for
(
;
i
<
count
;
i
++
)
{
it
=
iomap
.
find
(
reg
+
i
);
if
(
it
!=
iomap
.
end
()
)
{
{
reg
+=
i
;
break
;
}
}
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
for
(
;
(
it
!=
iomap
.
end
())
&&
(
i
<
count
);
i
++
,
reg
++
)
{
if
(
it
->
first
==
reg
)
{
real_write_it
(
it
,
dat
[
i
]);
it
++
;
}
}
return
ModbusRTU
::
erNoError
;
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
mbval
)
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
{
{
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(write): save mbID="
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(write): save mbID="
...
@@ -971,9 +940,16 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
...
@@ -971,9 +940,16 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
}
}
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
return
real_write_it
(
it
,
mbval
);
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_write_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
&
mbval
)
{
if
(
it
==
iomap
.
end
()
)
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
return
ModbusRTU
::
erBadDataAddress
;
try
{
IOProperty
*
p
(
&
it
->
second
);
IOProperty
*
p
(
&
it
->
second
);
if
(
p
->
amode
==
MBSlave
::
amRO
)
if
(
p
->
amode
==
MBSlave
::
amRO
)
...
@@ -1084,7 +1060,8 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
...
@@ -1084,7 +1060,8 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
return
ModbusRTU
::
erTimeOut
;
return
ModbusRTU
::
erTimeOut
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_read
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
int
count
)
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_read
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
int
count
)
{
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
{
{
...
@@ -1092,21 +1069,44 @@ ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusR
...
@@ -1092,21 +1069,44 @@ ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusR
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
count
<<
endl
;
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
count
<<
endl
;
}
}
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
IOMap
::
iterator
it
=
iomap
.
end
();
int
i
=
0
;
for
(
;
i
<
count
;
i
++
)
{
it
=
iomap
.
find
(
reg
+
i
);
if
(
it
!=
iomap
.
end
()
)
{
reg
+=
i
;
break
;
}
dat
[
i
]
=
0
;
}
if
(
it
==
iomap
.
end
()
)
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
return
ModbusRTU
::
erBadDataAddress
;
int
i
=
0
;
ModbusRTU
::
ModbusData
val
=
0
;
ModbusRTU
::
ModbusData
val
=
0
;
for
(
;
(
it
!=
iomap
.
end
())
&&
(
i
<
count
);
i
t
++
,
i
++
,
reg
++
)
for
(
;
(
it
!=
iomap
.
end
())
&&
(
i
<
count
);
i
++
,
reg
++
)
{
{
val
=
0
;
val
=
0
;
// если регистры идут не подряд, то просто вернём ноль
// если регистры идут не подряд, то просто вернём ноль
if
(
it
->
first
==
reg
)
if
(
it
->
first
==
reg
)
real_read_it
(
it
,
reg
,
val
);
{
real_read_it
(
it
,
val
);
it
++
;
}
dat
[
i
]
=
val
;
dat
[
i
]
=
val
;
}
}
// добиваем нулями "ответ"
// чтобы он был такой длинны, которую запрашивали
if
(
i
<
count
)
{
for
(
;
i
<
count
;
i
++
)
dat
[
i
]
=
0
;
}
return
ModbusRTU
::
erNoError
;
return
ModbusRTU
::
erNoError
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
...
@@ -1119,26 +1119,22 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ModbusRTU::M
...
@@ -1119,26 +1119,22 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ModbusRTU::M
}
}
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
if
(
it
==
iomap
.
end
()
)
return
real_read_it
(
it
,
val
);
return
ModbusRTU
::
erBadDataAddress
;
return
real_read_it
(
it
,
reg
,
val
);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_read_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
&
val
)
ModbusRTU
::
mbErrCode
MBSlave
::
real_read_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
&
val
)
{
{
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
try
try
{
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
{
{
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(real_read_it): read mbID="
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(real_read_it): read mbID="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
endl
;
<<
ModbusRTU
::
dat2str
(
it
->
first
)
<<
endl
;
}
}
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
IOProperty
*
p
(
&
it
->
second
);
IOProperty
*
p
(
&
it
->
second
);
val
=
0
;
val
=
0
;
...
@@ -1238,14 +1234,11 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
...
@@ -1238,14 +1234,11 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
mbErrCode
MBSlave
::
readInputRegisters
(
ReadInputMessage
&
query
,
mbErrCode
MBSlave
::
readInputRegisters
(
ReadInputMessage
&
query
,
ReadInputRetMessage
&
reply
)
ReadInputRetMessage
&
reply
)
{
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(readInputRegisters): "
<<
query
<<
endl
;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(readInputRegisters): "
<<
query
<<
endl
;
try
{
if
(
query
.
count
<=
1
)
if
(
query
.
count
<=
1
)
{
{
ModbusRTU
::
ModbusData
d
=
0
;
ModbusRTU
::
ModbusData
d
=
0
;
...
@@ -1255,75 +1248,20 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
...
@@ -1255,75 +1248,20 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
else
else
reply
.
addData
(
0
);
reply
.
addData
(
0
);
pingOK
=
true
;
return
ret
;
return
ret
;
}
}
// Фомирование ответа:
// Фомирование ответа:
much_real_read
(
query
.
start
,
buf
,
query
.
count
);
ModbusRTU
::
mbErrCode
ret
=
much_real_read
(
query
.
start
,
buf
,
query
.
count
);
for
(
int
i
=
0
;
i
<
query
.
count
;
i
++
)
reply
.
addData
(
buf
[
i
]
);
/*
ModbusRTU::ModbusData* dat = new ModbusRTU::ModbusData[query.count];
ModbusRTU::ModbusData reg = query.start;
try
{
much_real_read(reg,dat,query.count);
}
catch(...){}
delete[] dat;
*/
/*
for( ; num<query.count; num++, reg++ )
{
ModbusRTU::mbErrCode ret = real_read(reg,d);
if
(
ret
==
ModbusRTU
::
erNoError
)
if
(
ret
==
ModbusRTU
::
erNoError
)
reply.addData(d);
else
reply.addData(0);
}
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{
dlog[Debug::WARN] << myname
<< "(readInputRegisters): query.count=" << (int)query.count
<< " > reply.count=" << (int)reply.count << endl;
}
*/
pingOK
=
true
;
return
ModbusRTU
::
erNoError
;
}
catch
(
UniSetTypes
::
NameNotFound
&
ex
)
{
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(readInputRegisters): "
<<
ex
<<
endl
;
return
ModbusRTU
::
erBadDataAddress
;
}
catch
(
Exception
&
ex
)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readInputRegisters): "
<<
ex
<<
endl
;
}
catch
(
CORBA
::
SystemException
&
ex
)
{
{
if
(
pingOK
)
for
(
int
i
=
0
;
i
<
query
.
count
;
i
++
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readInputRegisters): СORBA::SystemException: "
reply
.
addData
(
buf
[
i
]
);
<<
ex
.
NP_minorString
()
<<
endl
;
}
catch
(...)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readInputRegisters): catch ..."
<<
endl
;
}
}
pingOK
=
false
;
return
ret
;
return
ModbusRTU
::
erTimeOut
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
setDateTime
(
ModbusRTU
::
SetDateTimeMessage
&
query
,
ModbusRTU
::
mbErrCode
MBSlave
::
setDateTime
(
ModbusRTU
::
SetDateTimeMessage
&
query
,
ModbusRTU
::
SetDateTimeRetMessage
&
reply
)
ModbusRTU
::
SetDateTimeRetMessage
&
reply
)
{
{
...
...
extensions/ModbusSlave/MBSlave.h
View file @
b410c1e4
...
@@ -158,7 +158,10 @@ class MBSlave:
...
@@ -158,7 +158,10 @@ class MBSlave:
ModbusRTU
::
mbErrCode
real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
val
);
ModbusRTU
::
mbErrCode
real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
val
);
ModbusRTU
::
mbErrCode
real_read
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
&
val
);
ModbusRTU
::
mbErrCode
real_read
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
&
val
);
ModbusRTU
::
mbErrCode
much_real_read
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
int
count
);
ModbusRTU
::
mbErrCode
much_real_read
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
int
count
);
ModbusRTU
::
mbErrCode
real_read_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
&
val
);
ModbusRTU
::
mbErrCode
much_real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
int
count
);
ModbusRTU
::
mbErrCode
real_read_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
&
val
);
ModbusRTU
::
mbErrCode
real_write_it
(
IOMap
::
iterator
&
it
,
ModbusRTU
::
ModbusData
&
val
);
private
:
private
:
MBSlave
();
MBSlave
();
bool
initPause
;
bool
initPause
;
...
...
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