Ir ao conteúdo
  • Cadastre-se

C modbus rtu rs-485 master-slave com pic18f4550


Visitante

Posts recomendados

Oi! Eu estou desenvolvendo um projeto para o meu TCC na qual eu tenho dois dispositivos:

 

  1. PIC18F4550 (Mestre);
  2. Inversor de Frequência WEG CFW500 (Escravo).

 

Eu preciso que o PIC18F4550 leia alguns registradores de retenção (holding registers) do Inversor de Frequência.

Estou programando em linguagem C e utilizando o PIC C Compiler (CCS).

Vou anexar um diagrama de como vai ficar a parte física.

Vou usar um transceptor MAX485 (apesar do modelo do diagrama ser o MAX487) para o intermédio da comunicação.

O cristal do microcontrolador será de 20MHz.

Estou usando um display LCD 20x4 LM044L.

Preciso exibir no display o valor de(a):

 

  • Corrente do Motor;
  • Frequência do Motor;
  • Tempo de Aceleração do Motor;
  • Tempo de Desaceleração do Motor.

 

Eu já comecei a programar no CCS, eu estou usando apenas duas bibliotecas, a biblioteca do LCD padrão do CCS e a biblioteca do MODBUS.

O CFW500 utiliza parâmetros, cada parâmetro corresponde a um registrador que armazena algum dado, por exemplo:

 

P0003 = corrente do motor;

P0005 = frequência do motor;
P0100 = tempo de aceleração do motor;
P0101 = tempo de desaceleração do motor.

 

Eu sei que para ler algum registrador eu devo utilizar o comando da função 3: 

 

modbus_read_holding_registers(endereço do escravo,endereço do registrador inicial,quantidade de registradores para ler);

 

A função 3 serve para ler os registradores de retenção.

Eu defini o endereço do escravo para 1.

Então, se eu quiser ler APENAS o valor da frequência por exemplo, eu converto 0005 (parâmetro da frequência) para hexadecimal e fica:

 

modbus_read_holding_registers(0x01,0x05,0x01); //ler os registradores de retenção do escravo no endereço 1; leia o registrador 5 e apenas 1 registrador

 

Atualização: eu criei uma variável do tipo int e defini que o valor dela seria igual à leitura do registrador 5, em seguida, esse valor seria exibido no display; porém o display sempre exibe o mesmo valor, no caso, o número 12. Alguém sabe o por quê? 

 

Eu não sei ao certo como exibir o resultado da leitura no display, alguém poderia por favor me ajudar? Qualquer detalhe que faltar eu respondo. Obrigado! :)

 

Código CCS:

 

//Master

#include <18f4550.h>
#device *=16
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20M)

#define MODBUS_BUS SERIAL
#define MODBUS_TYPE MODBUS_TYPE_MASTER
#define MODBUS_SERIAL_TYPE MODBUS_RTU
#define MODBUS_SERIAL_INT_SOURCE MODBUS_INT_EXT
#define MODBUS_SERIAL_RX_BUFFER_SIZE 64
#define MODBUS_SERIAL_BAUD 9600
#define MODBUS_REMOTE_ADDRESS 1
#define MODBUS_SERIAL_RX_ENABLE PIN_C6                                      //pino RE RS-485
#define MODBUS_SERIAL_ENABLE_PIN PIN_C7                                     //pino DE RS-485

#include "modbus.c"
#include "LCD.C"

#define MODBUS_SLAVE_ADDRESS 0x01                                           //define o endereço do escravo

int ler;

void main() {

     modbus_init();
     lcd_init();
     
     while(TRUE) {
          ler = modbus_read_holding_registers(0x01,0x05,0x01);              //lendo os registradores de retenção
          printf(lcd_putc,"%u",ler);
          delay_ms(3000);
     }
}

 

diagrama.png

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!