Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PHP konwerter RS232 - wagi
Forum PHP.pl > Forum > Przedszkole
KarolOl
Witam,

Jak ugryźć temat.

Mam wagi które są daleko od serwera z PHP.
Host serwujący dostęp dla klientów jest Linuxowy.

Klienci zdalnie opisują cechy towarów i ważą je na wagach. Chce podpiąć te wagi by nie przepisywali wartości ręcznie. Jak ugryźć temat konwertera i PHP. Nie jest to lokalny RS232 z którym bym sobie poradził, nie mam softu pod linuxa do odczytu wag. Musze wysłać komendę sterującą, lub prościej ustawie sobie wagę by wysyłała non-stop wartości w kierunku serwera. Czy odebrać to bezpośrednio przez PHP (jaka funkcja?). Czy kombinować z NC i tworzyć coś lokalnie w sql lub pliku tekstowym?

Ktoś już testował takie rozwiązanie?

Chyba, że można stworzyć wirtualnego RS232 na linuxie robiąć coś w rodzaju kolejki FIFO i odwoływać się już wtedy z php'a do /dev/ttySx
mls
Możesz czytać bezpośrednio z portu COM (fopen lub IMO zdecydowanie lepsze dio), możesz podłączyć wagi do sieci ethernet poprzez Moxę i czytać z socketa TCP, wybór jest.
Przede wszystkim jednak musisz znać protokół w jakim komunikują się wagi poprzez RS232.
KarolOl
Ale jak wagę mam na konwerterze to jak czytać bezpośrednio przez port, musze go jakoś najpierw lokalnie podlinkować. Gdy biore konwerter odczytam po sokecie fakt to jest myśl.
Chyba, że miałeś na myśli odczyt bezpośrednio gdy mam fizycznie do RS232 w serwerze podpięte, ale ta opcja nie wchodzi w grę nie do wykonania.

Wagi są radwagu, dokumentacja jest OK, są kody sterujące nie powinno być problemu. Moxe już mi jedna osoba polecała, mogę też kupić oryginał Radwagu pod te wagi.

OK. Mam głowicę radwagu (co prawda bez tensometrów, ale sztucznie dało się oszukać wynik).
Bez problemu obsługuję ją konwerterem MP-W5100.
Mam taki kod:
  1. <?php
  2. $address="192.168.1.1";
  3. $service_port="8300";
  4. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  5.  
  6. if ($socket === false) {
  7. echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
  8. } else {
  9. echo "OK.\n";
  10. }
  11.  
  12. echo "Połączenie z '$address' port '$service_port'...";
  13.  
  14. $result = socket_connect($socket, $address, $service_port);
  15. if ($result === false) {
  16. echo "Bład: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
  17. } else {
  18. echo "OK.\n";
  19. }
  20.  
  21. $in = "SI\r\n";
  22. $out = '';
  23.  
  24. socket_write($socket, $in, strlen($in));
  25.  
  26. if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
  27. echo "Read $bytes";
  28. } else {
  29. echo "Błąd: " . socket_strerror(socket_last_error($socket)) . "\n";
  30. }
  31.  
  32. socket_close($socket);
  33.  
  34. echo "\n". $buf . "\n";
  35. ?>


LUB taki:
  1. <?php
  2. $fp = fsockopen("tcp://192.168.1.1", 8300, $errno, $errstr);
  3. if (!$fp) {
  4. echo "$errno - $errstr<br />\n";
  5. } else {
  6. fwrite($fp, "SI\r\n");
  7. echo fread($fp, 21);
  8. fclose($fp);
  9. }


Pierwszym kodem bez problemu odczytuje pełną odpowiedź z wagi i ją sobie mogę przerobić. Jednak odpowiedź to czas jakieś 6 sek.
Drugim sposobem chcę odczytać 21 bajtów (tyle też wynika z dokumentacji RADWAGU) ale dostaję tylko 'S'. Oczywiście sposób o wiele szybszy.
Może ktoś mnie naprowadzi gdzie robię błąd.

Wynik z wagi dla ogólnego zrozumienia tematu na zapytanie SI wygląda tak:
  1. SI 1041 kg


OK. Zmieniłem rozmiar bufora dla socket_recv an 21b. Teraz jest gitara. KO
mls
Polecam użyć stream_set_blocking - dzięki temu może będzie trochę prościej wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.