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

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

parent 5c4f397f
......@@ -8,7 +8,7 @@
Name: libuniset
Version: 1.8
Release: alt2.1
Release: alt3
Summary: UniSet - library for building distributed industrial control systems
License: GPL
......@@ -339,6 +339,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%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
- update for alt/sisyphus..
- fixed changelog (save for history):
......
......@@ -215,6 +215,7 @@
<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 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>
<thresholds name="thresholds">
<sensor iotype="AI" name="AI_AS">
......
......@@ -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 )
{
if( exchangeMode == emSkipExchange || mdev == emSkipExchange )
......@@ -848,6 +876,8 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i];
p->mb_initOK = true;
it--;
}
break;
......@@ -857,6 +887,7 @@ bool MBExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr,p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i];
p->mb_initOK = true;
it--;
}
break;
......@@ -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++ )
it->second->mbval = b[k];
}
p->mb_initOK = true;
it--;
}
break;
......@@ -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++ )
it->second->mbval = b[k] ? 1 : 0;
}
p->mb_initOK = true;
it--;
}
break;
......@@ -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;
if( dlog.debugging(Debug::LEVEL3) )
......@@ -2227,8 +2265,8 @@ bool MBExchange::initItem( UniXML_iterator& it )
{
// Если это регистр для чтения, то сразу можно работать
// инициализировать не надо
ri->mb_initOK = true;
ri->sm_initOK = true;
// ri->mb_initOK = true;
// ri->sm_initOK = true;
}
......@@ -2250,8 +2288,8 @@ bool MBExchange::initItem( UniXML_iterator& it )
r->q_num=i+1;
r->q_count=1;
r->mbfunc = ri->mbfunc;
r->mb_initOK = true;
r->sm_initOK = true;
// r->mb_initOK = true;
// r->sm_initOK = true;
if( ModbusRTU::isWriteFunction(ri->mbfunc) )
{
// Если занимает несколько регистров, а указана функция записи "одного",
......@@ -2516,6 +2554,7 @@ bool MBExchange::activateObject()
if( !shm->isLocalwork() )
rtuQueryOptimization(rmap);
initIterators();
initValues();
setProcActive(true);
}
......@@ -2610,7 +2649,6 @@ void MBExchange::sysCommand( UniSetTypes::SystemMessage *sm )
initOutput();
}
updateSM();
askTimer(tmExchange,polltime);
break;
......
......@@ -95,7 +95,7 @@ class MBExchange:
id(0),dev(0),
rtuJack(RTUStorage::nUnknown),rtuChan(0),
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;
......@@ -209,6 +209,7 @@ class MBExchange:
virtual void sigterm( int signo );
virtual bool activateObject();
virtual void initIterators();
virtual void initValues();
struct InitRegInfo
{
......
......@@ -141,6 +141,11 @@ void MBTCPMaster::poll_thread()
ptTimeout.reset();
}
while( !checkProcActive() )
{
uniset_mutex_lock l(mutex_start,3000);
}
while( checkProcActive() )
{
try
......
......@@ -8,7 +8,7 @@
--mbtcp-set-prop-prefix \
--mbtcp-filter-field rs \
--mbtcp-filter-value 5 \
--mbtcp-gateway-iaddr 192.168.1.42 \
--mbtcp-gateway-iaddr localhost \
--mbtcp-gateway-port 2048 \
--mbtcp-recv-timeout 5000 \
--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