Hi Kirk.
The way you have to think about a time-consuming task in a HAL component
is different than the way you would think about it in a script or in
ladder rungs.
I have enclosed an example below that does some of what you need, though
I am sure it will still require adaptation to your situation.
Both turret.comp and turret-test.comp have to take actions based on what
happened far in the past. They do it in a similar way: by using a
parameter to keep track of the time until this action should be taken
(wait_time_left and turn_time_left). A few 'if's will manage
wait_time_left properly:
. If the action should be postponed, then set wait_time_left to wait_time
. Otherwise, if wait_time_left is less than period, take the action.
. Otherwise, reduce wait_time_left by period.
I hope that if you still want to do this with comp, my examples here can
be helpful to you.
- turret.comp ----------------------------------------------------------
component turret "Turret control for Kirk Wallace";
pin in u32 desired_index "The index to turn the turret to";
pin in u32 current_index "The current index the turret is turned to";
pin out bit turn "TRUE when the turret should turn";
pin out bit stable
"TRUE when the turret is stable at desired_index and not turning";
param rw u32 wait_time
"Number of nanoseconds it takes for the turret to become stable";
param r u32 wait_time_left
"Number of nanoseconds left until the turret is stable";
function _ nofp;
;;
MODULE_LICENSE("GPL");
FUNCTION(_) {
if(desired_index != current_index) {
turn = 1;
stable = 0;
wait_time_left = wait_time;
} else {
turn = 0;
if(wait_time_left < period) {
wait_time_left = 0;
stable = 1;
} else {
wait_time_left -= period;
}
}
}
- turret-test.comp -----------------------------------------------------
component turret_test "Turret test component";
pin out u32 position "Current turret slot";
pin in bit turn "TRUE to turn turret";
param rw u32 turn_time "Time to turn from one slot to the next";
param r u32 turn_time_left "Time left during this turn";
param rw u32 slot_count "Number of turret slots";
function _ nofp;
;;
MODULE_LICENSE("GPL");
FUNCTION(_) {
if(turn) {
if(turn_time_left < period) {
position = (position + 1) % slot_count;
turn_time_left = turn_time;
} else {
turn_time_left -= period;
}
}
}
- turret-test.hal ------------------------------------------------------
# Run this with 'halrun -I' then interactively set turret.0.desired-index
# and watch the pins and params in halscope
loadrt threads name1=servo period1=1000000
loadrt turret
loadrt turret_test
setp turret-test.0.slot-count 4
setp turret-test.0.turn-time 500000000
setp turret.0.wait-time 2000000000
addf turret-test.0 servo
addf turret.0 servo
net turret-turn turret.0.turn => turret-test.0.turn
net turret-slot turret-test.position -> turret.0.desired-index
start
------------------------------------------------------------------------
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Emc-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-users