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$
CASE ELSE
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)
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$
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
CALL MHSENDDATA(PORT% ,EOT$, ECODE%)
IF ECODE% THEN ERROR ERRTRANSMIT%
GOTO FINISHUP
END IF
GOTO ZXREADYTOSEND
CASE IS = ACK$
IF SENDFLAD% THEN
REM BLOCK WAS SENT AND RECEIVED
REDDACK% = 1
RETURN
ZXREADYTOSEND:
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)
NEXTDNC:
REM RETURNS NEXT ASCII LINE TO SEND
DATA$ = „” IF END OF FILE
DWELLSENDING:
REM WAIT UNTIL TRANSMISSION BUFFER IS EMPTY
Polecenia (Commands)
...
witold23