Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Mindenki!

A következőben szeretném kérni a segítségeteket. A cégünknél van több hídmérleg és RS232-n csatlakozik PC-hez, mivel van VPN és terminál szerver is rengeteg problémát és költséget okoz (jogszabályok miatt, a szerkezet jó :D ). Azt találtam ki, hogy a mérleg adatait közvetlenül adatbázisba továbbítanám (WGET paranccsal)... Ami megvan és működik az a web interfész, a STRING tömb amibe az érték bekerül és az ethernet kommunikáció is megy; ami nem megy az a mérleg lekéredezése/megszólítása. Soros monitorral megnéztem mi történik a PC és a mérleg között, ellenőriztem a soros port beállításait a PC-n és az arduino megát is hozzá állítottam (aztán lehet kellene még állítani!). Próbáltam használni MAX3232 convertert és csináltam kábelt is (2,3,5 lábak => mérleg leírásában ellenőriztem), de nem akar szóba állni velem :( Van ötlet?

Amit a soros monitoron látok a PC-n:
58 41 2f 42 3f d 0a "XA/B?.." => ASCII PC kérdés
41 58 2f 42 3d 39 39 39 39 39 53 0d 0a "AX/B=99999S.." => ASCII mérleg válasz (99 999 Kg)

A PC soros port beállítása a következő:
Port ..................... 1
Baud .................... 9600
Databit ................. 8
Stopbit ................. 1
Parity .................. None
Késleltetés ........... 5000

Az Arduino 2560 Mega főbb részei:
void setup(){
Serial.begin(9600); //ellenőrzéshez
Serial1.begin(9600, SERIAL_8N1); //itt van a mérleg
---------------------------------------------------------------------------
void loop(){
...
//Serial1.write("58 41 2f 42 3f 0d 0a");
//Serial1.write("58 41 2f 42 3f \r\n");
//Serial1.write("XA/B? \r \n");
//Serial1.write("58 41 2f 42 3f");
/*Serial1.write("XA/B?", HEX);
Serial1.write('\r');
Serial1.write('\n');
Serial1.write("58", HEX);
Serial1.write("41", HEX);
Serial1.write("2f", HEX);
Serial1.write("42", HEX);
Serial1.write("3f", HEX);
Serial1.write("0", HEX);
Serial1.write("d", HEX);
Serial1.write("0", HEX);
Serial1.write("a", HEX);

Serial1.write("X");
Serial1.write("A");
Serial1.write("/");
Serial1.write("B");
Serial1.write("?");
Serial1.write('\r');
Serial1.write('\n');
*/
Serial1.write("X", HEX); //Itt adtam fel ( próbáltam még serial.print -el is! mindet )
Serial1.write("A", HEX); //Itt adtam fel
Serial1.write("/", HEX); //Itt adtam fel
Serial1.write("B", HEX); //Itt adtam fel
Serial1.write("?", HEX); //Itt adtam fel
Serial1.write('\r'); //Itt adtam fel
Serial1.write('\n'); //Itt adtam fel
//Serial1.write(ask, sizeof(ask));
/*for(i = 0; i < 7; i++)
{
Serial1.print(ask);
Serial1.print(" ");
}
*/
//Serial1.write(Serial.read());
//Serial.println();
Serial.println(Serial1.read()); //Itt látom mi jön válasznak
Serial.println(Serial1.read(),BIN); //Itt látom mi jön válasznak
Serial.println(Serial1.read(),HEX); //Itt látom mi jön válasznak
Serial.println(Serial1.read(),DEC); //Itt látom mi jön válasznak
Serial.println(Serial1.read(),OCT); //Itt látom mi jön válasznak
Serial.println(Serial1.readString()); //Itt látom mi jön válasznak
/*
for (int i=0; i<5; i++)
{
Serial.write(Serial1.read());
}
*/
Serial.println("END"); //Itt látom mi jön válasznak
Serial.println(); //Itt látom mi jön válasznak
Serial1.flush();
...

Amit "válasznak" kapok az arduinon:
-1 //sima read
11111111111111111111111111111111 //BIN
FFFFFFFF //HEX
-1 //DEC
37777777777 //OCT
//STRING
END //üzenet vége


Várom szíves segítő válaszaitokat!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Robert »

Br@y terminállal nézd meg.
Nekem hiányzik az elválasztókarakter küldése.
http://www.tavir.hu - a gazda :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: kapu48 »

Szerintem előbb programozni kellene megtanulni!
Mert ez a példa olyan, mint az állatorvosi ló! 1000 sebből vérzik!
Majd aztán nekifogni komolyabb feladathoz.

A hexa számot így írjuk: 0x58, ez rossz "58" ez 2db. karakter.
Ez nem tudom, mi akarna lenni?:
Serial1.write("0", HEX);? 0x0d = kurzor új sorba
Serial1.write("d", HEX);?
Serial1.write("0", HEX);? 0x0a = kurzor sor elejére
Serial1.write("a", HEX);?
De így szétbontva semmi értelme!

Ez mi?:
Serial1.write("58 41 2f 42 3f 0d 0a");
http://www.ascii.atw.hu
Szerintem:
Serial1.println("XA/B?"); az „println” automatikusan küldi a string végén a 0x0d, 0x0a parancsokat


Ez egyszerű szöveg értelmező gép lehet!
Ami adott szöveges utasításokat meg ért, és értelmes választ ad rá!
Nem hiszem, hogy a programozói ilyen HEXA bűvészkedéssel töltötték volna a drága idejüket!

Amiket ráadásul még hibásan is próbálsz használni!
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Robert és Kapu48!

Köszönöm a segítséget az építő kritikát! A küldött kódból is látszik, hogy próbáltam először tömbbel "normálisan" megoldani, de csak okosabbtól lehet tanulni:
egyik féle:
Serial1.write(ask, sizeof(ask));

másik féle:
for(i = 0; i < 7; i++)
{
Serial1.print(ask);
Serial1.print(" ");
}

Igaz, ezt nem írtam le, tehát a tömböket pedig, így - is - próbáltam sikertelenül:
String ask[] = { "58", "41", "2f", "42", "3f", "0d", "0a" };
byte ask[] = { 0x58, 0x41, 0x2f, 0x42, 0x3f, 0x0d, 0x0a };
char ask[] = { 0x58, 0x41, 0x2f, 0x42, 0x3f, 0x0d, 0x0a };

Az 1000 sebből vérző lovat pedig innen vettem (remélem nem szegek szabályt a linkkel), itt soros port beállítás hiba volt:
https://prog.hu/tudastar/96701/merleg-s ... -elakadtam

Serial1.println("XA/B?"); => Ezzel kapcsolatban pedig visszajelzek, hogy mit kaptam/vagy nem kaptam válasznak; addig szíves türelmeteket kérem!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: kapu48 »

Ez a project visual basic-ben készült!

Bővebben itt:
https://www.google.hu/search?client=ope ... 8&oe=UTF-8
https://microsoft-visual-basic.en.softonic.com/download

Ismerni kellene mindkét nyelvet, ha át akarod írni C++-be!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Robert »

Serial.write - byte-t írok ki a soros vonalra. Azaz a spec karakterek ezzel mennek (0...31; 126...255).
Normál szövegre a serial.print("na ezt irdd ki"); illetve ha soremelés van: serial.println("na ezt irdd ki");
Viszont a soremelés lehet 10; 13; 10&13 kódú karakter is (rendszertől és beállítástól függőn!)
http://www.tavir.hu - a gazda :)
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Robert és Kapu48!

Mivel üzem van, így több mindennel próbálkoztam egyszerre. Gondoltam hátha az RX és TX van elkötve, ezért már azt is megcseréltem hátha... Olyan, mint ha nem látná az Arduino a mérleget... Ez alapján: https://www.arduino.cc/en/Serial/Begin nagyon mást nem lehet megadni...
A kód részei / serial - PC-m soros monitora; serial1 - Arduino 2560Mega RX1ésTX1/:
byte ask[] = { 0x58, 0x41, 0x2f, 0x42, 0x3f, 0x0d, 0x0a };
char ask_2[] = { 0x58, 0x41, 0x2f, 0x42, 0x3f };
String ask_3[] = { "58", "41", "2f", "42", "3f" };
Serial.println("XA/B?");
Serial1.println("XA/B?");
Serial.println("................START_1................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_1................");
Serial.flush();
Serial1.flush();
Serial.write(ask, sizeof(ask));
Serial1.write(ask, sizeof(ask));
Serial.println("................START_2................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_2................");
Serial.flush();
Serial1.flush();
for (int i = 0; i < 5; i++)
{
Serial.print(ask_2);
}
Serial.print('\r');
Serial.print('\n');
for (int i = 0; i < 5; i++)
{
Serial1.print(ask_2);
}
Serial1.print('\r');
Serial1.print('\n');
Serial.println("................START_3................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_3................");
Serial.flush();
Serial1.flush();
for(i = 0; i < 5; i++)
{
Serial.print(ask_3);
Serial.print(" ");
}
Serial.print('\r');
Serial.print('\n');
for(i = 0; i < 5; i++)
{
Serial1.print(ask_3);
Serial1.print(" ");
}
Serial1.print('\r');
Serial1.print('\n');
Serial.println("................START_4................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_4................");
Serial.flush();
Serial1.flush();
for(i = 0; i < 5; i++)
{
Serial.print(ask_3);
}
Serial.print('\r');
Serial.print('\n');
for(i = 0; i < 5; i++)
{
Serial1.print(ask_3);
}
Serial1.print('\r');
Serial1.print('\n');
Serial.println("................START_5................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_5................");
Serial.flush();
Serial1.flush();
Serial.println("58 41 2f 42 3f");
Serial1.println("58 41 2f 42 3f");
Serial.println("................START_6................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_6................");
Serial.flush();
Serial1.flush();
Serial.println("58412f423f");
Serial1.println("58412f423f");
Serial.println("................START_7................");
Serial.println(Serial1.read());
Serial.println(Serial1.read(),HEX);
Serial.println(Serial1.readString());
Serial.println("................END_7................");
Serial.flush();
Serial1.flush();

A válasz, ami megjelent a gépem soros monitorán:
XA/B?
................START_1................
-1
FFFFFFFF

................END_1................
XA/B?
................START_2................
-1
FFFFFFFF

................END_2................
XA/B?
................START_3................
-1
FFFFFFFF

................END_3................
58 41 2f 42 3f
................START_4................
-1
FFFFFFFF

................END_4................
58412f423f
................START_5................
-1
FFFFFFFF

................END_5................
58 41 2f 42 3f
................START_6................
-1
FFFFFFFF

................END_6................
58412f423f
................START_7................
-1
FFFFFFFF

................END_7................
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: kapu48 »

Sajnos nem jól próbálkozól!
Példák:
https://hackingmajenkoblog.wordpress.co ... e-arduino/
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Kapu48!

Hasznos leírás, köszönöm! Kérek szépen 1-2 napot, hogy átnézzem... Próbáltam hasonlót (https://www.arduino.cc/en/Serial/Available), de válasz nem jött, cserébe várt a végtelenségig... Szíves türelmedet kérem!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: kapu48 »

Proba:

Kód: Egész kijelölése

// SerialTest01.ino

int readline(int readch, char *buffer, int len)
{
  static int pos = 0;
  int rpos;

  if (readch > 0) {
    //Serial.print(readch, HEX); //  test?
    switch (readch) {
      case '\n': // Ignore new-lines
        break;
      case '\r': // Return on CR
        rpos = pos;
        pos = 0;  // Reset position index ready for next time
        return rpos;
      default:
        if (pos < len-1) {
          buffer[pos++] = readch;
          buffer[pos] = 0;
        }
    }
  }
  // No end of line has been found, so return -1.
  return -1;
}

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial1.println("XA/B?");    // Ide ird a küldendö parancsot
}

void loop()
{
  static char buffer[20];
  if (readline(Serial1.read(), buffer, 20) > 0) {
    Serial.println("!");    // Ha jött a végén '\n','\r'
    Serial.print("You entered: >");
    Serial.print(buffer);
    Serial.println("<");
  }else{
    Serial.print(".");  // Ha jött 1 karakter ...
  }
  
}

Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Kapu48!

Holnap megpróbálom a küldött kódot! Annyit változtattam a kódon, hogy megadom a serial1 paramétereit (erre van állítva a PC is):
Serial1.begin(9600, SERIAL_8N1);
Jelzem az eredményt!!!
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Kapu48!

Köszönöm még egyszer a kódot!!! Ez jött válasznak egy sorban a végtelenségig: .................................................................
Kipróbáltam kábelellel (2,3,5 láb) és MAX3232 adapterrel is. Cseréltem RX-TX lábat (összesen 4 féleképp). Küldök egy leírást a mérlegről és a PC beállításairól...
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

... Mit nézek el?
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Rwin
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2016. december 10. szombat, 21:34

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Rwin »

Kedves Robert, Kapu48 és Többiek!

A jövő héten kipróbálom a kapott kódot egy másik 2560 mega boarddal is, bár nem gondolom, hogy ez rossz..., ha ugyan azt az eredményt kapom, akkor ezen a vonalon megyek tovább:
https://www.arduino.cc/en/Tutorial/MultiSerialMega
https://www.arduino.cc/en/Tutorial/TwoPortReceive

Ha van még ötletetek abszolut vevő vagyok rá!!!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Metrisoft MS-01/XXX hídmérleg EMX100/111 fejjel

Hozzászólás Szerző: Robert »

Először a HW-t tedd rendbe. A MAX3232-vel kiynírtad az AVR-t, ahogyan a direkt Tx/Rx bekötéssel is.
A mintakódod 4800 bps-t Ír, Even paritással.
Azaz _köze nincs_ az általad mintaként használthoz.
A PC mintaképed esetén nem látszik a kommunikáció - a vezérlőpult nem azt adja vissza. A SerialMonitor programét add meg.

:evil:
http://www.tavir.hu - a gazda :)
Válasz küldése