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
e2cbe9cd
Commit
e2cbe9cd
authored
Feb 14, 2011
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'new_mbtcp'
parents
2b9e27eb
337de1f1
Hide whitespace changes
Inline
Side-by-side
Showing
157 changed files
with
877 additions
and
560 deletions
+877
-560
DBInterface.cc
Utilities/DBServer-MySQL/DBInterface.cc
+0
-1
DBInterface.h
Utilities/DBServer-MySQL/DBInterface.h
+0
-2
DBServer_MySQL.cc
Utilities/DBServer-MySQL/DBServer_MySQL.cc
+0
-1
DBServer_MySQL.h
Utilities/DBServer-MySQL/DBServer_MySQL.h
+0
-2
MBSlave.h
Utilities/MBTester/MBSlave.h
+0
-1
MBTCPServer.h
Utilities/MBTester/MBTCPServer.h
+0
-2
NullController.h
Utilities/NullController/NullController.h
+0
-1
TestGen.h
Utilities/codegen/tests/TestGen.h
+0
-1
TestGenAlone.h
Utilities/codegen/tests/TestGenAlone.h
+0
-1
ComediInterface.h
extensions/IOControl/ComediInterface.h
+0
-1
IOControl.h
extensions/IOControl/IOControl.h
+0
-1
MBTCPMaster.cc
extensions/MBTCPMaster/MBTCPMaster.cc
+686
-241
MBTCPMaster.h
extensions/MBTCPMaster/MBTCPMaster.h
+83
-23
Makefile.am
extensions/MBTCPMaster/Makefile.am
+1
-1
libUniSetMBTCPMaster.pc.in
extensions/MBTCPMaster/libUniSetMBTCPMaster.pc.in
+1
-1
RTUExchange.cc
extensions/RTUExchange/RTUExchange.cc
+1
-1
RTUStorage.h
extensions/RTUExchange/RTUStorage.h
+0
-2
SMViewer.h
extensions/SMViewer/SMViewer.h
+0
-1
SharedMemory.h
extensions/SharedMemory/SharedMemory.h
+0
-1
UDPPacket.h
extensions/UDPExchange/UDPPacket.h
+0
-1
UniExchange.h
extensions/UniNetwork/UniExchange.h
+0
-1
DigitalFilter.h
extensions/include/DigitalFilter.h
+0
-1
Extensions.h
extensions/include/Extensions.h
+0
-1
IOBase.h
extensions/include/IOBase.h
+0
-1
MTR.h
extensions/include/MTR.h
+0
-1
PID.h
extensions/include/PID.h
+0
-1
SMInterface.h
extensions/include/SMInterface.h
+2
-2
VTypes.h
extensions/include/VTypes.h
+0
-1
SMInterface.cc
extensions/lib/SMInterface.cc
+2
-0
CallBackTimer.h
include/CallBackTimer.h
+0
-2
CallBackTimer_template.h
include/CallBackTimer_template.h
+0
-2
Configuration.h
include/Configuration.h
+0
-2
DBServer.h
include/DBServer.h
+0
-2
DefaultMessageInterface.h
include/DefaultMessageInterface.h
+0
-3
IOController.h
include/IOController.h
+0
-2
IONotifyController.h
include/IONotifyController.h
+0
-2
IONotifyController_LT.h
include/IONotifyController_LT.h
+0
-2
IORFile.h
include/IORFile.h
+0
-2
DigitalCard.h
include/IOs/DigitalCard.h
+0
-2
DigitalCard_O5600.h
include/IOs/DigitalCard_O5600.h
+0
-2
IOAccess.h
include/IOs/IOAccess.h
+0
-4
IOAccessOld.h
include/IOs/IOAccessOld.h
+0
-2
ISRestorer.h
include/ISRestorer.h
+0
-4
InfoServer.h
include/InfoServer.h
+0
-2
LT_Object.h
include/LT_Object.h
+0
-2
MessageInterface.h
include/MessageInterface.h
+0
-2
MessageInterface_XML.h
include/MessageInterface_XML.h
+0
-3
MessageInterface_idXML.h
include/MessageInterface_idXML.h
+0
-2
MessageType.h
include/MessageType.h
+0
-2
Mutex.h
include/Mutex.h
+0
-4
NCRestorer.h
include/NCRestorer.h
+1
-1
ORepHelpers.h
include/ORepHelpers.h
+0
-2
ObjectIndex.h
include/ObjectIndex.h
+0
-2
ObjectIndex_Array.h
include/ObjectIndex_Array.h
+0
-2
ObjectIndex_XML.h
include/ObjectIndex_XML.h
+0
-2
ObjectIndex_idXML.h
include/ObjectIndex_idXML.h
+0
-1
ObjectRepository.h
include/ObjectRepository.h
+0
-2
ObjectRepositoryFactory.h
include/ObjectRepositoryFactory.h
+0
-2
ObjectsActivator.h
include/ObjectsActivator.h
+0
-2
ObjectsManager.h
include/ObjectsManager.h
+0
-2
ObjectsManager_LT.h
include/ObjectsManager_LT.h
+0
-2
OmniThreadCreator.h
include/OmniThreadCreator.h
+0
-2
PassiveObject.h
include/PassiveObject.h
+0
-2
PassiveTimer.h
include/PassiveTimer.h
+0
-10
PosixThread.h
include/PosixThread.h
+0
-2
ProxyManager.h
include/ProxyManager.h
+0
-2
Pulse.h
include/Pulse.h
+0
-2
RepositoryAgent.h
include/RepositoryAgent.h
+0
-2
Restorer.h
include/Restorer.h
+0
-2
RunLock.h
include/RunLock.h
+0
-2
SMonitor.h
include/SMonitor.h
+0
-2
SViewer.h
include/SViewer.h
+0
-3
SandClock.h
include/SandClock.h
+0
-1
StorageInterface.h
include/StorageInterface.h
+0
-3
Storages.h
include/Storages.h
+0
-2
SystemGuard.h
include/SystemGuard.h
+0
-2
TextDBIndex.h
include/TextDBIndex.h
+0
-2
TextFileIndex.h
include/TextFileIndex.h
+0
-2
TextIndex.h
include/TextIndex.h
+0
-2
ThreadCreator.h
include/ThreadCreator.h
+0
-2
TimerService.h
include/TimerService.h
+0
-2
Trigger.h
include/Trigger.h
+0
-2
TriggerAND.h
include/TriggerAND.h
+0
-2
TriggerAND_template.h
include/TriggerAND_template.h
+0
-2
TriggerOR.h
include/TriggerOR.h
+0
-2
TriggerOR_template.h
include/TriggerOR_template.h
+0
-2
TriggerOutput.h
include/TriggerOutput.h
+0
-2
TriggerOutput_template.h
include/TriggerOutput_template.h
+0
-2
UniSetObject.h
include/UniSetObject.h
+0
-2
UniSetObject_LT.h
include/UniSetObject_LT.h
+0
-2
UniSetObserver.h
include/UniSetObserver.h
+0
-2
UniSetTypes.h
include/UniSetTypes.h
+0
-2
UniXML.h
include/UniXML.h
+0
-2
UniversalInterface.h
include/UniversalInterface.h
+0
-2
WDTInterface.h
include/WDTInterface.h
+0
-1
ModbusClient.h
include/modbus/ModbusClient.h
+0
-1
ModbusHelpers.h
include/modbus/ModbusHelpers.h
+0
-1
ModbusRTUMaster.h
include/modbus/ModbusRTUMaster.h
+0
-1
ModbusRTUSlave.h
include/modbus/ModbusRTUSlave.h
+0
-1
ModbusRTUSlaveSlot.h
include/modbus/ModbusRTUSlaveSlot.h
+0
-1
ModbusServer.h
include/modbus/ModbusServer.h
+0
-1
ModbusServerSlot.h
include/modbus/ModbusServerSlot.h
+0
-1
ModbusTCPCore.h
include/modbus/ModbusTCPCore.h
+0
-1
ModbusTCPMaster.h
include/modbus/ModbusTCPMaster.h
+0
-2
ModbusTCPServer.h
include/modbus/ModbusTCPServer.h
+0
-1
ModbusTCPServerSlot.h
include/modbus/ModbusTCPServerSlot.h
+0
-1
ModbusTypes.h
include/modbus/ModbusTypes.h
+0
-1
ComPort.cc
src/Communications/ComPort.cc
+0
-1
ModbusTCPMaster.cc
src/Communications/Modbus/ModbusTCPMaster.cc
+83
-34
DigitalCard_O5600.cc
src/IOs/DigitalCard_O5600.cc
+0
-3
UniversalInterface.cc
src/Interfaces/UniversalInterface.cc
+0
-1
ORepHelpers.cc
src/ObjectRepository/ORepHelpers.cc
+0
-1
ObjectRepository.cc
src/ObjectRepository/ObjectRepository.cc
+0
-1
ObjectRepositoryFactory.cc
src/ObjectRepository/ObjectRepositoryFactory.cc
+0
-1
ObjectsActivator.cc
src/ObjectRepository/ObjectsActivator.cc
+0
-1
ObjectsManager.cc
src/ObjectRepository/ObjectsManager.cc
+0
-1
ObjectsManager_LT.cc
src/ObjectRepository/ObjectsManager_LT.cc
+0
-1
PassiveObject.cc
src/ObjectRepository/PassiveObject.cc
+0
-1
ProxyManager.cc
src/ObjectRepository/ProxyManager.cc
+0
-1
UniSetObject.cc
src/ObjectRepository/UniSetObject.cc
+0
-1
UniSetObject_LT.cc
src/ObjectRepository/UniSetObject_LT.cc
+0
-1
UniSetTypes.cc
src/ObjectRepository/UniSetTypes.cc
+0
-1
IOController.cc
src/Processes/IOController.cc
+0
-1
IONotifyController.cc
src/Processes/IONotifyController.cc
+0
-1
IONotifyController_LT.cc
src/Processes/IONotifyController_LT.cc
+0
-1
UniSetObserver.cc
src/Processes/UniSetObserver.cc
+0
-1
DBServer.cc
src/Services/DBServer.cc
+0
-1
InfoServer.cc
src/Services/InfoServer.cc
+0
-1
RepositoryAgent.cc
src/Services/RepositoryAgent.cc
+0
-1
TimerService.cc
src/Services/TimerService.cc
+0
-1
PosixThread.cc
src/Threads/PosixThread.cc
+0
-1
PassiveSysTimer.cc
src/Timers/PassiveSysTimer.cc
+0
-1
PassiveTimer.cc
src/Timers/PassiveTimer.cc
+0
-1
ThrPassiveTimer.cc
src/Timers/ThrPassiveTimer.cc
+0
-1
WaitingPassiveTimer.cc
src/Timers/WaitingPassiveTimer.cc
+0
-1
Configuration.cc
src/Various/Configuration.cc
+0
-1
CycleStorage.cc
src/Various/CycleStorage.cc
+0
-1
ISRestorer.cc
src/Various/ISRestorer.cc
+0
-1
ISRestorer_XML.cc
src/Various/ISRestorer_XML.cc
+0
-1
LT_Object.cc
src/Various/LT_Object.cc
+0
-1
MessageInterface_idXML.cc
src/Various/MessageInterface_idXML.cc
+0
-1
MessageType.cc
src/Various/MessageType.cc
+0
-1
Mutex.cc
src/Various/Mutex.cc
+0
-1
NCRestorer.cc
src/Various/NCRestorer.cc
+0
-1
NCRestorer_XML.cc
src/Various/NCRestorer_XML.cc
+16
-21
Restorer_XML.cc
src/Various/Restorer_XML.cc
+0
-1
RunLock.cc
src/Various/RunLock.cc
+0
-1
SViewer.cc
src/Various/SViewer.cc
+0
-1
SystemGuard.cc
src/Various/SystemGuard.cc
+0
-1
TableBlockStorage.cc
src/Various/TableBlockStorage.cc
+0
-1
TableStorage.cc
src/Various/TableStorage.cc
+0
-1
TextFileIndex.cc
src/Various/TextFileIndex.cc
+0
-1
TextIndex.cc
src/Various/TextIndex.cc
+0
-1
UniXML.cc
src/Various/UniXML.cc
+0
-2
JrnTest.cc
tests/JrnTests/JrnTest.cc
+0
-1
XmlTest.cc
tests/UniXmlTest/XmlTest.cc
+0
-1
passivetimer.cc
tests/passivetimer.cc
+1
-1
No files found.
Utilities/DBServer-MySQL/DBInterface.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:49 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
Utilities/DBServer-MySQL/DBInterface.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/08/28 20:55:53 $
* \version $Id: DBInterface.h,v 1.1 2005/08/28 20:55:53 vpashka Exp $
*/
//----------------------------------------------------------------------------
#ifndef DBInterface_H_
...
...
Utilities/DBServer-MySQL/DBServer_MySQL.cc
View file @
e2cbe9cd
...
...
@@ -20,7 +20,6 @@
/*! \file
* \brief файл реализации DB-сервера
* \author Pavel Vainerman
* \date $Date: 2009/02/26 19:55:37 $
*/
// --------------------------------------------------------------------------
...
...
Utilities/DBServer-MySQL/DBServer_MySQL.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/08/28 20:55:53 $
* \version $Id: DBServer_MySQL.h,v 1.1 2005/08/28 20:55:53 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef DBServer_MySQL_H_
...
...
Utilities/MBTester/MBSlave.h
View file @
e2cbe9cd
/*! $Id: MBSlave.h,v 1.6 2009/02/24 20:27:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef MBSlave_H_
#define MBSlave_H_
...
...
Utilities/MBTester/MBTCPServer.h
View file @
e2cbe9cd
/*! $Id: MBTCPServer.h,v 1.1 2008/11/22 23:22:23 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef MBTCPServer_H_
#define MBTCPServer_H_
// -------------------------------------------------------------------------
...
...
Utilities/NullController/NullController.h
View file @
e2cbe9cd
// $Id: NullController.h,v 1.11 2008/02/10 03:21:41 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef NullController_H_
#define NullController_H_
...
...
Utilities/codegen/tests/TestGen.h
View file @
e2cbe9cd
// $Id$
// -----------------------------------------------------------------------------
#ifndef TestGen_H_
#define TestGen_H_
...
...
Utilities/codegen/tests/TestGenAlone.h
View file @
e2cbe9cd
// $Id$
// -----------------------------------------------------------------------------
#ifndef TestGenAlone_H_
#define TestGenAlone_H_
...
...
extensions/IOControl/ComediInterface.h
View file @
e2cbe9cd
// $Id: ComediInterface.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// -----------------------------------------------------------------------------
#ifndef ComediInterface_H_
#define ComediInterface_H_
...
...
extensions/IOControl/IOControl.h
View file @
e2cbe9cd
// $Id: IOControl.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// -----------------------------------------------------------------------------
#ifndef IOControl_H_
#define IOControl_H_
...
...
extensions/MBTCPMaster/MBTCPMaster.cc
View file @
e2cbe9cd
// -----------------------------------------------------------------------------
#include <cmath>
#include <limits>
#include <sstream>
#include <Exceptions.h>
#include <extensions/Extensions.h>
...
...
@@ -12,6 +13,7 @@ using namespace UniSetExtensions;
MBTCPMaster
::
MBTCPMaster
(
UniSetTypes
::
ObjectId
objId
,
UniSetTypes
::
ObjectId
shmId
,
SharedMemory
*
ic
,
const
std
::
string
prefix
)
:
UniSetObject_LT
(
objId
),
allInitOK
(
false
),
mb
(
0
),
shm
(
0
),
initPause
(
0
),
...
...
@@ -20,11 +22,11 @@ force_out(false),
mbregFromID
(
false
),
activated
(
false
),
noQueryOptimization
(
false
),
force_disconnect
(
false
),
allNotRespond
(
false
),
force_disconnect
(
true
),
prefix
(
prefix
),
no_extimer
(
false
),
poll_count
(
0
)
poll_count
(
0
),
pollThread
(
0
)
{
// cout << "$ $" << endl;
...
...
@@ -64,10 +66,10 @@ poll_count(0)
throw
UniSetTypes
::
SystemError
(
myname
+
"(MBMaster): Unknown inet port...(Use: "
+
tmp
+
")"
);
recv_timeout
=
conf
->
getArgPInt
(
"--"
+
prefix
+
"-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
),
50
);
recv_timeout
=
conf
->
getArgPInt
(
"--"
+
prefix
+
"-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
),
50
0
);
int
alltout
=
conf
->
getArgPInt
(
"--"
+
prefix
+
"-all-timeout"
,
it
.
getProp
(
"all_timeout"
),
2
000
);
pt
AllNotRespond
.
setTiming
(
all
tout
);
int
tout
=
conf
->
getArgPInt
(
"--"
+
prefix
+
"-timeout"
,
it
.
getProp
(
"timeout"
),
5
000
);
pt
Timeout
.
setTiming
(
tout
);
noQueryOptimization
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-no-query-optimization"
,
it
.
getProp
(
"no_query_optimization"
));
...
...
@@ -80,7 +82,9 @@ poll_count(0)
force
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-force"
,
it
.
getProp
(
"force"
));
force_out
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-force-out"
,
it
.
getProp
(
"force_out"
));
force_disconnect
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-force-disconnect"
,
it
.
getProp
(
"force_disconnect"
));
force_disconnect
=
conf
->
getArgInt
(
"--"
+
prefix
+
"-persistent-connection"
,
it
.
getProp
(
"persistent_connection"
))
?
false
:
true
;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): persisten-connection="
<<
(
!
force_disconnect
)
<<
endl
;
if
(
shm
->
isLocalwork
()
)
{
...
...
@@ -135,6 +139,8 @@ poll_count(0)
// abort();
poll_count
=
-
1
;
pollThread
=
new
ThreadCreator
<
MBTCPMaster
>
(
this
,
&
MBTCPMaster
::
poll_thread
);
}
// -----------------------------------------------------------------------------
MBTCPMaster
::~
MBTCPMaster
()
...
...
@@ -147,7 +153,8 @@ MBTCPMaster::~MBTCPMaster()
delete
it1
->
second
;
}
delete
pollThread
;
delete
mb
;
delete
shm
;
}
...
...
@@ -190,6 +197,8 @@ void MBTCPMaster::initMB( bool reopen )
delete
mb
;
mb
=
0
;
}
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
waitSMReady
()
...
...
@@ -223,11 +232,8 @@ void MBTCPMaster::timerInfo( TimerMessage *tm )
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
step
()
{
{
uniset_mutex_lock
l
(
pollMutex
,
2000
);
poll
();
}
updateRespondSensors
();
if
(
!
activated
)
return
;
...
...
@@ -247,30 +253,121 @@ void MBTCPMaster::step()
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
poll
()
void
MBTCPMaster
::
updateRespondSensors
()
{
if
(
trAllNotRespond
.
hi
(
allNotRespond
)
)
ptAllNotRespond
.
reset
();
if
(
allNotRespond
&&
mb
&&
ptAllNotRespond
.
checkTime
()
)
bool
tcpIsTimeout
=
false
;
{
ptAllNotRespond
.
reset
(
);
// initMB(true
);
uniset_mutex_lock
l
(
tcpMutex
);
tcpIsTimeout
=
pollActivated
&&
ptTimeout
.
checkTime
(
);
}
if
(
dlog
.
debugging
(
Debug
::
LEVEL4
)
)
dlog
[
Debug
::
LEVEL4
]
<<
myname
<<
": tcpTimeout="
<<
tcpIsTimeout
<<
endl
;
for
(
MBTCPMaster
::
RTUDeviceMap
::
iterator
it1
=
rmap
.
begin
();
it1
!=
rmap
.
end
();
++
it1
)
{
RTUDevice
*
d
(
it1
->
second
);
if
(
tcpIsTimeout
)
d
->
resp_real
=
false
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL4
)
)
{
dlog
[
Debug
::
LEVEL4
]
<<
myname
<<
": check respond addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
<<
" respond_id="
<<
d
->
resp_id
<<
" real="
<<
d
->
resp_real
<<
" state="
<<
d
->
resp_state
<<
endl
;
}
if
(
d
->
checkRespond
()
&&
d
->
resp_id
!=
DefaultObjectId
)
{
try
{
bool
set
=
d
->
resp_invert
?
!
d
->
resp_state
:
d
->
resp_state
;
shm
->
localSaveState
(
d
->
resp_dit
,
d
->
resp_id
,
set
,
getId
());
}
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(step): (respond) "
<<
ex
<<
std
::
endl
;
}
}
}
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
poll_thread
()
{
cerr
<<
"*********** polling starting.."
<<
endl
;
{
uniset_mutex_lock
l
(
pollMutex
,
300
);
ptTimeout
.
reset
();
}
while
(
checkProcActive
()
)
{
try
{
poll
();
}
catch
(...){}
if
(
!
checkProcActive
()
)
break
;
msleep
(
polltime
);
}
cerr
<<
"*********** polling finished.."
<<
endl
;
}
// -----------------------------------------------------------------------------
bool
MBTCPMaster
::
checkProcActive
()
{
uniset_mutex_lock
l
(
actMutex
,
300
);
return
activated
;
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
setProcActive
(
bool
st
)
{
uniset_mutex_lock
l
(
actMutex
,
400
);
activated
=
st
;
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
poll
()
{
if
(
!
mb
)
{
initMB
(
false
);
if
(
!
mb
)
{
for
(
MBTCPMaster
::
RTUDeviceMap
::
iterator
it
=
rmap
.
begin
();
it
!=
rmap
.
end
();
++
it
)
it
->
second
->
resp_real
=
false
;
uniset_mutex_lock
l
(
pollMutex
,
300
);
pollActivated
=
false
;
initMB
(
false
);
if
(
!
mb
)
{
for
(
MBTCPMaster
::
RTUDeviceMap
::
iterator
it
=
rmap
.
begin
();
it
!=
rmap
.
end
();
++
it
)
it
->
second
->
resp_real
=
false
;
}
}
if
(
!
checkProcActive
()
)
return
;
updateSM
();
allInitOK
=
false
;
return
;
}
{
uniset_mutex_lock
l
(
pollMutex
);
pollActivated
=
true
;
ptTimeout
.
reset
();
}
if
(
!
allInitOK
)
firstInitRegisters
();
if
(
!
checkProcActive
()
)
return
;
for
(
MBTCPMaster
::
RTUDeviceMap
::
iterator
it1
=
rmap
.
begin
();
it1
!=
rmap
.
end
();
++
it1
)
{
RTUDevice
*
d
(
it1
->
second
);
...
...
@@ -282,6 +379,9 @@ void MBTCPMaster::poll()
d
->
resp_real
=
false
;
for
(
MBTCPMaster
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
{
if
(
!
checkProcActive
()
)
return
;
try
{
if
(
d
->
dtype
==
MBTCPMaster
::
dtRTU
||
d
->
dtype
==
MBTCPMaster
::
dtMTR
)
...
...
@@ -304,12 +404,19 @@ void MBTCPMaster::poll()
// }
// d->resp_real = false;
if
(
!
d
->
ask_every_reg
)
if
(
ex
.
err
==
ModbusRTU
::
erTimeOut
&&
!
d
->
ask_every_reg
)
break
;
// если контроллер хоть что-то ответил, то вроде как связь есть..
if
(
ex
.
err
!=
ModbusRTU
::
erTimeOut
)
d
->
resp_real
=
true
;
}
if
(
it
==
d
->
regmap
.
end
()
)
break
;
if
(
!
checkProcActive
()
)
return
;
}
if
(
stat_time
>
0
)
...
...
@@ -326,6 +433,14 @@ void MBTCPMaster::poll()
// mb->disconnect();
}
{
uniset_mutex_lock
l
(
pollMutex
);
pollActivated
=
false
;
}
if
(
!
checkProcActive
()
)
return
;
// update SharedMemory...
updateSM
();
...
...
@@ -335,6 +450,9 @@ void MBTCPMaster::poll()
RTUDevice
*
d
(
it1
->
second
);
for
(
MBTCPMaster
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
{
if
(
!
checkProcActive
()
)
return
;
RegInfo
*
r
(
it
->
second
);
for
(
PList
::
iterator
i
=
r
->
slst
.
begin
();
i
!=
r
->
slst
.
end
();
++
i
)
IOBase
::
processingThreshold
(
&
(
*
i
),
shm
,
force
);
...
...
@@ -353,10 +471,11 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): poll "
<<
" mbaddr="
<<
ModbusRTU
::
addr2str
(
dev
->
mbaddr
)
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" mboffset="
<<
p
->
offset
<<
" mbfunc="
<<
p
->
mbfunc
<<
" q_count="
<<
p
->
q_count
<<
" mb_init="
<<
p
->
mb_init
<<
" mb_initOK="
<<
p
->
mb_initOK
<<
" sm_initOK="
<<
p
->
sm_initOK
<<
" mbval="
<<
p
->
mbval
<<
endl
;
if
(
p
->
q_count
>
ModbusRTU
::
MAXDATALEN
)
...
...
@@ -381,7 +500,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
{
case
ModbusRTU
:
:
fnReadInputRegisters
:
{
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
->
read04
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
q_count
);
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
->
read04
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
it
->
second
->
mbval
=
ret
.
data
[
i
];
it
--
;
...
...
@@ -390,7 +509,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnReadOutputRegisters
:
{
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
->
read03
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
q_count
);
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
->
read03
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
it
->
second
->
mbval
=
ret
.
data
[
i
];
it
--
;
...
...
@@ -399,7 +518,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnReadInputStatus
:
{
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
q_count
);
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
int
m
=
0
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
...
...
@@ -413,7 +532,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnReadCoilStatus
:
{
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
->
read01
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
q_count
);
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
->
read01
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
q_count
);
int
m
=
0
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
...
...
@@ -434,39 +553,33 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return
false
;
}
if
(
!
p
->
mb_init
)
if
(
!
p
->
sm_initOK
)
{
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(p->mbreg) << endl;
ModbusRTU
::
ReadInputRetMessage
ret1
=
mb
->
read04
(
dev
->
mbaddr
,
p
->
mb_init_mbreg
,
1
);
p
->
mbval
=
ret1
.
data
[
0
];
p
->
sm_init
=
true
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
}
}
// cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
mbval
);
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
mbval
);
}
break
;
case
ModbusRTU
:
:
fnWriteOutputRegisters
:
{
ModbusRTU
::
WriteOutputMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
if
(
!
p
->
sm_initOK
)
{
if
(
!
it
->
second
->
mb_init
)
{
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " mb_init mbreg=" << ModbusRTU::dat2str(it->second->mb_init_mbreg) << endl;
ModbusRTU
::
ReadOutputRetMessage
ret1
=
mb
->
read03
(
dev
->
mbaddr
,
it
->
second
->
mb_init_mbreg
,
1
);
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " mb_init mbreg=" << ModbusRTU::dat2str(it->second->mb_init_mbreg)
// << " mbval=" << ret1.data[0] << endl;
it
->
second
->
mbval
=
ret1
.
data
[
0
];
it
->
second
->
sm_init
=
true
;
}
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
}
ModbusRTU
::
WriteOutputMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
msg
.
addData
(
it
->
second
->
mbval
);
}
it
--
;
ModbusRTU
::
WriteOutputRetMessage
ret
=
mb
->
write10
(
msg
);
}
...
...
@@ -480,57 +593,30 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<<
" IGNORE FORCE SINGLE COIL (0x05) q_count="
<<
p
->
q_count
<<
" ..."
<<
endl
;
return
false
;
}
if
(
!
p
->
mb_init
)
if
(
!
p
->
sm_initOK
)
{
// cerr << "******* mb_init: mbreg=" << ModbusRTU::dat2str(p->mbreg)
// << " init mbreg=" << ModbusRTU::dat2str(p->mb_init_mbreg) << endl;
ModbusRTU
::
ReadInputStatusRetMessage
ret1
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mb_init_mbreg
,
1
);
ModbusRTU
::
DataBits
b
(
ret1
.
data
[
0
]);
// cerr << "******* mb_init_mbreg=" << ModbusRTU::dat2str(p->mb_init_mbreg)
// << " read val=" << (int)b[0] << endl;
p
->
mbval
=
b
[
0
];
p
->
sm_init
=
true
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
}
}
// cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
->
write05
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
mbval
);
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
->
write05
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
mbval
);
}
break
;
case
ModbusRTU
:
:
fnForceMultipleCoils
:
{
if
(
!
p
->
mb_init
)
if
(
!
p
->
sm_initOK
)
{
// every register ask... (for mb_init_mbreg no some)
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
{
ModbusRTU
::
ReadInputStatusRetMessage
ret1
=
mb
->
read02
(
dev
->
mbaddr
,
it
->
second
->
mb_init_mbreg
,
1
);
ModbusRTU
::
DataBits
b
(
ret1
.
data
[
0
]);
it
->
second
->
mbval
=
b
[
0
]
?
1
:
0
;
it
->
second
->
sm_init
=
true
;
}
/*
// alone query for all register (if mb_init_mbreg ++ )
ModbusRTU::ReadInputStatusRetMessage ret1 = mb->read02(dev->mbaddr,p->mb_init_mbreg,p->q_count);
int m=0;
for( int i=0; i<ret1.bcnt; i++ )
{
ModbusRTU::DataBits b(ret1.data[i]);
for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ )
{
it->second->mbval = b[k] ? 1 : 0;
it->second->sm_init = true;
}
}
*/
p
->
sm_init
=
true
;
it
--
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
}
}
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
);
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
msg
.
addBit
(
(
it
->
second
->
mbval
?
true
:
false
)
);
...
...
@@ -553,9 +639,259 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return
true
;
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
firstInitRegisters
()
{
// если все вернут TRUE, значит OK.
allInitOK
=
true
;
for
(
InitList
::
iterator
it
=
initRegList
.
begin
();
it
!=
initRegList
.
end
();
++
it
)
{
try
{
it
->
initOK
=
preInitRead
(
it
);
allInitOK
=
it
->
initOK
;
}
catch
(
ModbusRTU
::
mbException
&
ex
)
{
allInitOK
=
false
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(preInitRead): FAILED ask addr="
<<
ModbusRTU
::
addr2str
(
it
->
dev
->
mbaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
it
->
mbreg
)
<<
" err: "
<<
ex
<<
endl
;
}
if
(
!
it
->
dev
->
ask_every_reg
)
break
;
}
}
}
// -----------------------------------------------------------------------------
bool
MBTCPMaster
::
preInitRead
(
InitList
::
iterator
&
p
)
{
if
(
p
->
initOK
)
return
true
;
RTUDevice
*
dev
=
p
->
dev
;
int
q_count
=
p
->
p
.
rnum
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(preInitRead): poll "
<<
" mbaddr="
<<
ModbusRTU
::
addr2str
(
dev
->
mbaddr
)
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" mbfunc="
<<
p
->
mbfunc
<<
" q_count="
<<
q_count
<<
endl
;
if
(
q_count
>
ModbusRTU
::
MAXDATALEN
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(preInitRead): count("
<<
q_count
<<
") > MAXDATALEN("
<<
ModbusRTU
::
MAXDATALEN
<<
" ..ignore..."
<<
endl
;
}
}
switch
(
p
->
mbfunc
)
{
case
ModbusRTU
:
:
fnReadOutputRegisters
:
{
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
->
read03
(
dev
->
mbaddr
,
p
->
mbreg
,
q_count
);
p
->
initOK
=
initSMValue
(
ret
.
data
,
ret
.
count
,
&
(
p
->
p
));
}
break
;
case
ModbusRTU
:
:
fnReadInputRegisters
:
{
ModbusRTU
::
ReadInputRetMessage
ret1
=
mb
->
read04
(
dev
->
mbaddr
,
p
->
mbreg
,
q_count
);
p
->
initOK
=
initSMValue
(
ret1
.
data
,
ret1
.
count
,
&
(
p
->
p
));
}
break
;
case
ModbusRTU
:
:
fnReadInputStatus
:
{
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mbreg
,
q_count
);
ModbusRTU
::
ModbusData
*
dat
=
new
ModbusRTU
::
ModbusData
[
q_count
];
int
m
=
0
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
q_count
;
k
++
,
m
++
)
dat
[
m
]
=
b
[
k
];
}
p
->
initOK
=
initSMValue
(
dat
,
q_count
,
&
(
p
->
p
));
delete
[]
dat
;
}
break
;
case
ModbusRTU
:
:
fnReadCoilStatus
:
{
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
->
read01
(
dev
->
mbaddr
,
p
->
mbreg
,
q_count
);
ModbusRTU
::
ModbusData
*
dat
=
new
ModbusRTU
::
ModbusData
[
q_count
];
int
m
=
0
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
q_count
;
k
++
,
m
++
)
dat
[
m
]
=
b
[
k
];
}
p
->
initOK
=
initSMValue
(
dat
,
q_count
,
&
(
p
->
p
));
delete
[]
dat
;
}
break
;
default
:
p
->
initOK
=
false
;
break
;
}
if
(
p
->
initOK
)
{
p
->
ri
->
mb_initOK
=
true
;
p
->
ri
->
sm_initOK
=
false
;
bool
f_out
=
force_out
;
// выставляем флаг принудительного обновления
force_out
=
true
;
updateRTU
(
p
->
ri
->
rit
);
force_out
=
f_out
;
}
return
p
->
initOK
;
}
// -----------------------------------------------------------------------------
bool
MBTCPMaster
::
initSMValue
(
ModbusRTU
::
ModbusData
*
data
,
int
count
,
RSProperty
*
p
)
{
using
namespace
ModbusRTU
;
try
{
if
(
p
->
vType
==
VTypes
::
vtUnknown
)
{
ModbusRTU
::
DataBits16
b
(
data
[
0
]);
if
(
p
->
nbit
>=
0
)
{
bool
set
=
b
[
p
->
nbit
];
IOBase
::
processingAsDI
(
p
,
set
,
shm
,
force
);
return
true
;
}
if
(
p
->
rnum
<=
1
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
IOBase
::
processingAsDI
(
p
,
data
[
0
],
shm
,
force
);
}
else
IOBase
::
processingAsAI
(
p
,
(
signed
short
)(
data
[
0
]),
shm
,
force
);
return
true
;
}
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initSMValue): IGNORE item: rnum="
<<
p
->
rnum
<<
" > 1 ?!! for id="
<<
p
->
si
.
id
<<
endl
;
return
false
;
}
else
if
(
p
->
vType
==
VTypes
::
vtSigned
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
IOBase
::
processingAsDI
(
p
,
data
[
0
],
shm
,
force
);
}
else
IOBase
::
processingAsAI
(
p
,
(
signed
short
)(
data
[
0
]),
shm
,
force
);
return
true
;
}
else
if
(
p
->
vType
==
VTypes
::
vtUnsigned
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
IOBase
::
processingAsDI
(
p
,
data
[
0
],
shm
,
force
);
}
else
IOBase
::
processingAsAI
(
p
,
(
unsigned
short
)
data
[
0
],
shm
,
force
);
return
true
;
}
else
if
(
p
->
vType
==
VTypes
::
vtByte
)
{
if
(
p
->
nbyte
<=
0
||
p
->
nbyte
>
VTypes
::
Byte
::
bsize
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initSMValue): IGNORE item: sid="
<<
ModbusRTU
::
dat2str
(
p
->
si
.
id
)
<<
" vtype="
<<
p
->
vType
<<
" but nbyte="
<<
p
->
nbyte
<<
endl
;
return
false
;
}
VTypes
::
Byte
b
(
data
[
0
]);
IOBase
::
processingAsAI
(
p
,
b
.
raw
.
b
[
p
->
nbyte
-
1
],
shm
,
force
);
return
true
;
}
else
if
(
p
->
vType
==
VTypes
::
vtF2
)
{
VTypes
::
F2
f
(
data
,
VTypes
::
F2
::
wsize
());
IOBase
::
processingFasAI
(
p
,
(
float
)
f
,
shm
,
force
);
}
else
if
(
p
->
vType
==
VTypes
::
vtF4
)
{
VTypes
::
F4
f
(
data
,
VTypes
::
F4
::
wsize
());
IOBase
::
processingFasAI
(
p
,
(
float
)
f
,
shm
,
force
);
}
else
if
(
p
->
vType
==
VTypes
::
vtI2
)
{
VTypes
::
I2
i2
(
data
,
VTypes
::
I2
::
wsize
());
IOBase
::
processingAsAI
(
p
,
(
int
)
i2
,
shm
,
force
);
}
else
if
(
p
->
vType
==
VTypes
::
vtU2
)
{
VTypes
::
U2
u2
(
data
,
VTypes
::
U2
::
wsize
());
IOBase
::
processingAsAI
(
p
,
(
unsigned
int
)
u2
,
shm
,
force
);
}
return
true
;
}
catch
(
IOController_i
::
NameNotFound
&
ex
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(initSMValue):(NameNotFound) "
<<
ex
.
err
<<
endl
;
}
catch
(
IOController_i
::
IOBadParam
&
ex
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(initSMValue):(IOBadParam) "
<<
ex
.
err
<<
endl
;
}
catch
(
IONotifyController_i
::
BadRange
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(initSMValue): (BadRange)..."
<<
endl
;
}
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(initSMValue): "
<<
ex
<<
endl
;
}
catch
(
CORBA
::
SystemException
&
ex
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(initSMValue): CORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
catch
(...)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(initSMValue): catch ..."
<<
endl
;
}
return
false
;
}
// -----------------------------------------------------------------------------
bool
MBTCPMaster
::
RTUDevice
::
checkRespond
()
{
bool
prev
=
resp_state
;
if
(
resp_ptTimeout
.
getInterval
()
<=
0
)
{
resp_state
=
resp_real
;
return
(
prev
!=
resp_state
);
}
if
(
resp_trTimeout
.
hi
(
resp_real
)
)
{
if
(
resp_real
)
...
...
@@ -582,38 +918,13 @@ bool MBTCPMaster::RTUDevice::checkRespond()
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
updateSM
()
{
allNotRespond
=
true
;
for
(
MBTCPMaster
::
RTUDeviceMap
::
iterator
it1
=
rmap
.
begin
();
it1
!=
rmap
.
end
();
++
it1
)
{
RTUDevice
*
d
(
it1
->
second
);
if
(
dlog
.
debugging
(
Debug
::
LEVEL4
)
)
{
dlog
[
Debug
::
LEVEL4
]
<<
"check respond addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
<<
" respond="
<<
d
->
resp_id
<<
" real="
<<
d
->
resp_real
<<
" state="
<<
d
->
resp_state
<<
endl
;
}
if
(
d
->
resp_real
)
allNotRespond
=
false
;
// update respond sensors...
if
(
d
->
checkRespond
()
&&
d
->
resp_id
!=
DefaultObjectId
)
{
try
{
bool
set
=
d
->
resp_invert
?
!
d
->
resp_state
:
d
->
resp_state
;
shm
->
localSaveState
(
d
->
resp_dit
,
d
->
resp_id
,
set
,
getId
());
}
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(step): (respond) "
<<
ex
<<
std
::
endl
;
}
}
// cerr << "*********** allNotRespond=" << allNotRespond << endl;
// обновление датчиков связи происходит в другом потоке
// чтобы не зависеть от TCP таймаутов
// см. updateRespondSensors()
// update values...
for
(
MBTCPMaster
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
...
...
@@ -746,15 +1057,8 @@ void MBTCPMaster::sysCommand( UniSetTypes::SystemMessage *sm )
initOutput
();
}
// начальная инициализация
if
(
!
force
)
{
uniset_mutex_lock
l
(
pollMutex
,
2000
);
force
=
true
;
poll
();
force
=
false
;
}
askTimer
(
tmExchange
,
polltime
);
pollThread
->
start
();
break
;
}
...
...
@@ -881,14 +1185,14 @@ void MBTCPMaster::sensorInfo( UniSetTypes::SensorMessage* sm )
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(sensorInfo): si.id="
<<
sm
->
id
<<
" reg="
<<
ModbusRTU
::
dat2str
(
i
->
reg
->
mbreg
)
<<
" val="
<<
sm
->
value
<<
" mb_init
="
<<
i
->
reg
->
mb_init
<<
endl
;
<<
" mb_init
OK="
<<
i
->
reg
->
mb_initOK
<<
endl
;
}
if
(
!
i
->
reg
->
mb_init
)
if
(
!
i
->
reg
->
mb_init
OK
)
continue
;
i
->
value
=
sm
->
value
;
updateRSProperty
(
&
(
*
i
),
true
);
updateRSProperty
(
&
(
*
i
),
true
);
return
;
}
}
...
...
@@ -902,13 +1206,13 @@ bool MBTCPMaster::activateObject()
// пока не пройдёт инициализация датчиков
// см. sysCommand()
{
activated
=
false
;
setProcActive
(
false
)
;
UniSetTypes
::
uniset_mutex_lock
l
(
mutex_start
,
5000
);
UniSetObject_LT
::
activateObject
();
if
(
!
shm
->
isLocalwork
()
)
rtuQueryOptimization
(
rmap
);
initIterators
();
activated
=
true
;
setProcActive
(
true
)
;
}
return
true
;
...
...
@@ -917,7 +1221,7 @@ bool MBTCPMaster::activateObject()
void
MBTCPMaster
::
sigterm
(
int
signo
)
{
cerr
<<
myname
<<
": ********* SIGTERM("
<<
signo
<<
") ********"
<<
endl
;
activated
=
false
;
setProcActive
(
false
)
;
/*! \todo Доделать выставление безопасного состояния на выходы.
И нужно ли это. Ведь может не хватить времени на "обмен"
...
...
@@ -961,7 +1265,7 @@ void MBTCPMaster::readConfiguration()
UniXML_iterator
it
(
root
);
if
(
!
it
.
goChildren
()
)
{
std
::
cerr
<<
myname
<<
"(readConfiguration): раздел <sensors> не содержит секций ?!!
\n
"
;
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readConfiguration): раздел <sensors> не содержит секций ?!!
\n
"
;
return
;
}
...
...
@@ -1032,23 +1336,23 @@ MBTCPMaster::RTUDevice* MBTCPMaster::addDev( RTUDeviceMap& mp, ModbusRTU::Modbus
return
d
;
}
// ------------------------------------------------------------------------------------------
MBTCPMaster
::
RegInfo
*
MBTCPMaster
::
addReg
(
RegMap
&
mp
,
ModbusRTU
::
ModbusData
r
,
MBTCPMaster
::
RegInfo
*
MBTCPMaster
::
addReg
(
RegMap
&
mp
,
RegID
id
,
ModbusRTU
::
ModbusData
r
,
UniXML_iterator
&
xmlit
,
MBTCPMaster
::
RTUDevice
*
dev
,
MBTCPMaster
::
RegInfo
*
rcopy
)
{
RegMap
::
iterator
it
=
mp
.
find
(
r
);
RegMap
::
iterator
it
=
mp
.
find
(
id
);
if
(
it
!=
mp
.
end
()
)
{
if
(
!
it
->
second
->
dev
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(addReg): for
reg="
<<
ModbusRTU
::
dat2str
(
r
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(addReg): for
"
<<
xmlit
.
getProp
(
"name"
)
<<
" dev=0!!!! "
<<
endl
;
return
0
;
}
if
(
it
->
second
->
dev
->
dtype
!=
dev
->
dtype
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(addReg): OTHER mbtype="
<<
dev
->
dtype
<<
" for
reg="
<<
ModbusRTU
::
dat2str
(
r
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(addReg): OTHER mbtype="
<<
dev
->
dtype
<<
" for
"
<<
xmlit
.
getProp
(
"name"
)
<<
". Already used devtype="
<<
it
->
second
->
dev
->
dtype
<<
" for "
<<
it
->
second
->
dev
<<
endl
;
return
0
;
}
...
...
@@ -1080,9 +1384,11 @@ MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r,
}
ri
->
mbreg
=
r
;
}
ri
->
id
=
id
;
mp
.
insert
(
RegMap
::
value_type
(
r
,
ri
));
ri
->
rit
=
mp
.
find
(
r
);
mp
.
insert
(
RegMap
::
value_type
(
id
,
ri
));
ri
->
rit
=
mp
.
find
(
id
);
return
ri
;
}
...
...
@@ -1190,8 +1496,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
{
r
->
dev
=
dev
;
r
->
mbval
=
it
.
getIntProp
(
"default"
);
r
->
offset
=
it
.
getIntProp
(
"tcp_mboffset"
);
r
->
mb_init
=
it
.
getIntProp
(
"tcp_mbinit"
);
if
(
dev
->
dtype
==
MBTCPMaster
::
dtRTU
)
{
...
...
@@ -1228,19 +1532,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
r
->
mbreg
=
ModbusRTU
::
str2mbData
(
sr
);
}
{
string
sr
=
it
.
getProp
(
"tcp_init_mbreg"
);
if
(
sr
==
"-1"
)
{
r
->
mb_init
=
true
;
// OFF mb_init
r
->
sm_init
=
true
;
}
else
if
(
sr
.
empty
()
)
r
->
mb_init_mbreg
=
r
->
mbreg
;
else
r
->
mb_init_mbreg
=
ModbusRTU
::
str2mbData
(
sr
);
}
r
->
mbfunc
=
ModbusRTU
::
fnUnknown
;
string
f
=
it
.
getProp
(
"tcp_mbfunc"
);
if
(
!
f
.
empty
()
)
...
...
@@ -1253,7 +1544,7 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
return
false
;
}
}
return
true
;
}
// ------------------------------------------------------------------------------------------
...
...
@@ -1294,7 +1585,15 @@ bool MBTCPMaster::initRTUDevice( RTUDevice* d, UniXML_iterator& it )
return
true
;
}
// ------------------------------------------------------------------------------------------
MBTCPMaster
::
RegID
MBTCPMaster
::
genRegID
(
const
ModbusRTU
::
ModbusData
mbreg
,
const
int
fn
)
{
// формула для вычисления ID
// требования:
// - ID > диапазона возможных регитров
// - разные функции должны давать разный ID
return
numeric_limits
<
ModbusRTU
::
ModbusData
>::
max
()
+
mbreg
+
fn
;
}
// ------------------------------------------------------------------------------------------
bool
MBTCPMaster
::
initItem
(
UniXML_iterator
&
it
)
{
RSProperty
p
;
...
...
@@ -1304,7 +1603,7 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
string
addr
=
it
.
getProp
(
"tcp_mbaddr"
);
if
(
addr
.
empty
()
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown mbaddr='"
<<
addr
<<
" for "
<<
it
.
getProp
(
"name"
)
<<
endl
;
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown mbaddr='"
<<
addr
<<
"
'
for "
<<
it
.
getProp
(
"name"
)
<<
endl
;
return
false
;
}
...
...
@@ -1332,7 +1631,15 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
mbreg
=
ModbusRTU
::
str2mbData
(
reg
);
}
RegInfo
*
ri
=
addReg
(
dev
->
regmap
,
mbreg
,
it
,
dev
);
int
fn
=
it
.
getIntProp
(
"tcp_mbfunc"
);
// формула для вычисления ID
// требования:
// - ID > диапазона возможных регитров
// - разные функции должны давать разный ID
RegID
rID
=
genRegID
(
mbreg
,
fn
);
RegInfo
*
ri
=
addReg
(
dev
->
regmap
,
rID
,
mbreg
,
it
,
dev
);
if
(
dev
->
dtype
==
dtMTR
)
{
...
...
@@ -1349,16 +1656,16 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
ri
->
dev
=
dev
;
//
п÷п═п·п▓п•п═п п░
!
// п╣я│п╩п╦ я└я┐п╫п╨я├п╦я▐ п╫п╟ п╥п╟п©п╦я│я▄, я┌п╬ п╫п╟п╢п╬ п©я─п╬п╡п╣я─п╦я┌я▄
// я┤я┌п╬ п╬п╢п╦п╫ п╦ я┌п╬я┌п╤п╣ я─п╣пЁп╦я│я┌я─ п╫п╣ п©п╣я─п╣п╥п╟п©п╦я┬я┐я┌ п╫п╣я│п╨п╬п╩я▄п╨п╬ п╢п╟я┌я┤п╦п╨п╬п╡
// я█я┌п╬ п╡п╬п╥п╪п╬п╤п╫п╬ я┌п╬п╩я▄п╨п╬, п╣я│п╩п╦ п╬п╫п╦ п©п╦я┬я┐я┌ п╠п╦я┌я▀
!!
// п≤п╒п·п⌠
:
// п•я│п╩п╦ п╢п╩я▐ я└я┐п╫п╨я├п╦п╧ п╥п╟п©п╦я│п╦ я│п©п╦я│п╬п╨ п╢п╟я┌я┤п╦п╨п╬п╡ п╫п╟ п╬п╢п╦п╫ я─п╣пЁп╦я│я┌я─
> 1
// п╥п╫п╟я┤п╦я┌ п╡ я│п©п╦я│п╨п╣ п╪п╬пЁя┐я┌ п╠я▀я┌я▄ я┌п╬п╩я▄п╨п╬ п╠п╦я┌п╬п╡я▀п╣ п╢п╟я┌я┤п╦п╨п╦
// п╦ п╣я│п╩п╦ п╦п╢я▒я┌ п©п╬п©я▀я┌п╨п╟ п╡п╫п╣я│я┌п╦ п╡ я│п©п╦я│п╬п╨ п╫п╣ п╠п╦я┌п╬п╡я▀п╧ п╢п╟я┌я┤п╦п╨ я┌п╬ п·п╗п≤п▒п п░
!
// п≤ п╫п╟п╬п╠п╬я─п╬я┌: п╣я│п╩п╦ п╦п╢я▒я┌ п©п╬п©я▀я┌п╨п╟ п╡п╫п╣я│я┌п╦ п╠п╦я┌п╬п╡я▀п╧ п╢п╟я┌я┤п╦п╨, п╟ п╡ я│п©п╦я│п╨п╣
// я┐п╤п╣ я│п╦п╢п╦я┌ п╢п╟я┌я┤п╦п╨ п╥п╟п╫п╦п╪п╟я▌я┴п╦п╧ я├п╣п╩я▀п╧ я─п╣пЁп╦я│я┌я─, я┌п╬ я┌п╬п╤п╣ п·п╗п≤п▒п п░
!
//
ПРОВЕРКА
!
// если функция на запись, то надо проверить
// что один и тотже регистр не перезапишут несколько датчиков
// это возможно только, если они пишут биты
!!
// ИТОГ
:
// Если для функций записи список датчиков для регистра
> 1
// значит в списке могут быть только битовые датчики
// и если идёт попытка внести в список не битовый датчик то ОШИБКА
!
// И наоборот: если идёт попытка внести битовый датчик, а в списке
// уже сидит датчик занимающий целый регистр, то тоже ОШИБКА
!
if
(
ModbusRTU
::
isWriteFunction
(
ri
->
mbfunc
)
)
{
if
(
p
.
nbit
<
0
&&
ri
->
slst
.
size
()
>
1
)
...
...
@@ -1383,7 +1690,20 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
return
false
;
}
}
// Раз это регистр для записи, то как минимум надо сперва
// инициализировать значением из SM
ri
->
sm_initOK
=
it
.
getIntProp
(
"tcp_sm_initOK"
);
ri
->
mb_initOK
=
true
;
// может быть переопределён если будет указан tcp_preinit="1" (см. ниже)
}
else
{
// Если это регистр для чтения, то сразу можно работать
// инициализировать не надо
ri
->
mb_initOK
=
true
;
ri
->
sm_initOK
=
true
;
}
RSProperty
*
p1
=
addProp
(
ri
->
slst
,
p
);
if
(
!
p1
)
...
...
@@ -1395,9 +1715,67 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
{
for
(
int
i
=
1
;
i
<
p1
->
rnum
;
i
++
)
{
MBTCPMaster
::
RegInfo
*
ri1
=
addReg
(
dev
->
regmap
,
mbreg
+
i
,
it
,
dev
,
ri
);
ri1
->
mb_init_mbreg
=
ri
->
mb_init_mbreg
+
i
;
RegID
id1
=
genRegID
(
mbreg
+
i
,
fn
);
addReg
(
dev
->
regmap
,
id1
,
mbreg
+
i
,
it
,
dev
,
ri
);
}
}
// Фомируем список инициализации
bool
need_init
=
it
.
getIntProp
(
"tcp_preinit"
);
if
(
need_init
&&
ModbusRTU
::
isWriteFunction
(
ri
->
mbfunc
)
)
{
InitRegInfo
ii
;
ii
.
p
=
p
;
ii
.
dev
=
dev
;
ii
.
ri
=
ri
;
string
s_reg
(
it
.
getProp
(
"tcp_init_mbreg"
));
if
(
!
s_reg
.
empty
()
)
ii
.
mbreg
=
ModbusRTU
::
str2mbData
(
s_reg
);
else
ii
.
mbreg
=
ri
->
mbreg
;
string
s_mbfunc
(
it
.
getProp
(
"tcp_init_mbfunc"
));
if
(
!
s_mbfunc
.
empty
()
)
{
ii
.
mbfunc
=
(
ModbusRTU
::
SlaveFunctionCode
)
UniSetTypes
::
uni_atoi
(
s_mbfunc
);
if
(
ii
.
mbfunc
==
ModbusRTU
::
fnUnknown
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown tcp_init_mbfunc ='"
<<
s_mbfunc
<<
"' for "
<<
it
.
getProp
(
"name"
)
<<
endl
;
return
false
;
}
}
else
{
switch
(
ri
->
mbfunc
)
{
case
ModbusRTU
:
:
fnWriteOutputSingleRegister
:
ii
.
mbfunc
=
ModbusRTU
::
fnReadOutputRegisters
;
break
;
case
ModbusRTU
:
:
fnForceSingleCoil
:
ii
.
mbfunc
=
ModbusRTU
::
fnReadCoilStatus
;
break
;
case
ModbusRTU
:
:
fnWriteOutputRegisters
:
ii
.
mbfunc
=
ModbusRTU
::
fnReadOutputRegisters
;
break
;
case
ModbusRTU
:
:
fnForceMultipleCoils
:
ii
.
mbfunc
=
ModbusRTU
::
fnReadCoilStatus
;
break
;
default
:
ii
.
mbfunc
=
ModbusRTU
::
fnReadOutputRegisters
;
break
;
}
}
initRegList
.
push_back
(
ii
);
ri
->
mb_initOK
=
false
;
ri
->
sm_initOK
=
false
;
}
return
true
;
...
...
@@ -1441,15 +1819,29 @@ void MBTCPMaster::initIterators()
void
MBTCPMaster
::
help_print
(
int
argc
,
const
char
*
const
*
argv
)
{
cout
<<
"Default: prefix='mbtcp'"
<<
endl
;
cout
<<
"--prefix-polltime msec - Пауза между опросаом карт. По умолчанию 200 мсек."
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10."
<<
endl
;
cout
<<
"--prefix-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')"
<<
endl
;
cout
<<
"--prefix-force - Сохранять значения в SM, независимо от, того менялось ли значение"
<<
endl
;
cout
<<
"--prefix-initPause - Задержка перед инициализацией (время на активизация процесса)"
<<
endl
;
cout
<<
"--prefix-name name - ObjectId (имя) процесса. По умолчанию: MBTCPMaster1"
<<
endl
;
cout
<<
"--prefix-confnode name - Настроечная секция в конф. файле <name>. "
<<
endl
;
cout
<<
"--prefix-polltime msec - Пауза между опросаом карт. По умолчанию 200 мсек."
<<
endl
;
cout
<<
"--prefix-heartbeat-id name - Данный процесс связан с указанным аналоговым heartbeat-дачиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-max val - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10."
<<
endl
;
cout
<<
"--prefix-ready-timeout msec - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')"
<<
endl
;
cout
<<
"--prefix-force 0,1 - Сохранять значения в SM, независимо от, того менялось ли значение"
<<
endl
;
cout
<<
"--prefix-force-out 0,1 - Считывать значения 'выходов' кажый раз SM (а не по изменению)"
<<
endl
;
cout
<<
"--prefix-initPause msec - Задержка перед инициализацией (время на активизация процесса)"
<<
endl
;
cout
<<
"--prefix-no-query-optimization 0,1 - Не оптимизировать запросы (не объединять соседние регистры в один запрос)"
<<
endl
;
cout
<<
"--prefix-reg-from-id 0,1 - Использовать в качестве регистра sensor ID"
<<
endl
;
cout
<<
"--prefix-filter-field name - Считывать список опрашиваемых датчиков, только у которых есть поле field"
<<
endl
;
cout
<<
"--prefix-filter-value val - Считывать список опрашиваемых датчиков, только у которых field=value"
<<
endl
;
cout
<<
"--prefix-statistic-sec sec - Выводить статистику опроса каждые sec секунд"
<<
endl
;
// ---------- init MBTCP ----------
// cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout
<<
" Настройки протокола TCP: "
<<
endl
;
cout
<<
"--prefix-recv-timeout - Таймаут на ожидание ответа."
<<
endl
;
cout
<<
"--prefix-gateway hostname,IP - IP опрашиваемого узла"
<<
endl
;
cout
<<
"--prefix-gateway-port num - port на опрашиваемом узле"
<<
endl
;
cout
<<
"--prefix-recv-timeout msec - Таймаут на приём одного сообщения."
<<
endl
;
cout
<<
"--prefix-timeout msec - Таймаут для определения отсутсвия соединения.в"
<<
endl
;
cout
<<
"--prefix-persistent-connection 0,1 - Не закрывать соединение на каждом цикле опроса"
<<
endl
;
}
// -----------------------------------------------------------------------------
MBTCPMaster
*
MBTCPMaster
::
init_mbmaster
(
int
argc
,
const
char
*
const
*
argv
,
UniSetTypes
::
ObjectId
icID
,
SharedMemory
*
ic
,
...
...
@@ -1562,12 +1954,12 @@ bool MBTCPMaster::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniX
}
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(initDeviceInfo): add addr="
<<
ModbusRTU
::
addr2str
(
a
)
<<
endl
;
int
tout
=
it
.
getPIntProp
(
"timeout"
,
UniSetTimer
::
WaitUpTime
);
int
tout
=
it
.
getPIntProp
(
"timeout"
,
5000
);
d
->
second
->
resp_ptTimeout
.
setTiming
(
tout
);
d
->
second
->
resp_invert
=
it
.
getIntProp
(
"invert"
);
// d->second->no_clean_input = it.getIntProp("no_clean_input");
//
dlog[Debug::INFO] << myname << "(initDeviceInfo): add " << d->second << endl;
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(initDeviceInfo): add "
<<
d
->
second
<<
endl
;
return
true
;
}
...
...
@@ -1611,7 +2003,8 @@ std::ostream& operator<<( std::ostream& os, MBTCPMaster::RTUDevice& d )
// -----------------------------------------------------------------------------
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
MBTCPMaster
::
RegInfo
&
r
)
{
os
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
r
.
mbreg
)
os
<<
" id="
<<
r
.
id
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
r
.
mbreg
)
<<
" mbfunc="
<<
r
.
mbfunc
<<
" q_num="
<<
r
.
q_num
<<
" q_count="
<<
r
.
q_count
...
...
@@ -1638,14 +2031,14 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
for
(
MBTCPMaster
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
{
MBTCPMaster
::
RegMap
::
iterator
beg
=
it
;
ModbusRTU
::
ModbusData
reg
=
it
->
second
->
mbreg
+
it
->
second
->
offset
;
ModbusRTU
::
ModbusData
reg
=
it
->
second
->
mbreg
;
beg
->
second
->
q_num
=
1
;
beg
->
second
->
q_count
=
1
;
it
++
;
for
(
;
it
!=
d
->
regmap
.
end
();
++
it
)
{
if
(
(
it
->
second
->
mbreg
+
it
->
second
->
offset
-
reg
)
>
1
)
if
(
(
it
->
second
->
mbreg
-
reg
)
>
1
)
break
;
if
(
beg
->
second
->
mbfunc
!=
it
->
second
->
mbfunc
)
...
...
@@ -1656,7 +2049,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
if
(
beg
->
second
->
q_count
>=
ModbusRTU
::
MAXDATALEN
)
break
;
reg
=
it
->
second
->
mbreg
+
it
->
second
->
offset
;
reg
=
it
->
second
->
mbreg
;
it
->
second
->
q_num
=
beg
->
second
->
q_count
;
it
->
second
->
q_count
=
0
;
}
...
...
@@ -1697,8 +2090,6 @@ void MBTCPMaster::updateRTU( RegMap::iterator& rit )
for
(
PList
::
iterator
it
=
r
->
slst
.
begin
();
it
!=
r
->
slst
.
end
();
++
it
)
updateRSProperty
(
&
(
*
it
),
false
);
if
(
r
->
sm_init
)
r
->
mb_init
=
true
;
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
updateRSProperty
(
RSProperty
*
p
,
bool
write_only
)
...
...
@@ -1711,6 +2102,11 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
if
(
!
save
&&
write_only
)
return
;
// если требуется инициализация и она ещё не произведена,
// то игнорируем
if
(
save
&&
!
r
->
mb_initOK
)
return
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
"updateP: sid="
<<
p
->
si
.
id
<<
" mbval="
<<
r
->
mbval
...
...
@@ -1719,7 +2115,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
<<
" nbit="
<<
p
->
nbit
<<
" save="
<<
save
<<
" ioype="
<<
p
->
stype
<<
" mb_init="
<<
r
->
mb_init
<<
" mb_initOK="
<<
r
->
mb_initOK
<<
" sm_initOK="
<<
r
->
sm_initOK
<<
endl
;
try
...
...
@@ -1729,11 +2126,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
ModbusRTU
::
DataBits16
b
(
r
->
mbval
);
if
(
p
->
nbit
>=
0
)
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
bool
set
=
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
b
.
set
(
p
->
nbit
,
set
);
r
->
mbval
=
b
.
mdata
();
if
(
r
->
mb_initOK
)
{
bool
set
=
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
b
.
set
(
p
->
nbit
,
set
);
r
->
mbval
=
b
.
mdata
();
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1746,15 +2147,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
if
(
p
->
rnum
<=
1
)
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
r
->
mbval
=
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
}
else
r
->
mbval
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
if
(
r
->
mb_initOK
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
r
->
mbval
=
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
}
else
r
->
mbval
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1766,6 +2172,7 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
IOBase
::
processingAsAI
(
p
,
(
signed
short
)(
r
->
mbval
),
shm
,
force
);
}
return
;
}
...
...
@@ -1775,15 +2182,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
else
if
(
p
->
vType
==
VTypes
::
vtSigned
)
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
if
(
r
->
mb_initOK
)
{
r
->
mbval
=
(
signed
short
)
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
r
->
mbval
=
(
signed
short
)
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
}
else
r
->
mbval
=
(
signed
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
else
r
->
mbval
=
(
signed
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
}
else
{
...
...
@@ -1801,15 +2213,20 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
else
if
(
p
->
vType
==
VTypes
::
vtUnsigned
)
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
r
->
mbval
=
(
unsigned
short
)
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
}
else
r
->
mbval
=
(
unsigned
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
if
(
r
->
mb_initOK
)
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
{
r
->
mbval
=
(
unsigned
short
)
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
}
else
r
->
mbval
=
(
unsigned
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1834,12 +2251,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
return
;
}
if
(
save
&&
r
->
mb_init
)
if
(
save
&&
r
->
sm_initOK
)
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
Byte
b
(
r
->
mbval
);
b
.
raw
.
b
[
p
->
nbyte
-
1
]
=
v
;
r
->
mbval
=
b
.
raw
.
w
;
if
(
r
->
mb_initOK
)
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
Byte
b
(
r
->
mbval
);
b
.
raw
.
b
[
p
->
nbyte
-
1
]
=
v
;
r
->
mbval
=
b
.
raw
.
w
;
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1852,12 +2273,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtF2
)
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
VTypes
::
F2
f2
(
f
);
for
(
int
k
=
0
;
k
<
VTypes
::
F2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f2
.
raw
.
v
[
k
];
if
(
r
->
mb_initOK
)
{
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
VTypes
::
F2
f2
(
f
);
for
(
int
k
=
0
;
k
<
VTypes
::
F2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f2
.
raw
.
v
[
k
];
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1874,12 +2300,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtF4
)
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
VTypes
::
F4
f4
(
f
);
for
(
int
k
=
0
;
k
<
VTypes
::
F4
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f4
.
raw
.
v
[
k
];
if
(
r
->
mb_initOK
)
{
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
VTypes
::
F4
f4
(
f
);
for
(
int
k
=
0
;
k
<
VTypes
::
F4
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f4
.
raw
.
v
[
k
];
}
}
else
{
...
...
@@ -1896,12 +2325,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtI2
)
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
I2
i2
(
v
);
for
(
int
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
i2
.
raw
.
v
[
k
];
if
(
r
->
mb_initOK
)
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
I2
i2
(
v
);
for
(
int
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
i2
.
raw
.
v
[
k
];
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1918,12 +2352,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtU2
)
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
U2
u2
(
v
);
for
(
int
k
=
0
;
k
<
VTypes
::
U2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
u2
.
raw
.
v
[
k
];
if
(
r
->
mb_initOK
)
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
U2
u2
(
v
);
for
(
int
k
=
0
;
k
<
VTypes
::
U2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
u2
.
raw
.
v
[
k
];
r
->
sm_initOK
=
true
;
}
}
else
{
...
...
@@ -1937,6 +2376,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
IOBase
::
processingAsAI
(
p
,
(
unsigned
int
)
u2
,
shm
,
force
);
}
}
return
;
}
catch
(
IOController_i
::
NameNotFound
&
ex
)
{
...
...
@@ -1963,6 +2404,10 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(updateRSProperty): catch ..."
<<
endl
;
}
// Если SM стала (или была) недоступна
// то флаг инициализации надо сбросить
r
->
sm_initOK
=
false
;
}
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
updateMTR
(
RegMap
::
iterator
&
rit
)
...
...
extensions/MBTCPMaster/MBTCPMaster.h
View file @
e2cbe9cd
...
...
@@ -14,6 +14,7 @@
#include "Calibration.h"
#include "SMInterface.h"
#include "SharedMemory.h"
#include "ThreadCreator.h"
#include "IOBase.h"
#include "VTypes.h"
#include "MTR.h"
...
...
@@ -68,10 +69,11 @@
Порт задаётся в конфигурационном файле параметром \b gateway_port или
параметром командной строки \b --xxx-gateway-port. По умолчанию используется порт \b 502.
\b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём
сообщений. По умолчанию 20
00 мсек.
\b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём
одного сообщения. По умолчанию 1
00 мсек.
\b --xxx-
all-timeout или \b all_timeout msec - таймаут на определение отсутсвия связи
\b --xxx-
timeout или \b timeout msec - таймаут на определение отсутсвия связи
(после этого идёт попытка реинициализировать соединение)
По умолчанию 5000 мсек.
\b --xxx-no-query-optimization или \b no_query_optimization - [1|0] отключить оптимизацию запросов
...
...
@@ -87,7 +89,7 @@
- 1 - перечитывать значения входов из SharedMemory на каждом цикле
- 0 - обновлять значения только по изменению
\b --xxx-
force-disconnect или \b force_disconnect -
закрывать соединение после каждого запроса.
\b --xxx-
persistent-connection или \b persistent_connection - НЕ
закрывать соединение после каждого запроса.
\b --xxx-force-out или \b force_out [1|0]
- 1 - перечитывать значения выходов из SharedMemory на каждом цикле
...
...
@@ -137,7 +139,7 @@
Помимо этого можно задавать следующие параметры:
- \b tcp_vtype - тип переменной. см VTypes::VType.
- \b tcp_rawdata - [
1|0
] - игнорировать или нет параметры калибровки
- \b tcp_rawdata - [
0|1
] - игнорировать или нет параметры калибровки
- \b tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется
функция читающая слова (03
...
...
@@ -145,13 +147,31 @@
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
- \b tcp_init_mbfunc - Номер функции для инициализации. Если не указана, будет определена автоматически исходя из tcp_mbfunc.
- \b tcp_init_mbreg - Номер регистра откуда считывать значение для инициализации. Если это поле не указано используется tcp_mbreg.
Если указано tcp_preinit="1", то прежде чем начать писать регистр в устройство, будет произведено его чтение.
По умолчанию все "записываемые" регистры инициализируются значением из SM. Т.е. пока не будет первый раз считано значение из SM,
регистры в устройство писатся не будут. Чтобы отключить это поведение, можно указать параметр
- \b tcp_sm_initOK - [0|1] Игнорировать начальную инициализацию из SM (сразу писать в устройство)
При этом будет записывыться значение "default".
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte.
*/
// -----------------------------------------------------------------------------
/*!
Реализация Modbus TCP Master для обмена с многими ModbusRTU устройствами
\par
Реализация Modbus TCP Master для обмена с многими ModbusRTU устройствами
через один modbus tcp шлюз.
\par Чтобы не зависеть от таймаутов TCP соединений, которые могут неопределённо зависать
на создании соединения с недоступным хостом. Обмен вынесен в отдельный поток.
При этом в этом же потоке обновляются данные в SM. В свою очередь информация о датчиках
связи обновляется в основном потоке (чтобы не зависеть от TCP).
*/
class
MBTCPMaster
:
public
UniSetObject_LT
...
...
@@ -214,25 +234,25 @@ class MBTCPMaster:
typedef
std
::
list
<
RSProperty
>
PList
;
static
std
::
ostream
&
print_plist
(
std
::
ostream
&
os
,
PList
&
p
);
typedef
std
::
map
<
ModbusRTU
::
ModbusData
,
RegInfo
*>
RegMap
;
typedef
unsigned
long
RegID
;
typedef
std
::
map
<
RegID
,
RegInfo
*>
RegMap
;
struct
RegInfo
{
RegInfo
()
:
mbval
(
0
),
mbreg
(
0
),
mbfunc
(
ModbusRTU
::
fnUnknown
),
dev
(
0
),
offset
(
0
),
mtrType
(
MTR
::
mtUnknown
),
q_num
(
0
),
q_count
(
1
),
mb_init
(
false
),
sm_init
(
false
),
mb_init_mbreg
(
0
)
id
(
0
),
dev
(
0
),
mtrType
(
MTR
::
mtUnknown
),
q_num
(
0
),
q_count
(
1
),
mb_initOK
(
true
),
sm_initOK
(
true
)
{}
ModbusRTU
::
ModbusData
mbval
;
ModbusRTU
::
ModbusData
mbreg
;
/*!< регистр */
ModbusRTU
::
SlaveFunctionCode
mbfunc
;
/*!< функция для чтения/записи */
PList
slst
;
RegID
id
;
RTUDevice
*
dev
;
int
offset
;
// only for MTR
MTR
::
MTRType
mtrType
;
/*!< тип регистра (согласно спецификации на MTR) */
...
...
@@ -241,9 +261,17 @@ class MBTCPMaster:
int
q_count
;
/*!< count registers for query */
RegMap
::
iterator
rit
;
bool
mb_init
;
/*!< init before use */
bool
sm_init
;
/*!< SM init value */
ModbusRTU
::
ModbusData
mb_init_mbreg
;
/*!< mb_init register */
// начальная инициалиазция для "записываемых" регистров
// Механизм:
// Если tcp_preinit="1", то сперва будет сделано чтение значения из устройства.
// при этом флаг mb_init=false пока не пройдёт успешной инициализации
// Если tcp_preinit="0", то флаг mb_init сразу выставляется в true.
bool
mb_initOK
;
/*!< инициализировалось ли значение из устройства */
// Флаг sm_init означает, что писать в устройство нельзя, т.к. значение в "карте регистров"
// ещё не инициализировано из SM
bool
sm_initOK
;
/*!< инициализировалось ли значение из SM */
};
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
RegInfo
&
r
);
...
...
@@ -293,9 +321,30 @@ class MBTCPMaster:
void
printMap
(
RTUDeviceMap
&
d
);
// ----------------------------------
protected
:
struct
InitRegInfo
{
InitRegInfo
()
:
dev
(
0
),
mbreg
(
0
),
mbfunc
(
ModbusRTU
::
fnUnknown
),
initOK
(
false
),
ri
(
0
)
{}
RSProperty
p
;
RTUDevice
*
dev
;
ModbusRTU
::
ModbusData
mbreg
;
ModbusRTU
::
SlaveFunctionCode
mbfunc
;
bool
initOK
;
RegInfo
*
ri
;
};
typedef
std
::
list
<
InitRegInfo
>
InitList
;
void
firstInitRegisters
();
bool
preInitRead
(
InitList
::
iterator
&
p
);
bool
initSMValue
(
ModbusRTU
::
ModbusData
*
data
,
int
count
,
RSProperty
*
p
);
bool
allInitOK
;
RTUDeviceMap
rmap
;
InitList
initRegList
;
/*!< список регистров для инициализации */
ModbusTCPMaster
*
mb
;
UniSetTypes
::
uniset_mutex
mbMutex
;
std
::
string
iaddr
;
...
...
@@ -310,6 +359,7 @@ class MBTCPMaster:
SMInterface
*
shm
;
void
step
();
void
poll_thread
();
void
poll
();
bool
pollRTU
(
RTUDevice
*
dev
,
RegMap
::
iterator
&
it
);
...
...
@@ -317,6 +367,7 @@ class MBTCPMaster:
void
updateRTU
(
RegMap
::
iterator
&
it
);
void
updateMTR
(
RegMap
::
iterator
&
it
);
void
updateRSProperty
(
RSProperty
*
p
,
bool
write_only
=
false
);
void
updateRespondSensors
();
virtual
void
processingMessage
(
UniSetTypes
::
VoidMessage
*
msg
);
void
sysCommand
(
UniSetTypes
::
SystemMessage
*
msg
);
...
...
@@ -338,9 +389,9 @@ class MBTCPMaster:
void
initDeviceList
();
void
initOffsetList
();
static
RegID
genRegID
(
const
ModbusRTU
::
ModbusData
r
,
const
int
fn
);
RTUDevice
*
addDev
(
RTUDeviceMap
&
dmap
,
ModbusRTU
::
ModbusAddr
a
,
UniXML_iterator
&
it
);
RegInfo
*
addReg
(
RegMap
&
rmap
,
ModbusRTU
::
ModbusData
r
,
UniXML_iterator
&
it
,
RegInfo
*
addReg
(
RegMap
&
rmap
,
RegID
id
,
ModbusRTU
::
ModbusData
r
,
UniXML_iterator
&
it
,
RTUDevice
*
dev
,
RegInfo
*
rcopy
=
0
);
RSProperty
*
addProp
(
PList
&
plist
,
RSProperty
&
p
);
...
...
@@ -355,7 +406,10 @@ class MBTCPMaster:
void
readConfiguration
();
bool
check_item
(
UniXML_iterator
&
it
);
private
:
bool
checkProcActive
();
void
setProcActive
(
bool
st
);
private
:
MBTCPMaster
();
bool
initPause
;
UniSetTypes
::
uniset_mutex
mutex_start
;
...
...
@@ -371,17 +425,13 @@ class MBTCPMaster:
IOController
::
AIOStateList
::
iterator
aitHeartBeat
;
UniSetTypes
::
ObjectId
test_id
;
UniSetTypes
::
uniset_mutex
pollMutex
;
UniSetTypes
::
uniset_mutex
actMutex
;
bool
activated
;
int
activateTimeout
;
bool
noQueryOptimization
;
bool
force_disconnect
;
bool
allNotRespond
;
Trigger
trAllNotRespond
;
PassiveTimer
ptAllNotRespond
;
std
::
string
prefix
;
bool
no_extimer
;
...
...
@@ -389,6 +439,16 @@ class MBTCPMaster:
timeout_t
stat_time
;
/*!< время сбора статистики обмена */
int
poll_count
;
PassiveTimer
ptStatistic
;
/*!< таймер для сбора статистики обмена */
// т.к. TCP может "зависнуть" на подключении к недоступному узлу
// делаем опрос в отдельном потоке
ThreadCreator
<
MBTCPMaster
>*
pollThread
;
/*!< поток опроса */
bool
pollActivated
;
UniSetTypes
::
uniset_mutex
pollMutex
;
// определение timeout для соединения
PassiveTimer
ptTimeout
;
UniSetTypes
::
uniset_mutex
tcpMutex
;
};
// -----------------------------------------------------------------------------
#endif // _MBTCPMaster_H_
...
...
extensions/MBTCPMaster/Makefile.am
View file @
e2cbe9cd
bin_PROGRAMS
=
@PACKAGE@-mbtcpmaster
# не забывайте править версию в pc-файле
UMBTCP_VER
=
@LIBVER@
UMBTCP_VER
=
1:1:0
lib_LTLIBRARIES
=
libUniSetMBTCPMaster.la
libUniSetMBTCPMaster_la_LDFLAGS
=
-version-info
$(UMBTCP_VER)
...
...
extensions/MBTCPMaster/libUniSetMBTCPMaster.pc.in
View file @
e2cbe9cd
...
...
@@ -6,6 +6,6 @@ includedir=@includedir@
Name: libUniSetMBTCPMaster
Description: Support library for UniSetModbusTCPMaster
Requires: libUniSetExtensions libUniSetSharedMemory
Version:
@VERSION@
Version:
1.1.0
Libs: -L${libdir} -lUniSetMBTCPMaster
Cflags: -I${includedir}/uniset
extensions/RTUExchange/RTUExchange.cc
View file @
e2cbe9cd
...
...
@@ -607,7 +607,7 @@ void RTUExchange::updateSM()
if
(
dlog
.
debugging
(
Debug
::
LEVEL4
)
)
{
dlog
[
Debug
::
LEVEL4
]
<<
"check respond addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
<<
" respond="
<<
d
->
resp_id
<<
" respond
_id
="
<<
d
->
resp_id
<<
" real="
<<
d
->
resp_real
<<
" state="
<<
d
->
resp_state
<<
endl
;
...
...
extensions/RTUExchange/RTUStorage.h
View file @
e2cbe9cd
// --------------------------------------------------------------------------
//! \version $Id: RTUStorage.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef _RTUSTORAGE_H_
#define _RTUSTORAGE_H_
// -----------------------------------------------------------------------------
...
...
extensions/SMViewer/SMViewer.h
View file @
e2cbe9cd
/*! $Id$ */
//--------------------------------------------------------------------------------
#ifndef _SMVIEWER_H
#define _SMVIEWER_H
...
...
extensions/SharedMemory/SharedMemory.h
View file @
e2cbe9cd
/* $Id: SharedMemory.h,v 1.2 2009/01/22 02:11:24 vpashka Exp $ */
// -----------------------------------------------------------------------------
#ifndef SharedMemory_H_
#define SharedMemory_H_
...
...
extensions/UDPExchange/UDPPacket.h
View file @
e2cbe9cd
// $Id: UDPPacket.h,v 1.1 2009/02/10 20:38:27 vpashka Exp $
// -----------------------------------------------------------------------------
#ifndef UDPPacket_H_
#define UDPPacket_H_
...
...
extensions/UniNetwork/UniExchange.h
View file @
e2cbe9cd
// $Id: UniExchange.h,v 1.2 2009/04/07 16:11:23 pv Exp $
// -----------------------------------------------------------------------------
#ifndef UniExchange_H_
#define UniExchange_H_
...
...
extensions/include/DigitalFilter.h
View file @
e2cbe9cd
// $Id: DigitalFilter.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
//--------------------------------------------------------------------------
// Цифровой фильтр с двумя (опционально) уровнями фильтрации сигнала
// Первый уровень фильтра усредняет несколько значений, переданных через массив
...
...
extensions/include/Extensions.h
View file @
e2cbe9cd
// $Id: Extensions.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// -------------------------------------------------------------------------
#ifndef Extensions_H_
#define Extensions_H_
...
...
extensions/include/IOBase.h
View file @
e2cbe9cd
// $Id: IOBase.h,v 1.3 2009/01/23 23:56:54 vpashka Exp $
// -----------------------------------------------------------------------------
#ifndef IOBase_H_
#define IOBase_H_
...
...
extensions/include/MTR.h
View file @
e2cbe9cd
// --------------------------------------------------------------------------
//! \version $Id: MTR.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef _MTR_H_
#define _MTR_H_
...
...
extensions/include/PID.h
View file @
e2cbe9cd
// $Id: PID.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// -----------------------------------------------------------------------------
#ifndef PID_H_
#define PID_H_
...
...
extensions/include/SMInterface.h
View file @
e2cbe9cd
/* $Id: SMInterface.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $ */
//--------------------------------------------------------------------------
#ifndef SMInterface_H_
#define SMInterface_H_
//--------------------------------------------------------------------------
#include <string>
#include "UniSetTypes.h"
#include "Mutex.h"
#include "IONotifyController.h"
#include "UniversalInterface.h"
class
SMInterface
...
...
@@ -89,6 +88,7 @@ class SMInterface
CORBA
::
Object_var
oref
;
UniSetTypes
::
ObjectId
shmID
;
UniSetTypes
::
ObjectId
myid
;
UniSetTypes
::
uniset_mutex
shmMutex
;
};
//--------------------------------------------------------------------------
...
...
extensions/include/VTypes.h
View file @
e2cbe9cd
// --------------------------------------------------------------------------
//! \version $Id: RTUTypes.h,v 1.1 2008/12/14 21:57:50 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef _RTUTypes_H_
#define _RTUTypes_H_
...
...
extensions/lib/SMInterface.cc
View file @
e2cbe9cd
...
...
@@ -10,6 +10,7 @@ using namespace UniSetTypes;
#define BEG_FUNC(name) \
try \
{ \
uniset_mutex_lock l(shmMutex,500); \
IONotifyController_i_var shm;\
for( unsigned int i=0; i<conf->getRepeatCount(); i++)\
{\
...
...
@@ -32,6 +33,7 @@ using namespace UniSetTypes;
#define BEG_FUNC1(name) \
try \
{ \
uniset_mutex_lock l(shmMutex,500); \
if( true ) \
{ \
try \
...
...
include/CallBackTimer.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:20 $
* \version $Id: CallBackTimer.h,v 1.5 2005/01/28 20:52:20 vitlav Exp $
*/
//----------------------------------------------------------------------------
# ifndef CallBackTimer_H_
...
...
include/CallBackTimer_template.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/02/07 21:04:56 $
* \version $Id: CallBackTimer_template.h,v 1.6 2008/02/07 21:04:56 vpashka Exp $
*/
// --------------------------------------------------------------------------
# ifndef CallBackTimer_TEMPLATE_H_
...
...
include/Configuration.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Класс работы с конфигурацией
* \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2008/02/21 19:59:57 $
* \version $Id: Configuration.h,v 1.25 2008/02/21 19:59:57 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef Configuration_H_
...
...
include/DBServer.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: DBServer.h,v 1.8 2007/06/17 21:30:55 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef DBServer_H_
...
...
include/DefaultMessageInterface.h
View file @
e2cbe9cd
...
...
@@ -20,9 +20,6 @@
/*! \file
* \brief "Пустая" реализация интерфейса работы с сообщениями
* \author Pavel Vainerman
* \date $Date: 2006/12/22 13:37:48 $
* \version $Id: DefaultMessageInterface.h,v 1.3 2006/12/22 13:37:48 vpashka Exp $
*
*/
// --------------------------------------------------------------------------
#ifndef DefaultMessageInterface_H_
...
...
include/IOController.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Реализация IOController_i
* \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
* \version $Id: IOController.h,v 1.28 2008/11/29 21:24:25 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef IOController_H_
...
...
include/IONotifyController.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Реализация IONotifyController_i
* \author Pavel Vainerman
* \date $Date: 2007/12/16 21:32:07 $
* \version $Id: IONotifyController.h,v 1.23 2007/12/16 21:32:07 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef IONotifyController_H_
...
...
include/IONotifyController_LT.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/07/31 18:13:40 $
* \version $Id: IONotifyController_LT.h,v 1.4 2007/07/31 18:13:40 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef IONotifyController_LT_H_
...
...
include/IORFile.h
View file @
e2cbe9cd
...
...
@@ -18,8 +18,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \version $Id: IORFile.h,v 1.4 2007/11/15 20:55:26 vpashka Exp $
* \date $Date: 2007/11/15 20:55:26 $
*/
// --------------------------------------------------------------------------
#ifndef IORFile_H_
...
...
include/IOs/DigitalCard.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Заголовочный файл для организации низкоуровневого ввода-вывода.
* \author Vitaly Lipatov
* \date $Date: 2005/11/01 21:44:53 $
* \version $Id: DigitalCard.h,v 1.4 2005/11/01 21:44:53 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef DIGITALCARD_H__
...
...
include/IOs/DigitalCard_O5600.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Заголовочный файл для дискретной карты DIO5600
* \author Vitaly Lipatov
* \date $Date: 2005/01/28 20:52:53 $
* \version $Id: DigitalCard_O5600.h,v 1.3 2005/01/28 20:52:53 vitlav Exp $
*/
// --------------------------------------------------------------------------
#ifndef __DIO5600_H_
...
...
include/IOs/IOAccess.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Заголовочный файл для организации низкоуровневого ввода-вывода.
* \author Vitaly Lipatov
* \date $Date: 2006/12/21 14:47:42 $
* \version $Id: IOAccess.h,v 1.5 2006/12/21 14:47:42 vpashka Exp $
* \par
* Этот файл предназначен для внутреннего использования в классах
* ввода-вывода
...
...
@@ -39,8 +37,6 @@
/*! \class IOAccess
* \brief Предоставление операций для низкоуровневого ввода-вывода.
* \author Vitaly Lipatov
* \date $Date: 2006/12/21 14:47:42 $
* \version $Id: IOAccess.h,v 1.5 2006/12/21 14:47:42 vpashka Exp $
* \par
* Этот класс предназначен для внутреннего использования в классах
* ввода-вывода
...
...
include/IOs/IOAccessOld.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Предоставление операций для низкоуровневого ввода-вывода.
* \author Vitaly Lipatov
* \date $Date: 2006/12/19 15:46:14 $
* \version $Id: IOAccessOld.h,v 1.4 2006/12/19 15:46:14 vpashka Exp $
*/
// --------------------------------------------------------------------------
#include <unistd.h>
...
...
include/ISRestorer.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Интерфейс к объекту сохраняющему список заказчиков и сообщений для InfoServer-а
* \author Pavel Vainerman
* \version $Id: ISRestorer.h,v 1.9 2008/12/14 21:57:51 vpashka Exp $
* \date $Date: 2008/12/14 21:57:51 $
*/
// --------------------------------------------------------------------------
#ifndef ISRestorer_H_
...
...
@@ -58,8 +56,6 @@ class ISRestorer
/*!
* \brief Реализация сохранения списка заказчиков в xml.
* \author Pavel Vainerman
* \version $Id: ISRestorer.h,v 1.9 2008/12/14 21:57:51 vpashka Exp $
* \date $Date: 2008/12/14 21:57:51 $
*
Реализует сохранение списка заказчиков в xml-файле.
\sa ISRestorer
...
...
include/InfoServer.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/01/06 00:03:34 $
* \version $Id: InfoServer.h,v 1.11 2007/01/06 00:03:34 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef InfoServer_H_
...
...
include/LT_Object.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2006/12/20 10:39:01 $
* \version $Id: LT_Object.h,v 1.5 2006/12/20 10:39:01 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef Object_LT_H_
...
...
include/MessageInterface.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Класс работы с сообщениями
* \author Pavel Vainerman
* \date $Date: 2006/12/22 13:37:48 $
* \version $Id: MessageInterface.h,v 1.7 2006/12/22 13:37:48 vpashka Exp $
*
* Получение сообщения по id
*/
...
...
include/MessageInterface_XML.h
View file @
e2cbe9cd
...
...
@@ -20,9 +20,6 @@
/*! \file
* \brief Реализация интерфейса работы с сообщениями на основе XML
* \author Pavel Vainerman
* \date $Date: 2008/11/22 23:22:24 $
* \version $Id: MessageInterface_XML.h,v 1.7 2008/11/22 23:22:24 vpashka Exp $
*
*/
// --------------------------------------------------------------------------
#ifndef __MESSAGEINTERFACE_XML_H__
...
...
include/MessageInterface_idXML.h
View file @
e2cbe9cd
/*! \file
* \brief Класс работы с сообщениями
* \author Pavel Vainerman
* \date $Date: 2008/11/22 23:22:24 $
* \version $Id: MessageInterface_idXML.h,v 1.5 2008/11/22 23:22:24 vpashka Exp $
*/
/**************************************************************************/
#ifndef MessageInterface_idXML_H_
...
...
include/MessageType.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Базовые типы сообщений
* \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
* \version $Id: MessageType.h,v 1.14 2008/12/14 21:57:51 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef MessageType_H_
...
...
include/Mutex.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
* \version $Id: Mutex.h,v 1.14 2007/11/18 19:13:35 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef UniSet_MUTEX_H_
...
...
@@ -75,8 +73,6 @@ namespace UniSetTypes
/*! \class uniset_mutex_lock
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
* \version $Id: Mutex.h,v 1.14 2007/11/18 19:13:35 vpashka Exp $
*
* Предназначен для блокирования совместного доступа. Как пользоваться см. \ref MutexHowToPage
* \note Если ресурс уже занят, то lock ждет его освобождения...
...
...
include/NCRestorer.h
View file @
e2cbe9cd
...
...
@@ -20,7 +20,7 @@
/*! \file
* \brief Интерфейс к объекту сохраняющему список заказчиков для NotifyController-ов
* \author Pavel Vainerman
*/
*/
// --------------------------------------------------------------------------
#ifndef NCRestorer_H_
#define NCRestorer_H_
...
...
include/ORepHelpers.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \version $Id: ORepHelpers.h,v 1.9 2007/11/18 19:13:35 vpashka Exp $
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#ifndef ORepHelpers_H_
...
...
include/ObjectIndex.h
View file @
e2cbe9cd
...
...
@@ -18,8 +18,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \version $Id: ObjectIndex.h,v 1.11 2008/11/22 23:22:24 vpashka Exp $
* \date $Date: 2008/11/22 23:22:24 $
*/
// --------------------------------------------------------------------------
#ifndef ObjcetIndex_H_
...
...
include/ObjectIndex_Array.h
View file @
e2cbe9cd
...
...
@@ -18,8 +18,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \version $Id: ObjectIndex_Array.h,v 1.6 2008/11/22 23:22:24 vpashka Exp $
* \date $Date: 2008/11/22 23:22:24 $
*/
// --------------------------------------------------------------------------
#ifndef ObjectIndex_Array_H_
...
...
include/ObjectIndex_XML.h
View file @
e2cbe9cd
...
...
@@ -18,8 +18,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \version $Id: ObjectIndex_XML.h,v 1.8 2008/11/22 23:22:24 vpashka Exp $
* \date $Date: 2008/11/22 23:22:24 $
*/
// --------------------------------------------------------------------------
#ifndef ObjectIndex_XML_H_
...
...
include/ObjectIndex_idXML.h
View file @
e2cbe9cd
// $Id: ObjectIndex_idXML.h,v 1.6 2008/11/22 23:22:24 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef ObjectIndex_idXML_H_
#define ObjectIndex_idXML_H_
...
...
include/ObjectRepository.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Интерфейсный класс для работы с репозитарием объектов
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
* \version $Id: ObjectRepository.h,v 1.9 2007/11/18 19:13:35 vpashka Exp $ *
*/
// --------------------------------------------------------------------------
#ifndef ObjectRepository_H_
...
...
include/ObjectRepositoryFactory.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Интерфейсный класс для создания структуры репозитария объектов
* \author Pavel Vainerman
* \version $Id: ObjectRepositoryFactory.h,v 1.8 2007/07/07 18:58:42 vpashka Exp $
* \date $Date: 2007/07/07 18:58:42 $
*/
// --------------------------------------------------------------------------
#ifndef ObjectRepositoryFactory_H_
...
...
include/ObjectsActivator.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Активатор объектов
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: ObjectsActivator.h,v 1.13 2007/06/17 21:30:55 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef ObjectsActivator_H_
...
...
include/ObjectsManager.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Реализация интерфейса менеджера объектов.
* \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
* \version $Id: ObjectsManager.h,v 1.13 2009/01/16 23:16:42 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef ObjectsManager_H_
...
...
include/ObjectsManager_LT.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/07/31 18:13:40 $
* \version $Id: ObjectsManager_LT.h,v 1.4 2007/07/31 18:13:40 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef ObjectsManager_LT_H_
...
...
include/OmniThreadCreator.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Создатель потоков
* \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:21 $
* \version $Id: OmniThreadCreator.h,v 1.5 2005/01/28 20:52:21 vitlav Exp $
*/
// --------------------------------------------------------------------------
#ifndef OmniThreadCreator_h_
...
...
include/PassiveObject.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
* \version $Id: PassiveObject.h,v 1.9 2008/11/29 21:24:25 vpashka Exp $
*/
// -------------------------------------------------------------------------
#ifndef PassiveObject_H_
...
...
include/PassiveTimer.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
*/
//----------------------------------------------------------------------------
# ifndef PASSIVETIMER_H_
...
...
@@ -36,8 +34,6 @@
/*! \class UniSetTimer
* \brief Базовый интерфейс пасивных таймеров
* \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
*/
class
UniSetTimer
{
...
...
@@ -78,8 +74,6 @@ class UniSetTimer
/*! \class PassiveTimer
* \brief Пассивный таймер
* \author Vitaly Lipatov
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
* \par
* Установив таймер в конструкторе или с помощью setTiming,
* можно с помощью checkTime проверять, не наступило ли нужное время
...
...
@@ -125,8 +119,6 @@ class omni_condition;
/*! \class ThrPassiveTimer
* \brief Пассивный таймер с режимом засыпания (ожидания)
* \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
* \par
* Позволяет заснуть на заданное время wait(timeout_t timeMS).
* Механизм работает на основе взаимных блокировок потоков (mutex и condition).
...
...
@@ -154,8 +146,6 @@ class ThrPassiveTimer:
/*! \class PassiveSysTimer
* \brief Пассивный таймер с режимом засыпания (ожидания)
* \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:27 $
* \version $Id: PassiveTimer.h,v 1.9 2007/08/02 22:52:27 vpashka Exp $
* \par
* Создан на основе сигнала (SIGALRM).
*/
...
...
include/PosixThread.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Интефес для создания и управления потоками
* \author Anthony Korbin
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: PosixThread.h,v 1.7 2007/06/17 21:30:55 vpashka Exp $
*/
//----------------------------------------------------------------------------
#ifndef PosixThread_h_
...
...
include/ProxyManager.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2006/12/20 10:39:01 $
* \version $Id: ProxyManager.h,v 1.6 2006/12/20 10:39:01 vpashka Exp $
*/
// --------------------------------------------------------------------------
#ifndef ProxyManager_H_
...
...
include/Pulse.h
View file @
e2cbe9cd
// --------------------------------------------------------------------------
//! \version $Id: Pulse.h,v 1.1 2008/12/14 21:57:51 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef Pulse_H_
#define Pulse_H_
// --------------------------------------------------------------------------
...
...
include/RepositoryAgent.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Реализация RepositoryAgent
* \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:21 $
* \version $Id: RepositoryAgent.h,v 1.5 2005/01/28 20:52:21 vitlav Exp $
*/
// --------------------------------------------------------------------------
#ifndef RepositoryAgent_H_
...
...
include/Restorer.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Интерфейс к объекту сохраняющему список заказчиков и сообщений для InfoServer-а
* \author Pavel Vainerman
* \version $Id: Restorer.h,v 1.4 2007/11/18 19:13:35 vpashka Exp $
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#ifndef Restorer_H_
...
...
include/RunLock.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Блокировка повторного запуска программы
* \author Ahton Korbin, Pavel Vainerman
* \date $Date: 2006/12/20 10:39:01 $
* \version $Id: RunLock.h,v 1.6 2006/12/20 10:39:01 vpashka Exp $
*/
// ---------------------------------------------------------------------------
#ifndef RunLock_H_
...
...
include/SMonitor.h
View file @
e2cbe9cd
// $Id: SMonitor.h,v 1.2 2007/12/17 22:51:00 vpashka Exp $
// ------------------------------------------------------------------------------------------
#ifndef SMonitor_H_
#define SMonitor_H_
// ------------------------------------------------------------------------------------------
...
...
include/SViewer.h
View file @
e2cbe9cd
...
...
@@ -20,9 +20,6 @@
/*! \file
* \brief Программа просмотра состояния датчиков
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: SViewer.h,v 1.11 2007/06/17 21:30:55 vpashka Exp $
* \par
*/
//--------------------------------------------------------------------------------
#ifndef _SVIEWER_H
...
...
include/SandClock.h
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
// idea: lav@etersoft.ru
// realisation: pv@etersoft.ru, lav@etersoft.ru
//! \version $Id: SandClock.h,v 1.1 2008/10/05 19:00:53 vpashka Exp $
// --------------------------------------------------------------------------
#ifndef SandClock_H_
#define SandClock_H_
...
...
include/StorageInterface.h
View file @
e2cbe9cd
...
...
@@ -19,11 +19,8 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \version $Id: StorageInterface.h,v 1.2 2006/12/20 10:39:01 vpashka Exp $
* \date $Date: 2006/12/20 10:39:01 $
*/
// --------------------------------------------------------------------------
#ifndef StorageInterface_H_
#define StorageInterface_H_
// ---------------------------------------------------------------------------
...
...
include/Storages.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
* \version $Id: Jrn.h,v 1.0 2009/07/15 15:55:00 vpashka Exp $
*/
// --------------------------------------------------------------------------
...
...
include/SystemGuard.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Реализация SystemGuard
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:55 $
* \version $Id: SystemGuard.h,v 1.9 2007/06/17 21:30:55 vpashka Exp $
*/
//--------------------------------------------------------------------------------
#ifndef SystemGuard_H_
...
...
include/TextDBIndex.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2007/01/02 22:30:48 $
* \version $Id: TextDBIndex.h,v 1.6 2007/01/02 22:30:48 vpashka Exp $
* \par
* Базовый класс получения строки по её индексу
*/
...
...
include/TextFileIndex.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2007/01/02 22:30:48 $
* \version $Id: TextFileIndex.h,v 1.7 2007/01/02 22:30:48 vpashka Exp $
* \par
* Базовый класс получения строки по её индексу
*/
...
...
include/TextIndex.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2007/01/02 22:30:48 $
* \version $Id: TextIndex.h,v 1.6 2007/01/02 22:30:48 vpashka Exp $
* \par
* Базовый класс получения строки по её индексу
*/
...
...
include/ThreadCreator.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Создатель потоков
* \author Pavel Vainerman
* \date $Date: 2005/01/28 20:52:21 $
* \version $Id: ThreadCreator.h,v 1.5 2005/01/28 20:52:21 vitlav Exp $
*/
//--------------------------------------------------------------------------------
#ifndef ThreadCreator_h_
...
...
include/TimerService.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Реализация TimerService
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:56 $
* \version $Id: TimerService.h,v 1.7 2007/06/17 21:30:56 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef TimerService_H_
...
...
include/Trigger.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Триггер, позволяющий красиво засекать изменения во флаге
* \author Vitaly Lipatov
* \date $Date: 2006/11/18 14:53:58 $
* \version $Id: Trigger.h,v 1.1 2006/11/18 14:53:58 vpashka Exp $
*/
//--------------------------------------------------------------------------
#ifndef UNITRIGGER_H_
...
...
include/TriggerAND.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief
* \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerAND.h,v 1.7 2008/06/01 21:36:19 vpashka Exp $
*/
// --------------------------------------------------------------------------
//---------------------------------------------------------------------------
...
...
include/TriggerAND_template.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerAND_template.h,v 1.8 2008/06/01 21:36:19 vpashka Exp $
*/
// --------------------------------------------------------------------------
#include "TriggerAND.h"
...
...
include/TriggerOR.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOR.h,v 1.7 2008/06/01 21:36:19 vpashka Exp $
*/
// --------------------------------------------------------------------------
//---------------------------------------------------------------------------
...
...
include/TriggerOR_template.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOR_template.h,v 1.8 2008/06/01 21:36:19 vpashka Exp $
*/
// --------------------------------------------------------------------------
#include "TriggerOR.h"
...
...
include/TriggerOutput.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOutput.h,v 1.7 2008/06/01 21:36:19 vpashka Exp $
*/
// --------------------------------------------------------------------------
//---------------------------------------------------------------------------
...
...
include/TriggerOutput_template.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/06/01 21:36:19 $
* \version $Id: TriggerOutput_template.h,v 1.4 2008/06/01 21:36:19 vpashka Exp $
*/
// --------------------------------------------------------------------------
...
...
include/UniSetObject.h
View file @
e2cbe9cd
...
...
@@ -21,8 +21,6 @@
* \brief Реализация базового(фундаментального) класса для объектов системы
* (процессов управления, элементов графического интерфейса и т.п.)
* \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
* \version $Id: UniSetObject.h,v 1.19 2009/01/16 23:16:42 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef UniSetObject_H_
...
...
include/UniSetObject_LT.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/07/31 18:13:40 $
* \version $Id: UniSetObject_LT.h,v 1.5 2007/07/31 18:13:40 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef UniSetObject_LT_H_
...
...
include/UniSetObserver.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Базовый класс для реализации шаблона "наблюдатель"
* \author Pavel Vainerman
* \date $Date: 2006/12/20 10:39:04 $
* \version $Id: UniSetObserver.h,v 1.3 2006/12/20 10:39:04 vpashka Exp $
*/
//---------------------------------------------------------------------------
#ifndef UniSetObserver_H_
...
...
include/UniSetTypes.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
* \version $Id: UniSetTypes.h,v 1.12 2009/01/16 23:16:42 vpashka Exp $
* \brief базовые типы библиотеки UniSet
*/
// --------------------------------------------------------------------------
...
...
include/UniXML.h
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2006/12/20 10:39:04 $
* \version $Id: UniXML.h,v 1.9 2006/12/20 10:39:04 vpashka Exp $
* \par
* \bug НЕ РАБОТАЕТ функция findNode. (не ищет по полю name, если задать)
...
...
include/UniversalInterface.h
View file @
e2cbe9cd
...
...
@@ -20,8 +20,6 @@
/*! \file
* \brief Универсальный интерфейс для взаимодействия с объектами системы
* \author Pavel Vainerman
* \version $Id: UniversalInterface.h,v 1.24 2008/12/14 21:57:51 vpashka Exp $
* \date $Date: 2008/12/14 21:57:51 $
*/
// --------------------------------------------------------------------------
#ifndef UniversalInterface_H_
...
...
include/WDTInterface.h
View file @
e2cbe9cd
/* $Id: WDTInterface.h,v 1.1 2008/12/14 21:57:51 vpashka Exp $ */
//--------------------------------------------------------------------------
#ifndef WDTInterface_H_
#define WDTInterface_H_
...
...
include/modbus/ModbusClient.h
View file @
e2cbe9cd
/*! $Id: ModbusClient.h,v 1.3 2009/01/11 19:08:46 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusClient_H_
#define ModbusClient_H_
...
...
include/modbus/ModbusHelpers.h
View file @
e2cbe9cd
/*! $Id: ModbusHelpers.h,v 1.1 2009/01/12 20:40:11 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusHelpers_H_
#define ModbusHelpers_H_
...
...
include/modbus/ModbusRTUMaster.h
View file @
e2cbe9cd
/*! $Id: ModbusRTUMaster.h,v 1.3 2009/02/24 20:27:25 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusRTUMaster_H_
#define ModbusRTUMaster_H_
...
...
include/modbus/ModbusRTUSlave.h
View file @
e2cbe9cd
/*! $Id: ModbusRTUSlave.h,v 1.3 2009/02/24 20:27:25 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusRTUSlave_H_
#define ModbusRTUSlave_H_
...
...
include/modbus/ModbusRTUSlaveSlot.h
View file @
e2cbe9cd
/*! $Id: ModbusRTUSlaveSlot.h,v 1.2 2009/02/24 20:27:25 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusRTUSlaveSlot_H_
#define ModbusRTUSlaveSlot_H_
...
...
include/modbus/ModbusServer.h
View file @
e2cbe9cd
/*! $Id: ModbusServer.h,v 1.3 2009/01/11 19:08:46 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusServer_H_
#define ModbusServer_H_
...
...
include/modbus/ModbusServerSlot.h
View file @
e2cbe9cd
/*! $Id: ModbusServerSlot.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusServerSlot_H_
#define ModbusServerSlot_H_
...
...
include/modbus/ModbusTCPCore.h
View file @
e2cbe9cd
/*! $Id: ModbusTCPCore.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusTCPCore_H_
#define ModbusTCPCore_H_
...
...
include/modbus/ModbusTCPMaster.h
View file @
e2cbe9cd
/*! $Id: ModbusTCPMaster.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusTCPMaster_H_
#define ModbusTCPMaster_H_
// -------------------------------------------------------------------------
...
...
include/modbus/ModbusTCPServer.h
View file @
e2cbe9cd
/*! $Id: ModbusTCPServer.h,v 1.2 2008/11/23 22:16:03 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusTCPServer_H_
#define ModbusTCPServer_H_
...
...
include/modbus/ModbusTCPServerSlot.h
View file @
e2cbe9cd
/*! $Id: ModbusTCPServerSlot.h,v 1.1 2008/11/22 23:22:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusTCPServerSlot_H_
#define ModbusTCPServerSlot_H_
...
...
include/modbus/ModbusTypes.h
View file @
e2cbe9cd
/*! $Id: ModbusTypes.h,v 1.11 2008/11/22 23:22:24 vpashka Exp $ */
// -------------------------------------------------------------------------
#ifndef ModbusTypes_H_
#define ModbusTypes_H_
...
...
src/Communications/ComPort.cc
View file @
e2cbe9cd
...
...
@@ -5,7 +5,6 @@
/*! \file
* \brief Обращения к последовательным интерфейсам
* \author Nick Lezzhov, Pavel Veynerman, Vitaly Lipatov
* \date $Date: 2009/02/24 20:27:25 $
*/
/**************************************************************************/
#include <cstdlib>
...
...
src/Communications/Modbus/ModbusTCPMaster.cc
View file @
e2cbe9cd
...
...
@@ -14,7 +14,7 @@ ModbusTCPMaster::ModbusTCPMaster():
tcp
(
0
),
nTransaction
(
0
),
iaddr
(
""
),
force_disconnect
(
fals
e
)
force_disconnect
(
tru
e
)
{
setCRCNoCheckit
(
true
);
}
...
...
@@ -45,34 +45,36 @@ mbErrCode ModbusTCPMaster::sendData( unsigned char* buf, int len )
mbErrCode
ModbusTCPMaster
::
query
(
ModbusAddr
addr
,
ModbusMessage
&
msg
,
ModbusMessage
&
reply
,
timeout_t
timeout
)
{
if
(
iaddr
.
empty
()
)
try
{
dlog
[
Debug
::
WARN
]
<<
"(query): unknown ip address for server..."
<<
endl
;
return
erHardwareError
;
}
if
(
iaddr
.
empty
()
)
{
dlog
[
Debug
::
WARN
]
<<
"(query): unknown ip address for server..."
<<
endl
;
return
erHardwareError
;
}
if
(
!
isConnection
()
)
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
"(ModbusTCPMaster): no connection.. reconnnect..."
<<
endl
;
reconnect
();
}
if
(
!
isConnection
()
)
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
"(ModbusTCPMaster): no connection.. reconnnect..."
<<
endl
;
reconnect
();
}
if
(
!
isConnection
()
)
{
dlog
[
Debug
::
WARN
]
<<
"(query): not connected to server..."
<<
endl
;
return
erTimeOut
;
}
if
(
!
isConnection
()
)
{
dlog
[
Debug
::
WARN
]
<<
"(query): not connected to server..."
<<
endl
;
return
erTimeOut
;
}
assert
(
timeout
);
ptTimeout
.
setTiming
(
timeout
);
assert
(
timeout
);
ptTimeout
.
setTiming
(
timeout
);
tcp
->
setTimeout
(
timeout
);
tcp
->
setTimeout
(
timeout
);
// ost::Thread::setException(ost::Thread::throwException);
// ost::tpport_t port;
// cerr << "****** peer: " << tcp->getPeer(&port) << " err: " << tcp->getErrorNumber() << endl;
ost
::
Thread
::
setException
(
ost
::
Thread
::
throwException
);
try
{
if
(
nTransaction
>=
numeric_limits
<
ModbusRTU
::
ModbusData
>::
max
()
)
nTransaction
=
0
;
...
...
@@ -136,6 +138,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
while
(
!
qrecv
.
empty
()
)
qrecv
.
pop
();
tcp
->
sync
();
if
(
tcp
->
isPending
(
ost
::
Socket
::
pendingInput
,
timeout
)
)
{
/*
...
...
@@ -158,9 +161,14 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if
(
ret
<
(
int
)
sizeof
(
rmh
)
)
{
ost
::
tpport_t
port
;
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
"(ModbusTCPMaster::query): ret="
<<
(
int
)
ret
<<
" < rmh="
<<
(
int
)
sizeof
(
rmh
)
<<
endl
;
<<
" < rmh="
<<
(
int
)
sizeof
(
rmh
)
<<
" err: "
<<
tcp
->
getErrorNumber
()
<<
" perr: "
<<
tcp
->
getPeer
(
&
port
)
<<
endl
;
disconnect
();
return
erTimeOut
;
// return erHardwareError;
}
...
...
@@ -211,17 +219,18 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
{
dlog
[
Debug
::
WARN
]
<<
"(query): "
<<
ex
<<
endl
;
}
catch
(
SystemError
&
err
)
catch
(
SystemError
&
err
)
{
dlog
[
Debug
::
WARN
]
<<
"(query): "
<<
err
<<
endl
;
}
catch
(
Exception
&
ex
)
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
WARN
]
<<
"(query): "
<<
ex
<<
endl
;
}
catch
(
ost
::
SockException
&
e
)
{
dlog
[
Debug
::
WARN
]
<<
e
.
getString
()
<<
": "
<<
e
.
getSystemErrorString
()
<<
endl
;
dlog
[
Debug
::
WARN
]
<<
"(query): tcp error: "
<<
e
.
getString
()
<<
endl
;
return
erTimeOut
;
}
catch
(...)
{
...
...
@@ -252,19 +261,42 @@ void ModbusTCPMaster::reconnect()
// cerr << "tcp diconnect..." << endl;
tcp
->
disconnect
();
delete
tcp
;
tcp
=
0
;
}
ost
::
Thread
::
setException
(
ost
::
Thread
::
throwException
);
// cerr << "create new tcp..." << endl;
tcp
=
new
ost
::
TCPStream
(
iaddr
.
c_str
());
tcp
->
setTimeout
(
500
);
try
{
// TCPStream (const char *name, Family family=IPV4, unsigned mss=536, bool throwflag=false, timeout_t timer=0)
tcp
=
new
ost
::
TCPStream
(
iaddr
.
c_str
(),
ost
::
Socket
::
IPV4
,
536
,
true
,
500
);
tcp
->
setTimeout
(
replyTimeOut_ms
);
}
catch
(
ost
::
Socket
*
socket
)
{
ost
::
tpport_t
port
;
int
err
=
socket
->
getErrorNumber
();
ost
::
InetAddress
saddr
=
(
ost
::
InetAddress
)
socket
->
getPeer
(
&
port
);
dlog
[
Debug
::
CRIT
]
<<
"tcp error "
<<
saddr
.
getHostname
()
<<
":"
<<
port
<<
" = "
<<
err
<<
endl
;
}
catch
(
ost
::
SockException
&
e
)
{
dlog
[
Debug
::
CRIT
]
<<
"tcp error: "
<<
e
.
getString
()
<<
endl
;
}
catch
(...)
{
dlog
[
Debug
::
CRIT
]
<<
"create TCPStream["
<<
iaddr
<<
"] error..."
<<
endl
;
}
}
// -------------------------------------------------------------------------
void
ModbusTCPMaster
::
connect
(
ost
::
InetAddress
addr
,
int
port
)
{
if
(
tcp
)
{
disconnect
();
delete
tcp
;
tcp
=
0
;
}
// if( !tcp )
// {
...
...
@@ -275,9 +307,26 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
dlog
[
Debug
::
INFO
]
<<
"(ModbusTCPMaster): connect to "
<<
s
.
str
()
<<
endl
;
iaddr
=
s
.
str
();
tcp
=
new
ost
::
TCPStream
(
iaddr
.
c_str
());
tcp
->
setTimeout
(
500
);
try
{
tcp
=
new
ost
::
TCPStream
(
iaddr
.
c_str
());
tcp
->
setTimeout
(
replyTimeOut_ms
);
}
catch
(
ost
::
Socket
*
socket
)
{
ost
::
tpport_t
port
;
int
err
=
socket
->
getErrorNumber
();
ost
::
InetAddress
saddr
=
(
ost
::
InetAddress
)
socket
->
getPeer
(
&
port
);
dlog
[
Debug
::
CRIT
]
<<
": tcp error "
<<
saddr
.
getHostname
()
<<
":"
<<
port
<<
" = "
<<
err
<<
endl
;
}
catch
(
ost
::
SockException
&
e
)
{
dlog
[
Debug
::
CRIT
]
<<
"tcp error: "
<<
e
.
getString
()
<<
endl
;
}
catch
(...)
{
dlog
[
Debug
::
CRIT
]
<<
"create TCPStream["
<<
iaddr
<<
"] error..."
<<
endl
;
}
// }
}
// -------------------------------------------------------------------------
...
...
src/IOs/DigitalCard_O5600.cc
View file @
e2cbe9cd
...
...
@@ -5,9 +5,6 @@
/*! \file
* \brief Класс для дискретной карты O5600
* \author Vitaly Lipatov
* \date $Date: 2006/12/19 15:46:14 $
*
*
*/
/**************************************************************************/
...
...
src/Interfaces/UniversalInterface.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
*/
// --------------------------------------------------------------------------
#include <omniORB4/CORBA.h>
...
...
src/ObjectRepository/ORepHelpers.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#include <omniORB4/CORBA.h>
...
...
src/ObjectRepository/ObjectRepository.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/27 21:54:19 $
*/
// --------------------------------------------------------------------------
#include <omniORB4/CORBA.h>
...
...
src/ObjectRepository/ObjectRepositoryFactory.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#include <omniORB4/CORBA.h>
...
...
src/ObjectRepository/ObjectsActivator.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
*/
// --------------------------------------------------------------------------
...
...
src/ObjectRepository/ObjectsManager.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2009/02/10 20:38:27 $
*/
// --------------------------------------------------------------------------
#include <cstdlib>
...
...
src/ObjectRepository/ObjectsManager_LT.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:07:41 $
*/
// --------------------------------------------------------------------------
#include "Exceptions.h"
...
...
src/ObjectRepository/PassiveObject.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/02/21 19:59:57 $
*/
// --------------------------------------------------------------------------
...
...
src/ObjectRepository/ProxyManager.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
src/ObjectRepository/UniSetObject.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/29 22:19:54 $
*/
// --------------------------------------------------------------------------
#include <unistd.h>
...
...
src/ObjectRepository/UniSetObject_LT.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:07:41 $
*/
// --------------------------------------------------------------------------
#include "Exceptions.h"
...
...
src/ObjectRepository/UniSetTypes.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// ----------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2009/01/16 23:16:42 $
*/
// -----------------------------------------------------------------------------
#include <cmath>
...
...
src/Processes/IOController.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2009/02/07 13:25:59 $
*/
// --------------------------------------------------------------------------
//#include <stream.h>
...
...
src/Processes/IONotifyController.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/11/29 21:24:25 $
*/
// --------------------------------------------------------------------------
...
...
src/Processes/IONotifyController_LT.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:09:33 $
*/
// --------------------------------------------------------------------------
#include "Exceptions.h"
...
...
src/Processes/UniSetObserver.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:09:33 $
*/
// --------------------------------------------------------------------------
...
...
src/Services/DBServer.cc
View file @
e2cbe9cd
...
...
@@ -20,7 +20,6 @@
/*! \file
* \brief файл реализации DB-сервера
* \author Pavel Vainerman
* \date $Date: 2006/12/20 13:43:41 $
*/
// --------------------------------------------------------------------------
...
...
src/Services/InfoServer.cc
View file @
e2cbe9cd
...
...
@@ -20,7 +20,6 @@
/*! \file
* \brief файл реализации Info-сервера
* \author Pavel Vainerman
* \date $Date: 2007/01/17 23:33:41 $
*/
// --------------------------------------------------------------------------
#include <string>
...
...
src/Services/RepositoryAgent.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:10:33 $
*/
// --------------------------------------------------------------------------
...
...
src/Services/TimerService.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:58 $
*/
// --------------------------------------------------------------------------
#include <unistd.h>
...
...
src/Threads/PosixThread.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Anthony Korbin
* \date $Date: 2005/10/06 21:47:42 $
*/
// --------------------------------------------------------------------------
#include "PosixThread.h"
...
...
src/Timers/PassiveSysTimer.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:12:49 $
*/
// --------------------------------------------------------------------------
...
...
src/Timers/PassiveTimer.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/29 22:19:54 $
*/
// --------------------------------------------------------------------------
#include <time.h>
...
...
src/Timers/ThrPassiveTimer.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/08/02 22:52:28 $
*/
// --------------------------------------------------------------------------
...
...
src/Timers/WaitingPassiveTimer.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/01/28 21:12:49 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/Configuration.cc
View file @
e2cbe9cd
...
...
@@ -20,7 +20,6 @@
/*! \file
* \brief Класс работы с конфигурацией
* \author Vitaly Lipatov, Pavel Vainerman
* \date $Date: 2008/09/16 19:02:46 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/CycleStorage.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/ISRestorer.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2005/07/21 17:41:43 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/ISRestorer_XML.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2008/12/14 21:57:51 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
src/Various/LT_Object.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
src/Various/MessageInterface_idXML.cc
View file @
e2cbe9cd
/*! \file
* \brief Класс работы с сообщениями
* \author Pavel Vainerman
* \date $Date: 2008/11/22 23:22:25 $
*/
/**************************************************************************/
#include <sstream>
...
...
src/Various/MessageType.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/06/17 21:30:58 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/Mutex.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/15 23:53:36 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/NCRestorer.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/12/18 20:24:12 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/NCRestorer_XML.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2009/01/11 19:08:46 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
@@ -444,41 +443,37 @@ bool NCRestorer_XML::getConsumerList( UniXML& xml,xmlNode* node,
bool
NCRestorer_XML
::
getThresholdInfo
(
UniXML
&
xml
,
xmlNode
*
node
,
IONotifyController
::
ThresholdInfoExt
&
ti
)
{
string
sid_name
=
xml
.
getProp
(
node
,
"sid"
);
UniXML_iterator
uit
(
node
);
string
sid_name
=
uit
.
getProp
(
"sid"
);
if
(
!
sid_name
.
empty
()
)
{
ti
.
sid
=
conf
->
getSensorID
(
sid_name
);
if
(
ti
.
sid
==
UniSetTypes
::
DefaultObjectId
)
{
unideb
[
Debug
::
CRIT
]
<<
"(NCRestorer_XML:getThresholdInfo): "
<<
" Неверно указан НАЗВАНИЕ датчика "
<<
sid_name
<<
" Не найден ID для данного дачика
\n
"
<<
flush
;
<<
" Not found ID for "
<<
sid_name
<<
endl
;
}
else
{
UniversalIO
::
IOTypes
iotype
=
conf
->
getIOType
(
sid_name
);
// Пока что IONotifyController поддерживает работу только с 'DI'.
if
(
iotype
!=
UniversalIO
::
DigitalInput
)
{
unideb
[
Debug
::
CRIT
]
<<
"(NCRestorer_XML:getThresholdInfo): "
<<
" Bad iotype for "
<<
sid_name
<<
". iotype must be 'DI'!"
<<
endl
;
return
false
;
}
}
}
UniXML_iterator
uit
(
node
);
ti
.
id
=
uit
.
getIntProp
(
"id"
);
ti
.
lowlimit
=
uit
.
getIntProp
(
"lowlimit"
);
ti
.
hilimit
=
uit
.
getIntProp
(
"hilimit"
);
ti
.
sensibility
=
uit
.
getIntProp
(
"sensibility"
);
ti
.
inverse
=
uit
.
getIntProp
(
"inverse"
);
ti
.
state
=
IONotifyController_i
::
NormalThreshold
;
if
(
ti
.
sid
==
UniSetTypes
::
DefaultObjectId
)
{
string
sid_name
(
uit
.
getProp
(
"sid"
));
if
(
!
sid_name
.
empty
()
)
{
ti
.
sid
=
conf
->
getSensorID
(
sid_name
);
if
(
ti
.
sid
==
UniSetTypes
::
DefaultObjectId
)
{
unideb
[
Debug
::
CRIT
]
<<
"(NCRestorer_XML:getThresholdInfo): "
<<
" Неверно указан НАЗВАНИЕ датчика "
<<
sid_name
<<
" Не найден ID для данного дачика
\n
"
<<
flush
;
}
}
}
return
true
;
}
// ------------------------------------------------------------------------------------------
...
...
src/Various/Restorer_XML.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
src/Various/RunLock.cc
View file @
e2cbe9cd
...
...
@@ -20,7 +20,6 @@
/*! \file
* \brief Блокировка повторного запуска программы
* \author Ahton Korbin<ahtoh>, Pavel Vainerman
* \date $Date: 2006/12/20 13:43:41 $
*/
// --------------------------------------------------------------------------
#include <dirent.h>
...
...
src/Various/SViewer.cc
View file @
e2cbe9cd
...
...
@@ -20,7 +20,6 @@
/*! \file
* \brief Программа просмотра состояния датчиков
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
src/Various/SystemGuard.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Pavel Vainerman
* \date $Date: 2007/11/18 19:13:35 $
*/
// --------------------------------------------------------------------------
#include <sstream>
...
...
src/Various/TableBlockStorage.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/TableStorage.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/
// --------------------------------------------------------------------------
...
...
src/Various/TextFileIndex.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2005/01/28 21:14:18 $
* \par
* Базовый класс получения строки по её индексу
*/
...
...
src/Various/TextIndex.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2005/01/28 21:14:18 $
* \par
* Базовый класс получения строки по её индексу
*/
...
...
src/Various/UniXML.cc
View file @
e2cbe9cd
...
...
@@ -19,8 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \date $Date: 2006/12/20 13:43:41 $
* \par
*/
// --------------------------------------------------------------------------
#include <unistd.h>
...
...
tests/JrnTests/JrnTest.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/
// --------------------------------------------------------------------------
...
...
tests/UniXmlTest/XmlTest.cc
View file @
e2cbe9cd
...
...
@@ -19,7 +19,6 @@
// --------------------------------------------------------------------------
/*! \file
* \author Ivan Donchevskiy
* \date $Date: 2009/07/15 15:55:00 $
*/
// --------------------------------------------------------------------------
#include "stdio.h"
...
...
tests/passivetimer.cc
View file @
e2cbe9cd
...
...
@@ -10,7 +10,7 @@ PassiveTimer pt(1000);
int
main
()
{
PassiveTimer
pt1
(
5000
);
cout
<<
" pt1.getInterval()="
<<
pt1
.
getInterval
()
<<
endl
;
cout
<<
" pt1.getInterval()="
<<
pt1
.
getInterval
()
<<
" TEST: "
<<
((
pt1
.
getInterval
()
==
5000
)
?
"OK"
:
"FAILED"
)
<<
endl
;
PassiveTimer
pt2
;
cout
<<
" pt2.getInterval()="
<<
pt2
.
getInterval
()
<<
endl
;
...
...
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