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

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

文章目录

  • CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境
    • 一、前言
    • 二、资料收集
    • 三、Ubuntu18.04从安装到更换实时内核
      • 1、下载安装Ubuntu18.04
      • 2、下载安装实时内核,解决编译问题及替换内核时的问题
        • 2.1、首先使用此命令查看你的Ubuntu内核,本人的Ubuntu18.04的内核版本是5.4.0-84-generic
        • 2.2、安装依赖项
        • 2.3、创建内核目录
        • 2.4、下载linux内核以及RT-PREEMPT patch
        • 2.5、解压,并给内核打补丁
        • 2.6、配置内核
        • 2.7、编译内核
        • 2.8、安装内核
        • 2.9、修改grub文件
        • 2.10、更新grub
        • 2.11、重启
      • 3、实时性测试
    • 四、CoDeSys安装及Linux runtime包下载安装
    • 五、创建应用并测试
      • 1、创建项目
        • 1.1、创建标准工程
        • 1.2、添加设备并激活
        • 1.3、回声测试
        • 1.4、安装p-net类型Profinet设备
        • 1.5、配置添加Profinet主站网络
      • 3、PLC编程
      • 4、烧录程序并测试
    • 六、最后

一、前言

我们之前已经在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复制黏贴的问题(或者安装虚拟机过程中就配置好了网卡自动安装了相关工具):

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、备份原来的源

sudo cp /etc/apt/sources.list /etc/apt/sources_init.list

2、使用 vim 编辑源

sudo apt-get install vim
sudo vim /etc/apt/sources.list

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

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、更新源

sudo apt-get update

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

sudo apt-get -f install

6、更新软件

sudo apt-get upgrade

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

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

2.1、首先使用此命令查看你的Ubuntu内核,本人的Ubuntu18.04的内核版本是5.4.0-84-generic
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、安装依赖项
sudo apt-get install libncurses-dev
sudo apt-get install libssl-dev
2.3、创建内核目录
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目录下。

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文件夹)执行打补丁

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、配置内核
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、编译内核
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、安装内核
sudo make modules_install -j8
sudo make install -j8
2.9、修改grub文件

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

sudo nautilus

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

2.10、更新grub
sudo update-grub
2.11、重启
sudo reboot

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

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

sudo apt-get install rt-tests

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

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

cyclictest运行结果详解

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

我的测试结果:

# /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语言编程,变量部分和程序部分的代码都给了,这里我们添加进去即可:

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
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做更多的交互开发,但是目前项目因为一些原因停止了,所以研究也被迫暂停了,可惜,生活所迫,并不总是有的选,国内科研情况不太清楚,但是企业内部确实没有太多的研究空间,只是急着套现,问题就留给后人吧,也或许留给以后不为生活所迫的自己。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何将PDF文件转换成翻页电子书?这个网站告诉你

​随着电子书的普及&#xff0c;越来越多的人开始将PDF文件转换成翻页电子书。翻页电子书不仅方便阅读&#xff0c;而且还可以在手机上轻松翻页。那么如何将PDF文件转换成翻页电子书呢&#xff1f;今天就为大家介绍一个网站&#xff0c;可以帮助你轻松完成这个任务。 1.首先&am…

Proteus仿真--12864LCD显示计算器键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的12864LCD液晶显示电话拨号键盘按键实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计主要介绍计算器键盘仿真&#xff0c;按键按下后在12864液晶上显示对应按键键值 仿真运行视频 Proteus仿真--12864LCD显示计算器…

【漏洞复现】IIS_7.o7.5解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 1.1、漏洞描述 漏洞原理&#xff1a; cgi.fix_path1 1.png/.php该…

第九章《搞懂算法:决策树是怎么回事》笔记

决策树算法是机器学习中很经典的一个算法&#xff0c;它既可以作为分类算法&#xff0c;也可以作为回归算法。 9.1 典型的决策树是什么样的 决策树算法是依据“分而治之”的思想&#xff0c;每次根据某属性的值对样本进行分类&#xff0c;然后传递给下个属性继续进行分类判断…

项目实战:新增@Controller和@Service@Repository@Autowire四个注解

1、Controller package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface Controller { }2、Service package com.csdn.mymvc.annotation; import java.lang.annotation.*…

zookeeper节点类型

节点类型 持久节点&#xff08;Persistent Nodes&#xff09; 这些是Zookeeper中最常见的一种节点类型&#xff0c;当创建一个持久类型节点时&#xff0c;该值会一直存在zookeeper中&#xff0c;直到被显式删除或被新值覆盖。 临时节点&#xff08;Ephemeral Nodes&#xff…

【漏洞复现】Apache_Tomcat_PUT方法任意写文件(CVE-2017-12615)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证工具扫描验证POC 1.6、修复建议 说明内容漏洞编号CVE-2017-12615漏洞名称Tomcat_PU…

【python】路径管理+路径拼接问题

路径管理 问题相对路径问题绝对路径问题 解决os库pathlib库最终解决 问题 环境&#xff1a;python3.7.16 win10 相对路径问题 因为python的执行特殊性&#xff0c;使用相对路径时&#xff0c;在不同路径下用python指令会有不同的索引效果&#xff08;python的项目根目录根据执…

服务器搭建:从零开始创建自己的Spring Boot应用【含登录、注册功能】

当然&#xff0c;你可以先按照IDEA搭建SSM框架【配置类、新手向】完成基础框架的搭建 步骤 1&#xff1a;设计并实现服务器端的用户数据库 在这个示例中&#xff0c;我们将使用MySQL数据库。首先&#xff0c;你需要安装MySQL并创建一个数据库以存储用户信息。以下是一些基本步…

5.3有效的括号(LC20-E)

算法&#xff1a; 题目中&#xff1a;左括号必须以正确的顺序闭合。意思是&#xff0c;最后出现的左括号&#xff08;对应着栈中的最后一个元素&#xff09;&#xff0c;应该先找到对应的闭合符号&#xff08;右括号&#xff09; 比如:s"( [ ) ]"就是False&#xf…

【错误解决方案】ModuleNotFoundError: No module named ‘my_fake_useragent‘

1. 错误提示 ModuleNotFoundError: No module named my_fake_useragent&#xff0c;这意味着你试图导入一个名为 my_fake_useragent 的模块&#xff0c;但Python找不到这个模块。 2. 解决方案 检查模块名是否正确: 确保你试图导入的模块名是正确的。也许你拼写错误或者大小写不…

【Midjourney入门教程1】Midjourney的注册、订阅

文章目录 前言一、Midjourney是什么二、Midjourney注册三、新建自己的服务器四、开通订阅 前言 AI绘画即指人工智能绘画&#xff0c;是一种计算机生成绘画的方式。是AIGC应用领域内的一大分支。 AI绘画主要分为两个部分&#xff0c;一个是对图像的分析与判断&#xff0c;即“…

onnx 模型加载部署运行方式

1.通过文件路径的onnx模型加载方式: 在onnxruntime下面的主要函数:session Ort::Session(env, w_modelPath.c_str(), sessionOptions); 这里的文件路径是宽字节的&#xff0c;通过onnx文件路径直接加载模型。 在opencv下使用dnn加载onnx模型的主要函数: std::string model…

Redo Log(重做日志)的刷盘策略

1. 概述 Redo Log&#xff08;重做日志&#xff09;是 InnoDB 存储引擎中的一种关键组件&#xff0c;用于保障数据库事务的持久性和崩溃恢复。InnoDB 将事务所做的更改先记录到重做日志&#xff0c;之后再将其应用到磁盘上的数据页。 刷盘策略&#xff08;Flush Policy&#x…

css基础之实现轮播图

原理介绍 图片轮播的原理是通过控制显示和隐藏不同的图片来实现图像的切换&#xff0c;从而创建连续播放的效果。用到的知识点有定位和定时器。 实现步骤&#xff1a; HTML 结构&#xff1a; 首先&#xff0c;需要在HTML中创建一个包含轮播图片的容器&#xff0c;通常使用 &l…

Golang源码分析之golang/sync之singleflight

1.1. 项目介绍 golang/sync库拓展了官方自带的sync库&#xff0c;提供了errgroup、semaphore、singleflight及syncmap四个包&#xff0c;本次分析singlefliht的源代码。 singlefliht用于解决单机协程并发调用下的重复调用问题&#xff0c;常与缓存一起使用&#xff0c;避免缓存…

要做一名成功的测试,首先得会想?

近在做测试时&#xff0c;突然想到了这么个问题——在测试的过程中对某个功能想得越开&#xff0c;测试就完整&#xff0c;就越彻底&#xff01; 当然我们在产生与该功能相关的想象时&#xff0c;其中最关键的是不能脱离需求&#xff0c;不能脱离该软件本身&#xff1b;不然这…

WebSocket Day02 : 握手连接

前言 握手连接是WebSocket建立通信的第一步&#xff0c;通过客户端和服务器之间的一系列握手操作&#xff0c;确保了双方都支持WebSocket协议&#xff0c;并达成一致的通信参数。握手连接的过程包括客户端发起握手请求、服务器响应握手请求以及双方完成握手连接。完成握手连接后…

优雅的 Dockerfile 是怎样炼成的?

Docker 简介 目前&#xff0c;Docker 主要有两个形态&#xff1a;Docker Desktop 和 Docker Engine。 Docker Desktop 是专门针对个人使用而设计的&#xff0c;支持 Mac&#xff08;已支持arm架构的M系芯片&#xff09; 和 Windows 快速安装&#xff0c;具有直观的图形界面&a…

【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

2哥 : 3妹&#xff0c;听说你昨天去面试了&#xff0c;怎么样啊&#xff1f; 3妹&#xff1a;嗨&#xff0c;别提了&#xff0c;让我回去等通知&#xff0c;估计是没有通知了&#xff0c; 还浪费我请了一天假。 2哥 : 你又请假了啊&#xff0c; 你是怎么跟你那个严厉的老板请假…