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
35c630d3
Commit
35c630d3
authored
Feb 12, 2014
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(ModbusMaster): добавил отдельный поток проверяющий не "зависло ли соединение"
parent
82739c72
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
96 additions
and
5 deletions
+96
-5
libuniset.spec
conf/libuniset.spec
+4
-1
MBTCPMaster.cc
extensions/ModbusMaster/MBTCPMaster.cc
+83
-2
MBTCPMaster.h
extensions/ModbusMaster/MBTCPMaster.h
+6
-0
ModbusTCPMaster.h
include/modbus/ModbusTCPMaster.h
+2
-1
ModbusTCPMaster.cc
src/Communications/Modbus/ModbusTCPMaster.cc
+1
-1
No files found.
conf/libuniset.spec
View file @
35c630d3
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
Name: libuniset
Name: libuniset
Version: 1.7
Version: 1.7
Release: alt
5
Release: alt
6
Summary: UniSet - library for building distributed industrial control systems
Summary: UniSet - library for building distributed industrial control systems
...
@@ -335,6 +335,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
...
@@ -335,6 +335,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet.pc
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
%changelog
* Wed Feb 12 2014 Pavel Vainerman <pv@altlinux.ru> 1.7-alt6
- ModbusMaster: add thread for check connection
* Mon Feb 10 2014 Pavel Vainerman <pv@altlinux.ru> 1.7-alt5
* Mon Feb 10 2014 Pavel Vainerman <pv@altlinux.ru> 1.7-alt5
- ModbusMaster: minor fixes
- ModbusMaster: minor fixes
...
...
extensions/ModbusMaster/MBTCPMaster.cc
View file @
35c630d3
...
@@ -15,7 +15,8 @@ MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shm
...
@@ -15,7 +15,8 @@ MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shm
MBExchange
(
objId
,
shmId
,
ic
,
prefix
),
MBExchange
(
objId
,
shmId
,
ic
,
prefix
),
force_disconnect
(
true
),
force_disconnect
(
true
),
mbtcp
(
0
),
mbtcp
(
0
),
pollThread
(
0
)
pollThread
(
0
),
checkThread
(
0
)
{
{
if
(
objId
==
DefaultObjectId
)
if
(
objId
==
DefaultObjectId
)
throw
UniSetTypes
::
SystemError
(
"(MBTCPMaster): objId=-1?!! Use --"
+
prefix
+
"-name"
);
throw
UniSetTypes
::
SystemError
(
"(MBTCPMaster): objId=-1?!! Use --"
+
prefix
+
"-name"
);
...
@@ -54,6 +55,20 @@ pollThread(0)
...
@@ -54,6 +55,20 @@ pollThread(0)
throw
UniSetTypes
::
SystemError
(
myname
+
"(MBMaster): Unknown inet port...(Use: "
+
tmp
+
")"
);
throw
UniSetTypes
::
SystemError
(
myname
+
"(MBMaster): Unknown inet port...(Use: "
+
tmp
+
")"
);
int
t_check
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-exchange-timeout"
,
it
.
getProp
(
"exchange_timeout"
));
if
(
t_check
==
0
)
t_check
=
5000
;
checkTime
=
t_check
<
0
?
0
:
t_check
;
if
(
checkTime
>
0
)
{
int
etout
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-exchange-timeout"
,
it
.
getProp
(
"exchange_timeout"
));
if
(
etout
<=
0
)
etout
=
5000
;
ptExchangeTimeout
.
setTiming
(
etout
);
}
force_disconnect
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-persistent-connection"
,
it
.
getProp
(
"persistent_connection"
))
?
false
:
true
;
force_disconnect
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-persistent-connection"
,
it
.
getProp
(
"persistent_connection"
))
?
false
:
true
;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): persisten-connection="
<<
(
!
force_disconnect
)
<<
endl
;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): persisten-connection="
<<
(
!
force_disconnect
)
<<
endl
;
...
@@ -67,6 +82,7 @@ pollThread(0)
...
@@ -67,6 +82,7 @@ pollThread(0)
ic
->
addReadItem
(
sigc
::
mem_fun
(
this
,
&
MBTCPMaster
::
readItem
)
);
ic
->
addReadItem
(
sigc
::
mem_fun
(
this
,
&
MBTCPMaster
::
readItem
)
);
pollThread
=
new
ThreadCreator
<
MBTCPMaster
>
(
this
,
&
MBTCPMaster
::
poll_thread
);
pollThread
=
new
ThreadCreator
<
MBTCPMaster
>
(
this
,
&
MBTCPMaster
::
poll_thread
);
checkThread
=
new
ThreadCreator
<
MBTCPMaster
>
(
this
,
&
MBTCPMaster
::
check_thread
);
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
printMap
(
rmap
);
printMap
(
rmap
);
...
@@ -75,6 +91,7 @@ pollThread(0)
...
@@ -75,6 +91,7 @@ pollThread(0)
MBTCPMaster
::~
MBTCPMaster
()
MBTCPMaster
::~
MBTCPMaster
()
{
{
delete
pollThread
;
delete
pollThread
;
delete
checkThread
;
delete
mbtcp
;
delete
mbtcp
;
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
...
@@ -131,7 +148,15 @@ void MBTCPMaster::sysCommand( UniSetTypes::SystemMessage *sm )
...
@@ -131,7 +148,15 @@ void MBTCPMaster::sysCommand( UniSetTypes::SystemMessage *sm )
{
{
MBExchange
::
sysCommand
(
sm
);
MBExchange
::
sysCommand
(
sm
);
if
(
sm
->
command
==
SystemMessage
::
StartUp
)
if
(
sm
->
command
==
SystemMessage
::
StartUp
)
{
pollThread
->
start
();
pollThread
->
start
();
{
uniset_mutex_lock
l
(
checkMutex
,
300
);
ptExchangeTimeout
.
reset
();
}
if
(
checkTime
>
0
)
checkThread
->
start
();
}
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
poll_thread
()
void
MBTCPMaster
::
poll_thread
()
...
@@ -141,6 +166,11 @@ void MBTCPMaster::poll_thread()
...
@@ -141,6 +166,11 @@ void MBTCPMaster::poll_thread()
ptTimeout
.
reset
();
ptTimeout
.
reset
();
}
}
{
uniset_mutex_lock
l
(
checkMutex
,
300
);
ptExchangeTimeout
.
reset
();
}
while
(
checkProcActive
()
)
while
(
checkProcActive
()
)
{
{
try
try
...
@@ -151,7 +181,16 @@ void MBTCPMaster::poll_thread()
...
@@ -151,7 +181,16 @@ void MBTCPMaster::poll_thread()
catch
(...){}
catch
(...){}
try
try
{
{
poll
();
{
uniset_mutex_lock
l
(
checkMutex
,
300
);
ptExchangeTimeout
.
reset
();
}
poll
();
{
uniset_mutex_lock
l
(
checkMutex
,
300
);
ptExchangeTimeout
.
reset
();
}
}
}
catch
(...){}
catch
(...){}
...
@@ -197,3 +236,45 @@ MBTCPMaster* MBTCPMaster::init_mbmaster( int argc, const char* const* argv,
...
@@ -197,3 +236,45 @@ MBTCPMaster* MBTCPMaster::init_mbmaster( int argc, const char* const* argv,
return
new
MBTCPMaster
(
ID
,
icID
,
ic
,
prefix
);
return
new
MBTCPMaster
(
ID
,
icID
,
ic
,
prefix
);
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
check_thread
()
{
while
(
checkProcActive
()
)
{
try
{
bool
fail
=
false
;
{
uniset_mutex_lock
l
(
checkMutex
,
100
);
fail
=
ptExchangeTimeout
.
checkTime
();
}
if
(
dlog
.
debugging
(
Debug
::
LEVEL4
)
)
dlog
[
Debug
::
LEVEL4
]
<<
myname
<<
": check connection... "
<<
(
fail
?
"FAIL"
:
"OK"
)
<<
endl
;
if
(
fail
)
{
try
{
if
(
dlog
.
debugging
(
Debug
::
CRIT
)
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
": CONNECTION FAIL... terminate.."
<<
endl
;
mbtcp
->
disconnect
();
}
catch
(
std
::
exception
&
ex
)
{
cerr
<<
"exception: "
<<
ex
.
what
()
<<
endl
;
}
catch
(
...
)
{
cerr
<<
"exception: ...."
<<
endl
;
}
}
}
catch
(...){}
if
(
!
checkProcActive
()
)
break
;
msleep
(
checkTime
);
}
}
// -----------------------------------------------------------------------------
extensions/ModbusMaster/MBTCPMaster.h
View file @
35c630d3
...
@@ -217,6 +217,7 @@ class MBTCPMaster:
...
@@ -217,6 +217,7 @@ class MBTCPMaster:
virtual
ModbusClient
*
initMB
(
bool
reopen
=
false
);
virtual
ModbusClient
*
initMB
(
bool
reopen
=
false
);
void
poll_thread
();
void
poll_thread
();
void
check_thread
();
bool
force_disconnect
;
bool
force_disconnect
;
private
:
private
:
...
@@ -228,6 +229,11 @@ class MBTCPMaster:
...
@@ -228,6 +229,11 @@ class MBTCPMaster:
// делаем опрос в отдельном потоке
// делаем опрос в отдельном потоке
ThreadCreator
<
MBTCPMaster
>*
pollThread
;
/*!< поток опроса */
ThreadCreator
<
MBTCPMaster
>*
pollThread
;
/*!< поток опроса */
UniSetTypes
::
uniset_mutex
tcpMutex
;
UniSetTypes
::
uniset_mutex
tcpMutex
;
ThreadCreator
<
MBTCPMaster
>*
checkThread
;
/*!< поток проверки "зависания связи" */
UniSetTypes
::
uniset_mutex
checkMutex
;
PassiveTimer
ptExchangeTimeout
;
timeout_t
checkTime
;
};
};
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
#endif // _MBTCPMaster_H_
#endif // _MBTCPMaster_H_
...
...
include/modbus/ModbusTCPMaster.h
View file @
35c630d3
...
@@ -21,7 +21,7 @@ class ModbusTCPMaster:
...
@@ -21,7 +21,7 @@ class ModbusTCPMaster:
void
disconnect
();
void
disconnect
();
bool
isConnection
();
bool
isConnection
();
static
bool
checkConnection
(
const
std
::
string
ip
,
int
port
,
int
timeout_msec
=
100
);
static
bool
checkConnection
(
const
std
::
string
&
ip
,
int
port
,
int
timeout_msec
=
100
);
inline
void
setForceDisconnect
(
bool
s
)
inline
void
setForceDisconnect
(
bool
s
)
{
{
...
@@ -47,6 +47,7 @@ class ModbusTCPMaster:
...
@@ -47,6 +47,7 @@ class ModbusTCPMaster:
std
::
queue
<
unsigned
char
>
qrecv
;
std
::
queue
<
unsigned
char
>
qrecv
;
PassiveTimer
ptTimeout
;
PassiveTimer
ptTimeout
;
std
::
string
iaddr
;
std
::
string
iaddr
;
std
::
string
addr
;
bool
force_disconnect
;
bool
force_disconnect
;
};
};
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
...
...
src/Communications/Modbus/ModbusTCPMaster.cc
View file @
35c630d3
...
@@ -272,7 +272,7 @@ void ModbusTCPMaster::cleanInputStream()
...
@@ -272,7 +272,7 @@ void ModbusTCPMaster::cleanInputStream()
while
(
ret
>
0
);
while
(
ret
>
0
);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ModbusTCPMaster
::
checkConnection
(
const
std
::
string
ip
,
int
port
,
int
timeout_msec
)
bool
ModbusTCPMaster
::
checkConnection
(
const
std
::
string
&
ip
,
int
port
,
int
timeout_msec
)
{
{
try
try
{
{
...
...
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