How to read hal pin from embedded panel from an other component

More
5 years 7 months ago #202493 by newbynobi
This might be a very complex question or just a very simple one.

I want to build a universal debug panel as embedded tab. As the panel should be universal and should be able to show also hal pin from other components, I need to get the component hal pin.

If I do this code in the py file of the embedded tab called "debug_panel", embedded in gmoccapy:
Code:
print(hal.component_exists("gmoccapy")) print("gmoccapy = ", hal_glib.GComponent("gmoccapy")) print(hal.component_exists("debug_panel")) print("timer = ", hal_glib.GComponent("debug_panel")) print(hal.component_exists("abs")) print("abs = ", hal_glib.GComponent("abs")) print(hal.component_exists("motion")) print("motion = ", hal_glib.GComponent("motion"))

I get True for gmoccapy, debug_panel, abs and False for motion.
The strange is, that I get for all components the same ID, something like this:
Code:
True ('gmoccapy = ', <hal_glib.GComponent instance at 0x7f07ac079200>) True ('debug_panel = ', <hal_glib.GComponent instance at 0x7f07ac079200>) True ('abs = ', <hal_glib.GComponent instance at 0x7f07ac079200>) False ('motion = ', <hal_glib.GComponent instance at 0x7f07ac079200>)

If I try to read a PIN from gmoccapy as gmoccapy.blockheigt like this:
Code:
hal_glib.GComponent("gmoccapy")["blockheight"]
I get an error like:
Code:
Traceback (most recent call last): File "./timer.py", line 123, in _periodic2 print("gmoccapy = ", hal_glib.GComponent("gmoccapy")["blockheight"]) File "/home/norbert/linuxcnc-org/lib/python/hal_glib.py", line 77, in __getitem__ def __getitem__(self, k): return self.comp[k] TypeError: string indices must be integers, not str
If I try a integer, I just get the corresponding letter of the component name.

Is there a way to read a hal pin from an component outside the own component?
A signal would also be OK, but first I will need to get the "component address" and all my test have failed till now.

Appreciate your help.

Norbert

Please Log in to join the conversation.

More
5 years 7 months ago #202695 by andypugh

newbynobi wrote: I get True for gmoccapy, debug_panel, abs and False for motion.


The component name for motion is "motmod"
Code:
halcmd: show comp Loaded HAL Components: ID Type Name PID State 72 User halcmd96007 96007 ready ... 20 RT __servo-thread ready 19 RT motmod ready ...

Is there a way to read a hal pin from an component outside the own component?

Code:
import hal ... v = hal.get_value("motion.program-line")

I don't know if the hal python interface is documented anywhere but here:
linuxcnc.org/docs/2.8/html/hal/halmodule.html

Please Log in to join the conversation.

More
4 years 9 months ago #231473 by 5G-antry
Hello,

Did you manage to read the values of PINs and/or Signals and use them in external software in "real time" (miliseconds range)?
I am currently developing kind of a digital twin of a cnc machine and I am struggeling with this topic.

Best Regards

Please Log in to join the conversation.

More
4 years 9 months ago #231625 by Grotius
Hi,

Here is a c++ example.
1. It finds a component by name.
2. It can retrieve a value of a component item.
3. It shows how to retrieve the servo-time
Code:
double hal_interface::print_servo_thread_time(){     /*     if (halpr_find_comp_by_name("matrix") != 0) {         std::cout << "matrix found!" << std::endl;     }     if (halpr_find_param_by_name("matrix.tmax") != 0) {         std::cout << "matrix.time found!" << std::endl;     }*/     //! Get parameter value example     /*     hal_param_t *param;     hal_type_t type;     void *d_ptr;     param = halpr_find_param_by_name("matrix.tmax");     if (param) {         type = param->type;         d_ptr = SHMPTR(param->data_ptr);         static char buf[15];         snprintf(buf, 14, "%ld", (long)*((hal_s32_t *) d_ptr));         std::cout<<"value:"<<buf<<std::endl;     }*/     //! Get pin value example     /*     if (halpr_find_pin_by_name("matrix.time") != 0) {         std::cout << "matrix.time found!" << std::endl;     } */     hal_data_u *value;     hal_type_t type;     bool *con = nullptr;     int r=hal_get_pin_value_by_name("matrix.mainfunction.time",&type,&value,con);     if(r!=0){         std::cout<<"error from /libhal/hal_interface function"<<std::endl;     }     // std::cout << "matrix.time function result:"<<ok<< std::endl;     // std::cout << "matrix.time function result:"<<value->s<< std::endl;     return value->s; }

 

Please Log in to join the conversation.

More
4 years 9 months ago #231626 by Grotius
For example c++:    //! Get pin value example
    if (halpr_find_pin_by_name("matrix.time") != 0) {
        std::cout << "matrix.time found!" << std::endl;
    }

github.com/LinuxCNC/linuxcnc/blob/a2f1fd...src/hal/halmodule.cc
Python line 991 :
#  Get a Pin, Param or signal value
PyObject *get_value(PyObject *self, PyObject *args)
 

Please Log in to join the conversation.

Time to create page: 0.088 seconds
Powered by Kunena Forum