Znaleziono 1 wynik

autor: djronin
05 sty 2018, 20:29
Forum: Siemens Sinumerik CNC
Temat: 840D Pomiar czasu i zapis do pliku
Odpowiedzi: 6
Odsłony: 4893

Re: 840D Pomiar czasu i zapis do pliku

Witam, poniżej jest screen tabelki danych wyjsciowych przykładowego cyklu pomiarowego.

Obrazek

całość do pobrania ze strony siemensa BNM_1106_en. Radzę Ci poszukać odpowiedniego manuala (wersji) pasującej do wersji cyklów zainstalowanych na maszynie aby uniknąć rozbieżności chociaż z tym nie jest tak do końca bo system/cykl/program ewoluując nie ma tendencji do pisania się od nowa tylko jest rozwijany czyli jeśli będziesz miał nowszego manuala to parametrów może być więcej ale kluczowe zazwyczaj zostają nie zmienione, no chyba że odchodzi się od jakiś nazw zmiennych i zmienia się tylko jej nazwa. Ale to skutecznie redukuje szanse na odpalenie cyklu z 810 na 840 ze 100% do 50% chociaż w rzeczywistości nie jest tak źle. :). W tabeli masz przykład zmiennych dla pomiaru rowka tak więc kolejno _OVR[0]...[2] zadana szerokość, punkt początkowy pomiaru w osi x oraz w osi y, _OVR[4]...[6] wynik po zmierzeniu, oraz zmierzona pozycja środkowa rowka w osi X, Y. Jako że rowek mierzy się tylko w jednej osi X/Y wartość dla środka rowka zostanie skopiowana dla jednej osi prosto z wejścia czyli _OVR[1]..[2]. Dla pomiaru czopa lub kieszeni wymiar 1 osi będzie w zapisany w _OVR[4] a osi Y _OVR[5] natomiast pozycje w poszczególnych osiach przesuną się do przodu.

Jako że enkoder przeliczająć pozycję nie zaokrangla nam wyniku do np 123.456 tylko wpisuje do zmiennej wartość typu 123.7256431524 należy użyć nieco magii znanej wszystkim dzieciom w szkołach podstawowych :) czyli nasza liczba 123.7256431524 ma dużo miejsc po przecinku co biorąc pod uwagę odległość tych liczb od zera praktycznie nie robi różnicy no ale jak chcemy drukować do pliku dane to wystarczą nam 3 miejsca po przecinku. zatem bierzemy liczbę 123.7256431524 > przesuwamy jej przecinek o 3 miejsca w prawo 123725.6431524 następnie odcinamy wszystko co znajduje się za kropką 123725. i przesuwamy w lewo o 3. 123.725 wygląda to mniej więcej tak

R10=_OVR[4] ;zawartość _OVR[4] kopiowana do R10
R10=R10*1000 ;3miejsca w prawo
R10=TRUNC(R10) ;TRUNC () kasuje wszystko co znajduje się za kropką.
R10=R10/1000 ;przesuwamy przecinek w lewo.

Jako że pamięci NC na maszynie zawsze jest za mało nie będziemy jej marnować na taki pamięciożerny zapis i od początku staramy się pisać makra w taki sposób aby zbędnie nie zajmowały pamięci, czyli te czynności można z powodzeniem zapisać w takiej formie:
R10=TRUNC(_OVR[4]*1000)/1000

Szukasz inspiracji ? Reverse Engineering czyli inżynieria wsteczna, (nie no spokojnie nie będziemy debugować systemu w poszukiwaniu wywołań w kodzie assemblera zostawmy to cracker'om) na początek wystarczy przeglądanie makr już działających, analizuj linia po linii komenda po komendzie jeśli nie wiesz co robi dana funkcja sięgasz do manuala PGAsl_0313_pl_pl-PL. i jak nic Ci to nadal nie mówi to nie możesz się irytować tym na wstępie... same komendy i funkcje to małe polecenia robiące zazwyczaj tylko ułamek z całości na począdku może być ciężko osiągnąć cokolwiek jeśli nie rozłożymy sb tego na małe kroczki tak jak kopiowanie danych z _OVR[4] powyżej.



kilka programików (moich :) do analizy niektóre były pisane w formie ćwiczeń dla zrozumienia składni i działania poszczególnych komend. pewnie teraz napisał bym je z lekka inaczej ale wtedy też się uczyłem:)

tutaj masz link do makro które otwiera plik który trzeba pierw stworzyć (w katalogu podprogramów SPF - sub program file ) plik o nazwie TEST1.SPF (gcode) i zapisujemy w nim cyfrę np: 1
po otwarciu pliku program czyta linię sprawdza czy jest to liczba , jesli tak to zwiększa jej wartość i zapisuje. i tak za każdym razem gdy uruchomimy macro.

siemens-macro-reading-writing-file

Tutaj makro które sprawdza nam ile czasu minie do końca serii, jako że nie bazuje na czasie z systemu który pokazuje nam czas obróbki tylko jest wywoływany normalnie jako podprogram teoretycznie zmierza nam odstępy czasu od startu programu do startu czyli obróbkę wraz z wymianą formatki. Zapisuje kilka kolejnych wartości i oblicza średni czas dla sztuki , następnie sprawdza licznik sztuk i mnoży ilość przez średni czas co daje nam wynik w minutach / godzinach do zakończenia serii. Funkcja liczenia średniej z tego co pamiętam wymagała poprawy wgl nie uwzględnia czasu na przerwę, obrócenie lub wymianę płytek itp nie jest doskonały ale działa. szczególnie widać to pod koniec serii.
Ja podczepiłem go pod program E_HEAD z dwóch powodów, aby nie musieć tego robić ręcznie za każdym razem i dlatego że w pliku tym jest komenda ktora uruchamia się w tle DISPLOF, on i jego potomki czyli programy które sam wywoła. Jest to istotne bo sam program wykonuje się w ułamku sekundy ale jak sinumerik buduje dla niego okno to on musi za nim poczekać w efekcie wyświetlanie okienka spowalnia proces

Kod: Zaznacz cały

%_TTF_SPF
;$PATH=/_N_CUS_DIR
PROC TTF SBLOF DISPLOF

;NAME: Till The Finish

;PROGRAM DO ODLICZANIA POZOSTAŁEGO CZASU OBRÓBKI WSZYSTKICH DETALI
;ZLICZA ODSTĘP CZASU CO JAKI JEST URUCHAMIANY (PROGRAM + WYMIANA DETALU)
;NA TEJ PODSTAWIE SZACUJE JAK DŁUGO POTRWA JESZCZE OBRÓBKA.
;PROGRAM NALEŻY PODCZEPIĆ POD NAGŁÓWEK E_HEAD
;TO DO: DODANIE LOGIKI KTÓRA NIE BRAŁA BY POD UWAGĘ CZASU WYMIANY PŁYTEK,
;		PRZERWY CZY JEDNOSTKOWYCH ODSTĘPÓW DŁUŻSZCH LUB KRÓTSZYCH NIŻ
;		CZAS PROGRAMU + (CZAS WYMIANY +/- n%)...
;
;$AC_REQUIRED_PARTS  ->  ZADANA LICZBA PRZEDMIOTÓW
;$AC_TOTAL_PARTS  ->  LICZBA DNIOWA PRZEDMIOTÓW
;$AC_ACTUAL_PARTS  ->  LICZBA CAŁKOWITA OBROBIONYCH PRZEDMIOTÓW
;
;
	
DEF INT T_PART, REM_PARTS, TIM_1, TIM_2, TIM_3, T_MODE
DEF BOOL STR_TIME
;---------------------------------------------
;T_MODE = 0 - SREDNIA OSTATNICH 6 CZASÓW; 1 - ŚREDNIA NAJDŁUŻSZYCH CZASÓW; 2 - ŚREDNIA NAJKRÓTSZYCH CZASÓW

T_MODE=2
	
		;/UNIX time :);/
		R71=$A_SECOND + ($A_MINUTE * 60) + ($A_HOUR * 3600) ;T_NEW
		STOPRE
IF R70==0
		R70=$A_SECOND + ($A_MINUTE * 60) + ($A_HOUR * 3600) ;T_OLD
		STOPRE
		GOTO CALC_DATA
ENDIF
		;WARUNEK SPRAWDZAJĄCY CZY POMIAR CZASU NIE BYŁ ZROBIONY PRZED I PO 24

		IF R70 < R71
		T_PART = R71 - R70
	ELSE
		IF R70 > R71
			T_PART = (86400-R70) + R71
		ELSE
		GOTOF END_T_PART
		ENDIF
	ENDIF
	
	R70=$A_SECOND + ($A_MINUTE * 60) + ($A_HOUR * 3600) ;T_OLD

	;++++++++++++++++++++++++++++
	;SPRAWDZANIE USTAWIENIA "R4" - RZECZYWISTA LICZBA DETALI
	;OBROBIONA PODCZAS 1 PRZEJŚCIA PROGRAMU
	;WYMUSZENIE LICZBY <> 0 (W DALSZEJ CZĘŚCI BĘDZIEMY DZIELIĆ PRZEZ R4)
	IF	R4==0
		R4=1
	ELSE
		IF R4<0
			R4=TRUNC(ABS(R4))
		ENDIF
	ENDIF
	;++++++++++++++++++++++++++++
	
	REM_PARTS=$AC_REQUIRED_PARTS-$AC_ACTUAL_PARTS ;OBLICZENIE ILE ZOSTAŁO NAM DETALI DO OBRÓBKI
	
	
	
	IF	($AC_TOTAL_PARTS==0) OR ($AC_REQUIRED_PARTS==0)
		R74=0 R75=0 R76=0 R77=0 R78=0 R79=0 R80=0
	ENDIF
	
	R74=T_PART
	R75=R74
	R76=R75
	R77=R76
	R78=R76
	R79=R78
		
	;,TWORZENIE ŚREDNIEJ POMIARU R75, R76, R77, R78
	
	IF	R78==0	GOTOF	REAL_TIMER
	
	IF (T_MODE==2)
		;---
		IF	(R74>R75)
			TIM_1=R75
		ELSE
			TIM_1=R74
		ENDIF
		;---
		IF (R76>R77)
			TIM_2=R77
		ELSE
			TIM_2=R76
		ENDIF
		;---
		IF (R78>R79)
			TIM_3=R79
		ELSE
			TIM_3=R78
		ENDIF
		;---
		T_PART=(TIM_1+TIM_2+TIM_3)/3
	ELSE
			IF (T_MODE==1)
				;---
				IF	(R74<R75)
					TIM_1=R75
				ELSE
					TIM_1=R74
				ENDIF
				;---
				IF (R76<R77)
					TIM_2=R77
				ELSE
					TIM_2=R76
				ENDIF
				;---
				IF (R78<R79)
					TIM_3=R79
				ELSE
					TIM_3=R78
				ENDIF
				;---
				T_PART=(TIM_1+TIM_2+TIM_3)/3
			ELSE
				;T_MODE==0
				T_PART=(R74+R75+R76+R77+R78+R79)/6
			ENDIF
	ENDIF
	
REAL_TIMER:
	T_PART=TRUNC((REM_PARTS DIV R4)*T_PART) ;CZAS POTRZEBNY DO OBROBIENIA WSZYSTKICH DETALI 
	
	T_DAY=T_PART DIV 86400
	T_PART=T_PART-(T_DAY*86400)
	STOPRE
	T_HOUR=T_PART DIV 3600
	STOPRE
	T_MINUTE=(T_PART-(T_HOUR*3600) DIV 60
	;-++-------------
	EX_TIME=<<"1"
	IF T_DAY==0
		EX_TIME=<<"00"
	ELSE
		IF (T_DAY DIV 10) <> 0
			EX_TIME=<<T_DAY
		ELSE
			EX_TIME=<<"0"<<T_DAY
		ENDIF
	ENDIF
	IF T_HOUR==0
		EX_TIME=<<"00"
	ELSE
		IF (T_HOUR DIV 10) <> 0
			EX_TIME=<<T_HOUR
		ELSE
			EX_TIME=<<"0"<<T_HOUR
		ENDIF
	ENDIF
	IF T_MINUTE==0
		EX_TIME=<<"00"
	ELSE
		IF (T_MINUTE DIV 10) <> 0
			EX_TIME=<<T_MINUTE
		ELSE
			EX_TIME=<<"0"<<T_MINUTE
		ENDIF
	ENDIF
	EX_TIME=<<"1"
	;-++-------------
	
	STR_TIME=ISNUMBER(EX_TIME)
	
	IF STR_TIME == TRUE
		R80=NUMBER(EX_TIME)
	ELSE
		R80=18888881
		IF R79<>0
			R74=0 R75=0 R76=0 R77=0 R78=0 R79=0
		ENDIF
	ENDIF

	IF	REM_PARTS==0
		R70=0 R71=0 R74=0 R75=0 R76=0 R77=0 R78=0 R79=0
	ENDIF
	
END_T_PART:
M17
CALC_DATA:
R80=18888881
GOTOB END_T_PART
i jeszcze jeden , ten program wyświetla pływający napis, maszyna cnc nie jest może najlepszym placem doświadczalnym do pracy na stringach ale skoro można to czemu nie.

Kod: Zaznacz cały

DEF STRING[128] MESSAGE1
DEF STRING[64] SCROLL_TEXT
DEF INT A_, B_, C_, D_=0
STOPRE
N25 G4F10
STOPRE
R10=$AC_OLD_PROG_NET_TIME
STOPRE
MESSAGE1="------------"
SCROLL_TEXT="CNC.INFO.PL"
A_=STRLEN(MESSAGE1)
B_=STRLEN(SCROLL_TEXT)
MESSAGE1=<<MESSAGE1<<SCROLL_TEXT

C_=A_+B_

;++++++++++++++++
WHILE D_<C_
MSG(SUBSTR(MESSAGE1,D_,A_)<<" POZOSTALA WIADOMOC")
;G4F10
MESSAGE1=<<MESSAGE1<<"-"
D_=D_+1
ENDWHILE
;++++++++++++++++

STOPRE
M0
M30

Wróć do „840D Pomiar czasu i zapis do pliku”