Powtran FU Ansteuerung (Modbus) mit LinuxCNC

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Bin unterdessen einen Schritt weiter!

      Habe herausgefunden, dass jeder Pin welcher unter custom_postgui.hal definiert ist im custompanel nur einmal verwendet werden darf.
      Wenn ich ihn 2x verwendet habe dann gab es einen Fehler...

      Habe den Pin jetzt einfach 2x mit verschiedenen Namen im custom_postgui.hal angelegt und so gehts ;)


      Werde mich wieder melden, sobald meine Konfiguration fertig ist :)


      LG Michi
    • Hallo zusammen!

      Besten Dank für alle die mir hier geholfen haben!!


      Es läuft nun alles wie gewünscht :)


      Im Anhang sind die Files welche so jetzt mit dem Powtran und LinuxCNC funktionieren.
      Nicht vergessen bei LinuxCNC Versionen unter 2.8 die mb2hal einzubinden wie in diesem Thread von Lars erklärt.

      Source Code: custom.hal

      1. #=======================================================================#
      2. #Custom Hal: #
      3. #Hal Datei für: - Modbus (RS485) Kommunikation mit POWTRAN FU #
      4. #(Diese Datei wird bei Ausführung von stepconf überschrieben!!) #
      5. # #
      6. #Michael Sutter, last edit: 10.07.2019 #
      7. #=======================================================================#
      8. #=======================================================================#
      9. #.ini Datei laden:
      10. loadusr -Wn powtran mb2hal config=mb2hal.ini
      11. #=======================================================================#
      12. #Funktionen laden und initialisieren:
      13. loadrt mux4 names=mux4.fu.runmode #Multiplexer -> Wählt 1 von 4 Zuständen aus Liste (je nach Zustand von .sel)
      14. loadrt mult2 names=mult2.fu.freq.send,mult2.fu.freq.return #Multiplikation -> Multipliziert 2 Signale
      15. loadrt limit1 names=limit1.fu.send.freq.check,limit1.fu.return.drz.check #Grenzwertüberprüfung -> Prüft ob Wert zwischen Max und Min-Wert
      16. loadrt comp names=comp.fu.return.error.state #Komparator -> Prüft ob Wert grösser oder kleiner ist als Sollwert
      17. loadrt and2 names=and2.read.estop #UND Verknüpfung -> Prüft ob beie Eingänge 1 sind
      18. loadrt estop_latch names=estop_latch.axis #Notstop -> Schaltet Notstop ein oder aus
      19. loadrt near names=near.soll.drz #Bereichsprüfung -> Prüft ob Werte innerhalb eines bestimmten Bereichs
      20. #Hal Komponenten dem Servo-Thread zuweisen:
      21. #(Servo-thread -> für langsamere Aufgaben (reicht für Modbus))
      22. addf mux4.fu.runmode servo-thread
      23. addf mult2.fu.freq.send servo-thread
      24. addf mult2.fu.freq.return servo-thread
      25. addf limit1.fu.send.freq.check servo-thread
      26. addf limit1.fu.return.drz.check servo-thread
      27. addf comp.fu.return.error.state servo-thread
      28. addf and2.read.estop servo-thread
      29. addf estop_latch.axis servo-thread
      30. addf near.soll.drz servo-thread
      31. #=======================================================================#
      32. #Spindel Start / Stop:
      33. #Parameter: Start Vorwärts (CW) / Start Rückwärts (CCW) / Stop
      34. setp mux4.fu.runmode.in0 6 # Stop (Bremsen...Stop) -> Powtran Register: 0x0006
      35. setp mux4.fu.runmode.in1 2 # Start Rückwärts (CCW) -> Powtran Register: 0x0002
      36. setp mux4.fu.runmode.in2 6 # Stop (Bremsen...Stop) -> Powtran Register: 0x0006
      37. setp mux4.fu.runmode.in3 1 # Start Vorwärts (CW) -> Powtran Register: 0x0001
      38. net spindle-on motion.spindle-on => mux4.fu.runmode.sel0 #Spindel Start (Softwarebutton LinuxCNC) -> Parameter Rückwärts (CCW) laden
      39. net spindle-fwd motion.spindle-forward => mux4.fu.runmode.sel1 #Spindel Vorwärts (Softwarebutton LinuxCNC) -> Parameter Vorwärts (CW) laden
      40. net spindle-runmode mux4.fu.runmode.out => powtran.runmode.command #-> Parameter an mb2hal.ini übergeben und an POWTRAN senden...
      41. #=======================================================================#
      42. #Frequenzberechnung:
      43. #Drehzahl aus LinuxCNC in Prozentsatz von Maximalfrequenz am FU umrechnen
      44. #Prozentsatz * 100 damit keine Nachkommastellen übertragen werden müssen
      45. #-> Minimaldrehzahl: 2400 U/min = 40 Hz = 10% = 1000 (Prozent * 100)
      46. #-> Maximaldrehzahl: 24000 U/min = 400 Hz = 100% = 10000 (Prozent * 100)
      47. net axis-spindle-drz motion.spindle-speed-out-abs => mult2.fu.freq.send.in0 #<- Drehzahl aus LinuxCNC einlesen...
      48. setp mult2.fu.freq.send.in1 0.416667 #(Drehzahl * 0.416667) = Freq in % /-> 100/24000 * 100 = 0.41667 => Prozentwert der Drezahl * 100
      49. net spindle-speed-raw mult2.fu.freq.send.out => limit1.fu.send.freq.check.in #-> an Min / Max Prüfung weitergeben...
      50. #Prüfen ob Drehzahl gültig (im Range):
      51. setp limit1.fu.send.freq.check.min 1000 #Minimale Drehzahl -> 2400 U/min (40 Hz) => 2400 * 0.416667
      52. setp limit1.fu.send.freq.check.max 10000 #Maximale Drehzahl -> 24000 U/min (400 Hz) => 24000 * 0.416667
      53. net fu-freq-send limit1.fu.send.freq.check.out => powtran.write.frequency #-> Parameter an mb2hal.ini übergeben und an POWTRAN senden...
      54. #=======================================================================#
      55. #Notstop:
      56. #betätigt Notstop wenn FU Fehlermeldung oder LinuxCNC Notstop generiert
      57. #FU Status auf Fehler prüfen:
      58. net fu-error-state powtran.error.state.float => comp.fu.return.error.state.in0 #<- Fehler - Parameter aus mb2hal.ini kommend von POWTRAN einlesen...
      59. setp comp.fu.return.error.state.in1 1 #Wenn .in0 kleiner als dierser Grenzwert, dann sind keine Fehler vorhanden!
      60. #Schaltet Notstop wenn:
      61. #Fehlermeldung von POWTRAN kommt
      62. #oder Notstop in LinuxCNC Software gedrückt
      63. net axis-read-estop iocontrol.0.user-enable-out => and2.read.estop.in0 #<- Notstop aus LinuxCNC einlesen...
      64. net fu-read-error-state comp.fu.return.error.state.out => and2.read.estop.in1 #<- Fehler Prüfung Modbus
      65. net estop-ok and2.read.estop.out => estop_latch.axis.ok-in #Wenn einer von beiden Fehler anzeigt -> Notstop / Wenn kein Fehler -> Notstop ausschalten
      66. net estop-execute estop_latch.axis.ok-out => iocontrol.0.emc-enable-in #In LinuxCNC Notstop generieren, oder wieder ausschalten
      67. net axis-reset-estop iocontrol.0.user-request-enable => estop_latch.axis.reset #<- Quittierung aus LinuxCNC: dann Notstop zurücksetzten
      68. #=======================================================================#
      69. #Ist-Drehzahl und Solldrehzahl erreicht Anzeige:
      70. #Aktuelle Frequenz vom FU einlesen und in Drehzahl umrechnen:
      71. net fu-read-actual-freq powtran.read.frequency.float => mult2.fu.freq.return.in0 #<- aktuelle Frequenz - Parameter aus mb2hal.ini kommend von POWTRAN einlesen...
      72. setp mult2.fu.freq.return.in1 6 #(Freq * 6) = Drehzahl /-> Freq wird *10 ausgegeben => Bsp.: 40.0Hz => 400 * 6 = 2400U/min
      73. net fu-actual-drz-range-check mult2.fu.freq.return.out => limit1.fu.return.drz.check.in #-> an Min / Max Prüfung weitergeben...
      74. #Prüfen ob Drehzahl gültig (im Range):
      75. setp limit1.fu.return.drz.check.min 2400 #Minimale Drehzahl -> 2400 U/min (40 Hz)
      76. setp limit1.fu.return.drz.check.max 24000 #Maximale Drehzahl -> 24000 U/min
      77. net fu-actual-drz limit1.fu.return.drz.check.out => near.soll.drz.in2 #-> an Bereichsprüfung weitergeben... /Aktuelle Drehzahl an Custom.postgui.hal weitergeben und in LinuxCNC anzeigen...
      78. #Anzeige in LinuxCNC wenn Spindel Solldrehzahl erreicht hat
      79. net axis-spindle-drz near.soll.drz.in1 #<- Solldrehzahl aus LinuxCNC (wird oben bei der Frequenzberechnung eingelesen...)
      80. setp near.soll.drz.scale 1.01 #Toleranzbereich für Vergleich der Soll- und Ist-Drehzahl
      81. net spindle-at-speed near.soll.drz.out => motion.spindle-at-speed #Wenn innerhalb Toleranz -> Spindel ist auf Solldrehzahl an Custom.postgui.hal weitergeben und in LinuxCNC anzeigen...
      82. #=======================================================================#
      Display All

      Source Code: custom_postgui.hal

      1. #=======================================================================#
      2. #Custom Postguide Hal: #
      3. #Hal Datei zur einbindung der Hal Pins in PyVCP #
      4. #(Datei wird nach AXIS und PyVCP ausgeführt) #
      5. # #
      6. #Michael Sutter, last edit: 10.07.2019 #
      7. #=======================================================================#
      8. #=======================================================================#
      9. #Hal Pins die Werte übergeben definieren:
      10. net axis-spindle-drz pyvcp.axis-spindle-drz-bar #<- Solldrehzahl aus LinuxCNC einlesen...
      11. net fu-actual-drz pyvcp.fu-actual-drz #<- aktuelle Drehzahl vom FU einlesen...
      12. net spindle-at-speed pyvcp.spindle-at-speed #<- Pin "Spindel auf Solldrehzahl" einlesen...
      13. #=======================================================================#
      Display All

      Gruss Michi :)

      The post was edited 1 time, last by sutter.michi ().

    • Hier der Rest und die gepackten Dateien zum download.

      XML Source Code: custompanel.xml

      1. <!--
      2. #=======================================================================#
      3. #Custom Panel: #
      4. #PyVCP Panel zur Anzeige der Spindeldrehzahl in AXIS #
      5. #Angezeigt werden: Soll-Drehzahl (von LinuxCNC) #
      6. # aktuelle Ist-Drehzahl (vom FU ausgelesen) #
      7. # Spindel auf Drehzahl (LED zur Visualisierung)#
      8. # #
      9. #Michael Sutter, last edit: 10.07.2019 #
      10. #=======================================================================#
      11. -->
      12. <pyvcp>
      13. <!-- Titel der erweiterten Anzeige -->
      14. <labelframe text="Fräs-Spindel">
      15. <font>("Helvetica",20)</font>
      16. <!-- Tabelle: -->
      17. <table>
      18. <tablerow/>
      19. <tablespan columns="2"/>
      20. <tablesticky sticky="nsew"/>
      21. <label>
      22. <text>" "</text>
      23. <font>("Helvetica",10)</font>
      24. </label>
      25. <!-- Anzeige: Spindeldrehzahl erreicht: -->
      26. <tablerow/>
      27. <tablesticky sticky="w"/>
      28. <label>
      29. <text>"Drehzahl erreicht:"</text>
      30. </label>
      31. <tablesticky sticky="e"/>
      32. <led>
      33. <halpin>"spindle-at-speed"</halpin>
      34. <size>"10"</size>
      35. <on_color>"green"</on_color>
      36. <off_color>"red"</off_color>
      37. </led>
      38. <tablerow/>
      39. <label>
      40. <text>" "</text>
      41. </label>
      42. </table>
      43. <!-- Anzeige: Spindel Solldrehzahl: -->
      44. <table>
      45. <tablesticky sticky="nsew"/>
      46. <tablerow/>
      47. <tablesticky sticky="nsew"/>
      48. <label>
      49. <text>"Drehzahl (U/min):"</text>
      50. <font>("Helvetica",10)</font>
      51. </label>
      52. <tablerow/>
      53. <tablesticky sticky="nsew"/>
      54. <label>
      55. <text>" "</text>
      56. <font>("Helvetica",2)</font>
      57. </label>
      58. <tablerow/>
      59. <tablesticky sticky="nsew"/>
      60. <bar>
      61. <halpin>"axis-spindle-drz-bar"</halpin>
      62. <min_>0</min_>
      63. <max_>24000</max_>
      64. <bgcolor>"grey"</bgcolor>
      65. <fillcolor>"red"</fillcolor>
      66. </bar>
      67. <tablerow/>
      68. <label>
      69. <text>" "</text>
      70. </label>
      71. </table>
      72. <!-- Anzeige: aktuelle Spindel Drehzahl: -->
      73. <table>
      74. <tablesticky sticky="nsew"/>
      75. <tablerow/>
      76. <tablesticky sticky="nsew"/>
      77. <label>
      78. <text>"Drehzahl aktuell (U/min):"</text>
      79. <font>("Helvetica",10)</font>
      80. </label>
      81. <tablerow/>
      82. <tablesticky sticky="nsew"/>
      83. <label>
      84. <text>" "</text>
      85. <font>("Helvetica",2)</font>
      86. </label>
      87. <tablerow/>
      88. <tablesticky sticky="nsew"/>
      89. <bar>
      90. <halpin>"fu-actual-drz"</halpin>
      91. <min_>2400</min_>
      92. <max_>24000</max_>
      93. </bar>
      94. <tablerow/>
      95. <label>
      96. <text>" "</text>
      97. </label>
      98. </table>
      99. </labelframe>
      100. </pyvcp>
      Display All



      Source Code: mb2hal.ini

      1. #=======================================================================#
      2. #MB2HAL: #
      3. #Ini Datei zur Kommunikation eines FU über Modbus (RS485) #
      4. #Diese Datei ist HILFE, MANUAL und HOW-TO in einem! #
      5. # #
      6. #Michael Sutter, last edit: 10.07.2019 #
      7. #=======================================================================#
      8. #=======================================================================#
      9. #Infos:
      10. #Load the modbus HAL userspace module as the examples below,
      11. #change to match your own HAL_MODULE_NAME and .ini file name
      12. #Using HAL_MODULE_NAME=mb2hal or nothing (default): loadusr -W mb2hal config=config_file.ini
      13. #Using HAL_MODULE_NAME=mymodule: loadusr -Wn mymodule mb2hal config=config_file.ini
      14. #Initialisierung:
      15. [MB2HAL_INIT]
      16. #OPTIONAL: Debug level of init and INI file parsing.
      17. # 0 = silent.
      18. # 1 = error messages (default).
      19. # 2 = OK confirmation messages.
      20. # 3 = debugging messages.
      21. INIT_DEBUG=1
      22. #OPTIONAL: HAL module (component) name. Defaults to "mb2hal".
      23. HAL_MODULE_NAME=powtran
      24. #OPTIONAL: Insert a delay of "FLOAT seconds" between transactions in order
      25. #to not to have a lot of logging and facilitate the debugging.
      26. #Useful when using DEBUG=3 (NOT INIT_DEBUG=3)
      27. #It affects ALL transactions.
      28. #Use "0.0" for normal activity.
      29. SLOWDOWN=0.0
      30. #REQUIRED: The number of total Modbus transactions. There is no maximum.
      31. TOTAL_TRANSACTIONS=4
      32. #One transaction section is required per transaction, starting at 00 and counting up sequentially.
      33. #If there is a new link (not transaction), you must provide the REQUIRED parameters 1st time.
      34. #Warning: Any OPTIONAL parameter not specified are copied from the previous transaction.
      35. [TRANSACTION_00]
      36. #Fehler aus FU einlesen:
      37. #Der FU hat verschiedene Fehlermeldungen, diese werden hier alle eingelesen
      38. #NOTSTOP Funktion!
      39. #Powtran Adresse: 0x8000 (-> 32768 Dez)
      40. #Allgememeine Kommunkitaktionseinstellungen:
      41. LINK_TYPE=serial
      42. SERIAL_PORT=/dev/ttyUSB0
      43. SERIAL_BAUD=9600
      44. #Data bits. One of 5,6,7,8.
      45. SERIAL_BITS=8
      46. #Data parity. One of: even, odd, none.
      47. SERIAL_PARITY=none
      48. #Stop bits. One of 1, 2.
      49. SERIAL_STOP=2
      50. #Serial port delay between for this transaction only.
      51. #In ms. Defaults to 0.
      52. # AC10 does not keep up if this value is too small
      53. SERIAL_DELAY_MS=0
      54. MB_SLAVE_ID=1
      55. ##Powtran Adresse: 0x8000 (-> 32768 Dez)
      56. FIRST_ELEMENT=32768
      57. PIN_NAMES=state
      58. #REQUIRED: Modbus transaction function code (see www.modbus.org specifications).
      59. # fnct_03_read_holding_registers (03 = 0x03)
      60. # fnct_06_write_single_register (06 = 0x06)
      61. #fnct_03_read_holding_registers: creates a floating point output HAL pins, also creates a u32 output HAL pins.
      62. #The pins are named based on component name, transaction number and order number.
      63. #Example: mb2hal.00.01 (transaction=00, second register=01 (00 is the first one))
      64. MB_TX_CODE=fnct_03_read_holding_registers
      65. #OPTIONAL: Response timeout for this transaction. In INTEGER ms. Defaults to 500 ms.
      66. #This is how much to wait for 1st byte before raise an error.
      67. ##POWTRAN: Kein Wert angegeben, jedoch mit 250ms getestet!
      68. MB_RESPONSE_TIMEOUT_MS=250
      69. #OPTIONAL: Byte timeout for this transaction. In INTEGER ms. Defaults to 500 ms.
      70. #This is how much to wait from byte to byte before raise an error.
      71. ##POWTRAN: Kein Wert angegeben, jedoch mit 250ms getestet!
      72. MB_BYTE_TIMEOUT_MS=250
      73. #OPTIONAL: Instead of giving the transaction number, use a name.
      74. #Example: mb2hal.00.01 could become mb2hal.plcin.01
      75. #The name must not exceed 32 characters.
      76. #NOTE: when using names be careful that you dont end up with two transactions
      77. #usign the same name.
      78. HAL_TX_NAME=error
      79. #OPTIONAL: Maximum update rate in HZ. Defaults to 0.0 (0.0 = as soon as available = infinit).
      80. #NOTE: This is a maximum rate and the actual rate may be lower.
      81. #If you want to calculate it in ms use (1000 / required_ms).
      82. #Example: 100 ms = MAX_UPDATE_RATE=10.0, because 1000.0 ms / 100.0 ms = 10.0 Hz
      83. MAX_UPDATE_RATE=0.0
      84. #OPTIONAL: Debug level for this transaction only.
      85. #See INIT_DEBUG parameter above.
      86. DEBUG=1
      87. #While DEBUGGING transactions note the returned "ret[]" value correspond to:
      88. #/* Modbus protocol exceptions */
      89. #ILLEGAL_FUNCTION -0x01 the FUNCTION code received in the query is not allowed or invalid.
      90. #ILLEGAL_DATA_ADDRESS -0x02 the DATA ADDRESS received in the query is not an allowable address for the slave or is invalid.
      91. #ILLEGAL_DATA_VALUE -0x03 a VALUE contained in the data query field is not an allowable value or is invalid.
      92. #SLAVE_DEVICE_FAILURE -0x04 SLAVE (or MASTER) device unrecoverable FAILUER while attemping to perform the requested action.
      93. #SERVER_FAILURE -0x04 (see above).
      94. #ACKNOWLEDGE -0x05 This response is returned to PREVENT A TIMEOUT in the master.
      95. # A long duration of time is required to process the request in the slave.
      96. #SLAVE_DEVICE_BUSY -0x06 The slave (or server) is BUSY. Retrasmit the request later.
      97. #SERVER_BUSY -0x06 (see above).
      98. #NEGATIVE_ACKNOWLEDGE -0x07 Unsuccessful programming request using function code 13 or 14.
      99. #MEMORY_PARITY_ERROR -0x08 SLAVE parity error in MEMORY.
      100. #GATEWAY_PROBLEM_PATH -0x0A (-10) Gateway path(s) not available.
      101. #GATEWAY_PROBLEM_TARGET -0x0B (-11) The target device failed to repond (generated by master, not slave).
      102. #/* Program or connection */
      103. #COMM_TIME_OUT -0x0C (-12)
      104. #PORT_SOCKET_FAILURE -0x0D (-13)
      105. #SELECT_FAILURE -0x0E (-14)
      106. #TOO_MANY_DATAS -0x0F (-15)
      107. #INVALID_CRC -0x10 (-16)
      108. #INVALID_EXCEPTION_CODE -0x11 (-17)
      109. [TRANSACTION_01]
      110. #FU Frequenz einlesen:
      111. #Die aktuelle Frequenz des FU wird eingelesen
      112. #Frequenz in Hz * 10 (-> 2400 U/min = 40.0 Hz => Wert 400)
      113. #Powtran Adresse: 0x1001 (-> 4097 Dez)
      114. MB_TX_CODE=fnct_03_read_holding_registers
      115. FIRST_ELEMENT=4097
      116. HAL_TX_NAME=read
      117. PIN_NAMES=frequency
      118. [TRANSACTION_02]
      119. #Spindel Start / Stopp:
      120. #Parameter: Start Vorwärts (CW) / Start Rückwärts (CCW) / Stop
      121. #Powtran Adresse: 0x2000 (-> 8192 Dez)
      122. MB_TX_CODE=fnct_06_write_single_register
      123. FIRST_ELEMENT=8192
      124. HAL_TX_NAME=runmode
      125. PIN_NAMES=command
      126. [TRANSACTION_03]
      127. #Drehzahl (Frequenz):
      128. #Parameter: Drehzahl wurde in Prozentwert der Maximalen Frequenz umgerechnet,
      129. #und auf Gültigkeit überprüft (innerhalb 40...400 Hz (-> 2400...24000 U/min))
      130. #Powtran Adresse: 0x1000 (-> 4096 Dez)
      131. MB_TX_CODE=fnct_06_write_single_register
      132. FIRST_ELEMENT=4096
      133. HAL_TX_NAME=write
      134. PIN_NAMES=frequency
      Display All
      Files