CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境

CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境

文章目录

一、前言

我们之前已经在windows机上运行起了基于codesys的软PLC,并且其作为主站和跑在虚拟机上的p-net从站进行了简单的IO操作,但是跑在Windows上的运行时PLC会影响网卡,而不跑运行时的则由于实时性不足导致一些超时的问题,因此我们这里在Ubuntu18.04上更换实时Linux内核,然后利用codesys的for Linux扩展包将该实时的Ubuntu18.04改造运行软PLC作为主站来和树莓派从站做profinet交互,也熟悉一下更换Linux实时内核的过程。

二、资料收集

● Ubuntu18.04虚拟机(使用desktop版本)搭建codesys:http://bbs.hicodesys.com/thread-28335-1-1.html

● 编译替换实时内核:https://www.jianshu.com/p/b74b05d26cf9

● 内核编译错误处理:https://blog.csdn.net/qq_36393978/article/details/118157426

● 修改grup时报错:https://askubuntu.com/questions/1024593/failed-to-execute-child-process-net-when-entering-nautilus

● 树莓派安装codesys运行时,Ubuntu安装codesys运行时可以相互借鉴:https://www.cnblogs.com/ChenMichael/p/16352297.html

三、Ubuntu18.04从安装到更换实时内核

1、下载安装Ubuntu18.04

建议在虚拟机下进行,这个教程已经很多了,这里不再赘述,也可以参考这里:

Ubuntu18.04下载安装及配置网络:

下载地址:https://releases.ubuntu.com/18.04/

虚拟机安装参考:

Ubuntu更换国内源:https://www.qkeke.com/archives/1762.html

解决安装完vmtools仍不能和Windows复制黏贴的问题(或者安装虚拟机过程中就配置好了网卡自动安装了相关工具):

shell 复制代码
sudo apt-get autoremove open-vm-tools
sudo apt-get update
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop
reboot

1、备份原来的源

shell 复制代码
sudo cp /etc/apt/sources.list /etc/apt/sources_init.list

2、使用 vim 编辑源

shell 复制代码
sudo apt-get install vim
sudo vim /etc/apt/sources.list

3、更换为阿里的源(Ubuntu18.04)

shell 复制代码
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

4、更新源

shell 复制代码
sudo apt-get update

5、复损坏的软件包,尝试卸载出错的包,重新安装正确版本的

shell 复制代码
sudo apt-get -f install

6、更新软件

shell 复制代码
sudo apt-get upgrade

2、下载安装实时内核,解决编译问题及替换内核时的问题

根据网上的资料按照步骤处理即可。

2.1、首先使用此命令查看你的Ubuntu内核,本人的Ubuntu18.04的内核版本是5.4.0-84-generic
shell 复制代码
uname -a

Linux ubuntu 5.4.0-84-generic #94~18.04.1-Ubuntu SMP Thu Aug 26 23:17:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
2.2、安装依赖项
shell 复制代码
sudo apt-get install libncurses-dev
sudo apt-get install libssl-dev
2.3、创建内核目录
shell 复制代码
mkdir ~/kernel && cd ~/kernel
2.4、下载linux内核以及RT-PREEMPT patch

我的内核版本是5.4.0-84-generic,所以下载与目前我的版本最接近的,linux-5.4.10.tar.gz我们可以选择国内清华的镜像网站,国外的源下载速度特别慢。linux内核网址:https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/,你可以在此找到与你想要的内核版本,我下载了linux-5.10.180.tar.gzRT-PREEMPT patch:https://mirrors.tuna.tsinghua.edu.cn/kernel/projects/rt/

我下载了patch-5.10.180-rt89-rc1.patch.gz,可以在older文件夹下找到更多的版本。需要注意的是补丁与所下载的内核版本要一致。

2.5、解压,并给内核打补丁

下载完内核和补丁后把文件移到刚才创建的kernel目录下。

shell 复制代码
tar zxvf linux-5.10.180.tar.gz
gunzip patch-5.10.180-rt89-rc1.patch.gz

将 patch-文件放到 linux-5.4.10文件夹里,(直接将patch文件拖进 linux-5.4.10文件夹)执行打补丁

shell 复制代码
cp patch-5.10.180-rt89-rc1.patch linux-5.10.180
cd linux-5.10.180/
patch -p1 < patch-5.10.180-rt89-rc1.patch
2.6、配置内核
shell 复制代码
sudo apt install make
sudo apt install make-guile
sudo apt install gcc
sudo apt install flex
sudo apt install bison
make menuconfig

General setup ---> [Enter]

Preemption Model (Voluntary Kernel Preemption (Desktop)) ->[Enter]

Fully Preemptible Kernel (Real-Time)-> [Enter] #Select

然后一直按esc键返回至主页面

Kernel hacking --> [Enter]

Memory Debugging [Enter]

取消选择Check for stack overflows,我的里面没有此选项,直接忽略

返回主页面,保存配置退出

2.7、编译内核
shell 复制代码
vim .config
#修改CONFIG_SYSTEM_TRUSTED_KEYS,将其赋空值
#如果CONFIG_SYSTEM_REVOCATION_KEYS的值不为空的话,也将其赋空值。
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""
make -j8

我的cpu内核数是4,所以是j8,内核数的2倍。

2.8、安装内核
shell 复制代码
sudo make modules_install -j8
sudo make install -j8
2.9、修改grub文件

打开文件 /etc/default/grub,我的这个文件是只读文件,不能直接进行修改。在终端输入命令

shell 复制代码
sudo nautilus

选择grub文件进行修改,注释掉GRUB_TIMEOUT_STYLE=hidden,将GRUB_TIMEOUT=0改成了GRUB_TIMEOUT=5

2.10、更新grub
shell 复制代码
sudo update-grub
2.11、重启
shell 复制代码
sudo reboot

重启后在开机界面,选择Ubuntu高级选项,选择安装好的带rt的版本(默认第一个就可以)。

开机后,查看当前的内核版本

shell 复制代码
uname -a

Linux ubuntu 5.10.180-rt89-rc1 #1 SMP PREEMPT_RT Wed Sep 27 01:35:01 PDT 2023 x86_64 x86_64 x86_64 GNU/Linux

至此安装成功。

3、实时性测试

可参考以下网页:

https://blog.csdn.net/kl1125290220/article/details/78560220

https://blog.csdn.net/longerzone/article/details/16897655

shell 复制代码
sudo apt-get install rt-tests

运行cyclictest程序进行实时性测试:

shellsudo cyclictest -t 5 -p 80 -n  #运行五个线程,线程优先级为80,无限循环

cyclictest运行结果详解

shell 复制代码
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg:平均延时(us)
Max: 最大延时(us)

我的测试结果:

shell 复制代码
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 2.62 1.81 0.77 1/787 2295          

T: 0 ( 2290) P:80 I:1000 C:  20854 Min:      5 Act:  127 Avg:  251 Max:    1166
T: 1 ( 2291) P:80 I:1500 C:  13903 Min:      6 Act:  113 Avg:  252 Max:     681
T: 2 ( 2292) P:80 I:2000 C:  10427 Min:      7 Act:  115 Avg:  255 Max:    1000
T: 3 ( 2293) P:80 I:2500 C:   8341 Min:      6 Act:   79 Avg:  253 Max:    2721
T: 4 ( 2294) P:80 I:3000 C:   6951 Min:      7 Act:  114 Avg:  254 Max:    2931

四、CoDeSys安装及Linux runtime包下载安装

配置Linux运行时:

通过ssh登录设备配置安装,这里可以查看、安装及操作(之后点击安装并查看System Info来确定安装是否成功,最后Start启动运行时即可):

创建codesys项目时设备选择Linux设备:

之后通信配置激活即可:

五、创建应用并测试

1、创建项目

1.1、创建标准工程

标准工程,CODESYS Control for Linux SL(运行时环境),控制设备(主站控制器):

1.2、添加设备并激活

添加设备(只有安装了对应的Linux扩展包才能找到添加如下对应类型的设备):

1.3、回声测试

发送回声服务:

1.4、安装p-net类型Profinet设备

下载对应GSDML文件:github.com/rtlabs-com/p-net/blob/master/samples/pn_dev/GSDML-V2.4-RT-Labs-P-Net-Sample-App-20220324.xml

安装GSDML文件:


安装成功:

1.5、配置添加Profinet主站网络

● 在左侧面板的 Device(CODESYS Ccontrol RTE V3 x64)上,右键单击并选择添加设备。使用 以太网适配器、 以太网。

● 在 以太网上,右键单击并选择 添加设备。使用 Profinet IO主站、 PN-控制器。

● 在 PN_Controller上,右键单击并选择 添加设备。使用 P-Net 示例应用程序。

● 在 P_Net_Sample_App上,右键单击并选择 添加设备。使用 DIO 8xLogicLevel。

● 双击 左侧菜单中的以太网节点。选择自己的网络接口。IP 地址将相应更新。

● 双击 左侧菜单中的PN_controller节点。使用"第一个 IP" 和 "最后一个 IP"调整 IP 范围, 使其都具有 IO 设备的现有 IP 地址(例如运行 example_app 的 Linux 笔记本电脑或嵌入式 Linux 板)。在本教程中,我们使用 First IP 172.16.1.174 和 Last IP 172.16.1.174。

● 双击 左侧菜单中的P_Net_Sample_App节点。将 IP 地址设置为 IO 设备的现有地址。在本教程中我们使用 172.16.1.174.

3、PLC编程

● 单击左侧面板中的 PLC 逻辑 ‣ Applicaiton ‣ PLC_PRG并输入程序。

在控制器应用程序中,根据教程,使用ST语言编程,变量部分和程序部分的代码都给了,这里我们添加进去即可:

shell 复制代码
PROGRAM PLC_PRG
VAR
    in_pin_button_LED: BOOL;
    out_pin_LED: BOOL;
    in_pin_button_LED_previous: BOOL;
    flashing: BOOL := TRUE;
    oscillator_state: BOOL := FALSE;
    oscillator_cycles: UINT := 0;
END_VAR
shell 复制代码
oscillator_cycles := oscillator_cycles + 1;
IF oscillator_cycles > 200 THEN oscillator_cycles := 0;
oscillator_state := NOT oscillator_state;
END_IF IF in_pin_button_LED = TRUE THEN IF in_pin_button_LED_previous = FALSE THEN flashing := NOT flashing;
END_IF out_pin_LED := TRUE;
ELSIF flashing = TRUE THEN out_pin_LED := oscillator_state;
ELSE out_pin_LED := FALSE;
END_IF in_pin_button_LED_previous := in_pin_button_LED;

● 在左侧菜单中的 DIO_8xLogicLevel节点上 ,右键单击并选择"编辑 IO 映射"。

● 单击小 +号打开 "Input 8 bits"行 。

● 双击您想要编辑的行上的图标。

● 将"Input Bit 7"映射到"in_pin_button_LED"(通过Application/PLC_PRG找到),将"Output Bit 7"映射到"out_pin_LED"。

或者双击在这里编辑也可以:

● 在 Application ‣ MainTask 中选择 Cyclic with 4 ms。

● 在 Application ‣ Profinet_CommunicationTask 中选择 10 ms 的循环。使用优先级 14。

4、烧录程序并测试

● 在顶部菜单中,使用 Build ‣ 生成代码。

● 使用顶部菜单 Online ‣ Login 将应用程序传输到Linux。 在弹出窗口中按 "是" 。

● 在顶部菜单中,使用 Debug ‣ Start 您可以使用顶部菜单 Tools ‣ "Update Linux"来跟踪控制器日志。单击 "系统信息" 按钮,然后查看 "运行时信息" 文本框。如果在网络上找不到 IO 设备,它将显示错误消息。使用 Wireshark 验证控制器是否每 5 秒发送一次 LLDP 数据包。每 15 秒,它会发送一个 ARP 数据包来询问(第一个?)IO 设备 IP 地址,并发送一个 PN-DCP 数据包来询问名为"rt-labs-dev"的 IO 设备。

实际我这里需要登录->运行:

wireshark抓包(参考这里:https://rt-labs.com/docs/p-net/how-to-guides/capturing-and-analyzing-ethernet-packets/,后面也会单独出一节怎么抓包分析profinet的总结,这里实时的内核总算抓到了PNIO的协议数据):

● 配置完在 Raspberry Pi 上运行的 Codesys softplc 后,您可以关闭用于配置它的个人计算机(运行 Codesys 桌面应用程序)。请记住,您需要每两个小时重新启动运行 Softplc 的 Raspberry Pi,如果使用试用版。

Codesys 故障排除 ---------------- ------- 如果您收到错误,声称缺少库,请单击左侧面板中的 PLC 逻辑 ‣ 应用程序 ‣ 库管理。Codesys 应该自动检测是否有任何缺失的库。单击 "库管理器"选项卡 下的 "下载缺少的库" 以下载任何缺少的库。(这里也是上一节提到的第一次运行会缺少库,需要挂tz下载解决)

六、最后

接下来理论上还可以安装树莓派的扩展包,利用两个树莓派虚拟机来模拟搭建PN的IO设备交互;此外,还应当利用p-net做更多的交互开发,但是目前项目因为一些原因停止了,所以研究也被迫暂停了,可惜,生活所迫,并不总是有的选,国内科研情况不太清楚,但是企业内部确实没有太多的研究空间,只是急着套现,问题就留给后人吧,也或许留给以后不为生活所迫的自己。

相关推荐
BY—-组态18 小时前
web组态软件
前端·物联网·工业互联网·web组态·组态
沐欣工作室_lvyiyi19 天前
基于单片机的无线气象仪系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·plc·单片机毕业设计代做
xhload3d24 天前
掌控物体运动艺术:图扑 Easing 函数实践应用
大数据·3d·智慧城市·html5·webgl·数字孪生·可视化·数据可视化·工业互联网·轻量化·demo·hightopo·大屏展示·图形组件
一只小灿灿1 个月前
C# 与不同 PLC 通信的学习
学习·c#·plc
PLC无线1 个月前
威纶通触摸屏与三菱FX5u之间 EtherNet/IP无线以太网通信方案
plc·触摸屏·无线通讯
稳联技术1 个月前
如何判断 PLC200 SMART 与 EthernetIP 转 Profinet 网关的连接是否成功?
ethernet·profinet·ethernetip
巨蟹数字科技2 个月前
北京数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂
智能制造·数字孪生·工业互联网·工业物联网·工业元宇宙·北京·三维可视化技术
平凡而伟大(心之所向)2 个月前
‌WPF Prism框架的优势主要体现
wpf·plc·prism
巨蟹数字科技2 个月前
半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型
数字孪生·工业互联网·工业物联网·工业机器人·5g智能工厂·三维可视化系统·半导体器件制造