840D Pomiar czasu i zapis do pliku

Dyskusje na temat systemu Sinumerik

Autor tematu
ar1r
Czytelnik forum poziom 2 (min. 20)
Czytelnik forum poziom 2 (min. 20)
Posty w temacie: 1
Posty: 23
Rejestracja: 31 gru 2012, 16:40
Lokalizacja: okolice Cz-wy

840D Pomiar czasu i zapis do pliku

#1

Post napisał: ar1r » 03 lip 2016, 16:52

Witam, problem jest następujący: Chcę mieć pomiary czasu dla każdego programu zapisywane do jednego pliku. Najlepiej z podaniem nazwy aktualnego programu, datę, godzinę i czas obróbki. Próbowałem to zrobić tak:
DEF INT ERROR
DEF STRING [32] PLIK

PLIK="CZASY_MPF"

;lub
;PLIK="/_N_WKS_DIR/_N_CZASY_WPD/_N_CZASY_MPF"

$MC_PROCESSTIMER_MODE = 'H2'

;<program obróbki>


R100=$AC_CYCLE_TIME/60


WRITE (ERROR,PLIK<<"Nazwa programu" <<NAME<< "CZAS CYKLU="<<R100<<"min")

M30
Czy może lepiej użyć $AC_TIMER[1]=-1
$AC_TIMER[1]=0
I wpisać do zmiennej?
Tak czy inaczej dalej mam problem z poleceniem WRITE (errory). Czy ktoś może wskazać błędy i jak to zrobić poprawnie. W załączniku reszta moich wypocin :mrgreen:
Załączniki
czasy.txt
(901 Bajtów) Pobrany 186 razy



Tagi:


seites
Stały bywalec (min. 70)
Stały bywalec (min. 70)
Posty w temacie: 1
Posty: 70
Rejestracja: 06 lut 2011, 15:46
Lokalizacja: Nowa Huta

#2

Post napisał: seites » 05 wrz 2016, 16:43

Kod: Zaznacz cały

CYCLE TIMER & WRITE LOG for 840D **Sharing**

    Working in a high production environment we need to keep close control of cycle time. Created this cycle timer that records five cycles and then gives you the average. Which is good when you are there. But we are a 24/7 operation so I wanted a way to keep track and log cycle times every 300 cycles. So the first file is the cycle timer. Second final is used to log a cycle every 300 and copy it to a file with the date and time. 3rd is the output file.

    If you'd like copies of the files just send me an email to [email protected]

    or if you have questions and comments put them here so everybody can take advantage of it. Would really like to hear if anyone has a better way or different way of doing this.

    ;OPERATION *** CYCLE TIME COUNTER ***
    ;Shared By: [email protected]


    R755=R754
    STOPRE
    R754=R753
    STOPRE
    R753=R752
    STOPRE
    R752=R751
    STOPRE
    R751=R750
    STOPRE
    R760=((R751+R752+R753+R754+R755)/5)

    $AC_TIMER[1]=-1
    STOPRE


    R750=$AC_TIMER[1]
    STOPRE


    $AC_TIMER[1]=0
    STOPRE

    NN9999:
    M17
    ____

    ;RECORD_CYCLETIME
    ;Shared By: [email protected]

    DEF INT ERROR
    DEF STRING [16] NAME="RECORD_CYCLETIME"
    DEF STRING [4] ENDING="_SPF"
    STOPRE

    R401=R401+1 ;AFTER 300 CYCLES IT RECORDS CYCLE TIME IN FILE "RECORD_CYCLETIME.SPF"
    STOPRE

    IF R401==300 GOTOF RECORD
    STOPRE

    GOTOF END
    STOPRE

    RECORD:
    R400=R400+1 ;RECORDED CYCLES
    WRITE (ERROR,<<NAME<<ENDING, "#"<<R400<<"DATE = "<<$A_MONTH<<"/"<<$A_DAY<<"/20"<<$A_YEAR<<" TIME = "<<$A_HOUR<<":"<<$A_MINUTE<< "CYCLE TIME = " <<R750<<" SEC")

    IF ERROR
    MSG ("ERROR IN WRITE COMMAND" <<ERROR
    M0
    ENDIF
    R401=0 ;RESET R401 BACK TO ZERO

    END:
    STOPRE

    NN9999:
    M17
    ____

    ; output to the log
    #1 DATE: 11/3/2013 TIME: 14:21 CYCLE TIME: 47.04 SEC
    #2 DATE: 11/3/2013 TIME: 14:32 CYCLE TIME: 235.304 SEC
    #3 DATE: 11/3/2013 TIME: 14:43 CYCLE TIME: 46.968 SEC
    #4 DATE: 11/3/2013 TIME: 14:51 CYCLE TIME: 46.876 SEC
    #5 DATE: 11/3/2013 TIME: 15:4 CYCLE TIME: 46.82 SEC 


roben23
Czytelnik forum poziom 1 (min. 10)
Czytelnik forum poziom 1 (min. 10)
Posty w temacie: 1
Posty: 19
Rejestracja: 10 wrz 2011, 13:30
Lokalizacja: pl

Re: 840D Pomiar czasu i zapis do pliku

#3

Post napisał: roben23 » 30 gru 2017, 19:51

Witam,

Powyższe rozwiązanie jest interesujące. mam pytanie, czy macie Panowie pomysł jak sparametryzować tworzenie plików z zapisem np. wyników pomiarów za pomocą sondy czy też czas obróbki.

Generalnie chciałbym przed uruchomianiem detalu wpisać pod parametr np. R100 numer kolejnej sztuki np. 25
po jej wykonaniu wpisać znów w R100 kolejny numer - 26 i w pamięci mieć dwa pliki z danymi (np. XYZ_25_SPF, XYZ_26_SPF)


poniżej, jak bym to widział
DEF INT _counter=0
WRITE(_counter,"/_N_SPF_DIR/_N_XYZ_<<R100_SPF")
lecz to raczej nie bardzo zadziała
jakieś pomysły??

Awatar użytkownika

djronin
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 1
Posty: 262
Rejestracja: 22 kwie 2011, 01:19
Lokalizacja: Jarocin

Re: 840D Pomiar czasu i zapis do pliku

#4

Post napisał: djronin » 05 sty 2018, 20:29

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
...Programowanie ma to do siebie, że urzeczywistnienie nawet najbardziej
oczywistego pomysłu jest znakomitą definicją słowa "frustracja"...

Awatar użytkownika

donnajane
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 1
Posty: 1
Rejestracja: 21 wrz 2022, 03:05

Re: 840D Pomiar czasu i zapis do pliku

#5

Post napisał: donnajane » 21 wrz 2022, 03:17

Thanks for your post, it's very helpful I hope in the future drift hunters you will provide more information. phrazle I will visit and support the article for you

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Siemens Sinumerik CNC”