map/das-dn/third_party/AdsLib/ECatAccess.cpp

96 lines
2.7 KiB
C++
Raw Normal View History

2024-12-03 10:36:06 +08:00
#include "ECatAccess.h"
#include "Log.h"
#include <iostream>
#include <vector>
2024-12-09 09:41:04 +08:00
namespace Beckhoff
2024-12-03 10:36:06 +08:00
{
2024-12-09 09:41:04 +08:00
namespace Ads
2024-12-03 10:36:06 +08:00
{
ECatAccess::ECatAccess(const std::string& gw, const AmsNetId netid, const uint16_t port)
: device(gw, netid, port ? port : uint16_t(AMSPORT_R0_IO))
{}
long ECatAccess::ListECatMasters(std::ostream& os) const
{
uint32_t numberOfDevices;
uint32_t bytesRead;
auto status = device.ReadReqEx2(
IOADS_IGR_IODEVICESTATE_BASE,
IOADS_IOF_READDEVCOUNT,
sizeof(numberOfDevices), &numberOfDevices,
&bytesRead);
if (status != ADSERR_NOERR) {
LOG_ERROR("Reading device count failed with 0x" << std::hex << status);
return status;
}
if (numberOfDevices == 0) {
return status;
}
// the first element of the vector is set to devCount,
// so the actual device Ids start at index 1
std::vector<uint16_t> deviceIds(numberOfDevices + 1);
status = device.ReadReqEx2(
IOADS_IGR_IODEVICESTATE_BASE,
IOADS_IOF_READDEVIDS,
deviceIds.capacity() * sizeof(uint16_t),
deviceIds.data(), &bytesRead);
if (status != ADSERR_NOERR) {
LOG_ERROR("Reading device ids failed with 0x" << std::hex << status);
return status;
}
// Skip the device count, which is at the first index
for (uint32_t i = 1; i <= numberOfDevices; i++) {
uint16_t devType;
status = device.ReadReqEx2(
IOADS_IGR_IODEVICESTATE_BASE + deviceIds[i],
IOADS_IOF_READDEVTYPE,
sizeof(devType),
&devType,
&bytesRead);
if (status != ADSERR_NOERR) {
LOG_ERROR("Reading type for device[" << deviceIds[i] << "] failed with 0x" << std::hex << status);
return status;
}
char deviceName[0xff] = {0};
status = device.ReadReqEx2(
IOADS_IGR_IODEVICESTATE_BASE + deviceIds[i],
IOADS_IOF_READDEVNAME,
sizeof(deviceName) - 1,
deviceName,
&bytesRead);
if (status != ADSERR_NOERR) {
LOG_ERROR("Reading name for device[" << deviceIds[i] << "] failed with 0x" << std::hex << status);
return status;
}
AmsNetId netId = {0};
status = device.ReadReqEx2(
IOADS_IGR_IODEVICESTATE_BASE + deviceIds[i],
IOADS_IOF_READDEVNETID,
sizeof(netId),
&netId,
&bytesRead);
if (status != ADSERR_NOERR) {
LOG_ERROR("Reading AmsNetId for device[" << deviceIds[i] << "] failed with 0x" << std::hex << status);
return status;
}
os << deviceIds[i] << " | " << devType << " | " << deviceName << " | " << netId << '\n';
}
return status;
}
}
}