Celem tego dokumentu jest dostarczenie prostego rozwiązania do komunikacji PC i PLC za pośrednictwem SLMP.
W przypadku Direct Coupled Setting wystarczy wpisać adres IP w polu IP Address of Adapter i potwierdzić ustawienia (jeśli test komunikacji był pozytywny).
W przeciwnym razie wybierz Other Connection Method (Open the specify Connection Destination window) → CPU Module Direct Couple Setting → wybierz Ethernet → wpisz adres IP w polu IP Address → Zatwierdź Tak
Kliknij dwukrotnie na Module Configuration z drzewa projektu → przeciągnij i umieść w polu roboczym komponenty sprzętowe, które reprezentują stan rzeczywisty.
Możesz także wybrać Online → Read Module Configuration from PLC
Aby rozpocząć korzystanie z protokołu SLMP, ustaw następujące parametry:
Ustaw External Device Configuration, klikając dwukrotnie na <Detailed Settings> obok tego parametru.
Dodaj SLMP Connection Module z Ethernet Device, przeciągając go i upuszczając, → ustaw protokół TCP → ustaw nr portu na 2000 → Close with Reflecting the Setting.
Po wykonaniu tej operacji wybierz opcję Check i Apply.
Aby zapisać projekt do PLC wybierz Online → kliknij Write to PLC... → wybierz Parameter + Program(F) → Execute
Zresetuj PLC i przejdź do trybu RUN.
Dodaj dwukrotnie parametr D200 do Watch window, klikając wiersz i wpisując "D200". W pierwszym przypadku wybierz format wyświetlania Decimal i Hexadecimal dla drugiego. Aby monitorować i zmieniać bieżącą wartość, kliknij Start Monitoring.
Otwórz aplikację narzędziową Hercules SETUP → wybierz Test mode → ustaw Module IP: 192.168.3.250 (adres IP sterownika PLC ustawiony w GX Works3) → ustaw Port: 2000 (jak w przypadku konfiguracji Ethernet w GX Works3)
Jeśli nie masz jeszcze zainstalowanej aplikacji, tutaj znajduje się link do strony internetowej z oprogramowaniem:
https://www.hw-group.com/software/hercules-setup-utility
Upewnij się, że adres IP i nr portu są takie same jak te ustawione w GX Works3.
Po tej operacji powinieneś być w stanie rozpocząć komunikację. Aby to zrobić, naciśnij przycisk Connect.
"FF 50 00 00 FF 03 00 0C 00 10 00 01 04 00 00 C8 00 00 A8 01 00"
Co jest synonimem:
Prosić |
50 |
00 |
00 |
FF |
FF |
03 |
00 |
0C |
00 |
|
Podnagłówek (bez numeru seryjnego) |
Prośba o nr docelowej sieci |
Prośba o numer stacji docelowej |
Prośba o numer docelowego modułu I/O |
Prośba o numer docelowej stacji multidrop |
Długość żądanych danych |
|||
Odpowiedź |
D0 |
00 |
00 |
FF |
FF |
03 |
00 |
04 |
00 |
10 |
00 |
01 |
04 |
00 |
00 |
C8 |
00 |
00 |
O8 |
01 |
00 |
Zegar monitorujący |
Comand (0401:Read |
Podpolecenia |
Nr urządzenia głównego (0xC8 = > 200DEC) |
Kod urządzenia (rejestr D) |
Liczba punktów urządzenia |
||||||
00 |
00 |
BE |
DC |
|
|||||||
Kod błędu |
Dane |
Wybierz opcję Hex i kliknij Send.
W przedstawionej sytuacji wysłane polecenie to zapytanie PLC o rejestr D200.
Wszystkie wysłane polecenia są wyświetlane w sekcji Sent data.
Dane ze sterownika PLC są odbierane i wyświetlane w formie szesnastkowej w sekcji R.
Wpisz adres IP sterownika PLC do byAdres[] jak pokazano poniżej → umieścić ipAdress i 2000 (numer portu - wartość jak w ustawieniach GX Works3) jako argumenty funkcji
ConnectTCP
Main program
W sekcji kodu do odczytu rejestru D200 umieść żądanie:
"0x50, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x01, 0x04, 0x00, 0x00, 0xC8, 0x00, 0x00, 0xA8, 0x01, 0x00"
Co jest synonimem:
Prosić |
50 |
00 |
00 |
FF |
FF |
03 |
00 |
0C |
00 |
|
Nagłówek (bez numeru seryjnego) |
Prośba o nr docelowej sieci |
Prośba o numer stacji docelowej |
Prośba o numer docelowego modułu I/O |
Prośba o numer docelowej stacji multidrop |
Długość żądanych danych |
|||
Odpowiedź |
D0 |
00 |
00 |
FF |
FF |
03 |
00 |
04 |
00 |
10 |
00 |
01 |
04 |
00 |
00 |
C8 |
00 |
00 |
O8 |
01 |
00 |
Zegar monitorujący |
Comand (0401:Read) |
Podpolecenia |
Nr urządzenia głównego (0xC8 = > 200DEC) |
Kod urządzenia (rejestr D) |
Liczba punktów urządzenia |
||||||
00 |
00 |
BE |
DC |
|
|||||||
Kod błędu |
Dane |
Każdy bajt w utworzonej tabeli jest szesnastkowy i oddzielony przecinkiem.
W przedstawionej sytuacji wysłano zapytanie do PLC o rejestr D200.
Uruchom aplikację.
Dane ze sterownika PLC są odbierane i wyświetlane w konsoli. Najpierw w formie szesnastkowej, młodszy i starszy bajt. Po drugie, bajty te są konwertowane i wyświetlane w postaci dziesiętnej.
Przed wyświetleniem wartości rejestru wyświetlane są informacje o stanie operacji.
Obserwując ten rejestr w Watch window w GX Works3 możesz potwierdzić, że dane zostały wysłane poprawnie.
Ostrzeżenie! Prezentowany kod jest tylko przykładowym programem, więc nie powinien być uruchamiany bezpośrednio na prawdziwym obiekcie! Dostosuj utworzoną aplikację do swoich potrzeb. Liczba wysyłanych i odbieranych danych może się różnić. W przedstawionym przykładzie liczba elementów ramki jest statyczna. |
Dodanie tej funkcji ułatwi nawiązanie połączenia. Użytkownik otrzymuje informacje, czy urządzenie odpowiada.
#region Part of code used to verify whether the communication function operates normally or not static bool SelfTest() { bool loopTestAns = false; byte[] loopMessage = new byte[5] {0x41, 0x42, 0x43,0x44, 0x45}; // 5 elements for test - "ABCDE" //Request data length int needByteMessage = 2 + 4 + 2 + loopMessage.Length; byte lowByte = (byte)(needByteMessage & 0xff); byte highByte = (byte)(needByteMessage >> 8 & 0xff);
byte[] payload = new byte[] { 0x50, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, lowByte, highByte, 0x10, 0x00, 0x19, 0x06,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //number of loopack data lowByte = (byte)(loopMessage.Length & 0xff); highByte = (byte)(loopMessage.Length >> 8 & 0xff); payload[15] = lowByte; payload[16] = highByte; // loopack data for (int i = 0; i < loopMessage.Length; i++) { payload[17 + i] = loopMessage[i]; } NetworkStream stream = tcpC.GetStream(); stream.Write(payload, 0, payload.Length); byte[] data = new Byte[20]; stream.ReadTimeout = 1000; try { Int32 bytes = stream.Read(data, 0, data.Length); if (data[9] == 0 && data[10] == 0 && data[11] == lowByte && data[12] == highByte) { loopTestAns = true; for (int i = 0; i < loopMessage.Length; i++) { if (loopMessage[i] != data[13 + i]) { loopTestAns = false; } } } } catch { loopTestAns = false; } return loopTestAns; } #endregion
|