我目前正在做一个来自LinMot的演示项目。我遇到的问题是,我无法将获得的现场总线值写入我必须处理的变量。

正如您在图像中所看到的,我能够获取现场总线的正确值。Ie第30行: StateVar是我所期望的值。但是,在位移位之后,uistate应该是8。您可以在第32行和第36行看到相同的行为。
一开始,我想我可能会用不同的行覆盖uistate,但这是我唯一一次尝试写入变量。此外,我不能对代码本身进行更改。
有人知道这里发生了什么吗?
编辑:
这是主要的:
// **************************************************************************
// Init axis parameters on program first run
// **************************************************************************
IF NOT bFirstRun THEN
LM_Init_Axis_1(); // Init LMAxis_1 parameters
bFirstRun := TRUE;
END_IF
// **************************************************************************
// Read inputs of a LinMot EtherCAT (-EC) drive
// **************************************************************************
LMAxis_1_Axis.DrvToPlc := FC_LM_ReadEC(LMAxis_1_AdrIN);
// **************************************************************************
// General Code
// **************************************************************************
LMAxis_1_Power(Axis:=LMAxis_1_Axis); // This function block must run cyclically as it updates the data in the axis struct (tstLM_Axis)
LMAxis_1_Reset(Axis:=LMAxis_1_Axis);
LMAxis_1_Home(Axis:=LMAxis_1_Axis);
LMAxis_1_TorqueLimiting(Axis:=LMAxis_1_Axis);
LMAxis_1_ParaAccess(Axis:=LMAxis_1_Axis);
LM_Example_Axis_1(); // Call example program for init and cyclic positioning
// **************************************************************************
// Write outputs of a LinMot EtherCAT (-EC) drive
// **************************************************************************
FC_LM_WriteEC(LMAxis_1_AdrOUT, LMAxis_1_Axis.PlcToDrv);在主LM_Example_Axis_1中称为。LM_Example_Axis_1由三部分组成。初始化、错误处理和控制伺服驱动器。
这是LM_Example_Axis_1的初始化部分:
(* Init *)
InitTrig(CLK:=Init);
IF InitTrig.Q AND NOT LMAxis_1_Axis.Status.Error THEN
InitState:=1;
InitDone := FALSE;
END_IF
CASE InitState OF
0: InitState := InitState;
1: IF NOT LMAxis_1_Power.Status THEN
LMAxis_1_Power.Enable := TRUE;
ELSE
InitState := 2;
END_IF
2: IF NOT LMAxis_1_Axis.Status.Homed THEN
LMAxis_1_Home.Execute := TRUE;
ELSE
LMAxis_1_Home.Execute := FALSE;
InitState := 3;
END_IF
3: IF LMAxis_1_Axis.Status.Homed AND LMAxis_1_Power.Status THEN
InitDone := TRUE;
InitState := 0;
Init := FALSE;
END_IF
END_CASE我被困在InitState =1上,原因是LMAxis_1_Power.Status不返回true。最初文章中的屏幕截图来自LMAxis_1_Power类。为了使它更清楚,这里也是变量声明部分。

发布于 2022-08-07 23:21:01
结果是“弗雷德你在哪里正确”。经过大量的测试,我找到了解决方案。
我确实是在改写现场总线的价值。因为事实证明,演示项目并不是在Raspberry Pi上运行的。在本机平台上,您必须主动尝试读取并写入现场总线。
但是,如果将平台转换为Raspberry,则Codesys已经将输入和输出映射到现场总线。因此,通过读取现场总线,您将覆盖已经获得的值。
tl;dr
在主要部分中移除这些行:
LMAxis_1_Axis.DrvToPlc := FC_LM_ReadEC(LMAxis_1_AdrIN);
[...]
FC_LM_WriteEC(LMAxis_1_AdrOUT, LMAxis_1_Axis.PlcToDrv);然后事情就会发生在树莓派上。
https://stackoverflow.com/questions/73205534
复制相似问题