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