CodeSys 在 Raspberry Pi 4 上杀死 eth0?

问题描述

我在尝试在 4GB RasPi-4 上运行 CodeSys 时遇到了一个非常奇怪的问题。长话短说,在我开始运行 CodeSys 项目之前,Pi 一直运行良好。当我这样做时,在 60 秒内,eth0 关闭并且无法恢复。即使重新启动 Pi 也没有效果。我发现恢复 eth0 的唯一方法是从 RaspBerrypi.org 的源映像重新刻录 RasPiOS(过去几天我已经做了大约 30 次,试图通过反复试验来摆脱这个)。

Linux raspBerrypi 5.4.79-v7l+ #1373 SMP Mon Nov 23 13:27:40 GMT 2020 armv7l GNU/Linux

我使用 /etc/dhcpcd.conf 将 eth0 设置为静态 IP。导致此问题的任何原因都不会改变我在那里的设置。尝试使用 ifconfig eth0 up/down 没有效果——没有错误,没有反馈,什么也没有。检查 eth0 的状态显示“正在等待运营商”,尽管已连接到活动交换机(我还更换了所有电缆和交换机以消除它们作为问题的根源)。

当我重新烧录 Pi 并安装 CodeSys 时,eth0 会无限期地保持运行状态(在我最长的测试中为 24 小时以上)。 启动 CodeSys 项目杀死了 eth0。 etho“消亡”后重启会给出一系列似乎相关的 bcmgenet 消息:

pi@raspBerrypi:~ $ dmesg | grep bcmg
[    1.033665] bcmgenet fd580000.ethernet: Failed to get enet clock
[    1.033685] bcmgenet fd580000.ethernet: GENET 5.0 EPHY: 0x0000
[    1.033709] bcmgenet fd580000.ethernet: Failed to get enet-wol clock
[    1.033730] bcmgenet fd580000.ethernet: Failed to get enet-eee clock
[    1.044648] libphy: bcmgenet MII bus: probed
[    9.528502] bcmgenet fd580000.ethernet: configuring instance for external RGMII
[    9.535175] bcmgenet fd580000.ethernet eth0: Link is Down

我还尝试从头开始创建一个新的 CodeSys 项目,该项目没有安装 eth0 驱动程序(ModBus、以太网/IP),只有 GPIO 驱动程序。这也无济于事 - eth0 在 60 秒内死亡。

最奇怪的是,似乎只有 eth0 受到影响。 GPIO 引脚在 CodeSys 项目的控制下保持循环(我有一个简单的 LED 闪烁程序正在运行),我仍然可以使用 wifi SSH 进入 Pi。但是因为我设置这个 Pi 的主要原因是使用以太网/IP 和 ModBus....

主题at GitHub 是我发现有人描述与我遇到的情况类似的唯一地方,但在这种情况下未安装 CodeSys。我确实按照线程中的建议尝试将 genet.skip_umac_reset=n 添加到我的 cmdline.txt 中,但没有效果

解决方法

所以,事实证明这是配置 GPIO 引脚的问题。

CodeSys 有两个不同的“设备”文件,用于将 GPIO 引脚添加到项目设备树中。 默认选择适用于较旧的 Pi 型号,替代选择(仅标记为 B+ 和 Pi2)是适用于 Pi4 的正确选择。

事实证明,过时的 GPIO 设备文件将工作在 Pi4 上,大部分。但是使用错误的设备文件允许 CodeSys 尝试配置不应被篡改的 GPIO 引脚。在这种情况下,GPIO 28 和 29。将它们中的任何一个设置为输出模式都会杀死 eth0。

使用正确的设备文件会从可配置的 GPIO 引脚列表中删除 28&29。它还为较新的 Pi 型号提供了可用 GPIO 引脚的正确列表,希望能避免我没有绊倒的其他潜在配置问题。

在 CodeSys 中,右键单击设备树中的 GPIOs 元素可提供“更新设备”选项。选择此选项可获取可用设备文件列表,并在使用窗口底部的“更新设备”按钮之前选择正确的文件。