Commit 9828bef4 authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusSlave): если указан адрес 255.. отвечает на любые запросы.

parent 011bb9d2
......@@ -13,7 +13,7 @@
Name: libuniset2
Version: 2.2
Release: alt3
Release: alt4
Summary: UniSet - library for building distributed industrial control systems
......@@ -456,6 +456,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%changelog
* Fri Oct 02 2015 Pavel Vainerman <pv@altlinux.ru> 2.2-alt4
- (ModbusSlave): added support setBroadcastMode() // addr = 255
* Mon Sep 21 2015 Pavel Vainerman <pv@altlinux.ru> 2.2-alt3
- (ModbusMaster): modify check "not respond" mechanism
......
......@@ -159,6 +159,7 @@ MBSlave::MBSlave(UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, const
rs->setAfterSendPause(aftersend_pause);
rs->setReplyTimeout(reply_tout);
rs->setLog(mblog);
rs->setBroadcastMode( addr == ModbusRTU::BroadcastAddr );
mbslot = std::static_pointer_cast<ModbusServerSlot>(rs);
thr = make_shared< ThreadCreator<MBSlave> >(this, &MBSlave::execute_rtu);
......@@ -183,6 +184,7 @@ MBSlave::MBSlave(UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, const
mbtcp->setAfterSendPause(aftersend_pause);
mbtcp->setReplyTimeout(reply_tout);
mbtcp->setBroadcastMode( addr == ModbusRTU::BroadcastAddr );
mbslot = std::static_pointer_cast<ModbusServerSlot>(mbtcp);
thr = make_shared< ThreadCreator<MBSlave> >(this, &MBSlave::execute_tcp);
......
......@@ -81,7 +81,7 @@
...
\endcode
- \b addr - адрес данного устройства
- \b addr - адрес данного устройства. Если указан адрес 255 - ответ будет на любые сообщения.
- \b afterSendPause - принудительная пауза после посылки ответа
- \b reg_from_id - номер регистра брать из ID датчика
- \b replyTimeout - таймаут на формирование ответа. Если ответ на запрос будет сформирован за большее время, он не будет отослан.
......@@ -118,7 +118,7 @@
\b --xxx-name ID - идентификатор процесса.
\b --xxx-my-addr addr - slave-адрес для данного устройства.
\b --xxx-my-addr addr - slave-адрес для данного устройства. Если указан адрес 255 - ответ будет на любые сообщения.
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи.
......
......@@ -2,6 +2,6 @@
uniset2-start.sh -f ./uniset2-mbslave --confile test.xml --dlog-add-levels any \
--mbs-name MBSlave1 \
--mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-my-addr 0x01 \
--mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-my-addr 255 \
--mbs-askcount-id SVU_AskCount_AS \
--mbs-filter-field mbtcp --mbs-filter-value 2 $*
\ No newline at end of file
......@@ -563,7 +563,7 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t
{
bcnt = getNextData((unsigned char*)(&rbuf), sizeof(ModbusAddr));
if( bcnt > 0 && ( rbuf.addr == addr || (onBroadcast && rbuf.addr == BroadcastAddr) ) )
if( bcnt > 0 && ( rbuf.addr == addr || (onBroadcast && rbuf.addr == BroadcastAddr) || addr == BroadcastAddr ) )
{
begin = true;
break;
......@@ -578,8 +578,8 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t
/*! \todo Подумать Может стоит всё-таки получать весь пакет, а проверять кому он адресован на уровне выше?!
// Lav: конечно стоит, нам же надо буфер чистить
*/
// Проверка кому адресован пакет...
if( rbuf.addr != addr && rbuf.addr != BroadcastAddr )
// Проверка кому адресован пакет... (только если не включён режим отвечать на любые адреса)
if( addr != BroadcastAddr && rbuf.addr != addr && rbuf.addr != BroadcastAddr )
{
if( dlog->is_warn() )
{
......
......@@ -181,6 +181,10 @@ mbErrCode ModbusTCPServer::receive( ModbusRTU::ModbusAddr addr, timeout_t timeou
// чтобы проверка всегда была успешной...
if( ignoreAddr )
addr = _addr;
else if( (onBroadcast && _addr == BroadcastAddr) || addr==ModbusRTU::BroadcastAddr )
{
// нормально обрабатываем..
}
else if( _addr != addr )
{
res = erTimeOut;
......
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