G120C über Profibus mittels pyprofibus ansteuern

mgrave

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich versuche zurzeit den Umrichter G120C von Siemens über Profibus mittels der Python library pyprofibus anzusteuern. Ich bin so weit gekommen, dass ich bis zum Data Exchange komme. Verwenden möchte ich gerne das Telegramm 1 da es recht simpel aufgebaut ist und für erste Testzwecke reicht.

Eins vorweg, wenn ich etwas falsch beschreibe oder ich einen Denkfehler eingebaut habe, würde ich mich über eine Anmerkung sehr freuen. Ich bin relativ neu im Profibus geschehen und lerne sehr gerne dazu!

Nur stehe ich vor dem Problem, das der Umrichter nicht auf meine geschickten Daten korrekt reagiert. Ich rolle das hier erst einmal für die Nachvollziehbarkeit von vorne auf.

In der folgenden Beschreibung beziehe ich mich auf diese Dokumentation von Siemens: G120C

Kapitel 7.2 (Seite 92 im PDF): Kommunikation über Profibus

Der Parameter p0922 ist im Umrichter auf dem Wert 1 eingestellt, da ich das Telegramm 1 verwenden möchte.

Das Telegramm 1 setzt sich aus 2x16 Bit zusammen, somit ergeben sich beim Versenden der Nutzdaten 4 Bytes. Das erste Feld ist das STW1 (Steuerwort), dieses spiegelt ein Bitfeld wieder welches auf Seite 96 beschrieben wird. Das zweite Feld ist der NSOLL_A (die Solldrehzahl).
Mein Vorhaben ist es, den Umrichter als erstes in den Anschaltzustand zu versetzten und die Motoren mit einer bestimmten Drehzahl anzusteuern.

Dafür habe ich folgendes Bitfeld zusammengestellt: 0000000001111111 oder lesbarer in Hex 0x7F für den Steuercode und für die NSOLL_A folgender Hex Wert 0xA1 (kann aber beliebig sein).

Das Ganze möchte ich wie gesagt über pyprofibus ansteuern. Dafür habe ich entsprechend auch schon ein kleines Programm geschrieben, welches die Slaves aus einer .conf Datei ausließt, den Slave mit der .gsd Datei einstellt und den Slave an den Master bindet (Master Addr. 2 und Slave Addr. 14).

Hier der Python code:

import struct import pyprofibus def main(confdir=".", watchdog=None): master = None config = pyprofibus.PbConf.fromFile(confdir + "/umrichter.conf") master = config.makeDPM() # The STW1 and the NSOLL_A payload_data = struct.pack('!HH', 0x00F7, 0x00A1) outData = {} for slaveConf in config.slaveConfs: slaveDesc = slaveConf.makeDpSlaveDesc() # Register the slave at the DPM master.addSlave(slaveDesc) # Set initial output data. outData[slaveDesc.name] = bytearray(payload_data) master.initialize() # Cyclically run Data_Exchange. while True: # Write the output data. for slaveDesc in master.getSlaveList(): slaveDesc.setMasterOutData(outData[slaveDesc.name]) # Run slave state machines. handledSlaveDesc = master.run() # Get the in-data (receive) if handledSlaveDesc: inData = handledSlaveDesc.getMasterInData() # Feed the system watchdog, if it is available. if watchdog is not None: watchdog() if __name__ == "__main__": import sys sys.exit(main())

In der .conf ist auch das Telegramm 1 als Module eingehangen.
Wenn ich jetzt den debug trace sehe ich das das STW1 und auch der ASOLL_W korrekt als Hex über den Profibus verschickt wird. Jedoch bekomme ich vom G120C als response folgendes zurück in ZSW1 und der NIST_A:

ZSW1 = 0xEB40 (in Binär Kodiert mit den ZSW1 Bitfelder ergibt sich 1110101101000000)
NIST_A = 0x0000 (was ja auch logisch ist, da der Umrichter nicht eingeschaltet wird durch das STW1)

Beim initialen Handshake bestätigt der Slave den Master das er korrekt registriert wurde, auch habe ich schon mit dem Oszilloskop die Leitung abgehört, die Daten werden korrekt übertragen.

Meine Vermutung ist ein falsches Steuerwort oder ein Parameter im G120C der nicht richtig gesetzt ist.
Für die Nachvollziehbarkeit hänge ich die .conf und die .py noch hier an (die .gsd lasse ich aus rechtlichen Gründen außen vor)

Das ist akutell mein Stand, ich hoffe, das reicht fürs erste an Informationen, falls ich was vergessen ergänze ich das gerne.

Ich würde mich sehr über Antworten freuen, das würde mir sehr weiterhelfen!

Vielen Dank und einen schönen Abend


Malte
 

Anhänge

  • g120c-controller.zip
    2 KB · Aufrufe: 3
Zuletzt bearbeitet:
das sieht für mich so aus als wenn du beim Steuerwort High-Byte und Low-Byte vertauscht hättest - check das doch mal ...
Falls das so sein sollte dann würde das für den Sollwert genauso gelten ...
Hast du mal das Zustandswort ausgewertet ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe die Byte order von higher auf lower ending mittels pack('<') gepackt, hatte leider den gleichen Effekt.

Ja, das Zustandswort habe ich mittels der Tabelle auf Seite 97 ausgewertet, was ich rausbekomme habe, ist das die Einschaltsperre wohl aktiv ist (vorausgesetzt ich habe das richtig entschlüsselt).

Diese lässt sich wohl deaktivieren, wenn ein erneuter ON1 Befehl gesendet wird, also eine Art toggeln am Umrichter. Das Toggel hat leider auch nicht funktioniert. Meine Vermutung ist deswegen eine Einschaltsperre, die evtl. fest durch einen Parameter im G120C gesetzt ist.
 
Du solltest dir den kostenlosen Starter besorgen, dann kannst du sehen ob deine Signale richtig im FU ankommen.
Status und Steuerwort können Online beobachtet werden.
 
Wo finde ich den Starter den, magst du mir da mehr Infos drüber geben? Und kann ich das Steuerwort dort auch gezielt setzen und den gesammten Trafik auf dem Profibus abhören/sehen?
 
Ein kleines Update von mir, anbei findet sich ein Screenshot von dem Siemens Starter Projekt. Ich habe mich über USB mit dem G120C verbinden und mir die Werte angeschaut. Währendessen hat ein Raspberry Pi über Profibus den obrigen Befehl mit der Solldrehzahl übermittel.

Leider habe ich noch nicht rausgefunden welche Werte ich in das Python Skript übergeben muss damit diese über Profibus korrekt vom G120C gelesen werden. Ich habe in der Dokumentation (diese hier) etwas über den Parameterkanal gelesen (Seite 168 im PDF-Reader). Kann es sein, dass ich nicht nur einfach das Steuerwort (0xF7) und die Solldrehzahl (0xA1) übermitteln muss sondern, den ganzen Parameterkanal beschreiben muss, sodass die Werte in das entsprechende richtige Register reingeschrieben werden?



Screenshot 2023-03-01 162152.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nochmal ein Update, ich weiß jetzt mit sicherheit, das dass Steuerwort 0x047F ist und daruf folgt eine beliebige Solldrehzahl. Herausgefunden habe ich dass, da ich den Umrichter über unsere akutelle Steuerung angesprochen und mir die Werte ausgelesen habe. Dafür bin ich auf das Telegramm 352 umgestiegen. Leider funktioniert das ganze nur noch nicht mit der python library pyprofibus.
Das Telegramm 352 erwartet 12 Bytes, meine payload_data sieht jetzt so aus:


Python:
payload_data = struct.pack('!HHHHHH', 0x047F, 0x0CDD, 0x0000, 0x0000, 0x0000, 0x0000)

Ich beziehe mich wieder auf die Doku und setzte nur das Steuerwort und den Solldrehzahlwert. Die restlichen Bytes bleiben leer.

Sollte nicht, wenn das Steuerwort gesetzt wird, auch die Parameter in die Register übernommen werden? Weil das ich glaube ich noch nicht der Fall.
 
Zuletzt bearbeitet:
ich weiß jetzt mit sicherheit, das dass Steuerwort 0x047F ist und daruf foglt eine beliebige Solldrehzahl.
Ich bin nicht überrascht. Das entspricht dem Standard Profidrive Profil. Danach die Solldrehzahl bis 4000hex entspricht 0...100% gemäss Par. 2000 (glaub ich, war zumindest früher so). Die weiteren Worte des Telegramms werden in die Prozessdatenregister des Umrichters kopiert. Deren Bedeutung/Verknüpfung legst Du für gewöhnlich in der Parametrierung des umrichters bzw des Telegramms fest.
 
Zuletzt bearbeitet:
Hallo,

ein einzelnen Steuerwort reicht nicht aus. Es muß die State-Machine im Umrichter wie in dem von @Plan_B verlinkten Dokument abgearbeitet werden. Dazu muß dann auch das Statuswort ausgewertet werden.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

danke für das verlinkte PDF zum PROFIDrive Standard. Die State-Machine war mir neu. Ich habe das ganze versucht, in das Programm einzubauen. Leider komme ich nicht weiter als der Inhibited, es wird laut dem State-Machine das Wort 0x06 benötigt bzw. in binär 110 um einen wechsel in den State RDY_FOR_SWITCH_ON zu ermöglichen. Das Wort 0x06 wird aber nicht angenommen.


Hier ein Auszug vom Python code, der das Wort sendet.:
Python:
if current_state is None:
    stw_to_check = (inData[8] << 8) + inData[9]
    if (stw_to_check & 0x0040) and not (stw_to_check & 0x0007):
        current_state = StateMachine.INHIBITED
        print("INFO: Set state to INHIBITED")
elif current_state == StateMachine.INHIBITED:
    outData[slave_g120c.name] = bytearray(struct.pack('!HHHHHH', 0x06, 0x00, 0x00, 0x00, 0x00, 0x00))
    print("Trying to change state to RDY_FOR_SWITCH_ON")
    slave_g120c.setMasterOutData(outData[slave_g120c.name])


Anbei auch noch der Log vom output, hier kann man sehen was über den Profibus verschickt wird:

Code:
DPM1: Initialization finished. Running Data_Exchange with slave 14...
PHY-serial: TX   68 0F 0F 68 0E 02 7D 04 7F 0C 42 00 00 00 00 00 00 00 00 5E 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16
INFO: Set state to INHIBITED
PHY-serial: TX   68 0F 0F 68 0E 02 5D 04 7F 0C 42 00 00 00 00 00 00 00 00 3E 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16
Trying to change state to RDY_FOR_SWITCH_ON
PHY-serial: TX   68 0F 0F 68 0E 02 7D 00 06 00 00 00 00 00 00 00 00 00 00 93 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16
Trying to change state to RDY_FOR_SWITCH_ON
PHY-serial: TX   68 0F 0F 68 0E 02 5D 00 06 00 00 00 00 00 00 00 00 00 00 73 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16
Trying to change state to RDY_FOR_SWITCH_ON
PHY-serial: TX   68 0F 0F 68 0E 02 7D 00 06 00 00 00 00 00 00 00 00 00 00 93 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16
Trying to change state to RDY_FOR_SWITCH_ON
PHY-serial: TX   68 0F 0F 68 0E 02 5D 00 06 00 00 00 00 00 00 00 00 00 00 73 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16
Trying to change state to RDY_FOR_SWITCH_ON
PHY-serial: TX   68 0F 0F 68 0E 02 7D 00 06 00 00 00 00 00 00 00 00 00 00 93 16
PHY-serial: RX   68 0F 0F 68 02 0E 08 00 00 00 00 00 00 00 00 EB 40 00 00 43 16

Dabei sieht man, das dass Wort 0x06 nicht vom G120C angenommen wird.

Außerdem ein screenshot von Siemens STARTER:
output-starter-30.03.2023.PNG
 
@Windoze danke für deine Antwort. Somit wäre das Steuerwort um in den State Ready for Switching On zu kommen, 10000000110 oder 0x406 in Hex. Leider bekomme ich auch hier EB 40 als Statuswort zurück. Ich bin auf Telegramm 353 umgestiegen, aber das sollte eigentlich kein Unterschied machen, da laut Doku die Felder gleich sind.
 
Zuletzt bearbeitet:
Zurück
Oben