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
f47ec246
Commit
f47ec246
authored
Jun 11, 2009
by
Pavel Vaynerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
01,02,05,0F
parent
5598a5d2
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
147 additions
and
90 deletions
+147
-90
create_links.sh
Utilities/Admin/create_links.sh
+28
-1
MBSlave.cc
Utilities/MBTester/MBSlave.cc
+9
-39
test.xml
conf/test.xml
+23
-28
RTUExchange.cc
extentions/RTUExchange/RTUExchange.cc
+69
-17
start_fg.sh
extentions/RTUExchange/start_fg.sh
+2
-2
start_fg.sh
extentions/SharedMemory/start_fg.sh
+1
-1
ModbusTypes.h
include/modbus/ModbusTypes.h
+4
-2
ModbusTypes.cc
src/Communications/Modbus/ModbusTypes.cc
+11
-0
No files found.
Utilities/Admin/create_links.sh
View file @
f47ec246
#!/bin/sh
#
ln
-s
-f
admin.sh start
ln
-s
-f
admin.sh exist
ln
-s
-f
admin.sh finish
ln
-s
-f
admin.sh foldUp
ln
-s
-f
admin.sh info
ln
-s
-f
admin.sh alarm
ln
-s
-f
admin.sh create
#ln -s -f admin.sh setState
#ln -s -f admin.sh dbcreate
#ln -s -f admin.sh statistic
#ln -s -f admin.sh database
ln
-s
-f
admin.sh logrotate
ln
-s
-f
admin.sh omap
ln
-s
-f
admin.sh msgmap
ln
-s
-f
admin.sh anotify
ln
-s
-f
admin.sh dnotify
ln
-s
-f
admin.sh saveValue
ln
-s
-f
admin.sh saveState
ln
-s
-f
admin.sh setValue
ln
-s
-f
admin.sh setState
ln
-s
-f
admin.sh getValue
ln
-s
-f
admin.sh getState
ln
-s
-f
admin.sh getRawValue
ln
-s
-f
admin.sh getCalibrate
ln
-s
-f
admin.sh
help
ln
-s
-f
admin.sh oinfo
ln
-s
-f
/usr/bin/uniset-stop.sh stop.sh
ln
-s
-f
../../conf/test.xml test.xml
Utilities/MBTester/MBSlave.cc
View file @
f47ec246
...
...
@@ -108,32 +108,18 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
d
.
b
[
4
]
=
1
;
d
.
b
[
6
]
=
1
;
if
(
query
.
count
<=
1
)
{
if
(
replyVal
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
d
);
return
ModbusRTU
::
erNoError
;
}
// :
int
num
=
0
;
//
ModbusData
reg
=
query
.
start
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
int
bcnt
=
query
.
count
/
ModbusRTU
::
BitsPerByte
;
if
(
(
query
.
count
%
ModbusRTU
::
BitsPerByte
)
>
0
)
bcnt
++
;
for
(
int
i
=
0
;
i
<
bcnt
;
i
++
)
{
if
(
replyVal
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
d
);
}
// , ۣ
// ...
if
(
reply
.
bcnt
<
query
.
count
)
{
cerr
<<
"(readCoilStatus): . "
<<
" "
<<
query
.
count
<<
" "
<<
reply
.
bcnt
<<
endl
;
}
return
ModbusRTU
::
erNoError
;
}
...
...
@@ -149,32 +135,16 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
d
.
b
[
3
]
=
1
;
d
.
b
[
7
]
=
1
;
int
bcnt
=
query
.
count
/
ModbusRTU
::
BitsPerByte
;
if
(
(
query
.
count
%
ModbusRTU
::
BitsPerByte
)
>
0
)
bcnt
++
;
if
(
query
.
count
<=
1
)
for
(
int
i
=
0
;
i
<
bcnt
;
i
++
)
{
if
(
replyVal
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
d
);
return
ModbusRTU
::
erNoError
;
}
// :
int
num
=
0
;
//
ModbusData
reg
=
query
.
start
;
for
(
;
num
<
query
.
count
;
num
++
,
reg
++
)
{
if
(
replyVal
)
reply
.
addData
(
replyVal
);
else
reply
.
addData
(
d
);
}
// , ۣ
// ...
if
(
reply
.
bcnt
<
query
.
count
)
{
cerr
<<
"(readInputStatus): . "
<<
" "
<<
query
.
count
<<
" "
<<
reply
.
bcnt
<<
endl
;
}
return
ModbusRTU
::
erNoError
;
...
...
conf/test.xml
View file @
f47ec246
...
...
@@ -78,66 +78,61 @@
</consumers>
</item>
<item
id=
"
46500
1"
name=
"HC_in"
textname=
"HC_in"
<item
id=
"1"
name=
"HC_in"
textname=
"HC_in"
iotype=
"DI"
character=
"Info"
rs=
"
1"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x3050"
mbfunc=
"0x03
"
>
rs=
"
2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x3000"
mbfunc=
"0x02
"
>
<consumers>
</consumers>
</item>
<item
id=
"
46500
2"
name=
"HC_out"
textname=
"HC_out"
iotype=
"D
O
"
character=
"Info"
rs=
"
1"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x3000"
mbfunc=
"0x06
"
>
<item
id=
"2"
name=
"HC_out"
textname=
"HC_out"
iotype=
"D
I
"
character=
"Info"
rs=
"
2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x3001"
mbfunc=
"0x02
"
>
<consumers>
</consumers>
</item>
<item
id=
"465003"
name=
"connect"
textname=
"connect"
iotype=
"DI"
character=
"Info"
default=
"1"
>
<consumers>
</consumers>
</item>
<item
id=
"465004"
name=
"connect_signal"
textname=
"connect_signal"
iotype=
"AI"
character=
"Info"
>
<item
id=
"3"
name=
"HC_in"
textname=
"HC_in"
iotype=
"DI"
character=
"Info"
rs=
"2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x3000"
mbfunc=
"0x02"
>
<consumers>
</consumers>
</item>
<item
id=
"000001"
name=
"test1"
textname=
"test1"
iotype=
"AI"
character=
"Info"
default=
"1"
>
<consumers>
</consumers>
</item>
<item
id=
"000002"
name=
"test2"
textname=
"test2"
iotype=
"AI"
character=
"Info"
>
<item
id=
"4"
name=
"HC_out"
textname=
"HC_out"
iotype=
"DO"
character=
"Info"
rs=
"2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x301"
mbfunc=
"0x05"
>
<consumers>
</consumers>
</item>
<item
id=
"000003"
name=
"test3"
textname=
"test3"
iotype=
"AI"
character=
"Info"
>
<item
id=
"5"
name=
"HC_in"
textname=
"HC_in"
iotype=
"DI"
character=
"Info"
rs=
"2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x302"
mbfunc=
"0x05"
>
<consumers>
</consumers>
</item>
<item
id=
"000004"
name=
"test4"
textname=
"test4"
iotype=
"DI"
character=
"Info"
>
<item
id=
"6"
name=
"HC_out"
textname=
"HC_out"
iotype=
"DI"
character=
"Info"
rs=
"2"
mbtype=
"rtu"
mbaddr=
"0x02"
mbreg=
"0x304"
mbfunc=
"0x05"
>
<consumers>
</consumers>
</item>
<item
id=
"
000005"
name=
"EU_Mode_AS"
textname=
"
"
iotype=
"AI"
character=
"Info"
default=
"10
"
>
<item
id=
"
465003"
name=
"connect"
textname=
"connect
"
iotype=
"DI"
character=
"Info"
default=
"1
"
>
<consumers>
</consumers>
</item>
<item
id=
"000006"
name=
"No_Signal_S"
textname=
" "
iotype=
"DI"
character=
"Info"
>
<item
id=
"465004"
name=
"connect_signal"
textname=
"connect_signal"
iotype=
"AI"
character=
"Info"
>
<consumers>
</consumers>
</item>
<!-- //************ ****************************- -->
<item
id=
"101"
name=
"valve_K1-1_in"
textname=
"valve_K1-1_in"
...
...
extentions/RTUExchange/RTUExchange.cc
View file @
f47ec246
...
...
@@ -378,8 +378,17 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnReadInputStatus
:
{
ModbusRTU
::
ReadInputStatusRetMessage
ret
=
mb
->
read02
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
q_count
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
it
->
second
->
mbval
=
ret
.
data
[
i
];
int
m
=
0
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
{
// cerr << "(read02): save mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " val=" << (int)(b[k]) << endl;
it
->
second
->
mbval
=
b
[
k
];
}
}
it
--
;
}
break
;
...
...
@@ -387,8 +396,17 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnReadCoilStatus
:
{
ModbusRTU
::
ReadCoilRetMessage
ret
=
mb
->
read01
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
q_count
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
it
->
second
->
mbval
=
ret
.
data
[
i
];
int
m
=
0
;
for
(
int
i
=
0
;
i
<
ret
.
bcnt
;
i
++
)
{
ModbusRTU
::
DataBits
b
(
ret
.
data
[
i
]);
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerByte
&&
m
<
p
->
q_count
;
k
++
,
it
++
,
m
++
)
{
// cerr << "(read01): save mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " val=" << (int)(b[k]) << endl;
it
->
second
->
mbval
=
b
[
k
]
?
1
:
0
;
}
}
it
--
;
}
break
;
...
...
@@ -398,7 +416,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
if
(
p
->
q_count
!=
1
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE WRITE SINGLE REGISTER q_count="
<<
p
->
q_count
<<
" ..."
<<
endl
;
<<
" IGNORE WRITE SINGLE REGISTER
(0x06)
q_count="
<<
p
->
q_count
<<
" ..."
<<
endl
;
return
false
;
}
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
mbval
);
...
...
@@ -415,6 +433,36 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
}
break
;
case
ModbusRTU
:
:
fnForceSingleCoil
:
{
if
(
p
->
q_count
!=
1
)
{
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE FORCE SINGLE COIL (0x05) q_count="
<<
p
->
q_count
<<
" ..."
<<
endl
;
return
false
;
}
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
->
write05
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
,
p
->
mbval
);
}
break
;
case
ModbusRTU
:
:
fnForceMultipleCoils
:
{
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
+
p
->
offset
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
)
{
ModbusRTU
::
DataBits16
d
;
for
(
int
k
=
0
;
k
<
ModbusRTU
::
BitsPerData
&&
i
<
p
->
q_count
;
k
++
,
i
++
,
it
++
)
d
.
set
(
k
,
(
it
->
second
->
mbval
?
true
:
false
)
);
msg
.
addData
(
d
);
}
it
--
;
ModbusRTU
::
ForceCoilsRetMessage
ret
=
mb
->
write0F
(
msg
);
}
break
;
default
:
{
if
(
dlog
.
debugging
(
Debug
::
INFO
)
)
...
...
@@ -1543,6 +1591,16 @@ void RTUExchange::rtuQueryOptimization( RTUDeviceMap& m )
beg
->
second
->
mbfunc
=
ModbusRTU
::
fnWriteOutputRegisters
;
}
else
if
(
beg
->
second
->
q_count
>
1
&&
beg
->
second
->
mbfunc
==
ModbusRTU
::
fnForceSingleCoil
)
{
dlog
[
Debug
::
WARN
]
<<
myname
<<
"(rtuQueryOptimization): "
<<
" optimization change func="
<<
ModbusRTU
::
fnForceSingleCoil
<<
" <--> func="
<<
ModbusRTU
::
fnForceMultipleCoils
<<
" for mbaddr="
<<
ModbusRTU
::
addr2str
(
d
->
mbaddr
)
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
beg
->
second
->
mbreg
);
beg
->
second
->
mbfunc
=
ModbusRTU
::
fnForceMultipleCoils
;
}
if
(
it
==
d
->
regmap
.
end
()
)
break
;
...
...
@@ -1557,9 +1615,7 @@ void RTUExchange::updateRTU( RegMap::iterator& rit )
RegInfo
*
r
(
rit
->
second
);
using
namespace
ModbusRTU
;
bool
save
=
false
;
if
(
r
->
mbfunc
==
fnWriteOutputRegisters
||
r
->
mbfunc
==
fnWriteOutputSingleRegister
)
save
=
true
;
bool
save
=
isWriteFunction
(
r
->
mbfunc
);
// if( !force_out_up && save )
// return;
...
...
@@ -1574,10 +1630,9 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only )
using
namespace
ModbusRTU
;
RegInfo
*
r
(
p
->
reg
->
rit
->
second
);
bool
save
=
false
;
if
(
r
->
mbfunc
==
fnWriteOutputRegisters
||
r
->
mbfunc
==
fnWriteOutputSingleRegister
)
save
=
true
;
else
if
(
write_only
)
bool
save
=
isWriteFunction
(
r
->
mbfunc
);
if
(
!
save
&&
write_only
)
return
;
try
...
...
@@ -1613,7 +1668,6 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only )
dlog
[
Debug
::
CRIT
]
<<
myname
<<
"(updateRSProperty): IGNORE item: rnum="
<<
p
->
rnum
<<
" > 1 ?!! for id="
<<
p
->
si
.
id
<<
endl
;
return
;
}
else
if
(
p
->
vType
==
VTypes
::
vtByte
)
...
...
@@ -1717,9 +1771,7 @@ void RTUExchange::updateMTR( RegMap::iterator& rit )
{
RegInfo
*
r
(
rit
->
second
);
using
namespace
ModbusRTU
;
bool
save
=
false
;
if
(
r
->
mbfunc
==
fnWriteOutputRegisters
||
r
->
mbfunc
==
fnWriteOutputSingleRegister
)
save
=
true
;
bool
save
=
isWriteFunction
(
r
->
mbfunc
);
{
for
(
PList
::
iterator
it
=
r
->
slst
.
begin
();
it
!=
r
->
slst
.
end
();
++
it
)
...
...
@@ -1918,7 +1970,7 @@ void RTUExchange::updateRTU188( RegMap::iterator& it )
using
namespace
ModbusRTU
;
// bool save = false;
if
(
r
->
mbfunc
==
fnWriteOutputRegisters
||
r
->
mbfunc
==
fnWriteOutputSingleRegister
)
if
(
isWriteFunction
(
r
->
mbfunc
)
)
{
// save = true;
cerr
<<
myname
<<
"(updateRTU188): write reg("
<<
dat2str
(
r
->
mbreg
)
<<
") to RTU188 NOT YET!!!"
<<
endl
;
...
...
extentions/RTUExchange/start_fg.sh
View file @
f47ec246
#!/bin/sh
uniset-start.sh
-f
./uniset-rtuexchange
--confile
test.xml
\
--rs-dev
/dev/
ttyS
0
\
--rs-dev
/dev/
cbsideA
0
\
--rs-name
RSExchange
\
--rs-speed
38400
\
--rs-filter-field
rs
\
--rs-filter-value
3
\
--rs-filter-value
2
\
--dlog-add-levels
info,crit,warn
\
--rs-force
0
\
--rs-force-out
0
\
...
...
extentions/SharedMemory/start_fg.sh
View file @
f47ec246
...
...
@@ -3,6 +3,6 @@
ulimit
-Sc
1000000000000
uniset-start.sh
-f
./uniset-smemory
--smemory-id
SharedMemory1
\
--confile
test.xml
--datfile
/etc/AEU/configure
.xml
\
--confile
test.xml
--datfile
test
.xml
\
--unideb-add-levels
info,crit,warn,level9,system
include/modbus/ModbusTypes.h
View file @
f47ec246
...
...
@@ -74,6 +74,8 @@ namespace ModbusRTU
// -------------------------------------------------------------------------
float
dat2f
(
const
ModbusData
dat1
,
const
ModbusData
dat2
);
// -------------------------------------------------------------------------
bool
isWriteFunction
(
SlaveFunctionCode
c
);
// -------------------------------------------------------------------------
/*! */
struct
ModbusHeader
{
...
...
@@ -240,12 +242,12 @@ namespace ModbusRTU
bool
setBit
(
unsigned
char
dnum
,
unsigned
char
bnum
,
bool
state
);
/*! .
* \param
d
num -
* \param
b
num -
* \param d -
* \return TRUE -
* \return FALSE -
*/
bool
getData
(
unsigned
char
d
num
,
DataBits
&
d
);
bool
getData
(
unsigned
char
b
num
,
DataBits
&
d
);
/*! */
void
clear
();
...
...
src/Communications/Modbus/ModbusTypes.cc
View file @
f47ec246
...
...
@@ -155,6 +155,17 @@ ModbusCRC ModbusRTU::checkCRC( ModbusByte* buf, int len )
return
crc
;
}
// -------------------------------------------------------------------------
bool
ModbusRTU
::
isWriteFunction
(
SlaveFunctionCode
c
)
{
if
(
c
==
fnWriteOutputRegisters
||
c
==
fnWriteOutputSingleRegister
||
c
==
fnForceSingleCoil
||
c
==
fnForceMultipleCoils
)
return
true
;
return
false
;
}
// -------------------------------------------------------------------------
std
::
ostream
&
ModbusRTU
::
mbPrintMessage
(
std
::
ostream
&
os
,
ModbusByte
*
m
,
int
len
)
{
// 'os'
...
...
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