Commit 36591cd7 authored by Pavel Vainerman's avatar Pavel Vainerman

(Modbus): добавил возможность задать для каждого устройства

датчик "управления обменом"(modeSensor), чтобы процессом можно было управлять "снаружи" (вплоть до отключения обмена).
parent 97887904
......@@ -7,7 +7,7 @@
Name: libuniset
Version: 1.6
Release: alt11
Release: alt12
Summary: UniSet - library for building distributed industrial control systems
......@@ -319,6 +319,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
* Thu Sep 19 2013 Pavel Vainerman <pv@altlinux.ru> 1.6-alt12
- (Modbus): Added ability to set the sensor mode (modeSensor) for each device
* Thu Jun 13 2013 Pavel Vainerman <pv@altlinux.ru> 1.6-alt11
- fixed after cppcheck checking
......
......@@ -45,9 +45,9 @@
<item name="UniExchange2" node="Node2"/>
<item id="3001" node_id="Node2"/>
</UniExchange>
<MBMaster1 addr="0x31" iaddr="127.0.0.1" levels="info,warn,crit" name="MBMaster1" poll_time="200" port="30000" reply_timeout="60">
<MBMaster1 iaddr="127.0.0.1" levels="info,warn,crit" name="MBMaster1" poll_time="200" port="30000" reply_timeout="60">
<DeviceList>
<item addr="0x02" invert="0" respondSensor="RespondRTU_S" timeout="5000"/>
<item addr="0x01" invert="0" respondSensor="RespondRTU_S" timeout="5000" modeSensor="MB1_Mode_AS"/>
</DeviceList>
</MBMaster1>
<MBSlave1 addr="0x31" aftersend-pause="0" dev="/dev/ttyS0" levels="info,warn,crit" name="MBSlave1" poll_time="200" reply_timeout="60" speed="9600">
......@@ -103,7 +103,7 @@
</MBSlave1>
<RTUExchange name="RTUExchange">
<DeviceList>
<item addr="0x01" invert="0" respondSensor="RespondRTU_S" timeout="5000"/>
<item addr="0x01" invert="0" respondSensor="RespondRTU_S" modeSensor="MB1_Mode_AS" timeout="5000"/>
</DeviceList>
</RTUExchange>
<UDPExchange name="UDPExchange"/>
......@@ -136,7 +136,7 @@
<!-- ************************ Датчики ********************** -->
<sensors name="Sensors">
<item db_ignore="1" default="1" id="1" iotype="DI" name="Input1_S" priority="Medium" textname="Команда 1"/>
<item id="2" iotype="DI" mbaddr="0x01" mbfunc="0x04" mbreg="0x02" mbtype="rtu" name="Input2_S" priority="Medium" rs="2" textname="Команда 2"/>
<item id="2" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="11" mbtype="rtu" name="Input2_S" priority="Medium" rs="4" textname="Команда 2"/>
<item id="3" iotype="DI" mbtcp="1" mbtcp_mbaddr="0x02" mbtcp_mbfunc="0x03" mbtcp_mbreg="0x02" mbtcp_mbtype="rtu" name="Input3_S" priority="Medium" textname="Команда 3"/>
<item id="4" iotype="DI" mbaddr="0x02" mbfunc="0x04" mbreg="0x02" mbtype="rtu" name="Input4_S" priority="Medium" rs="2" textname="Команда 4"/>
<item id="5" iotype="DI" name="Input5_S" priority="Medium" textname="Команда 5" udp="2"/>
......@@ -178,6 +178,12 @@
<item id="32" iotype="AI" mbtcp_mbaddr="1" mbtcp_mbfunc="0x04" mbtcp_mbreg="43" mbtcp_mbtype="rtu" mbtcp_vtype="I2" name="performance1" noprecision="1" precision="6" rs="mbmaster" textname="Производительность танка 1"/>
<item id="33" iotype="DI" name="Message1" priority="Medium" textname="Текст сообщения 1"/>
<item id="34" iotype="AI" name="MB1_Mode_AS" priority="Medium" textname="ModbusExchange Mode"/>
<item id="50" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="0" mbtype="rtu" name="Input50_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="51" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" ntit="1" mbtype="rtu" name="Input51_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="52" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="1" mbtype="rtu" name="Input52_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="53" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" nbit="2" mbtype="rtu" name="Input53_S" priority="Medium" rs="5" textname="Команда 2"/>
</sensors>
<thresholds name="thresholds">
<sensor iotype="AI" name="AI_AS">
......
......@@ -39,10 +39,11 @@ class MBExchange:
/*! Режимы работы процесса обмена */
enum ExchangeMode
{
emNone, /*!< нормальная работа (по умолчанию) */
emWriteOnly, /*!< "только посылка данных" (работают только write-функции) */
emReadOnly, /*!< "только чтение" (работают только read-функции) */
emSkipSaveToSM /*!< не писать данные в SM (при этом работают и read и write функции */
emNone=0, /*!< нормальная работа (по умолчанию) */
emWriteOnly=1, /*!< "только посылка данных" (работают только write-функции) */
emReadOnly=2, /*!< "только чтение" (работают только read-функции) */
emSkipSaveToSM=3, /*!< не писать данные в SM (при этом работают и read и write функции */
emSkipExchange=4 /*!< отключить обмен */
};
friend std::ostream& operator<<( std::ostream& os, const ExchangeMode& em );
......@@ -145,6 +146,8 @@ class MBExchange:
resp_real(false),
resp_init(false),
ask_every_reg(false),
mode_id(UniSetTypes::DefaultObjectId),
mode(emNone),
speed(ComPort::ComSpeed38400),
rtu(0)
{
......@@ -166,6 +169,9 @@ class MBExchange:
bool resp_real;
bool resp_init;
bool ask_every_reg;
UniSetTypes::ObjectId mode_id;
IOController::AIOStateList::iterator mode_ait;
long mode; // режим работы с устройством (см. ExchangeMode)
// return TRUE if state changed
bool checkRespond();
......@@ -241,7 +247,7 @@ class MBExchange:
void updateRSProperty( RSProperty* p, bool write_only=false );
virtual void updateRespondSensors();
bool checkUpdateSM( bool wrFunc );
bool checkUpdateSM( bool wrFunc, long devMode );
bool checkPoll( bool wrFunc );
bool checkProcActive();
......
......@@ -44,6 +44,7 @@
- \b timeout msec - таймаут, для определения отсутствия связи
- \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи.
- \b respondSensor - идентификатор датчика связи.
- \b modeSensor - идентификатор датчика режима работы (см. MBExchange::ExchangeMode).
- \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
\par Параметры запуска
......@@ -171,6 +172,7 @@
- \b emSkipSaveToSM - "не записывать данные в SM", это особый режим, похожий на \b emWriteOnly,
но отличие в том, что при этом режиме ведётся полноценый обмен (и read и write),
только реально данные не записываются в SharedMemory(SM).
- \b emSkipExchnage - отключить обмен (при этом данные "из SM" обновляются).
Режимы переключаются при помощи датчика, который можно задать либо аргументом командной строки
\b --prefix-exchange-mode-id либо в конф. файле параметром \b echangeModeID="". Константы определяющие режимы объявлены в MBTCPMaster::ExchangeMode.
......
......@@ -208,6 +208,9 @@ void RTUExchange::poll()
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{
RTUDevice* d(it1->second);
if( d->mode_id != DefaultObjectId && d->mode == emSkipExchange )
continue;
if( d->speed != s )
{
......@@ -220,9 +223,9 @@ void RTUExchange::poll()
if( !d->rtu )
continue;
if( dlog.debugging(Debug::INFO) )
if( dlog.debugging(Debug::LEVEL3) )
{
dlog[Debug::INFO] << myname << "(pollRTU188): poll RTU188 "
dlog[Debug::LEVEL3] << myname << "(pollRTU188): poll RTU188 "
<< " mbaddr=" << ModbusRTU::addr2str(d->mbaddr)
<< endl;
}
......@@ -250,8 +253,8 @@ void RTUExchange::poll()
}
else
{
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr)
if( dlog.debugging(Debug::LEVEL3) )
dlog[Debug::LEVEL3] << myname << "(poll): ask addr=" << ModbusRTU::addr2str(d->mbaddr)
<< " regs=" << d->regmap.size() << endl;
d->resp_real = false;
......
......@@ -6,12 +6,12 @@ uniset-start.sh -f ./uniset-rtuexchange --confile test.xml \
--rs-name RTUExchange \
--rs-speed 115200 \
--rs-filter-field rs \
--rs-filter-value 2 \
--rs-filter-value 4 \
--dlog-add-levels info,crit,warn,level4,level3 \
--rs-force 0 \
--rs-force-out 0 \
--rs-polltime 500 \
--rs-set-prop-prefix rs_\
--rs-set-prop-prefix \
#,level3
# --rs-force 1 \
......@@ -5,14 +5,18 @@
--mbtcp-name MBMaster1 \
--smemory-id SharedMemory \
--dlog-add-levels info,crit,warn,level4,level3 \
--mbtcp-set-prop-prefix \
--mbtcp-filter-field rs \
--mbtcp-filter-value 1 \
--mbtcp-filter-value 5 \
--mbtcp-gateway-iaddr 127.0.0.1 \
--mbtcp-gateway-port 2048 \
--mbtcp-recv-timeout 5000 \
--mbtcp-force-disconnect 1 \
--mbtcp-polltime 3000 \
--mbtcp-exchange-mode-id MB1_Mode_AS \
--mbtcp-set-prop-prefix rs_
--mbtcp-force-out 1 \
$*
#--mbtcp-exchange-mode-id MB1_Mode_AS \
#--mbtcp-filter-field mbtcp --mbtcp-filter-value 1
#--mbtcp-set-prop-prefix rs_ \
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