map/das-dn/third_party/AdsLib/AdsVariable.h

88 lines
2.2 KiB
C
Raw Normal View History

2024-12-03 10:36:06 +08:00
// SPDX-License-Identifier: MIT
/**
Copyright (c) 2020 - 2022 Beckhoff Automation GmbH & Co. KG
*/
#pragma once
#include "AdsDevice.h"
2024-12-09 09:41:04 +08:00
namespace Beckhoff
{
namespace Ads
{
2024-12-03 10:36:06 +08:00
template<typename T>
struct AdsVariable {
AdsVariable(const AdsDevice& route, const std::string& symbolName)
: m_Route(route),
m_IndexGroup(ADSIGRP_SYM_VALBYHND),
m_Handle(route.GetHandle(symbolName))
{}
AdsVariable(const AdsDevice& route, const uint32_t group, const uint32_t offset)
: m_Route(route),
m_IndexGroup(group),
m_Handle(route.GetHandle(offset))
{}
operator T() const
{
T buffer;
Read(sizeof(buffer), &buffer);
return buffer;
}
void operator=(const T& value) const
{
Write(sizeof(T), &value);
}
template<typename U, size_t N>
operator std::array<U, N>() const
{
std::array<U, N> buffer;
Read(sizeof(U) * N, buffer.data());
return buffer;
}
template<typename U, size_t N>
void operator=(const std::array<U, N>& value) const
{
Write(sizeof(U) * N, value.data());
}
void Read(const size_t size, void* data) const
{
2024-12-10 14:25:46 +08:00
if (!m_Route.IsConnected()) return;
2024-12-03 10:36:06 +08:00
uint32_t bytesRead = 0;
auto error = m_Route.ReadReqEx2(m_IndexGroup,
*m_Handle,
size,
data,
&bytesRead);
if (error || (size != bytesRead)) {
2024-12-10 14:25:46 +08:00
LOG_ERROR("AdsVariable read failed: "<< std::dec << error);
2024-12-11 10:30:30 +08:00
((AdsDevice&)m_Route).DisconnectDevice();
2024-12-09 09:41:04 +08:00
//throw AdsException(error);
2024-12-03 10:36:06 +08:00
}
}
void Write(const size_t size, const void* data) const
{
2024-12-10 14:25:46 +08:00
if (!m_Route.IsConnected()) return;
2024-12-03 10:36:06 +08:00
auto error = m_Route.WriteReqEx(m_IndexGroup, *m_Handle, size, data);
if (error) {
2024-12-10 14:25:46 +08:00
LOG_ERROR("AdsVariable write failed:" << std::dec << error);
2024-12-11 10:30:30 +08:00
((AdsDevice&)m_Route).DisconnectDevice();
2024-12-09 09:41:04 +08:00
//throw AdsException(error);
2024-12-03 10:36:06 +08:00
}
}
private:
const AdsDevice& m_Route;
const uint32_t m_IndexGroup;
const AdsHandle m_Handle;
};
2024-12-09 09:41:04 +08:00
}
}