Commit 2ce41e8f authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusExchange): Исправлена ошибка работы с RTU188

parent 6d4d4265
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
</item> </item>
<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 id="9" default="1000" iotype="AO" rs_mbaddr="0x01" rs_mbfunc="0x06" rs_mbreg="0x02" precision="2" rs_mbtype="rtu188" name="AO_AS" priority="Medium" rs="2" textname="Analog output"/> <item id="9" default="1000" iotype="AO" rs_mbaddr="0x01" rs_mbfunc="0x06" rs_mbreg="0x02" precision="2" rs_mbtype="rtu188" rs_jack="j1" rs_channel="1" name="AO_AS" priority="Medium" rs="2" textname="Analog output"/>
<item id="10" default="378" iotype="AI" mbaddr="0x01" mbfunc="0x04" mbreg="0x01" mbtype="rtu" name="AI_AS" precision="45" priority="Medium" rs="1" textname="Analog input" vtype="F2"> <item id="10" default="378" iotype="AI" mbaddr="0x01" mbfunc="0x04" mbreg="0x01" mbtype="rtu" name="AI_AS" precision="45" priority="Medium" rs="1" textname="Analog input" vtype="F2">
<consumers> <consumers>
<consumer cfilter="test1" name="TestProc" type="objects"/> <consumer cfilter="test1" name="TestProc" type="objects"/>
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <limits> #include <limits>
#include <sstream> #include <sstream>
#include <Exceptions.h> #include <Exceptions.h>
#include <UniSetTypes.h>
#include <extensions/Extensions.h> #include <extensions/Extensions.h>
#include "MBExchange.h" #include "MBExchange.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -1848,6 +1849,15 @@ bool MBExchange::initRegInfo( RegInfo* r, UniXML_iterator& it, MBExchange::RTUD ...@@ -1848,6 +1849,15 @@ bool MBExchange::initRegInfo( RegInfo* r, UniXML_iterator& it, MBExchange::RTUD
// only for RTU188 // only for RTU188
if( !initRTU188item(it,r) ) if( !initRTU188item(it,r) )
return false; return false;
UniversalIO::IOTypes t = UniSetTypes::getIOType(it.getProp("iotype"));
r->mbreg = RTUStorage::getRegister(r->rtuJack,r->rtuChan,t);
r->mbfunc = RTUStorage::getFunction(r->rtuJack,r->rtuChan,t);
// т.к. с RTU188 свой обмен
// mbreg и mbfunc поля не используются
return true;
} }
else else
{ {
...@@ -2145,14 +2155,14 @@ bool MBExchange::initRTU188item( UniXML_iterator& it, RegInfo* p ) ...@@ -2145,14 +2155,14 @@ bool MBExchange::initRTU188item( UniXML_iterator& it, RegInfo* p )
if( jack.empty() ) if( jack.empty() )
{ {
dlog[Debug::CRIT] << myname << "(readRTU188Item): Unknown jack='' " dlog[Debug::CRIT] << myname << "(readRTU188Item): Unknown " << prop_prefix << "jack='' "
<< " for " << it.getProp("name") << endl; << " for " << it.getProp("name") << endl;
return false; return false;
} }
p->rtuJack = RTUStorage::s2j(jack); p->rtuJack = RTUStorage::s2j(jack);
if( p->rtuJack == RTUStorage::nUnknown ) if( p->rtuJack == RTUStorage::nUnknown )
{ {
dlog[Debug::CRIT] << myname << "(readRTU188Item): Unknown jack=" << jack dlog[Debug::CRIT] << myname << "(readRTU188Item): Unknown " << prop_prefix << "jack=" << jack
<< " for " << it.getProp("name") << endl; << " for " << it.getProp("name") << endl;
return false; return false;
} }
......
...@@ -111,9 +111,9 @@ void RTUStorage::poll( ModbusRTUMaster* mb ) ...@@ -111,9 +111,9 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
// ----------------------------------- // -----------------------------------
} }
// опрос UNIO48 DO
if( pollUNIO ) if( pollUNIO )
{ {
// опрос UNIO48 DO
{ {
ModbusRTU::ReadCoilRetMessage ret = mb->read01( addr,16,48 ); ModbusRTU::ReadCoilRetMessage ret = mb->read01( addr,16,48 );
ModbusRTU::DataBits bits; ModbusRTU::DataBits bits;
...@@ -353,6 +353,84 @@ ModbusRTU::ModbusData RTUStorage::getRegister( RTUJack jack, unsigned short chan ...@@ -353,6 +353,84 @@ ModbusRTU::ModbusData RTUStorage::getRegister( RTUJack jack, unsigned short chan
return -1; return -1;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
ModbusRTU::SlaveFunctionCode RTUStorage::getFunction( RTUJack jack, unsigned short chan, UniversalIO::IOTypes t )
{
if( t == UniversalIO::AnalogInput )
{
switch( jack )
{
case nJ1:
case nJ2:
case nJ5:
case nX1:
case nX2:
return ModbusRTU::fnReadInputRegisters;
default:
break;
}
return ModbusRTU::fnUnknown;
}
if( t == UniversalIO::AnalogOutput )
{
switch( jack )
{
case nJ1:
case nJ2:
case nJ5:
return ModbusRTU::fnReadOutputRegisters;
case nX1:
case nX2:
return ModbusRTU::fnReadInputRegisters;
default:
break;
}
return ModbusRTU::fnUnknown;
}
if( t == UniversalIO::DigitalInput )
{
switch( jack )
{
case nJ1:
case nJ2:
case nJ5:
case nX4:
case nX5:
return ModbusRTU::fnReadInputStatus;
default:
break;
}
return ModbusRTU::fnUnknown;
}
if( t == UniversalIO::DigitalOutput )
{
switch( jack )
{
case nJ1:
case nJ2:
case nJ5:
return ModbusRTU::fnReadCoilStatus;
default:
break;
}
return ModbusRTU::fnUnknown;
}
return ModbusRTU::fnUnknown;
}
// -----------------------------------------------------------------------------
std::ostream& operator<<(std::ostream& os, RTUStorage& m ) std::ostream& operator<<(std::ostream& os, RTUStorage& m )
{ {
os << "-------------------" << endl os << "-------------------" << endl
...@@ -483,20 +561,20 @@ void RTUStorage::print() ...@@ -483,20 +561,20 @@ void RTUStorage::print()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
RTUStorage::RTUJack RTUStorage::s2j( const std::string jack ) RTUStorage::RTUJack RTUStorage::s2j( const std::string jack )
{ {
if( jack == "J1" ) if( jack == "J1" || jack == "j1" )
return nJ1; return nJ1;
if( jack == "J2" ) if( jack == "J2" || jack == "j2" )
return nJ2; return nJ2;
if( jack == "J5" ) if( jack == "J5" || jack == "j5" )
return nJ5; return nJ5;
if( jack == "X1" ) if( jack == "X1" || jack == "x1" )
return nX1; return nX1;
if( jack == "X2" ) if( jack == "X2" || jack == "x2" )
return nX2; return nX2;
if( jack == "X4" ) if( jack == "X4" || jack == "x4" )
return nX4; return nX4;
if( jack == "X5" ) if( jack == "X5" || jack == "x5" )
return nX5; return nX5;
return nUnknown; return nUnknown;
......
...@@ -46,6 +46,8 @@ class RTUStorage ...@@ -46,6 +46,8 @@ class RTUStorage
bool getState( RTUJack jack, unsigned short channel, UniversalIO::IOTypes t ); bool getState( RTUJack jack, unsigned short channel, UniversalIO::IOTypes t );
static ModbusRTU::ModbusData getRegister( RTUJack jack, unsigned short channel, UniversalIO::IOTypes t ); static ModbusRTU::ModbusData getRegister( RTUJack jack, unsigned short channel, UniversalIO::IOTypes t );
static ModbusRTU::SlaveFunctionCode getFunction( RTUJack jack, unsigned short channel, UniversalIO::IOTypes t );
// ДОДЕЛАТЬ: setState, setValue // ДОДЕЛАТЬ: setState, setValue
void print(); void print();
......
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