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 @@
Name: libuniset
Version: 0.99
Release: eter
5
Release: eter
6
Summary: UniSet - library for building distributed industrial control systems
License: GPL
Group: Development/C++
...
...
@@ -184,6 +184,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc
%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
- new build 0.99-eter4
...
...
extensions/ModbusSlave/MBSlave.cc
View file @
b410c1e4
...
...
@@ -850,8 +850,6 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(readOutputRegisters): "
<<
query
<<
endl
;
try
{
if
(
query
.
count
<=
1
)
{
ModbusRTU
::
ModbusData
d
=
0
;
...
...
@@ -860,60 +858,18 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters( ModbusRTU::ReadOutputMessage&
reply
.
addData
(
d
);
else
reply
.
addData
(
0
);
pingOK
=
true
;
return
ret
;
}
// Фомирование ответа:
int
num
=
0
;
// добавленное количество данных
ModbusRTU
::
ModbusData
d
=
0
;
ModbusRTU
::
ModbusData
reg
=
query
.
start
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
ModbusRTU
::
mbErrCode
ret
=
real_read
(
reg
,
d
);
ModbusRTU
::
mbErrCode
ret
=
much_real_read
(
query
.
start
,
buf
,
query
.
count
);
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="
<<
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
;
for
(
int
i
=
0
;
i
<
query
.
count
;
i
++
)
reply
.
addData
(
buf
[
i
]
);
}
pingOK
=
false
;
return
ModbusRTU
::
erTimeOut
;
return
ret
;
}
// -------------------------------------------------------------------------
...
...
@@ -923,26 +879,12 @@ ModbusRTU::mbErrCode MBSlave::writeOutputRegisters( ModbusRTU::WriteOutputMessag
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(writeOutputRegisters): "
<<
query
<<
endl
;
ModbusRTU
::
mbErrCode
ret
=
ModbusRTU
::
erNoError
;
// Формирование ответа:
int
write_ok
=
0
;
ModbusRTU
::
ModbusData
reg
=
query
.
start
;
for
(
int
num
=
0
;
num
<
query
.
quant
;
num
++
,
reg
++
)
{
ret
=
real_write
(
reg
,
query
.
data
[
num
]);
ModbusRTU
::
mbErrCode
ret
=
much_real_write
(
query
.
start
,
query
.
data
,
query
.
quant
);
if
(
ret
==
ModbusRTU
::
erNoError
)
write_ok
++
;
}
// формируем ответ
if
(
write_ok
>
0
)
reply
.
set
(
query
.
start
,
query
.
quant
);
return
ret
;
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
writeOutputSingleRegister
(
ModbusRTU
::
WriteSingleOutputMessage
&
query
,
ModbusRTU
::
WriteSingleOutputRetMessage
&
reply
)
...
...
@@ -957,11 +899,38 @@ ModbusRTU::mbErrCode MBSlave::writeOutputSingleRegister( ModbusRTU::WriteSingleO
return
ret
;
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
mbval
)
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_write
(
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
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
)
)
{
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(write): save mbID="
...
...
@@ -971,9 +940,16 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData 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
()
)
return
ModbusRTU
::
erBadDataAddress
;
try
{
IOProperty
*
p
(
&
it
->
second
);
if
(
p
->
amode
==
MBSlave
::
amRO
)
...
...
@@ -1084,7 +1060,8 @@ ModbusRTU::mbErrCode MBSlave::real_write( ModbusRTU::ModbusData reg,
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
)
)
{
...
...
@@ -1092,21 +1069,44 @@ ModbusRTU::mbErrCode MBSlave::much_real_read( ModbusRTU::ModbusData reg, ModbusR
<<
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
()
)
return
ModbusRTU
::
erBadDataAddress
;
int
i
=
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
;
// если регистры идут не подряд, то просто вернём ноль
if
(
it
->
first
==
reg
)
real_read_it
(
it
,
reg
,
val
);
{
real_read_it
(
it
,
val
);
it
++
;
}
dat
[
i
]
=
val
;
}
// добиваем нулями "ответ"
// чтобы он был такой длинны, которую запрашивали
if
(
i
<
count
)
{
for
(
;
i
<
count
;
i
++
)
dat
[
i
]
=
0
;
}
return
ModbusRTU
::
erNoError
;
}
// -------------------------------------------------------------------------
...
...
@@ -1119,26 +1119,22 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ModbusRTU::M
}
IOMap
::
iterator
it
=
iomap
.
find
(
reg
);
if
(
it
==
iomap
.
end
()
)
return
ModbusRTU
::
erBadDataAddress
;
return
real_read_it
(
it
,
reg
,
val
);
return
real_read_it
(
it
,
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
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
{
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
);
val
=
0
;
...
...
@@ -1238,14 +1234,11 @@ ModbusRTU::mbErrCode MBSlave::real_read_it( IOMap::iterator& it, ModbusRTU::Modb
}
// -------------------------------------------------------------------------
mbErrCode
MBSlave
::
readInputRegisters
(
ReadInputMessage
&
query
,
ReadInputRetMessage
&
reply
)
mbErrCode
MBSlave
::
readInputRegisters
(
ReadInputMessage
&
query
,
ReadInputRetMessage
&
reply
)
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(readInputRegisters): "
<<
query
<<
endl
;
try
{
if
(
query
.
count
<=
1
)
{
ModbusRTU
::
ModbusData
d
=
0
;
...
...
@@ -1255,75 +1248,20 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
else
reply
.
addData
(
0
);
pingOK
=
true
;
return
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);
ModbusRTU
::
mbErrCode
ret
=
much_real_read
(
query
.
start
,
buf
,
query
.
count
);
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
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readInputRegisters): СORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
catch
(...)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readInputRegisters): catch ..."
<<
endl
;
for
(
int
i
=
0
;
i
<
query
.
count
;
i
++
)
reply
.
addData
(
buf
[
i
]
);
}
pingOK
=
false
;
return
ModbusRTU
::
erTimeOut
;
return
ret
;
}
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
setDateTime
(
ModbusRTU
::
SetDateTimeMessage
&
query
,
ModbusRTU
::
SetDateTimeRetMessage
&
reply
)
{
...
...
extensions/ModbusSlave/MBSlave.h
View file @
b410c1e4
...
...
@@ -158,7 +158,10 @@ class MBSlave:
ModbusRTU
::
mbErrCode
real_write
(
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
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
:
MBSlave
();
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