Siemens
Siemens

Digital Industries, Motion Control, Machine Tool Systems

Werkzeugaufruf unter DIN/ISO an CTX beta 1250 TC, Shopturn 840D SL , DIN / ISO

Beitrag 14.12.2015, 06:28 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
Hallo zusammen!

Ich arbeite an einer oben erwähnten Maschine. Ich habe ein R-Parameter Programm in DIN/ISO geschrieben, welches schon sehr gut läuft. Es wird eine Bohr/Frästabelle abgearbeitet, die zuvor einfach per Copy/Paste mit einem Editor in das DIN/ISO Programm übertragen wurde.

Es wird ein Variablenfeld erzeugt nach folgendem Schema:

Steuerkante[1,0]=SET(15,-120,2) <----- erste Zahl=bearbeitungs Winkel, zweite Zahl=Z-Mass, dritte Zahl=bohrungsdurchmesser
Steuerkante[2,0]=SET(90,-100,3) <----- Winkel 90°, Z-Mass -100, Bohrungsdurchmesser 3
So übergebe ich die Werte in das Variablenfeld
.
.
.

So ist es aufgebaut. Habe es so hinbekommen, dass für 6-7 zum Einsatz kommende Werkzeuge jeweils Label aufgerufen werden und die jeweilige Bearbeitung erfolgt. Funktioniert auch alles soweit mit den diversen "IF ... THEN ... ELSE" abfragen.

Allerdings wird das folgende benötigte Werkzeug nicht in der Werkzeugkette VORPOSITIONIERT .. sprich: die Maschine hat ja eine B-Achse und dort dauert der WKZ Wechsel relativ lange. Ganz besonders, wenn das Werkzeug nicht vorausgewählt wurde.

Zu diesem Zweck wollte ich eine IF -- THEN Abfrage einbauen, die immer die nächste Bohrung aus der Tabelle ausliest, bis halt der Bohrungsdurchmesser größer als der aktuelle bearbeitete ist. Entsprechend soll dann das nächste benötigte Werkzeug mit dem T-Befehl vorgewählt werden.

Und da hapert es. Um die Struktur bzw die Programmierung smart zu gestalten, möchte ich nicht in jedem Label die Abfrage separat durchführen (das sind ja relativ viele Programmzeilen), sondern jeweils zu einem unterprogramm in Form eines Labels springen.

Da habe ich aber Probleme mit dem Rücksprung aus eben jenem WKZ-Wechsel-Label.

Als alter Basic Programmierhase gab es doch damals den Befehl "GOSUB [zeilennummer]" ... damit wurde dann an eine beliebige Stelle gesprungen und mit dem Befehl "RETURN" erfolgte der Rücksprung zu genau der Stelle, von der aus man gesprungen war.

Das bekomme ich unter DIN/ISO aber nicht hin. Was ich nur hinbekomme:

zb.
GOTOF WKZANWAHL
hier
erfolgen
diverse
bearbeitungen ....

WKZANWAHL:
IF SK[COUNT,2]=3 <--- damit lese ich auch der entsprechenden Spalte/Reihe des Variablenfeldes den Bohrungsdurchmesser aus.
T="Boh_2.0_HM" <---- hiermit würde das gewünschte Werkzeug vorangewählt/positioniert auf der Kette.
GOTOB <---- ja, wohin spring ich hier? Die Rücksprünge sollen ja unterschiedlich sein .. deswegen wäre hier der Befehl RETURN perfekt.
ENDIF
IF SK[COUNT,2]=4
T="Boh_4.0_HM"
GOTOB usw usf

Warum brauche ich den variablen Rücksprung? Weil jedes Werkzeug ein eigenes Label hat später, weil ja auch die Schnittdaten unterschiedlich sind.

BOH01MM:
hier
erfolgt die
Bearbeitung


BOH02MM:
hier erfolgt
die
Bearbeitung

Ein weiteres Problem:

wie kann ich diese "T=[klarnamen der Werkzeugtabelle]" in eine reine NUMMER umwandeln? Also ich würde gerne im Programmkopf diese Werkzeug-Klarnamen entweder einem String zuweisen oder einer Nummer. Geht das? Also zB:

R200="Boh_2.0MM" <---- geht das so? Könnte ich dann später statt "T="Boh_2.0_HM" einfach nur T=R200 eingeben? Wie kann ich das am smartesten lösen?

Versteht mich richtig: ich bekomme es zwar vermutlich auch so alles hin mit umständlicher Programmierung, aber mein Ziel ist es, das Programm so klein und übersichtlich wie eben möglich zu gestalten.

Es gibt ja zb auch den Befehl:

$MC_TOOL_CHANGE_MODE = 0 oder 1
Wie genau nennt man diese Art von Befehl? Ist das ein Maschinenspezifischer Parameter? Wo gibt es eine Übersicht über diese Befehle? Sind schwer zu finden aus einer 800 Seiten Anleitung. Diese Befehle sind bestimmt auch rein Maschinenbezogen und nur für die eine Maschine gültig.

Viele Fragen, die schon ans Eingemachte gehen. Bin gespannt, wo hier die Programmierspezialisten unter euch sind.

So einige Kniffe habe ich auch hinbekommen. Zb die Reitstockabfrage (ob der Reitstock bereits vorne ist oder nicht, damit dann entsprechen die Aktion erfolgt)

R200=0 ; 0=Reitstock hinten ..... 1= Reitstock vorne

IF R200=0 gotof WEITEREBEARBEITUNG
Reitstock befehl zum Vorfahren steht hier in der Zeile dann
R200=1 ; Reitstock vorne

WEITEREBEARBEITUNG:
bla blubb sülz

Ist ja eigentlich recht einfach. War jedoch happy, als ich es erstmal lauffähig dann damit hinbekommen habe wink.gif

Für Tips, Anregungen und Hilfe bin ich sehr dankbar smile.gif)))

Gruß Ingo

.
.
.

Der Beitrag wurde von ingo1974 bearbeitet: 14.12.2015, 06:31 Uhr
   
Beitrag 14.12.2015, 12:37 Uhr
N0F3aR
N0F3aR
Level 6 = Community-Doktor
******
Gruppe: Mitglied
Mitglied seit: 05.12.2011
Beiträge: 980
Hallo,

Wenn du deine Werkzeuge als Strings anlegst geht es ganz einfach aber dafür musst du die R Parameter vergessen geht nur mit selbst erstellten Variablen.

Das ganze würde ich dann als ein Up machen z.B

DEF Real Werkzeuge[99]=Set("Bohrer_1","Fräser_5","Messerkopf_50")
DEF INT ZAHLEN

Bearbeitung
.
.
.
Werkzeugwechsel
---->
Werkzeugewechsel.SPF

IF $A_TOOLMN[GETT(Werkzeuge[ZAEHLEN ])]==1 GOTOF Wechseln

LOOP

MSG("Werkzeug " <<Werkzeuge[ZAEHLEN]<<" nicht im Magazin ")
M0
G4 X2
ENDLOOP

Wechseln:

T=Werkzeuge[ZAEHLEN]; Werkzeug Aufruf
ZAEHLEN=ZAEHLEN+1
M6
T=Werkzeuge[ZAEHLEN]; Werkzeug Vorauswahl

M17


Ca so könnte es gehen habe es aber noch nicht getestet.

Lg

Der Beitrag wurde von N0F3aR bearbeitet: 14.12.2015, 12:41 Uhr
   
Beitrag 14.12.2015, 12:38 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
Hallo Ingo

Dein Ansatz ist sehr komplex

Aber ich denke mal des es recht einfach zu lösen ist

Du Definierst die Felder anders.

Du definierst eine STRING Feld, welches die benötigten Werkzeuge in geforderter Reihenfolge beinhaltet

CODE
DEF STRING[32] WZ_PLATZ["Werkzeuganzahl + 1] = SET("CUTTER10", "BOHRER10", usw der letzte ist wieder das Startwerkzeug)
DEF INT ZAEHLER1


Dann definierst du dein Koordiantenfeld etwas komplexer

CODE
DEF REAL FV["Anzahl der Bearbeitungspunkte", 4]
FV[0,0] = "X" Position
FV[0,1] = "Y" Position
FV[0,2] = Anzahl der Operationen
FV[0,3] = Werkzeugnummer nach WZ Tabelle siehe nach Feld oben
FV[0,4] = kannst du frei für sonstiges Verwenden
DEF INT ZAEHLER2, ZAEHLER3


nun kannst du sowohl den WZ Aufruf wie auch das Folgewerkzeug aus der Tabelle via FOR Schleife abarbeiten

CODE
FOR ZAEHLER1 = 1 to "Werkzeuganzahl"
   EXECSTRING("T="<<"WZ_PLATZ[ZAEHLER-1])
   M6
   EXECSTRING("T="<<"WZ_PLATZ[ZAEHLER])  ; WZ Vorwahl
   G0 G54 Sxxx Fxxxx
   IF FV[ZAEHLER1,3] == ZAEHLER1
   ... Bearbeitung der Operationen aus der Schleife
   ENDIF
ENDFOR


MFG
Andy



QUOTE (ingo1974 @ 14.12.2015, 07:28 Uhr) *
Hallo zusammen!

Ich arbeite an einer oben erwähnten Maschine. Ich habe ein R-Parameter Programm in DIN/ISO geschrieben, welches schon sehr gut läuft. Es wird eine Bohr/Frästabelle abgearbeitet, die zuvor einfach per Copy/Paste mit einem Editor in das DIN/ISO Programm übertragen wurde.

Es wird ein Variablenfeld erzeugt nach folgendem Schema:

Steuerkante[1,0]=SET(15,-120,2) <----- erste Zahl=bearbeitungs Winkel, zweite Zahl=Z-Mass, dritte Zahl=bohrungsdurchmesser
Steuerkante[2,0]=SET(90,-100,3) <----- Winkel 90°, Z-Mass -100, Bohrungsdurchmesser 3
So übergebe ich die Werte in das Variablenfeld
.
.
.

So ist es aufgebaut. Habe es so hinbekommen, dass für 6-7 zum Einsatz kommende Werkzeuge jeweils Label aufgerufen werden und die jeweilige Bearbeitung erfolgt. Funktioniert auch alles soweit mit den diversen "IF ... THEN ... ELSE" abfragen.

Allerdings wird das folgende benötigte Werkzeug nicht in der Werkzeugkette VORPOSITIONIERT .. sprich: die Maschine hat ja eine B-Achse und dort dauert der WKZ Wechsel relativ lange. Ganz besonders, wenn das Werkzeug nicht vorausgewählt wurde.

Zu diesem Zweck wollte ich eine IF -- THEN Abfrage einbauen, die immer die nächste Bohrung aus der Tabelle ausliest, bis halt der Bohrungsdurchmesser größer als der aktuelle bearbeitete ist. Entsprechend soll dann das nächste benötigte Werkzeug mit dem T-Befehl vorgewählt werden.

Und da hapert es. Um die Struktur bzw die Programmierung smart zu gestalten, möchte ich nicht in jedem Label die Abfrage separat durchführen (das sind ja relativ viele Programmzeilen), sondern jeweils zu einem unterprogramm in Form eines Labels springen.

Da habe ich aber Probleme mit dem Rücksprung aus eben jenem WKZ-Wechsel-Label.

Als alter Basic Programmierhase gab es doch damals den Befehl "GOSUB [zeilennummer]" ... damit wurde dann an eine beliebige Stelle gesprungen und mit dem Befehl "RETURN" erfolgte der Rücksprung zu genau der Stelle, von der aus man gesprungen war.

Das bekomme ich unter DIN/ISO aber nicht hin. Was ich nur hinbekomme:

zb.
GOTOF WKZANWAHL
hier
erfolgen
diverse
bearbeitungen ....

WKZANWAHL:
IF SK[COUNT,2]=3 <--- damit lese ich auch der entsprechenden Spalte/Reihe des Variablenfeldes den Bohrungsdurchmesser aus.
T="Boh_2.0_HM" <---- hiermit würde das gewünschte Werkzeug vorangewählt/positioniert auf der Kette.
GOTOB <---- ja, wohin spring ich hier? Die Rücksprünge sollen ja unterschiedlich sein .. deswegen wäre hier der Befehl RETURN perfekt.
ENDIF
IF SK[COUNT,2]=4
T="Boh_4.0_HM"
GOTOB usw usf

Warum brauche ich den variablen Rücksprung? Weil jedes Werkzeug ein eigenes Label hat später, weil ja auch die Schnittdaten unterschiedlich sind.

BOH01MM:
hier
erfolgt die
Bearbeitung


BOH02MM:
hier erfolgt
die
Bearbeitung

Ein weiteres Problem:

wie kann ich diese "T=[klarnamen der Werkzeugtabelle]" in eine reine NUMMER umwandeln? Also ich würde gerne im Programmkopf diese Werkzeug-Klarnamen entweder einem String zuweisen oder einer Nummer. Geht das? Also zB:

R200="Boh_2.0MM" <---- geht das so? Könnte ich dann später statt "T="Boh_2.0_HM" einfach nur T=R200 eingeben? Wie kann ich das am smartesten lösen?

Versteht mich richtig: ich bekomme es zwar vermutlich auch so alles hin mit umständlicher Programmierung, aber mein Ziel ist es, das Programm so klein und übersichtlich wie eben möglich zu gestalten.

Es gibt ja zb auch den Befehl:

$MC_TOOL_CHANGE_MODE = 0 oder 1
Wie genau nennt man diese Art von Befehl? Ist das ein Maschinenspezifischer Parameter? Wo gibt es eine Übersicht über diese Befehle? Sind schwer zu finden aus einer 800 Seiten Anleitung. Diese Befehle sind bestimmt auch rein Maschinenbezogen und nur für die eine Maschine gültig.

Viele Fragen, die schon ans Eingemachte gehen. Bin gespannt, wo hier die Programmierspezialisten unter euch sind.

So einige Kniffe habe ich auch hinbekommen. Zb die Reitstockabfrage (ob der Reitstock bereits vorne ist oder nicht, damit dann entsprechen die Aktion erfolgt)

R200=0 ; 0=Reitstock hinten ..... 1= Reitstock vorne

IF R200=0 gotof WEITEREBEARBEITUNG
Reitstock befehl zum Vorfahren steht hier in der Zeile dann
R200=1 ; Reitstock vorne

WEITEREBEARBEITUNG:
bla blubb sülz

Ist ja eigentlich recht einfach. War jedoch happy, als ich es erstmal lauffähig dann damit hinbekommen habe wink.gif

Für Tips, Anregungen und Hilfe bin ich sehr dankbar smile.gif)))

Gruß Ingo

.
.
.


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 14.12.2015, 14:25 Uhr
Guest_guest_*
Themenstarter
Gast


Zeitoptimierte Programmierung ist auch in Zeiten von TouchScreen, Smartfon und Operate noch immer Handarbeit. wink.gif

Man könnte das Folgewerkzeug auch über einen Zyklus oder ein Unterprogramm voranwählen....
Man muß aber nicht....

CODE
T="TOOL_1" D1
M6
T="TOOL_2"

... würde vollkommen reichen. wink.gif

Man kann's natürlich auch aufwändiger gestalten.
Eine guter und praktikabler Ansatz ist die Idee von Andy, die benötigten Werkzeugnamen in eine String-Feld-Variable zu schreiben und anschißend über deren Index aufzurufen.

CODE
def string[25] _wkz[11];24-Zeichen-String, max.11 Werkzeuge.
def int _step=0
_wkz[1]="TOOL_1"
_wkz[2]="TOOL_2"
.....
_wkz[10]="TOOL_10"

_step=_step+1
T=_wkz[_step] D1;Aufruf des aktuellen Werkzeugs
M6;Werkzeug einwechseln
T=_wkz[_step+1];Voranwahl des Folgewekzeugs
G97 S...
G94 F...
....


Zum "Leerfahren" der Spindel würde ich einfach und geschmacklos:
T0
M6

programmieren.
   
Beitrag 14.12.2015, 18:36 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
Hallo Ingo

ich habe mal etwas gebastelt
als kleines Weihnachtsgeschenk...

Das Prinzip sollte klar sein , und der Rest ist einfach

CODE
; HAUPTPROGRAMM FÜR WZ OPTIMIERUNG
DEF STRING[32] WZ_NAME["ANZAHL DER MAGAZINPLÄTZE"]
DEF REAL FV["ANZAHL DER BEARBEITUNGSOPERATIONEN", "ANZAHL DER ÜBERGABEPARAMETER"]
DEF INT ZAEHLER1, ZAEHLER2, ZAEHLER3
DEF BOOL REITSTOCK

UP_LADE_MAGAZIN
UP_LADE_WERTE

ZAEHLER3 = -1
FOR ZAEHLER1 = 0 TO "ANZAHL DER BEARBEITUNGSOPERATIONEN"
   IF FV[ZAEHLER1,0] <> ZAEHLER3; WZ WECHSEL STEHT AN
      ZAEHLER3 = FV[ZAEHLER1,0]
      G0 G53 X Y Z; FREIFAHRPOSITION ZUM WZ WECHSEL
      EXECSTRING("T="<<"WZ_NAME[ZAEHLER3-1]); WZ WECHSEL
      M6
      EXECSTRING("T="<<"WZ_NAME[ZAEHLER3-1]); WZ VORWAHL
      G54 S= FV[ZAEHLER1,1] F= FV[ZAEHLER1,2] M3 M7 M8
     ; NP KANN ANGEPASST WERDEN
   ENDIF
   G0 G54 X= FV[ZAEHLER1,3] Y= FV[ZAEHLER1,4]
  ; 5 = Z , 6 = SCHWENKACHSEN USW
   G0 Z B; HIER EINFÜGEN
   IF FV[ZAEHLER1,7] == 1
     ; HIER BEARBEITUNG FÜR OPTION1
     ; ZB. BOHREN
   ENDIF
   IF FV[ZAEHLER1,7] == 2
     ; HIER BEARBEITUNG FÜR OPTION2
     ; ZB. REIBEN
   ENDIF
   IF FV[ZAEHLER1,7] == 3
     ; HIER BEARBEITUNG FÜR OPTION3
     ; ZB. GEWINDE
   ENDIF
  ; DAS KANN X BELIEBIG FORTGEFÜHRT WERDEN
  ; REITSTOCKOPTION SIEHE UNTEN KANN BELIEBIG EINGEBAUT WERDEN
ENDFOR

GO G53 X Y Z;FREIFAHREN PROGRAMM ENDE
M30


und nun noch als Unterprogramm aufrufbar dein Reitstock- Problem

CODE
UP_REIT_VOR.SPF
;  ZURÜCK = 0 / VOR = 1
IF NOT REITSTOCK
  ; BEFEHL REITSTOCK VOR FAHREN
   MXXX; ODER WIE AUCH IMMER
ENDIF
RET


CODE
UP_REIT_RUECK.SPF
;  ZURÜCK = 0 / VOR = 1
IF REITSTOCK
  ; BEFEHL REITSTOCK ZURÜCK FAHREN
   MXXX; ODER WIE AUCH IMMER
ENDIF
RET


somit kannst du aus FV Tabelle sowohl de Werkzeuge, die Bearbeitungsart, wie auch die dazugehörigen Parameter bestimmen

Klar kann man das auch wie "guest" sagte, höchst einfach aber ineffizient gestalten...

Effektivität kommt nun mal nicht immer aus dem Computer wink.gif
Nur der der an der Maschine steht, das Magazin bestück, den Prozess beobachtet sieht auch was zu verbessern wäre wink.gif

Ich hoffe mal wir konnten dir weiter helfen ...

Schönes Vorweihnachtszeit

MFG

Andy


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 14.12.2015, 21:56 Uhr
DMC635V
DMC635V
Level 6 = Community-Doktor
******
Gruppe: Mitglied
Mitglied seit: 12.08.2010
Beiträge: 844
Eine Lösung welche wie dein beschriebenes GOSUB funktioniert ist über REPEAT realisierbar.
z.B.:
CODE
...
...
REPEAT WZLABEL WZ_ENDE
...
...
REPEAT WZLABEL WZ_ENDE
...
...
M30
WZLABEL:
...
...
WZ_ENDE:


Im Repeat Befehl kommt zuerst der Name des Startlabel und dann der des Endlabel. Wenn das Endlabel erreicht ist, wird auf den Satz nach dem Repeat Befehl gesprungen. Mit dem zusätzlichen Parameter P kann ein Bereich auch mehrfach ausgeführt werden.

CODE
REPEAT START ENDE P=4


Der Beitrag wurde von DMC635V bearbeitet: 14.12.2015, 21:57 Uhr


--------------------
Freundliche Grüsse
DMC635V
   
Beitrag 14.12.2015, 22:32 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
QUOTE (DMC635V @ 14.12.2015, 22:56 Uhr) *
Eine Lösung welche wie dein beschriebenes GOSUB funktioniert ist über REPEAT realisierbar.
z.B.:
CODE
...
...
REPEAT WZLABEL WZ_ENDE
...
...
REPEAT WZLABEL WZ_ENDE
...
...
M30
WZLABEL:
...
...
WZ_ENDE:


Im Repeat Befehl kommt zuerst der Name des Startlabel und dann der des Endlabel. Wenn das Endlabel erreicht ist, wird auf den Satz nach dem Repeat Befehl gesprungen. Mit dem zusätzlichen Parameter P kann ein Bereich auch mehrfach ausgeführt werden.

CODE
REPEAT START ENDE P=4

GOSUB "Springe zurück dieser genannten Adresse" <- BASIC

GOSUB "START-Adressse" "END- ADRESSE" "P="WIEDERHOLUNG"" <- nicht zu definieren

REPEAT "START-Adressse" "END- ADRESSE" "P="WIEDERHOLUNG"" <- Sienems- CODE

MFG

Andy


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 14.12.2015, 23:26 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
WOW!

Erstmal ein riesen Dankeschön an alle, die sich jetzt beteiligt haben. Heute musste ich etwas ganz anderes, dringliches erledigen, sodaß ich keine Gelegenheit hatte, mich mit euren Ideen auseiannder zu setzen. Das werde ich aber in den kommenden Tagen machen.

Diese Repeat Funktion werde ich antesten! Sehr interessant!

Noch als Anmerkung: welche Werkzeuge zum Einsatz kommen, ist nicht immer klar, sodaß keine fixe Voranwahl stattfinden soll. Das wäre ja sonst einfach gewesen. Also, es können 4x 1mm Bohrungen kommen, dann zwei 3mm Bohrungen usw. Auf der anderen Seite kann es aber auch mal sein, dass durch die Bohrtabelle 1mm, 1.5mm und 2mm aufgerufen werden am Anfang.

Daher sollte der Übertrag der Werkzeugnamen in einen String erfolgen, wie weiter oben beschrieben. Ich muss mich mal da reinfuchsen, ob es so klappt. Die reine Angabe der T-Nummer ist sicherlich nicht machbar, da die Magazinplätze variabel belegt sind und nicht gleich bleiben. Ich habe etwa 100 Werkzeuge, jedoch nur 48 Werkzeugplätze auf der Kette.
   
Beitrag 14.12.2015, 23:41 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
Hallo Andy!

Ich habe ein paar Fragen. Ich hoffe, sie sind für dich nicht zu "einfach" smile.gif Ich beginne jetzt erst mich in die DIN/ISO Thematik richtig einzuarbeiten. In den nächsten Tagen werde ich auch mein DIN/ISO Programm hier mal posten. Dann versteht ihr auch noch besser als ohnehin, wie das ganze aufgebaut ist.

Meine Frage bezüglich deiner Ausführung:

DEF BOOL REITSTOCK

CODE
UP_REIT_RUECK.SPF
;  ZURÜCK = 0 / VOR = 1
IF REITSTOCK
; BEFEHL REITSTOCK ZURÜCK FAHREN
   MXXX; ODER WIE AUCH IMMER
ENDIF
RET


Was ist "Bool" und was macht es?

IF REITSTOCK <----- was heißt das? Wenn das Bit 0 oder 1 gesetzt ist? Reitstock ja/nein?! Ist das nur eine Darstellung des schematischen Syntax?! So genau funktioniert es doch nicht, oder?

Also ich habe es so gelöst:

An Anfang setze ich zb den R-Parameter:

R240 = 0 ; 0 = reitstock hinten, 1 = Reitstock vorne

In dem Bearbeitungslabel mache ich dann die Abfrage:

IF R240 = 1 GOTOF BOHREN
REITSTOCK VORFAHREN kommt dann hier als SIEMENS Befehl, der sich rückübersetzen lässt
R240 =1
BOHREN:

weitere bearbeitung ....

so geht es halt auch.

Am Ende der Bearbeitung fährt der Reitstock weg, falls ein WKZ Wechsel ansteht. Das löse ich, indem ich die Bohrtabelle auslese. Falls der Durchmesser der nächsten Bohrung von der aktuellen Bohrung abweicht, wird der Reitstock zurückgefahren und dann R240 = 0 gesetzt.

Das funktioniert also relativ einfach ohne Unterprogramm ...

Aber vielleicht ist deine DEF BOOL REITSTOCK Variante noch einfacher, wobei ich da nicht ganz verstehe, wie sie funktioniert, weil da ja kein Wert "gesetzt" wird. Oder habe ich das Prinzip einfach nicht verstanden? Wäre toll, wenn du mir das nochmal erklären könntest.

Der Beitrag wurde von ingo1974 bearbeitet: 14.12.2015, 23:43 Uhr
   
Beitrag 14.12.2015, 23:49 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
Hi Ingo

Ich versteh deinen Grundansatz nicht !
Ich weiss doch was für ein Teil zu "Fertigen" ist ?
Oder ?
BZW Du !

Die Maschine sollte das zwingend wissen !

Wenn Ihr ! So dynamisch Werkstücke fertigt ? Wie nun woher weiss nun die Maschine das "jetzt" ich sag mal " Werkstueck253" zu fertigen ist ???

Ich habe zb ein Programm für 370 Werkstücke die alle ähnlich sind ! Nur über einen Zeiger ( in dem Falle eine "Werkstücknummer" ) weiss das Programm alles, ... Werkzeuge, welche Bearbeitungen wo, ... Basierend auf einer Universal Vorrichtung! Da rechnet sich das Programm vom Vorrichtungs- Nullpunkt alles selber aus, weiss was und wo was wie zu bearbeiten ist ...

Egal

Das ist hochgradig Komplex

Bring mal paar Beispiele wie was wo und womit und dann..

Bitte Schildere mal dein Problem so ( auch in BASIC ) das man es analsieren könnte

MFG

ANDY

QUOTE (ingo1974 @ 15.12.2015, 00:26 Uhr) *
WOW!

Erstmal ein riesen Dankeschön an alle, die sich jetzt beteiligt haben. Heute musste ich etwas ganz anderes, dringliches erledigen, sodaß ich keine Gelegenheit hatte, mich mit euren Ideen auseiannder zu setzen. Das werde ich aber in den kommenden Tagen machen.

Diese Repeat Funktion werde ich antesten! Sehr interessant!

Noch als Anmerkung: welche Werkzeuge zum Einsatz kommen, ist nicht immer klar, sodaß keine fixe Voranwahl stattfinden soll. Das wäre ja sonst einfach gewesen. Also, es können 4x 1mm Bohrungen kommen, dann zwei 3mm Bohrungen usw. Auf der anderen Seite kann es aber auch mal sein, dass durch die Bohrtabelle 1mm, 1.5mm und 2mm aufgerufen werden am Anfang.

Daher sollte der Übertrag der Werkzeugnamen in einen String erfolgen, wie weiter oben beschrieben. Ich muss mich mal da reinfuchsen, ob es so klappt. Die reine Angabe der T-Nummer ist sicherlich nicht machbar, da die Magazinplätze variabel belegt sind und nicht gleich bleiben. Ich habe etwa 100 Werkzeuge, jedoch nur 48 Werkzeugplätze auf der Kette.


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 14.12.2015, 23:57 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
Hi

BOOL ist ein logisccher Zustand
Der kann ja oder nein bedeuten oder 0 und 1
ist die "positive" Logik erfüllt also 1 oder TRUE

Ist das verkürzt in Siemens IF REITSTOCK ( er muss den WERT 1 oder gleichbedeutend TRUE haben ) ist diese Bediengung erfüllt !! Und der Rest innerhalb der IF Bedingung bis ENDIF kommt zur Funktion

MFG

Andy


QUOTE (ingo1974 @ 15.12.2015, 00:41 Uhr) *
Hallo Andy!

Ich habe ein paar Fragen. Ich hoffe, sie sind für dich nicht zu "einfach" smile.gif Ich beginne jetzt erst mich in die DIN/ISO Thematik richtig einzuarbeiten. In den nächsten Tagen werde ich auch mein DIN/ISO Programm hier mal posten. Dann versteht ihr auch noch besser als ohnehin, wie das ganze aufgebaut ist.

Meine Frage bezüglich deiner Ausführung:

DEF BOOL REITSTOCK

CODE
UP_REIT_RUECK.SPF
;  ZURÜCK = 0 / VOR = 1
IF REITSTOCK
; BEFEHL REITSTOCK ZURÜCK FAHREN
   MXXX; ODER WIE AUCH IMMER
ENDIF
RET


Was ist "Bool" und was macht es?

IF REITSTOCK <----- was heißt das? Wenn das Bit 0 oder 1 gesetzt ist? Reitstock ja/nein?! Ist das nur eine Darstellung des schematischen Syntax?! So genau funktioniert es doch nicht, oder?

Also ich habe es so gelöst:

An Anfang setze ich zb den R-Parameter:

R240 = 0 ; 0 = reitstock hinten, 1 = Reitstock vorne

In dem Bearbeitungslabel mache ich dann die Abfrage:

IF R240 = 1 GOTOF BOHREN
REITSTOCK VORFAHREN kommt dann hier als SIEMENS Befehl, der sich rückübersetzen lässt
R240 =1
BOHREN:

weitere bearbeitung ....

so geht es halt auch.

Am Ende der Bearbeitung fährt der Reitstock weg, falls ein WKZ Wechsel ansteht. Das löse ich, indem ich die Bohrtabelle auslese. Falls der Durchmesser der nächsten Bohrung von der aktuellen Bohrung abweicht, wird der Reitstock zurückgefahren und dann R240 = 0 gesetzt.

Das funktioniert also relativ einfach ohne Unterprogramm ...

Aber vielleicht ist deine DEF BOOL REITSTOCK Variante noch einfacher, wobei ich da nicht ganz verstehe, wie sie funktioniert, weil da ja kein Wert "gesetzt" wird. Oder habe ich das Prinzip einfach nicht verstanden? Wäre toll, wenn du mir das nochmal erklären könntest.


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 15.12.2015, 00:02 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
Ich versuche es mal zu erklären.

Folgendes. Ich arbeite im Prototypenbau. Wir machen Grundlagenforschung für Hydraulikaggregate, die in Baggern und Kränen eingesetzt werden.

Wir fertigen auch (auf einer anderen Maschine) große Hydraulikblöcke mit unzähligen Bohrungen. In einige dieser Bohrugen werden Hülsen eingesetzt. In diesen wiederum laufen Ventilschieber. Das sind halt Wellen, die verschiedene Ventilstellungen "schalten". Quasi den Hydrauliköl-Fluss beeinflussen.

Bisschen komplex so zu beschreiben.

In die Blöcke kommen diesen Hülsen rein, damit die ganze Sache "austauschbar" ist. Ansonsten wäre ein gefertigter Block FIX und man könnte nicht verschiedene Variationen antesten.

Worum es für mich geht:

Ich habe eine Hülse zu fertigen. 38mm Aussendurchmesser, 25mm Innendurchmesser. Einige Auskammerungen/Einstiche aussen. In den Bereichen der Auskammerungen werden etliche verschiedene Bohrbilder/Fräsungen eingebracht. Immer rund. Dadurch wird der Ölfluss halt gesteuert. Daher auch der Name "Ventilschieber".

Unser Konstrukteur/Ingenieur führt komplexe Berechnungen durch. Er hat sich da selber ein Programm geschrieben, welches die Ergebnisse seiner Berechnungen automatisch in PRO-E (CAD Programm) überträgt und auch gleichzeitig ein Bohrtabelle dafür erstellt. Diese Bohrtabelle überträgt er automatisch mit einem Skript in mein DIN/ISO Programm. Im Grunde stehen in der Tabelle nur WINKELLAGE, Z-MASS, DURCHMESSER ....

Wir haben uns also quasi selber eine CAD/CAM Schnittstelle geschaffen.

Der Vorteil an der variablen Ausführung: er berechnet eine Auslegung, fügt die automatisch in das DIN/ISO Programm ein, schickt es mir per Mail und ich kann das Programm sofort laufen lassen.

Das läuft ja auch bereits alles wunderbar, nur die Werkzeugwechselwartezeiten stören mich. Nur darum geht es.

Ansonsten habe ich es schon so hinbekommen und bin auch klein wenig stolz auf mich smile.gif))

Was mein Problem ist. Ich würde gerne WERKZEUGNAMEN bestimmten Nummer/Durchmessern zuordnen.

WKZ(1)="Boh_1.0_HM"
WKZ(1.5)="Boh_1.5_HM"
WKZ(2)="BoH_2.0_HM"

usw.

Ich schaue mal, ob ich mal ein Foto von so einem Werkstück hochladen kann.
   
Beitrag 15.12.2015, 00:26 Uhr
DMC635V
DMC635V
Level 6 = Community-Doktor
******
Gruppe: Mitglied
Mitglied seit: 12.08.2010
Beiträge: 844
QUOTE (Andy742000 @ 14.12.2015, 23:32 Uhr) *
GOSUB "Springe zurück dieser genannten Adresse" <- BASIC

GOSUB "START-Adressse" "END- ADRESSE" "P="WIEDERHOLUNG"" <- nicht zu definieren

REPEAT "START-Adressse" "END- ADRESSE" "P="WIEDERHOLUNG"" <- Sienems- CODE

Gleiche Funktion war das Stichwort, nicht gleiche Programmierung.


QUOTE (ingo1974 @ 15.12.2015, 00:26 Uhr) *
Daher sollte der Übertrag der Werkzeugnamen in einen String erfolgen, wie weiter oben beschrieben. Ich muss mich mal da reinfuchsen

Strings sind kein Hexenwerk. Die Definition funktioniert gleich wie bei allen Datentypen über den DEF Befehl. Hierbei muss jedoch eine maximale Stringlänge eingegeben werden, was wie bei einer Feldvariablen mit den eckigen Klammern geschieht. (Ein String ist eigentlich nichts anderes als eine Feldvariable mit Schriftzeichen). Das Handhaben von Stringoperationen ist jedoch anders als bei Zahlenwerten und erfordert besondere Funktionen. Mehr dazu findest du im "Programmierhandbuch Arbeitsvorbereitung" unter Kapitel "1.9 Stringoperationen".
Hier ein kleines Beispiel:
CODE
DEF STRING[25] BEISPIEL; String mit maximal 25 Zeichen
DEF INT DIAM
DIAM=5

BEISPIEL="BOHRER_D5"; Beschreiben mit festwert

BEISPIEL="BOHRER_D"<<DIAM; Beschreiben mit Festwert + Variable
; << = Stringverknüpfung
; Ergebnis: BOHRER_D5

T=BEISPIEL M6; Werkzeugwechsel



QUOTE (ingo1974 @ 15.12.2015, 00:41 Uhr) *
Was ist "Bool" und was macht es?

IF REITSTOCK <----- was heißt das? Wenn das Bit 0 oder 1 gesetzt ist? Reitstock ja/nein?! Ist das nur eine Darstellung des schematischen Syntax?! So genau funktioniert es doch nicht, oder?

Also ich habe es so gelöst:

An Anfang setze ich zb den R-Parameter:

R240 = 0 ; 0 = reitstock hinten, 1 = Reitstock vorne

In dem Bearbeitungslabel mache ich dann die Abfrage:

IF R240 = 1 GOTOF BOHREN
REITSTOCK VORFAHREN kommt dann hier als SIEMENS Befehl, der sich rückübersetzen lässt
R240 =1
BOHREN:

weitere bearbeitung ....

so geht es halt auch.

Am Ende der Bearbeitung fährt der Reitstock weg, falls ein WKZ Wechsel ansteht. Das löse ich, indem ich die Bohrtabelle auslese. Falls der Durchmesser der nächsten Bohrung von der aktuellen Bohrung abweicht, wird der Reitstock zurückgefahren und dann R240 = 0 gesetzt.

Das funktioniert also relativ einfach ohne Unterprogramm ...

Aber vielleicht ist deine DEF BOOL REITSTOCK Variante noch einfacher, wobei ich da nicht ganz verstehe, wie sie funktioniert, weil da ja kein Wert "gesetzt" wird. Oder habe ich das Prinzip einfach nicht verstanden? Wäre toll, wenn du mir das nochmal erklären könntest.


Bool ist ein weiterer Datentyp, welcher Wahrheitswerte annimmt also nur 0 oder 1. Dieser Datentyp benötigt am wenigsten Speicher und ist für Abfragen geeignet welche mit ja oder nein beantwortet werden können.

Hier mal eine Liste der wichtigsten Datentypen:
INT: Ganzzahliger Wert mit Vorzeichen
REAL: Gleitkommazahl
BOOL: Wahrheitswert TRUE (1) / FALSE (0)
CHAR: ASCII-Zeichen
STRING[Maxlänge]: Zeichenkette / Text

Das IF wie es Andy verwendet ist die schönere Form von IF xxx GOTOF. Hierbei wird der code zwischen dem IF und dem ENDIF ausgeführt wenn die Bedingung erfüllt ist. Zudem kann noch eine ELSE angehängt werden. Dieser Bereich wird ausgeführt wenn die Bedingung nicht erfüllt ist. Goto sind allgemein in den meisten Programmiersprachen verpönt, da sie zu unerwarteten Fehlern führen können und der code unübersichtlich wird. Gute Art ist es auch den Code bei IF Befehlen einzurücken, wodurch man sofort sieht welcher code in welchem IF ist und wo es zu ende ist. Dies ist vor allem bei mehrstufigen IFs oder in Verbindung mit Schleifen nützlich. Hierzu einfach Leerzeichen vor die Sätze im IF stellen, diese Leerzeichen werden von der Steuerung ignoriert.
Dein Beispiel:
CODE
DEF BOOL REITSTOCK; statt R240
REITSTOCK=1
...
IF REITSTOCK
; hier kommt code welcher nur bei REITSTOCK=1 ausgeführt wird
ELSE
  ; hier kommt code welcher nur bei REITSTOCK=0 ausgeführt wird
  REITSTOCK VORFAHREN kommt dann hier als SIEMENS Befehl, der sich rückübersetzen lässt
  R240 =1
ENDIF
; bohren


--------------------
Freundliche Grüsse
DMC635V
   
Beitrag 15.12.2015, 01:00 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
Vielen Dank DMC ... du und Andy habt mir sehr weitergeholfen!

Ich habe wichtige Erkenntisse gewonnen und werde es bald umsetzen und mich dann wieder melden smile.gif smile.gif smile.gif
   
Beitrag 16.12.2015, 15:38 Uhr
Guest_guest_*
Themenstarter
Gast


QUOTE
Was mein Problem ist. Ich würde gerne WERKZEUGNAMEN bestimmten Nummer/Durchmessern zuordnen.

WKZ(1)="Boh_1.0_HM"
WKZ(1.5)="Boh_1.5_HM"
WKZ(2)="BoH_2.0_HM"


Das ist genau mein Vorschlag aus meinem letzten Posting.
CODE
def int nummer             ;Werkzeugnummer (im Programmm)
def string[25] wkz[12]   ;Werkzeugnamen

;*** Zuweisung der Werkzeug-Namen:
wkz[1]="Boh_1.0_HM"
wkz[2]="Boh_1.2_HM"
wkz[3]="Boh_1.5_HM"
wkz[4]="Boh_1.75_HM"
wkz[5]="Boh_2.0_HM"
wkz[6]="Boh_3.0_HM"

;*** Arbeitsschritt:
nummer=nummer+1
   oder:
nummer=5
;*** Werkzeugaufruf:
;       hier wird also wkz[5] ("Boh_2.0_HM") aufgerufen
T=wkz[nummer] D1
M6

;*** Voranwahl:
T=wkz[nummer+1]
  oder
T=wkz[6]
;     hier wird also wkz[6] ("Boh_3.0_HM") aufgerufen


Der Beitrag wurde von guest bearbeitet: 16.12.2015, 15:41 Uhr
   
Beitrag 16.12.2015, 16:03 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
Verzeihung guest! Du hast natürlich vollkommen recht damit.

Da ich gerade noch nicht zum testen komme und auch keine Sinutrain Software habe:

wkz[1.5]="Boh_1.5_HM"

Geht das auch? Oder nur Ganzzahlen?
   
Beitrag 16.12.2015, 16:19 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
Hi
QUOTE (ingo1974 @ 16.12.2015, 17:03 Uhr) *
Verzeihung guest! Du hast natürlich vollkommen recht damit.

Da ich gerade noch nicht zum testen komme und auch keine Sinutrain Software habe:

wkz[1.5]="Boh_1.5_HM"

Geht das auch? Oder nur Ganzzahlen?

Es geht auch noch viel Komplexer wink.gif

Basierend auf der Feldvariablen WZ_PLATZ und den KOORDINATEN

CODE
IF KOORDINATEN[ZAEHLER,0] = 0; 0 gibt an das gebohrt werden soll
   T= "BOHRER_D"<<KOORDINATEN[ZAEHLER,1]<<"_VHM"
ELSE
   T= "FRAESER_D"<<KOORDINATEN[ZAEHLER,1]<<"_VHM"
ENDIF
M6
...
...
M30


So übergibst du in den KOORDINATEN Feld folgendes
0 = Bearbeitung Bohren / 1 = Fräsen
1 = WZ Durchmesser
2 = X Position
usw

MFG
Andy


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 16.12.2015, 16:32 Uhr
Guest_guest_*
Themenstarter
Gast


QUOTE (ingo1974 @ 16.12.2015, 17:03 Uhr) *
Verzeihung guest! Du hast natürlich vollkommen recht damit.

Da ich gerade noch nicht zum testen komme und auch keine Sinutrain Software habe:

wkz[1.5]="Boh_1.5_HM"

Geht das auch? Oder nur Ganzzahlen?


Der Wert in den eckigen Klammern ist der Feldindex von wkz[]. Ein Index ist immer eine Integerzahl.
Kurz: "wkz[1.5]="Boh_1.5_HM"" geht nicht.

Dabei kommt mir gerade eine Idee:

CODE
Integervariable:
  def int nummer          ;Werkzeugnummer (im Programmm)
  Feldvariable:
  def string[10] drm[12]        ;Durchmesser
  def string[25] wkz[12];Werkzeugnamen
  
;*** Zuweisung der Werkzeug-Durchmesser:
  drm[1]="1.0"
  drm[2]="1.2"
  drm[3]="1.5"
  drm[4]="1.75"
  drm[5]="2.0"
  drm[6]="3.0"
  
;*** Arbeitsschritt:
  nummer=nummer+1
     oder:
  nummer=5
  wkz[nummer]="Boh_"<<drm[nummer]<<"_HM"
  
;*** Werkzeugaufruf:
;       hier wird also wkz[5] ("Boh_2.0_HM") aufgerufen
  T=wkz[nummer] D1
  M6
  
;*** Voranwahl:
  T=wkz[nummer+1]
    oder
  T=wkz[6]
;     hier wird also wkz[6] ("Boh_3.0_HM") aufgerufen


Die << verketten Strings zu einem neuen String. Nur so ist es auch möglich unterschiedliche Datentypen in einen String zu wandeln.

Am besten du nimmst dir mal das "Programmierhandbuch Arbeitsvorbereitung" zur Brust.
Stichworte: Indirekte Programmierung, Variable.

Der Beitrag wurde von guest bearbeitet: 16.12.2015, 16:44 Uhr
   
Beitrag 17.12.2015, 00:05 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
QUOTE (guest @ 16.12.2015, 16:32 Uhr) *
Der Wert in den eckigen Klammern ist der Feldindex von wkz[]. Ein Index ist immer eine Integerzahl.
Kurz: "wkz[1.5]="Boh_1.5_HM"" geht nicht.

Dabei kommt mir gerade eine Idee:

CODE
Integervariable:
  def int nummer         ;Werkzeugnummer (im Programmm)
  Feldvariable:
  def string[10] drm[12]    ;Durchmesser
  def string[25] wkz[12];Werkzeugnamen
  
;*** Zuweisung der Werkzeug-Durchmesser:
  drm[1]="1.0"
  drm[2]="1.2"
  drm[3]="1.5"
  drm[4]="1.75"
  drm[5]="2.0"
  drm[6]="3.0"
  
;*** Arbeitsschritt:
  nummer=nummer+1
     oder:
  nummer=5
  wkz[nummer]="Boh_"<<drm[nummer]<<"_HM"
  
;*** Werkzeugaufruf:
;       hier wird also wkz[5] ("Boh_2.0_HM") aufgerufen
  T=wkz[nummer] D1
  M6
  
;*** Voranwahl:
  T=wkz[nummer+1]
    oder
  T=wkz[6]
;     hier wird also wkz[6] ("Boh_3.0_HM") aufgerufen


Die << verketten Strings zu einem neuen String. Nur so ist es auch möglich unterschiedliche Datentypen in einen String zu wandeln.

Am besten du nimmst dir mal das "Programmierhandbuch Arbeitsvorbereitung" zur Brust.
Stichworte: Indirekte Programmierung, Variable.


So werde ich es auch wohl umsetzen.

Ich habe ja ein Variablenfeld erstellt mit 3 Werten. Der dritte Wert bezieht sich ja auf den Bohrungsdurchmesser.
Ist ja dann einfach, wenn ich das einmal im Startlabel definiere.
   
Beitrag 17.12.2015, 01:49 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
QUOTE (ingo1974 @ 17.12.2015, 01:05 Uhr) *
Ist ja dann einfach, wenn ich das einmal im Startlabel definiere.

Was ist zum Teufel ein Startlabel ?

Der Label kram in Form
LABEL:
...
ENDLABEL:
REPEAT LADEL ENDLABEL P=xxx

entstammt wohl eher einer Kulturrichtung ala Heidenhain, und zeugt nicht unbedingt davon, dass man Programmmittel wie Unterprogramme und Zyklen sinnvoll nutzen kann.

Spätestens bei komplexen Dingen, wo mehrere solcher Definitionen LABEL ( oder Eigenname ) in einem Monster- Hauptprogramm auftauchen, wird das ganze nicht nur unübersichtlich.
Egal ob Wertübergaben mit R- Parametern, oder selbst definierten Variablen, oder direkte Übergabe ähnlich bei Zyklen, erleichtert nicht nur die Lesbarkeit, sondern auch die Korrigierbarkeit. Zudem Spart man CNC Speicher.

Was auch das ( BASIC ) Problem GOSUB RETURN automatisch löst. Egal an welcher Steller ich in einem Hauptprogramm ein Unterprogramm aufrufe, erfolgt der Rücksprung aus dem Unterprogramm immer wieder an die Stelle, wo das Unterprogramm aufgerufen wurde.
Da muss man sich nicht das Leben mit wilden GOTO oder REPEAT Konstruktionen schwer machen.

Ein Blick in die Anleitungen zur Steuerung hilft da ungemein weiter wink.gif

MFG

Andy


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 17.12.2015, 16:08 Uhr
Guest_guest_*
Themenstarter
Gast


@ingo1974
Nach einigen Bemerkungen in den letzten Posts ist mir aufgefallen, daß deine Kenntnisse der Sinumerik wohl eher nicht ausreichen dürften, "Dein" Programm zu erstellen.
Ich vermute mal, daß der "Konstrukteur/Ingenieur" hier federführend ist.
Ein nochmaliges Lesen des Ausgangspost's gab mir darüber Gewißheit.
Nun hat ja die Programmierung mit Sinumerik-DIN relativ wenig mit HH-Klartext, BASIC oder einer anderen Programmiersprache zu tun. Lediglich die Syntax der Hochsprachenelemente könnte Manchen an FORTRAN erinnern.
Der Begriff "LABEL" wird jedoch nur bei HH prägend für Programmabschnitte verwendet, die durch die Schlüsselwörter "LABEL" und "ENDLABEL" umschlossen sind.
Diese Technik und Funktionalität gibt es bei der Sinumerik so nicht. Eine vergleichbare Funktion erfüllt die Unterprogramm-Technik.
Mit "$" beginnende Zeichenfolgen sind keine Befehle, sondern Systemvariable, deren Überschreibung durch Unwissende recht fatale Folgen haben kann.
Deshalb bitte nur das programmieren, wovon man auch weiß, was es bewirkt!!!!!
Das erforderliche Wissen kann man bei entsprechenden Schulungen bzw. Trainings, oder im Selbststudium der Programmier- und Systemhandbücher erwerben.

Doch nun noch mal zum Verständnis:
Der Konstrukteur erstellt eine dreispaltige Punktetabelle mit den Werten C,Z und dem Bohrungsdurchmesser.
Der Konstrukteur kopiert diese Tabelle zeilenweise mittels Script in die Feldvariable "Steuerkante[100,3]" des NC-Programms. Auch hier vermute ich eine bereits erstellte GUD-Variable, da dir die Form der Definition unbekannt zu sein scheint.
Das Programm des Konstrukteurs funktioniert.
Dich stören die langen Werkzeugwechselzeiten, weil du nicht weißt, wie eine effektive Programmstruktur geschaffen werden kann um:
A: Die Werkzeugwechsel zu minimieren, um damit unnötige Werkzeugwechsel zu elimieren.
B: Die nötigen Werkzeugwechsel durch Voranwahl des Folgewerkzeugs zu beschleunigen.

Nun haben wir noch nicht erfahren, wie die Punktetabelle abgearbeitet wird.
Wird sie 1. in Reihenfolge des ersten Feldindex abgearbeitet also nach Positions-Nummer?
Oder wird sie 2. in Reihenfolge des aufsteigenden Bohrdurchmessers abgearbeitet?
Oder 3. ist die Tabelle bereits nach Bohrdurchmessern sortiert?
Wird überhaupt nach Positionstabelle abgearbeitet?

Im ersten Fall sind unnötige Werkzeugwechsel möglich.
Im zweiten und dritten Fall würde ein Werkzeugwechsel angestoßen, aber nicht ausgeführt, weil das Werkzeug bereits eingewechselt ist. Die Vorauswahl des Folgewerkzeugs wäre unwirksam.

Hauptproblem wäre also die Sortierung oder Auswahl der Bohrpositionen nach aufsteigendem Durchmesser.
Eine Erkennung des gerade aktiven Werkzeugs wäre sinnvoll, um den Anstoß des Werkzeugwechsels, bei gleichem Durchmesser zu vermeiden, was auch einen Verlust der Vorauswahl zur Folge hätte.

Deshalb ist bereits die Form des Werkzeugaufrufs für eine differenzierte Abarbeitung der Bohrpositionen ein entscheidender Aspekt in solch einem Programm.
Auch das Einlesen von CSV-Dateien in Variable ist, allerdings erst ab Operate4.7, grundsätzlich möglich. In den Vorgängerversionen ist das nicht direkt, sondern nur mit etwas größerem Aufwand möglich.

Ich denke, das gibt Anlass zu einem, oder mehreren vergnügten Leseabenden. wink.gif
   
Beitrag 17.12.2015, 17:26 Uhr
ingo1974
ingo1974
Level 2 = Community-Facharbeiter
**
Gruppe: Mitglied
Mitglied seit: 10.11.2013
Beiträge: 116
Hallo guest!

Erstmal danke für dein ausführliches Feedback.

Mein Kenntnisse bezüglich Sinumerik und G-Code sind in der Tat (noch) sehr spärlich. Jedoch lerne ich jeden Tag hinzu. 800 Seiten PDF Text sind halt nicht in 2-3 Wochen verinnerlicht. Einzelne Funktionen muss ich immer wieder suchen und das bremst natürlich aus. Auch ist mir nicht jeder Syntax geläufig und ich muss immer wieder mal in Beispiele reinschauen. Aber das ist keine Schande denke ich.

Das Programm ist bereits absolut lauffähig und dynamisch bzw flexibel. Ich habe es völlig alleine und ohne fremde Hilfe hinbekommen. Der Part des Konstrukteurs ist sehr gering. Er exportiert nur seine Werte nach meinem vorgegebenen Syntax in eine Textdatei und fügt diesen Text meinem *.SPF hinzu. Das machen wir deshalb, damit ich nicht 50-80 Zeilen händisch in die Tabelle eintragen muss. Somit sind dann auch Eingabefehler ausgeschlossen.

Sicherlich ist mein Programm nicht ganz so elegant und smart aufgebaut. Dazu fehlen mir auch einfach die nötigen Erfahrungen mit den einzelnen Syntax/Befehlen/Möglichkeiten. Woran es hakte, war einfach nur die Werkzeugvoranwahl. Das folgend benötigte Werkzeug soll noch während des Bearbeitungsprozesses bereitgestellt werden in der WKZ-Kette bzw dem Shuttle. Bei "unplanmäßigen" Werkzeugwechseln dauert die WKZ Bereitstellung halt 10-15 Sekunden länger bei unserer Maschine. Hätte ich eine Revolvermaschine, bräuchte ich mir über diese Geschichte gar keine Gedanken zu machen.

Den Begriff LABEL habe ich einfach genutzt, weil er in der Programmiersprache schon häufiger zu meinen Ohren gelangt ist.

BOHREN: <---- wie ist denn die korrekte Bezeichnung dafür? Sprungmarke? Label? Ist es nicht das gleiche?
g0 x100 z100


Es geht nicht, wie du unter Punkt A beschreibst, um unnötige Werkzeugwechsel. Ich habe den Ingenieur gebeten, die Feldvariablen Tabelle nach Bohrdurchmesser sortiert auszuspucken, damit eben jene unnötigen Werkzeugwechsel vermieden werden. Das war das erste, was ich ihm beim Anblick der Tabelle mitteilte. Der Feldindex ist ebenfalls "sortiert". Also:

SK[1,0]=SET[0,-50,1]
SK[2,0]=SET[90,-20,2]
SK[3,0]=SET[120,-90,3]
SK[4,0]=SET[180,-40,4]
SK[5,0]=SET[99,99,99] <--------- die 99 ist der Zeige für das Ende der Tabelle (Wobei man auch die "0" nehmen könnte und einfach nichts hier einträgt.
usw

Punkt B habe ich heute in den Griff bekommen, da ich mich mal wieder dieser Sache widmen konnte. Das Programm ist fertig und sicherlich keine Schönheit bezüglich der Struktur. Morgen werde ich das Programm hier posten. Dann könnt ihr mir sicherlich Tips geben, wie man es einfacher/smarter/effektiver und übersichtlicher gestalten kann.

Die Vorauswahl des nächsten Werkzeuges ist halt von Fall zu Fall unterschiedlich, wie ich auch weiter oben schonmal beschrieben. Es können 1mm, 2mm, 3mm, 4mm Bohrungen in der Tabelle stehen. Kann aber auch sein, dass stattdessen 1.2mm, 2mm, 5mm und 6mm Bohrungen vorkommen. Daher muss die Bereitstellung des nächsten WKZs auch dynamisch und flexibel sein und kann nicht im Vorfeld festgelegt werden. BZW: ich KÖNNTE sie händisch vorher festlegen und fix ins Programm eintragen, aber ich will da am liebsten gar nichts händisch eintragen. Und das habe ich heute auch hinbekommen. Ich brauche nur noch die Feldvariablen-Tabelle und kann Start drücken. :-)

Morgen, wenn ich das Programm poste, seht ihr ja die Struktur. Die Suche nach dem nächsten zu verwendenden Werkzeug habe ich (aus meinem Gedächtnis heraus) ungefähr folgendermaßen gelöst:

COUNT=1 <---- zähler für den nächsten Feldindex. Jeweils nach dem Bohren kommt COUNT=COUNT+1
R148=0 ; Schleifenzaehler Nullsetzen
R202=SK[COUNT,2] ;
FOR ZAEHLER=1 TO 100
IF SK[COUNT+R148,2]==0 GOTOF ENTSCHEIDUNG: ;Damit nach dem letzten eingetragenen Feldindex nicht weiter gesucht wird
IF SK[COUNT+R148,2]>R202 GOTOF WKZBEREITSTELLUNG ; Wenn Bohrung größer, als aktuelle Bohrung, dann WKZ bereitstellen
R148=R148+1
ENDFOR

ENTSCHEIDUNG:
IF SK[COUNT,2]<5 GOTOF BOHREN: ; Sprungbefehl. Bohrungen unter 5mm BOHRE ich
IF SK[COUNT,2]>4.5 GOTOF FRAESEN: ; Sprungbefehl. Löcher oberhalb 4.5mm Bohrer fräse ich dann mit Schaftfräser 4mm

GOTOF ENDE: ; ist eigentlich nicht nötig, weil das ENDE in den bereichen Bohren/Fräsen erfolgt


WKZBEREITSTELLUNG:
R333=SK[COUNT+R148,2]
T=WKZ[R333*10] ; Warum *10? Siehe weiter unten.
R148=0
GOTOB ENTSCHEIDUNG


BOHREN:
bla bla
diversen Berechnungen
R202=SK[COUNT,2]
T=WKZ[R202*10]
M6
TC befehl
Bohrzyklus
count=count+1
IF SK[COUNT, 2]=R202 GOTOB BOHREN



FRAESEN:
bla bla
diversen Berechnungen
R202=SK[COUNT,2]
T=WKZ[R202*10]
M6
TC befehl
Kreistasche
COUNT=COUNT+1
IF SK[COUNT, 2]=R202 GOTOB FRAESEN


ENDE:
bla
bla
M17


Warum habe ich die Bohrung mit Faktor 10 multipliziert? Weil ich zb folgende Bohrer besitze: 1.0 ; 1.2 ; 2.0 ; 2.5 usw usf ...

Da ich beim Anlegen von Strings nur Ganzzahlen verwenden kann (siehe meine Frage zuletzt weiter oben), habe ich mich dazu entschlossen, die Werkzeuge folgendermaßen abzulegen:

WKZ[10]="Boh_1.0_MM"
WKZ[12]="Boh_1.2_MM"
WKZ[17]="Boh_1.7_MM"
WKZ[20]="Boh_2.0_MM"
usw usf

Alles in allem ist es vermutlich nicht besonders elegant, funktioniert aber. All das habe ich jetzt so aus meiner Erinnerung niedergeschrieben. smile.gif

Der Beitrag wurde von ingo1974 bearbeitet: 17.12.2015, 17:33 Uhr
   
Beitrag 17.12.2015, 18:00 Uhr
Andy742000
Andy742000
Level 7 = Community-Professor
*******
Gruppe: Banned
Mitglied seit: 15.09.2012
Beiträge: 3.725
Hallo Ingo

Da ich ja nun schon etwas Einblick bekommen habe, worauf du hinaus willst würde ich dir folgende Programmstruktur vorschlagen!

Du hast dein Feld mit den Werten
0 = Bearbeitungsoption Bohren / Fräsen / Anfasen oder den Kombinationen dazu
1 = Werkzeugdurchmesser
2 = Bearbeitungs-/Bohrungsdurchmesser
3 = X Position
4 = Y Position
5 = Winkel der Spindel
6 = Z Starthöhe
7 = Z Endtiefe
8= Fasengröße

So nun hätten wir das geklärt

Dann fragen wir ab welche WZ im Magazin sind. Und sortieren in ein 2. Feld anhand der ersten Tabelle wieviele Bearebitunsoptionen es mit jeweils dem vorgesehenen Werkzeug gibt. Anhand dieser Reihenfolge bestimmen wir nun die WZ_Platz Tabelle, in welcher chronologische Reihenfolge der Werkzeugaufruf und der der Folgewerkzeuge steht.
Und der Rest sind dann nur paar Schleifen .
Somit kannst du mit einem einzigen Programm einem Feld- Unterprogramm und einem Zeiger der die Anzahl der Bohrungen enthält so viele verschiedene Werkstücke fertigen wie du willst.

-guest
ich weiss das ist eine komplexe Sache, aber als Lehrbeispiel sollte das mehr als gut geeignet sein "Ingo" alle Tricks auch mit leichter Unterstützung beizubringen wink.gif

MFG

Andy


--------------------
MfG
Andy

-------------------------------------------------------------------------------------------------------------------------


4 BIT NC, Kugelschrittschaltwerk
Numerik 600 + Lochstreifen
und nun nicht weiter gekommen als bis zur Sinumerik ;-)

PS : Ich hasse R- Parameter ! Aus Rxxx wird unter Beachtung der Mond-Parabel und der "ERDschen" Glockenkurve nach der Division mit PI/8 + Werkhallenhöhe ein neuer sinnvoller Parameter Rxxx

Impressum: Wer Rechtschreib- oder Grammatikfehler findet darf sie behalten, sind kostenlose Beigaben des Autors
   
Beitrag 17.12.2015, 18:16 Uhr
Guest_guest_*
Themenstarter
Gast


Hallo Ingo,
wie Andy schon am Anfang bemerkte, ist dein "Projekt" recht abitioniert. Dafür also nochmal Respekt. Ich hätte mir das mit diesem Wissensstand nicht zugetraut. Deshalb auch Respekt vor deinem Mut. wink.gif
Ambitionierte Projekte von wissensdurstigen Zeitgenossen unterstütze ich natürlich gerne.
Auch ich habe die Handbücher nicht auswendig auf der Pfanne. Ich weiß allerdings wo ich suchen und nachlesen muß. wink.gif Und auch mir geht mal die Eine oder Andere Beschreibung durch die Lappen und brauche Hilfe. (meist nur zur Selbsthilfe)

Deshalb werde ich mal versuchen eine möglichst knappe und möglichst gut verständliche Lösung der Probleme zu finden und diese ebenfalls bis Morgen hier vorstellen. Bei Erklärungsbedarf wird natürlich kommentiert.
Dabei gehe ich vom Ist-Zustand aus. Also Positionspunkte in sortierter Durchmesser-Reihenfolge.
   
Beitrag 18.12.2015, 18:28 Uhr
Guest_guest_*
Themenstarter
Gast


Hallo Ingo

Um nun die Fragen von Gestern noch zu beantworten:
Leider hat sich seit der Einführung von JobShop auch der Begriff "Label" in den Sinumerik-Sprachgebrauch eingeschlichen.
Um Verwechslungen mit der Funktionalität des "LABEL" von HH zu vermeiden, bleibe ich beim alten Begriff "MARKE", der nach der Wortbedeutung das gleiche meint: Eine Kennzeichnung.
Bei der Sinumerik müssen diese Marken, um sicher zu funktionieren, einen eindeutigen Namen im Format "Zeichenkette:" haben.
Eine solche "MARKE" hat keine weitere Funktion, als eine Kennzeichnung, die aber auch als Sprungziel angegeben werden kann. Logisch ist es eine Erweiterung des alten "Hauptsatzes:". N20 ist ja nichts weiter als ein "Nebensatz", der übrigens nicht mehr angesprungen werden kann.
R-Parameter:
Hier teile ich wahrscheinlich die Meinung Vieler, die "hauptberuflich" mit indirekter Programmierung zu tun haben.
R-Parameter sind ganz nützlich um "mal eben" etwas auszuprobieren. Auch einfache Zähler für die Produktion lassen sich schnell und bequem damit realisieren.
Ein Zettel mit der Erklärung dazu sollte allerdings neben dem OP (OperatingPanel) pappen, sonst weiß kein Sch...n welchen Wert z.B. R258 repräsentiert.
Wobei ich R-Parameter > 100 für überflüssiger als einen Kropf halte. Ich persönlich nutze maximal 5-10 R-Parameter.
In etwas komplexeren Programmen verliert auch der versierteste Programmierer mit R-Parametern schnell den Überblick.
Dafür gibt es GUD's und die im Programm zu erstellenden LUD's, die mit "sprechenden" Namen versehen werden können. Das heisst der Name der Variablen sollte bereits deren Bedeutung erklären. Damit sind dann auch die meisten Kommentare überflüssig. Und selbst in komplizierten Verschachtelungen bleibt der Sinn noch durchschaubar.
Beispiel:
R55=R55+R258 ;wäre recht nichtssagend
Piece_count=Piece_count+Piece_inc ; Darunter kann man sich schon eher vorstellen, daß es sich um einen Stückzähler handeln könnte.
Allerdings ist die Verwendung anglizerter Namen mit der Gefahr verbunden mit Wortbefehlen der Sinumerik kollidieren zu können. Aus diesem Grund verwende ich oft deutsche Abkürzungen, die allerdings auch oft mehr Zeichen enthalten, was die Lesbarkeit, besonders im Steuerungs-Editor, sehr einschränken kann.
Eine Strukturierung der Variablen nach Art der objektorientierten Sprachen ist auch recht sinnvoll, weil übersichtlicher. Allerdings darf kein "." im Namen vorkommen. Dafür nutze ich den "_".

@Andy
Ich würde für den Anfang mal nur die "Tabelle vom Konstrukteur" heranziehen. Diese Tabelle enhält die Werte: C, Z und den Bohrdurchmesser.
Die Generierung der Werkzeugnamen aus den Durchmessern der Tabelle und die Anwahl des Folgewerkzeugs zur Laufzeit der Bearbeitung ist bereits etwas aufwändig.
Eine Magazin-Abfrage zur Existenz der benötigten Werkzeuge ist noch mal ein Gimmick für etwas weiter Fortgeschrittene. Dat mutt nich.
Ein Programm das die benötigten Bohr-Werkzeuge nach Tabelle richtig aufruft ist m.E. schon mal komplex genug.
Daß das auch noch verschachtelter und komplexer geht... klar. Dabei lernt man aber nur, daß man überfordert ist und nur noch "Haltestelle" versteht.

@Ingo
Jetzt bin ich mal auf dein Programm gespannt.
Meins ist soweit lauffähig.
ich stell's aber erst ein, wenn ich deine Version gesehen habe.
   
1 Besucher lesen dieses Thema (Gäste: 1)
0 Mitglieder: