Someone mentioned on the forum that M67 doesn't work (he wanted to use
it for controlling laser power)
This is undeniably true.
Pavel found a set of IRC logs on the subject showing that many have
tried, but none have succeeded in making it work.
So, Pavel had a go (patch at the end).
It seems to work, to an extent. I am not entirely sure what the best
test would be to demonstrate the difference between M67 and M68. I
tried a 4-quadrant circle with an AIO change at 12, 3, 6, 9 'o'clock.
First, M68: Timing is good, but velocity stutters:
http://imagebin.org/171202
Then with the M67 patch:
http://imagebin.org/171203
The velocity still stutters fractionally, but is much better.
I don't understand why both have pretty much equally good timing, that
doesn't fit with my understanding of the motion queue.
The patched version badly fails the test suite:
Runtest: 49 tests run, 38 successful, 11 failed + 0 expected
Failed:
.
./tests/ccomp/lathe-comp
./tests/ccomp/mill-g90g91g92
./tests/ccomp/mill-line-arc-entry
./tests/interp/cam-nisley
./tests/interp/g10/g10-l11
./tests/interp/g10/g10-l1-l10
./tests/interp/g10/g10-l1
./tests/interp/g76
./tests/m70-m73/m70m72-restore.0
./tests/m70-m73/m73autorestore.0
So there is work needed.
Here is the patch for discussion. (From Pavel, I am just the one still awake).
I imagine that a final version would not hold AIO in a struct named DIO.
There is an implicit limit of 32 of each channel as iomask_t is a u32.
This would need to change as current EMCMOT_MAX_DIO is 64 and
EMC_MOT_MAX_AIO is 16. (Both seem low to me)
=========================================================
>From ee1d4aa907bc9ce1ff85b9e648c899071d5c9cac Mon Sep 17 00:00:00 2001
From: Pavel Shramov <[email protected]>
Date: Tue, 6 Sep 2011 01:15:50 +0400
Subject: [PATCH 8/8] tp: Fix M67 synced AIO
Duplicate DIO code and add fields for AIO into syncdio_t struct.
Since they share same syncdio.anychange variable both are flushed.
v2: Fix tpSetAout function
v3: Fix command submission (minLimit/maxLimit instead of start/end)
tp: Don't overwrite old values when they are not changed
Hold bitmask for aio and dio arrays and only overwrite values
that were changed using tpSetDout and tpSetAout
---
src/emc/kinematics/tc.h | 5 +++++
src/emc/kinematics/tp.c | 18 ++++++++++++++++++
src/emc/motion/command.c | 2 +-
3 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/src/emc/kinematics/tc.h b/src/emc/kinematics/tc.h
index c60764d..71da2aa 100644
--- a/src/emc/kinematics/tc.h
+++ b/src/emc/kinematics/tc.h
@@ -45,9 +45,14 @@ typedef enum {
TAPPING, REVERSING, RETRACTION, FINAL_REVERSAL, FINAL_PLACEMENT
} RIGIDTAP_STATE;
+typedef unsigned long iomask_t;
+
typedef struct {
char anychanged;
+ iomask_t dio_mask;
+ iomask_t aio_mask;
signed char dios[EMCMOT_MAX_DIO];
+ double aios[EMCMOT_MAX_AIO];
} syncdio_t;
typedef struct {
diff --git a/src/emc/kinematics/tp.c b/src/emc/kinematics/tp.c
index 3f2c386..d53b48c 100644
--- a/src/emc/kinematics/tp.c
+++ b/src/emc/kinematics/tp.c
@@ -54,10 +54,15 @@ int tpCreate(TP_STRUCT * tp, int _queueSize,
TC_STRUCT * tcSpace)
// anychanged signals if any DIOs need to be changed
// dios[i] = 1, DIO needs to get turned on, -1 = off
int tpClearDIOs() {
+ //XXX: All IO's will be flushed on next synced aio/dio! Is it ok?
int i;
syncdio.anychanged = 0;
+ syncdio.dio_mask = 0;
+ syncdio.aio_mask = 0;
for (i = 0; i < num_dio; i++)
syncdio.dios[i] = 0;
+ for (i = 0; i < num_aio; i++)
+ syncdio.aios[i] = 0;
return 0;
}
@@ -621,9 +626,14 @@ void tpToggleDIOs(TC_STRUCT * tc) {
int i=0;
if (tc->syncdio.anychanged != 0) { // we have DIO's to turn on or off
for (i=0; i < num_dio; i++) {
+ if (!(tc->syncdio.dio_mask & (1 << i))) continue;
if (tc->syncdio.dios[i] > 0) emcmotDioWrite(i, 1); // turn DIO[i] on
if (tc->syncdio.dios[i] < 0) emcmotDioWrite(i, 0); // turn DIO[i]
off
}
+ for (i=0; i < num_aio; i++) {
+ if (!(tc->syncdio.aio_mask & (1 << i))) continue;
+ emcmotAioWrite(i, tc->syncdio.aios[i]); // set AIO[i]
+ }
tc->syncdio.anychanged = 0; //we have turned them all on/off,
nothing else to do for this TC the next time
}
}
@@ -1239,6 +1249,13 @@ int tpActiveDepth(TP_STRUCT * tp)
}
int tpSetAout(TP_STRUCT *tp, unsigned char index, double start, double end) {
+ if (0 == tp) {
+ return -1;
+ }
+ syncdio.anychanged = 1; //something has changed
+ syncdio.aio_mask |= (1 << index);
+ syncdio.aios[index] = start;
+ rtapi_print_msg(RTAPI_MSG_ERR, "tpSetAout(%d,%f,%f)\n", index, start, end);
return 0;
}
@@ -1247,6 +1264,7 @@ int tpSetDout(TP_STRUCT *tp, int index, unsigned
char start, unsigned char end)
return -1;
}
syncdio.anychanged = 1; //something has changed
+ syncdio.dio_mask |= (1 << index);
if (start > 0)
syncdio.dios[index] = 1; // the end value can't be set from canon
currently, and has the same value as start
else
diff --git a/src/emc/motion/command.c b/src/emc/motion/command.c
index 523fc4f..1278b24 100644
--- a/src/emc/motion/command.c
+++ b/src/emc/motion/command.c
@@ -1476,7 +1476,7 @@ check_stuff ( "before command_handler()" );
emcmotAioWrite(emcmotCommand->out, emcmotCommand->minLimit);
} else { // we put it on the TP queue, warning: only room for
one in there, any new ones will overwrite
tpSetAout(&emcmotDebug->queue, emcmotCommand->out,
- emcmotCommand->start, emcmotCommand->end);
+ emcmotCommand->minLimit, emcmotCommand->maxLimit);
}
break;
--
1.7.0.4
--
atp
"Torque wrenches are for the obedience of fools and the guidance of wise men"
------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
Emc-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-developers