Olá pessoal, preciso de uma ajuda de vcs. Tenho uma aplicação para desenvolver com Arduino Nano e protocolo Modbus RTU Slave mais 03 CI´s PCF8574, sendo:

 - PCF 1 e 2 serão configurados como INPUT e o 03 como OUTPUT

Estou usando as Bibliotecas, para tal configuração:

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

Meu problema está na configuração de Ler as Entradas Digitais acima da 8ª porta, ou seja, porta 9.

Na configuração precisamos dizer os regBank de Digital Input para depois na função loop() setar o regBank conforme as entradas digitas em nivel alto.

Acontece que a configuração não aceita "setar" acima de 08 Dgitial Input Registers.

Alguém???

Obg.

Fernando.

Exibições: 617

Anexos

Responder esta

Respostas a este tópico

Bom dia ,

Informe o diagrama de ligação dos PCF8574. (endereçamento A0,A1 e A2). 

Cada um deles deverá ter um endereçamento diferente. 

https://www.arduinoecia.com.br/2017/03/como-usar-pcf8574-expansor-d...

Olá José Gustavo, obrigado pelo retorno.

Vou desenhar o diagrama, prorém posso assegurar que está ok, pois testei todos os CI´s que são entradas e Saidas e estão respondendo de forma correta.

Mas quando mando setar a entrada 09 em diante, sendo no PCF8574 nº 02 com endereço I²C 21 no barramento a função de regBank.set (10009) não é alterada. Até o endereço Digital Input 10008 sim, este altera de 0 -- 1.

Acompanho a comunicação Mdbus através de um programa Modbus Master no PC.

Será que tem limitação na biblioteca em relação ao arduino que utilizo.

Fiz uma alteração para Ler a entrada do PCF8574 nº 02 com endereço I²C 21 para Setar na HoldRegister (400009) em diante e desta forma é Setada as memorias de 0 -- 1.

Aguardo por maiores informações.

Obg.

Boa tarde, 

Você instalou os resistores de pullup na interface I2C?

Um resistor de 4,7K ohms para SDA e um do mesmo valor para SCL. 

Devem ser conectados no 5V.

Boa tarde!

Sim, conectei. A comunicação I2C estão ok. testei todos os PCF´s no barramento e todos respondem corretamente, os que foram configurados como saída e configurados como entrada. 

Acontece que quando eu coloco a entrada P0 do PCF 0x21 como nivel alto (5V) no programa eu preciso setar a função regBank.set(10009), 1; e quando deixo nivel baixo (0V) devo setar regBank.set(10009), 0;

Como eu utilizo um programa no PC de um Modbus Master para ler o Input Register 10009 ele nunca altera o Status para 1 (Nivel logico 5V no PCF 0x21).

Quando faço essa manobra no PCF 0x20 onde tenho as 08 primeiras entradas e no Mobus 10001 a 10008, tudo ocorre bem.

Não entendi - 

quando eu coloco a entrada P0 do PCF 0x21 como nivel alto (5V) no programa eu preciso setar a função regBank.set(10009), 1; e quando deixo nivel baixo (0V) devo setar regBank.set(10009), 0;

Para mudar o estado de uma porta do PCF8574, ele tem que ser uma saída e não uma entrada. 

Sei que podemos configurar as portas do PCF8574 como entrada ou saída.

 Eu tenho 06 CI´s PCF8574 no barramento, configurei 04 deles sendo os pinos de entrada e 02 CI´s como saídas de 5V.

Anexei meu codigo para visualizar como foi feito. 

Você informou que era uma entrada e que mudou o estado dela. Esta incorreto isso. 

Configuro como entrada 02 PCF8574 onde eu leio estado 0 ou 1. Está certo?

Boa tarde, 

Primeiro passo , recomendo que estude a biblioteca :

https://github.com/xreef/PCF8574_library

Você vai usar o pino de INT do PCF8574 para gerar interrupção no Arduino?

Boa noite, 

Você configurou as portas com id = 0 até 7.

for(byte i=0;i<8;i++)

{
PCF_20.pinMode(i, INPUT);
PCF_21.pinMode(i, INPUT);
PCF_23.pinMode(i, INPUT);
PCF_24.pinMode(i, INPUT);
}

E depois quer ler as portas com identificação P0, P1,etc ??

Esta certo isso?

// CI Leitura de Chaves em Modo Automático (01 a 08)


PCF8574::DigitalInput val = PCF_20.digitalReadAll();


if (val.p0==HIGH){regBank.set(10001, 1);} else {regBank.set(10001, 0);}
if (val.p1==HIGH){regBank.set(10002, 1);} else {regBank.set(10002, 0);}
if (val.p2==HIGH){regBank.set(10003, 1);} else {regBank.set(10003, 0);}
if (val.p3==HIGH){regBank.set(10004, 1);} else {regBank.set(10004, 0);}
if (val.p4==HIGH){regBank.set(10005, 1);} else {regBank.set(10005, 0);}
if (val.p5==HIGH){regBank.set(10006, 1);} else {regBank.set(10006, 0);}
if (val.p6==HIGH){regBank.set(10007, 1);} else {regBank.set(10007, 0);}
if (val.p7==HIGH){regBank.set(10008, 1);} else {regBank.set(10008, 0);}

Referência :

https://github.com/xreef/PCF8574_library/blob/master/examples/readA...

Bom dia José Gustavo,

Sim, está certo e funciona!

Meu problema não está me ler as portas do PCF e sim em setar o estado delas nos regBank.set.

A partir do PCF 0x21 onde é a sequencia das portas 09 a 16, estas portas não são setas no regBank.set (10009) até regBank.set (10016) conforme estados (0 / 1). 

Ao ler as portas do PCF 0x20, estas são setados nas regBank.set (10001) até regBank.set (10008), ou seja, não tenho problemas em ler as portas dos  PCF´s, meu problema é pq não setam as regBank.set (10009) até regBank.set (10016).

Boa tarde Fernando, 

Então o seu problema esta em usar a biblioteca ModBus!

Informe os links das bibliotecas.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço