Nyt on CNC-foorumin tukeminen helppoa!
Maksu onnistuu PayPalin kautta myös kortilla
Konemies kiittää

Heidenhain HE-310 klooni

Aloittaja dzy, 02.11.19 - klo:19:29

« edellinen - seuraava »

0 Jäsenet ja 2 Vieraat katselee tätä aihetta.

dzy

Moro,

Ajattelin avata tälle älämölötykselle oman ketjun jonne laittaa tietoa mitä tuosta saa selville.

Eli olisi tarkoitus koittaa väkertää tuollainen käsikapula Heidenhainin TNC155A ohjaimelle. Vähän tähän tapaan: https://translate.google.fi/translate?sl=de&tl=en&u=http%3A%2F%2Fhsm-aktuell.de%2Fcnc-hr330.htm

Jonkinlaista edistymistä on tässä tapahtunut. Tuo kapulahan juttelee sarjaväylällä ja liittimestä löytyy vain vastaanottava pinni datalle ja käänteinen DTR-signaali. Protokolla millä tuo jutustelu tapahtuu niin on olemattomasti dokumentoitu ja käytetyt kapulat maksaa tonnista ylöspäin ebayssä.



Kapulan luku tapahtuu näyttökortin prosessorilla TMS9995, TMS9902 sarjaporttikontrollerin avustamana.

Tuommoisella olen sitä CNC ohjaintani rääkännyt, STM32F103 (tämä yksilö on kiinan kopio) Tuo logiikkapiiri on tuohon nyt vain jäänyt kiinni, käänsin sillä sarjaportin kun stm32f103 ei osaa sitä ite kääntää, (toiminnallisuus mitä ei sitten tarvittukaan) PIC:eillä on bitti mikä invertoi sarjaportin mutta tässä stm32f103 prossussa ei semmoista ole. DTR pulssi menee Sipexin 232 piirille ja sieltä invertoituna STM:lle EXT0 keskeytyspinniin (EXTI0_IRQHandler). Sarjadata menee myös tuon Sipexin kautta.

Luin tuon prosessorin ohjelman talteen ja disassembloin sen. Tuota koodia nyt olen koittanut ymmärtää. Asiaa ei helpota yhtään miten tuo prossu käsittelee "rekistereitään"... :)
Sain kuitenkin selville sarjaportin asetukset 38400 baudia, parillinen pariteetti, yksi stop bitti ja 8 bittiä dataa.

Joka 6mS välein annetaan 12uS pulssi DTR pinniin, tämä toimii kapulalle synkronointina ja se alkaa lähettämään tavuja pihalle. TNC:n ohjelmassa alustetaan 9 tavua muistissa ja ensimmäinen asetetaan arvoon 0x50 muut nollataan.
Heti tuon muistialueen jälkeen tulee sama määrä tavuja ja ne alustetaan samoin. Jälkimmäiseen kopioidaan ensimmäisen vastaanotetut tavut keskeytyksessä 3 jossa myös annetaan tuo 12uS DTR pulssi.


Lainaa
R0-R15 these are "registers" on interrupt 1 context

intr 1 R0  DC00   xx xx
intr 1 R1  DC02   DC 05 ; LI      r5,>dc05 | MOV     r5,@>dc02
intr 1 R2  DC04   00 05  ; LI      r5,>0050 | LI      r1,>dc04 | MOV     r5,*r1+
intr 1 R3  DC06   00 00  ; CLR     *r1+
intr 1 R4  DC08   00 00  ; CLR     *r1+
intr 1 R5  DC0A   00 00  ; CLR     *r1+
intr 1 R6  DC0C   00 00  ; CLR     *r1+
intr 1 R7  DC0E   00 05 ; MOV     r5,*r1+
intr 1 R8  DC10   00 00 ; CLR     *r1+
intr 1 R9  DC12   00 00 ; CLR     *r1+
intr 1 R10 DC14   00 00 ; CLR     *r1+
intr 1 R11 DC16   00 00 ; CLR     *r1+
intr 1 R12 DC18   00 00 ; reset routine writes R12 the CRU address of TMS9902 here
intr 1 R13 DC1A   xx xx
intr 1 R14 DC1C   xx xx
intr 1 R15 DC1E   xx xx

Muita kuin TNC155 manuaaleja lukemalla olen saanut selville että uudemmissa ohjaimissa lähetetyille tavuille suoritetaan tarkistussumma laskenta, olettaisin tämän olevan jos tässä sellainen on niin tämä BCC. Tuota käytetään jo valmiiksi blockwise transferissa ja sen toteuttaminen on erittäin kevyttä ja helppoa. Myöskin luin jostain että tämä tavumäärä mitä kapula lähettää ei ole välttämättä vakio vaan se voi vaihdella. Jos ei oteta huomioon tuota ensimmäistä tavua (alustettu 0x50) niin jäljelle jäisi 8 tavua, siihen mahtuisi hyvin 4 PLC käskyä (muttei enää tarkistussummaa) Myöskin luin että kapuloilla olisi joku ID, ilmeisesti tuo ensimmäinen lähetetty tavu.

Ohjelmassa erikseen tarkistetaan onko ensimmäinen tavu 0xa_ tai 0x5_ ja siitä sitten ohjelman kulku eriytyy. Jos tavu on 0xa_ niin tavun alimpia neljää bittiä shiftataan oikealle kunnes ne on kaikki nollia, näin saadaan rekisteriin arvo väliltä 1-5. Tuo voisi myös olla lähetettävien tavujen määrä? Jostain luin kuitenkin että tavuja olisi aina 6 (1+5 eli tämä ensimmäinen ja sitten loput)

Itse sarjaportin luku tapahtuu keskeytyksessä 1 ja se onkin melkoisen simppeli! Eli tuo tunkee kaiken saamansa suoraan muistiin. Voi olla että 9 tavua varattua tilaa riittää puskuriksi jos jokin tunkisi sinne enemmän tavuja kuin on varattua muistia. Joka 6mS välein tuo muistiosoitin nollataan takaisin alkuun. Toimii ehkä mutta ei ole kovin elegantti ratkaisu.

LainaaINTR01  STCR    *r1+,8           ; pc:>166c w:>3631     ; Store char ? WP=dc00
        SBO     18               ; pc:>166e w:>1d12     ; RIENB Writing a one to Bit 18 causes the INT output to be active
        RTWP                     ; pc:>1670 w:>0380     ; Return Workspace Pointer (RTWP) Instruction

Ehkä tuota tietoa mitä tuossa alun linkissä oli niin voisi jotenkin koittaa soveltaa.

LainaaThe Heidenhain control outputs a signal every 6 ms, whereupon the handwheel returns a data packet of 4 bytes. 2Byte for identifier, axis keys and UVV key, the remaining 2 bytes return the encoder count value since the last data transmission, as a 16 bit value depending on the direction of rotation + -32000, ie every 6ms the count value is transferred and the counter value is deleted.

dzy

JUMATSUKA! It's ALIVE!!!

Lähetin sille muutaman PLC käskyn ja pöytä lähti rynnimään täpöjä ja näyttöön tuli "KARKEA PAIKOITUSVIRHE!




Lainaa

0x5f ID? ja montako PLC käskyä f-> 4 ?
0x79 0xc2     SET M2498=0x9c2 Activating jog positioning
0x79 0xd0    SET M2512 0x9d0 X+
0x99 0xe0    RESET M2528 0x9e0 X+ Complement
0x00 0x00    NOP

0x5f
0x79 0xc2
0x79 0xd0
0x99 0xe0
0x00 0x00

Heh, lähetin tuon 6mS välein yhtenä pommina... Kumma jos rynni...

dzy

#2
Ilmeisimmin tämä TNC155A ottaa vastaan PLC käskyjä tuolla 0x5_ alkuisilla paketeilla, tämä avaa hurjasti mahdollisuuksia.

Nuo 0xA_ alkuiset paketit voi sitten olla niitä käsipyörän lukemia.

En ole ollenkaan varma minkä TNC:n rauta tuola purkissa on mutta takalapussa lukee TNC155A, ohjaimeni voi olla uudempaa versiota raudan osalta mutta vanhalla softalla. Korttien lukumäärä ei täsmää huoltomanuaalien kanssa.

EDIT: Hmmmm... Ehkä keskellä yötä ennen aamuvuoroa ei ole se paras hetki koittaa räpeltää ja vetää hätäisiä johtopäätöksiä.

Koitin lähettää moniosaisen PLC rimpsun millä aktivoisin [Y] akselin näyttöön... siinä kun mietin sitä niin tuli mieleen ettei se ole mahdollista. PLC:lle pitäisi asettaa 9 eri markkeria (8 bittiä ja strobe)
Ongelmana on että TNC lähettää jatkuvasti tuota DTR pulssia (ei pelkästään käsipyörätilassa) ja tuon rimpsun lähettäminen voi alkaa mistä osiosta tahansa... Koitin sitä kuitenkin ja tuloksena oli että pöytä jälleen kerran nytkähti ja näyttöön tuli karkea paikoitusvirhe...
Paketti alkoi tuolla 0x5f tavulla ja sen jälkeen oli PLC käsky... Ilmeisimmin tuo tarkoittaa jotain aivan muuta kuin että TNC huolisi PLC koodia tuonne. Tuossa nytkäyksessä taisi liikahtaa sekä X että Y. Olisiko niin että tuolla 0x5_ komennolla annetaan suoraan se pulssimuutos sähköpyörältä?

Nyt en usko enää ollenkaan että tuonne voi tunkea PLC käskyjä, koitetaan uudestaan eri strategialla...

dzy

Nonniin...

Noinhan se oli että ajattelin asioita aivan liian vaikean kautta, lähetin sille nyt 0x5f, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ja X-akseli alkoi hilumaan kohti X+ rajaa, joo... stupid me

eli 0x5f ilmeisesti valitsee kaikki akselit (kelvannee myös 0x58) ja sen jälkeen tulee pulssien muutos edelliseen DTR pulssiin verrattuna 16-bittisenä arvona... ei ollut vaikeaa...

[0x5f] [X] [X] [Y] [Y] [Z] [Z] [A] [A]

Muilla 0x5_ arvoilla vissiinkin valitaan sitten vain se haluttu akseli, [0x5(0=X, 1=Y, 2=Z, 4=A)]

Vielä pitää selvittää mitä tuo 0xa_ tekee...

dzy

#4
Tuolla voi tosiaankin ohjata 4 akselia kerralla (tai no en tiiä kun omassa IV-akselissa on vain pelkkä mittalaite kiinni)

Feedoverride ei sanonut mitään, niin voisiko noilla 0xa_ paketeilla antaa jokaiselle akselille oman nopeuden?

https://youtu.be/CiDhmIbKLk8

EDIT: Nyt tuli jännä ilmoitus kun lähetin 0xaf, 0x00, 0xff, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00

"MITTAJÄRJESTELMÄ X VIALLINEN", olisinko antanut liian suuria arvoja? Pitäisikö nuo olla prosentteja? Koneen uudelleen käynnistys niin kaikki on hyvin eli johtunee syöttämästäni biteistä tuo virheilmo. 0xFF on 255 ja koneparametreissä taitaa olla maksimi override 150%, 0x80 mahtuu hyvin ikkunaan kun se on desimaalina 128

EDIT: Sama virheilmo kun lähetin 0xaf, 0x00, 30, 0x00, 25, 0x00, 20, 0x00, 0x00, koitetaan muuttaa nuo BCD-luvuiksi, kyllä se tästä... Voisi kyllä koittaa laittaa kaikki nolliksikin, mutta...

EDIT: Eikun hetkinen... Vähän vaikee tämmöstä räpeltää kun en koskaan ole tuota ohjainkapulaa edes nähnyt... olisiko 0x5_ ei rapid liikkeille ja sitten 0xa_ rapid liikkeille? Nyt lähetin niitä vuoron perään...

EDIT: Tjaa-a, tämä 0xa_ on nyt vähän mysteeri lähetin sille joko 0xa0 tai 0xa1 ja kaksi 10 desimaalia BCD:nä niin sammutti ohjauksen releet eikä TNC enää vastannut nappuloihin... Testasin myös tuon feedoverriden tuolla HR250 pyörällä, eihän se siinäkään vastaa... eli ei overridellä ole mitään vaikutusta käsipyörätilassa :)

Toimiiko tuo kapula niin että siinä on tuo käsipyörä ja sitten pikaliikkeet nappuloilla? Oikeastaan mulle riittää että voin nyt pulssipyörällä ohjata akseleita omatekelekapulalla

EDIT: menisikö nuo 0xa_ alkuiset suoraan korvaamaan PLC:n inputteja? Koodissa on semmoisia kohtia tuon tarkastuksen jälkeen kuin SOCB ja se tehdään jonkun muistiosoitteen kanssa ja tungetaan sinnepäin takaisin. SOCB on TMS9995 prossun käsky joka asettaa  kohteen bitit päälle jos jommassakummassa (lähteessä tai kohteessa) on bitti päällä samassa kohtaa. SOCB eroaa SOC käskystä siinä että vain ylimmät 8-bittiä otetaan huomioon, muihin ei kosketa.

tuolla 0xaf käskyllä ja jollakin payloadin bitillä taisin osua just siihen bittiin joka kertoo onko x-mittalaite kunnossa.

Muistaakseni TNC:n ohjelmisto ymmärtää jotain 64-inputtia/(outputtia), kaikkia niitä ei tässä TNC:ssä ole kytketty ulkoilmaan niin tuolla 0xa_ osoitemuodolla voidaan osoittaa 16 eri paikkaan joissa jokaisessa olisi 8-bittiä eli tulisi 128 eri bittiä mitä voidaan kiusata. Tässä voi olla set/clr tyylinen jako alle 64 niin set ja muut clr? tai sitten vain kylmästi väännetään sekä inputit että outputit yli.

dzy

#5
Pitääpä mennä ja katsoa sillä 951026 koodilla kuinka monta inputtia ja outputtia tuossa oikein on. Tämän mukaan "EINGANGEJA" olisi peräti 128, sopisi hyvin laskelmiin... Aika pitkälle jo päässyt olettamuksilla...  :-X



EDIT: Jeps, 128 inputtia sielä oli. Alussa ne 23 mitkä on kytketty ja sitten samat uudestaan paitsi viimeset 8 bittiä jotka oli ylhäällä koko ajan. Bitit oli kun sauvaa väänsi niin täsmälleen niissä paikoissa mitä manuaalissa lukee. E9 X+, E10 X- jne, koitetaas näillä vai olisiko saksalaisilla sen verran huumorintajua että 0xA_ tarkoittaa aus ja sitten 0xE_ ein? Oletin että tuossa ohjelmassa kun tarkistetaan että onko se ensimmäinen tavu 0x5_ vai 0xA_ niin se kolmas polku mihin tuosta mennään niin on virheilmoitus, mutta voipi olla että se on EINGANG

Joko se nyt sitten olisi (0xA1, 0b00000010  X+:lle ja 0xA1, 0b000000100  X-:lle) tai (0xE1, 0b00000010  X+:lle ja 0xE1, 0b000000100  X-:lle)

EDIT: Kävin kiduttamassa konettani 0xE1, 0b000000100 tavuilla, mitään ei tapahtunut, ei virheilmoa ei mitään. Voisiko tuossa olla myös kapulalle vastaanotto? Jotenkin on semmoinen hämärä muistikuva että pohjalevyssä on parikolme hyppyjohtoa (manuaalissa BR etuliitteellä) niin noiden kautta joku sarjaportti menisi IO-levylle pinneihin (J3 pinnit 7, 10 ja 11 / J4 pinni 11) joihin manuaali kieltää kajoamasta. Sielä on semmoinen pikkuinen nelipinninen liitinkin IO-levyssä, jotenkin tuntuu että menen sinne kohta härppimään myös.

Koitetaan seuraavaksi sillä 0xA_ tavulla kuitenkin...

EDIT: Eipä se silläkään tehnyt tällä kertaa mitään, ei virhettä ei mitään. Koitin samaan aikaan painella sitä pikaliikkeen nappiakin mutta mitään ei taphtunut. Oletin että nuo inputit alkaa nollaosoitteesta, mutta nehän voi olla muuallakin, olisi 16 vaihtoehtoa koittaa kaikki läpi ja sitten toinen mokoma tuolla 0xE_:llä. Koitetaan noita sitten paremmalla ajalla tai ainakin tarvin kätevämmän tavan kiduttaa tuota CNC ohjaintani. Laitan CDC usb sarjaportin tuohon stm32f1 mikroon ja syötän sitä kautta eri vaihtoehtoja ja stm32f1 sitten ajastaa ne DTR pulssiin.

EDIT: No ei varmasti tapahdukaan mitään kun on poistanut tuon kapulan koneparametreistä. Unohin laittaa sen sinne takasin.

Kaikenlaista herjaa ja totaalistoppia tuli kun syötin nuo uudestaan.

dzy

#6
No nyt mulla välähti.... Mähän voisin laittaa GRBL:n tohon stm32f1 lankkuun tai johonkin muuhun ja laittaa sen ulostulon ohjaamaan tuota jyrsintä... Tai sitten LinuxCNC juttelemaan lankun kanssa ja se sitten juttelee TNC:n kanssa (Mach3?)
Voisi myös tehdä valmiita pikaohjelmia kapulaan, ympyröitä ja reikiä jne.

Tuo olisi hienoa jos tuolta löytyisi myös sarjaportin ulostulo ja että noita PLC:n inputteja ja outputteja voisi lukea ja kirjoittaa. Pitääpä kattoa löytyykö koodista sarjaporttiin kirjoitusta.

dzy

#7
Tuommoisia osoitteita ja noista paikoista ne pitäisi löytyä

Ne mitkä kiinnostaa niin on:
M0-M3279 0x000-0xccf
E0-E127     0xcd0-0xd4f
  ?????       0xd50-0xe4f
A0-A63       0xe50-0xe8f



EDIT: 0x5_ käskyn data on big endian muodossa

dzy

#8
Taisin miettiä tämänkin liian vaekeasti, voi olla että tuo 0xA_ käsky ottas 16 bitin payloadin ja laittaa sen sillä soc käskyllä plc:n inputin kanssa. 0xA1 on laiton osoite kun on pariton, etc.

Ilmeisesti kun tungin tuonne mitä tahansa dataa niin asetin x akselin referenssi bitin päälle ja siitä se x akselin mittalaitevirhe. Voi olla että laitoin muitakin mutta jos x akseli tarkistetaan ensin niin se pysähtyy siihen.






dzy

Toisaalta voin helposti emuloida noita pikaliikkeitä tuolla pulssipyöränkin käskyillä. Nopeudet taitaa kyllä jäädä alle koneparametrin pikaliikkeiden... Mutta saisi sellaisen kapulasta asetettavan emuloidun pikaliikkeen nopeuden.

dzy

#10
Minkäänlaista edistymistä ei ole tapahtunut tuon 0xA_ käskyn kanssa. Olen koittanut syöttää sille kaikenlaisia tavuja ja bittimaskeja. Paras lopputulos taitaa olla kun kone sammuttaa releensä. Muut seuraukset on "OHJAUS ELEKTRONIIKKA VIALLINEN B" tai yleisimmin näköjään "MITTAJÄRJESTELMÄ-X VIALLINEN"

Pitänee katsoa koodista tarkemmin mitä ihmettä se oikein haluaa, se vaan on hitusen hankalaa koittaa tuon prosessorin assemblerikäskyjä seurata, varsinkin kun ei ole käsitystä tuon muistikartasta, muutakuin että TMS9902 on CRU väylän osoitteessa 0x0000

EDIT: Taisi vähän liian vikkelään tuo stm32f103 lähettää sarjadatansa saatuaan DTR pulssin, laitoin 100uS paussin siihen ennen kuin se alkaa lähettää. Samoin laitoin joka tavun väliin 100uS paussin. Muutin stop bittien määrän kahdeksi että siihenkin tulee varmasti ainakin yhden baudin paussi tavujen väliin. Huomasin viiveiden tarpeellisuuden kun rääkkäsin konetta tuolla 0x5F käskyllä, joka taitaa olla ainoa "varma" tällä hetkellä. 0x51, 0x52 jne. on epävarmoja.

EDIT: Jeps, taas liikaa olettamuksia. Ainoa minkä saan tuon huolimaan on se 0x5f ja perään 4(kolmen?) akselin pulssimuutos sitten edellisen 16-bittisenä big endian lukuna.  (int16_t signed -32,768..32,767)

Mika K.

Ei ole valitettavasti aiheeseen mitään annettavaa. Muuta kuin se, että hattua nostan ja totean että toiset tekee mitä osaa, toiset mitä haluaa. Jään mielenkiinnolla seuraamaan..
Imagination is more important than knowledge

dzy

Tämä nyt on vain tämmöstä räpeltämistä, olisi paljon helpompaa nuuskia tiedot pihalle siitä kapulasta, mutta kun en semmoiseen pääse käsiksi.

dzy

#13
Tutkailin tuota manuaalin skooppikuvaa ja tavut on kovin tutun tuntuisia jos nyt oikein tuon purin. Viimeinen tavu näyttää pahasti siltä BCC pariteetilta. Nyt tulee pitkä viimeinen tunti olla töimaalla.

Tuossa on oikein kapulan napeillekin annettu numerot. Taisi olla jostain TNC415 manuaalista nämä.

Sopivasta kohtaa otettu tuo kuvakin, ensimmäinen paketti on ehkä 0xA0 ja toinen 0x50


dzy

#14
Nukkumatti voitti eilen illalla. Nyt on lapsukaiset saatu kouluun niin on aikaa taas harrastaa ennen yö vuoroa...

Tuossa olisi nuo EINGANG bitit

Lainaa
0 7 E00 Reference end position X
1 6 E01 Reference end position Y
2 5 E02 Reference end position Z
3 4 E03 Reference end position IV
4 3 E04 Reference pulse suppressor X
5 2 E05 Reference pulse suppressor Y
6 1 E06 Reference pulse suppressor Z
7 0 E07 Reference pulse suppressor IV
0 7 E08 -
1 6 E09 Direction button X+
2 5 E10 Direction button X-
3 4 E11 Direction button Y+
4 3 E12 Direction button Y-
5 2 E13 Direction button Z+
6 1 E14 Direction button Z-
7 0 E15 Direction button IV+
0 7 E16 Direction button IV-
1 6 E17 Feedback: Auxiliary function completed
2 5 E18 Feed rate release
3 4 E19 Manual feed (opens position loop)
4 3 E20 Supervision of contact "Lock for spindle on"
5 2 E21 Rapid traverse button
6 1 E22 Start-button
7 0 E23 Stop-button

Tuossa edellisen postauksen skooppikuvassa saattaa se viimeinen paketti olla [0x50], [0x00 vai 0x80], [0x01 vai 0x00],[0x00],[0x01 vai 0x80],[ (tavu1 xor tavu2 xor tavu3 xor tavu4 xor tavu5) = 0x50]
Vähän jänskättää, loppuu ideat jos ei tuo tee jotain muuta kuin virheilmon tai totaalistopin. Olisi ihan hyvä jos tuo huolisi sen muttei tekisi mitään, sekin kelpaisi. Jotenkin ei ehkä nuo bitit täsmää ylläolevaan taulukkoon...

Koitan lähettää sille 0x50, 0x00,  0x00, 0x00, 0x00, 0x50, ymmärtääkseni tuo ei asettelisi mitään, ainakaan 4 ensimmäisellä tavulla, BCC pariteetti pitäisi täsmätä myös ja vaikka TNC haluaisi enemmän tavuja niin se täsmäisi silti kun loput on nollia. Ainut vain että jos TNC haluaa enempi tavuja niin tuo 0x50 pariteetti sitten menisi ja sössisi jotain.

Powered by EzPortal
SMF spam blocked by CleanTalk