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
Tags:
#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é
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por