<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>protocolos de comunicação - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/protocolos-de-comunicacao/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Sat, 07 Feb 2026 18:18:16 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>protocolos de comunicação - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Protocolos para Redes de Sensores e IoT: LEACH, PEGASIS, TDMA, 6TiSCH e WirelessHART</title>
		<link>https://mcu.tec.br/protoclos/protocolos-para-redes-de-sensores-e-iot-leach-pegasis-tdma-6tisch-e-wirelesshart/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=protocolos-para-redes-de-sensores-e-iot-leach-pegasis-tdma-6tisch-e-wirelesshart</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sat, 07 Feb 2026 18:13:47 +0000</pubDate>
				<category><![CDATA[IoT]]></category>
		<category><![CDATA[protocolos]]></category>
		<category><![CDATA[6TiSCH]]></category>
		<category><![CDATA[comunicação sem fio industrial]]></category>
		<category><![CDATA[eficiência energética]]></category>
		<category><![CDATA[firmware embarcado]]></category>
		<category><![CDATA[IEEE 802.15.4e]]></category>
		<category><![CDATA[IIoT]]></category>
		<category><![CDATA[iot industrial]]></category>
		<category><![CDATA[LEACH]]></category>
		<category><![CDATA[PEGASIS]]></category>
		<category><![CDATA[protocolos de comunicação]]></category>
		<category><![CDATA[redes de sensores sem fio]]></category>
		<category><![CDATA[redes determinísticas]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[TDMA]]></category>
		<category><![CDATA[TSCH]]></category>
		<category><![CDATA[WirelessHART]]></category>
		<category><![CDATA[WSN]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1269</guid>

					<description><![CDATA[<p>Este artigo apresenta uma análise técnica e didática dos principais protocolos utilizados em Redes de Sensores Sem Fio (Wireless Sensor Networks – WSNs) e sua evolução até o IoT industrial moderno. São explorados em profundidade os protocolos LEACH (Low-Energy Adaptive Clustering Hierarchy) e PEGASIS (Power-Efficient Gathering in Sensor Information Systems), amplamente estudados no meio acadêmico por sua eficiência energética e estratégias de organização da rede, bem como o papel fundamental do TDMA (Time Division Multiple Access) na construção de sistemas determinísticos e previsíveis. O texto avança para protocolos industriais consolidados, como 6TiSCH (IPv6 over TSCH IEEE 802.15.4e) e WirelessHART, destacando seus mecanismos de sincronização temporal, salto de frequência, confiabilidade, interoperabilidade e adequação a sistemas embarcados de baixo consumo. Ao longo do artigo, são discutidos os conceitos de clusterização, roteamento em cadeia, agendamento temporal e comunicação determinística, sempre conectando teoria, firmware embarcado e contexto de uso real em aplicações industriais, ambientais e de infraestrutura crítica. O conteúdo é direcionado a engenheiros, estudantes e profissionais que desejam compreender as bases conceituais que sustentam o IoT moderno e o Industrial IoT, indo além de protocolos de aplicação e explorando a camada estrutural das redes distribuídas de sensores.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/protocolos-para-redes-de-sensores-e-iot-leach-pegasis-tdma-6tisch-e-wirelesshart/">Protocolos para Redes de Sensores e IoT: LEACH, PEGASIS, TDMA, 6TiSCH e WirelessHART</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-sssef wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-sssef "><div class="eb-toc-container eb-toc-sssef  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:3,&quot;content&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;LEACH \u2013 Low-Energy Adaptive Clustering Hierarchy&quot;,&quot;text&quot;:&quot;LEACH \u2013 Low-Energy Adaptive Clustering Hierarchy&quot;,&quot;link&quot;:&quot;leach-low-energy-adaptive-clustering-hierarchy&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;PEGASIS \u2013 Power-Efficient Gathering in Sensor Information Systems&quot;,&quot;text&quot;:&quot;PEGASIS \u2013 Power-Efficient Gathering in Sensor Information Systems&quot;,&quot;link&quot;:&quot;pegasis-power-efficient-gathering-in-sensor-information-systems&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;TDMA \u2013 Time Division Multiple Access&quot;,&quot;text&quot;:&quot;TDMA \u2013 Time Division Multiple Access&quot;,&quot;link&quot;:&quot;tdma-time-division-multiple-access&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6TiSCH \u2013 IPv6 over the TSCH mode of IEEE 802.15.4e&quot;,&quot;text&quot;:&quot;6TiSCH \u2013 IPv6 over the TSCH mode of IEEE 802.15.4e&quot;,&quot;link&quot;:&quot;6tisch-ipv6-over-the-tsch-mode-of-ieee-802154e&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;WirelessHART \u2013 Highway Addressable Remote Transducer (Wireless)&quot;,&quot;text&quot;:&quot;WirelessHART \u2013 Highway Addressable Remote Transducer (Wireless)&quot;,&quot;link&quot;:&quot;wirelesshart-highway-addressable-remote-transducer-wireless&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Tabela comparativa entre os protocolos analisados&quot;,&quot;text&quot;:&quot;Tabela comparativa entre os protocolos analisados&quot;,&quot;link&quot;:&quot;tabela-comparativa-entre-os-protocolos-analisados&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o&quot;,&quot;text&quot;:&quot;Conclus\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;introdu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;LEACH \u2013 Low-Energy Adaptive Clustering Hierarchy&quot;,&quot;value&quot;:&quot;leach-low-energy-adaptive-clustering-hierarchy&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PEGASIS \u2013 Power-Efficient Gathering in Sensor Information Systems&quot;,&quot;value&quot;:&quot;pegasis-power-efficient-gathering-in-sensor-information-systems&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;TDMA \u2013 Time Division Multiple Access&quot;,&quot;value&quot;:&quot;tdma-time-division-multiple-access&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6TiSCH \u2013 IPv6 over the TSCH mode of IEEE 802.15.4e&quot;,&quot;value&quot;:&quot;6tisch-ipv6-over-the-tsch-mode-of-ieee-802154e&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;WirelessHART \u2013 Highway Addressable Remote Transducer (Wireless)&quot;,&quot;value&quot;:&quot;wirelesshart-highway-addressable-remote-transducer-wireless&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tabela comparativa entre os protocolos analisados&quot;,&quot;value&quot;:&quot;tabela-comparativa-entre-os-protocolos-analisados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o&quot;,&quot;value&quot;:&quot;conclus\u00e3o&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Introdução</a><li><a href="#leach-low-energy-adaptive-clustering-hierarchy">LEACH – Low-Energy Adaptive Clustering Hierarchy</a><li><a href="#pegasis-power-efficient-gathering-in-sensor-information-systems">PEGASIS – Power-Efficient Gathering in Sensor Information Systems</a><li><a href="#tdma-time-division-multiple-access">TDMA – Time Division Multiple Access</a><li><a href="#6tisch-ipv6-over-the-tsch-mode-of-ieee-802154e">6TiSCH – IPv6 over the TSCH mode of IEEE 802.15.4e</a><li><a href="#wirelesshart-highway-addressable-remote-transducer-wireless">WirelessHART – Highway Addressable Remote Transducer (Wireless)</a><ul class="eb-toc__list"><li><a href="#tabela-comparativa-entre-os-protocolos-analisados">Tabela comparativa entre os protocolos analisados</a><li><a href="#eb-table-content-7">Conclusão</a></li></ul></ul></div></div></div></div></div>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Introdução</h3>



<p class="wp-block-paragraph">Redes de sensores sem fio e sistemas embarcados de baixo consumo formam a espinha dorsal de grande parte das aplicações modernas de Internet das Coisas (IoT), especialmente nos domínios industrial, ambiental e de infraestrutura crítica. Nesses cenários, os desafios não se restringem à aquisição de dados, mas envolvem de forma central <strong>como os nós se organizam, como compartilham o meio de comunicação e como preservam energia ao longo de anos de operação</strong>. É nesse contexto que surgem protocolos voltados à eficiência energética, à previsibilidade temporal e à confiabilidade da comunicação.</p>



<p class="wp-block-paragraph">Protocolos como <strong>LEACH</strong> e <strong>PEGASIS</strong> emergem inicialmente no meio acadêmico como respostas diretas às limitações físicas dos nós sensores, propondo novas formas de organização da rede para reduzir o custo energético das transmissões. Esses trabalhos estabelecem fundamentos conceituais importantes, como agregação de dados, hierarquização e comunicação cooperativa, que influenciaram profundamente a evolução das Wireless Sensor Networks e, posteriormente, do IoT.</p>



<p class="wp-block-paragraph">À medida que as aplicações avançam para ambientes industriais e de missão crítica, a necessidade de <strong>determinismo, robustez e interoperabilidade</strong> torna-se dominante. Técnicas como <strong>TDMA</strong> passam a ser adotadas como base estrutural, permitindo controle preciso do tempo, do consumo e da latência. Sobre esse alicerce, surgem protocolos industriais como <strong>6TiSCH</strong> e <strong>WirelessHART</strong>, que consolidam esses princípios em padrões amplamente utilizados no Industrial IoT.</p>



<p class="wp-block-paragraph">Este artigo apresenta uma análise progressiva desses protocolos, explorando seus conceitos fundamentais, modos de funcionamento e contextos de uso, com foco especial na relação direta entre <strong>arquitetura de rede, firmware embarcado e eficiência energética</strong>. Ao compreender essa trajetória, torna-se possível enxergar o IoT não como um conjunto de tecnologias isoladas, mas como o resultado de décadas de refinamento conceitual no campo das redes de sensores e sistemas embarcados distribuídos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/protoclos/protocolos-para-redes-de-sensores-e-iot-leach-pegasis-tdma-6tisch-e-wirelesshart/">Protocolos para Redes de Sensores e IoT: LEACH, PEGASIS, TDMA, 6TiSCH e WirelessHART</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1269</post-id>	</item>
		<item>
		<title>A Importância dos Protocolos em Sistemas Embarcados e Distribuídos</title>
		<link>https://mcu.tec.br/protoclos/a-importancia-dos-protocolos-em-sistemas-embarcados-e-distribuidos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-importancia-dos-protocolos-em-sistemas-embarcados-e-distribuidos</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 13 Aug 2025 19:46:24 +0000</pubDate>
				<category><![CDATA[protocolos]]></category>
		<category><![CDATA[atuadores]]></category>
		<category><![CDATA[edge computing]]></category>
		<category><![CDATA[integração de sistemas]]></category>
		<category><![CDATA[interoperabilidade]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[Modbus]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[OPC UA]]></category>
		<category><![CDATA[protocolos de comunicação]]></category>
		<category><![CDATA[segurança de protocolos]]></category>
		<category><![CDATA[sensores]]></category>
		<category><![CDATA[sistemas distribuídos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=731</guid>

					<description><![CDATA[<p>Descubra como protocolos definem a confiabilidade e segurança na integração de sistemas embarcados e distribuídos.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/a-importancia-dos-protocolos-em-sistemas-embarcados-e-distribuidos/">A Importância dos Protocolos em Sistemas Embarcados e Distribuídos</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">No universo dos sistemas embarcados, os protocolos de comunicação desempenham um papel central, atuando como a “língua franca” que permite que microcontroladores, sensores, atuadores e sistemas de alto nível troquem informações de forma precisa e confiável. Assim como uma conversa humana exige um idioma e regras gramaticais, a comunicação entre dispositivos exige protocolos bem definidos para garantir que dados sejam enviados, recebidos e interpretados corretamente. Quando essa base não está bem estabelecida ou apresenta falhas, todo o sistema pode ficar comprometido — tornando-se, muitas vezes, o verdadeiro “calcanhar de Aquiles” de um projeto.</p>



<p class="wp-block-paragraph">A crescente integração entre dispositivos de IoT, sistemas distribuídos e arquiteturas de edge computing trouxe novos desafios para o desenvolvimento de protocolos. Não se trata apenas de transmitir bits e bytes, mas de assegurar interoperabilidade, segurança, tolerância a falhas e baixa latência. Nesse contexto, protocolos mal projetados ou mal implementados podem gerar gargalos de desempenho, vulnerabilidades críticas e problemas de compatibilidade, dificultando a escalabilidade e a manutenção dos sistemas. É por isso que compreender profundamente o papel dos protocolos é essencial para engenheiros e desenvolvedores que buscam criar soluções robustas e preparadas para evoluir.</p>



<p class="wp-block-paragraph"><strong>Fundamentos dos Protocolos em Sistemas Embarcados</strong></p>



<p class="wp-block-paragraph">Em um sistema embarcado, o protocolo de comunicação define o conjunto de regras, formatos e sequências que regem a troca de dados entre duas ou mais entidades. Essas regras abrangem desde o nível físico — especificando como os bits são representados eletricamente — até o nível de aplicação, que define a estrutura semântica das mensagens. A escolha correta do protocolo é determinante para o sucesso do projeto, pois influencia diretamente aspectos como consumo de energia, tempo de resposta, confiabilidade e segurança da informação.</p>



<p class="wp-block-paragraph">No nível físico e de enlace, protocolos como UART, SPI e I²C oferecem formas distintas de interligar microcontroladores, sensores e atuadores. Por exemplo, um sensor de temperatura pode se comunicar com um microcontrolador via I²C, transmitindo leituras periódicas, enquanto um módulo de memória externa pode usar SPI para garantir alta velocidade de acesso. No entanto, essas camadas básicas não garantem, por si só, interoperabilidade entre dispositivos complexos — é nas camadas superiores que entram protocolos mais elaborados, como Modbus, CAN, MQTT e OPC UA, capazes de padronizar a comunicação e permitir integração transparente entre diferentes fabricantes.</p>



<p class="wp-block-paragraph">A importância do protocolo aumenta exponencialmente quando o sistema embarcado está inserido em uma rede distribuída ou conectado a soluções de edge computing. Por exemplo, em um sistema industrial, um sensor conectado a um microcontrolador pode enviar dados via Modbus para um gateway, que por sua vez converte essas informações para MQTT e as encaminha a um servidor de análise local (edge server). Nesse cenário, cada camada de protocolo precisa ser consistente, bem definida e devidamente implementada para evitar perda de dados, incompatibilidades ou atrasos que comprometam o desempenho.</p>



<p class="wp-block-paragraph"><strong>Protocolos como o “Calcanhar de Aquiles” em Sistemas Distribuídos</strong></p>



<p class="wp-block-paragraph">Quando um sistema distribuído falha, nem sempre o problema está no hardware ou no software de aplicação. Em muitos casos, a origem está na camada de comunicação — mais especificamente, no protocolo utilizado. Um protocolo mal projetado, incompleto ou inadequado para o contexto pode gerar desde falhas sutis, como leituras inconsistentes, até erros catastróficos, como perda de sincronização e indisponibilidade total do sistema. Isso é especialmente crítico em aplicações industriais e IoT, onde milhares de dispositivos precisam operar de forma coordenada e confiável.</p>



<p class="wp-block-paragraph">Um exemplo prático é um sistema de monitoramento remoto de máquinas que utiliza um protocolo leve e eficiente em redes locais, mas que não considera cenários de perda de pacotes ou aumento da latência quando acessado via internet. Nessa situação, sensores podem enviar dados que nunca chegam ao destino, atuadores podem receber comandos com atraso e algoritmos de controle podem agir com base em informações desatualizadas. Sem mecanismos de confirmação (acknowledgement), reenvio automático e integridade de dados, o protocolo se torna o elo mais frágil da cadeia.</p>



<p class="wp-block-paragraph">Outro ponto crítico é a segurança. Protocolos antigos, como Modbus RTU, foram projetados para ambientes fechados e não possuem mecanismos nativos de autenticação ou criptografia. Quando expostos a redes públicas ou integrados a sistemas de edge computing e nuvem, tornam-se vulneráveis a ataques de interceptação (sniffing) e injeção de comandos maliciosos. Nesses casos, o próprio protocolo, sem uma camada adicional de proteção, se transforma em uma porta de entrada para ameaças externas, comprometendo não apenas um dispositivo, mas toda a infraestrutura interconectada.</p>



<p class="wp-block-paragraph"><strong>Protocolos na Integração com Computadores de Borda e Gerenciadores</strong></p>



<p class="wp-block-paragraph">Na arquitetura de edge computing, computadores de borda (edge devices) atuam como intermediários entre dispositivos de campo — como microcontroladores, sensores e atuadores — e sistemas de processamento em nuvem ou centros de dados. Essa camada é responsável por processar dados localmente, reduzindo a latência e o tráfego de rede, além de permitir respostas rápidas em aplicações críticas. Para que essa integração funcione de forma eficiente, os protocolos devem ser compatíveis e adaptados à função de cada dispositivo na cadeia.</p>



<p class="wp-block-paragraph">Por exemplo, em um sistema de automação industrial, sensores podem se comunicar via protocolos de campo como CANopen ou Modbus RTU com microcontroladores, que por sua vez enviam dados para um gateway industrial. Esse gateway — atuando como computador de borda — pode converter o protocolo para OPC UA ou MQTT, permitindo que gerenciadores de produção, dashboards de supervisão e algoritmos de machine learning recebam e interpretem as informações em tempo quase real. A correta tradução e padronização de protocolos nesse ponto é essencial para evitar perda de dados ou incompatibilidades.</p>



<p class="wp-block-paragraph">Além disso, computadores de borda muitas vezes agregam dados de múltiplas fontes, executam análises preliminares e enviam apenas informações relevantes para a nuvem, economizando largura de banda. Essa filtragem depende de protocolos que não apenas transportem dados, mas também suportem metadados, timestamps e mecanismos de verificação de integridade. Protocolos como MQTT, AMQP e OPC UA oferecem recursos que facilitam essa tarefa, como qualidade de serviço configurável, mensagens persistentes e segurança integrada. A ausência dessas características em um protocolo pode limitar a capacidade de resposta e a confiabilidade do sistema distribuído.</p>



<p class="wp-block-paragraph"><strong>Protocolos na Comunicação com Sensores e Atuadores</strong></p>



<p class="wp-block-paragraph">Sensores e atuadores são elementos fundamentais nos sistemas embarcados, sendo responsáveis por converter fenômenos físicos em dados digitais e transformar comandos digitais em ações no mundo real. A comunicação com esses dispositivos exige protocolos que sejam, ao mesmo tempo, eficientes e confiáveis, pois qualquer falha ou atraso pode comprometer a operação como um todo. A escolha do protocolo impacta diretamente a taxa de atualização, o consumo de energia, a precisão das leituras e a sincronização entre os elementos do sistema.</p>



<p class="wp-block-paragraph">Em aplicações de IoT, sensores podem se conectar a microcontroladores usando protocolos de barramento como I²C e SPI para curtas distâncias, ou protocolos sem fio como Zigbee, BLE (Bluetooth Low Energy) e LoRaWAN para comunicação de longo alcance e baixo consumo. Atuadores, por sua vez, podem receber comandos via PWM (Pulse Width Modulation), CAN ou mesmo via protocolos industriais como EtherCAT, dependendo das exigências de tempo real e robustez da aplicação. Em todos esses casos, a padronização e a clareza no protocolo garantem que dispositivos de diferentes fabricantes possam interoperar sem ajustes complexos.</p>



<p class="wp-block-paragraph">Em contextos fora do IoT, como na automação industrial ou em sistemas de transporte, a comunicação com sensores e atuadores pode envolver protocolos robustos de tempo real, como PROFIBUS, DeviceNet ou protocolos baseados em TSN (Time-Sensitive Networking). Nesses cenários, a latência previsível e a resiliência a falhas são críticas — e um protocolo inadequado pode gerar desde falhas de sincronização até paradas de linha de produção. Isso reforça que, mais do que um meio de transmissão, o protocolo é parte integrante da confiabilidade e do desempenho do sistema.</p>



<p class="wp-block-paragraph"><strong>Aplicações Práticas e Exemplos de Integração de Protocolos</strong></p>



<p class="wp-block-paragraph">Um exemplo clássico de integração de protocolos em sistemas distribuídos pode ser observado em uma rede de monitoramento ambiental que combina sensores de qualidade do ar, estações meteorológicas e sistemas de previsão climática. Nessa arquitetura, sensores locais conectados a microcontroladores usam I²C ou SPI para aquisição de dados, que são transmitidos a um gateway via Modbus RTU ou RS-485. Esse gateway, atuando como computador de borda, processa as leituras, aplica filtros e envia os dados consolidados para a nuvem via MQTT ou HTTPS. O uso coordenado de protocolos garante que cada etapa do fluxo de dados seja otimizada para seu contexto: alta confiabilidade no campo, baixa latência na borda e segurança na transmissão para servidores remotos.</p>



<p class="wp-block-paragraph">No setor automotivo, um cenário semelhante ocorre com a integração de módulos de controle eletrônico (ECUs). Internamente, as ECUs trocam informações via CAN ou FlexRay, garantindo comunicação determinística e tolerante a falhas. Ao mesmo tempo, um módulo de telemetria pode converter essas informações para protocolos de rede IP, enviando dados para servidores de análise em tempo real. Essa transição de protocolos, da camada física de alta robustez para a camada de aplicação orientada à análise, exemplifica como a compatibilidade e a tradução correta são essenciais para manter a integridade e a usabilidade dos dados.</p>



<p class="wp-block-paragraph">Na indústria 4.0, protocolos como OPC UA têm ganhado destaque justamente por sua capacidade de unir mundos distintos: conectam sensores de chão de fábrica a sistemas MES (Manufacturing Execution Systems) e ERP (Enterprise Resource Planning) de forma padronizada, segura e escalável. O sucesso dessas integrações depende não apenas do hardware e do software, mas da escolha correta dos protocolos em cada camada, assegurando que as informações fluam de forma coerente, confiável e segura entre todos os elementos do ecossistema distribuído.</p><p>The post <a href="https://mcu.tec.br/protoclos/a-importancia-dos-protocolos-em-sistemas-embarcados-e-distribuidos/">A Importância dos Protocolos em Sistemas Embarcados e Distribuídos</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">731</post-id>	</item>
		<item>
		<title>Introdução ao ESP-Modbus com ESP-IDF</title>
		<link>https://mcu.tec.br/protoclos/introducao-ao-esp-modbus-com-esp-idf/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introducao-ao-esp-modbus-com-esp-idf</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sat, 28 Dec 2024 04:57:34 +0000</pubDate>
				<category><![CDATA[Modbus]]></category>
		<category><![CDATA[protocolos]]></category>
		<category><![CDATA[API Modbus]]></category>
		<category><![CDATA[atuadores Modbus]]></category>
		<category><![CDATA[automação industrial]]></category>
		<category><![CDATA[automação residencial]]></category>
		<category><![CDATA[coils]]></category>
		<category><![CDATA[comunicação mestre-escravo]]></category>
		<category><![CDATA[comunicação serial]]></category>
		<category><![CDATA[comunicação TCP/IP]]></category>
		<category><![CDATA[configuração ESP32]]></category>
		<category><![CDATA[configuração Modbus]]></category>
		<category><![CDATA[controle de atuadores]]></category>
		<category><![CDATA[controle remoto]]></category>
		<category><![CDATA[diagnóstico Modbus]]></category>
		<category><![CDATA[dicionário de dados Modbus]]></category>
		<category><![CDATA[dispositivos industriais.]]></category>
		<category><![CDATA[escravo Modbus]]></category>
		<category><![CDATA[esp-idf]]></category>
		<category><![CDATA[ESP-Modbus]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[exemplos Modbus]]></category>
		<category><![CDATA[FreeModbus]]></category>
		<category><![CDATA[holding registers]]></category>
		<category><![CDATA[input registers]]></category>
		<category><![CDATA[integração industrial]]></category>
		<category><![CDATA[mestre Modbus]]></category>
		<category><![CDATA[Modbus ASCII]]></category>
		<category><![CDATA[Modbus RTU]]></category>
		<category><![CDATA[Modbus TCP/IP]]></category>
		<category><![CDATA[monitoramento de sensores]]></category>
		<category><![CDATA[protocolos de comunicação]]></category>
		<category><![CDATA[rede Modbus]]></category>
		<category><![CDATA[redes industriais]]></category>
		<category><![CDATA[registro Modbus]]></category>
		<category><![CDATA[registros de entrada]]></category>
		<category><![CDATA[RS-485]]></category>
		<category><![CDATA[SCADA]]></category>
		<category><![CDATA[sensores Modbus]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=31</guid>

					<description><![CDATA[<p>O Modbus é um protocolo de comunicação amplamente utilizado na indústria para conectar dispositivos eletrônicos, como sensores e atuadores. Com o suporte nativo no ESP32 por meio da biblioteca ESP-Modbus, integrá-lo a projetos embarcados torna-se uma tarefa eficiente e confiável. Este artigo explora como utilizar o ESP-Modbus na plataforma ESP-IDF, explicando conceitos-chave e orientando sobre [&#8230;]</p>
<p>The post <a href="https://mcu.tec.br/protoclos/introducao-ao-esp-modbus-com-esp-idf/">Introdução ao ESP-Modbus com ESP-IDF</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">O Modbus é um protocolo de comunicação amplamente utilizado na indústria para conectar dispositivos eletrônicos, como sensores e atuadores. Com o suporte nativo no ESP32 por meio da biblioteca ESP-Modbus, integrá-lo a projetos embarcados torna-se uma tarefa eficiente e confiável.</p>



<p class="wp-block-paragraph">Este artigo explora como utilizar o ESP-Modbus na plataforma ESP-IDF, explicando conceitos-chave e orientando sobre a configuração de comunicação com dispositivos Modbus em suas variantes mais comuns, como <strong>Modbus RTU</strong>, <strong>Modbus ASCII</strong> e <strong>Modbus TCP/IP</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Visão Geral do Modbus</h2>



<p class="wp-block-paragraph">O protocolo Modbus define regras de comunicação para troca de mensagens entre dispositivos mestre (master) e escravos (slaves) em uma rede. Ele é amplamente adotado em aplicações industriais devido à sua simplicidade e eficiência.</p>



<h3 class="wp-block-heading">Tipos de Modbus:</h3>



<ol class="wp-block-list">
<li><strong>Modbus RTU (Remote Terminal Unit):</strong>
<ul class="wp-block-list">
<li>Comunicação serial com dados representados em formato binário compacto.</li>



<li>Utiliza verificação de erros com checksum (CRC).</li>



<li>Requer intervalos de silêncio para enquadrar mensagens, sendo o <strong>RS-485</strong> a interface mais utilizada.</li>
</ul>
</li>



<li><strong>Modbus ASCII:</strong>
<ul class="wp-block-list">
<li>Dados em formato legível por humanos (ASCII).</li>



<li>Inclui checagem de erros com verificação longitudinal (LRC).</li>



<li>Mensagens são delimitadas por um caractere <code>:</code> no início e CR/LF no final.</li>
</ul>
</li>



<li><strong>Modbus TCP/IP:</strong>
<ul class="wp-block-list">
<li>Adaptação para redes Ethernet utilizando o protocolo TCP/IP.</li>



<li>Transmissão via porta padrão 502, sem necessidade de checksum adicional devido à proteção fornecida pelas camadas inferiores do TCP/IP.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Os dados no Modbus são organizados em registros, que podem ser de quatro tipos principais:</p>



<ul class="wp-block-list">
<li><strong>Coils (Saídas discretas):</strong> Valores binários para controle de atuadores.</li>



<li><strong>Discrete Inputs (Entradas discretas):</strong> Leituras binárias de sensores.</li>



<li><strong>Holding Registers:</strong> Valores de 16 bits para leitura e escrita.</li>



<li><strong>Input Registers:</strong> Valores de 16 bits apenas para leitura.</li>
</ul>



<p class="wp-block-paragraph">A biblioteca ESP-Modbus do ESP32 é baseada na FreeModbus, oferecendo suporte para as implementações <strong>RTU</strong>, <strong>ASCII</strong> e <strong>TCP/IP</strong>, tanto para dispositivos mestre quanto escravo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Modelo de Mensagem e Mapeamento de Dados</h2>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://docs.espressif.com/projects/esp-idf/en/v4.4.3/esp32/_images/modbus-segment.png" alt="Modbus segment diagram"/><figcaption class="wp-element-caption">Modbus segment diagram</figcaption></figure>
</div>


<p class="wp-block-paragraph">O Modbus é um protocolo baseado em registros que define um modelo de comunicação estruturado, independente do meio físico utilizado para a transmissão de dados. Este modelo organiza as mensagens como transações entre dispositivos mestre e escravo, onde o mestre controla toda a comunicação.</p>



<h3 class="wp-block-heading">Comunicação Mestre-Escravo</h3>



<p class="wp-block-paragraph">Em uma rede Modbus:</p>



<ul class="wp-block-list">
<li>O <strong>mestre</strong> envia comandos para os dispositivos <strong>escravos</strong>.</li>



<li>Os <strong>escravos</strong> respondem aos comandos ou permanecem inativos se não forem endereçados.</li>



<li>Não há comunicação direta entre escravos.</li>
</ul>



<p class="wp-block-paragraph">No caso do <strong>Modbus TCP/IP</strong>, múltiplos mestres podem coexistir na mesma rede, aproveitando a natureza da comunicação IP.</p>



<h3 class="wp-block-heading">Tipos de Registros no Modbus<figure><img decoding="async" class="aligncenter" src="https://docs.espressif.com/projects/esp-idf/en/v4.4.3/esp32/_images/modbus-data-mapping.png" alt="Modbus data mapping"></figure></h3>



<p class="wp-block-paragraph">Os dispositivos mapeiam seus dados em quatro tipos de registros que representam características físicas, como leituras de sensores ou estados de atuadores. Abaixo, detalhamos esses tipos:</p>



<ol class="wp-block-list">
<li><strong>Coils (Saídas Discretas):</strong>
<ul class="wp-block-list">
<li>Bits de saída que podem ser controlados pelo mestre.</li>



<li>Geralmente usados para ligar/desligar dispositivos como relés.</li>
</ul>
</li>



<li><strong>Discrete Inputs (Entradas Discretas):</strong>
<ul class="wp-block-list">
<li>Bits de entrada somente leitura.</li>



<li>Utilizados para monitorar estados, como o fechamento de um contato.</li>
</ul>
</li>



<li><strong>Holding Registers:</strong>
<ul class="wp-block-list">
<li>Registros de 16 bits que permitem leitura e escrita.</li>



<li>Comumente usados para armazenar valores configuráveis, como setpoints de temperatura.</li>
</ul>
</li>



<li><strong>Input Registers:</strong>
<ul class="wp-block-list">
<li>Registros de 16 bits somente leitura.</li>



<li>Geralmente associados a sensores analógicos que enviam valores convertidos.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Mapeamento de Dados no ESP-Modbus</h3>



<p class="wp-block-paragraph">No ESP-Modbus, cada dispositivo na rede é identificado por um <strong>endereço escravo único</strong>, configurado em seu manual. O mestre deve conhecer o mapa de registros do dispositivo para acessar os dados corretamente. Esse mapa define:</p>



<ul class="wp-block-list">
<li>O tipo de registro (Coil, Holding, etc.).</li>



<li>O endereço inicial.</li>



<li>A quantidade de registros disponíveis.</li>
</ul>



<p class="wp-block-paragraph">Este mapeamento é essencial para configurar o Modbus no ESP32 e estabelecer uma comunicação eficiente entre dispositivos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Inicialização da Porta Modbus</h2>



<p class="wp-block-paragraph">Para iniciar a comunicação Modbus em um ESP32 utilizando o ESP-Modbus, é necessário configurar corretamente a porta de comunicação. O ESP-Modbus suporta tanto comunicação <strong>serial</strong> (via RTU ou ASCII) quanto <strong>TCP/IP</strong>. A inicialização correta da porta é o primeiro passo para utilizar as APIs disponíveis.</p>



<h3 class="wp-block-heading">Configuração de Portas no ESP-Modbus</h3>



<p class="wp-block-paragraph">O ESP-Modbus fornece as seguintes funções para inicializar controladores Modbus, tanto para dispositivos mestre quanto escravo, dependendo do tipo de comunicação:</p>



<ul class="wp-block-list">
<li><p><strong>Serial (RTU/ASCII):</strong></p>
<ul class="wp-block-list">
<li><code>mbc_slave_init()</code>: Inicializa um escravo Modbus em comunicação serial.</li>



<li><code>mbc_master_init()</code>: Inicializa um mestre Modbus em comunicação serial.</li>
</ul>
</li>



<li><p><strong>TCP/IP:</strong></p>
<ul class="wp-block-list">
<li><code>mbc_slave_init_tcp()</code>: Inicializa um escravo Modbus em comunicação TCP/IP.</li>



<li><code>mbc_master_init_tcp()</code>: Inicializa um mestre Modbus em comunicação TCP/IP.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">A escolha da função depende do tipo de dispositivo (mestre ou escravo) e do meio de transmissão (serial ou TCP/IP).</p>



<h3 class="wp-block-heading">Exemplo de Inicialização</h3>



<p class="wp-block-paragraph">Para inicializar uma porta serial no modo escravo, o seguinte código pode ser usado:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void* slave_handler = NULL;
// Estrutura de interface 
esp_err_t err = mbc_slave_init(MB_PORT_SERIAL_SLAVE, &amp;slave_handler); 
if (slave_handler == NULL || err != ESP_OK) {
  ESP_LOGE(TAG, &quot;Falha na inicialização do controlador Modbus.&quot;); 
}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">slave_handler</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #616E88">// Estrutura de interface </span></span>
<span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MB_PORT_SERIAL_SLAVE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">slave_handler</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">slave_handler</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">||</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha na inicialização do controlador Modbus.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">No caso de comunicação TCP/IP, a inicialização segue um padrão similar, mas com a função mbc_slave_init_tcp:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void* slave_handler = NULL;
esp_err_t err = mbc_slave_init_tcp(&amp;slave_handler);

if (slave_handler == NULL || err != ESP_OK) {
    ESP_LOGE(TAG, &quot;Falha na inicialização do controlador Modbus TCP.&quot;);
}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">slave_handler</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_init_tcp</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">slave_handler</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">slave_handler</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">||</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha na inicialização do controlador Modbus TCP.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Essas funções configuram a estrutura base para a comunicação Modbus e devem ser chamadas antes de qualquer outra operação relacionada ao protocolo.</p>



<h2 class="wp-block-heading">API Modbus Mestre &#8211; Visão Geral</h2>



<p class="wp-block-paragraph">A API do Modbus para dispositivos mestre no ESP32 oferece uma estrutura completa para configurar, acessar e gerenciar a comunicação com dispositivos escravos. Essa API segue uma sequência lógica de passos para configurar a comunicação e realizar transações.</p>



<h3 class="wp-block-heading">Etapas Principais da Comunicação Mestre</h3>



<ol class="wp-block-list">
<li><strong>Inicialização da Porta Modbus:</strong>
<ul class="wp-block-list">
<li>Configura a interface de comunicação (serial ou TCP/IP) e o controlador mestre.</li>
</ul>
</li>



<li><strong>Configuração do Acesso a Dados:</strong>
<ul class="wp-block-list">
<li>Define os parâmetros que o mestre acessará nos dispositivos escravos.</li>



<li>Utiliza um mapeamento chamado &#8220;Dicionário de Dados&#8221;, que associa identificadores únicos (CID) a registros Modbus.</li>
</ul>
</li>



<li><strong>Opções de Comunicação:</strong>
<ul class="wp-block-list">
<li>Configura parâmetros específicos, como baud rate (para serial) ou endereços IP (para TCP/IP).</li>
</ul>
</li>



<li><strong>Início da Comunicação:</strong>
<ul class="wp-block-list">
<li>Ativa o controlador Modbus, permitindo o envio e recebimento de dados entre mestre e escravos.</li>
</ul>
</li>



<li><strong>Finalização:</strong>
<ul class="wp-block-list">
<li>Libera recursos do controlador Modbus ao finalizar a comunicação.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Dicionário de Dados e CID</h3>



<p class="wp-block-paragraph">O ESP-Modbus introduz um nível de abstração acima do protocolo padrão, denominado &#8220;Dicionário de Dados&#8221;. Cada parâmetro acessível pelo mestre é identificado por:</p>



<ul class="wp-block-list">
<li><strong>CID (Identificador de Característica):</strong> Um número único que identifica um parâmetro no dispositivo escravo.</li>



<li><strong>Nome e Unidades:</strong> Uma descrição textual do parâmetro e sua unidade física (como °C para temperatura).</li>



<li><strong>Tipo de Registro e Endereço:</strong> Define o tipo de registro Modbus (Holding, Input, etc.) e seu endereço inicial no dispositivo escravo.</li>
</ul>



<p class="wp-block-paragraph">Exemplo de definição de parâmetros no Dicionário de Dados:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mb_parameter_descriptor_t device_parameters[] = {
    { CID_SER_NUM1, &quot;Serial_number_1&quot;, &quot;--&quot;, MB_DEVICE_ADDR1, MB_PARAM_INPUT, 0, 2, 0, PARAM_TYPE_U32, 4 },
    { CID_TEMP_DATA_1, &quot;Temperature_1&quot;, &quot;C&quot;, MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0, 2, 0, PARAM_TYPE_FLOAT, 4 }
};
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mb_parameter_descriptor_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_SER_NUM1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Serial_number_1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">--</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_INPUT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_U32</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_TEMP_DATA_1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperature_1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_HOLDING</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_FLOAT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Neste exemplo:</p>



<ul class="wp-block-list">
<li>O parâmetro <code>CID_SER_NUM1</code> refere-se ao número de série do dispositivo.</li>



<li>O parâmetro <code>CID_TEMP_DATA_1</code> mapeia um registro de temperatura em graus Celsius.</li>
</ul>



<h3 class="wp-block-heading">Configuração do Mestre</h3>



<p class="wp-block-paragraph">Após definir o Dicionário de Dados, ele deve ser associado ao controlador Modbus utilizando a função <code>mbc_master_set_descriptor()</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ESP_ERROR_CHECK(mbc_master_set_descriptor(&amp;device_parameters[0], num_device_parameters));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_set_descriptor</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">]</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">num_device_parameters</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Isso permite que o mestre acesse os parâmetros do escravo conforme o mapeamento definido.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Configuração de Acesso a Dados no Mestre</h2>



<p class="wp-block-paragraph">Para que um dispositivo mestre possa acessar parâmetros de dispositivos escravos, é necessário configurar o acesso aos dados. Isso é realizado definindo os detalhes de cada parâmetro que será lido ou escrito, utilizando o <strong>Dicionário de Dados</strong> já apresentado.</p>



<h3 class="wp-block-heading">Estrutura do Dicionário de Dados</h3>



<p class="wp-block-paragraph">Cada entrada no Dicionário de Dados representa uma característica física ou lógica disponível no dispositivo escravo, como temperatura, pressão ou um número de série. A configuração inclui:</p>



<ul class="wp-block-list">
<li><strong>CID (Identificador de Característica):</strong> Um identificador único que referencia o parâmetro.</li>



<li><strong>Endereço do Registro:</strong> Define onde os dados estão localizados no mapa de registros do escravo.</li>



<li><strong>Tipo de Registro:</strong> Especifica se é um registro de entrada, holding, etc.</li>



<li><strong>Tamanho:</strong> Determina quantos registros Modbus são utilizados para armazenar o valor.</li>
</ul>



<h3 class="wp-block-heading">Exemplo Prático de Configuração</h3>



<p class="wp-block-paragraph">Abaixo está um exemplo de definição de parâmetros para dois dispositivos escravos conectados a um mestre:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mb_parameter_descriptor_t device_parameters[] = {
    { CID_TEMP_DATA_1, &quot;Temperature_1&quot;, &quot;C&quot;, MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0, 2, 0, PARAM_TYPE_FLOAT, 4 },
    { CID_HUMIDITY_1, &quot;Humidity_1&quot;, &quot;%&quot;, MB_DEVICE_ADDR1, MB_PARAM_INPUT, 2, 1, 0, PARAM_TYPE_U16, 2 },
    { CID_TEMP_DATA_2, &quot;Temperature_2&quot;, &quot;C&quot;, MB_DEVICE_ADDR2, MB_PARAM_HOLDING, 0, 2, 0, PARAM_TYPE_FLOAT, 4 },
    { CID_HUMIDITY_2, &quot;Humidity_2&quot;, &quot;%&quot;, MB_DEVICE_ADDR2, MB_PARAM_INPUT, 2, 1, 0, PARAM_TYPE_U16, 2 }
};
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mb_parameter_descriptor_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_TEMP_DATA_1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperature_1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_HOLDING</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_FLOAT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_HUMIDITY_1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Humidity_1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_INPUT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_U16</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_TEMP_DATA_2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperature_2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_HOLDING</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_FLOAT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_HUMIDITY_2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Humidity_2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_INPUT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_U16</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Neste exemplo:</p>



<ul class="wp-block-list">
<li><strong>CID_TEMP_DATA_1:</strong> Mapeia a temperatura do dispositivo 1 (endereço <code>MB_DEVICE_ADDR1</code>) em registros de holding.</li>



<li><strong>CID_HUMIDITY_1:</strong> Mapeia a umidade do dispositivo 1 como registro de entrada.</li>



<li><strong>CID_TEMP_DATA_2 e CID_HUMIDITY_2:</strong> Seguem a mesma lógica para o segundo dispositivo.</li>
</ul>



<p class="wp-block-paragraph">O número de parâmetros no Dicionário de Dados pode ser calculado automaticamente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="uint16_t num_device_parameters = (sizeof(device_parameters) / sizeof(device_parameters[0]));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">num_device_parameters</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">]))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Configuração no Controlador Mestre</h3>



<p class="wp-block-paragraph">Após definir o Dicionário de Dados, ele deve ser registrado no controlador Modbus para permitir o acesso aos dispositivos escravos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ESP_ERROR_CHECK(mbc_master_set_descriptor(&amp;device_parameters[0], num_device_parameters));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_set_descriptor</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">]</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">num_device_parameters</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Com essa configuração, o mestre está preparado para acessar os parâmetros definidos nos escravos, conforme as especificações do Dicionário de Dados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Opções de Comunicação do Mestre</h2>



<p class="wp-block-paragraph">Depois de configurar os parâmetros de acesso no Dicionário de Dados, é necessário definir as opções de comunicação do mestre para garantir uma troca de dados eficiente e confiável com os dispositivos escravos. Essas opções incluem parâmetros de comunicação específicos para cada tipo de interface: serial ou TCP/IP.</p>



<h3 class="wp-block-heading">Configuração de Comunicação Serial</h3>



<p class="wp-block-paragraph">Ao utilizar a comunicação serial (Modbus RTU ou ASCII), os seguintes parâmetros devem ser definidos:</p>



<ul class="wp-block-list">
<li><strong>Porta Serial:</strong> Identifica qual porta UART será utilizada.</li>



<li><strong>Modo de Comunicação:</strong> Define se será RTU ou ASCII.</li>



<li><strong>Taxa de Baud:</strong> Determina a velocidade da transmissão em bits por segundo.</li>



<li><strong>Paridade:</strong> Especifica o tipo de verificação de paridade (nenhuma, ímpar ou par).</li>
</ul>



<p class="wp-block-paragraph">Exemplo de configuração para uma porta serial:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mb_communication_info_t comm_info = {
    .port = MB_PORT_NUM,        // Número da porta serial
    .mode = MB_MODE_RTU,        // Modo de comunicação Modbus (RTU ou ASCII)
    .baudrate = 9600,           // Taxa de transmissão em bits por segundo
    .parity = MB_PARITY_NONE    // Tipo de paridade (nenhuma neste caso)
};

// Configura o mestre Modbus com os parâmetros de comunicação
ESP_ERROR_CHECK(mbc_master_setup((void*)&amp;comm_info));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mb_communication_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PORT_NUM</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// Número da porta serial</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_MODE_RTU</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// Modo de comunicação Modbus (RTU ou ASCII)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">baudrate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9600</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">           </span><span style="color: #616E88">// Taxa de transmissão em bits por segundo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">parity</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARITY_NONE</span><span style="color: #D8DEE9FF">    </span><span style="color: #616E88">// Tipo de paridade (nenhuma neste caso)</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Configura o mestre Modbus com os parâmetros de comunicação</span></span>
<span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_setup</span><span style="color: #D8DEE9FF">((</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Configuração de Comunicação TCP/IP</h3>



<p class="wp-block-paragraph">Para comunicação via TCP/IP, além dos parâmetros gerais, é necessário configurar os endereços IP dos dispositivos escravos. Esses endereços são utilizados para identificar cada dispositivo na rede.</p>



<p class="wp-block-paragraph">Exemplo de configuração para uma rede TCP/IP:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="char* slave_ip_address_table[MB_SLAVE_COUNT] = {
    &quot;192.168.1.2&quot;, // Endereço IP do escravo 1
    &quot;192.168.1.3&quot;, // Endereço IP do escravo 2
    NULL           // Término da tabela
};

mb_communication_info_t comm_info = {
    .ip_port = MB_TCP_PORT,                    // Porta Modbus TCP (padrão 502)
    .ip_addr_type = MB_IPV4,                   // Tipo de endereço IP (IPv4)
    .ip_mode = MB_MODE_TCP,                    // Modo de comunicação TCP
    .ip_addr = (void*)slave_ip_address_table,  // Tabela de endereços IP dos escravos
    .ip_netif_ptr = esp_netif_ptr              // Ponteiro para a interface de rede
};

// Configura o mestre Modbus com os parâmetros de comunicação
ESP_ERROR_CHECK(mbc_master_setup((void*)&amp;comm_info));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">char</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">slave_ip_address_table</span><span style="color: #D8DEE9FF">[</span><span style="color: #D8DEE9">MB_SLAVE_COUNT</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">192.168.1.2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Endereço IP do escravo 1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">192.168.1.3</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Endereço IP do escravo 2</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">NULL</span><span style="color: #D8DEE9FF">           </span><span style="color: #616E88">// Término da tabela</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">mb_communication_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_TCP_PORT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                    </span><span style="color: #616E88">// Porta Modbus TCP (padrão 502)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_addr_type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_IPV4</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                   </span><span style="color: #616E88">// Tipo de endereço IP (IPv4)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_MODE_TCP</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                    </span><span style="color: #616E88">// Modo de comunicação TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">slave_ip_address_table</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// Tabela de endereços IP dos escravos</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_netif_ptr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">esp_netif_ptr</span><span style="color: #D8DEE9FF">              </span><span style="color: #616E88">// Ponteiro para a interface de rede</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Configura o mestre Modbus com os parâmetros de comunicação</span></span>
<span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_setup</span><span style="color: #D8DEE9FF">((</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Considerações Importantes</h3>



<ol class="wp-block-list">
<li>Para comunicação <strong>RS-485</strong>, é necessário configurar o modo UART e os pinos apropriados usando as APIs UART do ESP-IDF.</li>



<li>No caso de redes TCP/IP, a descoberta automática de dispositivos pode ser configurada utilizando o serviço mDNS.</li>
</ol>



<p class="wp-block-paragraph">Com as opções de comunicação configuradas, o mestre está pronto para iniciar a troca de dados com os escravos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Comunicação do Mestre</h2>



<p class="wp-block-paragraph">Após configurar o mestre Modbus e suas opções de comunicação, o próximo passo é iniciar a comunicação com os dispositivos escravos. O ESP-Modbus oferece APIs para iniciar, enviar requisições e processar as respostas recebidas.</p>



<h3 class="wp-block-heading">Inicialização da Comunicação</h3>



<p class="wp-block-paragraph">A comunicação do mestre Modbus é iniciada com a chamada da função <code>mbc_master_start()</code>, que ativa a pilha Modbus e permite a troca de dados.</p>



<p class="wp-block-paragraph">Exemplo de inicialização:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="esp_err_t err = mbc_master_start();
if (err != ESP_OK) {
    ESP_LOGE(TAG, &quot;Falha ao iniciar o controlador Modbus, erro = %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_start</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha ao iniciar o controlador Modbus, erro = %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Envio de Requisições</h3>



<p class="wp-block-paragraph">O mestre envia requisições aos escravos utilizando a função <code>mbc_master_send_request()</code>. Essa função é bloqueante, ou seja, ela aguarda uma resposta do escravo antes de continuar.</p>



<p class="wp-block-paragraph">Exemplo básico de envio de requisição:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mb_param_request_t request = {
    .slave_addr = 1,          // Endereço do dispositivo escravo
    .command = MB_FUNC_READ,  // Comando Modbus (ex.: leitura de registros)
    .reg_start = 0,           // Endereço inicial do registro
    .reg_size = 2             // Número de registros a serem lidos
};

uint8_t response_data[4]; // Buffer para armazenar a resposta
esp_err_t err = mbc_master_send_request(&amp;request, response_data);
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Requisição bem-sucedida. Dados recebidos.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro na requisição Modbus, código de erro: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mb_param_request_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">request</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">slave_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">          </span><span style="color: #616E88">// Endereço do dispositivo escravo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">command</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_FUNC_READ</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// Comando Modbus (ex.: leitura de registros)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">reg_start</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">           </span><span style="color: #616E88">// Endereço inicial do registro</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">reg_size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">             </span><span style="color: #616E88">// Número de registros a serem lidos</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">response_data</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Buffer para armazenar a resposta</span></span>
<span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_send_request</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">response_data</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Requisição bem-sucedida. Dados recebidos.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro na requisição Modbus, código de erro: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Leitura de Dados</h3>



<p class="wp-block-paragraph">O mestre pode acessar os valores de parâmetros definidos no Dicionário de Dados utilizando <code>mbc_master_get_parameter()</code>. Essa função permite recuperar os dados mapeados por um CID específico.</p>



<p class="wp-block-paragraph">Exemplo de leitura de parâmetro:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const mb_parameter_descriptor_t* param_descriptor = NULL;
uint8_t data_buffer[4]; // Buffer para armazenar os dados
uint8_t data_type;

esp_err_t err = mbc_master_get_cid_info(CID_TEMP_DATA_1, &amp;param_descriptor);
if (err == ESP_OK) {
    err = mbc_master_get_parameter(param_descriptor-&gt;cid, (char*)param_descriptor-&gt;param_key, data_buffer, &amp;data_type);
    if (err == ESP_OK) {
        ESP_LOGI(TAG, &quot;Parâmetro: %s, Valor: 0x%08x&quot;, param_descriptor-&gt;param_key, *(uint32_t*)data_buffer);
    } else {
        ESP_LOGE(TAG, &quot;Erro ao ler o parâmetro, código de erro: %x.&quot;, err);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mb_parameter_descriptor_t</span><span style="color: #D8DEE9FF">* param_descriptor </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data_buffer</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Buffer para armazenar os dados</span></span>
<span class="line"><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data_type</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_get_cid_info</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">CID_TEMP_DATA_1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> ¶</span><span style="color: #D8DEE9">m_descriptor</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_get_parameter</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">param_descriptor</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">cid</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">char</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">param_descriptor</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">param_key</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data_buffer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">data_type</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Parâmetro: %s, Valor: 0x%08x</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">param_descriptor</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">param_key</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint32_t</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">data_buffer</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao ler o parâmetro, código de erro: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Escrita de Dados</h3>



<p class="wp-block-paragraph">O mestre também pode alterar valores nos registros de um escravo utilizando <code>mbc_master_set_parameter()</code>.</p>



<p class="wp-block-paragraph">Exemplo de escrita:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="uint8_t new_value[4] = {0x12, 0x34, 0x56, 0x78};
esp_err_t err = mbc_master_set_parameter(CID_TEMP_DATA_1, &quot;Temperature_1&quot;, new_value, NULL);
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Parâmetro atualizado com sucesso.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro ao atualizar parâmetro, código de erro: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">new_value</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #B48EAD">0x12</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x34</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x56</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x78</span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_set_parameter</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">CID_TEMP_DATA_1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperature_1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">new_value</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Parâmetro atualizado com sucesso.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao atualizar parâmetro, código de erro: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Encerramento do Mestre Modbus</h2>



<p class="wp-block-paragraph">Ao finalizar a utilização do mestre Modbus, é essencial encerrar corretamente a pilha de comunicação para liberar os recursos do sistema. O ESP-Modbus oferece APIs específicas para garantir que todo o contexto do controlador seja destruído de forma segura.</p>



<h3 class="wp-block-heading">Parada da Pilha Modbus</h3>



<p class="wp-block-paragraph">A função <code>mbc_master_stop()</code> deve ser chamada para interromper a pilha de comunicação. Isso encerra todas as operações ativas e desativa o controlador.</p>



<p class="wp-block-paragraph">Exemplo de parada da pilha:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="esp_err_t err = mbc_master_stop();
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Pilha Modbus parada com sucesso.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro ao parar a pilha Modbus, código de erro: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_stop</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Pilha Modbus parada com sucesso.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao parar a pilha Modbus, código de erro: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Destruição do Controlador</h3>



<p class="wp-block-paragraph">Após a parada da pilha, o controlador Modbus deve ser destruído utilizando a função <code>mbc_master_destroy()</code>. Isso libera a memória e outros recursos alocados durante a inicialização.</p>



<p class="wp-block-paragraph">Exemplo de destruição do controlador:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="esp_err_t err = mbc_master_destroy();
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Controlador Modbus destruído com sucesso.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro ao destruir o controlador Modbus, código de erro: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_destroy</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Controlador Modbus destruído com sucesso.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao destruir o controlador Modbus, código de erro: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Boas Práticas</h3>



<ul class="wp-block-list">
<li><strong>Verificação de Erros:</strong> Sempre verifique os códigos de retorno das funções para identificar possíveis falhas e tratar erros de forma adequada.</li>



<li><strong>Liberação de Recursos:</strong> Certifique-se de que a função <code>mbc_master_destroy()</code> seja chamada antes de finalizar a aplicação para evitar vazamentos de memória.</li>



<li><strong>Sincronização:</strong> Garanta que todas as operações Modbus tenham sido concluídas antes de encerrar a pilha.</li>
</ul>



<p class="wp-block-paragraph">Com esses passos, o ciclo de vida do controlador mestre Modbus é finalizado de forma segura e eficiente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">API Modbus Escravo &#8211; Visão Geral</h2>



<p class="wp-block-paragraph">A API Modbus para dispositivos escravos no ESP32 permite configurar e gerenciar a comunicação com mestres Modbus. Assim como a API para mestres, a API para escravos segue uma sequência lógica de configuração e operação.</p>



<h3 class="wp-block-heading">Etapas Principais da Comunicação Escravo</h3>



<ol class="wp-block-list">
<li><strong>Inicialização da Porta Modbus:</strong>
<ul class="wp-block-list">
<li>Configura a interface de comunicação (serial ou TCP/IP) e o controlador escravo.</li>
</ul>
</li>



<li><strong>Configuração de Acesso a Dados:</strong>
<ul class="wp-block-list">
<li>Define os registros que estarão disponíveis para acesso pelo mestre, como holding registers ou input registers.</li>
</ul>
</li>



<li><strong>Opções de Comunicação:</strong>
<ul class="wp-block-list">
<li>Configura parâmetros específicos, como taxa de transmissão e endereços de comunicação.</li>
</ul>
</li>



<li><strong>Início da Comunicação:</strong>
<ul class="wp-block-list">
<li>Ativa a pilha Modbus, permitindo a troca de dados entre o escravo e o mestre.</li>
</ul>
</li>



<li><strong>Finalização:</strong>
<ul class="wp-block-list">
<li>Libera os recursos do controlador ao finalizar a comunicação.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Estrutura de Dados no Escravo</h3>



<p class="wp-block-paragraph">Assim como no mestre, o escravo utiliza estruturas de dados para organizar os registros Modbus acessíveis pelo mestre. A configuração de cada área de registro inclui:</p>



<ul class="wp-block-list">
<li><strong>Tipo de Registro:</strong> Define se é um holding register, input register, coil, ou discrete input.</li>



<li><strong>Endereço Inicial:</strong> Especifica a posição inicial do registro na memória do dispositivo.</li>



<li><strong>Tamanho:</strong> Determina o número de registros disponíveis para acesso.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Configuração de Acesso a Dados no Escravo</h2>



<p class="wp-block-paragraph">A configuração de acesso a dados no escravo Modbus é uma etapa essencial para disponibilizar registros aos mestres. No ESP-Modbus, isso é feito definindo áreas de memória específicas que armazenarão os dados acessíveis. Essas áreas são mapeadas para tipos de registros Modbus, como <strong>Holding Registers</strong> e <strong>Input Registers</strong>.</p>



<h3 class="wp-block-heading">Definindo Áreas de Registro</h3>



<p class="wp-block-paragraph">Cada tipo de registro Modbus no escravo é configurado utilizando a estrutura <code>mb_register_area_descriptor_t</code>. Essa estrutura especifica:</p>



<ul class="wp-block-list">
<li><strong>Offset Inicial:</strong> A posição relativa do registro dentro do tipo configurado.</li>



<li><strong>Tipo de Registro:</strong> Indica se a área é de Holding Registers, Input Registers, Coils ou Discrete Inputs.</li>



<li><strong>Endereço de Memória:</strong> Um ponteiro para a área de memória onde os dados serão armazenados.</li>



<li><strong>Tamanho da Área:</strong> Define o número de registros disponíveis para leitura/escrita.</li>
</ul>



<p class="wp-block-paragraph">Exemplo de configuração de áreas de registro:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#define MB_REG_INPUT_START_AREA0    (0)
#define MB_REG_HOLDING_START_AREA0  (0)
#define MB_REG_HOLD_CNT             (100) // Número de registros de holding
#define MB_REG_INPUT_CNT            (100) // Número de registros de input

mb_register_area_descriptor_t reg_area; // Estrutura de descrição da área de registros

// Área de registros de holding
uint16_t holding_reg_area[MB_REG_HOLD_CNT] = {0};
reg_area.type = MB_PARAM_HOLDING;
reg_area.start_offset = MB_REG_HOLDING_START_AREA0;
reg_area.address = (void*)&amp;holding_reg_area[0];
reg_area.size = sizeof(holding_reg_area);
ESP_ERROR_CHECK(mbc_slave_set_descriptor(reg_area));

// Área de registros de input
uint16_t input_reg_area[MB_REG_INPUT_CNT] = {0};
reg_area.type = MB_PARAM_INPUT;
reg_area.start_offset = MB_REG_INPUT_START_AREA0;
reg_area.address = (void*)&amp;input_reg_area[0];
reg_area.size = sizeof(input_reg_area);
ESP_ERROR_CHECK(mbc_slave_set_descriptor(reg_area));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_REG_INPUT_START_AREA0</span><span style="color: #D8DEE9FF">    (</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_REG_HOLDING_START_AREA0</span><span style="color: #D8DEE9FF">  (</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_REG_HOLD_CNT</span><span style="color: #D8DEE9FF">             (</span><span style="color: #B48EAD">100</span><span style="color: #D8DEE9FF">) </span><span style="color: #616E88">// Número de registros de holding</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_REG_INPUT_CNT</span><span style="color: #D8DEE9FF">            (</span><span style="color: #B48EAD">100</span><span style="color: #D8DEE9FF">) </span><span style="color: #616E88">// Número de registros de input</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">mb_register_area_descriptor_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reg_area</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Estrutura de descrição da área de registros</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Área de registros de holding</span></span>
<span class="line"><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">holding_reg_area</span><span style="color: #D8DEE9FF">[</span><span style="color: #D8DEE9">MB_REG_HOLD_CNT</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_HOLDING</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">start_offset</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_REG_HOLDING_START_AREA0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">address</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">holding_reg_area</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">holding_reg_area</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_set_descriptor</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">reg_area</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Área de registros de input</span></span>
<span class="line"><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">input_reg_area</span><span style="color: #D8DEE9FF">[</span><span style="color: #D8DEE9">MB_REG_INPUT_CNT</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_INPUT</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">start_offset</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_REG_INPUT_START_AREA0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">address</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">input_reg_area</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">reg_area</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">input_reg_area</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_set_descriptor</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">reg_area</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Proteção e Acesso aos Registros</h3>



<p class="wp-block-paragraph">Para evitar inconsistências durante a escrita/leitura dos registros, é importante proteger as áreas de memória com seções críticas. Exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="portENTER_CRITICAL(&amp;param_lock);
holding_reg_area[2] += 10; // Atualizando um registro
portEXIT_CRITICAL(&amp;param_lock);
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">portENTER_CRITICAL</span><span style="color: #D8DEE9FF">(¶</span><span style="color: #D8DEE9">m_lock</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">holding_reg_area</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">+=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Atualizando um registro</span></span>
<span class="line"><span style="color: #88C0D0">portEXIT_CRITICAL</span><span style="color: #D8DEE9FF">(¶</span><span style="color: #D8DEE9">m_lock</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Requisitos para a Configuração</h3>



<ul class="wp-block-list">
<li>Pelo menos uma área de cada tipo de registro necessário deve ser configurada.</li>



<li>Caso um mestre tente acessar uma área não configurada, será gerada uma exceção Modbus.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Opções de Comunicação do Escravo</h2>



<p class="wp-block-paragraph">Após configurar as áreas de registro, é necessário definir as opções de comunicação para o escravo Modbus. Esses parâmetros garantem que o dispositivo esteja corretamente configurado para se comunicar com o mestre, seja em modo serial (RTU/ASCII) ou TCP/IP.</p>



<h3 class="wp-block-heading">Configuração de Comunicação Serial</h3>



<p class="wp-block-paragraph">Na comunicação serial, os parâmetros principais são:</p>



<ul class="wp-block-list">
<li><strong>Porta UART:</strong> Define qual porta física será utilizada.</li>



<li><strong>Modo de Comunicação:</strong> Indica se será RTU ou ASCII.</li>



<li><strong>Endereço do Escravo:</strong> Identifica unicamente o dispositivo na rede.</li>



<li><strong>Taxa de Baud:</strong> Determina a velocidade de transmissão.</li>



<li><strong>Paridade:</strong> Configura o tipo de paridade (nenhuma, ímpar ou par).</li>
</ul>



<p class="wp-block-paragraph">Exemplo de configuração serial:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#define MB_SLAVE_DEV_SPEED 9600
#define MB_SLAVE_ADDR 1
#define MB_SLAVE_PORT_NUM 2

mb_communication_info_t comm_info = {
    .mode = MB_MODE_RTU,                    // Modo RTU
    .slave_addr = MB_SLAVE_ADDR,            // Endereço do escravo
    .port = MB_SLAVE_PORT_NUM,              // Porta UART
    .baudrate = MB_SLAVE_DEV_SPEED,         // Taxa de baud
    .parity = MB_PARITY_NONE                // Sem paridade
};

// Configura o escravo Modbus com os parâmetros definidos
ESP_ERROR_CHECK(mbc_slave_setup((void*)&amp;comm_info));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_SLAVE_DEV_SPEED</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9600</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_SLAVE_ADDR</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_SLAVE_PORT_NUM</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">mb_communication_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_MODE_RTU</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                    </span><span style="color: #616E88">// Modo RTU</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">slave_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_SLAVE_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">            </span><span style="color: #616E88">// Endereço do escravo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_SLAVE_PORT_NUM</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">              </span><span style="color: #616E88">// Porta UART</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">baudrate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_SLAVE_DEV_SPEED</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">         </span><span style="color: #616E88">// Taxa de baud</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">parity</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARITY_NONE</span><span style="color: #D8DEE9FF">                </span><span style="color: #616E88">// Sem paridade</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Configura o escravo Modbus com os parâmetros definidos</span></span>
<span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_setup</span><span style="color: #D8DEE9FF">((</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Configuração de Comunicação TCP/IP</h3>



<p class="wp-block-paragraph">Na comunicação via TCP/IP, o escravo precisa estar associado a uma interface de rede válida e configurado para escutar em uma porta específica. A porta padrão para Modbus TCP é a <strong>502</strong>.</p>



<p class="wp-block-paragraph">Exemplo de configuração TCP/IP:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mb_communication_info_t comm_info = {
    .ip_port = MB_TCP_PORT,                    // Porta Modbus TCP (padrão 502)
    .ip_addr_type = MB_IPV4,                   // IPv4
    .ip_mode = MB_MODE_TCP,                    // Modo TCP
    .ip_addr = NULL,                           // Aceita conexões de qualquer cliente
    .ip_netif_ptr = esp_netif_ptr              // Ponteiro para a interface de rede
};

// Configura o escravo Modbus para comunicação TCP/IP
ESP_ERROR_CHECK(mbc_slave_setup((void*)&amp;comm_info));
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mb_communication_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_TCP_PORT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                    </span><span style="color: #616E88">// Porta Modbus TCP (padrão 502)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_addr_type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_IPV4</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                   </span><span style="color: #616E88">// IPv4</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_MODE_TCP</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                    </span><span style="color: #616E88">// Modo TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF">                           </span><span style="color: #616E88">// Aceita conexões de qualquer cliente</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">ip_netif_ptr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">esp_netif_ptr</span><span style="color: #D8DEE9FF">              </span><span style="color: #616E88">// Ponteiro para a interface de rede</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Configura o escravo Modbus para comunicação TCP/IP</span></span>
<span class="line"><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_setup</span><span style="color: #D8DEE9FF">((</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Considerações para Comunicação Estável</h3>



<ol class="wp-block-list">
<li><strong>RS-485:</strong> Caso a interface serial utilize RS-485, configure os pinos UART e o modo half-duplex utilizando as APIs UART do ESP-IDF.</li>



<li><strong>Descoberta Automática:</strong> Para TCP/IP, é possível usar o serviço mDNS para facilitar a descoberta de dispositivos na rede.</li>



<li><strong>Respostas em Tempo Real:</strong> Certifique-se de que os registros necessários estejam configurados para evitar erros de timeout no mestre.</li>
</ol>



<p class="wp-block-paragraph">Com os parâmetros de comunicação configurados, o escravo está pronto para se comunicar com o mestre.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Comunicação do Escravo</h2>



<p class="wp-block-paragraph">Com as áreas de registro e as opções de comunicação configuradas, o escravo Modbus está pronto para iniciar a troca de dados com o mestre. O ESP-Modbus oferece APIs para gerenciar eventos e processar acessos aos registros configurados.</p>



<h3 class="wp-block-heading">Início da Comunicação</h3>



<p class="wp-block-paragraph">A comunicação do escravo é iniciada com a função <code>mbc_slave_start()</code>. Isso ativa a pilha Modbus, permitindo que o dispositivo receba e responda às requisições do mestre.</p>



<p class="wp-block-paragraph">Exemplo de inicialização:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="esp_err_t err = mbc_slave_start();
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Escravo Modbus iniciado com sucesso.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro ao iniciar o escravo Modbus, código: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_start</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Escravo Modbus iniciado com sucesso.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao iniciar o escravo Modbus, código: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Monitoramento de Eventos</h3>



<p class="wp-block-paragraph">O escravo pode monitorar eventos relacionados ao acesso aos registros utilizando a função <code>mbc_slave_check_event()</code>. Essa função é bloqueante e retorna o tipo de evento ocorrido, como leitura ou escrita em um registro.</p>



<p class="wp-block-paragraph">Exemplo de monitoramento de eventos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#define MB_READ_MASK (MB_EVENT_INPUT_REG_RD | MB_EVENT_HOLDING_REG_RD)
#define MB_WRITE_MASK (MB_EVENT_HOLDING_REG_WR)
#define MB_READ_WRITE_MASK (MB_READ_MASK | MB_WRITE_MASK)

mb_event_group_t event = mbc_slave_check_event(MB_READ_WRITE_MASK);

if (event &amp; MB_EVENT_HOLDING_REG_WR) {
    ESP_LOGI(TAG, &quot;Escrita em Holding Register detectada.&quot;);
} else if (event &amp; MB_EVENT_INPUT_REG_RD) {
    ESP_LOGI(TAG, &quot;Leitura em Input Register detectada.&quot;);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_READ_MASK</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">MB_EVENT_INPUT_REG_RD</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_EVENT_HOLDING_REG_RD</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_WRITE_MASK</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">MB_EVENT_HOLDING_REG_WR</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MB_READ_WRITE_MASK</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">MB_READ_MASK</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_WRITE_MASK</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">mb_event_group_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_check_event</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MB_READ_WRITE_MASK</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">event</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_EVENT_HOLDING_REG_WR</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Escrita em Holding Register detectada.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">event</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_EVENT_INPUT_REG_RD</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Leitura em Input Register detectada.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Acesso a Parâmetros</h3>



<p class="wp-block-paragraph">A função <code>mbc_slave_get_param_info()</code> permite obter detalhes sobre o registro acessado pelo mestre, como tipo de registro, endereço e tamanho.</p>



<p class="wp-block-paragraph">Exemplo de acesso:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mb_param_info_t reg_info;
esp_err_t err = mbc_slave_get_param_info(&amp;reg_info, MB_PAR_INFO_GET_TOUT);
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Registro acessado: Tipo=%u, Endereço=%u, Tamanho=%u&quot;,
             reg_info.type, reg_info.mb_offset, reg_info.size);
} else {
    ESP_LOGE(TAG, &quot;Erro ao obter informações do parâmetro, código: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mb_param_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reg_info</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_get_param_info</span><span style="color: #D8DEE9FF">(®</span><span style="color: #D8DEE9">_info</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PAR_INFO_GET_TOUT</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Registro acessado: Tipo=%u, Endereço=%u, Tamanho=%u</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">             </span><span style="color: #D8DEE9">reg_info</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">type</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reg_info</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">mb_offset</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reg_info</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao obter informações do parâmetro, código: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Respostas em Tempo Real</h3>



<p class="wp-block-paragraph">O escravo responde automaticamente às requisições do mestre com base nos registros configurados. Certifique-se de que as áreas de registro estejam atualizadas com os valores corretos para evitar comportamentos inesperados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Encerramento do Escravo Modbus</h2>



<p class="wp-block-paragraph">Ao finalizar a operação do escravo Modbus, é fundamental encerrar corretamente a pilha de comunicação e liberar os recursos alocados. Isso garante a estabilidade do sistema e evita vazamentos de memória.</p>



<h3 class="wp-block-heading">Parada da Pilha Modbus</h3>



<p class="wp-block-paragraph">A função <code>mbc_slave_stop()</code> é usada para interromper a pilha Modbus. Essa chamada encerra todas as operações ativas do escravo.</p>



<p class="wp-block-paragraph">Exemplo de parada:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="esp_err_t err = mbc_slave_stop();
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Pilha Modbus do escravo parada com sucesso.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro ao parar a pilha Modbus, código: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_stop</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Pilha Modbus do escravo parada com sucesso.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao parar a pilha Modbus, código: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Destruição do Controlador</h3>



<p class="wp-block-paragraph">Após parar a pilha, a função <code>mbc_slave_destroy()</code> deve ser chamada para destruir o controlador Modbus e liberar todos os recursos alocados durante a inicialização.</p>



<p class="wp-block-paragraph">Exemplo de destruição:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="esp_err_t err = mbc_slave_destroy();
if (err == ESP_OK) {
    ESP_LOGI(TAG, &quot;Controlador do escravo Modbus destruído com sucesso.&quot;);
} else {
    ESP_LOGE(TAG, &quot;Erro ao destruir o controlador Modbus, código: %x.&quot;, err);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">esp_err_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_slave_destroy</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ESP_OK</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Controlador do escravo Modbus destruído com sucesso.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao destruir o controlador Modbus, código: %x.</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">err</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Boas Práticas</h3>



<ol class="wp-block-list">
<li><strong>Verificação de Operações Ativas:</strong> Antes de encerrar a pilha, certifique-se de que todas as operações de leitura/escrita tenham sido concluídas.</li>



<li><strong>Liberação de Recursos:</strong> Sempre chame <code>mbc_slave_destroy()</code> para evitar vazamentos de memória ou instabilidades.</li>



<li><strong>Sincronização de Tarefas:</strong> Caso múltiplas tarefas acessem os registros Modbus, garanta que todas tenham finalizado antes de destruir o controlador.</li>
</ol>



<p class="wp-block-paragraph">Com esses passos, o ciclo de vida do escravo Modbus é encerrado de forma segura e eficiente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Possíveis Problemas de Comunicação e Soluções</h2>



<p class="wp-block-paragraph">Durante a implementação do protocolo Modbus, podem ocorrer problemas de comunicação entre o mestre e os escravos. A identificação e a solução desses problemas são essenciais para garantir o funcionamento correto do sistema.</p>



<h3 class="wp-block-heading">Principais Erros e Soluções</h3>



<ol class="wp-block-list">
<li><strong>Requisição Inválida (ESP_ERR_NOT_SUPPORTED &#8211; Código: 0x106)</strong>
<ul class="wp-block-list">
<li><strong>Causa:</strong> O mestre enviou uma requisição para um registro ou comando não suportado pelo escravo.</li>



<li><strong>Solução:</strong> Verifique o mapa de registros do escravo e ajuste a requisição do mestre para corresponder às capacidades do dispositivo.</li>
</ul>
</li>



<li><strong>Timeout na Resposta do Escravo (ESP_ERR_TIMEOUT &#8211; Código: 0x107)</strong>
<ul class="wp-block-list">
<li><strong>Causa:</strong> O escravo não respondeu dentro do tempo esperado.</li>



<li><strong>Solução:</strong> Certifique-se de que:
<ul class="wp-block-list">
<li>O escravo está conectado corretamente.</li>



<li>A taxa de baud e os parâmetros de comunicação (como paridade) são compatíveis entre mestre e escravo.</li>



<li>O endereço do escravo na requisição está correto.</li>
</ul>
</li>
</ul>
</li>



<li><strong>Resposta Inválida (ESP_ERR_INVALID_RESPONSE &#8211; Código: 0x108)</strong>
<ul class="wp-block-list">
<li><strong>Causa:</strong> O mestre recebeu uma resposta corrompida ou com erro de validação (checksum inválido).</li>



<li><strong>Solução:</strong> Verifique a integridade do cabo de comunicação (no caso de RTU/ASCII) ou a estabilidade da conexão de rede (no caso de TCP/IP). Além disso, confirme que os parâmetros Modbus no escravo estão configurados corretamente.</li>
</ul>
</li>



<li><strong>Estado Inválido (ESP_ERR_INVALID_STATE &#8211; Código: 0x103)</strong>
<ul class="wp-block-list">
<li><strong>Causa:</strong> Erro crítico no controlador Modbus, como sequência de comandos incorreta ou controlador ocupado.</li>



<li><strong>Solução:</strong> Reinicie o controlador Modbus no mestre ou no escravo. Verifique se múltiplas tarefas estão acessando o controlador simultaneamente e sincronize-as.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Dicas para Diagnóstico</h3>



<ul class="wp-block-list">
<li><strong>Logs Detalhados:</strong> Ative logs no ESP-IDF para capturar mensagens de erro detalhadas, como falhas de inicialização ou problemas durante a execução.</li>



<li><strong>Testes Isolados:</strong> Teste cada dispositivo escravo individualmente antes de integrar vários dispositivos na rede.</li>



<li><strong>Osciloscópio ou Analisador de Rede:</strong> Use ferramentas de diagnóstico para verificar os sinais na linha de comunicação serial ou monitorar pacotes TCP/IP.</li>
</ul>



<h3 class="wp-block-heading">Exemplos de Mensagens de Erro</h3>



<p class="wp-block-paragraph">Um exemplo de mensagem de erro capturada nos logs do mestre:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="E (1692332) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x107) (ESP_ERR_TIMEOUT).
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">E</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">1692332</span><span style="color: #D8DEE9FF">) MB_CONTROLLER_MASTER</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mbc_master_get_parameter</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">111</span><span style="color: #D8DEE9FF">): </span><span style="color: #D8DEE9">SERIAL</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">master</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">parameter</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">failure</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">error</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">0x107</span><span style="color: #D8DEE9FF">) (</span><span style="color: #D8DEE9">ESP_ERR_TIMEOUT</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">.</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Neste caso, o erro indica que o escravo não respondeu no tempo esperado. A solução seria revisar as conexões físicas e os parâmetros de comunicação.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Exemplos de Aplicação</h2>



<p class="wp-block-paragraph">O ESP-Modbus fornece suporte completo para implementar soluções Modbus em dispositivos ESP32, permitindo a integração com uma ampla variedade de dispositivos industriais. Abaixo estão exemplos práticos de aplicações para mestre e escravo, baseados nas APIs discutidas.</p>



<h3 class="wp-block-heading">Exemplo 1: Mestre Modbus Serial para Monitoramento de Sensores</h3>



<p class="wp-block-paragraph">Um mestre Modbus pode ser utilizado para monitorar parâmetros de sensores conectados via RS-485. O exemplo abaixo ilustra como configurar o mestre para ler a temperatura e umidade de dois dispositivos escravos.</p>



<h4 class="wp-block-heading">Configuração do Mestre:</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#include &quot;mbcontroller.h&quot;

// Configuração do dicionário de dados
mb_parameter_descriptor_t device_parameters[] = {
    { CID_TEMP, &quot;Temperature&quot;, &quot;C&quot;, MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0, 2, 0, PARAM_TYPE_FLOAT, 4 },
    { CID_HUMID, &quot;Humidity&quot;, &quot;%&quot;, MB_DEVICE_ADDR1, MB_PARAM_INPUT, 2, 1, 0, PARAM_TYPE_U16, 2 }
};

void app_main() {
    void* master_handler = NULL;
    ESP_ERROR_CHECK(mbc_master_init(MB_PORT_SERIAL_MASTER, &amp;master_handler));

    mb_communication_info_t comm_info = {
        .port = MB_PORT_NUM,
        .mode = MB_MODE_RTU,
        .baudrate = 9600,
        .parity = MB_PARITY_NONE
    };
    ESP_ERROR_CHECK(mbc_master_setup((void*)&amp;comm_info));

    ESP_ERROR_CHECK(mbc_master_set_descriptor(device_parameters, sizeof(device_parameters) / sizeof(device_parameters[0])));
    ESP_ERROR_CHECK(mbc_master_start());

    uint8_t temp_data[4];
    ESP_ERROR_CHECK(mbc_master_get_parameter(CID_TEMP, &quot;Temperature&quot;, temp_data, NULL));
    ESP_LOGI(TAG, &quot;Temperatura lida: %f&quot;, *(float*)temp_data);

    ESP_ERROR_CHECK(mbc_master_destroy());
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">mbcontroller.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Configuração do dicionário de dados</span></span>
<span class="line"><span style="color: #D8DEE9">mb_parameter_descriptor_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_TEMP</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperature</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_HOLDING</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_FLOAT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CID_HUMID</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Humidity</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_DEVICE_ADDR1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_INPUT</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PARAM_TYPE_U16</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">master_handler</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MB_PORT_SERIAL_MASTER</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">master_handler</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">mb_communication_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PORT_NUM</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_MODE_RTU</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">baudrate</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9600</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">parity</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARITY_NONE</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_setup</span><span style="color: #D8DEE9FF">((</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_set_descriptor</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">device_parameters</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">])))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_start</span><span style="color: #D8DEE9FF">())</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temp_data</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_get_parameter</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">CID_TEMP</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperature</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temp_data</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_LOGI</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">TAG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperatura lida: %f</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">float</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">temp_data</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_master_destroy</span><span style="color: #D8DEE9FF">())</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Exemplo 2: Escravo Modbus TCP para Controle de Atuadores</h3>



<p class="wp-block-paragraph">Um escravo Modbus pode ser utilizado para controlar dispositivos como relés ou motores conectados via Ethernet. O exemplo abaixo configura o escravo para gerenciar dois relés.</p>



<h4 class="wp-block-heading">Configuração do Escravo:</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#include &quot;mbcontroller.h&quot;

#define RELAY_1_GPIO 25
#define RELAY_2_GPIO 26

void app_main() {
    uint16_t relay_registers[2] = {0}; // Registradores para os relés

    mb_register_area_descriptor_t reg_area = {
        .type = MB_PARAM_COIL,
        .start_offset = 0,
        .address = relay_registers,
        .size = sizeof(relay_registers)
    };
    ESP_ERROR_CHECK(mbc_slave_set_descriptor(reg_area));

    mb_communication_info_t comm_info = {
        .ip_port = MB_TCP_PORT,
        .ip_addr_type = MB_IPV4,
        .ip_mode = MB_MODE_TCP,
        .ip_addr = NULL,
        .ip_netif_ptr = esp_netif_ptr
    };
    ESP_ERROR_CHECK(mbc_slave_setup((void*)&amp;comm_info));
    ESP_ERROR_CHECK(mbc_slave_start());

    while (true) {
        if (relay_registers[0]) {
            gpio_set_level(RELAY_1_GPIO, 1);
        }
        if (relay_registers[1]) {
            gpio_set_level(RELAY_2_GPIO, 1);
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }

    ESP_ERROR_CHECK(mbc_slave_destroy());
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">mbcontroller.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RELAY_1_GPIO</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">25</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">RELAY_2_GPIO</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">26</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">relay_registers</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Registradores para os relés</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">mb_register_area_descriptor_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reg_area</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_PARAM_COIL</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">start_offset</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">address</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">relay_registers</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">relay_registers</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_set_descriptor</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">reg_area</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">mb_communication_info_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">ip_port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_TCP_PORT</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">ip_addr_type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_IPV4</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">ip_mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MB_MODE_TCP</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">ip_addr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        .</span><span style="color: #D8DEE9">ip_netif_ptr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">esp_netif_ptr</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_setup</span><span style="color: #D8DEE9FF">((</span><span style="color: #81A1C1">void*</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">comm_info</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_start</span><span style="color: #D8DEE9FF">())</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">true</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">relay_registers</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">]) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">gpio_set_level</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">RELAY_1_GPIO</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">relay_registers</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">]) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">gpio_set_level</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">RELAY_2_GPIO</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">100</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ESP_ERROR_CHECK</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">mbc_slave_destroy</span><span style="color: #D8DEE9FF">())</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Integração com Outras Tecnologias</h3>



<ul class="wp-block-list">
<li><strong>MQTT:</strong> Combine Modbus com MQTT para enviar dados lidos pelo mestre para um servidor em nuvem.</li>



<li><strong>Automação Industrial:</strong> Use o ESP-Modbus para integrar dispositivos como CLPs e inversores de frequência a um sistema de supervisão (SCADA).</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão e Próximos Passos</h2>



<p class="wp-block-paragraph">O suporte ao Modbus no ESP32, através da biblioteca ESP-Modbus, oferece uma solução robusta e flexível para aplicações de automação e integração industrial. Seja na leitura de sensores via Modbus RTU ou no controle remoto de dispositivos com Modbus TCP/IP, o ESP-Modbus simplifica a implementação e gerenciamento dessas comunicações.</p>



<h3 class="wp-block-heading">Resumo dos Passos</h3>



<ol class="wp-block-list">
<li><strong>Configuração Inicial:</strong> Defina os parâmetros de comunicação e o mapeamento de dados.</li>



<li><strong>Troca de Dados:</strong> Utilize as APIs para enviar, receber e processar dados entre mestres e escravos.</li>



<li><strong>Diagnóstico e Resolução de Problemas:</strong> Monitore logs e corrija eventuais falhas de comunicação.</li>



<li><strong>Encerramento:</strong> Libere recursos corretamente ao finalizar a aplicação.</li>
</ol>



<h3 class="wp-block-heading">Próximos Passos</h3>



<ul class="wp-block-list">
<li><strong>Integração com Outras Protocolos:</strong> Experimente combinar o Modbus com protocolos como MQTT ou WebSocket para criar sistemas híbridos e conectados.</li>



<li><strong>Escalabilidade:</strong> Explore o uso de redes maiores com múltiplos dispositivos mestre e escravo.</li>



<li><strong>Customização:</strong> Adapte os exemplos fornecidos às suas necessidades específicas, otimizando o desempenho e a confiabilidade.</li>
</ul>



<h3 class="wp-block-heading">Recursos Adicionais</h3>



<p class="wp-block-paragraph">Para mais informações sobre o ESP-Modbus e o ESP-IDF, acesse:</p>



<ul class="wp-block-list">
<li><a href="https://docs.espressif.com/projects/esp-idf/en/latest/esp32/index.html">Documentação oficial do ESP-IDF</a></li>



<li><a href="https://modbus.org/specs.php">Especificações do protocolo Modbus</a></li>
</ul>



<p class="wp-block-paragraph">Com os exemplos e explicações fornecidos neste artigo, você terá uma base sólida para desenvolver aplicações Modbus em dispositivos ESP32.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/protoclos/introducao-ao-esp-modbus-com-esp-idf/">Introdução ao ESP-Modbus com ESP-IDF</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">31</post-id>	</item>
	</channel>
</rss>
