Moduły wagowe np Axis, Radwag

0

Witam
W naszej firmie chcemy wprowadzić rozwiązanie to kontrolingu wag palet pomiędzy zakładami produkcyjnymi. W tym celu chcemy użyć wózków paletowych z modułami wagowymi AXIS. Czy któryś z kolegów bawił się kiedyś w komunikację z takim urządzeniem?? Urządzenie komunikuje się poprzez ETH a domyślnie będzie to moduł WiFi. Ja z programowaniem bardzo dawno nic nie miałem do czynienia a z pisaniem programu do komunikacji z modułem wagowym to jeszcze nigdy :(((
Czy ktoś z kolegów może pomóc "wystartować" i podpowiedzieć jak stworzyć moduł do komunikacji (wysyłanie do urządzenia jego "Menu" i odczyt ważeń). Program oczywiście będzie dla celów wewnętrznych więc nie będzie nigdzie odpłatnie rozprowadzany.

Z góry dziękuję za jakąkolwiek pomoc/sugestie.

0

przede wszystkim musisz mieć API jakie waga udostępnia lub protokół komunikacyjny z jakiego korzysta.

0
dzilupl napisał(a):

Witam
W naszej firmie chcemy wprowadzić rozwiązanie to kontrolingu wag palet pomiędzy zakładami produkcyjnymi. W tym celu chcemy użyć wózków paletowych z modułami wagowymi AXIS. Czy któryś z kolegów bawił się kiedyś w komunikację z takim urządzeniem??

Zarówno radwag jak i axis udostępniają taką dokumentację. Najważniejsze pytanie to jakie konkretnie moduły macie bo sam radwag ma przynajmniej pięć różnych protokołów, a axisa znam dwa.

Przykładowo dla axisa SE-12 odczyt wagi to wysłanie

  1. #$02 + numer_wagi_szesnastkowo + CR + '{' + #$80 + '}'
    sprawdzenie czy pierwszy znak odpowiedzi jest różny od W - jak jest W to waga wyłączona i nie ma co pytać o wagę
  2. #$02 + numer_wagi_szesnastkowo + CR + '{' + #$87 + '}'
    pierwszy znak = S - STABILNA
    drugi znak = - - waga ujemna
    znaki od 3 do 9 to waga netto podana jawnie
    znaki od 10 do 12 to jednostka podana jawnie

Urządzenie komunikuje się poprzez ETH a domyślnie będzie to moduł WiFi. Ja z programowaniem bardzo dawno nic nie miałem do czynienia a z pisaniem programu do komunikacji z modułem wagowym to jeszcze nigdy :(((

Nie ma żadnego znaczenia - dla ethernetu otwierasz łączysz się przez socket z wagą (dane w ustawieniach) i tyle. Wysyłasz/odbierasz dane normalnie jak z gniazda

Czy ktoś z kolegów może pomóc "wystartować" i podpowiedzieć jak stworzyć moduł do komunikacji (wysyłanie do urządzenia jego "Menu" i odczyt ważeń).
Co to znaczy wysłanie "wysyłanie do urządzenia jego "Menu"". Jeśli masz na myśli pokazanie coś na wyświetlaczu wagi to do tego też potrzebny jest przede wszystkim model wagi i potem dokumentacja. O ile z radwagami na 100% działa to dobrze (PUE4/6 PUE4/7) to nie wiem czy axis ma możliwość pokazania własnego tekstu.

Program oczywiście będzie dla celów wewnętrznych więc nie będzie nigdzie odpłatnie rozprowadzany.
A czy to ma jakiekolwiek znaczenie? Program będzie służył do przynoszenia dochodów i jako taki będzie komercyjny. Jeśli zdecydujesz się użyć narzędzie, które nie zezwalają na użytek komercyjny to nie będziesz mógł ich użyć i tyle. Z drugiej strony jeśli się zdecydujesz komuś to zlecić to większość ludzi ma gdzieś co potem z tym programem zrobisz - zapłacić i tak trzeba będzie.

0

Na wstępie dzięki za zainteresowanie problemem i chęć pomocy.
Co do Axis-a - ma to być właśnie SE-12 i tak jak piszesz jest dokumentacja - otrzymałem od producenta opis protokołu. Komunikacja działa dwustronnie - można na wyświetlacz przesłać "menu". Fragment informacji od producenta: "Generalnie protokół komunikacyjny pozwala przesyłanie z komputera tekstów na wyświetlacz alfanumeryczny SE-12 oraz pozyskiwanie informacji (przez odpytywanie miernika o status) o naciśniętych klawiszach. Możliwa jest pewna konfiguracja działania klawiszy (można ją dynamicznie zmieniać), poprzez ich blokowanie lub kojarzenie z nimi funkcji takich jak np. wpisywanie kodu numerycznego lub alfanumerycznego, wpisywania wartości tary, zatwierdzenia pomiaru. Odczyt statusu pozwala stwierdzić fakt wykonania funkcji i wskazuje na rejestr, w którym np. znajdują się informacje do ewentualnego odczytu (kod, zatwierdzony wynik, itp.)."
Mój podstawowy problem polega na tym że z programowaniem nie miałem już jakiś czas do czynienia a z tematami komunikacji z miernikami wagowymi od strony programowania jeszcze nigdy i temat "dla ethernetu otwierasz łączysz się przez socket z wagą (dane w ustawieniach) i tyle. Wysyłasz/odbierasz dane normalnie jak z gniazda" nie jest dla mnie taki oczywisty. Tutaj prosiłbym o jakieś sugestie jak taką komunikację wywołać/nawiązać (prośba o fragment kodu który nawiąże taką komunikację i pozwoli mi nasłuchiwać do wysyła waga i przekazywać instrukcje do wagi). Padnie zaraz pytanie o język programowania - ja miałem do czynienia z C++ i PHP ale jeśli będzie inny to będę wdzięczny za jakąkolwiek pomoc. I tak muszę sobie odświeżyć temat programowania więc jak będzie to jakiś nowy dla mnie język to postaram się go sobie "przyswoić".

Co do tematu "Program oczywiście będzie dla celów wewnętrznych więc nie będzie nigdzie odpłatnie rozprowadzany" to chodziło mi o to że ja nie otrzymam za niego żadnego ekstra wynagrodzenia - to tak żeby kolegom wyjaśnić że nie szukam tutaj pomocy w celach zarobkowych żeby wzbogacać się na czyjejś wiedzy bo nie o to mi chodzi.

0

co do samego programowanie to wybierz język a w sieci znajdziesz bardzo dużo materiałów o programowaniu sieciowym - będzie to najprostszy klient TCP, przykład w c#. Ja bym to pewnie w Twojej sytuacji (brak licencji na komercyjny kompilator) napisał c# express bo on w zupełności do tego wystarczy. Możesz wziąć ten przykład co podałem, przekopiować go na żywca, ustawić odpowiednio adres i port do wagi, za message podać (char)2 + "numer_wagi_szesnastkowo" + (char)13 + '{' + (char)135 + '}', gdzie za numer_wagi_szesnastkowo należy wstawić konkretny numer, taki jaki ma waga, np. dla wagi nr 1 trzeba wstawić "01" uruchomić i zobaczyć co Ci zwróci waga

0

Witam

Na jakiś czas musiałem odpuścić temat ale właśnie do niego wróciłem.
Skorzystałem z podanego przykładu. Jako message które wcześniej zdefiniowałem jak string wstawiłem jak podano.
Fragment kodu:

 
String message=(char)2 + "01" + (char)13 + '{' + (char)135 + '}';
Byte[] komunikat = System.Text.Encoding.ASCII.GetBytes(message);         

// Get a client stream for reading and writing.
// Stream stream = KlientTCP.GetStream();

NetworkStream stream = KlientTCP.GetStream();

// Send the message to the connected TcpServer. 
stream.Write(komunikat, 0, komunikat.Length);

Console.WriteLine("Sent: {0}", message);         

To co pojawia się w konsoli po kompilacji i uruchomieniu:
Zrzut_20130507_095110.jpg
Waga nic nie zwraca.
Jakaś sugestia gdzie popełniam błąd? Przypuszczam że błąd jest w samym message i w moim zapisie tego komunikatu.

0
  1. przecież poprawnie Ci wyświetlił w konsoli to co WYSYŁASZ
  2. gdzie odbierasz to co odsyła Ci waga
0

Dalszy kod jest następujący jednakże nic się nie dzieje, nie pojawia się odpowiedź.

 
// Receive the TcpServer.response.

                // Buffer to store the response bytes.
                komunikat = new Byte[256];

                // String to store the response ASCII representation.
                String responseData = String.Empty;

                // Read the first batch of the TcpServer response bytes.
                Int32 bytes = stream.Read(komunikat, 0, komunikat.Length);
                responseData = System.Text.Encoding.ASCII.GetString(komunikat, 0, bytes);
                Console.WriteLine("Received: {0}", responseData);         

                // Close everything.
                stream.Close();         
                KlientTCP.Close();         
                } 
                catch (ArgumentNullException e) 
                {
                Console.WriteLine("ArgumentNullException: {0}", e);
                } 
                catch (SocketException e) 
                  {
                    Console.WriteLine("SocketException: {0}", e);
                  }

                    Console.WriteLine("\n Press Enter to continue...");
                    Console.Read();

Upewniłem się już że waga na pewno ma numer 01.

0

ściągnij, odpal, wpisz adres IP, port i numer wagi, kliknij Start i jeśli pojawi Ci się waga z wagi to masz w programie coś źle a jak się nie połączy (zawiśnie) to jest problem z połączeniem do/ustawieniami wagi

0

Programik po podaniu IP, portu 1001 i numeru wagi 1 zwrócił wskazania wagi.
Gdzie teraz szukać błędu skoro programik jest praktycznie kopią na żywca z przykładu podanego na początku ?

0

doklej jeszcze na końcu wysyłanego ciągu znak końca linii czyli char(13) + char(10) (albo "\r\n")

0

Dokleiłem i bez zmian, nadal nic nie jest zwracane.

Całość kodu programu:

 namespace client1
{
    public class TcpClient1
    {
        private static void Main() 
        {
            TcpClient KlientTCP = new TcpClient();
            try
            {
                KlientTCP.Connect(IPAddress.Parse("xxx.xxx.xxx.xxx"), 1001);
                String message=(char)2 + "01" + (char)13 + '{' + (char)135 + '}' + (char)13 + (char)10;
                Byte[] komunikat = System.Text.Encoding.ASCII.GetBytes(message);         

                // Get a client stream for reading and writing.
                // Stream stream = KlientTCP.GetStream();

                NetworkStream stream = KlientTCP.GetStream();

                // Send the message to the connected TcpServer. 
                stream.Write(komunikat, 0, komunikat.Length);

               Console.WriteLine("Sent: {0}", message);         

                // Receive the TcpServer.response.

                // Buffer to store the response bytes.
                komunikat = new Byte[256];

                // String to store the response ASCII representation.
                String responseData = String.Empty;

                // Read the first batch of the TcpServer response bytes.
                Int32 bytes = stream.Read(komunikat, 0, komunikat.Length);
                responseData = System.Text.Encoding.ASCII.GetString(komunikat, 0, bytes);
                Console.WriteLine("Received: {0}", responseData);         

                // Close everything.
                stream.Close();         
                KlientTCP.Close();         
                } 
                catch (ArgumentNullException e) 
                {
                Console.WriteLine("ArgumentNullException: {0}", e);
                } 
                catch (SocketException e) 
                  {
                    Console.WriteLine("SocketException: {0}", e);
                  }

                    Console.WriteLine("\n Press Enter to continue...");
                    Console.Read();
        } 
    }
}

Oczywiście w miejsce xxx.xxx.xxx.xxx w KlientTCP.Connect(IPAddress.Parse("xxx.xxx.xxx.xxx"), 1001); wstawiam odpowiedni adres IP wagi.

Konsola wygląda w sposób następujący:
Zrzut_20130509_102757.jpg

0

zmień to
String message=(char)2 + "01" + (char)13 + '{' + (char)135 + '}' + (char)13 + (char)10;
Byte[] komunikat = System.Text.Encoding.ASCII.GetBytes(message);

na

byte[] komunikat = new byte[] {2, 48, 49, 13, 123, 135, 125, 13, 10};

BTW poczytać co to są breakpointy, i zobacz co dokładnie jest wysyłane/zwracane. Nie mam aktualnie dostępu do modułu AxisSE12 więc nie sprawdzę Ci tego w C# (mój kod jest w Delphi)

0

Dzięki, już jestem coś do przodu - to zwróciło wagę oraz "S+"

Zaraz biorę się za czytanie o breakpointach.

0

Witam

Sprawdziłem przy użyciu breakpointu i jeśli dobrze wszystko odczytałem to jest problem z (char)135 które zwraca się jako 63 a nie 135:

Zrzut_20130513_145035.jpg

0

ale dlaczego używasz UTF8Encoding.UTF jak ten string jest w ASCII? Najlepiej zamiast składać wiadomość jako string składaj od razu tablicę byte

0

UTF8Encoding.UTF nie używam w danych wysyłanych do modułu.
Do modułu wysyłam

 Byte[] komunikat = System.Text.Encoding.ASCII.GetBytes(message);  

Ten string o którym piszesz to fragment kodu którego nie używam w komunikacji, już zrobiłem z niego komentarz.
Teraz sytuacja wygląda w sposób następujący:
Zrzut_20130514_111939.jpg

0

jak już pisałem używaj od razu tablicy byte

0

Witam

Temat tablicy byte myślę że mam już zamknięty - mam przygotowane odpowiednie tablice do komunikacji z wagą.
Możesz mi poradzić w jaki sposób najprościej i najszybciej "zapętlić" program żeby z pojedynczego odpytania wagi odpytywał ją cały czas (coś na zasadzie wyświetlacza który przesłałeś mi w swoim programiku napisanym w Delphi)??

0

tu nie ma wielkiego wyboru - albo timer (jeśli będziesz pytał wagę tak jak masz wyżej to jak ktoś Ci odłączy kabelek od wagi to Ci program zawiśnie dlatego skłaniał bym się ku) albo wątek (Thread, BackgroundWorker) - po prostu trzeba cały czas pytać moduł o dane. W tym przykładzie ode mnie moduł jest odpytywany 10 razy na sekundę. Co do częstości odpytywania to ustawisz doświadczalnie po swojemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1