Commit 28f23413 authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusMaster): исправлена ошибка с начальной инициализацией (setbug #5583)

parent 5c4f397f
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
Name: libuniset Name: libuniset
Version: 1.8 Version: 1.8
Release: alt2.1 Release: alt3
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
License: GPL License: GPL
...@@ -339,6 +339,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -339,6 +339,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%changelog %changelog
* Sun Mar 01 2015 Pavel Vainerman <pv@altlinux.ru> 1.8-alt3
- ModbusMaster: fixed bug in initialization (close setbug #5583)
* Wed Nov 26 2014 Pavel Vainerman <pv@altlinux.ru> 1.8-alt2.1 * Wed Nov 26 2014 Pavel Vainerman <pv@altlinux.ru> 1.8-alt2.1
- update for alt/sisyphus.. - update for alt/sisyphus..
- fixed changelog (save for history): - fixed changelog (save for history):
......
...@@ -215,6 +215,7 @@ ...@@ -215,6 +215,7 @@
<item id="58" iotype="AI" name="SVU_AskCount_AS" textname="svu asl count"/> <item id="58" iotype="AI" name="SVU_AskCount_AS" textname="svu asl count"/>
<item aref="2" card="4" channel="0" id="59" io="1" iotype="AI" name="AI59_S" subdev="2" textname="AI sensor 59" mbaddr="0x01" mbfunc="0x03" mbreg="200" mbtype="rtu" rs="6"/> <item aref="2" card="4" channel="0" id="59" io="1" iotype="AI" name="AI59_S" subdev="2" textname="AI sensor 59" mbaddr="0x01" mbfunc="0x03" mbreg="200" mbtype="rtu" rs="6"/>
<item io="1" hilimit="10" id="60" card="4" inverse="1" iotype="DI" lowlimit="5" name="T60_S" textname="DI 69" threshold_aid="AI59_S"/> <item io="1" hilimit="10" id="60" card="4" inverse="1" iotype="DI" lowlimit="5" name="T60_S" textname="DI 69" threshold_aid="AI59_S"/>
<item id="64" iotype="AI" mbaddr="0x01" mbfunc="0x03" mbreg="64" mbtype="rtu" name="Input64_AS" priority="Medium" rs="5" textname="AI64"/>
</sensors> </sensors>
<thresholds name="thresholds"> <thresholds name="thresholds">
<sensor iotype="AI" name="AI_AS"> <sensor iotype="AI" name="AI_AS">
......
...@@ -322,6 +322,34 @@ void MBExchange::initIterators() ...@@ -322,6 +322,34 @@ void MBExchange::initIterators()
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBExchange::initValues()
{
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{
RTUDevice* d(it1->second);
for( MBExchange::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{
for( PList::iterator it2=it->second->slst.begin();it2!=it->second->slst.end(); ++it2 )
{
if( it2->stype == UniversalIO::DigitalInput || it2->stype == UniversalIO::DigitalOutput )
it2->value = shm->localGetState(it2->dit,it2->si.id);
else if( it2->stype == UniversalIO::AnalogInput || it2->stype == UniversalIO::AnalogOutput )
it2->value = shm->localGetValue(it2->ait,it2->si.id);
}
it->second->sm_initOK = true;
}
}
for( ThresholdList::iterator t=thrlist.begin(); t!=thrlist.end(); ++t )
{
if( t->stype == UniversalIO::DigitalInput || t->stype == UniversalIO::DigitalOutput )
t->value = shm->localGetState(t->dit,t->si.id);
else if( t->stype == UniversalIO::AnalogInput || t->stype == UniversalIO::AnalogOutput )
t->value = shm->localGetValue(t->ait,t->si.id);
}
}
// -----------------------------------------------------------------------------
bool MBExchange::checkUpdateSM( bool wrFunc, long mdev ) bool MBExchange::checkUpdateSM( bool wrFunc, long mdev )
{ {
if( exchangeMode == emSkipExchange || mdev == emSkipExchange ) if( exchangeMode == emSkipExchange || mdev == emSkipExchange )
...@@ -848,6 +876,8 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -848,6 +876,8 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg,p->q_count); ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
p->mb_initOK = true;
it--; it--;
} }
break; break;
...@@ -857,6 +887,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -857,6 +887,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr,p->mbreg,p->q_count); ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr,p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
p->mb_initOK = true;
it--; it--;
} }
break; break;
...@@ -871,6 +902,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -871,6 +902,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ ) for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ )
it->second->mbval = b[k]; it->second->mbval = b[k];
} }
p->mb_initOK = true;
it--; it--;
} }
break; break;
...@@ -885,6 +917,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -885,6 +917,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ ) for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ )
it->second->mbval = b[k] ? 1 : 0; it->second->mbval = b[k] ? 1 : 0;
} }
p->mb_initOK = true;
it--; it--;
} }
break; break;
...@@ -1114,7 +1147,12 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1114,7 +1147,12 @@ void MBExchange::updateRSProperty( RSProperty* p, bool write_only )
// если требуется инициализация и она ещё не произведена, // если требуется инициализация и она ещё не произведена,
// то игнорируем // то игнорируем
if( save && !r->mb_initOK ) // if( save && !r->mb_initOK )
// return;
// если мы ещё не разу не считали значение из устройства, то обновлять в SM
// не нужно!
if( !r->mb_initOK )
return; return;
if( dlog.debugging(Debug::LEVEL3) ) if( dlog.debugging(Debug::LEVEL3) )
...@@ -2227,8 +2265,8 @@ bool MBExchange::initItem( UniXML_iterator& it ) ...@@ -2227,8 +2265,8 @@ bool MBExchange::initItem( UniXML_iterator& it )
{ {
// Если это регистр для чтения, то сразу можно работать // Если это регистр для чтения, то сразу можно работать
// инициализировать не надо // инициализировать не надо
ri->mb_initOK = true; // ri->mb_initOK = true;
ri->sm_initOK = true; // ri->sm_initOK = true;
} }
...@@ -2250,8 +2288,8 @@ bool MBExchange::initItem( UniXML_iterator& it ) ...@@ -2250,8 +2288,8 @@ bool MBExchange::initItem( UniXML_iterator& it )
r->q_num=i+1; r->q_num=i+1;
r->q_count=1; r->q_count=1;
r->mbfunc = ri->mbfunc; r->mbfunc = ri->mbfunc;
r->mb_initOK = true; // r->mb_initOK = true;
r->sm_initOK = true; // r->sm_initOK = true;
if( ModbusRTU::isWriteFunction(ri->mbfunc) ) if( ModbusRTU::isWriteFunction(ri->mbfunc) )
{ {
// Если занимает несколько регистров, а указана функция записи "одного", // Если занимает несколько регистров, а указана функция записи "одного",
...@@ -2516,6 +2554,7 @@ bool MBExchange::activateObject() ...@@ -2516,6 +2554,7 @@ bool MBExchange::activateObject()
if( !shm->isLocalwork() ) if( !shm->isLocalwork() )
rtuQueryOptimization(rmap); rtuQueryOptimization(rmap);
initIterators(); initIterators();
initValues();
setProcActive(true); setProcActive(true);
} }
...@@ -2610,7 +2649,6 @@ void MBExchange::sysCommand( UniSetTypes::SystemMessage *sm ) ...@@ -2610,7 +2649,6 @@ void MBExchange::sysCommand( UniSetTypes::SystemMessage *sm )
initOutput(); initOutput();
} }
updateSM(); updateSM();
askTimer(tmExchange,polltime); askTimer(tmExchange,polltime);
break; break;
......
...@@ -95,7 +95,7 @@ class MBExchange: ...@@ -95,7 +95,7 @@ class MBExchange:
id(0),dev(0), id(0),dev(0),
rtuJack(RTUStorage::nUnknown),rtuChan(0), rtuJack(RTUStorage::nUnknown),rtuChan(0),
mtrType(MTR::mtUnknown), mtrType(MTR::mtUnknown),
q_num(0),q_count(1),mb_initOK(true),sm_initOK(true) q_num(0),q_count(1),mb_initOK(false),sm_initOK(false)
{} {}
ModbusRTU::ModbusData mbval; ModbusRTU::ModbusData mbval;
...@@ -209,6 +209,7 @@ class MBExchange: ...@@ -209,6 +209,7 @@ class MBExchange:
virtual void sigterm( int signo ); virtual void sigterm( int signo );
virtual bool activateObject(); virtual bool activateObject();
virtual void initIterators(); virtual void initIterators();
virtual void initValues();
struct InitRegInfo struct InitRegInfo
{ {
......
...@@ -141,6 +141,11 @@ void MBTCPMaster::poll_thread() ...@@ -141,6 +141,11 @@ void MBTCPMaster::poll_thread()
ptTimeout.reset(); ptTimeout.reset();
} }
while( !checkProcActive() )
{
uniset_mutex_lock l(mutex_start,3000);
}
while( checkProcActive() ) while( checkProcActive() )
{ {
try try
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
--mbtcp-set-prop-prefix \ --mbtcp-set-prop-prefix \
--mbtcp-filter-field rs \ --mbtcp-filter-field rs \
--mbtcp-filter-value 5 \ --mbtcp-filter-value 5 \
--mbtcp-gateway-iaddr 192.168.1.42 \ --mbtcp-gateway-iaddr localhost \
--mbtcp-gateway-port 2048 \ --mbtcp-gateway-port 2048 \
--mbtcp-recv-timeout 5000 \ --mbtcp-recv-timeout 5000 \
--mbtcp-force-disconnect 1 \ --mbtcp-force-disconnect 1 \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment