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
a2756ef7
Commit
a2756ef7
authored
Mar 18, 2009
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
testing
parent
2cebcea4
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
458 additions
and
321 deletions
+458
-321
mbtcptester.cc
Utilities/MBTester/mbtcptester.cc
+158
-155
test.xml
conf/test.xml
+1
-1
MBMaster.cc
extentions/MBTCPMaster/MBMaster.cc
+169
-34
MBMaster.h
extentions/MBTCPMaster/MBMaster.h
+6
-2
start_fg.sh
extentions/MBTCPMaster/start_fg.sh
+6
-2
MBSlave.cc
extentions/ModbusSlave/MBSlave.cc
+68
-105
MBSlave.h
extentions/ModbusSlave/MBSlave.h
+4
-4
start_tcp_fg.sh
extentions/ModbusSlave/start_tcp_fg.sh
+5
-2
IOBase.cc
extentions/lib/IOBase.cc
+9
-7
SMInterface.cc
extentions/lib/SMInterface.cc
+4
-4
ModbusTCPMaster.h
include/modbus/ModbusTCPMaster.h
+4
-0
ModbusTCPMaster.cc
src/Communications/Modbus/ModbusTCPMaster.cc
+24
-5
No files found.
Utilities/MBTester/mbtcptester.cc
View file @
a2756ef7
...
...
@@ -146,19 +146,19 @@ int main( int argc, char **argv )
}
break
;
case
'i'
:
case
'i'
:
iaddr
=
string
(
optarg
);
break
;
case
'p'
:
case
'p'
:
port
=
atoi
(
optarg
);
break
;
case
't'
:
case
't'
:
tout
=
atoi
(
optarg
);
break
;
case
'a'
:
case
'a'
:
myaddr
=
ModbusRTU
::
str2mbAddr
(
optarg
);
break
;
...
...
@@ -178,198 +178,201 @@ int main( int argc, char **argv )
cout
<<
"(init): ip="
<<
iaddr
<<
":"
<<
port
<<
" myaddr="
<<
ModbusRTU
::
addr2str
(
myaddr
)
<<
" timeout="
<<
tout
<<
" msec "
<<
endl
;
}
ModbusTCPMaster
mb
;
<<
endl
;
if
(
verb
)
dlog
.
addLevel
(
Debug
::
type
(
Debug
::
CRIT
|
Debug
::
WARN
|
Debug
::
INFO
)
);
}
ModbusTCPMaster
mb
;
mb
.
setLog
(
dlog
);
ost
::
Thread
::
setException
(
ost
::
Thread
::
throwException
);
//
ost::Thread::setException(ost::Thread::throwException);
ost
::
InetAddress
ia
(
iaddr
.
c_str
());
mb
.
connect
(
ia
,
port
);
mb
.
setTimeout
(
tout
);
mb
.
connect
(
ia
,
port
);
switch
(
cmd
)
while
(
1
)
{
case
cmdRead01
:
switch
(
cmd
)
{
if
(
verb
)
case
cmdRead01
:
{
cout
<<
"read01: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
if
(
verb
)
{
cout
<<
"read01: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
.
read01
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
(
int
)
ret
.
bcnt
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = ("
<<
ModbusRTU
::
b2str
(
ret
.
data
[
i
])
<<
") "
<<
b
<<
endl
;
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
.
read01
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
(
int
)
ret
.
bcnt
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = ("
<<
ModbusRTU
::
b2str
(
ret
.
data
[
i
])
<<
") "
<<
b
<<
endl
;
}
}
}
break
;
break
;
case
cmdRead02
:
{
if
(
verb
)
case
cmdRead02
:
{
cout
<<
"read02: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
if
(
verb
)
{
cout
<<
"read02: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
}
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
.
read02
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
(
int
)
ret
.
bcnt
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = ("
<<
ModbusRTU
::
b2str
(
ret
.
data
[
i
])
<<
") "
<<
b
<<
endl
;
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
.
read02
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
(
int
)
ret
.
bcnt
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = ("
<<
ModbusRTU
::
b2str
(
ret
.
data
[
i
])
<<
") "
<<
b
<<
endl
;
}
}
}
break
;
break
;
case
cmdRead03
:
{
if
(
verb
)
case
cmdRead03
:
{
cout
<<
"read03: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
if
(
verb
)
{
cout
<<
"read03: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
.
read03
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
ModbusRTU
::
dat2str
(
ret
.
count
)
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
count
;
i
++
)
{
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = "
<<
(
int
)(
ret
.
data
[
i
])
<<
" ("
<<
ModbusRTU
::
dat2str
(
ret
.
data
[
i
])
<<
")"
<<
endl
;
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
.
read03
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
ModbusRTU
::
dat2str
(
ret
.
count
)
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
count
;
i
++
)
{
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = "
<<
(
int
)(
ret
.
data
[
i
])
<<
" ("
<<
ModbusRTU
::
dat2str
(
ret
.
data
[
i
])
<<
")"
<<
endl
;
}
}
}
break
;
break
;
case
cmdRead04
:
{
if
(
verb
)
case
cmdRead04
:
{
cout
<<
"read04: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
if
(
verb
)
{
cout
<<
"read04: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" count="
<<
ModbusRTU
::
dat2str
(
count
)
<<
endl
;
}
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
.
read04
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
ModbusRTU
::
dat2str
(
ret
.
count
)
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
count
;
i
++
)
{
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = "
<<
(
int
)(
ret
.
data
[
i
])
<<
" ("
<<
ModbusRTU
::
dat2str
(
ret
.
data
[
i
])
<<
")"
<<
endl
;
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
.
read04
(
slaveaddr
,
reg
,
count
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
cout
<<
"(reply): count="
<<
ModbusRTU
::
dat2str
(
ret
.
count
)
<<
endl
;
for
(
int
i
=
0
;
i
<
ret
.
count
;
i
++
)
{
cout
<<
i
<<
": ("
<<
ModbusRTU
::
dat2str
(
reg
+
i
)
<<
") = "
<<
(
int
)(
ret
.
data
[
i
])
<<
" ("
<<
ModbusRTU
::
dat2str
(
ret
.
data
[
i
])
<<
")"
<<
endl
;
}
}
}
break
;
break
;
case
cmdWrite05
:
{
if
(
verb
)
case
cmdWrite05
:
{
cout
<<
"write05: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
if
(
verb
)
{
cout
<<
"write05: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
}
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
.
write05
(
slaveaddr
,
reg
,(
bool
)
val
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
.
write05
(
slaveaddr
,
reg
,(
bool
)
val
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
break
;
break
;
case
cmdWrite06
:
{
if
(
verb
)
case
cmdWrite06
:
{
cout
<<
"write06: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
if
(
verb
)
{
cout
<<
"write06: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
}
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
.
write06
(
slaveaddr
,
reg
,
val
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
.
write06
(
slaveaddr
,
reg
,
val
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
break
;
break
;
case
cmdWrite0F
:
{
if
(
verb
)
case
cmdWrite0F
:
{
cout
<<
"write0F: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
if
(
verb
)
{
cout
<<
"write0F: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
}
ModbusRTU
::
ForceCoilsMessage
msg
(
slaveaddr
,
reg
);
ModbusRTU
::
DataBits16
b
(
val
);
msg
.
addData
(
b
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
.
write0F
(
msg
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
ModbusRTU
::
ForceCoilsMessage
msg
(
slaveaddr
,
reg
);
ModbusRTU
::
DataBits16
b
(
val
);
msg
.
addData
(
b
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
.
write0F
(
msg
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
break
;
break
;
case
cmdWrite10
:
{
if
(
verb
)
case
cmdWrite10
:
{
cout
<<
"write06: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
if
(
verb
)
{
cout
<<
"write06: slaveaddr="
<<
ModbusRTU
::
addr2str
(
slaveaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
" val="
<<
ModbusRTU
::
dat2str
(
val
)
<<
endl
;
}
ModbusRTU
::
WriteOutputMessage
msg
(
slaveaddr
,
reg
);
msg
.
addData
(
val
);
ModbusRTU
::
WriteOutputRetMessage
ret
=
mb
.
write10
(
msg
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
}
ModbusRTU
::
WriteOutputMessage
msg
(
slaveaddr
,
reg
);
msg
.
addData
(
val
);
ModbusRTU
::
WriteOutputRetMessage
ret
=
mb
.
write10
(
msg
);
if
(
verb
)
cout
<<
"(reply): "
<<
ret
<<
endl
;
break
;
case
cmdNOP
:
default:
cerr
<<
"No command. Use -h for help."
<<
endl
;
return
1
;
}
break
;
case
cmdNOP
:
default:
cerr
<<
"No command. Use -h for help."
<<
endl
;
return
1
;
}
msleep
(
200
);
}
// end of while
mb
.
disconnect
();
}
catch
(
ModbusRTU
::
mbException
&
ex
)
...
...
conf/test.xml
View file @
a2756ef7
...
...
@@ -93,7 +93,7 @@
<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=
"0x31"
mbfunc=
"0x04"
mbreg=
"0x02"
rs=
"1"
/>
<item
name=
"Input3_S"
textname=
" 3"
node=
""
iotype=
"DI"
priority=
"Medium"
udp=
"1
"
/>
<item
name=
"Input3_S"
textname=
" 3"
node=
""
iotype=
"DI"
priority=
"Medium"
mbtcp=
"1"
mbaddr=
"0x31"
mbfunc=
"0x04"
mbreg=
"0x02
"
/>
<item
name=
"Input4_S"
textname=
" 4"
node=
""
iotype=
"DI"
priority=
"Medium"
udp=
"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"
>
...
...
extentions/MBTCPMaster/MBMaster.cc
View file @
a2756ef7
...
...
@@ -9,6 +9,7 @@
using
namespace
std
;
using
namespace
UniSetTypes
;
using
namespace
UniSetExtentions
;
using
namespace
ModbusRTU
;
// -----------------------------------------------------------------------------
MBMaster
::
MBMaster
(
UniSetTypes
::
ObjectId
objId
,
UniSetTypes
::
ObjectId
shmId
,
SharedMemory
*
ic
,
std
::
string
prefix
)
:
...
...
@@ -18,6 +19,7 @@ maxItem(0),
mb
(
0
),
shm
(
0
),
initPause
(
0
),
mbregFromID
(
false
),
force
(
false
),
force_out
(
false
),
activated
(
false
),
...
...
@@ -55,13 +57,16 @@ prefix(prefix)
recv_timeout
=
atoi
(
conf
->
getArgParam
(
"--"
+
prefix
+
"-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
)).
c_str
());
if
(
recv_timeout
<=
0
)
recv_timeout
=
1
00
;
recv_timeout
=
20
00
;
string
saddr
=
conf
->
getArgParam
(
"--"
+
prefix
+
"-my-addr"
,
it
.
getProp
(
"addr"
));
myaddr
=
ModbusRTU
::
str2mbAddr
(
saddr
);
if
(
saddr
.
empty
()
)
myaddr
=
0x00
;
mbregFromID
=
atoi
(
conf
->
getArgParam
(
"--"
+
prefix
+
"-reg-from-id"
,
it
.
getProp
(
"reg_from_id"
)).
c_str
());
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): mbregFromID="
<<
mbregFromID
<<
endl
;
polltime
=
atoi
(
conf
->
getArgParam
(
"--"
+
prefix
+
"-polltime"
,
it
.
getProp
(
"polltime"
)).
c_str
());
if
(
!
polltime
)
polltime
=
100
;
...
...
@@ -133,6 +138,8 @@ prefix(prefix)
// -----------------------------------------------------------------------------
MBMaster
::~
MBMaster
()
{
if
(
mb
)
mb
->
disconnect
();
delete
mb
;
}
// -----------------------------------------------------------------------------
...
...
@@ -205,6 +212,7 @@ void MBMaster::init_mb()
mb
=
new
ModbusTCPMaster
();
mb
->
connect
(
ia
,
port
);
mb
->
setTimeout
(
recv_timeout
);
mb
->
setLog
(
dlog
);
}
catch
(
Exception
&
ex
)
{
...
...
@@ -241,24 +249,23 @@ void MBMaster::poll()
{
if
(
it
->
stype
==
UniversalIO
::
AnalogInput
)
{
long
val
=
callItem
(
it
);
long
val
=
readReg
(
it
);
IOBase
::
processingAsAI
(
ib
,
val
,
shm
,
force
);
}
else
if
(
it
->
stype
==
UniversalIO
::
DigitalInput
)
{
bool
set
=
callItem
(
it
)
?
true
:
false
;
bool
set
=
readReg
(
it
)
?
true
:
false
;
IOBase
::
processingAsDI
(
ib
,
set
,
shm
,
force
);
}
else
if
(
it
->
stype
==
UniversalIO
::
AnalogOutput
)
{
cerr
<<
myname
<<
"(poll): AnalogOutput !!! (sid="
<<
it
->
si
.
id
<<
")"
<<
endl
;
// IOBase::processingAO( &ib, val
);
long
val
=
IOBase
::
processingAsAO
(
ib
,
shm
,
force_out
)
;
writeReg
(
it
,
val
);
}
else
if
(
it
->
stype
==
UniversalIO
::
DigitalOutput
)
{
// if( force_out )
// it->value = shm->localGetState(it->dit,it->si.id);
// bool set IOBase::processingAO( &ib, val );
long
val
=
IOBase
::
processingAsDO
(
ib
,
shm
,
force_out
)
?
1
:
0
;
writeReg
(
it
,
val
);
}
}
catch
(
ModbusRTU
::
mbException
&
ex
)
...
...
@@ -293,25 +300,82 @@ void MBMaster::poll()
}
}
// -----------------------------------------------------------------------------
long
MBMaster
::
callItem
(
MBMap
::
iterator
&
p
)
long
MBMaster
::
readReg
(
MBMap
::
iterator
&
p
)
{
unsigned
short
v1
=
0
,
v2
=
0
;
if
(
p
->
mbfunc
==
ModbusRTU
::
fnReadInputRegisters
)
try
{
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
->
read04
(
p
->
mbaddr
,
p
->
mbreg
,
1
);
return
ret
.
data
[
0
];
if
(
p
->
mbfunc
==
ModbusRTU
::
fnReadInputRegisters
)
{
// if( dlog.debugging(Debug::LEVEL3) )
// dlog[Debug::LEVEL3] << " read from " << ModbusRTU::addr2str(p->mbaddr) << " reg=" << ModbusRTU::dat2str(p->mbreg) << endl;
cerr
<<
" read from "
<<
ModbusRTU
::
addr2str
(
p
->
mbaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
endl
;
ModbusRTU
::
ReadInputRetMessage
ret
=
mb
->
read04
(
p
->
mbaddr
,
p
->
mbreg
,
1
);
return
ret
.
data
[
0
];
}
if
(
p
->
mbfunc
==
ModbusRTU
::
fnReadOutputRegisters
)
{
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
->
read03
(
p
->
mbaddr
,
p
->
mbreg
,
1
);
return
ret
.
data
[
0
];
}
cerr
<<
myname
<<
"(readReg): "
<<
(
int
)
p
->
mbfunc
<<
endl
;
}
else
if
(
p
->
mbfunc
==
ModbusRTU
::
fnReadOutputRegisters
)
catch
(
ModbusRTU
::
mbException
&
ex
)
{
ModbusRTU
::
ReadOutputRetMessage
ret
=
mb
->
read03
(
p
->
mbaddr
,
p
->
mbreg
,
1
);
return
ret
.
data
[
0
];
dlog
[
Debug
::
CRIT
]
<<
"(readReg): "
<<
ex
<<
endl
;
}
else
cerr
<<
myname
<<
"(callItem): "
<<
(
int
)
p
->
mbfunc
<<
endl
;
// return 0;
catch
(
SystemError
&
err
)
{
dlog
[
Debug
::
CRIT
]
<<
"(readReg): "
<<
err
<<
endl
;
}
catch
(
Exception
&
ex
)
{
dlog
[
Debug
::
CRIT
]
<<
"(readReg): "
<<
ex
<<
endl
;
}
catch
(
ost
::
SockException
&
e
)
{
dlog
[
Debug
::
CRIT
]
<<
"(readReg): "
<<
e
.
getString
()
<<
": "
<<
e
.
getSystemErrorString
()
<<
endl
;
}
return
0
;
}
// -----------------------------------------------------------------------------
bool
MBMaster
::
writeReg
(
MBMap
::
iterator
&
p
,
long
val
)
{
if
(
p
->
mbfunc
==
fnWriteOutputRegisters
)
{
ModbusRTU
::
WriteOutputMessage
msg
(
p
->
mbaddr
,
p
->
mbreg
);
msg
.
addData
(
val
);
ModbusRTU
::
WriteOutputRetMessage
ret
=
mb
->
write10
(
msg
);
return
true
;
}
if
(
p
->
mbfunc
==
ModbusRTU
::
fnForceSingleCoil
)
{
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
->
write05
(
p
->
mbaddr
,
p
->
mbreg
,(
bool
)
val
);
return
false
;
}
if
(
p
->
mbfunc
==
fnWriteOutputSingleRegister
)
{
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
p
->
mbaddr
,
p
->
mbreg
,
val
);
return
true
;
}
if
(
p
->
mbfunc
==
fnForceMultipleCoils
)
{
ModbusRTU
::
ForceCoilsMessage
msg
(
p
->
mbaddr
,
p
->
mbreg
);
ModbusRTU
::
DataBits16
b
(
val
);
msg
.
addData
(
b
);
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
->
write0F
(
msg
);
return
true
;
}
cerr
<<
myname
<<
"(writeReg): "
<<
(
int
)
p
->
mbfunc
<<
endl
;
return
false
;
}
// -----------------------------------------------------------------------------
void
MBMaster
::
processingMessage
(
UniSetTypes
::
VoidMessage
*
msg
)
{
try
...
...
@@ -365,6 +429,13 @@ void MBMaster::sysCommand(UniSetTypes::SystemMessage *sm)
{
case
SystemMessage
:
:
StartUp
:
{
if
(
mbmap
.
empty
()
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(sysCommand): mbmap EMPTY! terminated..."
<<
endl
;
raise
(
SIGTERM
);
return
;
}
waitSMReady
();
// ģ
...
...
@@ -393,7 +464,7 @@ void MBMaster::sysCommand(UniSetTypes::SystemMessage *sm)
//
if
(
!
force
)
{
uniset_mutex_lock
l
(
pollMutex
,
2000
);
uniset_mutex_lock
l
(
pollMutex
,
2000
);
force
=
true
;
poll
();
force
=
false
;
...
...
@@ -461,9 +532,7 @@ void MBMaster::initOutput()
// ------------------------------------------------------------------------------------------
void
MBMaster
::
askSensors
(
UniversalIO
::
UIOCommand
cmd
)
{
#warning testid
UniSetTypes
::
ObjectId
testid
=
4100
;
// (notRespondSensor!=DefaultObjectId) ? notRespondSensor : 4100; //TestMode_S
if
(
!
shm
->
waitSMworking
(
testid
,
activateTimeout
,
50
)
)
if
(
!
shm
->
waitSMworking
(
test_id
,
activateTimeout
,
50
)
)
{
ostringstream
err
;
err
<<
myname
...
...
@@ -498,7 +567,27 @@ void MBMaster::askSensors( UniversalIO::UIOCommand cmd )
// ------------------------------------------------------------------------------------------
void
MBMaster
::
sensorInfo
(
UniSetTypes
::
SensorMessage
*
sm
)
{
MBMap
::
iterator
it
=
mbmap
.
begin
();
for
(
;
it
!=
mbmap
.
end
();
++
it
)
{
if
(
it
->
stype
!=
UniversalIO
::
DigitalOutput
&&
it
->
stype
!=
UniversalIO
::
AnalogOutput
)
continue
;
if
(
it
->
si
.
id
==
sm
->
id
)
{
if
(
it
->
stype
==
UniversalIO
::
DigitalOutput
)
{
uniset_spin_lock
lock
(
it
->
val_lock
);
it
->
value
=
sm
->
state
?
1
:
0
;
}
else
if
(
it
->
stype
==
UniversalIO
::
AnalogOutput
)
{
uniset_spin_lock
lock
(
it
->
val_lock
);
it
->
value
=
sm
->
value
;
}
break
;
}
}
}
// ------------------------------------------------------------------------------------------
bool
MBMaster
::
activateObject
()
...
...
@@ -600,28 +689,54 @@ bool MBMaster::readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec )
// ------------------------------------------------------------------------------------------
bool
MBMaster
::
initItem
(
UniXML_iterator
&
it
)
{
cerr
<<
"********** init item *************"
<<
endl
;
MBProperty
p
;
if
(
!
IOBase
::
initItem
(
static_cast
<
IOBase
*>
(
&
p
),
it
,
shm
,
&
dlog
,
myname
)
)
return
false
;
cerr
<<
"********** init item(2) *************"
<<
endl
;
string
addr
=
it
.
getProp
(
"mbaddr"
);
if
(
addr
.
empty
()
)
return
true
;
if
(
mbregFromID
)
p
.
mbreg
=
p
.
si
.
id
;
else
{
string
r
=
it
.
getProp
(
"mbreg"
);
if
(
r
.
empty
()
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown 'mbreg' for "
<<
it
.
getProp
(
"name"
)
<<
endl
;
return
false
;
}
p
.
mbreg
=
ModbusRTU
::
str2mbData
(
r
);
}
p
.
mbaddr
=
ModbusRTU
::
str2mbAddr
(
addr
);
if
(
p
.
stype
==
UniversalIO
::
AnalogInput
)
string
stype
(
it
.
getProp
(
"mb_iotype"
)
);
if
(
stype
.
empty
()
)
stype
=
it
.
getProp
(
"iotype"
);
if
(
stype
==
"AI"
)
{
p
.
stype
=
UniversalIO
::
AnalogInput
;
p
.
mbfunc
=
ModbusRTU
::
fnReadInputRegisters
;
else
if
(
p
.
stype
==
UniversalIO
::
DigitalInput
)
}
else
if
(
stype
==
"DI"
)
{
p
.
stype
=
UniversalIO
::
DigitalInput
;
p
.
mbfunc
=
ModbusRTU
::
fnReadInputRegisters
;
else
if
(
p
.
stype
==
UniversalIO
::
AnalogOutput
)
}
else
if
(
stype
==
"AO"
)
{
p
.
stype
=
UniversalIO
::
AnalogOutput
;
p
.
mbfunc
=
ModbusRTU
::
fnWriteOutputRegisters
;
else
if
(
p
.
stype
==
UniversalIO
::
DigitalOutput
)
}
else
if
(
stype
==
"DO"
)
{
p
.
stype
=
UniversalIO
::
DigitalOutput
;
p
.
mbfunc
=
ModbusRTU
::
fnWriteOutputRegisters
;
}
string
f
=
it
.
getProp
(
"mbfunc"
);
if
(
!
f
.
empty
()
)
...
...
@@ -629,13 +744,33 @@ bool MBMaster::initItem( UniXML_iterator& it )
p
.
mbfunc
=
(
ModbusRTU
::
SlaveFunctionCode
)
UniSetTypes
::
uni_atoi
(
f
.
c_str
());
if
(
p
.
mbfunc
==
ModbusRTU
::
fnUnknown
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(init
CommPara
m): mbfunc ='"
<<
f
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(init
Ite
m): mbfunc ='"
<<
f
<<
"' "
<<
it
.
getProp
(
"name"
)
<<
endl
;
return
false
;
}
}
if
(
p
.
mbfunc
==
ModbusRTU
::
fnReadCoilStatus
||
p
.
mbfunc
==
ModbusRTU
::
fnReadInputStatus
)
{
string
nb
=
it
.
getProp
(
"nbit"
);
if
(
nb
.
empty
()
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown nbit. for "
<<
it
.
getProp
(
"name"
)
<<
" mbfunc="
<<
p
.
mbfunc
<<
endl
;
return
false
;
}
p
.
nbit
=
UniSetTypes
::
uni_atoi
(
nb
.
c_str
());
}
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(initItem): add "
<<
p
<<
endl
;
//
// 10 ( )
// resize
...
...
extentions/MBTCPMaster/MBMaster.h
View file @
a2756ef7
...
...
@@ -43,10 +43,11 @@ class MBMaster:
ModbusRTU
::
ModbusAddr
mbaddr
;
/*!< */
ModbusRTU
::
ModbusData
mbreg
;
/*!< */
ModbusRTU
::
SlaveFunctionCode
mbfunc
;
/*!< / */
short
nbit
;
/*!< bit number (for func=[0x01,0x02]) */
MBProperty
()
:
mbaddr
(
0
),
mbreg
(
0
),
mbfunc
(
ModbusRTU
::
fnUnknown
)
mbfunc
(
ModbusRTU
::
fnUnknown
)
,
nbit
(
0
)
{}
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
MBProperty
&
p
);
...
...
@@ -80,7 +81,8 @@ class MBMaster:
void
askSensors
(
UniversalIO
::
UIOCommand
cmd
);
void
initOutput
();
void
waitSMReady
();
long
callItem
(
MBMap
::
iterator
&
p
);
long
readReg
(
MBMap
::
iterator
&
p
);
bool
writeReg
(
MBMap
::
iterator
&
p
,
long
val
);
virtual
bool
activateObject
();
...
...
@@ -100,6 +102,7 @@ class MBMaster:
bool
initPause
;
UniSetTypes
::
uniset_mutex
mutex_start
;
bool
mbregFromID
;
bool
force
;
/*!< , SM, */
bool
force_out
;
/*!< , */
int
polltime
;
/*!< , [] */
...
...
@@ -113,6 +116,7 @@ class MBMaster:
Trigger
trTimeout
;
PassiveTimer
ptTimeout
;
bool
activated
;
int
activateTimeout
;
std
::
string
prefix
;
...
...
extentions/MBTCPMaster/start_fg.sh
View file @
a2756ef7
#!/bin/sh
uniset-start.sh
-f
./uniset-mbtcpmaster
--mbtcp-name
MBMaster1
--confile
test.xml
\
--dlog-add-levels
info,crit,warn
--mbtcp-reg-from-id
1
\
--mbtcp-iaddr
127.0.0.1
--mbtcp-port
30000
--dlog-add-levels
info,crit,warn
\
--mbtcp-iaddr
127.0.0.1
--mbtcp-port
2048
\
--mbtcp-filter-field
mbtcp
--mbtcp-filter-value
1
#--mbtcp-reg-from-id 1
\ No newline at end of file
extentions/ModbusSlave/MBSlave.cc
View file @
a2756ef7
...
...
@@ -13,7 +13,8 @@ using namespace UniSetTypes;
using
namespace
UniSetExtentions
;
using
namespace
ModbusRTU
;
// -----------------------------------------------------------------------------
MBSlave
::
MBSlave
(
UniSetTypes
::
ObjectId
objId
,
UniSetTypes
::
ObjectId
shmId
,
SharedMemory
*
ic
)
:
MBSlave
::
MBSlave
(
UniSetTypes
::
ObjectId
objId
,
UniSetTypes
::
ObjectId
shmId
,
SharedMemory
*
ic
,
string
prefix
)
:
UniSetObject_LT
(
objId
),
mbslot
(
0
),
shm
(
0
),
...
...
@@ -21,8 +22,8 @@ initPause(0),
activated
(
false
),
pingOK
(
true
),
force
(
false
),
force_out
(
false
),
mbregFromID
(
false
)
mbregFromID
(
false
),
prefix
(
prefix
)
{
cout
<<
"$Id: MBSlave.cc,v 1.1 2009/01/11 19:08:45 vpashka Exp $"
<<
endl
;
...
...
@@ -39,36 +40,35 @@ mbregFromID(false)
UniXML_iterator
it
(
cnode
);
//
s_field
=
conf
->
getArgParam
(
"--
mbs-s
-filter-field"
);
s_fvalue
=
conf
->
getArgParam
(
"--
mbs-s
-filter-value"
);
s_field
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-filter-field"
);
s_fvalue
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-filter-value"
);
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): read s_field='"
<<
s_field
<<
"' s_fvalue='"
<<
s_fvalue
<<
"'"
<<
endl
;
force
=
atoi
(
conf
->
getArgParam
(
"--mbs-force"
,
it
.
getProp
(
"force"
)).
c_str
());
force_out
=
atoi
(
conf
->
getArgParam
(
"--mbs-force-out"
,
it
.
getProp
(
"force_out"
)).
c_str
());
force
=
atoi
(
conf
->
getArgParam
(
"--"
+
prefix
+
"-force"
,
it
.
getProp
(
"force"
)).
c_str
());
int
recv_timeout
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
)).
c_str
());
int
recv_timeout
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-recv-timeout"
,
it
.
getProp
(
"recv_timeout"
)).
c_str
());
string
saddr
=
conf
->
getArgParam
(
"--
mbs
-my-addr"
,
it
.
getProp
(
"addr"
));
string
saddr
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-my-addr"
,
it
.
getProp
(
"addr"
));
if
(
saddr
.
empty
()
)
addr
=
0x01
;
else
addr
=
ModbusRTU
::
str2mbAddr
(
saddr
);
mbregFromID
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-reg-from-id"
,
it
.
getProp
(
"reg_from_id"
)).
c_str
());
mbregFromID
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-reg-from-id"
,
it
.
getProp
(
"reg_from_id"
)).
c_str
());
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(init): mbregFromID="
<<
mbregFromID
<<
endl
;
string
stype
=
conf
->
getArgParam
(
"--
mbs
-type"
,
it
.
getProp
(
"type"
));
string
stype
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-type"
,
it
.
getProp
(
"type"
));
if
(
stype
==
"RTU"
)
{
// ---------- init RS ----------
string
dev
=
conf
->
getArgParam
(
"--
mbs
-dev"
,
it
.
getProp
(
"device"
));
string
dev
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-dev"
,
it
.
getProp
(
"device"
));
if
(
dev
.
empty
()
)
throw
UniSetTypes
::
SystemError
(
myname
+
"(MBSlave): Unknown device..."
);
string
speed
=
conf
->
getArgParam
(
"--
mbs
-speed"
,
it
.
getProp
(
"speed"
));
string
speed
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-speed"
,
it
.
getProp
(
"speed"
));
if
(
speed
.
empty
()
)
speed
=
"38400"
;
...
...
@@ -87,11 +87,11 @@ mbregFromID(false)
}
else
if
(
stype
==
"TCP"
)
{
string
iaddr
=
conf
->
getArgParam
(
"--
mbs
-inet-addr"
,
it
.
getProp
(
"iaddr"
));
string
iaddr
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-inet-addr"
,
it
.
getProp
(
"iaddr"
));
if
(
iaddr
.
empty
()
)
throw
UniSetTypes
::
SystemError
(
myname
+
"(MBSlave): Unknown TCP server address. Use: --mbs-inet-addr [ XXX.XXX.XXX.XXX| hostname ]"
);
int
port
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-inet-port"
,
it
.
getProp
(
"iport"
)).
c_str
());
int
port
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-inet-port"
,
it
.
getProp
(
"iport"
)).
c_str
());
if
(
port
<=
0
)
port
=
502
;
...
...
@@ -122,7 +122,7 @@ mbregFromID(false)
// mbslot->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) );
// -------------------------------
initPause
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-initPause"
,
it
.
getProp
(
"initPause"
)).
c_str
());
initPause
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-initPause"
,
it
.
getProp
(
"initPause"
)).
c_str
());
if
(
!
initPause
)
initPause
=
3000
;
...
...
@@ -135,7 +135,7 @@ mbregFromID(false)
ic
->
addReadItem
(
sigc
::
mem_fun
(
this
,
&
MBSlave
::
readItem
)
);
// ********** HEARTBEAT *************
string
heart
=
conf
->
getArgParam
(
"--
mbs
-heartbeat-id"
,
it
.
getProp
(
"heartbeat_id"
));
string
heart
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-heartbeat-id"
,
it
.
getProp
(
"heartbeat_id"
));
if
(
!
heart
.
empty
()
)
{
sidHeartBeat
=
conf
->
getSensorID
(
heart
);
...
...
@@ -153,7 +153,7 @@ mbregFromID(false)
else
ptHeartBeat
.
setTiming
(
UniSetTimer
::
WaitUpTime
);
maxHeartBeat
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-heartbeat-max"
,
it
.
getProp
(
"heartbeat_max"
)).
c_str
());
maxHeartBeat
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-heartbeat-max"
,
it
.
getProp
(
"heartbeat_max"
)).
c_str
());
if
(
maxHeartBeat
<=
0
)
maxHeartBeat
=
10
;
...
...
@@ -177,11 +177,11 @@ mbregFromID(false)
if
(
wait_msec
<
500
)
wait_msec
=
500
;
activateTimeout
=
atoi
(
conf
->
getArgParam
(
"--activate-timeout"
).
c_str
());
activateTimeout
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"-
activate-timeout"
).
c_str
());
if
(
activateTimeout
<=
0
)
activateTimeout
=
20000
;
int
msec
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-timeout"
,
it
.
getProp
(
"timeout"
)).
c_str
());
int
msec
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-timeout"
,
it
.
getProp
(
"timeout"
)).
c_str
());
if
(
msec
<=
0
)
msec
=
3000
;
...
...
@@ -249,7 +249,7 @@ MBSlave::~MBSlave()
void
MBSlave
::
waitSMReady
()
{
// waiting for SM is ready...
int
ready_timeout
=
atoi
(
conf
->
getArgParam
(
"--
mbs
-sm-ready-timeout"
,
"15000"
).
c_str
());
int
ready_timeout
=
atoi
(
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-sm-ready-timeout"
,
"15000"
).
c_str
());
if
(
ready_timeout
==
0
)
ready_timeout
=
15000
;
else
if
(
ready_timeout
<
0
)
...
...
@@ -374,6 +374,13 @@ void MBSlave::processingMessage(UniSetTypes::VoidMessage *msg)
}
break
;
case
Message
:
:
SensorInfo
:
{
SensorMessage
sm
(
msg
);
sensorInfo
(
&
sm
);
}
break
;
default
:
break
;
}
...
...
@@ -478,7 +485,6 @@ void MBSlave::sysCommand(UniSetTypes::SystemMessage *sm)
// ------------------------------------------------------------------------------------------
void
MBSlave
::
askSensors
(
UniversalIO
::
UIOCommand
cmd
)
{
#warning testid
if
(
!
shm
->
waitSMworking
(
test_id
,
activateTimeout
,
50
)
)
{
ostringstream
err
;
...
...
@@ -491,17 +497,19 @@ void MBSlave::askSensors( UniversalIO::UIOCommand cmd )
throw
SystemError
(
err
.
str
());
}
if
(
force
)
return
;
IOMap
::
iterator
it
=
iomap
.
begin
();
for
(
;
it
!=
iomap
.
end
();
++
it
)
{
IOProperty
*
p
(
&
it
->
second
);
if
(
p
->
stype
!=
UniversalIO
::
DigitalOutput
&&
p
->
stype
!=
UniversalIO
::
AnalogOutput
)
continue
;
if
(
p
->
safety
==
NoSafetyState
)
continue
;
// if( p->stype != UniversalIO::DigitalOutput && p->stype != UniversalIO::AnalogOutput )
// continue;
// if( p->safety == NoSafetyState )
// continue;
try
{
shm
->
askSensor
(
p
->
si
.
id
,
cmd
);
...
...
@@ -519,18 +527,17 @@ void MBSlave::sensorInfo( UniSetTypes::SensorMessage* sm )
IOMap
::
iterator
it
=
iomap
.
begin
();
for
(
;
it
!=
iomap
.
end
();
++
it
)
{
if
(
it
->
second
.
stype
!=
UniversalIO
::
DigitalOutput
&&
it
->
second
.
stype
!=
UniversalIO
::
AnalogOutput
)
continue
;
if
(
it
->
second
.
si
.
id
==
sm
->
id
)
{
IOProperty
*
p
(
&
it
->
second
);
if
(
p
->
stype
==
UniversalIO
::
DigitalOutput
)
if
(
p
->
stype
==
UniversalIO
::
DigitalOutput
||
p
->
stype
==
UniversalIO
::
DigitalInput
)
{
uniset_spin_lock
lock
(
p
->
val_lock
);
p
->
value
=
sm
->
state
?
1
:
0
;
}
else
if
(
p
->
stype
==
UniversalIO
::
AnalogOutput
)
else
if
(
p
->
stype
==
UniversalIO
::
AnalogOutput
||
p
->
stype
==
UniversalIO
::
AnalogInput
)
{
uniset_spin_lock
lock
(
p
->
val_lock
);
p
->
value
=
sm
->
value
;
...
...
@@ -621,45 +628,23 @@ bool MBSlave::initItem( UniXML_iterator& it )
{
IOProperty
p
;
string
sname
(
it
.
getProp
(
"name"
));
ObjectId
sid
=
DefaultObjectId
;
if
(
it
.
getProp
(
"id"
).
empty
()
)
sid
=
conf
->
getSensorID
(
sname
);
else
{
sid
=
UniSetTypes
::
uni_atoi
(
it
.
getProp
(
"id"
).
c_str
());
if
(
sid
<=
0
)
sid
=
DefaultObjectId
;
}
if
(
sid
==
DefaultObjectId
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readItem): (-1) ID : "
<<
sname
<<
endl
;
if
(
!
IOBase
::
initItem
(
static_cast
<
IOBase
*>
(
&
p
),
it
,
shm
,
&
dlog
,
myname
)
)
return
false
;
}
if
(
mbregFromID
)
p
.
mbreg
=
s
id
;
p
.
mbreg
=
p
.
si
.
id
;
else
{
string
r
=
it
.
getProp
(
"mbreg"
);
if
(
r
.
empty
()
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown 'mbreg' for "
<<
sname
<<
endl
;
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(initItem): Unknown 'mbreg' for "
<<
it
.
getProp
(
"name"
)
<<
endl
;
return
false
;
}
p
.
mbreg
=
ModbusRTU
::
str2mbData
(
r
);
}
p
.
si
.
id
=
sid
;
p
.
si
.
node
=
conf
->
getLocalNode
();
p
.
value
=
atoi
(
it
.
getProp
(
"default"
).
c_str
());
p
.
ignore
=
atoi
(
it
.
getProp
(
"ignore"
).
c_str
());
p
.
safety
=
atoi
(
it
.
getProp
(
"safety"
).
c_str
());
p
.
invert
=
atoi
(
it
.
getProp
(
"invert"
).
c_str
());
string
stype
(
it
.
getProp
(
"mb_iotype"
)
);
if
(
stype
.
empty
()
)
stype
=
it
.
getProp
(
"iotype"
);
...
...
@@ -705,30 +690,6 @@ bool MBSlave::initItem( UniXML_iterator& it )
}
}
p
.
cal
.
minRaw
=
0
;
p
.
cal
.
maxRaw
=
0
;
p
.
cal
.
minCal
=
0
;
p
.
cal
.
maxCal
=
0
;
p
.
cal
.
sensibility
=
0
;
p
.
cal
.
precision
=
0
;
p
.
cdiagram
=
0
;
if
(
p
.
stype
==
UniversalIO
::
AnalogInput
||
p
.
stype
==
UniversalIO
::
AnalogOutput
)
{
p
.
cal
.
minRaw
=
atoi
(
it
.
getProp
(
"rmin"
).
c_str
()
);
p
.
cal
.
maxRaw
=
atoi
(
it
.
getProp
(
"rmax"
).
c_str
()
);
p
.
cal
.
minCal
=
atoi
(
it
.
getProp
(
"cmin"
).
c_str
()
);
p
.
cal
.
maxCal
=
atoi
(
it
.
getProp
(
"cmax"
).
c_str
()
);
p
.
cal
.
sensibility
=
atoi
(
it
.
getProp
(
"sensibility"
).
c_str
()
);
p
.
cal
.
precision
=
atoi
(
it
.
getProp
(
"precision"
).
c_str
()
);
std
::
string
caldiagram
(
it
.
getProp
(
"caldiagram"
)
);
if
(
!
caldiagram
.
empty
()
)
p
.
cdiagram
=
buildCalibrationDiagram
(
caldiagram
);
}
shm
->
initAIterator
(
p
.
ait
);
shm
->
initDIterator
(
p
.
dit
);
iomap
[
p
.
mbreg
]
=
p
;
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
...
...
@@ -751,29 +712,31 @@ void MBSlave::initIterators()
// -----------------------------------------------------------------------------
void
MBSlave
::
help_print
(
int
argc
,
char
*
argv
[]
)
{
cout
<<
"--mbs-heartbeat-id - heartbeat-."
<<
endl
;
cout
<<
"--mbs-heartbeat-max - heartbeat-ޣ . 10."
<<
endl
;
cout
<<
"--mbs-ready-timeout - SM , . (-1 - '')"
<<
endl
;
cout
<<
"--mbs-initPause - ( )"
<<
endl
;
cout
<<
"--mbs-notRespondSensor - "
<<
endl
;
cout
<<
"--mbs-sm-ready-timeout - SM"
<<
endl
;
cout
<<
"--mbs-recv-timeout - ."
<<
endl
;
cout
<<
"--mbs-allow-setdatetime - On set date and time (0x50) modbus function"
<<
endl
;
cout
<<
"--mbs-my-addr - "
<<
endl
;
cout
<<
"--mbs-type [RTU|TCP] - modbus server type."
<<
endl
;
cout
<<
"Default: prefix='mbtcp'"
<<
endl
;
cout
<<
"--prefix-heartbeat-id - heartbeat-."
<<
endl
;
cout
<<
"--prefix-heartbeat-max - heartbeat-ޣ . 10."
<<
endl
;
cout
<<
"--prefix-ready-timeout - SM , . (-1 - '')"
<<
endl
;
cout
<<
"--prefix-initPause - ( )"
<<
endl
;
cout
<<
"--prefix-notRespondSensor - "
<<
endl
;
cout
<<
"--prefix-sm-ready-timeout - SM"
<<
endl
;
cout
<<
"--prefix-recv-timeout - ."
<<
endl
;
cout
<<
"--prefix-allow-setdatetime - On set date and time (0x50) modbus function"
<<
endl
;
cout
<<
"--prefix-my-addr - "
<<
endl
;
cout
<<
"--prefix-type [RTU|TCP] - modbus server type."
<<
endl
;
cout
<<
" RTU: "
<<
endl
;
cout
<<
"--
mbs
-dev devname - "
<<
endl
;
cout
<<
"--
mbs
-speed - (9600,19920,38400,57600,115200)."
<<
endl
;
cout
<<
"--
prefix
-dev devname - "
<<
endl
;
cout
<<
"--
prefix
-speed - (9600,19920,38400,57600,115200)."
<<
endl
;
cout
<<
" TCP: "
<<
endl
;
cout
<<
"--
mbs
-inet-addr [xxx.xxx.xxx.xxx | hostname ] - this modbus server address"
<<
endl
;
cout
<<
"--
mbs
-inet-port num - this modbus server port. Default: 502"
<<
endl
;
cout
<<
"--
prefix
-inet-addr [xxx.xxx.xxx.xxx | hostname ] - this modbus server address"
<<
endl
;
cout
<<
"--
prefix
-inet-port num - this modbus server port. Default: 502"
<<
endl
;
}
// -----------------------------------------------------------------------------
MBSlave
*
MBSlave
::
init_mbslave
(
int
argc
,
char
*
argv
[],
UniSetTypes
::
ObjectId
icID
,
SharedMemory
*
ic
)
MBSlave
*
MBSlave
::
init_mbslave
(
int
argc
,
char
*
argv
[],
UniSetTypes
::
ObjectId
icID
,
SharedMemory
*
ic
,
string
prefix
)
{
string
name
=
conf
->
getArgParam
(
"--
mbs
-name"
,
"MBSlave1"
);
string
name
=
conf
->
getArgParam
(
"--
"
+
prefix
+
"
-name"
,
"MBSlave1"
);
if
(
name
.
empty
()
)
{
cerr
<<
"(mbslave): name'"
<<
endl
;
...
...
@@ -1001,7 +964,7 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg,
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
{
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(read): read mbID="
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(rea
l_rea
d): read mbID="
<<
ModbusRTU
::
dat2str
(
reg
)
<<
endl
;
}
...
...
@@ -1033,29 +996,29 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg,
}
catch
(
UniSetTypes
::
NameNotFound
&
ex
)
{
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(read): "
<<
ex
<<
endl
;
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(rea
l_rea
d): "
<<
ex
<<
endl
;
return
ModbusRTU
::
erBadDataAddress
;
}
catch
(
UniSetTypes
::
OutOfRange
&
ex
)
{
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(read): "
<<
ex
<<
endl
;
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(rea
l_rea
d): "
<<
ex
<<
endl
;
return
ModbusRTU
::
erBadDataValue
;
}
catch
(
Exception
&
ex
)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(read): "
<<
ex
<<
endl
;
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(rea
l_rea
d): "
<<
ex
<<
endl
;
}
catch
(
CORBA
::
SystemException
&
ex
)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(rea
d):
ORBA::SystemException: "
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(rea
l_read): C
ORBA::SystemException: "
<<
ex
.
NP_minorString
()
<<
endl
;
}
catch
(...)
{
if
(
pingOK
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(read) catch ..."
<<
endl
;
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(rea
l_rea
d) catch ..."
<<
endl
;
}
pingOK
=
false
;
...
...
extentions/ModbusSlave/MBSlave.h
View file @
a2756ef7
...
...
@@ -13,7 +13,6 @@
#include "PassiveTimer.h"
#include "Trigger.h"
#include "Mutex.h"
#include "Calibration.h"
#include "SMInterface.h"
#include "SharedMemory.h"
#include "IOBase.h"
...
...
@@ -23,12 +22,13 @@ class MBSlave:
public
UniSetObject_LT
{
public
:
MBSlave
(
UniSetTypes
::
ObjectId
objId
,
UniSetTypes
::
ObjectId
shmID
,
SharedMemory
*
ic
=
0
);
MBSlave
(
UniSetTypes
::
ObjectId
objId
,
UniSetTypes
::
ObjectId
shmID
,
SharedMemory
*
ic
=
0
,
std
::
string
prefix
=
"mbs"
);
virtual
~
MBSlave
();
/*! */
static
MBSlave
*
init_mbslave
(
int
argc
,
char
*
argv
[],
UniSetTypes
::
ObjectId
shmID
,
SharedMemory
*
ic
=
0
);
UniSetTypes
::
ObjectId
shmID
,
SharedMemory
*
ic
=
0
,
std
::
string
prefix
=
"mbs"
);
/*! help- */
static
void
help_print
(
int
argc
,
char
*
argv
[]
);
...
...
@@ -172,12 +172,12 @@ class MBSlave:
bool
pingOK
;
int
wait_msec
;
bool
force
;
/*!< , SM, */
bool
force_out
;
/*!< , */
bool
mbregFromID
;
typedef
std
::
map
<
int
,
std
::
string
>
FileList
;
FileList
flist
;
std
::
string
prefix
;
};
// -----------------------------------------------------------------------------
#endif // _MBSlave_H_
...
...
extentions/ModbusSlave/start_tcp_fg.sh
View file @
a2756ef7
#!/bin/sh
uniset-start.sh
-f
./uniset-mbslave
--mbs-name
MBSlave1
--confile
test.xml
--dlog-add-levels
info,crit,warn
\
--mbs-type
TCP
--mbs-inet-addr
127.0.0.2
--mbs-inet-port
2048
--mbs-reg-from-id
1
\ No newline at end of file
--mbs-type
TCP
--mbs-inet-addr
127.0.0.1
--mbs-inet-port
2048
\
--mbs-filter-field
rs
--mbs-filter-value
1
# --mbs-force 1
#--mbs-reg-from-id 1 \
\ No newline at end of file
extentions/lib/IOBase.cc
View file @
a2756ef7
...
...
@@ -252,18 +252,20 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
{
string
sname
(
it
.
getProp
(
"name"
)
);
ObjectId
sid
=
UniSetTypes
::
uni_atoi
(
it
.
getProp
(
"id"
).
c_str
());
if
(
sid
<=
0
)
ObjectId
sid
=
DefaultObjectId
;
if
(
it
.
getProp
(
"id"
).
empty
()
)
sid
=
conf
->
getSensorID
(
sname
);
else
{
if
(
dlog
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readItem): ID : "
<<
sname
<<
endl
;
return
false
;
sid
=
UniSetTypes
::
uni_atoi
(
it
.
getProp
(
"id"
).
c_str
());
if
(
sid
<=
0
)
sid
=
DefaultObjectId
;
}
if
(
sid
==
DefaultObjectId
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readItem): (-1) ID : "
if
(
dlog
)
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(readItem): (-1) ID : "
<<
sname
<<
endl
;
return
false
;
}
...
...
extentions/lib/SMInterface.cc
View file @
a2756ef7
...
...
@@ -439,16 +439,16 @@ void SMInterface::initAIterator( IOController::AIOStateList::iterator& it )
{
if
(
ic
)
it
=
ic
->
aioEnd
();
else
cerr
<<
"(SMInterface::initAIterator): ic=NULL"
<<
endl
;
//
else
//
cerr << "(SMInterface::initAIterator): ic=NULL" << endl;
}
// --------------------------------------------------------------------------
void
SMInterface
::
initDIterator
(
IOController
::
DIOStateList
::
iterator
&
it
)
{
if
(
ic
)
it
=
ic
->
dioEnd
();
else
cerr
<<
"(SMInterface::initDIterator): ic=NULL"
<<
endl
;
// else
//
cerr << "(SMInterface::initDIterator): ic=NULL" << endl;
}
// --------------------------------------------------------------------------
bool
SMInterface
::
waitSMready
(
int
ready_timeout
,
int
pmsec
)
...
...
include/modbus/ModbusTCPMaster.h
View file @
a2756ef7
...
...
@@ -24,6 +24,8 @@ class ModbusTCPMaster:
bool
isConnection
();
protected
:
void
reconnect
();
virtual
int
getNextData
(
unsigned
char
*
buf
,
int
len
);
virtual
void
setChannelTimeout
(
int
msec
);
...
...
@@ -35,6 +37,8 @@ class ModbusTCPMaster:
ost
::
TCPStream
*
tcp
;
static
int
nTransaction
;
std
::
queue
<
unsigned
char
>
qrecv
;
PassiveTimer
ptTimeout
;
std
::
string
iaddr
;
};
// -------------------------------------------------------------------------
#endif // ModbusTCPMaster_H_
...
...
src/Communications/Modbus/ModbusTCPMaster.cc
View file @
a2756ef7
...
...
@@ -13,7 +13,8 @@ using namespace ModbusRTU;
using
namespace
UniSetTypes
;
// -------------------------------------------------------------------------
ModbusTCPMaster
::
ModbusTCPMaster
()
:
tcp
(
0
)
tcp
(
0
),
iaddr
(
""
)
{
setCRCNoCheckit
(
true
);
}
...
...
@@ -46,13 +47,16 @@ int ModbusTCPMaster::nTransaction = 0;
mbErrCode
ModbusTCPMaster
::
query
(
ModbusAddr
addr
,
ModbusMessage
&
msg
,
ModbusMessage
&
reply
,
int
timeout
)
{
if
(
!
isConnection
()
)
// if( !isConnection() )
if
(
iaddr
.
empty
()
)
{
dlog
[
Debug
::
WARN
]
<<
"(query): not connection to server..."
<<
endl
;
return
erHardwareError
;
}
PassiveTimer
ptTimeout
;
reconnect
()
;
if
(
timeout
<=
0
||
timeout
==
UniSetTimer
::
WaitUpTime
)
{
...
...
@@ -66,6 +70,9 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
try
{
if
(
nTransaction
>=
numeric_limits
<
int
>::
max
()
)
nTransaction
=
0
;
ModbusTCP
::
MBAPHeader
mh
;
mh
.
tID
=
++
nTransaction
;
mh
.
pID
=
0
;
...
...
@@ -89,7 +96,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
mbErrCode
res
=
send
(
msg
);
if
(
res
!=
erNoError
)
return
res
;
if
(
!
tcp
->
isPending
(
ost
::
Socket
::
pendingOutput
,
timeout
)
)
return
erTimeOut
;
...
...
@@ -159,6 +166,17 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
return
erHardwareError
;
}
// -------------------------------------------------------------------------
void
ModbusTCPMaster
::
reconnect
()
{
if
(
tcp
)
{
tcp
->
disconnect
();
delete
tcp
;
}
tcp
=
new
ost
::
TCPStream
(
iaddr
.
c_str
());
}
// -------------------------------------------------------------------------
void
ModbusTCPMaster
::
connect
(
ost
::
InetAddress
addr
,
int
port
)
{
if
(
!
tcp
)
...
...
@@ -169,7 +187,8 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
dlog
[
Debug
::
INFO
]
<<
"(ModbusTCPMaster): connect to "
<<
s
.
str
()
<<
endl
;
tcp
=
new
ost
::
TCPStream
(
s
.
str
().
c_str
());
iaddr
=
s
.
str
();
tcp
=
new
ost
::
TCPStream
(
iaddr
.
c_str
());
}
}
// -------------------------------------------------------------------------
...
...
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