{"id":167,"date":"2016-08-04T23:08:43","date_gmt":"2016-08-05T02:08:43","guid":{"rendered":"http:\/\/www.pascalscada.com\/?page_id=167"},"modified":"2026-09-17T09:36:34","modified_gmt":"2026-09-17T12:36:34","slug":"communication-ports","status":"publish","type":"page","link":"https:\/\/www.pascalscada.com\/pb\/communication-ports\/","title":{"rendered":"Portas de comunica\u00e7\u00e3o"},"content":{"rendered":"<h5>Introdu\u00e7\u00e3o<\/h5>\n<p>Portas de comunica\u00e7\u00e3o s\u00e3o o meio utilizado pelos drivers de protocolo para enviar e receber dados. Uma porta de comunica\u00e7\u00e3o pode ser usada por um ou mais drivers de protocolo, simultaneamente.<\/p>\n<p>As portas de comunica\u00e7\u00e3o s\u00e3o separadas da implementa\u00e7\u00e3o dos protocolos para permitir uma maior flexibilidade do sistema. Uma aplica\u00e7\u00e3o dessa real que pode ser feita com essa arquitetura, \u00e9 associar uma porta TTCP_UDPPort com um COMServer (equipamento que nada mais \u00e9 que um gateway RS-232\/485\/422 para TCP\/IP), para por exemplo, comunicar com algum equipamento Modbus RTU a muitos quil\u00f4metros de dist\u00e2ncia sobre internet. Outra vantagem deste design \u00e9 colocar dois ou mais protocolos usando a mesma porta de comunica\u00e7\u00e3o simultaneamente na mesma aplica\u00e7\u00e3o. Isto \u00e9 poss\u00edvel pelo fato de todas portas contar com um mecanismo que s\u00f3 permite que um protocolo use a porta durante a opera\u00e7\u00e3o de comunica\u00e7\u00e3o. Ou seja, uma aplica\u00e7\u00e3o pode comunicar com v\u00e1rios equipamentos, estes equipamentos com diferentes protocolos de comunica\u00e7\u00e3o e todos conectados na mesma rede RS-485. \u00c9 poss\u00edvel, apesar de n\u00e3o ser recomendado.<\/p>\n<p>Todas as portas existentes no PascalSCADA descendem da classe TCommPort, que implementa os m\u00e9todos base para abrir e fechar a porta, ler e escrever dados e limpar os buffers de leitura e escrita em caso de falha de comunica\u00e7\u00e3o. Mas l\u00f3gico que estes m\u00e9todos precisam ser especializados caso uma nova porta de comunica\u00e7\u00e3o esteja sendo implementada.<\/p>\n<h5><img decoding=\"async\" alt=\"Sele\u00e7\u00e3o_090\" src=\"http:\/\/www.pascalscada.com\/wp-content\/uploads\/2016\/08\/Sele\u00e7\u00e3o_090.png\">TSerialPort<\/h5>\n<p>A classe TSerialPort, derivada da classe TCommPort, foi criada para permitir os protocolos trocar dados sobre portas seriais, independente do meio f\u00edsico utilizado pela porta.<\/p>\n<p>Em sistemas operacionais Windows, esta classe necessita uma porta serial com o nome entre COM1 e COM255.<\/p>\n<p>Rodando sobre Linux, qualquer dispositivo que o nome comece com tty&lt;n\u00famero&gt;, ttyUSB&lt;n\u00famero&gt; ou ttyACM&lt;n\u00famero&gt; \u00e9 v\u00e1lida.<\/p>\n<p>On FreeBSD, any device qualquer dispositivo cujo o nome comece com cuad&lt;n\u00famero&gt; \u00e9 aceita pela classe.<\/p>\n<p><strong>Tanto em Linux como FreeBSD (ou outro Unix) dever\u00e1 ser tomado o cuidado de adicionar o usu\u00e1rio que ir\u00e1 rodar a aplica\u00e7\u00e3o no grupo dono da porta serial, alem de dar permiss\u00e3o de leitura\/escrita para o grupo sobre a porta serial desejada. O nome deste grupo varia conforme o sistema.<\/strong><\/p>\n<p>Independente de sistema operacional, a classe de porta Serial conta com as seguintes propriedades que configuram o funcionamento da porta serial:<\/p>\n<ul>\n<li><strong>COMPort:<\/strong> define a porta serial a ser utilizada. Caso a aplica\u00e7\u00e3o seja configurada com uma porta e esta porta seja desconectada do sistema (por exemplo, um conversor USB &lt;-&gt; Serial) e a aplica\u00e7\u00e3o seja iniciada, uma exce\u00e7\u00e3o ser\u00e1 gerada. Se esta exce\u00e7\u00e3o for gerada durante a carga (inicializa\u00e7\u00e3o) da aplica\u00e7\u00e3o, sua aplica\u00e7\u00e3o n\u00e3o iniciar\u00e1, mesmo com a propriedade Active = FALSE.<\/li>\n<li><strong>Baudrate<\/strong> : velocidade em bits por segundo que esta porta ir\u00e1 utilizar durante a comunica\u00e7\u00e3o. Velocidades entre 110 bps e 115200 bps s\u00e3o aceitas.<\/li>\n<li><strong>DataBits<\/strong> : Define o tamanho da palavra de dados que ser\u00e1 trocada durante a comunica\u00e7\u00e3o serial, em bits. Os tamanhos aceitos s\u00e3o 7 ou 8 bits, sendo o padr\u00e3o 8 bits. Alguns protocolos pedem 7 bits, como por exemplo o Modbus ASCII. Outros como o Modbus RTU, definem o tamanho da palavra de dados de 8 bits.<\/li>\n<li><strong>StopBits<\/strong> : Configura a quantidade de bits que ser\u00e1 usada para marcar o in\u00edcio e o final de cada palavra transmitida na comunica\u00e7\u00e3o serial. O padr\u00e3o \u00e9 1 stop bits.<\/li>\n<li><strong>Paridade:<\/strong> configura se a palavra ir\u00e1 contar com checagem de erros, e se em caso dela existir, se a checagem vai ser par ou impar.<\/li>\n<li><strong>Timeout<\/strong> : Define o tempo m\u00e1ximo que a porta serial ir\u00e1 aguardar pela leitura de uma certa quantia de dados. Este tempo \u00e9 definido em milissegundos. Em casos de estouro do timeout, uma limpeza dos buffers de leitura e escrita \u00e9 realizada.<\/li>\n<li><strong>AcceptAnyPortName<\/strong> : Esta propriedade, quando habilitada em um sistema Unix (Linux, FreeBSD, etc), faz com que qualquer nome de dispositivo seja aceito na propriedade COMPort. Muito \u00fatil quando alguns drivers criam nomes de dispositivos que n\u00e3o s\u00e3o aceitos pelo padr\u00e3o descrito acima. No Windows ela n\u00e3o tem efeito.<\/li>\n<li><strong>WriteReadDelay<\/strong> : Atraso em milissegundos entre um comando de escrita e em seguida um leitura.<\/li>\n<li><strong>Active:<\/strong> Esta propriedade controla a abertura e fechamento da porta. A porta serial n\u00e3o dever\u00e1 estar aberta por nenhum outro processo quando esta propriedade vai para true, caso contr\u00e1rio a propriedade Active ir\u00e1 votar para false. Em tempo de desenvolvimento, Active = true s\u00f3 realiza as verifica\u00e7\u00f5es para abertura da porta mas n\u00e3o efetua a abertura da porta.<\/li>\n<\/ul>\n<h5><img decoding=\"async\" alt=\"Sele\u00e7\u00e3o_091\" src=\"http:\/\/www.pascalscada.com\/wp-content\/uploads\/2016\/08\/Sele\u00e7\u00e3o_091.png\">TTCP_UDPPort<\/h5>\n<p>A classe TTCP_UDPPort, derivada da classe TCommPort, foi criada para permitir os protocolos trocar dados sobre portas TCP (testado) ou UDP (necessita testes) sobre IPv4. independente do meio f\u00edsico utilizado pela porta.<\/p>\n<p>Esta classe de porta, n\u00e3o tem propriedades que dependentes de sistema operacional, sendo que as seguintes propriedades configuram seu funcionamento:<\/p>\n<ul>\n<li><strong>Host<\/strong> : Endere\u00e7o IPv4 que a porta ir\u00e1 conectar. Nomes de host n\u00e3o s\u00e3o aceitos, somente endere\u00e7os IP.<\/li>\n<li><strong>Port<\/strong> : N\u00famero da porta no host destino que a porta ir\u00e1 conectar. s\u00e3o aceitos qualquer n\u00famero entre 1 e 65535.<\/li>\n<li><strong>PortType<\/strong> : Define se o socket que ir\u00e1 ser estabelecido ir\u00e1 ser sobre TCP ou UDP.<\/li>\n<li><strong>ExclusiveDevice<\/strong> : Caso true, evita que a porta seja aberta durante o tempo de desenvolvimento. Util quando o host destino tem um limite muito baixo de conex\u00f5es dispon\u00edveis.<\/li>\n<li><strong>EnableAutoReconnect<\/strong> : Caso true e caso o socket for desconectado (problema no meio f\u00edsico ou com o host) habilita o temporizador que ir\u00e1 ficar tentando reconectar o socket. Neste caso o socket com problemas \u00e9 fechado e a propriedade Active permanece true.<\/li>\n<li><strong>ReconnectRetryInterval<\/strong> : Esta propriedade define o intervalo de tempo em milissegundos em que a porta tentar\u00e1 reconectar conex\u00f5es perdidas. Esta propriedade s\u00f3 \u00e9 valida caso EnableAutoReconnect e Active sejam true.<\/li>\n<li><strong>Timeout<\/strong> : Define o tempo m\u00e1ximo que a porta ir\u00e1 aguardar pela confirma\u00e7\u00e3o de escrita ou leitura de uma certa quantia de dados. Este tempo \u00e9 definido em milissegundos. Caso alguma opera\u00e7\u00e3o exceda este tempo, os buffers s\u00e3o limpos, a porta \u00e9 verificada e em caso de alguma anormalidade, o socket ser\u00e1 descartado e se EnableAutoReconnect \u00e9 true uma tentativa de reconectar o socket ser\u00e1 feito.<\/li>\n<li><strong>Active:<\/strong> Esta propriedade controla a abertura e fechamento do socket. Em tempo de desenvolvimento, Active = true ir\u00e1 abrir o socket e realizar comunica\u00e7\u00f5es com seu dispositivo, exceto se <strong>ExclusiveDevice<\/strong> for setado para true.<\/li>\n<\/ul>\n<h5>Exemplos<\/h5>\n<p>Abaixo est\u00e3o listados exemplos de como trocar dados usando as portas de comunica\u00e7\u00e3o do PascalSCADA diretamente via c\u00f3digo, ou seja sem usar, sem usar um driver de protocolo. Como todas as portas s\u00e3o descendentes da classe TCommPort, o exemplo abaixo tamb\u00e9m vale se quiser implementar algo usando uma porta TTCP_UDPPort.<\/p>\n<ul>\n<li>Genius game, interface de ranqueamento: <a href=\"https:\/\/sourceforge.net\/p\/pascalscada\/code\/HEAD\/tree\/trunk\/examples\/laz_serialport_genius\/\">https:\/\/sourceforge.net\/p\/pascalscada\/code\/HEAD\/tree\/trunk\/examples\/laz_serialport_genius\/<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o Portas de comunica\u00e7\u00e3o s\u00e3o o meio utilizado pelos drivers de protocolo para enviar e receber dados. Uma porta de comunica\u00e7\u00e3o pode ser usada por um ou mais drivers de &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"template-fullwidth.php","meta":{"footnotes":""},"class_list":["post-167","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/pages\/167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/comments?post=167"}],"version-history":[{"count":28,"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/pages\/167\/revisions"}],"predecessor-version":[{"id":1230,"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/pages\/167\/revisions\/1230"}],"wp:attachment":[{"href":"https:\/\/www.pascalscada.com\/pb\/wp-json\/wp\/v2\/media?parent=167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}