首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoDeSys -无法写入内部变量

CoDeSys -无法写入内部变量
EN

Stack Overflow用户
提问于 2022-08-02 09:56:31
回答 1查看 107关注 0票数 0

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

正如您在图像中所看到的,我能够获取现场总线的正确值。Ie第30行: StateVar是我所期望的值。但是,在位移位之后,uistate应该是8。您可以在第32行和第36行看到相同的行为。

一开始,我想我可能会用不同的行覆盖uistate,但这是我唯一一次尝试写入变量。此外,我不能对代码本身进行更改。

有人知道这里发生了什么吗?

编辑:

这是主要的:

代码语言:javascript
复制
// **************************************************************************
// 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的初始化部分:

代码语言:javascript
复制
(* 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类。为了使它更清楚,这里也是变量声明部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-07 23:21:01

结果是“弗雷德你在哪里正确”。经过大量的测试,我找到了解决方案。

我确实是在改写现场总线的价值。因为事实证明,演示项目并不是在Raspberry Pi上运行的。在本机平台上,您必须主动尝试读取并写入现场总线。

但是,如果将平台转换为Raspberry,则Codesys已经将输入和输出映射到现场总线。因此,通过读取现场总线,您将覆盖已经获得的值。

tl;dr

在主要部分中移除这些行:

代码语言:javascript
复制
LMAxis_1_Axis.DrvToPlc := FC_LM_ReadEC(LMAxis_1_AdrIN);
[...]
FC_LM_WriteEC(LMAxis_1_AdrOUT, LMAxis_1_Axis.PlcToDrv);

然后事情就会发生在树莓派上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73205534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档