Alguem ja viu essa biblioteca? achei super interessante por ter compatibilidade com praticamente todo hardware disponivel hj... inclusive o tao famoso ENC28J60 pela sua dificuldade e variedade de blibliotecas... eu mesmo ate hj nao consegui o que queria ate descobrir o souliss.. porem ainda é um pouco complicado mas foi a unica forma que consegui ler mais de 1 registrador holding com essa placa de rede.

quem quiser tentar e ver se consegue elabora um modbus slave com read e write passo o link do souliss... 

tem outra forma usando a biblioteca UIPethernet mas so consegui ler um registro.. nao consegui ampliar.. posto o codigo aqui se quiserem.

vamos la essa é uma solução dificuldade 9 hein kkkkkk

Exibições: 603

Responder esta

Respostas a este tópico

#include <UIPEthernet.h>

#define AREF_VOLTS 5.0

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress myIP(192,168,25,150);

EthernetServer server = EthernetServer(502);

void vHex2n(char X) {
if (X < 16) {Serial.print("0");}
Serial.print(X, HEX);
}

unsigned int uiHexToInt(String hex) {
int intValue = (int)strtol(&(hex[0]), NULL, 16);
return intValue;
}

uint8_t* uiHex(uint8_t* m,String str){
int nStr = str.length();
String strAux;
char sz[3];

esse é o codigo modbus para ENC28J60 com um canal analogico fazendo read... gostaria de pelo menos habilitar write e se possivel aumentar a qualidade de registros.

for(int i = 0; i < nStr; i += 2 ){
sz[0] = str.charAt(i);
sz[1] = str.charAt(i+1);
sz[2] = 0;
m[i/2] = uiHexToInt(sz);
}
return m;
}

void setup(){
Serial.begin(9600);


Ethernet.begin(mac,myIP);

analogReference(DEFAULT);

server.begin();
}

void loop(){
size_t size;
int nTransactionID,nProtocolID,nLengthOfNext,nL;
uint8_t uiTr0,uiTr1,ui_nID,uiAD1,uiAD0;
uint16_t uiValorAn = analogRead(A0);
uiAD0 = (uint8_t)(uiValorAn & 0x00FF);
uiAD1 = (uint8_t)(uiValorAn >> 8);

if (EthernetClient client = server.available()){
while((size = client.available()) > 0){
uint8_t* msg = (uint8_t*)malloc(size);
size = client.read(msg,size);
for(uint8_t i=0 ; i < size ; i++){
//Serial.print(msg[i],HEX);
vHex2n(msg[i]);
}
Serial.println();
if(size >= 6){
nTransactionID = word(msg[0],msg[1]);
uiTr0 = msg[0];
uiTr1 = msg[1];
ui_nID = msg[6];
nProtocolID = word(msg[2],msg[3]);
nLengthOfNext = word(msg[4],msg[5]);
}
free(msg);
}
String szStr = "0000000000050103020000";
nL = szStr.length() / 2;
uint8_t* msg = (uint8_t*)malloc(nL*sizeof(uint8_t));
msg = uiHex(msg,szStr);
msg[0] = uiTr0;
msg[1] = uiTr1;
msg[6] = ui_nID;
msg[9] = uiAD1;
msg[10] = uiAD0;
client.write(msg,nL);
free(msg);
}
}

eu tambem nao encontrei uma solução de modbus pro arduino usando este chip, ja conhecia este projeto souliss mas tambem tive dificuldades com ele, já usando a lib UIPEthernet tambem não rolou pq ela é uma adaptação.

O negocio só vai ficar legal quando alguem fazer uma biblioteca dedicada para modbus usando por exemplo a lib Ethercard.

mas e com esse codigo que postei??? esse funciona mas so o primeiro holding register... alguem com conhecimento poderia incrementar esse codigo.

Eu fiquei interessado pois tive que comprar outra placa de rede, ja que minha antiga é essa. Dai passei a usar o modbus com 5100 usando a biblioteca mudbus.

Ontem o professor andre atualizou uma biblioteca que pode funcionar. Vou testar as duas.

Até

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço