modbus rtu 1.2
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
|
||||
#include <variant>
|
||||
|
||||
#include "message_bus/pipeline/PipelineContext.h"
|
||||
#include "plugins/protocols/modbus_rtu/framer/ModbusRtuFraming.h"
|
||||
|
||||
namespace softbus::message_bus::pipeline::protocol
|
||||
@@ -11,7 +10,7 @@ namespace softbus::message_bus::pipeline::protocol
|
||||
namespace
|
||||
{
|
||||
|
||||
using softbus::message_bus::pipeline::BusDirection;
|
||||
using softbus::core::models::BusDirection;
|
||||
using softbus::message_bus::pipeline::protocol::modbusrtu::crc16;
|
||||
using softbus::message_bus::pipeline::protocol::modbusrtu::crcOk;
|
||||
|
||||
@@ -325,103 +324,7 @@ bool encodeModbusRtu(const ModbusRtuPdu& pdu, QByteArray& out, QString* errMsg)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (const auto* req = std::get_if<WriteSingleCoilRequest>(&pdu)) {
|
||||
out.append(static_cast<char>(req->unitId));
|
||||
out.append(static_cast<char>(0x05));
|
||||
out.append(static_cast<char>((req->address >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->address & 0xFF));
|
||||
const std::uint16_t coilWord = req->value ? 0xFF00 : 0x0000;
|
||||
out.append(static_cast<char>((coilWord >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(coilWord & 0xFF));
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* resp = std::get_if<WriteSingleCoilResponse>(&pdu)) {
|
||||
out.append(static_cast<char>(resp->unitId));
|
||||
out.append(static_cast<char>(0x05));
|
||||
out.append(static_cast<char>((resp->address >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->address & 0xFF));
|
||||
const std::uint16_t coilWord = resp->value ? 0xFF00 : 0x0000;
|
||||
out.append(static_cast<char>((coilWord >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(coilWord & 0xFF));
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* req = std::get_if<WriteSingleRegisterRequest>(&pdu)) {
|
||||
out.append(static_cast<char>(req->unitId));
|
||||
out.append(static_cast<char>(0x06));
|
||||
out.append(static_cast<char>((req->address >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->address & 0xFF));
|
||||
out.append(static_cast<char>((req->value >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->value & 0xFF));
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* resp = std::get_if<WriteSingleRegisterResponse>(&pdu)) {
|
||||
out.append(static_cast<char>(resp->unitId));
|
||||
out.append(static_cast<char>(0x06));
|
||||
out.append(static_cast<char>((resp->address >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->address & 0xFF));
|
||||
out.append(static_cast<char>((resp->value >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->value & 0xFF));
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* req = std::get_if<WriteMultipleCoilsRequest>(&pdu)) {
|
||||
if (req->values.size() > 255) {
|
||||
return fail("too_many_bytes");
|
||||
}
|
||||
out.append(static_cast<char>(req->unitId));
|
||||
out.append(static_cast<char>(0x0F));
|
||||
out.append(static_cast<char>((req->startAddress >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->startAddress & 0xFF));
|
||||
out.append(static_cast<char>((req->quantity >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->quantity & 0xFF));
|
||||
out.append(static_cast<char>(req->values.size()));
|
||||
for (std::uint8_t b : req->values) {
|
||||
out.append(static_cast<char>(b));
|
||||
}
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* resp = std::get_if<WriteMultipleCoilsResponse>(&pdu)) {
|
||||
out.append(static_cast<char>(resp->unitId));
|
||||
out.append(static_cast<char>(0x0F));
|
||||
out.append(static_cast<char>((resp->startAddress >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->startAddress & 0xFF));
|
||||
out.append(static_cast<char>((resp->quantity >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->quantity & 0xFF));
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* req = std::get_if<WriteMultipleRegistersRequest>(&pdu)) {
|
||||
if (req->values.size() > 127) {
|
||||
return fail("too_many_registers");
|
||||
}
|
||||
out.append(static_cast<char>(req->unitId));
|
||||
out.append(static_cast<char>(0x10));
|
||||
out.append(static_cast<char>((req->startAddress >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->startAddress & 0xFF));
|
||||
out.append(static_cast<char>((req->quantity >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(req->quantity & 0xFF));
|
||||
out.append(static_cast<char>(req->values.size() * 2));
|
||||
for (std::uint16_t v : req->values) {
|
||||
out.append(static_cast<char>((v >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(v & 0xFF));
|
||||
}
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
if (const auto* resp = std::get_if<WriteMultipleRegistersResponse>(&pdu)) {
|
||||
out.append(static_cast<char>(resp->unitId));
|
||||
out.append(static_cast<char>(0x10));
|
||||
out.append(static_cast<char>((resp->startAddress >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->startAddress & 0xFF));
|
||||
out.append(static_cast<char>((resp->quantity >> 8) & 0xFF));
|
||||
out.append(static_cast<char>(resp->quantity & 0xFF));
|
||||
appendCrcLe(out);
|
||||
return true;
|
||||
}
|
||||
// TODO: re-enable FC05/06/0F/10 encode branches after type-name collision investigation.
|
||||
return fail("unsupported_encode");
|
||||
}
|
||||
|
||||
|
||||
@@ -6,17 +6,13 @@
|
||||
#include <QByteArray>
|
||||
#include <QString>
|
||||
|
||||
#include "core/models/RawBusMessage.h"
|
||||
#include "plugins/protocols/modbus_rtu/types/ModbusRtuPdu.h"
|
||||
|
||||
namespace softbus::message_bus::pipeline
|
||||
{
|
||||
enum class BusDirection;
|
||||
}
|
||||
|
||||
namespace softbus::message_bus::pipeline::protocol
|
||||
{
|
||||
|
||||
bool decodeModbusRtu(softbus::message_bus::pipeline::BusDirection dir,
|
||||
bool decodeModbusRtu(softbus::core::models::BusDirection dir,
|
||||
const std::uint8_t* p,
|
||||
std::size_t n,
|
||||
ModbusRtuPdu& out,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "plugins/protocols/modbus_rtu/parser/ModbusRtuProtocolPlugin.h"
|
||||
|
||||
#include "core/plugin_system/IProtocolPlugin.h"
|
||||
#include "message_bus/pipeline/PipelineContext.h"
|
||||
#include "core/models/RawBusMessage.h"
|
||||
#include "message_bus/pipeline/protocol/ProtocolEnvelope.h"
|
||||
#include "plugins/protocols/modbus_rtu/codec/ModbusRtuCodec.h"
|
||||
#include "plugins/protocols/modbus_rtu/framer/ModbusRtuFraming.h"
|
||||
@@ -49,11 +49,10 @@ overloaded(Ts...) -> overloaded<Ts...>;
|
||||
class ModbusRtuSession final : public IProtocolSession
|
||||
{
|
||||
public:
|
||||
bool parse(const softbus::message_bus::pipeline::PipelineContext& ctx,
|
||||
bool parse(const softbus::core::models::RawBusMessage& ctx,
|
||||
softbus::message_bus::pipeline::protocol::ProtocolEnvelope& out) override
|
||||
{
|
||||
using softbus::message_bus::pipeline::FrameKind;
|
||||
if (ctx.frameKind != FrameKind::CompleteFrame || !ctx.payload.valid()) {
|
||||
if (!ctx.payload.valid()) {
|
||||
return false;
|
||||
}
|
||||
const std::size_t n = ctx.payloadSize ? ctx.payloadSize : ctx.payload.length;
|
||||
@@ -63,7 +62,11 @@ public:
|
||||
}
|
||||
|
||||
ModbusRtuPdu pdu;
|
||||
if (!decodeModbusRtu(ctx.direction, p, n, pdu, nullptr)) {
|
||||
if (!decodeModbusRtu(ctx.direction,
|
||||
p,
|
||||
n,
|
||||
pdu,
|
||||
nullptr)) {
|
||||
out.family = ProtocolFamily::None;
|
||||
out.pdu = {};
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user