39#ifndef DETERMINISTICESPASYNCWEBSERVER_ADS_H
40#define DETERMINISTICESPASYNCWEBSERVER_ADS_H
49#define ADS_TCP_PORT 48898
50#define ADS_AMSTCP_HDR_LEN 6
51#define ADS_AMS_HDR_LEN 32
53#define ADS_NET_ID_LEN 6
54#define ADS_DEVICE_NAME_LEN 16
57enum class AdsCommand : uint16_t
60 read_device_info = 0x0001,
64 write_control = 0x0005,
65 add_notification = 0x0006,
66 del_notification = 0x0007,
67 notification = 0x0008,
75 static constexpr uint16_t response = 0x0001;
76 static constexpr uint16_t no_return = 0x0002;
77 static constexpr uint16_t ads_command = 0x0004;
78 static constexpr uint16_t sys_command = 0x0008;
79 static constexpr uint16_t high_prio = 0x0010;
80 static constexpr uint16_t timestamp = 0x0020;
81 static constexpr uint16_t udp = 0x0040;
82 static constexpr uint16_t init_command = 0x0080;
83 static constexpr uint16_t broadcast = 0x8000;
85 static constexpr uint16_t request = ads_command;
86 static constexpr uint16_t reply = ads_command | response;
90enum class AdsState : uint16_t
112enum class AdsTransMode : uint32_t
116 client_on_change = 2,
118 server_on_change = 4,
124 static constexpr uint32_t sym_hnd_by_name = 0xF003;
125 static constexpr uint32_t sym_val_by_handle = 0xF005;
126 static constexpr uint32_t sym_release_handle = 0xF006;
127 static constexpr uint32_t sym_info_by_name_ex = 0xF009;
128 static constexpr uint32_t sym_upload = 0xF00B;
129 static constexpr uint32_t sym_upload_info = 0xF00F;
130 static constexpr uint32_t io_image_rw_ib = 0xF020;
131 static constexpr uint32_t io_image_rw_ob = 0xF030;
132 static constexpr uint32_t plc_rw_m = 0x4020;
133 static constexpr uint32_t plc_rw_rb = 0x4030;
139 uint8_t net_id[ADS_NET_ID_LEN];
157 uint16_t state_flags;
173struct AdsReadStateResult
177 uint16_t device_state;
184 uint8_t version_major;
185 uint8_t version_minor;
186 uint16_t version_build;
187 char device_name[ADS_DEVICE_NAME_LEN + 1];
196size_t ads_build_read_device_info(uint8_t *buf,
size_t cap,
const AdsRequest *r);
199size_t ads_build_read_state(uint8_t *buf,
size_t cap,
const AdsRequest *r);
202size_t ads_build_read(uint8_t *buf,
size_t cap,
const AdsRequest *r, uint32_t index_group, uint32_t index_offset,
206size_t ads_build_write(uint8_t *buf,
size_t cap,
const AdsRequest *r, uint32_t index_group, uint32_t index_offset,
207 const uint8_t *data, uint32_t len);
212size_t ads_build_read_write(uint8_t *buf,
size_t cap,
const AdsRequest *r, uint32_t index_group, uint32_t index_offset,
213 uint32_t read_len,
const uint8_t *write_data, uint32_t write_len);
216size_t ads_build_write_control(uint8_t *buf,
size_t cap,
const AdsRequest *r, uint16_t ads_state, uint16_t device_state,
217 const uint8_t *data, uint32_t len);
221size_t ads_build_add_notification(uint8_t *buf,
size_t cap,
const AdsRequest *r, uint32_t index_group,
222 uint32_t index_offset, uint32_t length, AdsTransMode mode, uint32_t max_delay,
223 uint32_t cycle_time);
226size_t ads_build_del_notification(uint8_t *buf,
size_t cap,
const AdsRequest *r, uint32_t notification_handle);
234bool ads_parse_ams_header(
const uint8_t *buf,
size_t len, AdsAmsHeader *out);
237bool ads_parse_read(
const uint8_t *data,
size_t data_len, AdsReadResult *out);
240bool ads_parse_result(
const uint8_t *data,
size_t data_len, uint32_t *result);
243bool ads_parse_read_state(
const uint8_t *data,
size_t data_len, AdsReadStateResult *out);
246bool ads_parse_read_device_info(
const uint8_t *data,
size_t data_len, AdsDeviceInfo *out);
249bool ads_parse_add_notification(
const uint8_t *data,
size_t data_len, uint32_t *result, uint32_t *handle);
253using AdsNotificationSampleFn = void (*)(uint32_t notification_handle,
const uint8_t *sample, uint32_t sample_len,
254 uint64_t timestamp,
void *user);
259bool ads_parse_notification(
const uint8_t *data,
size_t data_len, AdsNotificationSampleFn on_sample,
void *user);
User-facing configuration for DeterministicESPAsyncWebServer.