Step 7 840D sl NCU Variablen und Antriebsparameter lesen/schreiben

Zuviel Werbung?
-> Hier kostenlos registrieren
Ist in der Tat schon nochmal deutlich schneller geworden. So funktioniert das gut! 200ms, damit kann ich arbeiten
wenn wir jetzt noch 2 Kanäle zum testen hätte könnte ich möglicherweise 1 Splitting wieder entfernen (oder als Option reinbringen) = noch etwas schneller
und H-Variablen damit wir wirklich testen können ob das so funktioniert

die nächsten Tests sind einfach - nur noch mit SMART Testen und schauen ob du irgendwie Fehler provozieren kannst :)
 

Anhänge

  • main.zip
    12 KB · Aufrufe: 20
Zuletzt bearbeitet:
Kennst du denn noch irgendwelche anderen H-Variablen, die ich noch testen könnte?
Ich glaube gesehen zu haben, dass bei der älteren Maschine (Grob) 2 Kanäle eingerichtet sind, wobei aber alle Achsen dem 1. zugeordnet sind und der 2. sozusagen leer ist. Das Konzept hinter diesen Kanälen leuchtet mir auch noch nicht wirklich ein.. wofür braucht man denn mehrere?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kennst du denn noch irgendwelche anderen H-Variablen, die ich noch testen könnte?
const nck_var_t motorTemperature(eNCK_AreaMainDrive, eNCK_BlockS, 1, 1702, 1, eNCK_MDB_UInt16, 2, "motorTemperature");
const nck_var_t firmwareDate(eNCK_AreaMainDrive, eNCK_BlockS, 1, 1798, 1, eNCK_MDB_UInt16, 2, "firmwareDate");
const nck_var_t firmwareVersion(eNCK_AreaMainDrive, eNCK_BlockS, 1, 1799, 1, eNCK_MDB_UInt16, 2, "firmwareVersion");


Ich glaube gesehen zu haben, dass bei der älteren Maschine (Grob) 2 Kanäle eingerichtet sind, wobei aber alle Achsen dem 1. zugeordnet sind und der 2. sozusagen leer ist.

in der Grob1.txt aus
Test_Ergebnisse10.zip gibt es aber kein c[2]rpa[0] => AGL40_NO_DATA_ERROR - normalerweise bedeutet es das du keinen 2. Channel hast

bau mal die ein
const nck_var_t maxnumDrives(eNCK_AreaNCK, eNCK_BlockY, 1, 17, 1, eNCK_MDB_UInt16, 2, "maxnumDrives");
const nck_var_t maxNoOfChannels(eNCK_AreaNCK, eNCK_BlockY, 1, 68, 1, eNCK_MDB_UInt16, 2, "maxNoOfChannels");

Das Konzept hinter diesen Kanälen leuchtet mir auch noch nicht wirklich ein.. wofür braucht man denn mehrere?
Channels auf der NC sind wie Threads auf dem PC - z.B. während die Maschinen was macht möchtest du mit anderen Achsen reinfahren und Teil vorbereiten oder sowas - klar geht das auch mit einem Channel(Thread)
aber manchmal ist es doch schöner/einfacher - das gibt es dann so SETM, WAITM-Befehle (und weiteres) für die Sychronisation

https://www.youtube.com/watch?v=Bs8nNZaiDCQ
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
https://cache.industry.siemens.com/dl/files/938/49245938/att_1126/v1/FBA_0510_de.pdf - da findet man 1798 und 1799

also

Code:
  {
//firmwaredate
    unsigned short date = 22075;
    int tag = date / 1000;
    int rest = date % 100;
    int monat = rest / 10;
    int jahr = rest % 10;
    printf("%02d.%02d.%d\n", tag, monat, jahr);
  }
  {
//firmware_version
    unsigned short version = 21000;
    int major = version / 10000;
    int rest = version % 10000;
    int minor = rest / 100;
    int build = rest % 100;
    printf("%d.%d/%d\n", major, minor, build);
  }
 
Zuletzt bearbeitet:
Also, bislang folgendes:
Habe versucht für die AreaMainDrive funktionierende Variablen zu finden. Auf den BlockM kann man damit genauso zugreifen wie über FeedDrive,
auf die 0x8er Blöcke kann man über MainDrive nicht zugreifen. Im BlockS habe ich unabhängig von Achse (=Unit) keine Variablen gefunden.

Ich denke die Grob verfügt schon über 2 Kanäle, kann die nämlich im HMI auswählen..
Der RPA(0) im C2 ist =0, kann man auch lesen (Channel-No. = Unit).
Versuche ich RPA(0) C3 zu lesen kommt ein Fehler, C2 gibt 0.

Was allerdings funktioniert und auch Daten liefert: Über AreaChannel / BlockM für Channel 2 (=Unit2) die Kanalspezifischen-MD's zu lesen, z.B. 20060[0] (Spalte=20060, Zeile=1) "Geometrieachsname im Kanal" --> liefert "X" oder 20070[4] (Spalte=20070, Zeile=5) "Maschinenachsnummer gültig im Kanal" liefert bei Channel / Unit =1 den Wert 5, bei Channel / Unit =2 den Wert 2, entsprechend der Anzeige im HMI.
 
Nachtrag: Der Parameter "current_cycle_time" AreaMainDrive/BlockM/Spalte 1000 hat ja immer 0 geliefert.
Im HMI steht bei mir unter p1000 "Makro Konnektoreingänge (...)" mit Wert 0, versuche ich den nächsten Parameter p1082 "Maximaldrehzahl" mit Spalte =1080 zu lesen bekomme ich den korrekten Wert (5928 [U/min]). Die gelesene 0 war also wohl immer korrekt, nur nicht der gesuchte Parameter...
 
bisher splitte ich auch die Channels - mach mal einen Test ob du Unit-gemixte Channel-Variablen im BLOCK-Mode lesen kannst (dein letzten Test kopieren, nur Channel-Variablen unterschiedlicher Units, und nicht mit ::SMART sondern ::BLOCK) geht das?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, das geht nicht, siehe Ergebnisse.
Verschiedene Blöcke auf ein mal aus dem gleichen Channel funktioniert,
der gleiche Block aus mehreren Channels gleichzeitig geht NICHT.

Also muss das Splitting so bleiben... richtig?
Was muss nun noch getestet werden damit das Splitting übernommen werden könnte?

Anhang anzeigen Release_Test_3.zip
 
Verschiedene Blöcke auf ein mal aus dem gleichen Channel funktioniert,
der gleiche Block aus mehreren Channels gleichzeitig geht NICHT.

also
verschiedene Blöcke, gleicher Channel = OK
gleiche Blöcke, verschiedene Channels = geht nicht (muss also gesplittet werden)
verschiedene Blöcke, verschiedene Channels = ???

Was muss nun noch getestet werden damit das Splitting übernommen werden könnte?
ich denke wenn du (bis auf den ??? Fall) nichts mehr findest könnte man es integrieren - jetzt fehlt noch Feedback von den Deltalogics dazu - und Zeit
 
Splitting ist noch nicht ganz richtig - ich bastel noch ein bisschen

Update: ist doch ok!

Update: du kannst auf jeden Fall noch die anderen Variablen von mir maxChannels, maxDrives (was davon eben funktiniert) usw. einbauen - dann haben die Deltalogics gleich mehr (sinnvolles) zu testen
 
Zuletzt bearbeitet:
So, kurzes update: Ich hab die letzten Tage noch einiges getestet, bisher hat alles funktioniert, keine Fehler!
Bereite gerade noch einen letzten "großen" Test vor wo ich alle Variablen reinpacke die mir bisher untergekommen sind...
Wenn ich dann morgen oder am Freitag nochmal an die Maschine komme lasse ich den laufen und berichte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich komme nach längerem wieder dazu Antriebsparameter per externen Programm zu lesen.

Ich hab mir in der PLC einen FB geschreiben, der mir bestimmte Antriebsparameter per FB2 liefert. Anhand eines Übergabeparameters wähle ich die Achse aus.

Zum Testen greife ich wieder auf altbekannten Parameter r0035 zurück.

Code:
bereich_u_einheit : BYTE := B#16#A1;

In der PLC rechne ich nun 0xA0 + Achsnummer und bekomme meine gewünschte Temperatur.

Wenn ich dies nun in meinem externen Programm mache kommt der falsche Wert oder Zugriffsfehler.

Code:
            byte bereich_u_einheit = byte.Parse("A1", System.Globalization.NumberStyles.HexNumber);
            byte _bereich = (byte)((bereich_u_einheit & 0xE0) >> 5);      // (bereich_u_einheit & 2#11100000) schiebe rechts um 5 Bit
            byte _einheit = (byte)(bereich_u_einheit & 0x1F);                 // & 2#00011111

Hab mir die Wireshark des HMI angesehen und folgendes herausgefunden.

Achsen:AX1AX2AX3AX5AX7AX8AX12AX23AX25
Name:X_1_Y_1_Z_1_B_1_A_1_SP1Q_1_Y_2_ZM1_
DP:DP3.SLAVE3: DRV_3.3:4(11)DP3.SLAVE3: DRV_3.3:5(12)DP3.SLAVE3: DRV_3.3:7(13)DP3.SLAVE15: DRV_3.15:4(15)DP3.SLAVE15: DRV_3.3:5(17)DP3.SLAVE3: DRV_3.3:3(18)DP3.SLAVE15: DRV_3.15:2(22)DP3.SLAVE3: DRV_3.3:6(33)DP3.SLAVE15: DRV_3.15:3(35)
NCK Area:555555555
Unit:235891647
Column:353535353535353535
Line:111111111
Module:0x820x820x820x820x820x820x820x820x82
LineCount:111111111

Nun meine Frage.

In der PLC entspricht "_bereich" der Achsnummer.
Im S7Com "_bereich" -> "Unit" jedoch nicht.

Wie komme ich nun anhand der Achsnummer auf die richtige Unit?
 
Edit: hab nicht richtig nachgedacht - 0xA0 ist deine Bereich=5 und dahinter kommt dann die Achsen-Nummer

kannst du das Wireshark-Log hier einstellen - und genau den PLC-Code den du fuer den Zugriff verwendest (der Schlussendliche aufruf an den FB2)?
User st_rupp hatte mal gemeint die Unit könnte dem DO-Index (keine Ahnung was das ist?) entsprechen





 
Zuletzt bearbeitet:
Hab von unserem Antriebler gerade die Lösung bekommen.
Die Unit bezieht sich auf die Achstopologie.

Heist auf deutsch:
Die Antriebe werden in der Reihenfolge Nummeriert, in der Sie mit der NC verbunden sind.

Bei der 840d bekommen die Antriebe je nach NC bzw NX einen fortlaufenden Adressbereich zugewiesen. Beginnent bei 4100.
Diese Adressen sind dem Busssteckplatz fest zugewiesen und auch in der Hardwarekonfig hinterlegt.

Ich vermute mal das Siemens anhand der Hardwarekonfig die richtige Unit zur Achsnummer ermittelt.
 
Zurück
Oben