47 [[nodiscard]]
bool busy() const noexcept;
67 std::span<
std::uint16_t> out_words,
75 std::span<
std::uint16_t> out_words,
83 std::span<
std::uint16_t> out_words,
92 std::span<
std::uint16_t> out_words,
102 void* user) noexcept;
106 std::uint32_t now_ms,
108 std::uint16_t points,
111 void* user) noexcept;
115 std::uint32_t now_ms,
118 void* user) noexcept;
122 std::uint32_t now_ms,
125 void* user) noexcept;
129 std::uint32_t now_ms,
132 void* user) noexcept;
136 std::uint32_t now_ms,
138 std::span<const
std::uint16_t> words,
140 void* user) noexcept;
144 std::uint32_t now_ms,
147 void* user) noexcept;
151 std::uint32_t now_ms,
155 void* user) noexcept;
159 std::uint32_t now_ms,
161 std::uint16_t points,
162 std::span<
std::uint16_t> out_words,
164 void* user) noexcept;
168 std::uint32_t now_ms,
170 std::span<const
std::uint16_t> words,
172 void* user) noexcept;
176 std::uint32_t now_ms,
178 std::span<
std::uint32_t> out_values,
180 void* user) noexcept;
184 std::uint32_t now_ms,
186 std::span<
std::uint32_t> out_values,
188 void* user) noexcept;
192 std::uint32_t now_ms,
195 void* user) noexcept;
199 std::uint32_t now_ms,
202 void* user) noexcept;
206 std::uint32_t now_ms,
209 void* user) noexcept;
213 std::uint32_t now_ms,
216 void* user) noexcept;
220 std::uint32_t now_ms,
223 void* user) noexcept;
227 std::uint32_t now_ms,
229 std::span<
std::uint16_t> out_words,
233 void* user) noexcept;
241 std::uint32_t now_ms,
243 std::span<
std::uint16_t> out_words,
247 void* user) noexcept;
251 std::uint32_t now_ms,
254 void* user) noexcept;
258 std::uint32_t now_ms,
261 void* user) noexcept;
265 std::uint32_t now_ms,
268 void* user) noexcept;
272 std::uint32_t now_ms,
275 void* user) noexcept;
279 std::uint32_t now_ms,
282 void* user) noexcept;
286 std::uint32_t now_ms,
287 std::span<
std::uint32_t> out_values,
289 void* user) noexcept;
293 std::uint32_t now_ms,
294 std::span<
std::uint16_t> out_words,
296 void* user) noexcept;
300 std::uint32_t now_ms,
302 std::span<
std::uint16_t> out_words,
304 void* user) noexcept;
308 std::uint32_t now_ms,
311 void* user) noexcept;
315 std::uint32_t now_ms,
317 std::span<
std::
byte> out_bytes,
319 void* user) noexcept;
323 std::uint32_t now_ms,
326 void* user) noexcept;
330 std::uint32_t now_ms,
333 void* user) noexcept;
337 std::uint32_t now_ms,
341 void* user) noexcept;
345 std::uint32_t now_ms,
347 void* user) noexcept;
351 std::uint32_t now_ms,
354 void* user) noexcept;
358 std::uint32_t now_ms,
360 void* user) noexcept;
364 std::uint32_t now_ms,
365 std::string_view remote_password,
367 void* user) noexcept;
371 std::uint32_t now_ms,
372 std::string_view remote_password,
374 void* user) noexcept;
378 std::uint32_t now_ms,
380 void* user) noexcept;
387 std::uint32_t now_ms,
389 void* user) noexcept;
393 std::uint32_t now_ms,
397 void* user) noexcept;
401 std::uint32_t now_ms,
404 void* user) noexcept;
408 std::uint32_t now_ms,
411 void* user) noexcept;
415 std::uint32_t now_ms,
418 void* user) noexcept;
422 std::uint32_t now_ms,
424 void* user) noexcept;
428 std::uint32_t now_ms,
430 void* user) noexcept;
434 std::uint32_t now_ms,
435 std::span<const
char> hex_ascii,
436 std::span<
char> out_echoed,
438 void* user) noexcept;
441 enum class OperationKind :
std::uint8_t {
444 ReadExtendedFileRegisterWords,
445 DirectReadExtendedFileRegisterWords,
448 WriteExtendedFileRegisterWords,
449 DirectWriteExtendedFileRegisterWords,
451 ExtendedBatchReadWords,
452 ExtendedBatchWriteWords,
453#if MCPROTOCOL_SERIAL_ENABLE_RANDOM_COMMANDS
456 RandomWriteExtendedFileRegisterWords,
459#if MCPROTOCOL_SERIAL_ENABLE_MULTI_BLOCK_COMMANDS
463#if MCPROTOCOL_SERIAL_ENABLE_MONITOR_COMMANDS
465 RegisterExtendedFileRegisterMonitor,
467 ReadExtendedFileRegisterMonitor,
469#if MCPROTOCOL_SERIAL_ENABLE_HOST_BUFFER_COMMANDS
473#if MCPROTOCOL_SERIAL_ENABLE_MODULE_BUFFER_COMMANDS
477#if MCPROTOCOL_SERIAL_ENABLE_CPU_MODEL_COMMANDS
484 UnlockRemotePassword,
486 ClearErrorInformation,
492 InitializeTransmissionSequence,
493 DeregisterCpuMonitoring,
494#if MCPROTOCOL_SERIAL_ENABLE_LOOPBACK_COMMANDS
499 [[nodiscard]]
Status start_request(
500 std::uint32_t now_ms,
501 OperationKind operation,
502 std::size_t request_data_size,
504 void* user)
noexcept;
506 [[nodiscard]] std::uint8_t expected_e1_response_subheader() const noexcept;
507 [[nodiscard]]
std::
size_t expected_e1_success_response_data_size() const noexcept;
508 [[nodiscard]]
Status handle_response(
std::span<const
std::uint8_t> response_data) noexcept;
509 void complete(
Status status) noexcept;
510 void clear_pending_outputs() noexcept;
511 void clear_pending_copies() noexcept;
514 Rs485Hooks rs485_hooks_ {};
515 bool configured_ =
false;
517 bool awaiting_write_complete_ =
false;
518 OperationKind operation_ = OperationKind::None;
520 void* callback_user_ =
nullptr;
521 std::uint32_t response_deadline_ms_ = 0;
522 std::uint32_t inter_byte_deadline_ms_ = 0;
524 std::array<std::uint8_t, kMaxRequestFrameBytes> tx_frame_ {};
525 std::size_t tx_frame_size_ = 0;
526 std::array<std::uint8_t, kMaxResponseFrameBytes> rx_frame_ {};
527 std::size_t rx_frame_size_ = 0;
528 std::array<std::uint8_t, kMaxRequestDataBytes> request_data_ {};
530 BatchReadWordsRequest batch_read_words_request_ {};
531 ExtendedFileRegisterBatchReadWordsRequest extended_file_register_read_request_ {};
532 ExtendedFileRegisterDirectBatchReadWordsRequest direct_extended_file_register_read_request_ {};
533 BatchReadBitsRequest batch_read_bits_request_ {};
534 UserFrameReadRequest user_frame_read_request_ {};
535 QualifiedBufferWordDevice extended_batch_words_device_ {};
536 std::uint16_t extended_batch_words_points_ = 0;
537#if MCPROTOCOL_SERIAL_ENABLE_HOST_BUFFER_COMMANDS
538 HostBufferReadRequest host_buffer_read_request_ {};
540#if MCPROTOCOL_SERIAL_ENABLE_MODULE_BUFFER_COMMANDS
541 ModuleBufferReadRequest module_buffer_read_request_ {};
546#if MCPROTOCOL_SERIAL_ENABLE_RANDOM_COMMANDS || MCPROTOCOL_SERIAL_ENABLE_MONITOR_COMMANDS
549#if MCPROTOCOL_SERIAL_ENABLE_MODULE_BUFFER_COMMANDS
552#if MCPROTOCOL_SERIAL_ENABLE_LOOPBACK_COMMANDS
555#if MCPROTOCOL_SERIAL_ENABLE_MULTI_BLOCK_COMMANDS
558#if MCPROTOCOL_SERIAL_ENABLE_CPU_MODEL_COMMANDS
559 CpuModelInfo* out_cpu_model_ =
nullptr;
561 UserFrameRegistrationData* out_user_frame_data_ =
nullptr;
563#if MCPROTOCOL_SERIAL_ENABLE_RANDOM_COMMANDS || MCPROTOCOL_SERIAL_ENABLE_MONITOR_COMMANDS
564 std::array<RandomReadItem, kMaxRandomAccessItems> pending_random_items_ {};
565 std::size_t pending_random_item_count_ = 0;
567#if MCPROTOCOL_SERIAL_ENABLE_MONITOR_COMMANDS
568 std::array<RandomReadItem, kMaxMonitorItems> monitor_items_ {};
569 std::size_t monitor_item_count_ = 0;
570 bool monitor_registered_ =
false;
571 std::array<ExtendedFileRegisterAddress, kMaxMonitorItems> pending_extended_file_register_items_ {};
572 std::size_t pending_extended_file_register_item_count_ = 0;
573 std::array<ExtendedFileRegisterAddress, kMaxMonitorItems> extended_file_register_monitor_items_ {};
574 std::size_t extended_file_register_monitor_item_count_ = 0;
575 bool extended_file_register_monitor_registered_ =
false;
577#if MCPROTOCOL_SERIAL_ENABLE_MULTI_BLOCK_COMMANDS
578 std::array<MultiBlockReadBlock, kMaxMultiBlockCount> pending_multi_blocks_ {};
579 std::size_t pending_multi_block_count_ = 0;
581#if MCPROTOCOL_SERIAL_ENABLE_LOOPBACK_COMMANDS
582 std::array<char, kMaxLoopbackBytes> pending_loopback_ {};
583 std::size_t pending_loopback_size_ = 0;
Asynchronous MC protocol client for UART / serial integrations.
MelsecSerialClient()=default
Status async_link_direct_random_write_words(std::uint32_t now_ms, std::span< const LinkDirectRandomWriteWordItem > items, CompletionHandler callback, void *user) noexcept
Starts native Jn\\... random word write (1402 + device extension specification).
Status async_read_extended_file_register_monitor(std::uint32_t now_ms, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts extended file-register monitor read.
std::span< const std::byte > pending_tx_frame() const noexcept
Returns the encoded frame that should be sent to the UART layer.
Status async_batch_write_words(std::uint32_t now_ms, const BatchWriteWordsRequest &request, CompletionHandler callback, void *user) noexcept
Starts contiguous word write (1401).
Status async_control_global_signal(std::uint32_t now_ms, const GlobalSignalControlRequest &request, CompletionHandler callback, void *user) noexcept
Starts C24 global-signal ON/OFF control (1618).
Status async_remote_latch_clear(std::uint32_t now_ms, CompletionHandler callback, void *user) noexcept
Starts remote latch clear (1005).
Status async_random_read(std::uint32_t now_ms, const RandomReadRequest &request, std::span< std::uint32_t > out_values, CompletionHandler callback, void *user) noexcept
Starts native random read (0403).
Status async_link_direct_register_monitor(std::uint32_t now_ms, const LinkDirectMonitorRegistration &request, CompletionHandler callback, void *user) noexcept
Starts native Jn\\... monitor registration (0801 + device extension specification).
Status async_link_direct_random_read(std::uint32_t now_ms, std::span< const LinkDirectRandomReadItem > items, std::span< std::uint32_t > out_values, CompletionHandler callback, void *user) noexcept
Starts native Jn\\... random read (0403 + device extension specification).
bool busy() const noexcept
Returns whether a request is currently in flight.
Status async_direct_write_extended_file_register_words(std::uint32_t now_ms, const ExtendedFileRegisterDirectBatchWriteWordsRequest &request, CompletionHandler callback, void *user) noexcept
Starts direct extended file-register word write.
Status async_unlock_remote_password(std::uint32_t now_ms, std::string_view remote_password, CompletionHandler callback, void *user) noexcept
Unlocks remote-password-protected access (1630).
Status async_extended_batch_read_words(std::uint32_t now_ms, const QualifiedBufferWordDevice &device, std::uint16_t points, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts helper qualified word read over module-buffer access.
Status async_register_extended_file_register_monitor(std::uint32_t now_ms, const ExtendedFileRegisterMonitorRegistration &request, CompletionHandler callback, void *user) noexcept
Starts extended file-register monitor registration.
Status async_link_direct_batch_write_bits(std::uint32_t now_ms, const LinkDirectDevice &device, std::span< const BitValue > bits, CompletionHandler callback, void *user) noexcept
Starts Jn\\... link-direct contiguous bit write over device extension specification.
Status async_initialize_c24_transmission_sequence(std::uint32_t now_ms, CompletionHandler callback, void *user) noexcept
Starts C24 transmission-sequence initialization (1615).
Status async_link_direct_batch_read_bits(std::uint32_t now_ms, const LinkDirectDevice &device, std::uint16_t points, std::span< BitValue > out_bits, CompletionHandler callback, void *user) noexcept
Starts Jn\\... link-direct bit read over device extension specification.
Status async_link_direct_batch_read_words(std::uint32_t now_ms, const LinkDirectDevice &device, std::uint16_t points, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts Jn\\... link-direct word read over device extension specification.
Status async_deregister_cpu_monitoring(std::uint32_t now_ms, CompletionHandler callback, void *user) noexcept
Starts programmable-controller CPU monitoring deregistration (0631).
Status async_write_host_buffer(std::uint32_t now_ms, const HostBufferWriteRequest &request, CompletionHandler callback, void *user) noexcept
Starts host-buffer write (1613).
Status async_read_user_frame(std::uint32_t now_ms, const UserFrameReadRequest &request, UserFrameRegistrationData &out_data, CompletionHandler callback, void *user) noexcept
Starts user-frame registration-data read (0610).
Status async_multi_block_write(std::uint32_t now_ms, const MultiBlockWriteRequest &request, CompletionHandler callback, void *user) noexcept
Starts native multi-block write (1406).
Status async_delete_user_frame(std::uint32_t now_ms, const UserFrameDeleteRequest &request, CompletionHandler callback, void *user) noexcept
Starts user-frame registration-data delete (1610, subcommand 0001).
Status async_multi_block_read(std::uint32_t now_ms, const MultiBlockReadRequest &request, std::span< std::uint16_t > out_words, std::span< BitValue > out_bits, std::span< MultiBlockReadBlockResult > out_results, CompletionHandler callback, void *user) noexcept
Starts native multi-block read (0406).
Status async_remote_pause(std::uint32_t now_ms, RemoteOperationMode mode, CompletionHandler callback, void *user) noexcept
Starts remote PAUSE (1003).
void cancel() noexcept
Cancels the in-flight request and clears transient state.
Status async_link_direct_batch_write_words(std::uint32_t now_ms, const LinkDirectDevice &device, std::span< const std::uint16_t > words, CompletionHandler callback, void *user) noexcept
Starts Jn\\... link-direct contiguous word write over device extension specification.
Status async_read_host_buffer(std::uint32_t now_ms, const HostBufferReadRequest &request, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts host-buffer read (0613).
Status async_read_monitor(std::uint32_t now_ms, std::span< std::uint32_t > out_values, CompletionHandler callback, void *user) noexcept
Starts monitor read (0802) using the most recent registration.
Status async_link_direct_multi_block_write(std::uint32_t now_ms, const LinkDirectMultiBlockWriteRequest &request, CompletionHandler callback, void *user) noexcept
Starts native Jn\\... multi-block write (1406 + device extension specification).
Status async_link_direct_random_write_bits(std::uint32_t now_ms, std::span< const LinkDirectRandomWriteBitItem > items, CompletionHandler callback, void *user) noexcept
Starts native Jn\\... random bit write (1402 + device extension specification).
Status configure(const ProtocolConfig &config) noexcept
Stores protocol settings and validates the static configuration.
Status async_read_module_buffer(std::uint32_t now_ms, const ModuleBufferReadRequest &request, std::span< std::byte > out_bytes, CompletionHandler callback, void *user) noexcept
Starts module-buffer byte read (0601).
Status async_loopback(std::uint32_t now_ms, std::span< const char > hex_ascii, std::span< char > out_echoed, CompletionHandler callback, void *user) noexcept
Starts loopback using hexadecimal ASCII payload bytes.
Status async_remote_stop(std::uint32_t now_ms, CompletionHandler callback, void *user) noexcept
Starts remote STOP (1002).
void set_rs485_hooks(const Rs485Hooks &hooks) noexcept
Installs optional RS-485 TX begin/end hooks used by the async workflow.
Status async_write_user_frame(std::uint32_t now_ms, const UserFrameWriteRequest &request, CompletionHandler callback, void *user) noexcept
Starts user-frame registration-data write (1610, subcommand 0000).
void poll(std::uint32_t now_ms) noexcept
Checks timeouts for the current in-flight request.
Status async_link_direct_multi_block_read(std::uint32_t now_ms, const LinkDirectMultiBlockReadRequest &request, std::span< std::uint16_t > out_words, std::span< BitValue > out_bits, std::span< MultiBlockReadBlockResult > out_results, CompletionHandler callback, void *user) noexcept
Starts native Jn\\... multi-block read (0406 + device extension specification).
Status async_write_module_buffer(std::uint32_t now_ms, const ModuleBufferWriteRequest &request, CompletionHandler callback, void *user) noexcept
Starts module-buffer byte write (1601).
Status async_clear_error_information(std::uint32_t now_ms, CompletionHandler callback, void *user) noexcept
Starts clear error information (1617) for serial/C24 targets.
Status notify_tx_complete(std::uint32_t now_ms, Status transport_status=ok_status()) noexcept
Advances the state machine after the transport finished sending the pending frame.
Status async_direct_read_extended_file_register_words(std::uint32_t now_ms, const ExtendedFileRegisterDirectBatchReadWordsRequest &request, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts direct extended file-register word read.
Status async_batch_write_bits(std::uint32_t now_ms, const BatchWriteBitsRequest &request, CompletionHandler callback, void *user) noexcept
Starts contiguous bit write (1401 bit path).
Status async_random_write_bits(std::uint32_t now_ms, std::span< const RandomWriteBitItem > items, CompletionHandler callback, void *user) noexcept
Starts native random bit write (1402 bit path).
Status async_write_extended_file_register_words(std::uint32_t now_ms, const ExtendedFileRegisterBatchWriteWordsRequest &request, CompletionHandler callback, void *user) noexcept
Starts extended file-register word write.
Status async_batch_read_words(std::uint32_t now_ms, const BatchReadWordsRequest &request, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts contiguous word read (0401).
Status async_remote_reset(std::uint32_t now_ms, CompletionHandler callback, void *user) noexcept
Starts remote RESET (1006).
Status async_remote_run(std::uint32_t now_ms, RemoteOperationMode mode, RemoteRunClearMode clear_mode, CompletionHandler callback, void *user) noexcept
Starts remote RUN (1001).
Status async_batch_read_bits(std::uint32_t now_ms, const BatchReadBitsRequest &request, std::span< BitValue > out_bits, CompletionHandler callback, void *user) noexcept
Starts contiguous bit read (0401 bit path).
Status async_read_extended_file_register_words(std::uint32_t now_ms, const ExtendedFileRegisterBatchReadWordsRequest &request, std::span< std::uint16_t > out_words, CompletionHandler callback, void *user) noexcept
Starts extended file-register word read.
Status async_random_write_words(std::uint32_t now_ms, std::span< const RandomWriteWordItem > items, CompletionHandler callback, void *user) noexcept
Starts native random word/dword write (1402 word path).
Status async_extended_batch_write_words(std::uint32_t now_ms, const QualifiedBufferWordDevice &device, std::span< const std::uint16_t > words, CompletionHandler callback, void *user) noexcept
Starts helper qualified word write over module-buffer access.
void on_rx_bytes(std::uint32_t now_ms, std::span< const std::byte > bytes) noexcept
Feeds received bytes into the response decoder.
Status async_register_monitor(std::uint32_t now_ms, const MonitorRegistration &request, CompletionHandler callback, void *user) noexcept
Starts monitor registration (0801).
Status async_random_write_extended_file_register_words(std::uint32_t now_ms, std::span< const ExtendedFileRegisterRandomWriteWordItem > items, CompletionHandler callback, void *user) noexcept
Starts extended file-register random word write.
Status async_lock_remote_password(std::uint32_t now_ms, std::string_view remote_password, CompletionHandler callback, void *user) noexcept
Locks remote-password-protected access (1631).
Status async_read_cpu_model(std::uint32_t now_ms, CpuModelInfo &out_info, CompletionHandler callback, void *user) noexcept
Starts CPU-model read.
Frame-level and command-payload-level encode/decode helpers.
RemoteOperationMode
Conflict-handling mode for remote RUN / PAUSE.
BitValue
Logical single-bit value used by bit read/write APIs.
constexpr Status ok_status() noexcept
Returns the default success status.
void(*)(void *user, Status status) CompletionHandler
Completion callback used by the async client.
RemoteRunClearMode
Clear scope applied during remote RUN initialization.
Contiguous bit-read request (0401 bit path).
Contiguous bit-write request (1401 bit path).
Contiguous word-write request (1401).
Extended file-register batch write (EW on 1C ACPU-common, chapter-18 block path on 1E).
Direct extended file-register batch read (NR on 1C QnA-common, chapter-18 direct path on 1E).
Direct extended file-register batch write (NW on 1C QnA-common, chapter-18 direct path on 1E).
Extended file-register monitor registration (EM on 1C, chapter-18 on 1E).
One item inside extended file-register random write (ET on 1C, chapter-18 on 1E).
C24 global-signal ON/OFF request (1618).
Host-buffer write request (1613).
Parsed Jn\\... link-direct device reference such as J1\\W100.
Jn\\... monitor registration payload (0801 + device extension specification).
Jn\\... native multi-block read request.
Jn\\... native multi-block write request.
One sparse Jn\\... item used by native random-read and monitor registration.
One sparse Jn\\... bit item used by native random bit-write.
One sparse Jn\\... word item used by native random word-write.
Module-buffer byte read request (0601 helper path).
Module-buffer byte write request (1601 helper path).
Parsed layout description for one block returned by parse_multi_block_read_response().
Native multi-block read request composed of multiple contiguous blocks.
Native multi-block write request composed of multiple contiguous blocks.
Top-level protocol configuration shared by codecs and client requests.
Parsed U...\\G... or U...\\HG... qualified word device.
Native random-read request made of sparse word/dword items.
One bit item inside native random write (1402 bit path).
One word or double-word item inside native random write (1402 word path).
Optional RS-485 callbacks used by the async client around TX start/end.
Result object returned by most public APIs.
User-frame registration-data delete request (1610, subcommand 0001).
User-frame registration-data payload returned by 0610.
User-frame registration-data write request (1610, subcommand 0000).