Commit 8b57b541 authored by Pavel Vainerman's avatar Pavel Vainerman

(2.0)(IOControl): Добавил работу по фронту сигнала. Новое свойство…

(2.0)(IOControl): Добавил работу по фронту сигнала. Новое свойство iofront=['01','10'] (в IOBase) определяет по какому фронту будет менять сигнал.
parent f37e0d85
...@@ -27,7 +27,3 @@ codegen: ...@@ -27,7 +27,3 @@ codegen:
Version 2.0 Version 2.0
============ ============
- написать документацию по ModbusSlave - написать документацию по ModbusSlave
iocontrol:
- добавить ещё один вид сигналов (настройку) "работа по переднему фронту".
Т.е. сигнал меняет своё состояние по изменению входного (типа для кнопок без фиксации). "trigger"(обрабатывать после jar_delay)
...@@ -351,6 +351,7 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -351,6 +351,7 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
use simple function: setValue,getValue,askSensor use simple function: setValue,getValue,askSensor
- possible use of the property 'iotype' in uniset-codegen - possible use of the property 'iotype' in uniset-codegen
- refactoring <depends> mechanism - refactoring <depends> mechanism
- add iofront=[01,10] to IOBase
* Tue Dec 10 2013 Pavel Vainerman <pv@altlinux.ru> 1.7-alt3 * Tue Dec 10 2013 Pavel Vainerman <pv@altlinux.ru> 1.7-alt3
- add RRDServer - add RRDServer
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
</UniSet> </UniSet>
<dlog name="dlog"/> <dlog name="dlog"/>
<settings> <settings>
<TestProc name="TestProc" <TestProc name="TestProc1"
on_s="Input1_S" on_s="Input1_S"
lamp_c="Lamp58_C" lamp_c="Lamp58_C"
depend_c="Input4_S" depend_c="Input4_S"
...@@ -172,6 +172,8 @@ ...@@ -172,6 +172,8 @@
<item id="5" iotype="DI" name="Input5_S" priority="Medium" textname="Команда 5" udp="2" depend="Input4_S"/> <item id="5" iotype="DI" name="Input5_S" priority="Medium" textname="Команда 5" udp="2" depend="Input4_S"/>
<item id="6" iotype="DI" name="Input6_S" priority="Medium" textname="Команда 6" udp="2"/> <item id="6" iotype="DI" name="Input6_S" priority="Medium" textname="Команда 6" udp="2"/>
<item id="11" iotype="AI" name="AI11_AS" priority="Medium" textname="AI 11" depend="Input4_S" depend_off_value="-50"/> <item id="11" iotype="AI" name="AI11_AS" priority="Medium" textname="AI 11" depend="Input4_S" depend_off_value="-50"/>
<item id="12" iotype="DI" name="Input12_S" priority="Medium" textname="Команда 12" iofront="01"/>
<item id="60" iotype="DI" name="Input60_S" priority="Medium" textname="Команда 61" iofront="10"/>
<item id="7" iotype="DO" name="DO_C" priority="Medium" textname="Digital output"/> <item id="7" iotype="DO" name="DO_C" priority="Medium" textname="Digital output"/>
<item id="8" iotype="DO" name="DO1_C" priority="Medium" textname="Digital output"/> <item id="8" iotype="DO" name="DO1_C" priority="Medium" textname="Digital output"/>
<item default="1000" id="9" iotype="AO" name="AO_AS" precision="2" priority="Medium" rs="2" rs_channel="1" rs_jack="j1" rs_mbaddr="0x01" rs_mbfunc="0x06" rs_mbreg="0x02" rs_mbtype="rtu188" textname="Analog output"/> <item default="1000" id="9" iotype="AO" name="AO_AS" precision="2" priority="Medium" rs="2" rs_channel="1" rs_jack="j1" rs_mbaddr="0x01" rs_mbfunc="0x06" rs_mbreg="0x02" rs_mbtype="rtu188" textname="Analog output"/>
...@@ -252,7 +254,7 @@ ...@@ -252,7 +254,7 @@
<item id="6009" name="MBMaster2"/> <item id="6009" name="MBMaster2"/>
<item id="6010" name="MBMultiMaster1"/> <item id="6010" name="MBMultiMaster1"/>
<item id="6011" name="RRDServer1"/> <item id="6011" name="RRDServer1"/>
<item id="6012" name="TestProc"/> <item id="6012" name="TestProc1"/>
</objects> </objects>
</ObjectsMap> </ObjectsMap>
<messages idfromfile="1" name="messages"> <messages idfromfile="1" name="messages">
......
#!/bin/sh #!/bin/sh
uniset-start.sh -f ./uniset-mbslave --confile test.xml --dlog-add-levels info,crit,warn \ uniset-start.sh -f ./uniset-mbslave --confile test.xml --dlog-add-levels any \
--smemory-id SharedMemory \ --smemory-id SharedMemory \
--mbs-name MBSlave1 \ --mbs-name MBSlave1 \
--mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-reg-from-id 1 --mbs-my-addr 0x01 \ --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-reg-from-id 1 --mbs-my-addr 0x01 \
--mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 --mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 $*
# --mbs-force 1 # --mbs-force 1
#--mbs-reg-from-id 1 \ #--mbs-reg-from-id 1 \
#--mbs-filter-field CAN2sender --mbs-filter-value SYSTSNode \ #--mbs-filter-field CAN2sender --mbs-filter-value SYSTSNode \
\ No newline at end of file
...@@ -3,13 +3,14 @@ ...@@ -3,13 +3,14 @@
#include "ObjectsActivator.h" #include "ObjectsActivator.h"
#include "SharedMemory.h" #include "SharedMemory.h"
#include "Extensions.h" #include "Extensions.h"
#include "TestProc.h"
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
int main(int argc, const char **argv) int main(int argc, const char **argv)
{ {
if( argc>1 && ( strcmp(argv[1],"--help")==0 || strcmp(argv[1],"-h")==0 ) ) if( argc>1 && ( strcmp(argv[1],"--help")==0 || strcmp(argv[1],"-h")==0 ) )
{ {
cout << "--confile - Использовать указанный конф. файл. По умолчанию configure.xml" << endl; cout << "--confile - Использовать указанный конф. файл. По умолчанию configure.xml" << endl;
...@@ -32,27 +33,27 @@ int main(int argc, const char **argv) ...@@ -32,27 +33,27 @@ int main(int argc, const char **argv)
if( !shm ) if( !shm )
return 1; return 1;
TestProc tp(conf->getObjectID("TestProc1"));
tp.init_dlog(dlog);
ObjectsActivator act; ObjectsActivator act;
act.addObject(static_cast<class UniSetObject*>(shm)); act.addObject(static_cast<class UniSetObject*>(shm));
SystemMessage sm(SystemMessage::StartUp); act.addObject(static_cast<class UniSetObject*>(&tp));
SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() ); act.broadcast( sm.transport_msg() );
act.run(false); act.run(false);
// pause(); // пауза, чтобы дочерние потоки успели завершить работу
return 0; return 0;
} }
catch( SystemError& err ) catch( SystemError& err )
{ {
dlog[Debug::CRIT] << "(smemory): " << err << endl; unideb[Debug::CRIT] << "(smemory): " << err << endl;
} }
catch( Exception& ex ) catch( Exception& ex )
{ {
dlog[Debug::CRIT] << "(smemory): " << ex << endl; unideb[Debug::CRIT] << "(smemory): " << ex << endl;
}
catch( std::exception& e )
{
dlog[Debug::CRIT] << "(smemory): " << e.what() << endl;
} }
catch( std::exception& e ) catch( std::exception& e )
{ {
...@@ -60,8 +61,8 @@ int main(int argc, const char **argv) ...@@ -60,8 +61,8 @@ int main(int argc, const char **argv)
} }
catch(...) catch(...)
{ {
dlog[Debug::CRIT] << "(smemory): catch(...)" << endl; unideb[Debug::CRIT] << "(smemory): catch(...)" << endl;
} }
return 1; return 1;
} }
// $Id: IOBase.h,v 1.3 2009/01/23 23:56:54 vpashka Exp $
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef IOBase_H_ #ifndef IOBase_H_
#define IOBase_H_ #define IOBase_H_
...@@ -36,7 +37,11 @@ static const int NoSafety = -1; ...@@ -36,7 +37,11 @@ static const int NoSafety = -1;
jar_state(false), jar_state(false),
ondelay_state(false), ondelay_state(false),
offdelay_state(false), offdelay_state(false),
t_ai(UniSetTypes::DefaultObjectId) t_ai(UniSetTypes::DefaultObjectId),
front(false),
front_type(ftUnknown),
front_prev_state(false),
front_state(false)
{} {}
...@@ -45,6 +50,7 @@ static const int NoSafety = -1; ...@@ -45,6 +50,7 @@ static const int NoSafety = -1;
bool check_jar( bool val ); /*!< реализация фильтра против дребезга */ bool check_jar( bool val ); /*!< реализация фильтра против дребезга */
bool check_on_delay( bool val ); /*!< реализация задержки на включение */ bool check_on_delay( bool val ); /*!< реализация задержки на включение */
bool check_off_delay( bool val ); /*!< реализация задержки на отключение */ bool check_off_delay( bool val ); /*!< реализация задержки на отключение */
bool check_front( bool val ); /*!< реализация срабатывания по фронту сигнала */
IOController_i::SensorInfo si; IOController_i::SensorInfo si;
UniversalIO::IOType stype; /*!< тип канала (DI,DO,AI,AO) */ UniversalIO::IOType stype; /*!< тип канала (DI,DO,AI,AO) */
...@@ -87,7 +93,19 @@ static const int NoSafety = -1; ...@@ -87,7 +93,19 @@ static const int NoSafety = -1;
хранится идентификатор аналогового датчика хранится идентификатор аналогового датчика
с которым он связан */ с которым он связан */
IONotifyController_i::ThresholdInfo ti; IONotifyController_i::ThresholdInfo ti;
IOController::AIOStateList::iterator t_ait; /*! итератор на датчик по которому формируется порог */
// Работа по фронтам сигнала
enum FrontType
{
ftUnknown,
ft01, // срабатывание на переход "0-->1"
ft10 // срабатывание на переход "1-->0"
};
bool front; // флаг работы по фронту
FrontType front_type;
bool front_prev_state;
bool front_state;
IOController::IOStateList::iterator ioit; IOController::IOStateList::iterator ioit;
UniSetTypes::uniset_rwmutex val_lock; /*!< блокировка на время "работы" со значением */ UniSetTypes::uniset_rwmutex val_lock; /*!< блокировка на время "работы" со значением */
......
...@@ -92,6 +92,26 @@ bool IOBase::check_off_delay( bool val ) ...@@ -92,6 +92,26 @@ bool IOBase::check_off_delay( bool val )
return offdelay_state; return offdelay_state;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool IOBase::check_front( bool val )
{
if( !front || front_type == ftUnknown )
return val;
if( front_type == ft01 )
{
if( val && !front_prev_state )
front_state ^= true;
}
else if( front_type == ft10 )
{
if( !val && front_prev_state )
front_state ^= true;
}
front_prev_state = val;
return front_state;
}
// -----------------------------------------------------------------------------
void IOBase::processingAsAI( IOBase* it, long val, SMInterface* shm, bool force ) void IOBase::processingAsAI( IOBase* it, long val, SMInterface* shm, bool force )
{ {
// проверка на обрыв // проверка на обрыв
...@@ -209,6 +229,7 @@ void IOBase::processingAsDI( IOBase* it, bool set, SMInterface* shm, bool force ...@@ -209,6 +229,7 @@ void IOBase::processingAsDI( IOBase* it, bool set, SMInterface* shm, bool force
set = it->check_jar(set); // фильтр дребезга set = it->check_jar(set); // фильтр дребезга
set = it->check_on_delay(set); // фильтр на срабатывание set = it->check_on_delay(set); // фильтр на срабатывание
set = it->check_off_delay(set); // фильтр на отпускание set = it->check_off_delay(set); // фильтр на отпускание
set = it->check_front(set); // работа по фронту (проверять после jar_xxx!)
{ {
uniset_rwmutex_wrlock lock(it->val_lock); uniset_rwmutex_wrlock lock(it->val_lock);
...@@ -375,6 +396,8 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm, ...@@ -375,6 +396,8 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
return false; return false;
} }
b->val_lock.setName(sname + "_lock");
b->si.id = sid; b->si.id = sid;
b->si.node = conf->getLocalNode(); b->si.node = conf->getLocalNode();
...@@ -395,6 +418,30 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm, ...@@ -395,6 +418,30 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
msec = it.getPIntProp("offdelay", UniSetTimer::WaitUpTime); msec = it.getPIntProp("offdelay", UniSetTimer::WaitUpTime);
b->ptOffDelay.setTiming(msec); b->ptOffDelay.setTiming(msec);
b->front = false;
std::string front_t( it.getProp("iofront") );
if( !front_t.empty() )
{
if( front_t == "01" )
{
b->front = true;
b->front_type = ft01;
}
else if( front_t == "10" )
{
b->front = true;
b->front_type = ft10;
}
else
{
if( dlog )
dlog[Debug::CRIT] << myname << "(IOBase::readItem): Unknown iofront='" << front_t << "'"
<< " for '" << sname << "'. Must be [ 01, 10 ]." << endl;
return false;
}
}
b->safety = it.getPIntProp("safety", NoSafety); b->safety = it.getPIntProp("safety", NoSafety);
b->stype = UniSetTypes::getIOType(it.getProp("iotype")); b->stype = UniSetTypes::getIOType(it.getProp("iotype"));
......
...@@ -137,12 +137,14 @@ class IOController: ...@@ -137,12 +137,14 @@ class IOController:
bool db_ignore; /*!< не писать изменения в БД */ bool db_ignore; /*!< не писать изменения в БД */
// сигнал для реализации механизма зависимостией.. // сигнал для реализации механизма зависимостией..
// (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
ChangeSignal changeSignal; ChangeSignal changeSignal;
IOController_i::SensorInfo d_si; /*!< идентификатор датчика, от которого зависит данный */ IOController_i::SensorInfo d_si; /*!< идентификатор датчика, от которого зависит данный */
long d_value; /*!< разрешающее работу значение датчика от которого зависит данный */ long d_value; /*!< разрешающее работу значение датчика от которого зависит данный */
long d_off_value; /*!< блокирующее значение */ long d_off_value; /*!< блокирующее значение */
// функция обработки информации об изменении состояния датчика, от которого зависит данный
void checkDepend( const IOController_i::SensorInfo& si , long newval, IOController* ); void checkDepend( const IOController_i::SensorInfo& si , long newval, IOController* );
}; };
......
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