From 13119dbb40ffad8533a73180a49867037b8ff067 Mon Sep 17 00:00:00 2001
From: Martin Teichmann <martin.teichmann@xfel.eu>
Date: Fri, 19 Feb 2021 16:37:49 +0100
Subject: [PATCH] now I can move motors on the CHEM

---
 ebpfcat/chem.py      | 39 +++++++++++++++++++--------------------
 ebpfcat/devices.py   |  7 ++++++-
 ebpfcat/ethercat.py  | 35 +++++++++++------------------------
 ebpfcat/terminals.py |  3 ---
 4 files changed, 36 insertions(+), 48 deletions(-)

diff --git a/ebpfcat/chem.py b/ebpfcat/chem.py
index 807b350..da9d7a5 100644
--- a/ebpfcat/chem.py
+++ b/ebpfcat/chem.py
@@ -1,5 +1,5 @@
 from asyncio import gather, sleep, ensure_future
-from struct import unpack
+from struct import unpack, pack
 from .terminals import EL7041, EL5042, Skip
 from .devices import Motor, Counter, AnalogInput
 from .ebpfcat import FastEtherCat, FastSyncGroup, SyncGroup
@@ -31,6 +31,10 @@ async def main():
     #await te12.sdo_write(b"\x1a", 0x8018, 0x16)  # singleturn
     await te12.sdo_write(b" ", 0x8018, 0x16)  # singleturn
 
+    await tm2.set_state(2)
+    await tm2.sdo_write(pack("<H", 2500), 0x8010, 0x1)  # current
+    await tm2.sdo_write(pack("<H", 24000), 0x8010, 0x3)  # voltage
+
     for i in [1, 2, 3]:
         print(f"S{i:x}", await te12.sdo_read(0xB018, i))
     print(f"Pos", await te12.sdo_read(0x6010, 0x11))
@@ -53,31 +57,26 @@ async def main():
 
     fsg = SyncGroup(ec, [m1, aie, aim])
 
+    m1.max_velocity = 10000
+    m1.proportional = 23
+    m1.target = 185525000
+
     print("do start")
     fsg.start()
     print("did start")
 
-    for i in range(10):
-        print("P", m1.current_position, hex(aie.value), hex(aim.value))
-        await sleep(0.02)
-    for i in [1,2,3,4,5,6,7]:
-        print(f"I{i:x}", unpack("B", await tm2.sdo_read(0x6010, i))[0])
-    for i in [1,2,3]:
-        print(f"O{i:x}", unpack("B", await tm2.sdo_read(0x7010, i))[0])
-    print(f"V", unpack("H", await tm2.sdo_read(0x7010, 0x21))[0])
-    m1.velocity = 1000
-    m1.enable = True
+    print(f"P0", unpack("I", await tm2.sdo_read(0x6010, 0x14))[0])
     await sleep(0.1)
-    for i in [1,2,3]:
-        print(f"O{i:x}", unpack("B", await tm2.sdo_read(0x7010, i))[0])
-    print(f"V", unpack("H", await tm2.sdo_read(0x7010, 0x21))[0])
-    m1.velocity = 0
-    #m1.enable = True
-    for i in range(10):
-        print("P", m1.current_position, hex(aie.value), hex(aim.value))
+    m1.set_enable = True
+    for i in range(20):
+        print(f"M {m1.current_position:12} {m1.velocity:5} {aie.value:4x} {aim.value:4x}")
+        await sleep(0.2)
+    m1.set_enable = False
+    m1.max_velocity = 0
+    for i in range(20):
+        print(f"S {m1.current_position:12} {aie.value:4x} {aim.value:4x}")
         await sleep(0.02)
-    #m1.enable = False
-    m1.velocity = 0
+    print(f"P1", unpack("I", await tm2.sdo_read(0x6010, 0x14))[0])
 
 if __name__ == "__main__":
     from asyncio import get_event_loop
diff --git a/ebpfcat/devices.py b/ebpfcat/devices.py
index e90a075..b82cae2 100644
--- a/ebpfcat/devices.py
+++ b/ebpfcat/devices.py
@@ -175,8 +175,13 @@ class Motor(Device):
         self.enable = self.set_enable
 
     def update(self):
+        velocity = self.proportional * (self.target - self.encoder)
+        if velocity > self.max_velocity:
+            velocity = self.max_velocity
+        elif velocity < -self.max_velocity:
+            velocity = -self.max_velocity
         self.current_position = self.encoder
-        self.velocity = self.set_velocity
+        self.velocity = velocity
         self.enable = self.set_enable
 
     def program(self):
diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py
index 198bff5..dd9da1e 100644
--- a/ebpfcat/ethercat.py
+++ b/ebpfcat/ethercat.py
@@ -692,48 +692,35 @@ class Terminal:
 
 async def main():
     ec = EtherCat("enp0s31f6")
-    print(1)
     await ec.connect()
-    print(2)
     tin = Terminal()
     tout = Terminal()
     tdigi = Terminal()
     tin.ec = tout.ec = tdigi.ec = ec
-    print(3)
     await gather(
         tin.initialize(-1, 5),
         tout.initialize(-2, 6),
         tdigi.initialize(-3, 22),
         )
     print("tin")
-    #await tin.to_operational()
-    await tin.set_state(2)
+    await tin.to_operational()
     print("tout")
     await tout.to_operational()
-    print("reading odlist")
-    odlist2, odlist = await gather(tin.read_ODlist(), tout.read_ODlist())
-    #oe = odlist[0x7001][1]
-    #await oe.write(1)
+    await tdigi.to_operational()
+    print("read odlist")
+    odlist = await tdigi.read_ODlist()
     for o in odlist.values():
         print(hex(o.index), o.name, o.maxSub)
         for i, p in o.entries.items():
             print("   ", i, p.name, "|", p.dataType, p.bitLength, p.objectAccess)
             #sdo = await tin.sdo_read(o.index, i)
-            try:
-               sdo = await p.read()
-               if isinstance(sdo, int):
-                   t = hex(sdo)
-               else:
-                   t = ""
-               print("   ", sdo, t)
-            except RuntimeError as e:
-               print("   E", e)
-    print("set sdo")
-    oe = odlist[0x8010][7]
-    print("=", await oe.read())
-    await oe.write(1)
-    print("=", await oe.read())
-    print(tdigi.eeprom[10])
+            sdo = await p.read()
+            if isinstance(sdo, int):
+                print(f"   {sdo:12} {sdo:8x}")
+            else:
+                print("   ", sdo)
+    print("tdigi")
+
 
 if __name__ == "__main__":
     loop = get_event_loop()
diff --git a/ebpfcat/terminals.py b/ebpfcat/terminals.py
index 8716329..22f429b 100644
--- a/ebpfcat/terminals.py
+++ b/ebpfcat/terminals.py
@@ -27,7 +27,6 @@ class Skip(EBPFTerminal):
         pass
 
 
-<<<<<<< HEAD
 class EL1808(EBPFTerminal):
     compatibility = {(2, 118501458)}
 
@@ -54,8 +53,6 @@ class EL2808(EBPFTerminal):
     ch8 = PacketDesc((1, 0), 7)
 
 
-=======
->>>>>>> a6f8814 (encoder working for chem)
 class EL4104(EBPFTerminal):
     ch1_value = PacketDesc((1, 0), 'H')
     ch2_value = PacketDesc((1, 2), 'H')
-- 
GitLab