Commit b3985c96 authored by Pavel Vainerman's avatar Pavel Vainerman

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

(2.0)(IOControl): Добавил работу по фронту сигнала. Новое свойство iofront=['01','10'] (в IOBase) определяет по какому фронту будет менять сигнал.
parent 2bdf0bf3
......@@ -27,7 +27,3 @@ codegen:
Version 2.0
============
- написать документацию по ModbusSlave
iocontrol:
- добавить ещё один вид сигналов (настройку) "работа по переднему фронту".
Т.е. сигнал меняет своё состояние по изменению входного (типа для кнопок без фиксации). "trigger"(обрабатывать после jar_delay)
......@@ -351,6 +351,7 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
use simple function: setValue,getValue,askSensor
- possible use of the property 'iotype' in uniset-codegen
- refactoring <depends> mechanism
- add iofront=[01,10] to IOBase
* Tue Dec 10 2013 Pavel Vainerman <pv@altlinux.ru> 1.7-alt3
- add RRDServer
......
......@@ -33,7 +33,7 @@
</UniSet>
<dlog name="dlog"/>
<settings>
<TestProc name="TestProc"
<TestProc name="TestProc1"
on_s="Input1_S"
lamp_c="Lamp58_C"
depend_c="Input4_S"
......@@ -172,6 +172,8 @@
<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="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="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"/>
......@@ -252,7 +254,7 @@
<item id="6009" name="MBMaster2"/>
<item id="6010" name="MBMultiMaster1"/>
<item id="6011" name="RRDServer1"/>
<item id="6012" name="TestProc"/>
<item id="6012" name="TestProc1"/>
</objects>
</ObjectsMap>
<messages idfromfile="1" name="messages">
......
......@@ -84,6 +84,10 @@
<br>\b jardelay - защита от дребезга. Задержка на дребезг, мсек.
<br>\b ondelay - задержка на срабатывание, мсек.
<br>\b offdelay - задержка на отпускание, мсек.
<br>\b iofront - работа по фронту сигнала (для DI).
<br> "01" - срабатывание (и отпускание) по переходу "0 --> 1"
<br> "10" - срабатывание (и отпускание) по переходу "1 --> 0"
<br>\b safety - безопасное значение. Значение которое сохраняется в случае аварийного
завершения процесса.
......
#!/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 \
--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-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-reg-from-id 1 \
#--mbs-filter-field CAN2sender --mbs-filter-value SYSTSNode \
\ No newline at end of file
......@@ -37,7 +37,11 @@ static const int NoSafety = -1;
jar_state(false),
ondelay_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)
{}
......@@ -46,6 +50,7 @@ static const int NoSafety = -1;
bool check_jar( bool val ); /*!< реализация фильтра против дребезга */
bool check_on_delay( bool val ); /*!< реализация задержки на включение */
bool check_off_delay( bool val ); /*!< реализация задержки на отключение */
bool check_front( bool val ); /*!< реализация срабатывания по фронту сигнала */
IOController_i::SensorInfo si;
UniversalIO::IOType stype; /*!< тип канала (DI,DO,AI,AO) */
......@@ -89,6 +94,18 @@ static const int NoSafety = -1;
с которым он связан */
IONotifyController_i::ThresholdInfo ti;
// Работа по фронтам сигнала
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;
UniSetTypes::uniset_rwmutex val_lock; /*!< блокировка на время "работы" со значением */
......
......@@ -92,6 +92,26 @@ bool IOBase::check_off_delay( bool val )
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 )
{
// проверка на обрыв
......@@ -209,6 +229,7 @@ void IOBase::processingAsDI( IOBase* it, bool set, SMInterface* shm, bool force
set = it->check_jar(set); // фильтр дребезга
set = it->check_on_delay(set); // фильтр на срабатывание
set = it->check_off_delay(set); // фильтр на отпускание
set = it->check_front(set); // работа по фронту (проверять после jar_xxx!)
{
uniset_rwmutex_wrlock lock(it->val_lock);
......@@ -375,6 +396,8 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
return false;
}
b->val_lock.setName(sname + "_lock");
b->si.id = sid;
b->si.node = conf->getLocalNode();
......@@ -395,6 +418,30 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
msec = it.getPIntProp("offdelay", UniSetTimer::WaitUpTime);
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->stype = UniSetTypes::getIOType(it.getProp("iotype"));
......
......@@ -33,7 +33,7 @@ int main(int argc, const char **argv)
if( !shm )
return 1;
TestProc tp(conf->getObjectID("TestProc"));
TestProc tp(conf->getObjectID("TestProc1"));
tp.init_dlog(dlog);
ObjectsActivator act;
......
......@@ -137,12 +137,14 @@ class IOController:
bool db_ignore; /*!< не писать изменения в БД */
// сигнал для реализации механизма зависимостией..
// (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
ChangeSignal changeSignal;
IOController_i::SensorInfo d_si; /*!< идентификатор датчика, от которого зависит данный */
long d_value; /*!< разрешающее работу значение датчика от которого зависит данный */
long d_off_value; /*!< блокирующее значение */
// функция обработки информации об изменении состояния датчика, от которого зависит данный
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