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

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

parent 6d4d4265
......@@ -115,7 +115,7 @@
</item>
<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="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">
<consumers>
<consumer cfilter="test1" name="TestProc" type="objects"/>
......
......@@ -3,6 +3,7 @@
#include <limits>
#include <sstream>
#include <Exceptions.h>
#include <UniSetTypes.h>
#include <extensions/Extensions.h>
#include "MBExchange.h"
// -----------------------------------------------------------------------------
......@@ -1848,6 +1849,15 @@ bool MBExchange::initRegInfo( RegInfo* r, UniXML_iterator& it, MBExchange::RTUD
// only for RTU188
if( !initRTU188item(it,r) )
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
{
......@@ -2145,14 +2155,14 @@ bool MBExchange::initRTU188item( UniXML_iterator& it, RegInfo* p )
if( jack.empty() )
{
dlog[Debug::CRIT] << myname << "(readRTU188Item): Unknown jack='' "
dlog[Debug::CRIT] << myname << "(readRTU188Item): Unknown " << prop_prefix << "jack='' "
<< " for " << it.getProp("name") << endl;
return false;
}
p->rtuJack = RTUStorage::s2j(jack);
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;
return false;
}
......
......@@ -111,9 +111,9 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
// -----------------------------------
}
// опрос UNIO48 DO
if( pollUNIO )
{
// опрос UNIO48 DO
{
ModbusRTU::ReadCoilRetMessage ret = mb->read01( addr,16,48 );
ModbusRTU::DataBits bits;
......@@ -353,6 +353,84 @@ ModbusRTU::ModbusData RTUStorage::getRegister( RTUJack jack, unsigned short chan
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 )
{
os << "-------------------" << endl
......@@ -483,20 +561,20 @@ void RTUStorage::print()
// -----------------------------------------------------------------------------
RTUStorage::RTUJack RTUStorage::s2j( const std::string jack )
{
if( jack == "J1" )
if( jack == "J1" || jack == "j1" )
return nJ1;
if( jack == "J2" )
if( jack == "J2" || jack == "j2" )
return nJ2;
if( jack == "J5" )
if( jack == "J5" || jack == "j5" )
return nJ5;
if( jack == "X1" )
if( jack == "X1" || jack == "x1" )
return nX1;
if( jack == "X2" )
if( jack == "X2" || jack == "x2" )
return nX2;
if( jack == "X4" )
if( jack == "X4" || jack == "x4" )
return nX4;
if( jack == "X5" )
if( jack == "X5" || jack == "x5" )
return nX5;
return nUnknown;
......
......@@ -46,6 +46,8 @@ class RTUStorage
bool getState( 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
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