LinuxCNC学习-HAL库介绍
原文链接:http://www.machinekit.io/docs/hal/intro/1 HAL库介绍HAL代表硬件抽象层。在最高级别上,它只是一种允许加载和互连多个“构建块”以组装复杂系统的方式。“硬件”部分是因为HAL最初旨在简化为各种硬件设备配置Machinekit的过程。许多构件都是硬件设备的驱动程序。 但是,HAL不仅可以配置硬件驱动程序,还可以做更多的事情。1.1 HAL基于传统的
原文链接:http://www.machinekit.io/docs/hal/intro/
1 HAL库介绍
HAL代表硬件抽象层。在最高级别上,它只是一种允许加载和互连多个“构建块”以组装复杂系统的方式。“硬件”部分是因为HAL最初旨在简化为各种硬件设备配置Machinekit的过程。许多构件都是硬件设备的驱动程序。 但是,HAL不仅可以配置硬件驱动程序,还可以做更多的事情。
1.1 HAL基于传统的系统设计技术
HAL基于与设计硬件电路和系统相同的原理,因此学习这些原理是非常有用。
任何系统(包括CNC机床)都由相互连接的组件组成。对于CNC机床而言,这些组件可能是主控制器,伺服放大器或步进驱动器,电机,编码器,限位开关,按钮悬垂件,也许是主轴驱动器的VFD,运行换刀器的PLC等。机床制造商必须选择、安装并连接这些部件,以构成一个完整的系统。
1.1.1 零件选择
机器制造商无需担心每个零件的工作方式。只是把它们当作黑匣子。在设计阶段,机器制造商决定要使用的零件-如步进器或伺服器时,再去选择哪个品牌的伺服放大器,哪种限位开关以及多少个限位开关等。集成商根据要使用的特定组件的决定而定。组件的功能以及设备制造商提供的规格。电动机的大小及其必须驱动的负载将影响运行该电动机所需的放大器的选择。放大器的选择可能会影响放大器所需的反馈类型以及必须从控件发送到放大器的速度或位置信号。
在HAL领域,集成商必须决定需要哪些HAL组件。 通常,每个接口卡都需要一个驱动程序。 软件生成步进脉冲,PLC功能以及各种其他任务可能需要其他组件。
1.1.2 互连设计
硬件系统的设计人员不仅选择零件,而且还决定如何互连这些零件。每个黑盒都有端子,一个简单的开关可能只有两个,而伺服驱动器或PLC可能只有几十个。 它们需要连接在一起。 电机连接到伺服放大器,限位开关连接到控制器,依此类推。在机器制造商进行设计时,他创建了一个大型接线图,该接线图显示了所有零件应如何互连。
使用HAL时,组件通过信号互连。 设计人员必须决定需要哪些信号,以及应该连接什么信号。
1.1.3 实施
在接线图完成后,就可以构建机器了。需要获取并安装这些零件,然后根据接线图将它们互连。在物理系统中,每个互连都是一条导线,需要将其切断并连接到适当的端子。
HAL提供了许多工具来帮助“构建” HAL系统。一些工具允许您“连接”(或断开连接)单个“电线”。 其他工具可让您保存有关系统的所有零件,电线和其他信息的完整列表,以便可以使用单个命令对其进行“重建”。
1.1.4 测试
很少有机器在第一次就可以正常工作。 在测试过程中,制造商可以使用仪表查看限位开关是否正常工作或测量流向伺服电机的直流电压。他可能会挂接示波器,以检查驱动器的调谐或查找电气噪声。 他可能会发现需要更改接线图的问题。 也许零件需要不同的连接或用完全不同的东西代替。
HAL提供了电压表,示波器,信号发生器以及测试和调整系统所需的其他工具的等效软件。 可以根据需要使用用于构建系统的相同命令进行更改。
1.1.5 总结
本文档面向已经知道如何进行这种硬件系统集成但又不知道如何将硬件连接到Machinekit的人员。请参阅“ HAL UI示例”文档中的“远程启动示例”部分。
如上所述的传统硬件设计在主控件的边缘结束。控件外部是一堆相对简单的盒子,它们相互连接以执行所需的任何操作。在内部,控件是一个巨大的谜团-我们希望它能起作用的一个巨大的黑匣子。
HAL将这种传统的硬件设计方法扩展到了大黑匣子的内部。它使设备驱动程序,甚至控制器的某些内部部件都变成了较小的黑匣子,可以像互连外部硬件一样相互连接甚至替换。它允许“系统接线图”显示内部控制器的一部分,而不仅仅是一个大黑盒子。最重要的是,它允许集成商使用与其余硬件相同的方法来测试和修改控制器。
大多数机器集成商都熟悉的诸如电动机,安培和编码器之类的术语。当我们谈论使用额外的柔性八芯屏蔽电缆将编码器连接至计算机中的伺服输入板时,读者会立即理解它的含义,并引出一个问题:“每种类型的连接器我都需要组成什么结尾。'对于HAL而言,相同类型的思考是必不可少的,但是特定的思路可能需要一些时间才能步入正轨。最初使用HAL单词似乎有些奇怪,但是从一个连接到另一个连接的工作原理是相同的。
将接线图扩展到控制器内部的想法就是HAL的全部目的。如果您对互连硬件黑匣子的想法感到满意,那么使用HAL互连软件黑匣子可能会遇到很多麻烦。
1.2 HAL 概念
本节是一个词汇表,定义了主要的HAL术语,但与传统的词汇表有些不同,因为这些术语不是按字母顺序排列的。它们是按照它们在HAL方式中的关系或流来排列的。
1.2.1 组件
在谈到硬件设计时,我们将各个部分称为“零件”,“构件”,“黑匣子”等。HAL等效项是“组件”或“ HAL组件”。 (当可能与其他种类的组件混淆时,本文档使用“ HAL组件”,但通常仅使用“组件”。)HAL组件是一款具有明确定义的输入,输出和行为的软件,可以根据需要安装和互连。
1.2.2 参数
许多硬件组件的调整未连接到任何其他组件,但仍需要访问。例如,伺服放大器通常具有微调电位器,以允许进行调节调整,以及可以在仪表或示波器上安装测试点以查看调节结果的测试点。 HAL组件也可以包含此类项目,称为“参数”。有两种类型的参数:输入参数等效于微调电位器-它们是可由用户调整的值,一旦设置便保持固定。用户无法调节输出参数-它们等同于允许监视内部信号的测试点。
1.2.3 引脚
硬件组件具有用于互连它们的端子。 HAL等效为“引脚”或“ HAL引脚”。 (为避免混淆,在需要时使用“ HAL引脚”。)所有HAL引脚均已命名,并且在互连它们时使用引脚名称。 HAL引脚是仅存在于计算机内部的软件实体。
1.2.4 物理引脚
许多I / O设备都具有实际的物理引脚或连接到外部硬件的端子,例如,并行端口连接器的引脚。为避免混淆,这些被称为“物理引脚”。这些都是“伸出”到现实世界中的东西。
1.2.5 信号
在物理机器中,实际硬件组件的端子通过电线互连。相当于电线的HAL是“信号”或“ HAL信号”。 HAL信号根据机械制造商的要求将HAL引脚连接在一起。可以随意断开和重新连接HAL信号(即使在机器运行时)。
1.2.6 信号类型
当使用真实硬件时,您不会将24伏继电器输出连接到伺服放大器的+/- 10V模拟输入。 HAL引脚具有相同的限制,具体取决于它们的类型。引脚和信号都有类型,并且信号只能连接到相同类型的引脚。当前有4种类型,如下所示:
位-单个TRUE / FALSE或ON / OFF值
float-一个64位浮点值,具有大约53位的分辨率和超过1000位的动态范围。
u32-32位无符号整数,合法值为0到4,294,967,295
s32-32位带符号整数,合法值为-2,147,483,647至+2,147,483,647
1.2.7 功能
实际的硬件组件往往会立即对其输入起作用。 例如,如果伺服放大器的输入电压发生变化,则输出也会自动变化。 但是,软件组件无法“自动”运行。 每个组件都有特定的代码,必须执行这些代码才能执行该组件应该执行的任何操作。在某些情况下,该代码只是作为组件的一部分运行。但是,在大多数情况下,尤其是在实时组件中,代码必须以特定的顺序和特定的间隔运行。例如,应该在对输入数据进行计算之前先读取输入,并且在完成计算之前不应该写入输出。 在这些情况下,代码以一种或多种“功能”的形式提供给系统。 每个功能都是执行特定操作的代码块。系统集成商可以使用“线程”来调度一系列功能,这些功能将以特定的顺序并在特定的时间间隔执行。
1.2.8 线程
“线程”是作为实时任务的一部分以特定间隔运行的功能列表。首次创建线程时,它具有特定的时间间隔(时间段),但是没有功能。可以将功能添加到线程中,并在每次线程运行时按顺序执行。
例如,假设我们有一个名为hal_parport的parport组件。该组件为每个物理引脚定义一个或多个HAL引脚。在该组件的doc部分中介绍了这些引脚:它们的名称,每个引脚与物理引脚的关系,它们是否反转,可以改变极性等等。但是,仅此一项并不能从HAL引脚获得数据到物理引脚。这需要代码来完成,这就是函数进入的地方。 Parport组件至少需要两个功能:一个功能读取物理输入引脚并更新HAL引脚,另一个功能从HAL引脚获取数据并将其写入物理输出引脚。 这两个功能都是parport驱动程序的一部分。
1.3 HAL组件
每个HAL组件都是具有定义明确的输入,输出和行为的软件,可以根据需要进行安装和互连。 本节列出了一些可用的组件以及每个组件的简要说明。 每个组件的完整详细信息将在本文档的后面提供。
1.3.1带有HAL钩子函数的外部程序
Motion 接受NML [1]运动命令并与HAL交互的实时模块
Iocontrol 接受NML I / O命令并与HAL交互的用户空间模块
classicladder使用HAL进行所有I / O的PLC
halui 与HAL交互并发送NML命令的用户空间程序,旨在使用外部旋钮和开关作为完整的用户界面工作
1.3.2 内部组件
stepgen:带位置环的软件步进脉冲发生器。 参见[sec:Stepgen]部分
encoder编码器 :基于软件的编码器计数器。 请参阅[sec:Encoder]部分
pid :比例/积分/微分控制回路。 请参阅[sec:PID]部分
siggen : 用于测试的正弦/余弦/三角形/方波发生器。 请参阅[sec:Siggen]部分
supply :一个简单的测试源
blocks : 各种有用的组件(mux,demux或,以及integ,ddt,limit,wcomp等)
1.3.3 硬件驱动
hal_ax5214h Axiom Measurement&Control AX5241H数字量I / O板的驱动程序
hal_gm 通用机电一体化GM6-PCI板
hal_m5i20 Mesa Electronics 5i20板
hal_motenc Vital Systems MOTENC-100板
hal_parport PC并行端口。
hal_ppmc Pico Systems控制器系列(PPMC,USC和UPC)
hal_stg Servo To Go卡(版本1和2)
hal_vti Vigilant Technologies PCI ENCDAC-4控制器
1.3.4 工具和应用
Halcmd用于配置和调整的命令行工具。 参见[sec:Halcmd]部分
Halgui 用于配置和调整的GUI工具(尚未实现)。
Halmeter 方便的万用表,用于HAL信号。 请参阅[秒:高度表]部分。
Halscope 用于HAL信号的功能齐全的数字存储示波器。 请参阅[sec:Halscope]部分。
这些组件的每一个将在后面的章节中详细介绍。
1.4 HAL中的时序问题
与我们所说的HAL所基于的黑匣子之间的物理布线模型不同,仅将两个引脚与hal信号相连远远不能达到物理情况的作用。
真正的继电器逻辑由连接在一起的继电器组成,并且当触点断开或闭合时,电流会立即流动(或停止)。其他线圈可能会改变状态,等等,而这一切都只是在“发生”。但是在PLC样式的梯形逻辑中,它不是那样工作的。通常在单次通过梯子时,每个梯级均按其出现的顺序进行评估,而每趟仅评估一次。一个完美的例子是一个梯级梯子,其NC触点与线圈串联。触点和线圈属于同一继电器。
如果这是常规继电器,则在线圈通电后,触头便开始断开并断电。这意味着触点再次闭合,依此类推,等等。继电器变成蜂鸣器。
对于PLC,如果线圈断开并且PLC开始评估梯级时触点闭合,那么当通过该梯级时,线圈就接通。接通线圈的事实会打开触点供电,直到下一次通过。在下一次通过时,PLC会发现触点已断开,并且使线圈断电。因此,继电器仍会在开和关之间快速切换,但速率取决于PLC评估梯级的频率。
在HAL中,该函数是评估梯级的代码。实际上,可以识别HAL的实时版本的ClassicLadder导出了一个功能来实现此目的。同时,线程是在特定时间间隔运行函数的事物。就像您可以选择让PLC每10毫秒或每秒对所有梯级进行一次评估一样,您可以定义具有不同周期的HAL线程。
一个线程与另一个线程的区别在于,它不是“做什么”的线程,它是由连接到哪个函数确定的。真正的区别只是线程运行的频率。
在Machinekit中,您可能有50 us线程和1 ms线程。这些将基于BASE_PERIOD和SERVO_PERIOD创建,实际时间取决于ini文件中的值。
下一步是确定每个线程需要做什么。这些决定中的一些在(几乎)任何Machinekit系统中都是相同的-例如,始终将运动命令处理程序添加到伺服线程中。
其他连接将由集成商进行。其中可能包括将STG驱动程序的编码器读取和DAC写入功能连接到伺服线程,或将stepgen的功能连接到基本线程,以及将parport函数写入端口的步骤。
2 HAL 基础
2.1 HAL命令
可以在终端窗口中的halcmd’man halcmd’的手册页中找到更多详细信息。要查看HAL配置并检查引脚和参数的状态,请使用AXIS中“计算机”菜单上的“ HAL配置”窗口。要观看某个引脚的状态,请打开“监视”选项卡,然后单击要观看的引脚,它将被添加到观察窗口。
2.2加载组件
Machinekit中几乎所有组件现在都可以实例化。
这是Machinekit和Linuxcnc之间的主要区别。
可实例化意味着创建了基本组件,并且可以随时随意加载该组件的多个实例。
这完全消除了固定经典组件的缺点,这些经典组件必须在启动时加载,然后才能加载任何组件,除非会话被暂停并重新启动。
有两种加载可实例化组件的方法。
1.下面详细介绍经典的loadrt方法
2.通过下面的newinst命令
方法1保留用于兼容性,它将接受count =或names =参数来控制所创建实例的数量。
方法2提供了完整的实例化组件选项,包括直接重命名,通过pincount =设置引脚组的数量以及许多其他组件(如果组件使用它们的话)。
2.2.1 loadrt
命令“ loadrt”加载实时HAL组件。 实时组件功能需要添加到线程中,以便以线程的速率进行更新。 您不能将用户空间组件加载到实时空间中。
语法和示例:
loadrt <component> <options>
loadrt mux4 count=1
2.2.2 Newinst
命令newinst,创建组件的新实例。 组件添加到线程中的方式与loadrt加载的组件相同。
newinst debounce db1 pincount=10
上面的命令创建一个名为db1的新的debounce实例
它指定db1应该具有10组引脚。
如果未给定反跳的新名称,则默认值为debounce.0。
(如果已经存在debounce.0,则为更大的递增数字)
2.2.3 NEWTHREAD
newthread线程名[options]周期
newthread servo fp 1000000
创建一个新的名为线程名的HAL线程,该线程每周期运行一次纳秒。
options有:
fp线程支持浮点 nofp(默认)线程不支持浮点 cpu = N在CPU #N上运行线程 cgname = / N在cgroup
cpuset:N中运行线程 注意 有关高级设置,请参阅线程和延迟信息。
nowait(实验性的)会忽略句点,线程自由运行,并且必须在外部进行同步
posix(实验性)非实时posix线程。可以进行Linux系统调用,但没有时间保证
2.2.4 ADDF
命令“ addf”将实时组件功能添加到线程。 您必须将HAL实时组件中的函数添加到线程中,以使该函数以线程速率进行更新。
如果使用“步进配置向导”来生成配置,则将有两个线程。
基本线程(高速线程):此线程处理需要快速响应的项目,例如发出阶跃脉冲以及读写并行端口。
伺服线程(慢速线程):该线程处理可以忍受较慢响应的项目,例如运动控制器,ClassicLadder和运动命令处理程序。
语法和示例:
addf <component> <thread>
addf mux4 servo-thread
2.2.5 loadusr
命令“ loadusr”加载用户空间HAL组件。 用户空间程序是它们自己独立的过程,可以选择通过引脚和参数与其他HAL组件进行通信。 您无法将实时组件加载到用户空间中。
标志可以是以下一项或多项:
-W 等待组件准备就绪。 假定该组件与命令的第一个参数具有相同的名称。
-Wn <名称> 等待组件,该组件将具有给定的。 这仅在组件具有名称选项的情况下适用。
-w 等待程序退出
-一世 忽略程序的返回值(带-w)
-n 当它是该组件的有效选项时,为其命名。
语法和示例:
loadusr <component> <options>
loadusr halui
loadusr -Wn spindle gs2_vfd -n spindle
loadusr wait for name spindle component gs2_vfd name spindle.
2.2.6 NET
命令网络在信号与一个或多个引脚之间建立“连接”。如果信号不存在,net将创建新信号。这代替了使用命令newsig的需要。 net命令未使用可选的方向指示器⇐,⇒和<⇒。
我们建议您不要使用这些内容,因为如果使用不当,它们可能会使您产生错误的方向感,而不是使它更易读。
您可以将信号视为PCB上的走线,将组件的输出引脚与零个或多个输入引脚相连。信号是一个变量,组件的输入和输出是指向该变量的指针。
语法和示例:
Net 信号名称<引脚名称> <可选方向>(<引脚名称> | <方向>)
net home-x axis.0.home-sw-in parport.0.pin-11-in
在上面的示例中,home-x是信号名称,axis.0.home-sw-in是Direction IN引脚,⇐是可选的方向指示器,parport.0.pin-11-in是Direction OUT引脚。这看起来可能令人困惑,但是并行端口引脚的输入和输出标签指示了该引脚工作的物理方式,而不是其在HAL中的处理方式。
记住这一点的一种方法:字母顺序
n(net)在s中的s(信号和源)之前,而在t中的t(目标)之前。如果您对信号和信号源的顺序有疑问,请记住,i(信号)也位于字母中的o(信号源)之前。
记住这一点的第二种方法:
(这听起来很傻,但确实有帮助)说了这句话十次:
Note
网络信号源target1 target2
如果引脚遵循以下规则,则可以将其连接到信号:
IN引脚始终可以连接到信号
除非信号上没有OUT引脚,否则可以连接IO引脚
仅当信号上没有其他OUT或IO引脚时,才可以连接OUT引脚
只要遵守上述规则,相同的<signal-name>可以在多个net命令中用于连接其他引脚。
2.2.7 SETP
命令“ setp”设置引脚或参数的值。有效值取决于引脚或参数的类型。如果数据类型不匹配,这是一个错误。
某些组件的参数需要在使用前进行设置。可以在使用之前或根据需要运行时设置参数。您不能在连接到信号的引脚上使用setp。
语法和示例:
setp <引脚/参数名称> <值>
setp parport.0.pin-08-out TRUE
2.2.8 SETS
命令“设置”设置信号的值。
语法和示例:
Sets <信号名称> <值>
sets <signal-name> <value>
net mysignal and2.0.in0 pyvcp.my-led
sets mysignal 1
如果使用命令发生错误:
信号名称不存在
如果信号已经有写入器
如果值不是信号的正确类型
2.2.9 unlinkp
命令“ unlinkp”将引脚与连接的信号断开链接。如果在运行该命令之前没有信号连接到该引脚,则不会发生任何事情。 'unlinkp’命令对于解决问题很有用。
语法和示例:
unlinkp <引脚名称>
unlinkp parport.0.pin-02-out
2.3 HAL 数据
Bit
位值是开或关。
位值= true或1以及false或0(True,TRUE,true均有效)
float
“浮点数”是浮点数。 换句话说,小数点可以根据需要移动。
浮点值= 64位浮点值,具有大约53位的分辨率和超过1000位的动态范围。
有关浮点数的更多信息,请参见:
http://en.wikipedia.org/wiki/Floating_point
s32
“ s32”数字是可以具有负值或正值的整数。
s32值=整数-2147483648至2147483647
u32
“ u32”数字是仅为正的整数。
u32值=整数0到4294967295
2.4 HAL文件
如果使用“步进器配置向导”来生成配置,则配置目录中最多包含三个HAL文件。
my-mill.hal(如果您的配置名为“ my-mill”),此文件将首先加载,并且如果您使用了步进配置向导,则不应更改。
custom.hal该文件在GUI加载之前和之后加载。 在这里,您可以在加载GUI之前放置要加载的自定义HAL命令。
custom_postgui.hal该文件在GUI加载后加载。 在此位置,您可以在GUI加载后放置要加载的自定义HAL命令。 任何使用pyVCP窗口小部件的HAL命令都需要放置在此处。
2.5 HAL组件
创建每个HAL组件时,会自动将两个参数添加到每个HAL组件中。 这些参数使您可以确定组件的执行时间。
.time
.tmax
时间是执行功能所花费的CPU周期数。
Tmax是执行该功能所需的最大CPU周期数。 Tmax是一个读/写参数,因此用户可以将其设置为0,以摆脱函数执行时间的首次初始化。
更多推荐
所有评论(0)