Moin

Also ich hab mir auch eine kleine Controllerplatine gefrickelt.
http://sebastians-site.de/homepage/e...schneider.html

Die redet über RS232 mit nem EMC Hal Modul, was ich in Phyton geschrieben hab.

Code:
#!/usr/bin/python

###
#
# EMC hal modul for hot-needle-cutter
# Sebastian Schumb 2009 (www.sebastians-site.de)
#
###
import hal, time,  serial

hc = hal.component("hot_needle")
hc.newpin("temp_setpoint", hal.HAL_FLOAT, hal.HAL_IN)
hc.newpin("temp_value", hal.HAL_FLOAT, hal.HAL_OUT)
hc.newpin("mc_ready", hal.HAL_BIT, hal.HAL_OUT)
hc.newpin("temp_ready", hal.HAL_BIT, hal.HAL_OUT)
hc.ready()

ser = serial.Serial('/dev/ttyS1', 9600, timeout=0.2)

try:

    while 1:
        hc['mc_ready'] = False
        hc['temp_ready'] = False

        while ser.read(4) != 'ackn':
            ser.write("init")
        
        hc['mc_ready']    = True    

        retries = 0

        while retries <= 5:
                time.sleep(0.1)
                sp = str(int(hc['temp_setpoint'] * 10)+1)
            sp = sp.rjust(4,'0')
            ser.write(sp)
            
            while ser.read(4) != 'ackn' and retries <= 5 :
                ser.write(sp)
                retries += 1

            if retries <= 5:    
                retries = 0
            
            ret = ser.read(4)
            while not ret.isdigit() and retries <= 5 :
                ret = ser.read(4)
                retries += 1
            
            if retries <= 5:    
                retries = 0
            
            ser.write('ackn')
            
            if ret.isdigit() :     
                retf = float(ret) / 10;
                hc['temp_value'] = retf
                if retf >= hc['temp_setpoint']:
                    hc['temp_ready'] = True
                else :
                    hc['temp_ready'] = False
                        
except KeyboardInterrupt:
    raise SystemExit
Ist leider nicht kommentiert (Schande über mich), aber ich denke man kann erkenne worauf es hinaus läuft.
Mittlerweile weiß ich auch von Zustandsautomaten und wie man die für sowas benutzt.
Von daher sollte ich es noch mal in elegant schreiben, wenn ich zeit habe.

An sich wird so kommuniziert :
Code:
Modul : init    uC zurücksetzen
uC :    ackn    acknowledge
Modul : 2578    Soll-Temperatur (257,8°C)
uC :    ackn    
uC :    2380    Ist-Temperatur  (238,0°C)
Modul : ackn    
Modul : 2578    Soll-Temperatur (257,8°C)
Siehe oben.
Das wiederholt sich kontinuierlich, weil so merkt einerseits EMC sofort wenn der uC tot ist und dann wird über den mc-ready Pin der Notaus von EMC getriggert.
Andererseits merkt uC wenn die Verbindung weg ist und schaltet erstmal die Heizung ab.
Man hätte auch eine Art keep-Alive Paket machen können, aber so gehts auch.

Ich hab irgendwann einmal mit M-Code-Scripten rumgespielt um die Temperatur setzen zu können.
Aber die sind irgendwo vergaben.

Gruß
Sebastian