Witam, poniżej jest screen tabelki danych wyjsciowych przykładowego cyklu pomiarowego.
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