Hallo,
ich habe mich intensiv weiter mit der Fehlersuche beschäftigt. Die Baudrate habe ich in Pictory und bei den Motoren auf 57600 erhöht. Der Bus wird seither jedes mal gefunden.
Zusätzlich habe ich ein kleines und simples Testprogramm geschrieben um die Fehlerwahrscheinlichkeit möglichst gering zu halten. Es ist jetzt so, dass die Motoren in einer Endlosschleife verfahren, jedoch wird zwischendurch immer wieder ein Befehl "verschluckt", was im Produktiveinsatz fatal wäre. In diesem Fall kommt nämlich kein Befehl beim Motor an. Woran das liegt ist mir unklar, da es sich immer um die selbe Abfolge an Befehlen handelt.
Meine Pictory Konfiguration:
- Pictory.JPG (59.23 KiB) Viewed 12007 times
Mein Code:
In diesem Beispiel verfährt absichtlich nur Motor 1 und Motor 3
Code: Select all
import revpimodio2
import struct
import time
motor1= [10, 317, "m1"] # Steigung in mm, Pictory Adresse, Name
motor2= [5, 333, "m2"]
motor3= [90, 349, "m3"]
relPositioning = 4 # Kommando 4 relative Positionierung
f=open("/dev/piControl0","wb+",0)
def ack(motor):
f.seek(motor[1])
ack = struct.pack('HHHHHHHH', 22,0,0,0,0,0,0,0)
f.write(ack)
print("Sende Quittierung" + str(ack))
time.sleep(2)
def calcLsbMsb(incr):
lsb = (incr &0xFFFF)
msb = ((incr >> 16) & 0xFFFF)
print("lsb: " + str(lsb))
print("msb: " + str(msb))
value = msb * 65536 + lsb
print(value)
return(msb, lsb)
def relativePositioning(motor, distance, posSpeed, accelTime, decelTime):
distIncr = int((distance / motor[0]) * 4096) # 4096 increments --> 10 mm
print("Inkremente: " + str(distIncr))
(msb, lsb) = calcLsbMsb(distIncr)
command = struct.pack('<HHHHHH', 4, msb, lsb, posSpeed, accelTime, decelTime)
f.seek(motor[1])
print("relative Positionierung " + motor[2] +": " + str(command))
f.write(command)
def sendZero(motor):
command = struct.pack('HHHHHHHH', 0,0,0,0,0,0,0,0)
f.seek(motor[1])
print("send Zero: " + str(command))
f.write(command)
deviceList = [0, 30, 31] #30 = AIO, 31 = DIO
rpi = revpimodio2.RevPiModIOSelected(deviceList, autorefresh=True)
rpi.io.O_7.value = 1 # M1 Freigabe
rpi.io.O_8.value = 1 # M2 Freigabe
rpi.io.O_9.value = 1 # M3 Freigabe
ack(M1)
ack(M2)
ack(M3)
time.sleep(2)
while True:
sendZero(M1)
for x in range(0, 20):
time.sleep(0.1)
relativePositioning(M1, 1, 50, 500, 500)
for x in range(0, 40):
time.sleep(0.1)
sendZero(M3)
for x in range(0, 20):
time.sleep(0.1)
relativePositioning(M3, 100, 50, 500, 500)
for x in range(0, 40):
time.sleep(0.1)
print("an")
rpi.io.O_14.value = True
rpi.io.O_1.value = True
for x in range(0, 100):
time.sleep(0.1)
rpi.io.O_14.value = False
rpi.io.O_1.value = False
print("aus")
sendZero(M1)
for x in range(0, 20):
time.sleep(0.1)
relativePositioning(M1, 1, 50, 500, 500)
for x in range(0, 40):
time.sleep(0.1)
sendZero(M3)
for x in range(0, 20):
time.sleep(0.1)
relativePositioning(M3, -100, 50, 500, 500)
for x in range(0, 40):
time.sleep(0.1)
print("an")
rpi.io.O_14.value = True
rpi.io.O_1.value = True
time.sleep(10)
rpi.io.O_14.value = False
rpi.io.O_1.value = False
print("aus")
Die Motoren sind die von damals:
- schreiben.JPG (97.59 KiB) Viewed 12007 times
- relativ.JPG (64.83 KiB) Viewed 12007 times