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
d42fb708
Commit
d42fb708
authored
Feb 11, 2011
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(MBTCPMaster): переписал систему начальной инициализации. Первый вариант.
parent
7d041618
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
165 additions
and
47 deletions
+165
-47
MBTCPMaster.cc
extensions/MBTCPMaster/MBTCPMaster.cc
+139
-42
MBTCPMaster.h
extensions/MBTCPMaster/MBTCPMaster.h
+26
-5
No files found.
extensions/MBTCPMaster/MBTCPMaster.cc
View file @
d42fb708
...
@@ -270,6 +270,7 @@ void MBTCPMaster::poll()
...
@@ -270,6 +270,7 @@ void MBTCPMaster::poll()
it
->
second
->
resp_real
=
false
;
it
->
second
->
resp_real
=
false
;
}
}
updateSM
();
updateSM
();
allInitOK
=
false
;
return
;
return
;
}
}
...
@@ -309,8 +310,12 @@ void MBTCPMaster::poll()
...
@@ -309,8 +310,12 @@ void MBTCPMaster::poll()
// }
// }
// d->resp_real = false;
// d->resp_real = false;
if
(
!
d
->
ask_every_reg
)
if
(
ex
.
err
==
ModbusRTU
::
erTimeOut
&&
!
d
->
ask_every_reg
)
break
;
break
;
// если контроллер хоть что-то ответил, то вроде как связь есть..
if
(
ex
.
err
!=
ModbusRTU
::
erTimeOut
)
d
->
resp_real
=
true
;
}
}
if
(
it
==
d
->
regmap
.
end
()
)
if
(
it
==
d
->
regmap
.
end
()
)
...
@@ -360,7 +365,9 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -360,7 +365,9 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" mbfunc="
<<
p
->
mbfunc
<<
" mbfunc="
<<
p
->
mbfunc
<<
" q_count="
<<
p
->
q_count
<<
" q_count="
<<
p
->
q_count
<<
" mb_init="
<<
p
->
mb_init
<<
" mb_initOK="
<<
p
->
mb_initOK
<<
" sm_initOK="
<<
p
->
sm_initOK
<<
" mbval="
<<
p
->
mbval
<<
endl
;
<<
endl
;
if
(
p
->
q_count
>
ModbusRTU
::
MAXDATALEN
)
if
(
p
->
q_count
>
ModbusRTU
::
MAXDATALEN
)
...
@@ -438,8 +445,13 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -438,8 +445,13 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return
false
;
return
false
;
}
}
if
(
!
p
->
mb_init
)
if
(
!
p
->
sm_initOK
)
{
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
return
true
;
}
// cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
// cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
mbval
);
ModbusRTU
::
WriteSingleOutputRetMessage
ret
=
mb
->
write06
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
mbval
);
...
@@ -448,6 +460,14 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -448,6 +460,14 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnWriteOutputRegisters
:
case
ModbusRTU
:
:
fnWriteOutputRegisters
:
{
{
if
(
!
p
->
sm_initOK
)
{
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
}
ModbusRTU
::
WriteOutputMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
ModbusRTU
::
WriteOutputMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
msg
.
addData
(
it
->
second
->
mbval
);
msg
.
addData
(
it
->
second
->
mbval
);
...
@@ -465,9 +485,13 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -465,9 +485,13 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
<<
" IGNORE FORCE SINGLE COIL (0x05) q_count="
<<
p
->
q_count
<<
" ..."
<<
endl
;
<<
" IGNORE FORCE SINGLE COIL (0x05) q_count="
<<
p
->
q_count
<<
" ..."
<<
endl
;
return
false
;
return
false
;
}
}
if
(
!
p
->
sm_initOK
)
if
(
!
p
->
mb_init
)
{
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
return
true
;
return
true
;
}
// cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
// cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
->
write05
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
mbval
);
ModbusRTU
::
ForceSingleCoilRetMessage
ret
=
mb
->
write05
(
dev
->
mbaddr
,
p
->
mbreg
,
p
->
mbval
);
...
@@ -476,22 +500,14 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
...
@@ -476,22 +500,14 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case
ModbusRTU
:
:
fnForceMultipleCoils
:
case
ModbusRTU
:
:
fnForceMultipleCoils
:
{
{
#if 0
if
(
!
p
->
sm_initOK
)
if( !p->mb_init )
{
// every register ask... (for mb_init_mbreg no some)
for( int i=0; i<p->q_count; i++,it++ )
{
{
ModbusRTU::ReadInputStatusRetMessage ret1 = mb->read02(dev->mbaddr,it->second->mb_init_mbreg,1);
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
ModbusRTU::DataBits b(ret1.data[0]);
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(pollRTU): mbreg="
<<
ModbusRTU
::
dat2str
(
p
->
mbreg
)
it->second->mbval = b[0] ? 1 : 0;
<<
" IGNORE...(sm_initOK=false)"
<<
endl
;
it->second->sm_init = true;
}
p->sm_init = true;
it--;
return
true
;
return
true
;
}
}
#endif
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
ModbusRTU
::
ForceCoilsMessage
msg
(
dev
->
mbaddr
,
p
->
mbreg
);
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
for
(
int
i
=
0
;
i
<
p
->
q_count
;
i
++
,
it
++
)
msg
.
addBit
(
(
it
->
second
->
mbval
?
true
:
false
)
);
msg
.
addBit
(
(
it
->
second
->
mbval
?
true
:
false
)
);
...
@@ -521,9 +537,25 @@ void MBTCPMaster::firstInitRegisters()
...
@@ -521,9 +537,25 @@ void MBTCPMaster::firstInitRegisters()
allInitOK
=
true
;
allInitOK
=
true
;
for
(
InitList
::
iterator
it
=
initRegList
.
begin
();
it
!=
initRegList
.
end
();
++
it
)
for
(
InitList
::
iterator
it
=
initRegList
.
begin
();
it
!=
initRegList
.
end
();
++
it
)
{
{
try
{
it
->
initOK
=
preInitRead
(
it
);
it
->
initOK
=
preInitRead
(
it
);
allInitOK
=
it
->
initOK
;
allInitOK
=
it
->
initOK
;
}
}
catch
(
ModbusRTU
::
mbException
&
ex
)
{
allInitOK
=
false
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(preInitRead): FAILED ask addr="
<<
ModbusRTU
::
addr2str
(
it
->
dev
->
mbaddr
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
it
->
mbreg
)
<<
" err: "
<<
ex
<<
endl
;
}
if
(
!
it
->
dev
->
ask_every_reg
)
break
;
}
}
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
bool
MBTCPMaster
::
preInitRead
(
InitList
::
iterator
&
p
)
bool
MBTCPMaster
::
preInitRead
(
InitList
::
iterator
&
p
)
...
@@ -608,8 +640,13 @@ bool MBTCPMaster::preInitRead( InitList::iterator& p )
...
@@ -608,8 +640,13 @@ bool MBTCPMaster::preInitRead( InitList::iterator& p )
if
(
p
->
initOK
)
if
(
p
->
initOK
)
{
{
p
->
ri
->
mb_init
=
true
;
p
->
ri
->
mb_initOK
=
true
;
p
->
ri
->
sm_init
=
true
;
p
->
ri
->
sm_initOK
=
false
;
bool
f_out
=
force_out
;
// выставляем флаг принудительного обновления
force_out
=
true
;
updateRTU
(
p
->
ri
->
rit
);
force_out
=
f_out
;
}
}
return
p
->
initOK
;
return
p
->
initOK
;
...
@@ -618,7 +655,6 @@ bool MBTCPMaster::preInitRead( InitList::iterator& p )
...
@@ -618,7 +655,6 @@ bool MBTCPMaster::preInitRead( InitList::iterator& p )
bool
MBTCPMaster
::
initSMValue
(
ModbusRTU
::
ModbusData
*
data
,
int
count
,
RSProperty
*
p
)
bool
MBTCPMaster
::
initSMValue
(
ModbusRTU
::
ModbusData
*
data
,
int
count
,
RSProperty
*
p
)
{
{
using
namespace
ModbusRTU
;
using
namespace
ModbusRTU
;
try
try
{
{
if
(
p
->
vType
==
VTypes
::
vtUnknown
)
if
(
p
->
vType
==
VTypes
::
vtUnknown
)
...
@@ -1066,14 +1102,14 @@ void MBTCPMaster::sensorInfo( UniSetTypes::SensorMessage* sm )
...
@@ -1066,14 +1102,14 @@ void MBTCPMaster::sensorInfo( UniSetTypes::SensorMessage* sm )
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(sensorInfo): si.id="
<<
sm
->
id
dlog
[
Debug
::
INFO
]
<<
myname
<<
"(sensorInfo): si.id="
<<
sm
->
id
<<
" reg="
<<
ModbusRTU
::
dat2str
(
i
->
reg
->
mbreg
)
<<
" reg="
<<
ModbusRTU
::
dat2str
(
i
->
reg
->
mbreg
)
<<
" val="
<<
sm
->
value
<<
" val="
<<
sm
->
value
<<
" mb_init
="
<<
i
->
reg
->
mb_init
<<
endl
;
<<
" mb_init
OK="
<<
i
->
reg
->
mb_initOK
<<
endl
;
}
}
if
(
!
i
->
reg
->
mb_init
)
if
(
!
i
->
reg
->
mb_init
OK
)
continue
;
continue
;
i
->
value
=
sm
->
value
;
i
->
value
=
sm
->
value
;
updateRSProperty
(
&
(
*
i
),
true
);
updateRSProperty
(
&
(
*
i
),
true
);
return
;
return
;
}
}
}
}
...
@@ -1377,7 +1413,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
...
@@ -1377,7 +1413,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
{
{
r
->
dev
=
dev
;
r
->
dev
=
dev
;
r
->
mbval
=
it
.
getIntProp
(
"default"
);
r
->
mbval
=
it
.
getIntProp
(
"default"
);
r
->
mb_init
=
it
.
getIntProp
(
"tcp_mbinit"
);
if
(
dev
->
dtype
==
MBTCPMaster
::
dtRTU
)
if
(
dev
->
dtype
==
MBTCPMaster
::
dtRTU
)
{
{
...
@@ -1572,7 +1607,20 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
...
@@ -1572,7 +1607,20 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
return
false
;
return
false
;
}
}
}
}
// Раз это регистр для записи, то как минимум надо сперва
// инициализировать значением из SM
ri
->
sm_initOK
=
it
.
getIntProp
(
"tcp_sm_initOK"
);
ri
->
mb_initOK
=
true
;
// может быть переопределён если будет указан tcp_preinit="1" (см. ниже)
}
}
else
{
// Если это регистр для чтения, то сразу можно работать
// инициализировать не надо
ri
->
mb_initOK
=
true
;
ri
->
sm_initOK
=
true
;
}
RSProperty
*
p1
=
addProp
(
ri
->
slst
,
p
);
RSProperty
*
p1
=
addProp
(
ri
->
slst
,
p
);
if
(
!
p1
)
if
(
!
p1
)
...
@@ -1643,11 +1691,8 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
...
@@ -1643,11 +1691,8 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
}
}
initRegList
.
push_back
(
ii
);
initRegList
.
push_back
(
ii
);
}
ri
->
mb_initOK
=
false
;
else
ri
->
sm_initOK
=
false
;
{
ri
->
mb_init
=
true
;
ri
->
sm_init
=
true
;
}
}
return
true
;
return
true
;
...
@@ -1949,8 +1994,6 @@ void MBTCPMaster::updateRTU( RegMap::iterator& rit )
...
@@ -1949,8 +1994,6 @@ void MBTCPMaster::updateRTU( RegMap::iterator& rit )
for
(
PList
::
iterator
it
=
r
->
slst
.
begin
();
it
!=
r
->
slst
.
end
();
++
it
)
for
(
PList
::
iterator
it
=
r
->
slst
.
begin
();
it
!=
r
->
slst
.
end
();
++
it
)
updateRSProperty
(
&
(
*
it
),
false
);
updateRSProperty
(
&
(
*
it
),
false
);
if
(
r
->
sm_init
)
r
->
mb_init
=
true
;
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
updateRSProperty
(
RSProperty
*
p
,
bool
write_only
)
void
MBTCPMaster
::
updateRSProperty
(
RSProperty
*
p
,
bool
write_only
)
...
@@ -1963,6 +2006,11 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -1963,6 +2006,11 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
if
(
!
save
&&
write_only
)
if
(
!
save
&&
write_only
)
return
;
return
;
// если требуется инициализация и она ещё не произведена,
// то игнорируем
if
(
save
&&
!
r
->
mb_initOK
)
return
;
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
if
(
dlog
.
debugging
(
Debug
::
LEVEL3
)
)
dlog
[
Debug
::
LEVEL3
]
<<
"updateP: sid="
<<
p
->
si
.
id
dlog
[
Debug
::
LEVEL3
]
<<
"updateP: sid="
<<
p
->
si
.
id
<<
" mbval="
<<
r
->
mbval
<<
" mbval="
<<
r
->
mbval
...
@@ -1971,7 +2019,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -1971,7 +2019,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
<<
" nbit="
<<
p
->
nbit
<<
" nbit="
<<
p
->
nbit
<<
" save="
<<
save
<<
" save="
<<
save
<<
" ioype="
<<
p
->
stype
<<
" ioype="
<<
p
->
stype
<<
" mb_init="
<<
r
->
mb_init
<<
" mb_initOK="
<<
r
->
mb_initOK
<<
" sm_initOK="
<<
r
->
sm_initOK
<<
endl
;
<<
endl
;
try
try
...
@@ -1981,11 +2030,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -1981,11 +2030,15 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
ModbusRTU
::
DataBits16
b
(
r
->
mbval
);
ModbusRTU
::
DataBits16
b
(
r
->
mbval
);
if
(
p
->
nbit
>=
0
)
if
(
p
->
nbit
>=
0
)
{
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
bool
set
=
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
bool
set
=
IOBase
::
processingAsDO
(
p
,
shm
,
force_out
);
b
.
set
(
p
->
nbit
,
set
);
b
.
set
(
p
->
nbit
,
set
);
r
->
mbval
=
b
.
mdata
();
r
->
mbval
=
b
.
mdata
();
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -1998,7 +2051,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -1998,7 +2051,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
if
(
p
->
rnum
<=
1
)
if
(
p
->
rnum
<=
1
)
{
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
p
->
stype
==
UniversalIO
::
DigitalOutput
)
...
@@ -2007,6 +2062,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2007,6 +2062,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
}
else
else
r
->
mbval
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
mbval
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2018,6 +2076,7 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2018,6 +2076,7 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
else
IOBase
::
processingAsAI
(
p
,
(
signed
short
)(
r
->
mbval
),
shm
,
force
);
IOBase
::
processingAsAI
(
p
,
(
signed
short
)(
r
->
mbval
),
shm
,
force
);
}
}
return
;
return
;
}
}
...
@@ -2027,7 +2086,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2027,7 +2086,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
}
else
if
(
p
->
vType
==
VTypes
::
vtSigned
)
else
if
(
p
->
vType
==
VTypes
::
vtSigned
)
{
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
p
->
stype
==
UniversalIO
::
DigitalOutput
)
...
@@ -2036,6 +2097,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2036,6 +2097,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
}
else
else
r
->
mbval
=
(
signed
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
mbval
=
(
signed
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2053,7 +2117,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2053,7 +2117,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
}
else
if
(
p
->
vType
==
VTypes
::
vtUnsigned
)
else
if
(
p
->
vType
==
VTypes
::
vtUnsigned
)
{
{
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
if
(
p
->
stype
==
UniversalIO
::
DigitalInput
||
p
->
stype
==
UniversalIO
::
DigitalOutput
)
p
->
stype
==
UniversalIO
::
DigitalOutput
)
...
@@ -2062,6 +2128,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2062,6 +2128,9 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
}
}
else
else
r
->
mbval
=
(
unsigned
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
mbval
=
(
unsigned
short
)
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2086,12 +2155,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2086,12 +2155,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
return
;
return
;
}
}
if
(
save
&&
r
->
mb_init
)
if
(
save
&&
r
->
sm_initOK
)
{
if
(
r
->
mb_initOK
)
{
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
Byte
b
(
r
->
mbval
);
VTypes
::
Byte
b
(
r
->
mbval
);
b
.
raw
.
b
[
p
->
nbyte
-
1
]
=
v
;
b
.
raw
.
b
[
p
->
nbyte
-
1
]
=
v
;
r
->
mbval
=
b
.
raw
.
w
;
r
->
mbval
=
b
.
raw
.
w
;
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2104,12 +2177,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2104,12 +2177,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtF2
)
else
if
(
p
->
vType
==
VTypes
::
vtF2
)
{
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
VTypes
::
F2
f2
(
f
);
VTypes
::
F2
f2
(
f
);
for
(
int
k
=
0
;
k
<
VTypes
::
F2
::
wsize
();
k
++
,
i
++
)
for
(
int
k
=
0
;
k
<
VTypes
::
F2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f2
.
raw
.
v
[
k
];
i
->
second
->
mbval
=
f2
.
raw
.
v
[
k
];
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2126,13 +2204,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2126,13 +2204,16 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtF4
)
else
if
(
p
->
vType
==
VTypes
::
vtF4
)
{
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
float
f
=
IOBase
::
processingFasAO
(
p
,
shm
,
force_out
);
VTypes
::
F4
f4
(
f
);
VTypes
::
F4
f4
(
f
);
for
(
int
k
=
0
;
k
<
VTypes
::
F4
::
wsize
();
k
++
,
i
++
)
for
(
int
k
=
0
;
k
<
VTypes
::
F4
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
f4
.
raw
.
v
[
k
];
i
->
second
->
mbval
=
f4
.
raw
.
v
[
k
];
}
}
}
else
else
{
{
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
VTypes
::
F4
::
wsize
()];
ModbusRTU
::
ModbusData
*
data
=
new
ModbusRTU
::
ModbusData
[
VTypes
::
F4
::
wsize
()];
...
@@ -2148,12 +2229,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2148,12 +2229,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtI2
)
else
if
(
p
->
vType
==
VTypes
::
vtI2
)
{
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
I2
i2
(
v
);
VTypes
::
I2
i2
(
v
);
for
(
int
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
for
(
int
k
=
0
;
k
<
VTypes
::
I2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
i2
.
raw
.
v
[
k
];
i
->
second
->
mbval
=
i2
.
raw
.
v
[
k
];
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2170,12 +2256,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2170,12 +2256,17 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
else
if
(
p
->
vType
==
VTypes
::
vtU2
)
else
if
(
p
->
vType
==
VTypes
::
vtU2
)
{
{
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
RegMap
::
iterator
i
(
p
->
reg
->
rit
);
if
(
save
&&
r
->
mb_init
)
if
(
save
)
{
if
(
r
->
mb_initOK
)
{
{
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
long
v
=
IOBase
::
processingAsAO
(
p
,
shm
,
force_out
);
VTypes
::
U2
u2
(
v
);
VTypes
::
U2
u2
(
v
);
for
(
int
k
=
0
;
k
<
VTypes
::
U2
::
wsize
();
k
++
,
i
++
)
for
(
int
k
=
0
;
k
<
VTypes
::
U2
::
wsize
();
k
++
,
i
++
)
i
->
second
->
mbval
=
u2
.
raw
.
v
[
k
];
i
->
second
->
mbval
=
u2
.
raw
.
v
[
k
];
r
->
sm_initOK
=
true
;
}
}
}
else
else
{
{
...
@@ -2189,6 +2280,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2189,6 +2280,8 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
IOBase
::
processingAsAI
(
p
,
(
unsigned
int
)
u2
,
shm
,
force
);
IOBase
::
processingAsAI
(
p
,
(
unsigned
int
)
u2
,
shm
,
force
);
}
}
}
}
return
;
}
}
catch
(
IOController_i
::
NameNotFound
&
ex
)
catch
(
IOController_i
::
NameNotFound
&
ex
)
{
{
...
@@ -2215,6 +2308,10 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
...
@@ -2215,6 +2308,10 @@ void MBTCPMaster::updateRSProperty( RSProperty* p, bool write_only )
{
{
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(updateRSProperty): catch ..."
<<
endl
;
dlog
[
Debug
::
LEVEL3
]
<<
myname
<<
"(updateRSProperty): catch ..."
<<
endl
;
}
}
// Если SM стала (или была) недоступна
// то флаг инициализации надо сбросить
r
->
sm_initOK
=
false
;
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void
MBTCPMaster
::
updateMTR
(
RegMap
::
iterator
&
rit
)
void
MBTCPMaster
::
updateMTR
(
RegMap
::
iterator
&
rit
)
...
...
extensions/MBTCPMaster/MBTCPMaster.h
View file @
d42fb708
...
@@ -137,7 +137,7 @@
...
@@ -137,7 +137,7 @@
Помимо этого можно задавать следующие параметры:
Помимо этого можно задавать следующие параметры:
- \b tcp_vtype - тип переменной. см VTypes::VType.
- \b tcp_vtype - тип переменной. см VTypes::VType.
- \b tcp_rawdata - [
1|0
] - игнорировать или нет параметры калибровки
- \b tcp_rawdata - [
0|1
] - игнорировать или нет параметры калибровки
- \b tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- \b tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется
- \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется
функция читающая слова (03
функция читающая слова (03
...
@@ -145,6 +145,20 @@
...
@@ -145,6 +145,20 @@
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
- \b tcp_init_mbfunc - Номер функции для инициализации. Если не указана, будет определена автоматически исходя из tcp_mbfunc.
- \b tcp_init_mbreg - Номер регистра откуда считывать значение для инициализации. Если это поле не указано используется tcp_mbreg.
Если указано tcp_preinit="1", то прежде чем начать писать регистр в устройство, будет произведено его чтение.
По умолчанию все "записываемые" регистры инициализируются значением из SM. Т.е. пока не будет первый раз считано значение из SM,
регистры в устройство писатся не будут. Чтобы отключить это поведение, можно указать параметр
- \b tcp_sm_initOK - [0|1] Игнорировать начальную инициализацию из SM (сразу писать в устройство)
При этом будет записывыться значение "default".
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte.
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbit или \a nbyte.
*/
*/
...
@@ -222,7 +236,7 @@ class MBTCPMaster:
...
@@ -222,7 +236,7 @@ class MBTCPMaster:
RegInfo
()
:
RegInfo
()
:
mbval
(
0
),
mbreg
(
0
),
mbfunc
(
ModbusRTU
::
fnUnknown
),
mbval
(
0
),
mbreg
(
0
),
mbfunc
(
ModbusRTU
::
fnUnknown
),
id
(
0
),
dev
(
0
),
mtrType
(
MTR
::
mtUnknown
),
id
(
0
),
dev
(
0
),
mtrType
(
MTR
::
mtUnknown
),
q_num
(
0
),
q_count
(
1
),
sm_init
(
false
),
mb_init
(
fals
e
)
q_num
(
0
),
q_count
(
1
),
mb_initOK
(
true
),
sm_initOK
(
tru
e
)
{}
{}
ModbusRTU
::
ModbusData
mbval
;
ModbusRTU
::
ModbusData
mbval
;
...
@@ -242,9 +256,16 @@ class MBTCPMaster:
...
@@ -242,9 +256,16 @@ class MBTCPMaster:
RegMap
::
iterator
rit
;
RegMap
::
iterator
rit
;
// начальная инициалиазция
// начальная инициалиазция для "записываемых" регистров
bool
sm_init
;
/*!< инициализировалось ли значение в SM */
// Механизм:
bool
mb_init
;
/*!< инициализировалось ли в обмене */
// Если tcp_preinit="1", то сперва будет сделано чтение значения из устройства.
// при этом флаг mb_init=false пока не пройдёт успешной инициализации
// Если tcp_preinit="0", то флаг mb_init сразу выставляется в true.
bool
mb_initOK
;
/*!< инициализировалось ли значение из устройства */
// Флаг sm_init означает, что писать в устройство нельзя, т.к. значение в "карте регистров"
// ещё не инициализировано из SM
bool
sm_initOK
;
/*!< инициализировалось ли значение из SM */
};
};
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
RegInfo
&
r
);
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
RegInfo
&
r
);
...
...
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