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
c58f3217
Commit
c58f3217
authored
May 28, 2009
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
new version: add RespondList configuration
parent
46c0b770
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
114 additions
and
37 deletions
+114
-37
test.xml
conf/test.xml
+14
-4
RTUExchange.cc
extentions/RTUExchange/RTUExchange.cc
+80
-29
RTUExchange.h
extentions/RTUExchange/RTUExchange.h
+18
-3
start_fg.sh
extentions/RTUExchange/start_fg.sh
+2
-1
No files found.
conf/test.xml
View file @
c58f3217
...
...
@@ -68,7 +68,13 @@
</MBSlave1>
<RTUExchange
name=
"RTUExchange"
/>
<RTUExchange
name=
"RTUExchange"
>
<RespondList>
<item
addr=
"0x01"
respondSensor=
"RespondRTU_S"
timeout=
"5000"
/>
<item
addr=
"0x02"
respondSensor=
"NoRespondRTU2_S"
timeout=
"5000"
invert=
"1"
/>
</RespondList>
</RTUExchange>
<UDPExchange
name=
"UDPExchange"
/>
<UDPExchange2
name=
"UDPExchange2"
/>
...
...
@@ -92,9 +98,9 @@
<!-- ************************ ********************** -->
<sensors
name=
"Sensors"
>
<item
name=
"Input1_S"
textname=
" 1"
node=
""
iotype=
"DI"
priority=
"Medium"
default=
"1"
/>
<item
name=
"Input2_S"
textname=
" 2"
node=
""
iotype=
"DI"
priority=
"Medium"
mbtype=
"rtu"
mbaddr=
"0x
3
1"
mbfunc=
"0x04"
mbreg=
"0x02"
rs=
"1"
/>
<item
name=
"Input3_S"
textname=
" 3"
node=
""
iotype=
"DI"
priority=
"Medium"
mbtcp=
"1"
mbaddr=
"0x
31
"
mbfunc=
"0x04"
mbreg=
"0x02"
/>
<item
name=
"Input4_S"
textname=
" 4"
node=
""
iotype=
"DI"
priority=
"Medium"
udp=
"1"
/>
<item
name=
"Input2_S"
textname=
" 2"
node=
""
iotype=
"DI"
priority=
"Medium"
mbtype=
"rtu"
mbaddr=
"0x
0
1"
mbfunc=
"0x04"
mbreg=
"0x02"
rs=
"1"
/>
<item
name=
"Input3_S"
textname=
" 3"
node=
""
iotype=
"DI"
priority=
"Medium"
mbtcp=
"1"
mbaddr=
"0x
02
"
mbfunc=
"0x04"
mbreg=
"0x02"
/>
<item
name=
"Input4_S"
textname=
" 4"
node=
""
iotype=
"DI"
priority=
"Medium"
mbtype=
"rtu"
mbaddr=
"0x02"
mbfunc=
"0x04"
mbreg=
"0x02"
rs=
"1"
/>
<item
name=
"Input5_S"
textname=
" 5"
node=
""
iotype=
"DI"
priority=
"Medium"
udp=
"2"
/>
<item
name=
"Input6_S"
textname=
" 6"
node=
""
iotype=
"DI"
priority=
"Medium"
udp=
"2"
>
<depends>
...
...
@@ -112,6 +118,10 @@
</item>
<item
name=
"Threshold1_S"
textname=
""
node=
""
iotype=
"DI"
priority=
"Medium"
/>
<item
name=
"TestMode_S"
textname=
"test"
node=
""
iotype=
"DI"
priority=
"Medium"
/>
<item
name=
"RespondRTU_S"
textname=
"respond rtu"
node=
""
iotype=
"DI"
/>
<item
name=
"NoRespondRTU2_S"
textname=
"no respond rtu"
node=
""
iotype=
"DI"
/>
</sensors>
<thresholds
name=
"thresholds"
>
...
...
extentions/RTUExchange/RTUExchange.cc
View file @
c58f3217
...
...
@@ -32,7 +32,6 @@ activated(false)
if
(
cnode
==
NULL
)
throw
UniSetTypes
::
SystemError
(
"(RTUExchange): Not find conf-node for "
+
myname
);
shm
=
new
SMInterface
(
shmId
,
&
ui
,
objId
,
ic
);
UniXML_iterator
it
(
cnode
);
...
...
@@ -55,14 +54,6 @@ activated(false)
int
recv_timeout
=
atoi
(
conf
->
getArgParam
(
"--rs-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
)).
c_str
());
sidNotRespond
=
conf
->
getSensorID
(
conf
->
getArgParam
(
"--rs-notRespondSensor"
,
it
.
getProp
(
"notRespondSensor"
)));
// string saddr = conf->getArgParam("--rs-my-addr",it.getProp("addr"));
// ModbusRTU::ModbusAddr myaddr = ModbusRTU::str2mbAddr(saddr);
// if( saddr.empty() )
// myaddr = 0x01;
mbregFromID
=
atoi
(
conf
->
getArgParam
(
"--mbs-reg-from-id"
,
it
.
getProp
(
"reg_from_id"
)).
c_str
());
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): mbregFromID="
<<
mbregFromID
<<
endl
;
...
...
@@ -146,9 +137,36 @@ activated(false)
if
(
msec
<=
0
)
msec
=
3000
;
ptTimeout
.
setTiming
(
msec
);
xmlNode
*
respNode
=
conf
->
findNode
(
cnode
,
"RespondList"
);
if
(
respNode
)
{
UniXML_iterator
it1
(
respNode
);
if
(
it1
.
goChildren
()
)
{
for
(;
it1
.
getCurrent
();
it1
.
goNext
()
)
{
RespondInfo
ri
;
ModbusRTU
::
ModbusAddr
a
=
ModbusRTU
::
str2mbAddr
(
it1
.
getProp
(
"addr"
));
ri
.
id
=
conf
->
getSensorID
(
it1
.
getProp
(
"respondSensor"
));
if
(
ri
.
id
==
DefaultObjectId
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
": not found ID for noRespondSensor="
<<
it1
.
getProp
(
"respondSensor"
)
<<
endl
;
continue
;
}
int
tout
=
atoi
(
it1
.
getProp
(
"timeout"
).
c_str
());
if
(
tout
>
0
)
ri
.
ptTimeout
.
setTiming
(
tout
);
else
ri
.
ptTimeout
.
setTiming
(
UniSetTimer
::
WaitUpTime
);
ri
.
invert
=
atoi
(
it1
.
getProp
(
"invert"
).
c_str
());
respMap
[
a
]
=
ri
;
}
}
}
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): rs-timeout="
<<
msec
<<
" msec"
<<
endl
;
}
// -----------------------------------------------------------------------------
RTUExchange
::~
RTUExchange
()
...
...
@@ -308,17 +326,31 @@ void RTUExchange::step()
<<
"(step): (hb) "
<<
ex
<<
std
::
endl
;
}
}
for
(
RespondMap
::
iterator
it
=
respMap
.
begin
();
it
!=
respMap
.
end
();
++
it
)
{
try
{
bool
set
=
it
->
second
.
invert
?
!
it
->
second
.
state
:
it
->
second
.
state
;
shm
->
localSaveState
(
it
->
second
.
dit
,
it
->
second
.
id
,
set
,
getId
());
}
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(step): (respond) "
<<
ex
<<
std
::
endl
;
}
}
}
// -----------------------------------------------------------------------------
void
RTUExchange
::
poll
()
{
bool
respond_ok
=
true
;
for
(
RTUMap
::
iterator
it
=
rtulist
.
begin
();
it
!=
rtulist
.
end
();
++
it
)
{
if
(
!
activated
)
return
;
bool
respOK
=
true
;
try
{
cout
<<
"poll RTU=("
<<
(
int
)
it
->
second
->
getAddress
()
...
...
@@ -334,8 +366,10 @@ void RTUExchange::poll()
catch
(
ModbusRTU
::
mbException
&
ex
)
{
cout
<<
" [ FAILED ] ("
<<
ex
<<
")"
<<
endl
;
resp
ond_ok
=
false
;
resp
OK
=
false
;
}
setRespond
(
it
->
second
->
getAddress
(),
respOK
);
}
for
(
RSMap
::
iterator
it
=
rsmap
.
begin
();
it
!=
rsmap
.
end
();
++
it
)
...
...
@@ -415,11 +449,15 @@ void RTUExchange::poll()
}
}
if
(
it
->
devtype
!=
dtRTU188
)
setRespond
(
it
->
mbaddr
,
true
);
continue
;
}
catch
(
ModbusRTU
::
mbException
&
ex
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(poll): "
<<
ex
<<
endl
;
if
(
it
->
devtype
!=
dtRTU188
)
setRespond
(
it
->
mbaddr
,
false
);
}
catch
(
IOController_i
::
NameNotFound
&
ex
)
{
...
...
@@ -446,21 +484,6 @@ void RTUExchange::poll()
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(poll): catch ..."
<<
endl
;
}
respond_ok
=
false
;
}
if
(
sidNotRespond
!=
DefaultObjectId
)
{
if
(
trTimeout
.
hi
(
!
respond_ok
)
)
ptTimeout
.
reset
();
else
if
(
respond_ok
)
ptTimeout
.
reset
();
if
(
!
respond_ok
&&
ptTimeout
.
checkTime
()
)
shm
->
localSaveState
(
ditNotRespond
,
sidNotRespond
,
true
,
getId
());
else
shm
->
localSaveState
(
ditNotRespond
,
sidNotRespond
,
false
,
getId
());
}
}
// -----------------------------------------------------------------------------
...
...
@@ -1121,7 +1144,12 @@ void RTUExchange::initIterators()
}
shm
->
initAIterator
(
aitHeartBeat
);
shm
->
initDIterator
(
ditNotRespond
);
for
(
RespondMap
::
iterator
it
=
respMap
.
begin
();
it
!=
respMap
.
end
();
++
it
)
{
shm
->
initDIterator
(
it
->
second
.
dit
);
it
->
second
.
ptTimeout
.
reset
();
}
}
// -----------------------------------------------------------------------------
void
RTUExchange
::
help_print
(
int
argc
,
char
*
argv
[]
)
...
...
@@ -1231,3 +1259,26 @@ std::ostream& operator<<( std::ostream& os, RTUExchange::RSProperty& p )
return
os
;
}
// -----------------------------------------------------------------------------
void
RTUExchange
::
setRespond
(
ModbusRTU
::
ModbusAddr
addr
,
bool
respond
)
{
RespondMap
::
iterator
it
=
respMap
.
find
(
addr
);
if
(
it
!=
respMap
.
end
()
)
{
if
(
it
->
second
.
trTimeout
.
change
(
respond
)
)
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(setRespond): ("
<<
(
int
)
addr
<<
")"
<<
ModbusRTU
::
addr2str
(
addr
)
<<
" state="
<<
respond
<<
endl
;
if
(
respond
)
it
->
second
.
state
=
true
;
it
->
second
.
ptTimeout
.
reset
();
}
if
(
it
->
second
.
state
&&
!
respond
&&
it
->
second
.
ptTimeout
.
checkTime
()
)
it
->
second
.
state
=
false
;
}
}
// -----------------------------------------------------------------------------
extentions/RTUExchange/RTUExchange.h
View file @
c58f3217
...
...
@@ -100,6 +100,7 @@ class RTUExchange:
long
pollRTU188
(
RSMap
::
iterator
&
p
);
long
pollMTR
(
RSMap
::
iterator
&
p
);
long
pollRTU
(
RSMap
::
iterator
&
p
);
void
setRespond
(
ModbusRTU
::
ModbusAddr
addr
,
bool
respond
);
virtual
void
processingMessage
(
UniSetTypes
::
VoidMessage
*
msg
);
void
sysCommand
(
UniSetTypes
::
SystemMessage
*
msg
);
...
...
@@ -153,11 +154,25 @@ class RTUExchange:
UniSetTypes
::
ObjectId
test_id
;
UniSetTypes
::
uniset_mutex
pollMutex
;
Trigger
trTimeout
;
struct
RespondInfo
{
RespondInfo
()
:
id
(
UniSetTypes
::
DefaultObjectId
),
state
(
false
),
invert
(
false
)
{}
UniSetTypes
::
ObjectId
id
;
IOController
::
DIOStateList
::
iterator
dit
;
PassiveTimer
ptTimeout
;
UniSetTypes
::
ObjectId
sidNotRespond
;
IOController
::
DIOStateList
::
iterator
ditNotRespond
;
Trigger
trTimeout
;
bool
state
;
bool
invert
;
};
typedef
std
::
map
<
ModbusRTU
::
ModbusAddr
,
RespondInfo
>
RespondMap
;
RespondMap
respMap
;
PassiveTimer
aiTimer
;
int
ai_polltime
;
...
...
extentions/RTUExchange/start_fg.sh
View file @
c58f3217
...
...
@@ -2,6 +2,7 @@
uniset-start.sh
-f
./uniset-rtuexchange
--rs-name
RTUExchange
--confile
test.xml
\
--rs-filter-field
rs
--rs-filter-value
1
\
--rs-dev
/dev/cbside
B
0
--rs-reg-from-id
1
\
--rs-dev
/dev/cbside
A
0
--rs-reg-from-id
1
\
--dlog-add-levels
info,crit,warn
#level3
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