Skip to content

Commit bb295ed

Browse files
committed
Developing 1-based/0-based address switch
1 parent 45c636a commit bb295ed

3 files changed

Lines changed: 27 additions & 22 deletions

File tree

omodsim/controls/outputwidget.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ QModelIndex OutputListModel::find(QModbusDataUnit::RegisterType type, quint16 ad
294294
if(_parentWidget->_displayDefinition.PointType != type)
295295
return QModelIndex();
296296

297-
const int row = addr - _parentWidget->_displayDefinition.PointAddress;
297+
const auto dd = _parentWidget->_displayDefinition;
298+
const int row = addr - (dd.PointAddress - (dd.ZeroBasedAddress ? 0 : 1));
298299
if(row >= 0 && row < rowCount())
299300
return index(row);
300301

@@ -644,8 +645,8 @@ AddressDescriptionMap OutputWidget::descriptionMap() const
644645
for(int i = 0; i < _listModel->rowCount(); i++)
645646
{
646647
const auto desc = _listModel->data(_listModel->index(i), DescriptionRole).toString();
647-
const quint16 addr = _listModel->data(_listModel->index(i), AddressRole).toUInt();
648-
descriptionMap[{_displayDefinition.PointType, addr}] = desc;
648+
const quint16 addr = _listModel->data(_listModel->index(i), AddressRole).toUInt() - (_displayDefinition.ZeroBasedAddress ? 0 : 1);
649+
descriptionMap[{_displayDefinition.PointType, addr }] = desc;
649650
}
650651
return descriptionMap;
651652
}

omodsim/formmodsim.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ void FormModSim::on_outputWidget_itemDoubleClicked(quint16 addr, const QVariant&
682682
const auto mode = dataDisplayMode();
683683
const auto pointType = ui->comboBoxModbusPointType->currentPointType();
684684
const auto zeroBasedAddress = displayDefinition().ZeroBasedAddress;
685+
const auto simAddr = addr - (zeroBasedAddress ? 0 : 1);
685686
auto simParams = _dataSimulator->simulationParams(pointType, addr);
686687

687688
switch(pointType)
@@ -698,8 +699,8 @@ void FormModSim::on_outputWidget_itemDoubleClicked(quint16 addr, const QVariant&
698699
break;
699700

700701
case 2:
701-
if(simParams.Mode == SimulationMode::No) _dataSimulator->stopSimulation(pointType, addr);
702-
else _dataSimulator->startSimulation(mode, pointType, addr, simParams);
702+
if(simParams.Mode == SimulationMode::No) _dataSimulator->stopSimulation(pointType, simAddr);
703+
else _dataSimulator->startSimulation(mode, pointType, simAddr, simParams);
703704
break;
704705
}
705706
}
@@ -725,8 +726,8 @@ void FormModSim::on_outputWidget_itemDoubleClicked(quint16 addr, const QVariant&
725726
break;
726727

727728
case 2:
728-
if(simParams.Mode == SimulationMode::No) _dataSimulator->stopSimulation(pointType, addr);
729-
else _dataSimulator->startSimulation(mode, pointType, addr, simParams);
729+
if(simParams.Mode == SimulationMode::No) _dataSimulator->stopSimulation(pointType, simAddr);
730+
else _dataSimulator->startSimulation(mode, pointType, simAddr, simParams);
730731
break;
731732
}
732733
}
@@ -795,7 +796,8 @@ void FormModSim::on_mbResponse(const QModbusResponse& resp, ModbusMessage::Proto
795796
void FormModSim::on_mbDataChanged(const QModbusDataUnit&)
796797
{
797798
const auto dd = displayDefinition();
798-
ui->outputWidget->updateData(_mbMultiServer.data(dd.PointType, dd.PointAddress - 1, dd.Length));
799+
const auto addr = dd.PointAddress - (dd.ZeroBasedAddress ? 0 : 1);
800+
ui->outputWidget->updateData(_mbMultiServer.data(dd.PointType, addr, dd.Length));
799801
}
800802

801803
///
@@ -828,9 +830,10 @@ void FormModSim::on_simulationStopped(QModbusDataUnit::RegisterType type, quint1
828830
void FormModSim::on_dataSimulated(DataDisplayMode mode, QModbusDataUnit::RegisterType type, quint16 addr, QVariant value)
829831
{
830832
const auto dd = displayDefinition();
831-
if(type == dd.PointType && addr >= dd.PointAddress && addr < dd.PointAddress + dd.Length)
833+
const auto pointAddr = dd.PointAddress - (dd.ZeroBasedAddress ? 0 : 1);
834+
if(type == dd.PointType && addr >= pointAddr && addr <= pointAddr + dd.Length)
832835
{
833-
_mbMultiServer.writeRegister(type, { addr, value, mode, byteOrder() });
836+
_mbMultiServer.writeRegister(type, { addr, value, mode, byteOrder(), true });
834837
}
835838
}
836839

omodsim/modbusmultiserver.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -638,18 +638,19 @@ void ModbusMultiServer::writeDouble(QModbusDataUnit::RegisterType pointType, qui
638638
void ModbusMultiServer::writeRegister(QModbusDataUnit::RegisterType pointType, const ModbusWriteParams& params)
639639
{
640640
QModbusDataUnit data;
641+
const auto addr = params.Address - (params.ZeroBasedAddress ? 0 : 1);
641642
if(params.Value.userType() == qMetaTypeId<QVector<quint16>>())
642643
{
643644
switch (pointType)
644645
{
645646
case QModbusDataUnit::Coils:
646647
case QModbusDataUnit::DiscreteInputs:
647-
data = createDataUnit(pointType, params.Address - 1, params.Value.value<QVector<quint16>>(), params.Order);
648+
data = createDataUnit(pointType, addr, params.Value.value<QVector<quint16>>(), params.Order);
648649
break;
649650

650651
case QModbusDataUnit::InputRegisters:
651652
case QModbusDataUnit::HoldingRegisters:
652-
data = createDataUnit(pointType, params.Address - 1, params.Value.value<QVector<quint16>>(), params.Order);
653+
data = createDataUnit(pointType, addr, params.Value.value<QVector<quint16>>(), params.Order);
653654
break;
654655

655656
default:
@@ -662,7 +663,7 @@ void ModbusMultiServer::writeRegister(QModbusDataUnit::RegisterType pointType, c
662663
{
663664
case QModbusDataUnit::Coils:
664665
case QModbusDataUnit::DiscreteInputs:
665-
data = createDataUnit(pointType, params.Address - 1, params.Value.toBool(), params.Order);
666+
data = createDataUnit(pointType, addr, params.Value.toBool(), params.Order);
666667
break;
667668

668669
case QModbusDataUnit::InputRegisters:
@@ -673,39 +674,39 @@ void ModbusMultiServer::writeRegister(QModbusDataUnit::RegisterType pointType, c
673674
case DataDisplayMode::Decimal:
674675
case DataDisplayMode::Integer:
675676
case DataDisplayMode::Hex:
676-
data = createDataUnit(pointType, params.Address - 1, params.Value.toUInt(), params.Order);
677+
data = createDataUnit(pointType, addr, params.Value.toUInt(), params.Order);
677678
break;
678679
case DataDisplayMode::FloatingPt:
679-
data = createFloatDataUnit(pointType, params.Address - 1, params.Value.toFloat(), params.Order, false);
680+
data = createFloatDataUnit(pointType, addr, params.Value.toFloat(), params.Order, false);
680681
break;
681682
case DataDisplayMode::SwappedFP:
682-
data = createFloatDataUnit(pointType, params.Address - 1, params.Value.toFloat(), params.Order, true);
683+
data = createFloatDataUnit(pointType, addr, params.Value.toFloat(), params.Order, true);
683684
break;
684685
case DataDisplayMode::DblFloat:
685-
data = createDoubleDataUnit(pointType, params.Address - 1, params.Value.toDouble(), params.Order, false);
686+
data = createDoubleDataUnit(pointType, addr, params.Value.toDouble(), params.Order, false);
686687
break;
687688
case DataDisplayMode::SwappedDbl:
688-
data = createDoubleDataUnit(pointType, params.Address - 1, params.Value.toDouble(), params.Order, true);
689+
data = createDoubleDataUnit(pointType, addr, params.Value.toDouble(), params.Order, true);
689690
break;
690691

691692
case DataDisplayMode::Int32:
692693
case DataDisplayMode::UInt32:
693-
data = createInt32DataUnit(pointType, params.Address - 1, params.Value.toInt(), params.Order, false);
694+
data = createInt32DataUnit(pointType, addr, params.Value.toInt(), params.Order, false);
694695
break;
695696

696697
case DataDisplayMode::SwappedInt32:
697698
case DataDisplayMode::SwappedUInt32:
698-
data = createInt32DataUnit(pointType, params.Address - 1, params.Value.toInt(), params.Order, true);
699+
data = createInt32DataUnit(pointType, addr, params.Value.toInt(), params.Order, true);
699700
break;
700701

701702
case DataDisplayMode::Int64:
702703
case DataDisplayMode::UInt64:
703-
data = createInt64DataUnit(pointType, params.Address - 1, params.Value.toLongLong(), params.Order, false);
704+
data = createInt64DataUnit(pointType, addr, params.Value.toLongLong(), params.Order, false);
704705
break;
705706

706707
case DataDisplayMode::SwappedInt64:
707708
case DataDisplayMode::SwappedUInt64:
708-
data = createInt64DataUnit(pointType, params.Address - 1, params.Value.toLongLong(), params.Order, true);
709+
data = createInt64DataUnit(pointType, addr, params.Value.toLongLong(), params.Order, true);
709710
break;
710711
}
711712
break;

0 commit comments

Comments
 (0)