Skip to content

Commit 9b92fa6

Browse files
committed
Merge remote-tracking branch 'origin/dev'
2 parents d7a0efc + c2d4137 commit 9b92fa6

41 files changed

Lines changed: 886 additions & 914 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,20 @@ Registers
4141

4242
Modbus Logging
4343

44-
![image](https://github.com/sanny32/OpenModSim/assets/13627951/1ebf4973-44a5-4464-aada-26aa751f65da)
44+
![image](https://github.com/sanny32/OpenModSim/assets/13627951/23ae888d-4722-4065-a394-64e28f68ea62)
4545

4646

4747
## Extended Featues
4848

4949
Modbus Message Parser
5050

51-
![image](https://github.com/sanny32/OpenModScan/assets/13627951/86a82340-015e-4ee9-a483-b5ab83527cc1)
51+
![image](https://github.com/sanny32/OpenModSim/assets/13627951/7e9744b8-f4b3-439a-a312-79cbdc426dc2)
52+
5253

5354
## Scripting
5455
From version 1.2.0 Open ModSim supports scripting. Qt runtime implements the [ECMAScript Language Specification](http://www.ecma-international.org/publications/standards/Ecma-262.htm) standard, so Javascript is used to write code.
5556

56-
![image](https://github.com/sanny32/OpenModSim/assets/13627951/c03a7d23-3c69-43aa-a1d3-ae5096da4f54)
57+
![image](https://github.com/sanny32/OpenModSim/assets/13627951/c03a7d23-3c69-43aa-a1d3-ae5096da4f54)
5758

5859
Scripts can be launched in two modes: Once or Periodically. If you run script in Once mode the script will stop after it finishes executing. In Periodically mode, the script will start after a certain period of time until the user stops it or the method is called
5960
```javascript

omodsim/controls/modbuslogwidget.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <QEvent>
12
#include "htmldelegate.h"
23
#include "modbuslogwidget.h"
34

@@ -131,6 +132,19 @@ ModbusLogWidget::ModbusLogWidget(QWidget* parent)
131132
});
132133
}
133134

135+
///
136+
/// \brief ModbusLogWidget::changeEvent
137+
/// \param event
138+
///
139+
void ModbusLogWidget::changeEvent(QEvent* event)
140+
{
141+
if (event->type() == QEvent::LanguageChange)
142+
{
143+
update();
144+
}
145+
QListView::changeEvent(event);
146+
}
147+
134148
///
135149
/// \brief ModbusLogWidget::clear
136150
///
@@ -162,17 +176,22 @@ QModelIndex ModbusLogWidget::index(int row)
162176
///
163177
/// \brief ModbusLogWidget::addItem
164178
/// \param pdu
179+
/// \param protocol
165180
/// \param deviceId
181+
/// \param transactionId
166182
/// \param timestamp
167183
/// \param request
168184
/// \return
169185
///
170-
const ModbusMessage* ModbusLogWidget::addItem(const QModbusPdu& pdu, int deviceId, const QDateTime& timestamp, bool request)
186+
const ModbusMessage* ModbusLogWidget::addItem(const QModbusPdu& pdu, ModbusMessage::ProtocolType protocol, int deviceId, int transactionId, const QDateTime& timestamp, bool request)
171187
{
172188
const ModbusMessage* msg = nullptr;
173189
if(model())
174190
{
175-
msg = ModbusMessage::create(pdu, (QModbusAdu::Type)-1, deviceId, timestamp, request);
191+
msg = ModbusMessage::create(pdu, protocol, deviceId, timestamp, request);
192+
if(protocol == ModbusMessage::Tcp)
193+
((QModbusAduTcp*)msg->adu())->setTransactionId(transactionId);
194+
176195
((ModbusLogModel*)model())->append(msg);
177196
}
178197
return msg;

omodsim/controls/modbuslogwidget.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class ModbusLogWidget : public QListView
5353
int rowCount() const;
5454
QModelIndex index(int row);
5555

56-
const ModbusMessage* addItem(const QModbusPdu& pdu, int deviceId, const QDateTime& timestamp, bool request);
56+
const ModbusMessage* addItem(const QModbusPdu& pdu, ModbusMessage::ProtocolType protocol, int deviceId, int transactionId, const QDateTime& timestamp, bool request);
5757
const ModbusMessage* itemAt(const QModelIndex& index);
5858

5959
DataDisplayMode dataDisplayMode() const;
@@ -65,6 +65,9 @@ class ModbusLogWidget : public QListView
6565
bool autoscroll() const;
6666
void setAutoscroll(bool on);
6767

68+
protected:
69+
void changeEvent(QEvent* event) override;
70+
6871
private:
6972
bool _autoscroll;
7073
DataDisplayMode _dataDisplayMode;

omodsim/controls/modbusmessagewidget.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#include <QEvent>
22
#include "formatutils.h"
33
#include "htmldelegate.h"
4-
#include "modbusmessagewidget.h"
54
#include "modbusmessages.h"
5+
#include "modbusmessagewidget.h"
66

77
///
88
/// \brief ModbusMessageWidget::ModbusMessageWidget
@@ -147,16 +147,17 @@ void ModbusMessageWidget::update()
147147
}
148148

149149
auto addChecksum = [&]{
150-
if(_mm->protocolType() == QModbusAdu::Rtu)
150+
if(_mm->protocolType() == ModbusMessage::Rtu)
151151
{
152-
const auto checksum = formatWordValue(_dataDisplayMode, _mm->checksum());
153-
if(_mm->matchingChecksum())
152+
auto adu = reinterpret_cast<const QModbusAduRtu*>(_mm->adu());
153+
const auto checksum = formatWordValue(_dataDisplayMode, adu->checksum());
154+
if(adu->matchingChecksum())
154155
{
155156
addItem(tr("<b>Checksum:</b> %1").arg(checksum));
156157
}
157158
else
158159
{
159-
const auto calcChecksum = formatWordValue(_dataDisplayMode, _mm->calcChecksum());
160+
const auto calcChecksum = formatWordValue(_dataDisplayMode, adu->calcChecksum());
160161
addItem(tr("<b>Checksum:</b> <span style='color:%3'>%1</span> (Expected: %2)").arg(checksum, calcChecksum, _statusClr.name()));
161162
}
162163
}
@@ -165,11 +166,12 @@ void ModbusMessageWidget::update()
165166
addItem(tr("<b>Type:</b> %1").arg(_mm->isRequest() ? tr("Request (Tx)") : tr("Response (Rx)")));
166167
if(_showTimestamp) addItem(tr("<b>Timestamp:</b> %1").arg(_mm->timestamp().toString(Qt::ISODateWithMs)));
167168

168-
if(_mm->type() == ModbusMessage::Adu)
169+
if(_mm->protocolType() == ModbusMessage::Tcp)
169170
{
170-
const auto transactionId = _mm->isValid() ? formatWordValue(_dataDisplayMode, _mm->transactionId()) : "??";
171-
const auto protocolId = _mm->isValid() ? formatWordValue(_dataDisplayMode, _mm->protocolId()): "??";
172-
const auto length = _mm->isValid() ? formatWordValue(_dataDisplayMode, _mm->length()): "??";
171+
auto adu = reinterpret_cast<const QModbusAduTcp*>(_mm->adu());
172+
const auto transactionId = adu->isValid() ? formatWordValue(_dataDisplayMode, adu->transactionId()) : "??";
173+
const auto protocolId = adu->isValid() ? formatWordValue(_dataDisplayMode, adu->protocolId()): "??";
174+
const auto length = adu->isValid() ? formatWordValue(_dataDisplayMode, adu->length()): "??";
173175
addItem(tr("<b>Transaction ID:</b> %1").arg(transactionId));
174176
addItem(tr("<b>Protocol ID:</b> %1").arg(protocolId));
175177
addItem(tr("<b>Length:</b> %1").arg(length));
@@ -197,7 +199,7 @@ void ModbusMessageWidget::update()
197199
case QModbusPdu::ReadCoils:
198200
if(_mm->isRequest())
199201
{
200-
auto req = reinterpret_cast<const ReadCoilsRequest*>(_mm);
202+
auto req = reinterpret_cast<const ReadCoilsRequest*>(_mm);
201203
const auto startAddress = req->isValid() ? formatWordValue(_dataDisplayMode, req->startAddress()) : "??";
202204
const auto length = req->isValid() ? formatWordValue(_dataDisplayMode, req->length()): "??";
203205
addItem(tr("<b>Start Address:</b> %1").arg(startAddress));

omodsim/controls/outputwidget.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -583,20 +583,24 @@ void OutputWidget::paint(const QRect& rc, QPainter& painter)
583583
/// \brief OutputWidget::updateTraffic
584584
/// \param request
585585
/// \param server
586+
/// \param transactionId
587+
/// \param protocol
586588
///
587-
void OutputWidget::updateTraffic(const QModbusRequest& request, int server)
589+
void OutputWidget::updateTraffic(const QModbusRequest& request, int server, int transactionId, ModbusMessage::ProtocolType protocol)
588590
{
589-
updateLogView(true, server, request);
591+
updateLogView(true, server, transactionId, protocol, request);
590592
}
591593

592594
///
593595
/// \brief OutputWidget::updateTraffic
594596
/// \param response
595597
/// \param server
598+
/// \param transactionId
599+
/// \param protocol
596600
///
597-
void OutputWidget::updateTraffic(const QModbusResponse& response, int server)
601+
void OutputWidget::updateTraffic(const QModbusResponse& response, int server, int transactionId, ModbusMessage::ProtocolType protocol)
598602
{
599-
updateLogView(false, server, response);
603+
updateLogView(false, server, transactionId, protocol, response);
600604
}
601605

602606
///
@@ -827,11 +831,14 @@ void OutputWidget::showModbusMessage(const QModelIndex& index)
827831
///
828832
/// \brief OutputWidget::updateLogView
829833
/// \param request
834+
/// \param server
835+
/// \param transactionId
836+
/// \param protocol
830837
/// \param pdu
831838
///
832-
void OutputWidget::updateLogView(bool request, int server, const QModbusPdu& pdu)
839+
void OutputWidget::updateLogView(bool request, int server, int transactionId, ModbusMessage::ProtocolType protocol, const QModbusPdu& pdu)
833840
{
834-
auto msg = ui->logView->addItem(pdu, server, QDateTime::currentDateTime(), request);
841+
auto msg = ui->logView->addItem(pdu, protocol, server, transactionId, QDateTime::currentDateTime(), request);
835842
if(captureMode() == CaptureMode::TextCapture && msg != nullptr)
836843
{
837844
const auto str = QString("%1: %2 %3 %4").arg(

omodsim/controls/outputwidget.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <QListWidgetItem>
77
#include <QModbusReply>
88
#include "enums.h"
9+
#include "modbusmessage.h"
910
#include "datasimulator.h"
1011
#include "displaydefinition.h"
1112

@@ -113,8 +114,8 @@ class OutputWidget : public QWidget
113114

114115
void paint(const QRect& rc, QPainter& painter);
115116

116-
void updateTraffic(const QModbusRequest& request, int server);
117-
void updateTraffic(const QModbusResponse& response, int server);
117+
void updateTraffic(const QModbusRequest& request, int server, int transactionId, ModbusMessage::ProtocolType protocol);
118+
void updateTraffic(const QModbusResponse& response, int server, int transactionId, ModbusMessage::ProtocolType protocol);
118119
void updateData(const QModbusDataUnit& data);
119120

120121
AddressDescriptionMap descriptionMap() const;
@@ -135,7 +136,7 @@ private slots:
135136
private:
136137
void captureString(const QString& s);
137138
void showModbusMessage(const QModelIndex& index);
138-
void updateLogView(bool request, int deviceId, const QModbusPdu& pdu);
139+
void updateLogView(bool request, int deviceId, int transactionId, ModbusMessage::ProtocolType protocol, const QModbusPdu& pdu);
139140

140141
private:
141142
Ui::OutputWidget *ui;

omodsim/controls/outputwidget.ui

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
<property name="sizePolicy">
136136
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
137137
<horstretch>0</horstretch>
138-
<verstretch>2</verstretch>
138+
<verstretch>3</verstretch>
139139
</sizepolicy>
140140
</property>
141141
<property name="autoScroll">
@@ -170,7 +170,7 @@
170170
<property name="sizePolicy">
171171
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
172172
<horstretch>0</horstretch>
173-
<verstretch>1</verstretch>
173+
<verstretch>2</verstretch>
174174
</sizepolicy>
175175
</property>
176176
<property name="focusPolicy">

omodsim/dialogs/dialogmsgparser.cpp

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
///
77
/// \brief DialogMsgParser::DialogMsgParser
88
/// \param mode
9+
/// \param protocol
910
/// \param parent
1011
///
11-
DialogMsgParser::DialogMsgParser(DataDisplayMode mode, QWidget *parent)
12+
DialogMsgParser::DialogMsgParser(DataDisplayMode mode, ModbusMessage::ProtocolType protocol, QWidget *parent)
1213
: QDialog(parent)
1314
, ui(new Ui::DialogMsgParser)
1415
,_mm(nullptr)
@@ -21,6 +22,8 @@ DialogMsgParser::DialogMsgParser(DataDisplayMode mode, QWidget *parent)
2122

2223
ui->info->setShowTimestamp(false);
2324
ui->hexView->setCheckState(mode == DataDisplayMode::Hex ? Qt::Checked : Qt::Unchecked);
25+
ui->buttonRtu->setChecked(protocol == ModbusMessage::Rtu);
26+
ui->buttonTcp->setChecked(protocol == ModbusMessage::Tcp);
2427

2528
auto dispatcher = QAbstractEventDispatcher::instance();
2629
connect(dispatcher, &QAbstractEventDispatcher::awake, this, &DialogMsgParser::on_awake);
@@ -54,7 +57,6 @@ void DialogMsgParser::changeEvent(QEvent* event)
5457
///
5558
void DialogMsgParser::on_awake()
5659
{
57-
ui->deviceIdIncluded->setVisible(ui->buttonPdu->isChecked());
5860
ui->pushButtonParse->setEnabled(!ui->bytesData->isEmpty());
5961
}
6062

@@ -81,10 +83,6 @@ void DialogMsgParser::on_bytesData_valueChanged(const QByteArray& value)
8183

8284
return;
8385
}
84-
85-
const auto data = value.left(value.size() - 2);
86-
const int checksum = makeWord(value[value.size() - 1], value[value.size() - 2], ByteOrder::LittleEndian);
87-
ui->checksumIncluded->setChecked(QModbusAdu::calculateCRC(data, data.size()) == checksum);
8886
}
8987

9088
///
@@ -95,28 +93,11 @@ void DialogMsgParser::on_pushButtonParse_clicked()
9593
auto data = ui->bytesData->value();
9694
if(data.isEmpty()) return;
9795

98-
ModbusMessage::Type type = ModbusMessage::Adu;
99-
auto protocol = QModbusAdu::Tcp;
100-
int checksum = 0;
101-
102-
if(ui->buttonPdu->isChecked())
103-
{
104-
type = ModbusMessage::Pdu;
105-
}
106-
107-
if(!ui->deviceIdIncluded->isChecked())
108-
{
109-
data.push_front('\0');
110-
}
111-
112-
if(ui->checksumIncluded->isChecked())
113-
{
114-
protocol = QModbusAdu::Rtu;
115-
checksum = makeWord(data[data.size() - 1], data[data.size() - 2], ByteOrder::LittleEndian);
116-
data = data.left(data.size() - 2);
117-
}
96+
auto protocol = ModbusMessage::Rtu;
97+
if(ui->buttonTcp->isChecked())
98+
protocol = ModbusMessage::Tcp;
11899

119100
if(_mm) delete _mm;
120-
_mm = ModbusMessage::parse(data, type, protocol, ui->request->isChecked(), checksum);
101+
_mm = ModbusMessage::create(data, protocol, QDateTime::currentDateTime(), ui->request->isChecked());
121102
ui->info->setModbusMessage(_mm);
122103
}

omodsim/dialogs/dialogmsgparser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class DialogMsgParser : public QDialog
1717
Q_OBJECT
1818

1919
public:
20-
explicit DialogMsgParser(DataDisplayMode mode, QWidget *parent = nullptr);
20+
explicit DialogMsgParser(DataDisplayMode mode, ModbusMessage::ProtocolType protocol, QWidget *parent = nullptr);
2121
~DialogMsgParser();
2222

2323
protected:

omodsim/dialogs/dialogmsgparser.ui

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
<item>
1818
<layout class="QHBoxLayout" name="horizontalLayout_2">
1919
<item>
20-
<widget class="QPushButton" name="buttonPdu">
20+
<widget class="QPushButton" name="buttonRtu">
2121
<property name="styleSheet">
2222
<string notr="true">padding: 4px;</string>
2323
</property>
2424
<property name="text">
25-
<string>PDU Message</string>
25+
<string>RTU Message</string>
2626
</property>
2727
<property name="checkable">
2828
<bool>true</bool>
@@ -56,12 +56,12 @@
5656
</widget>
5757
</item>
5858
<item>
59-
<widget class="QPushButton" name="buttonAdu">
59+
<widget class="QPushButton" name="buttonTcp">
6060
<property name="styleSheet">
6161
<string notr="true">padding: 4px;</string>
6262
</property>
6363
<property name="text">
64-
<string>ADU Message</string>
64+
<string>TCP Message</string>
6565
</property>
6666
<property name="checkable">
6767
<bool>true</bool>
@@ -124,23 +124,6 @@
124124
</property>
125125
</widget>
126126
</item>
127-
<item>
128-
<widget class="QCheckBox" name="deviceIdIncluded">
129-
<property name="text">
130-
<string>Device Id included</string>
131-
</property>
132-
<property name="checked">
133-
<bool>true</bool>
134-
</property>
135-
</widget>
136-
</item>
137-
<item>
138-
<widget class="QCheckBox" name="checksumIncluded">
139-
<property name="text">
140-
<string>Checksum included</string>
141-
</property>
142-
</widget>
143-
</item>
144127
</layout>
145128
</item>
146129
<item>

0 commit comments

Comments
 (0)