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
1dbfb9f1
Commit
1dbfb9f1
authored
Jun 13, 2009
by
Pavel Vaynerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed bug in ModbusRTU::ForceMultipleCoils function
parent
f47ec246
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
137 additions
and
102 deletions
+137
-102
MBSlave.cc
Utilities/MBTester/MBSlave.cc
+9
-9
mbrtuslave.cc
Utilities/MBTester/mbrtuslave.cc
+3
-2
mbrtutester.cc
Utilities/MBTester/mbrtutester.cc
+1
-1
mbtcptester.cc
Utilities/MBTester/mbtcptester.cc
+1
-1
test.xml
conf/test.xml
+2
-2
RTUExchange.cc
extentions/RTUExchange/RTUExchange.cc
+61
-40
RTUExchange.h
extentions/RTUExchange/RTUExchange.h
+10
-4
start_fg.sh
extentions/RTUExchange/start_fg.sh
+1
-1
ModbusTypes.h
include/modbus/ModbusTypes.h
+16
-15
ModbusTypes.cc
src/Communications/Modbus/ModbusTypes.cc
+33
-27
No files found.
Utilities/MBTester/MBSlave.cc
View file @
1dbfb9f1
...
@@ -17,7 +17,7 @@ MBSlave::MBSlave( ModbusRTU::ModbusAddr addr, const std::string dev, const std::
...
@@ -17,7 +17,7 @@ MBSlave::MBSlave( ModbusRTU::ModbusAddr addr, const std::string dev, const std::
// prev(ModbusRTU::erNoError),
// prev(ModbusRTU::erNoError),
// askCount(0),
// askCount(0),
verbose
(
false
),
verbose
(
false
),
replyVal
(
0
)
replyVal
(
-
1
)
{
{
cout
<<
"$Id: MBSlave.cc,v 1.7 2009/02/24 20:27:24 vpashka Exp $"
<<
endl
;
cout
<<
"$Id: MBSlave.cc,v 1.7 2009/02/24 20:27:24 vpashka Exp $"
<<
endl
;
...
@@ -80,7 +80,7 @@ void MBSlave::execute()
...
@@ -80,7 +80,7 @@ void MBSlave::execute()
{
{
//
//
askCount = askCount>=numeric_limits<long>::max() ? 0 : askCount+1;
askCount = askCount>=numeric_limits<long>::max() ? 0 : askCount+1;
if( res!=ModbusRTU::erNoError )
if( res!=ModbusRTU::erNoError )
errmap[res]++;
errmap[res]++;
prev = res;
prev = res;
...
@@ -115,7 +115,7 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
...
@@ -115,7 +115,7 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
for
(
int
i
=
0
;
i
<
bcnt
;
i
++
)
for
(
int
i
=
0
;
i
<
bcnt
;
i
++
)
{
{
if
(
replyVal
)
if
(
replyVal
!=-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
else
else
reply
.
addData
(
d
);
reply
.
addData
(
d
);
...
@@ -141,7 +141,7 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
...
@@ -141,7 +141,7 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
for
(
int
i
=
0
;
i
<
bcnt
;
i
++
)
for
(
int
i
=
0
;
i
<
bcnt
;
i
++
)
{
{
if
(
replyVal
)
if
(
replyVal
!=-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
else
else
reply
.
addData
(
d
);
reply
.
addData
(
d
);
...
@@ -158,10 +158,10 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
...
@@ -158,10 +158,10 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
if
(
query
.
count
<=
1
)
if
(
query
.
count
<=
1
)
{
{
if
(
replyVal
)
if
(
replyVal
!=-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
else
else
reply
.
addData
(
query
.
start
);
reply
.
addData
(
query
.
start
);
return
ModbusRTU
::
erNoError
;
return
ModbusRTU
::
erNoError
;
}
}
...
@@ -170,7 +170,7 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
...
@@ -170,7 +170,7 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
ModbusData
reg
=
query
.
start
;
ModbusData
reg
=
query
.
start
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
{
if
(
replyVal
)
if
(
replyVal
!=
-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
else
else
reply
.
addData
(
reg
);
reply
.
addData
(
reg
);
...
@@ -195,7 +195,7 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters(
...
@@ -195,7 +195,7 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters(
if
(
query
.
count
<=
1
)
if
(
query
.
count
<=
1
)
{
{
if
(
replyVal
)
if
(
replyVal
!=
-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
else
else
reply
.
addData
(
query
.
start
);
reply
.
addData
(
query
.
start
);
...
@@ -207,7 +207,7 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters(
...
@@ -207,7 +207,7 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters(
ModbusData
reg
=
query
.
start
;
ModbusData
reg
=
query
.
start
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
{
if
(
replyVal
)
if
(
replyVal
!=
-
1
)
reply
.
addData
(
replyVal
);
reply
.
addData
(
replyVal
);
else
else
reply
.
addData
(
reg
);
reply
.
addData
(
reg
);
...
...
Utilities/MBTester/mbrtuslave.cc
View file @
1dbfb9f1
...
@@ -44,7 +44,7 @@ int main( int argc, char **argv )
...
@@ -44,7 +44,7 @@ int main( int argc, char **argv )
int
tout
=
2000
;
int
tout
=
2000
;
DebugStream
dlog
;
DebugStream
dlog
;
int
use485
=
0
;
int
use485
=
0
;
int
replyVal
=
0
;
int
replyVal
=
-
1
;
try
try
{
{
...
@@ -104,7 +104,8 @@ int main( int argc, char **argv )
...
@@ -104,7 +104,8 @@ int main( int argc, char **argv )
MBSlave
mbs
(
myaddr
,
dev
,
speed
,
use485
);
MBSlave
mbs
(
myaddr
,
dev
,
speed
,
use485
);
mbs
.
setLog
(
dlog
);
mbs
.
setLog
(
dlog
);
mbs
.
setVerbose
(
verb
);
mbs
.
setVerbose
(
verb
);
mbs
.
setReply
(
replyVal
);
if
(
replyVal
!=-
1
)
mbs
.
setReply
(
replyVal
);
mbs
.
execute
();
mbs
.
execute
();
}
}
catch
(
ModbusRTU
::
mbException
&
ex
)
catch
(
ModbusRTU
::
mbException
&
ex
)
...
...
Utilities/MBTester/mbrtutester.cc
View file @
1dbfb9f1
...
@@ -458,7 +458,7 @@ int main( int argc, char **argv )
...
@@ -458,7 +458,7 @@ int main( int argc, char **argv )
}
}
ModbusRTU
::
ForceCoilsMessage
msg
(
slaveaddr
,
reg
);
ModbusRTU
::
ForceCoilsMessage
msg
(
slaveaddr
,
reg
);
ModbusRTU
::
DataBits
16
b
(
val
);
ModbusRTU
::
DataBits
b
(
val
);
msg
.
addData
(
b
);
msg
.
addData
(
b
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
.
write0F
(
msg
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
.
write0F
(
msg
);
if
(
verb
)
if
(
verb
)
...
...
Utilities/MBTester/mbtcptester.cc
View file @
1dbfb9f1
...
@@ -338,7 +338,7 @@ int main( int argc, char **argv )
...
@@ -338,7 +338,7 @@ int main( int argc, char **argv )
}
}
ModbusRTU
::
ForceCoilsMessage
msg
(
slaveaddr
,
reg
);
ModbusRTU
::
ForceCoilsMessage
msg
(
slaveaddr
,
reg
);
ModbusRTU
::
DataBits
16
b
(
val
);
ModbusRTU
::
DataBits
b
(
val
);
msg
.
addData
(
b
);
msg
.
addData
(
b
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
.
write0F
(
msg
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
.
write0F
(
msg
);
if
(
verb
)
if
(
verb
)
...
...
conf/test.xml
View file @
1dbfb9f1
...
@@ -50,7 +50,7 @@
...
@@ -50,7 +50,7 @@
<RSExchange
name=
"RSExchange"
>
<RSExchange
name=
"RSExchange"
>
<RespondList>
<RespondList>
<item
addr=
"0x02"
respondSensor=
"RTU_Not_Respond_FS"
timeout=
"
5
000"
invert=
"1"
default=
"1"
/>
<item
addr=
"0x02"
respondSensor=
"RTU_Not_Respond_FS"
timeout=
"
2
000"
invert=
"1"
default=
"1"
/>
</RespondList>
</RespondList>
</RSExchange>
</RSExchange>
</settings>
</settings>
...
@@ -108,7 +108,7 @@
...
@@ -108,7 +108,7 @@
<item
id=
"5"
name=
"HC_in"
textname=
"HC_in"
<item
id=
"5"
name=
"HC_in"
textname=
"HC_in"
iotype=
"DI"
character=
"Info"
iotype=
"DI"
character=
"Info"
rs=
"
2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x302"
mbfunc=
"0x05
"
>
rs=
"
3"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x302"
mbfunc=
"0x04"
vtype=
"F2
"
>
<consumers>
<consumers>
</consumers>
</consumers>
</item>
</item>
...
...
extentions/RTUExchange/RTUExchange.cc
View file @
1dbfb9f1
...
@@ -19,7 +19,8 @@ force_out(false),
...
@@ -19,7 +19,8 @@ force_out(false),
mbregFromID
(
false
),
mbregFromID
(
false
),
activated
(
false
),
activated
(
false
),
rs_pre_clean
(
false
),
rs_pre_clean
(
false
),
noQueryOptimization
(
false
)
noQueryOptimization
(
false
),
allNotRespond
(
false
)
{
{
cout
<<
"$Id: RTUExchange.cc,v 1.4 2009/01/23 23:56:54 vpashka Exp $"
<<
endl
;
cout
<<
"$Id: RTUExchange.cc,v 1.4 2009/01/23 23:56:54 vpashka Exp $"
<<
endl
;
...
@@ -53,7 +54,13 @@ noQueryOptimization(false)
...
@@ -53,7 +54,13 @@ noQueryOptimization(false)
recv_timeout
=
atoi
(
conf
->
getArgParam
(
"--rs-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
)).
c_str
());
recv_timeout
=
atoi
(
conf
->
getArgParam
(
"--rs-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
)).
c_str
());
if
(
recv_timeout
<=
0
)
if
(
recv_timeout
<=
0
)
recv_timeout
=
100
;
recv_timeout
=
50
;
int
alltout
=
atoi
(
conf
->
getArgParam
(
"--rs-all-timeout"
,
it
.
getProp
(
"all_timeout"
)).
c_str
());
if
(
alltout
<=
0
)
alltout
=
2000
;
ptAllNotRespond
.
setTiming
(
alltout
);
rs_pre_clean
=
atoi
(
conf
->
getArgParam
(
"--rs-pre-clean"
,
it
.
getProp
(
"pre_clean"
)).
c_str
());
rs_pre_clean
=
atoi
(
conf
->
getArgParam
(
"--rs-pre-clean"
,
it
.
getProp
(
"pre_clean"
)).
c_str
());
noQueryOptimization
=
atoi
(
conf
->
getArgParam
(
"--rs-no-query-optimization"
,
it
.
getProp
(
"no_query_optimization"
)).
c_str
());
noQueryOptimization
=
atoi
(
conf
->
getArgParam
(
"--rs-no-query-optimization"
,
it
.
getProp
(
"no_query_optimization"
)).
c_str
());
...
@@ -76,6 +83,7 @@ noQueryOptimization(false)
...
@@ -76,6 +83,7 @@ noQueryOptimization(false)
{
{
readConfiguration
();
readConfiguration
();
rtuQueryOptimization
(
rmap
);
rtuQueryOptimization
(
rmap
);
initRespondList
();
}
}
else
else
ic
->
addReadItem
(
sigc
::
mem_fun
(
this
,
&
RTUExchange
::
readItem
)
);
ic
->
addReadItem
(
sigc
::
mem_fun
(
this
,
&
RTUExchange
::
readItem
)
);
...
@@ -122,7 +130,7 @@ noQueryOptimization(false)
...
@@ -122,7 +130,7 @@ noQueryOptimization(false)
if
(
activateTimeout
<=
0
)
if
(
activateTimeout
<=
0
)
activateTimeout
=
20000
;
activateTimeout
=
20000
;
initMB
();
initMB
(
false
);
printMap
(
rmap
);
printMap
(
rmap
);
// abort();
// abort();
...
@@ -149,18 +157,27 @@ RTUExchange::~RTUExchange()
...
@@ -149,18 +157,27 @@ RTUExchange::~RTUExchange()
delete
shm
;
delete
shm
;
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
RTUExchange
::
initMB
()
void
RTUExchange
::
initMB
(
bool
reopen
)
{
{
if
(
!
file_exist
(
devname
)
)
if
(
!
file_exist
(
devname
)
)
{
{
if
(
mb
)
if
(
mb
)
{
{
delete
mb
;
delete
mb
;
mb
=
0
;
mb
=
0
;
}
}
return
;
return
;
}
}
if
(
mb
)
{
if
(
!
reopen
)
return
;
delete
mb
;
mb
=
0
;
}
try
try
{
{
mb
=
new
ModbusRTUMaster
(
devname
);
mb
=
new
ModbusRTUMaster
(
devname
);
...
@@ -235,9 +252,18 @@ void RTUExchange::step()
...
@@ -235,9 +252,18 @@ void RTUExchange::step()
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
RTUExchange
::
poll
()
void
RTUExchange
::
poll
()
{
{
if
(
trAllNotRespond
.
hi
(
allNotRespond
)
)
ptAllNotRespond
.
reset
();
if
(
allNotRespond
&&
mb
&&
ptAllNotRespond
.
checkTime
()
)
{
ptAllNotRespond
.
reset
();
initMB
(
true
);
}
if
(
!
mb
)
if
(
!
mb
)
{
{
initMB
();
initMB
(
false
);
if
(
!
mb
)
if
(
!
mb
)
{
{
for
(
RTUExchange
::
RTUDeviceMap
::
iterator
it
=
rmap
.
begin
();
it
!=
rmap
.
end
();
++
it
)
for
(
RTUExchange
::
RTUDeviceMap
::
iterator
it
=
rmap
.
begin
();
it
!=
rmap
.
end
();
++
it
)
...
@@ -286,6 +312,7 @@ void RTUExchange::poll()
...
@@ -286,6 +312,7 @@ void RTUExchange::poll()
}
}
else
else
{
{
d
->
resp_real
=
false
;
for
(
RTUExchange
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
for
(
RTUExchange
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
{
{
try
try
...
@@ -303,8 +330,9 @@ void RTUExchange::poll()
...
@@ -303,8 +330,9 @@ void RTUExchange::poll()
if
(
d
->
resp_real
)
if
(
d
->
resp_real
)
{
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(poll): FAILED ask addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(poll): FAILED ask addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
<<
"reg="
<<
ModbusRTU
::
dat2str
(
it
->
second
->
mbreg
)
<<
" -> "
<<
ex
<<
endl
;
<<
" -> "
<<
ex
<<
endl
;
d
->
resp_real
=
false
;
//
d->resp_real = false;
}
}
}
}
...
@@ -383,11 +411,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -383,11 +411,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
{
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
{
// cerr << "(read02): save mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " val=" << (int)(b[k]) << endl;
it
->
second
->
mbval
=
b
[
k
];
it
->
second
->
mbval
=
b
[
k
];
}
}
}
it
--
;
it
--
;
}
}
...
@@ -401,11 +425,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -401,11 +425,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
{
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
{
// cerr << "(read01): save mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " val=" << (int)(b[k]) << endl;
it
->
second
->
mbval
=
b
[
k
]
?
1
:
0
;
it
->
second
->
mbval
=
b
[
k
]
?
1
:
0
;
}
}
}
it
--
;
it
--
;
}
}
...
@@ -449,14 +469,8 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -449,14 +469,8 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnForceMultipleCoils
:
case
ModbusRTU
:
:
fnForceMultipleCoils
:
{
{
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
);
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
)
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
{
msg
.
addBit
(
it
->
second
->
mbval
?
true
:
false
);
ModbusRTU
::
DataBits16
d
;
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerData
&&
i
<
p
->
q_count
;
k
++
,
i
++
,
it
++
)
d
.
set
(
k
,
(
it
->
second
->
mbval
?
true
:
false
)
);
msg
.
addData
(
d
);
}
it
--
;
it
--
;
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
->
write0F
(
msg
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
->
write0F
(
msg
);
...
@@ -495,16 +509,20 @@ bool RTUExchange::RTUDevice::checkRespond()
...
@@ -495,16 +509,20 @@ bool RTUExchange::RTUDevice::checkRespond()
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
RTUExchange
::
updateSM
()
void
RTUExchange
::
updateSM
()
{
{
allNotRespond
=
true
;
for
(
RTUExchange
::
RTUDeviceMap
::
iterator
it1
=
rmap
.
begin
();
it1
!=
rmap
.
end
();
++
it1
)
for
(
RTUExchange
::
RTUDeviceMap
::
iterator
it1
=
rmap
.
begin
();
it1
!=
rmap
.
end
();
++
it1
)
{
{
RTUDevice
*
d
(
it1
->
second
);
RTUDevice
*
d
(
it1
->
second
);
/*
cout
<<
"check respond addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
cout
<<
"check respond addr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
<<
" respond="
<<
d
->
resp_id
<<
" respond="
<<
d
->
resp_id
<<
" real="
<<
d
->
resp_real
<<
" real="
<<
d
->
resp_real
<<
" state="
<<
d
->
resp_state
<<
" state="
<<
d
->
resp_state
<<
endl
;
<<
endl
;
*/
if
(
d
->
resp_real
)
allNotRespond
=
false
;
// update respond sensors......
// update respond sensors......
if
(
d
->
checkRespond
()
&&
d
->
resp_id
!=
DefaultObjectId
)
if
(
d
->
checkRespond
()
&&
d
->
resp_id
!=
DefaultObjectId
)
{
{
...
@@ -520,6 +538,8 @@ void RTUExchange::updateSM()
...
@@ -520,6 +538,8 @@ void RTUExchange::updateSM()
}
}
}
}
cerr
<<
"*********** allNotRespond="
<<
allNotRespond
<<
endl
;
// update values...
// update values...
for
(
RTUExchange
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
for
(
RTUExchange
::
RegMap
::
iterator
it
=
d
->
regmap
.
begin
();
it
!=
d
->
regmap
.
end
();
++
it
)
{
{
...
@@ -1483,9 +1503,18 @@ bool RTUExchange::initRespondInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, Uni
...
@@ -1483,9 +1503,18 @@ bool RTUExchange::initRespondInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, Uni
d
->
second
->
resp_ptTimeout
.
setTiming
(
UniSetTimer
::
WaitUpTime
);
d
->
second
->
resp_ptTimeout
.
setTiming
(
UniSetTimer
::
WaitUpTime
);
d
->
second
->
resp_invert
=
atoi
(
it
.
getProp
(
"invert"
).
c_str
());
d
->
second
->
resp_invert
=
atoi
(
it
.
getProp
(
"invert"
).
c_str
());
d
->
second
->
resp_state
=
UniSetTypes
::
uni_atoi
(
it
.
getProp
(
"default"
).
c_str
());
/*
d
->
second
->
resp_real
=
UniSetTypes
::
uni_atoi
(
it
.
getProp
(
"default"
).
c_str
());
if( !it.getProp("default").empty() )
d
->
second
->
resp_trTimeout
.
change
(
d
->
second
->
resp_real
);
{
d->second->resp_state = UniSetTypes::uni_atoi(it.getProp("default").c_str());
d->second->resp_real = UniSetTypes::uni_atoi(it.getProp("default").c_str());
}
*/
/*
d->second->resp_real = true;
d->second->resp_state = false;
d->second->resp_trTimeout.change(false);
*/
return
true
;
return
true
;
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
...
@@ -1515,10 +1544,10 @@ std::ostream& operator<<( std::ostream& os, RTUExchange::RTUDevice& d )
...
@@ -1515,10 +1544,10 @@ std::ostream& operator<<( std::ostream& os, RTUExchange::RTUDevice& d )
os
<<
" rtu="
<<
(
d
.
rtu
?
"yes"
:
"no"
);
os
<<
" rtu="
<<
(
d
.
rtu
?
"yes"
:
"no"
);
os
<<
" repond_id="
<<
d
.
resp_id
os
<<
" re
s
pond_id="
<<
d
.
resp_id
<<
" repond_timeout="
<<
d
.
resp_ptTimeout
.
getInterval
()
<<
" re
s
pond_timeout="
<<
d
.
resp_ptTimeout
.
getInterval
()
<<
" repond_state="
<<
d
.
resp_state
<<
" re
s
pond_state="
<<
d
.
resp_state
<<
" repond_invert="
<<
d
.
resp_invert
<<
" re
s
pond_invert="
<<
d
.
resp_invert
<<
endl
;
<<
endl
;
...
@@ -1613,14 +1642,6 @@ void RTUExchange::rtuQueryOptimization( RTUDeviceMap& m )
...
@@ -1613,14 +1642,6 @@ void RTUExchange::rtuQueryOptimization( RTUDeviceMap& m )
void
RTUExchange
::
updateRTU
(
RegMap
::
iterator
&
rit
)
void
RTUExchange
::
updateRTU
(
RegMap
::
iterator
&
rit
)
{
{
RegInfo
*
r
(
rit
->
second
);
RegInfo
*
r
(
rit
->
second
);
using
namespace
ModbusRTU
;
bool
save
=
isWriteFunction
(
r
->
mbfunc
);
// if( !force_out_up && save )
// return;
ModbusRTU
::
DataBits16
b
(
r
->
mbval
);
for
(
PList
::
iterator
it
=
r
->
slst
.
begin
();
it
!=
r
->
slst
.
end
();
++
it
)
for
(
PList
::
iterator
it
=
r
->
slst
.
begin
();
it
!=
r
->
slst
.
end
();
++
it
)
updateRSProperty
(
&
(
*
it
),
false
);
updateRSProperty
(
&
(
*
it
),
false
);
}
}
...
...
extentions/RTUExchange/RTUExchange.h
View file @
1dbfb9f1
...
@@ -123,11 +123,13 @@ class RTUExchange:
...
@@ -123,11 +123,13 @@ class RTUExchange:
mbaddr
(
0
),
mbaddr
(
0
),
dtype
(
dtUnknown
),
dtype
(
dtUnknown
),
resp_id
(
UniSetTypes
::
DefaultObjectId
),
resp_id
(
UniSetTypes
::
DefaultObjectId
),
resp_state
(
tru
e
),
resp_state
(
fals
e
),
resp_invert
(
false
),
resp_invert
(
false
),
resp_real
(
fals
e
),
resp_real
(
tru
e
),
rtu
(
0
)
rtu
(
0
)
{}
{
resp_trTimeout
.
change
(
false
);
}
bool
respnond
;
bool
respnond
;
ModbusRTU
::
ModbusAddr
mbaddr
;
/*!< */
ModbusRTU
::
ModbusAddr
mbaddr
;
/*!< */
...
@@ -196,7 +198,7 @@ class RTUExchange:
...
@@ -196,7 +198,7 @@ class RTUExchange:
//
//
virtual
void
sigterm
(
int
signo
);
virtual
void
sigterm
(
int
signo
);
void
initMB
();
void
initMB
(
bool
reopen
=
false
);
void
initIterators
();
void
initIterators
();
bool
initItem
(
UniXML_iterator
&
it
);
bool
initItem
(
UniXML_iterator
&
it
);
bool
readItem
(
UniXML
&
xml
,
UniXML_iterator
&
it
,
xmlNode
*
sec
);
bool
readItem
(
UniXML
&
xml
,
UniXML_iterator
&
it
,
xmlNode
*
sec
);
...
@@ -244,6 +246,10 @@ class RTUExchange:
...
@@ -244,6 +246,10 @@ class RTUExchange:
bool
rs_pre_clean
;
bool
rs_pre_clean
;
bool
noQueryOptimization
;
bool
noQueryOptimization
;
bool
allNotRespond
;
Trigger
trAllNotRespond
;
PassiveTimer
ptAllNotRespond
;
};
};
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
#endif // _RS_EXCHANGE_H_
#endif // _RS_EXCHANGE_H_
...
...
extentions/RTUExchange/start_fg.sh
View file @
1dbfb9f1
...
@@ -5,7 +5,7 @@ uniset-start.sh -f ./uniset-rtuexchange --confile test.xml \
...
@@ -5,7 +5,7 @@ uniset-start.sh -f ./uniset-rtuexchange --confile test.xml \
--rs-name
RSExchange
\
--rs-name
RSExchange
\
--rs-speed
38400
\
--rs-speed
38400
\
--rs-filter-field
rs
\
--rs-filter-field
rs
\
--rs-filter-value
2
\
--rs-filter-value
1
\
--dlog-add-levels
info,crit,warn
\
--dlog-add-levels
info,crit,warn
\
--rs-force
0
\
--rs-force
0
\
--rs-force-out
0
\
--rs-force-out
0
\
...
...
include/modbus/ModbusTypes.h
View file @
1dbfb9f1
...
@@ -539,10 +539,10 @@ namespace ModbusRTU
...
@@ -539,10 +539,10 @@ namespace ModbusRTU
public
ModbusHeader
public
ModbusHeader
{
{
ModbusData
start
;
/*!< */
ModbusData
start
;
/*!< */
ModbusData
quant
;
/*!<
*/
ModbusData
quant
;
/*!< */
ModbusByte
bcnt
;
/*!< */
ModbusByte
bcnt
;
/*!< */
/*! */
/*! */
Modbus
Data
data
[
MAXLENPACKET
/
sizeof
(
ModbusData
)
-
sizeof
(
ModbusData
)
*
2
-
sizeof
(
ModbusByte
)];
Modbus
Byte
data
[
MAXLENPACKET
-
sizeof
(
ModbusData
)
*
2
-
sizeof
(
ModbusByte
)];
ModbusCRC
crc
;
/*!< */
ModbusCRC
crc
;
/*!< */
// ------- to slave -------
// ------- to slave -------
...
@@ -554,16 +554,15 @@ namespace ModbusRTU
...
@@ -554,16 +554,15 @@ namespace ModbusRTU
* \return TRUE -
* \return TRUE -
* \return FALSE -
* \return FALSE -
*/
*/
bool
addData
(
DataBits16
d
);
bool
addData
(
DataBits
d
);
/*! .
// return number of bit
* \param dnum -
// -1 - error
* \param bnum -
int
addBit
(
bool
state
);
* \param state -
* \return TRUE -
bool
setBit
(
int
nbit
,
bool
state
);
* \return FALSE -
*/
inline
int
last
(){
return
quant
;
}
bool
setBit
(
unsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
);
/*! .
/*! .
* \param dnum -
* \param dnum -
...
@@ -571,12 +570,14 @@ namespace ModbusRTU
...
@@ -571,12 +570,14 @@ namespace ModbusRTU
* \return TRUE -
* \return TRUE -
* \return FALSE -
* \return FALSE -
*/
*/
bool
getData
(
unsigned
char
dnum
,
DataBits16
&
d
);
bool
getData
(
unsigned
char
dnum
,
DataBits
&
d
);
bool
getBit
(
unsigned
char
bnum
);
void
clear
();
void
clear
();
inline
bool
isFull
()
inline
bool
isFull
()
{
{
return
(
quant
*
sizeof
(
ModbusData
)
>=
MAXLENPACKET
);
return
(
bcnt
>=
MAXLENPACKET
);
}
}
// ------- from master -------
// ------- from master -------
...
...
src/Communications/Modbus/ModbusTypes.cc
View file @
1dbfb9f1
...
@@ -1206,30 +1206,45 @@ ForceCoilsMessage::ForceCoilsMessage( ModbusAddr a, ModbusData s ):
...
@@ -1206,30 +1206,45 @@ ForceCoilsMessage::ForceCoilsMessage( ModbusAddr a, ModbusData s ):
func
=
fnForceMultipleCoils
;
func
=
fnForceMultipleCoils
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
addData
(
DataBits
16
d
)
bool
ForceCoilsMessage
::
addData
(
DataBits
d
)
{
{
if
(
isFull
()
)
if
(
isFull
()
)
return
false
;
return
false
;
data
[
quant
++
]
=
d
.
mdata
();
data
[
bcnt
++
]
=
d
.
mbyte
();
bcnt
=
quant
*
sizeof
(
ModbusData
)
;
quant
+=
BitsPerByte
;
return
true
;
return
true
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
setBit
(
unsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
)
int
ForceCoilsMessage
::
addBit
(
bool
state
)
{
{
if
(
dnum
<
bcnt
&&
bnum
<
BitsPerData
)
int
qnum
=
quant
%
BitsPerByte
;
{
DataBits16
d
(
data
[
dnum
]);
if
(
qnum
==
0
)
d
.
b
[
bnum
]
=
state
;
bcnt
++
;
data
[
dnum
]
=
d
;
return
true
;
DataBits
b
(
data
[
bcnt
-
1
]);
}
b
.
b
[
qnum
]
=
state
;
data
[
bcnt
-
1
]
=
b
.
mbyte
();
quant
++
;
return
(
quant
-
1
);
}
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
setBit
(
int
nbit
,
bool
state
)
{
if
(
nbit
<
0
||
nbit
>=
quant
)
return
false
;
return
false
;
int
bnum
=
nbit
/
BitsPerByte
;
int
qnum
=
nbit
%
BitsPerByte
;
DataBits
b
(
data
[
bnum
]);
b
.
b
[
qnum
]
=
state
;
data
[
bnum
]
=
b
.
mbyte
();
return
true
;
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
getData
(
unsigned
char
dnum
,
DataBits
16
&
d
)
bool
ForceCoilsMessage
::
getData
(
unsigned
char
dnum
,
DataBits
&
d
)
{
{
if
(
dnum
<
bcnt
)
if
(
dnum
<
bcnt
)
{
{
...
@@ -1270,14 +1285,8 @@ ModbusMessage ForceCoilsMessage::transport_msg()
...
@@ -1270,14 +1285,8 @@ ModbusMessage ForceCoilsMessage::transport_msg()
memcpy
(
&
(
mm
.
data
[
ind
]),
&
bcnt
,
sizeof
(
bcnt
));
memcpy
(
&
(
mm
.
data
[
ind
]),
&
bcnt
,
sizeof
(
bcnt
));
ind
+=
sizeof
(
bcnt
);
ind
+=
sizeof
(
bcnt
);
// ,
ModbusData
*
dtmp
=
new
ModbusData
[
quant
];
for
(
int
i
=
0
;
i
<
quant
;
i
++
)
dtmp
[
i
]
=
SWAPSHORT
(
data
[
i
]);
//
//
memcpy
(
&
(
mm
.
data
[
ind
]),
dtmp
,
bcnt
);
memcpy
(
&
(
mm
.
data
[
ind
]),
data
,
bcnt
);
delete
dtmp
;
ind
+=
bcnt
;
ind
+=
bcnt
;
...
@@ -1337,14 +1346,11 @@ void ForceCoilsMessage::init( ModbusMessage& m )
...
@@ -1337,14 +1346,11 @@ void ForceCoilsMessage::init( ModbusMessage& m )
// CRC
// CRC
memcpy
(
&
crc
,
&
(
m
.
data
[
m
.
len
-
szCRC
]),
szCRC
);
memcpy
(
&
crc
,
&
(
m
.
data
[
m
.
len
-
szCRC
]),
szCRC
);
for
(
int
i
=
0
;
i
<
quant
;
i
++
)
data
[
i
]
=
SWAPSHORT
(
data
[
i
]);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool
ForceCoilsMessage
::
checkFormat
()
bool
ForceCoilsMessage
::
checkFormat
()
{
{
return
(
(
bcnt
==
(
quant
*
sizeof
(
ModbusData
)))
&&
(
func
==
fnForceMultipleCoils
)
);
return
(
func
==
fnForceMultipleCoils
);
}
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
int
ForceCoilsMessage
::
szData
()
int
ForceCoilsMessage
::
szData
()
...
@@ -1369,14 +1375,14 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, ForceCoilsMessage& m )
...
@@ -1369,14 +1375,14 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, ForceCoilsMessage& m )
<<
" bcnt="
<<
b2str
(
m
.
bcnt
)
<<
" bcnt="
<<
b2str
(
m
.
bcnt
)
<<
" data["
<<
(
int
)
m
.
quant
<<
"]={ "
;
<<
" data["
<<
(
int
)
m
.
quant
<<
"]={ "
;
for
(
int
i
=
0
;
i
<
m
.
qua
nt
;
i
++
)
for
(
int
i
=
0
;
i
<
m
.
bc
nt
;
i
++
)
{
{
DataBits
16
d
(
m
.
data
[
i
]);
DataBits
d
(
m
.
data
[
i
]);
os
<<
""
<<
d
<<
" "
;
os
<<
""
<<
d
<<
" "
;
}
}
os
<<
"}"
;
os
<<
"}"
;
return
os
;
return
os
;
}
}
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
ForceCoilsMessage
*
m
)
std
::
ostream
&
ModbusRTU
::
operator
<<
(
std
::
ostream
&
os
,
ForceCoilsMessage
*
m
)
{
{
...
...
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