ROZ14P.DOC

(152 KB) Pobierz
Transmisja (Communications)

Rozdział czternasty : Komunikacja / Przesyłanie danych    Strona 33

Transmisja (Communications)

 

Kod znakowy (Character Code)

 

              Obrabiarka numeryczna CNC 88 może przesyłać i odbierać kod znakowy EIA bądź ASCII. Wysłanie kodu znakowego EIA jest możliwe tylko w przypadku przesyłania danych do czytnika taśmy perforowanej (tape punch). W bieżącym rozdziale opisana jest komunikacja w kodzie ASCII.

 

Połączenie początkowe (Initial Connection)

 

              CNC 88 w trybie wprowadzania komend (na ekranie wyświetlony jest komunikat ENTER NEW COMMAND- WPROWADŹ NOWĄ KOMENDĘ) stale monitoruje port RS-232 oczekując na przychodzące dane. Po wykryciu danych CNC 88 przełącza się w stan terminalu (terminal mode) i operacje wejście/wyjście dokonywane jest przez port RS-232. Również użytkownik może polecić CNC 88 wysłanie danych do portu RS-232 przez wprowadzenie odpowiedniej komendy CD.

 

              Zainicjowanie połączenia z urządzeniem wymaga ustalenia następującym parametrów transmisji :

             

              7 bitów danych                            7 Data bits

              parzystość                                           Even Parity

              1 bit zatrzymania                            1 Stop Bit

zgodność prędkości przesyłu               Compatible Baud Rate

                                                                      (np. 2400 zarówno dla komputera jak i maszyny)

 

Uziemienie maszyny (Machine Grounding)

 

              Uziemienie maszyny może wpływać na zdolność do transmisji . Urządzenie musi być prawidłowo uziemione dla prawidłowości komunikacji. FADAL VMC powinien być uziemiony dowolną metodą wymienioną w artykule 250 Krajowego Prawa Elektrycznego (National Electrical Code). Podstawowa metoda uziemienia polecana przez FADAL Engineering jest opisana rozdziale dotyczącym instalacji Instrukcji Eksploatacji VMC (VMC Maintenence Manual). Nieodpowiednie uziemienie może spowodować szerokie spektrum trudnych do zdiagnozowania problemów w transmisji, pozycjonowaniu, ruchu wrzeciona, itp.

 

Zakończenie (Termination)

 

              Jeżeli zostanie wciśnięty klawisz MANUAL gdy urządzenie jest w stanie przyjmowania komend komunikacja zostanie przerwana. Jest to również możliwe do wykonania z terminalu komputerowego przez wpisania słowa BYE.

 

Handshaking (Przesyłanie informacji z potwierdzeniem)

 

Handshake używa jednej z dwóch możliwych protokołów (software protocols) :

 

1) Protokół XON/XOFF :

              DC1 - READER ON (ASCII 17)                            DC2 - PUNCH ON (ASCII 18)

              DC2 - READER OFF (ASCII 19)                            DC4 - PUNCH OFF (ASCII 20)

             

              Jeżeli podczas odczytywania programu z taśmy perforowanej bądź przesłanego z komputera, CNC 88 otrzyma znak DC 3 lub DC 4 transmisja zatrzymuje się. Wznowienie transmisji następuje po otrzymaniu DC 1 bądź DC 2.

 

2) Protokół XMODEM :

 

              132 bajtowy pakiet danych z 128 bajtami informacji i 4 bajtami kontrolnymi zawierającymi jednobajtową sumę kontrolną (checksum).

 

Jak przesłać plik używając XMODEM dla DNCX

 

              Poniższe wyszczególnienie określa zarys zastosowania protokołu XMODEM. Dane są wysyłane po 128 bajtów w jednostce czasu. Linie programu są powiązane z innymi liniami dopóki nie znajdzie się 128 bajtów do przesłania (zawierające powroty karetki). Cztery bajty kontrolne są dodawane do 128 bajtów kompletując pakiet.

              Pierwsze trzy bajty to :

1) CHR$ (1)

2) numer bloku (Blok Number) (od 0 do 255 zaczynając od 1)

3) numer bloku (Blok Number) 255

Następnie 128 bajtów poprzedzonych sumą kontrolną (checksum).

 

              Procedura wysyłania danych bazuje na ACKs i NAKs. ACK oznacza potwierdzenie lub sukces. NAKs oznacza potwierdzenie lub brak. EOT jest wysyłany jeżeli nastąpi błąd nie odczytania lub w momencie zakończenia pliku. Łatwiej jest to opisać za pomocą przykładowego kodu niż słowami.

 

Przykład Kodu Programu w BASIC :

 

SUB DNC 0

REM SETUP VALUES

REM TRANSMIT BLOCK - [3-128-1] 1ST IS CONTROL BYTE

              SENDBLOCK$ = CHR$(1) + STRING$(131,32)

REM BLOCKNUMBER WILL BE INCREMENTED TO 1 IN FIXBLOCK

              BLOCKNUMBER% = 0

REM TIMES BLOCK WAS BEEN TRANSMITED, 3 FOR ERROR

              XMITEDCOUNTER% = 0

              RECDNAK% = 0

              RECDACK% = 0

              SENDFLAG% = 0

              EOT$ = CHR$(4)

              NAK$ = CHR$(21)

              ACK$ = CHR$(6)

              STARTCHAR% = 4

              CALL CLEARPORT

NEXTBLOCK:

              CALL NEXTDNC(DATA$)

              IF DATA$ = „” THEN GOTO SPACEFILL

BACKTOSLOW:

              DATA$ = DATA$ + CHR$(13)

              DATALENGTH% = LAN(DATA$)

              SELECT CASE STARTCHAR% + DATALENGTH%

              CASE IS > 132

                            CANFIT% = 132 - STARTCHAR%

                            LEFTOVER% = DATALENGHT% - CANFIT%

                            MID$(SENDBLOCK$, STARTCHAR%, CANFIT%) = LEFT$(DATA$, CANFIT%)

                            GOSUB BEGINSENDING

                            MID$(SENDBLOCK$, 4, LEFTOVER%) = RIGHT$( DATA$, LEFTOVER%)

                            STARTCHAR% = 4 + LEFTOVER%

              CASE 132

                            MID$(SENDBLOCK$, STARTCHAR%, DATALENGTH%) = DATA$

                            GOSUB BEGINSENDING

                            STARTCHAR% = 4

              CASE ELSE

                            MID$(SENDBLOCK$, STARTCHAR%, DATALENGTH%) = DATA$

                            STARTCHAR% = STARTCHAR% + DATALENGTH%

              END SELECT

              GOTO NEXTBLOCK

SPACEFILL:

REM SPACE FILL REST OF BLOCK, TERMINATING CR

              MID$(SENDBLOCK$, STARTCHAR%, 131 - STARTCHAR% + 1) = STRING$(131 -

              STARTCHAR%, CHR$(32)) + CHR$(13)

              GOSUB BEGINSENDING

FINISHUP:

              CALL DWELLSENDING

              CALL CLEAERPORT

QUITING:

              CLOSE

              EXIT SUB

BEGINSENDING:

              CALL FIXBLOCK

BEGINSENDINGSKIP:

              CALL CHECKFORABORT

REM WAS LAST BLOCK ACKED OR NAKED ?

              IF RECDACK% OR RECKNAK% THEN RECDACK% = 0: GOTO ZXREADYSEND

ZXREADYSEND:

              CALL WAITTILGOT(STOP$)

              SELECT CASE STOP$

              CASE IS = EOT$

                            GOTO QUITING

              CASE IS = NAK$

                            RECDACK% = 0

                            RECDNAK% = 1

                            IF SENDFLAG% THEN

REM BLOCK WAS SENT BUT NOT RECEIVED, RE-TRANSMIT UP TO 3 TIMES

                            SELECT CASE XMITEDCOUNTER%

                                          CASE IS = 0,1

                                          XMITEDCOUNTER% = XMITEDCOUNTER% + 1

                                          CASE ELSE

                                          CALL MHSENDDATA(PORT% ,EOT$, ECODE%)

                                          IF ECODE% THEN ERROR ERRTRANSMIT%

                                          GOTO FINISHUP

                                          END SELECT

                            END IF

                            GOTO ZXREADYTOSEND

                            CASE IS = ACK$

                            IF SENDFLAD% THEN

REM BLOCK WAS SENT AND RECEIVED

                                          SENDFLAG% = 0

                                          XMITEDCOUNTER% = 0

                                          RECDNAK% = 0

                                          REDDACK% = 1

                                          RETURN

                            END IF

                            END SELECT

              ZXREADYTOSEND:

                            CALL DWELLSENDING

                            CALL MHSENDATA(PORT%, SENDBLOCK$, ECODE%)

                            IF ECODE% THEN ERROR ERRTRENSMIT%

                            SENDFLAG% = 1

REM WAIT FOR ACK

                            GOTO ZXREADYTORECD

END SUB

SUB FIXBLOCK

REM SET BYTES 2 AND 3 FOR HEADER, 132 HOLDS CHECKSUM

              BLOCKNUMBER% = BLOCKNUMBER% + 1

              IF BLOCKNUMBER% > 255 THEN BLOCKNUMBER% = 0

              MID$( SENDBLOCK$, 2) = CHR$( BLOCKNUMBER%)

              MID$( SENDBLOCK$, 3) = CHR$(255 - BLOCKNUMBER%)

              CSUM% = 0

              FOR I = 1 TO LEN(SENDBLOCK$) - 1

                            CSUM% = CSUM% + ASC(MID$( SENDBLOCK$, I))

                            NEXT I

              MID$( SENDBLOCK$, 132) = CHR$(CSUM% MOD 256)

END SUB

NEXTDNC:

REM RETURNS NEXT ASCII LINE TO SEND

              DATA$ = „” IF END OF FILE

DWELLSENDING:

REM WAIT UNTIL TRANSMISSION BUFFER IS EMPTY

 

 

 

 

 

 

 

 

Polecenia (Commands)

 

...

Zgłoś jeśli naruszono regulamin