[{"categories":["技术"],"content":"写在前面 我了解到FRP是因为我自己整了一个NAS，用这个NAS来同步公司电脑的文件到家里的NAS，这样在家里的电脑上访问公司文件就可以非常方便，在PDD总共花了不到1K。但是飞牛NAS官方免费提供的带宽只有3M，这个带宽对于同步一些文本文件还是足够的，当然飞牛官方也是可以购买更大的带宽的。我自己就喜欢DIY的，所以想怎么可以通过别的办法得到更大的带宽，然后在网上找了非常多的方法。了解到FRP这个内网穿透工具，将家里NAS的服务端口暴露到公网中去，需要一台有固定公网IP的服务器，刚好阿里云有针对学生的300元优惠券，我用这个优惠券买了一台服务器，这台服务器的系统我选择了Ubuntu24，带宽是共享200M，对我来说足够了。在服务器部署frps服务端，到飞牛NAS上部署一个frpc客户端，这样在公司的电脑上安装飞牛的官方同步软件可以将我指定的文件目录同步至我家的NAS中，在家里同一个局域网访问NAS中的文件非常快。当然这个FRP不仅仅用于NAS上，我自己使用到的场景还有远程控制，Windows自带的远程控制在局域网下非常好用，把这个远程控制的端口3389暴露到公网上我在家也可以远程控制公司的电脑了，延迟也不是很大，非常方便。\n一、在服务器上安装frps服务端 1. 下载并安装 frps sudo apt update sudo apt install -y wget tar 下载 FRP： cd /tmp wget https://github.com/fatedier/frp/releases/download/v0.70.0/frp_0.70.0_linux_amd64.tar.gz 解压： tar -xzf frp_0.70.0_linux_amd64.tar.gz cd frp_0.70.0_linux_amd64 ARM64 服务器需要将下载文件名中的 linux_amd64 改成 linux_arm64。官方同时提供 AMD64 和 ARM64 的 Linux 安装包，此外也有windows_amd64版本的，可以在官方github仓库查看。\n2. 创建配置目录 sudo mkdir -p /etc/frp 创建配置文件： sudo nano /etc/frp/frps.toml 写入 # ============================================================ # FRP 服务端配置 # ============================================================ # frpc连接frps的端口 bindPort = 7000 # ============================================================ # Token认证 # ============================================================ # 使用Token认证 auth.method = \u0026#34;token\u0026#34; # frpc客户端必须填写完全相同的Token，设置一个复杂点的 auth.token = \u0026#34;helloworld@1234\u0026#34; # ============================================================ # Dashboard管理页面 # ============================================================ # 监听所有网络接口，允许通过公网IP访问 webServer.addr = \u0026#34;0.0.0.0\u0026#34; # Dashboard访问端口 webServer.port = 7500 # Dashboard登录用户名 webServer.user = \u0026#34;frpadmin\u0026#34; # Dashboard登录密码 # 请务必修改成复杂密码 webServer.password = \u0026#34;frpadmin@Pwd\u0026#34; 保存并退出。\nCtrl + O Enter Ctrl + X 3. 创建 systemd 服务 创建服务文件： sudo nano /etc/systemd/system/frps.service 写入： [Unit] # 服务说明 Description=FRP Server # 等待网络启动 After=network-online.target Wants=network-online.target [Service] # 前台运行类型 Type=simple # frps启动命令，修改为你自己的安装路径 ExecStart=/tmp/frp_0.70.0_linux_amd64/frps -c /etc/frp/frps.toml # 异常退出后自动重启 Restart=on-failure # 退出5秒后重启 RestartSec=5 [Install] # 在多用户模式下启动 WantedBy=multi-user.target 官方推荐将 frps.service 放在 /etc/systemd/system/ 下，通过 ExecStart 指定程序和配置文件路径。\n保存并退出。\nCtrl + O Enter Ctrl + X 4. 启动并设置开机自启 重新加载 systemd： sudo systemctl daemon-reload 启动服务并同时设置开机自启： sudo systemctl enable --now frps 查看运行状态： sudo systemctl status frps 正常应看到： Active: active (running) systemctl常用命令 # Start frp sudo systemctl start frps # Stop frp sudo systemctl stop frps # Restart frp sudo systemctl restart frps # Check frp status sudo systemctl status frps 5. 开放防火墙和安全组 Ubuntu 使用 UFW 时： sudo ufw allow 7000/tcp 假设以后准备使用 3000～4999 作为映射端口： sudo ufw allow 3000:4999/tcp 启用防火墙前，先确保 SSH 已放行： sudo ufw allow OpenSSH sudo ufw enable sudo ufw status 云服务器厂商的安全组也要放行：\n端口 协议 用途 22 TCP SSH登录 7000 TCP frpc连接frps 7500 TCP 用于查看客户端在线情况 3000~4999 TCP 客户端映射端口 二、客户端对应配置 Windows 或 Ubuntu 客户端的 frpc.toml 至少需要： # 云服务器公网IP serverAddr = \u0026#34;你的云服务器公网IP\u0026#34; # 对应服务端bindPort serverPort = 7000 # 使用Token认证 auth.method = \u0026#34;token\u0026#34; # 必须和服务端完全一致 auth.token = \u0026#34;helloworld@1234\u0026#34; # 示例：映射本机3389端口，该端口为windows RDP的端口 [[proxies]] name = \u0026#34;rdp\u0026#34; type = \u0026#34;tcp\u0026#34; localIP = \u0026#34;127.0.0.1\u0026#34; localPort = 3389 remotePort = 3389 1. 下载frpc客户端在你需要暴露服务的电脑上 我这里想在家控制公司的电脑，于是我将frpc客户端安装在公司的电脑上。在frp github下载windows版本的frp。如下图。 2. 设置排除项 下载完成后，在解压之前需要在windows安全中心将存放该frp客户端文件的目录设置为排除项，这样windows不会将该文件认为是病毒。\n设置方法：Windows安全中心-\u0026gt;病毒和威胁防护-\u0026gt;排除项-\u0026gt;添加或删除排除项-\u0026gt;添加排除项-\u0026gt;文件夹。如下图所示。 3. 创建配置文件 对frp_0.70.0_windows_amd64.zip解压后，重要的是里面frpc.exe和frpc.toml，修改frpc.toml文件，该文件内容需要与服务器设置参数匹配。\nserverAddr = \u0026#34;你的服务器公网IP地址\u0026#34; serverPort = 7000 # 你在服务端设置的token auth.token = \u0026#34;helloworld@1234\u0026#34; [[proxies]] # 服务名可以自定义 name = \u0026#34;companyPcRDP\u0026#34; type = \u0026#34;tcp\u0026#34; localIP = \u0026#34;127.0.0.1\u0026#34; localPort = 3389 remotePort = 3389 4. 启动frpc客户端 在文件资源管理器中，打开frpc.exe和frpc.toml所在的文件夹，在地址栏输入powershell进入终端，如图所示。 在终端中输入命令启动frpc客户端。\n.\\frpc.exe -c .\\frpc.toml 5. 将frpc启动设置为开机自启的服务 可以使用nssm这个工具将上面的命令设置为一个开机自启的服务，可以去nssm官网下载，将该程序放在设置为排除项的那个文件夹中，解压后进入win64子目录，并在地址栏输入powershell并回车，如下图所示。 进入终端后，输入：\n.\\nssm.exe install frpcService 回车后，回弹出一个对话窗口，如图所示。 参数设置后如下图所示，参数设置完成后点击Install service。 回到nssm.exe所在的终端，输入下面命令启动该服务。\n.\\nssm.exe start frpcService nssm常用命令如下：\nTo show service installation GUI: nssm install [\u0026lt;servicename\u0026gt;] To show service removal GUI: nssm remove [\u0026lt;servicename\u0026gt;] To manage a service: nssm start \u0026lt;servicename\u0026gt; nssm stop \u0026lt;servicename\u0026gt; nssm restart \u0026lt;servicename\u0026gt; nssm status \u0026lt;servicename\u0026gt; nssm rotate \u0026lt;servicename\u0026gt; 6. 查看连接到frps服务端的frpc 打开浏览器，在地址中输入http://你的服务器公网IP:7500，该用户名和密码是在frps.toml中设置的。\n","date":"2026-07-15","permalink":"https://blog.youtao.website/posts/frp_turotial/","summary":"写在前面 我了解到FRP是因为我自己整了一个NAS，用这个NAS来同步公司电脑的文件到家里的NAS，这样在家里的电脑上访问公司文件就可以非常方便，在PDD总共花了不到1K。但是飞牛NAS官方免费提供的带宽只有3M，这个带宽对于同步一些文本文件还是足够的，当然飞牛官方也是可以购买更大的带宽的。我自己就喜欢DIY的，所以想怎么可以通过别的办法得到更大的带宽，然后在网上找了非常多的方法。了解到FRP这个内网穿透工具，将家里NAS的服务端口暴露到公网中去，需要一台有固定公网IP的服务器，刚好阿里云有针对学生的300元优惠券，我用这个优惠券买了一台服务器，这台服务器的系统我选择了Ubuntu24，带宽是共享200M，对我来说足够了。在服务器部署frps服务端，到飞牛NAS上部署一个frpc客户端，这样在公司的电脑上安装飞牛的官方同步软件可以将我指定的文件目录同步至我家的NAS中，在家里同一个局域网访问NAS中的文件非常快。当然这个FRP不仅仅用于NAS上，我自己使用到的场景还有远程控制，Windows自带的远程控制在局域网下非常好用，把这个远程控制的端口3389暴露到公网上我在家也可以远程控制公司的电脑了，延迟也不是很大，非常方便。\n一、在服务器上安装frps服务端 1. 下载并安装 frps sudo apt update sudo apt install -y wget tar 下载 FRP： cd /tmp wget https://github.com/fatedier/frp/releases/download/v0.70.0/frp_0.70.0_linux_amd64.tar.gz 解压： tar -xzf frp_0.70.0_linux_amd64.tar.gz cd frp_0.70.0_linux_amd64 ARM64 服务器需要将下载文件名中的 linux_amd64 改成 linux_arm64。官方同时提供 AMD64 和 ARM64 的 Linux 安装包，此外也有windows_amd64版本的，可以在官方github仓库查看。\n2. 创建配置目录 sudo mkdir -p /etc/frp 创建配置文件： sudo nano /etc/frp/frps.toml 写入 # ============================================================ # FRP 服务端配置 # ============================================================ # frpc连接frps的端口 bindPort = 7000 # ============================================================ # Token认证 # ============================================================ # 使用Token认证 auth.method = \u0026#34;token\u0026#34; # frpc客户端必须填写完全相同的Token，设置一个复杂点的 auth.token = \u0026#34;helloworld@1234\u0026#34; # ============================================================ # Dashboard管理页面 # ============================================================ # 监听所有网络接口，允许通过公网IP访问 webServer.addr = \u0026#34;0.0.0.0\u0026#34; # Dashboard访问端口 webServer.port = 7500 # Dashboard登录用户名 webServer.user = \u0026#34;frpadmin\u0026#34; # Dashboard登录密码 # 请务必修改成复杂密码 webServer.password = \u0026#34;frpadmin@Pwd\u0026#34; 保存并退出。\n","tags":[],"title":"frp (Fast Reverse Proxy) Setup Guide"},{"categories":["电控"],"content":"如何在codesys中记录日志 前提：确保在Library Manager中已经添加了CmpLog和Component Manager这两个系统库。\n在 CODESYS 中，你需要先创建一个功能块（Function Block），然后再在这个功能块下右键添加对应的方法（Method）。\n一、为了可以在主程序中可以调用，不必每次写完整的方法，我将完整的 FB_SystemLogger 拆分为主功能块和方法两部分。 1. 主功能块：FB_SystemLogger 在工程左侧的 POUs 树中，右键添加一个 POU，类型选择 Function Block，语言选择 ST，命名为 FB_SystemLogger。\n变量声明区 (Declaration) FUNCTION_BLOCK FB_SystemLogger VAR_INPUT // 允许外部传入自定义的组件名称，默认值为 \u0026#39;DefaultApp\u0026#39; sComponentName : STRING(80) := \u0026#39;DefaultApp\u0026#39;; END_VAR VAR udiCmpId : UDINT; bInit : BOOL := FALSE; END_VAR 代码实现区 (Implementation) 这里负责在功能块第一次被调用时，向系统注册组件名称并获取 ID。\n// 初始化：注册自定义组件名称（每个实例只执行一次） IF NOT bInit THEN Component_Manager.CMAddComponent2(sComponentName, 16#00000001, ADR(udiCmpId), 0); bInit := TRUE; END_IF 2.方法一：LogInfo (记录常规信息) 右键点击你刚建好的 FB_SystemLogger，选择 Add Object -\u0026gt; Method，命名为 LogInfo，返回类型写 BOOL。\n变量声明区 METHOD LogInfo : BOOL VAR_INPUT sMessage : STRING(255); // 要写入的日志文本 END_VAR 代码实现区 IF bInit THEN CmpLog.LogAdd2( hLogger := CmpLog.LogConstants.LOG_STD_LOGGER, // 伪句柄：指向标准 PLC 日志 udiCmpID := udiCmpId, // 刚才注册的组件ID udiClassID := CmpLog.LogClass.LOG_INFO, // 级别：INFO (蓝色图标) udiErrorID := 0, // 错误代码 (无错误填0) udiInfoID := 0, // 多语言文本ID (不用填0) pszInfo := sMessage // 你的自定义日志文本 ); LogInfo := TRUE; ELSE LogInfo := FALSE; END_IF 3. 方法二：LogError (记录错误信息) 再次右键点击 FB_SystemLogger，添加方法，命名为 LogError，返回类型 BOOL。\n变量声明区 METHOD LogError : BOOL VAR_INPUT sMessage : STRING(255); udiErrorCode : UDINT := 16#00000001; // 错误代码，可以根据具体业务传入不同代号 END_VAR 代码实现区 IF bInit THEN CmpLog.LogAdd2( hLogger := CmpLog.LogConstants.LOG_STD_LOGGER, udiCmpID := udiCmpId, udiClassID := CmpLog.LogClass.LOG_ERROR, // 级别：ERROR (红色图标) udiErrorID := udiErrorCode, udiInfoID := 0, pszInfo := sMessage ); LogError := TRUE; ELSE LogError := FALSE; END_IF 4. 方法三：LogWarning (记录警告信息) 可选择再添加一个警告级别的方法，命名为 LogWarning，返回类型 BOOL。\n变量声明区 METHOD LogWarning : BOOL VAR_INPUT sMessage : STRING(255); END_VAR 代码实现区 IF bInit THEN CmpLog.LogAdd2( hLogger := CmpLog.LogConstants.LOG_STD_LOGGER, udiCmpID := udiCmpId, udiClassID := CmpLog.LogClass.LOG_WARNING, // 级别：WARNING (黄色图标) udiErrorID := 0, udiInfoID := 0, pszInfo := sMessage ); LogWarning := TRUE; ELSE LogWarning := FALSE; END_IF 完成以上步骤后，这个类似于 C++ 类的 FB_SystemLogger 就彻底封装好了，你可以在任何子功能块或主程序中独立实例化并使用了。\n二、调用示例 变量声明区 PROGRAM PLC_PRG VAR // 实例化日志对象，并在声明时传入专属名称（类似于 C++ 的带参构造函数） Logger : FB_SystemLogger; bInfo : BOOL; bError : BOOL; bWarn\t: BOOL; END_VAR 代码实现区 // 1. 传入专属名字并调用初始化 Logger(sComponentName := \u0026#39;myLogComponent\u0026#39;); // 2. 触发日志 IF bInfo THEN Logger.LogInfo(sMessage := \u0026#39;hello world\u0026#39;); bInfo := FALSE; END_IF // 3. 触发错误 IF bError THEN Logger.LogError(sMessage := \u0026#39;There are some Errors\u0026#39;); bError := FALSE; END_IF // 4. 触发警告 IF bWarn THEN Logger.LogWarning(sMessage := \u0026#39;Warning, Warning, Warning\u0026#39;); bWarn := FALSE; END_IF 日志记录查看如图所示。 ","date":"2026-07-10","permalink":"https://blog.youtao.website/posts/2026-07-10-logadd2tutorial/","summary":"如何在codesys中记录日志 前提：确保在Library Manager中已经添加了CmpLog和Component Manager这两个系统库。\n在 CODESYS 中，你需要先创建一个功能块（Function Block），然后再在这个功能块下右键添加对应的方法（Method）。\n一、为了可以在主程序中可以调用，不必每次写完整的方法，我将完整的 FB_SystemLogger 拆分为主功能块和方法两部分。 1. 主功能块：FB_SystemLogger 在工程左侧的 POUs 树中，右键添加一个 POU，类型选择 Function Block，语言选择 ST，命名为 FB_SystemLogger。\n变量声明区 (Declaration) FUNCTION_BLOCK FB_SystemLogger VAR_INPUT // 允许外部传入自定义的组件名称，默认值为 \u0026#39;DefaultApp\u0026#39; sComponentName : STRING(80) := \u0026#39;DefaultApp\u0026#39;; END_VAR VAR udiCmpId : UDINT; bInit : BOOL := FALSE; END_VAR 代码实现区 (Implementation) 这里负责在功能块第一次被调用时，向系统注册组件名称并获取 ID。\n// 初始化：注册自定义组件名称（每个实例只执行一次） IF NOT bInit THEN Component_Manager.CMAddComponent2(sComponentName, 16#00000001, ADR(udiCmpId), 0); bInit := TRUE; END_IF 2.方法一：LogInfo (记录常规信息) 右键点击你刚建好的 FB_SystemLogger，选择 Add Object -\u0026gt; Method，命名为 LogInfo，返回类型写 BOOL。\n","tags":["PLC"],"title":"使用Logadd2在codesys中打印日志"},{"categories":[],"content":"FRP——fast reverse proxy ","date":"2026-07-05","permalink":"https://blog.youtao.website/posts/frp/","summary":"FRP——fast reverse proxy","tags":[],"title":"FRP内网穿透"},{"categories":["技术"],"content":"欢迎来到我的博客！\n这是使用 Hugo 和 PaperMod 主题搭建的第一篇文章。\n关于这个博客 这个博客将用于记录：\n技术学习笔记 项目经验分享 日常思考与感悟 Hugo 是什么 Hugo 是一个用 Go 语言编写的静态网站生成器，以速度快著称。\nPaperMod 主题 PaperMod 是一个简洁、响应式的 Hugo 主题，具有以下特点：\n简洁的界面设计 暗色/亮色模式自动切换 优秀的阅读体验 快速加载 感谢所有为开源项目做出贡献的人们！\n","date":"2026-07-05","permalink":"https://blog.youtao.website/posts/hello-world/","summary":"欢迎来到我的博客！\n这是使用 Hugo 和 PaperMod 主题搭建的第一篇文章。\n关于这个博客 这个博客将用于记录：\n技术学习笔记 项目经验分享 日常思考与感悟 Hugo 是什么 Hugo 是一个用 Go 语言编写的静态网站生成器，以速度快著称。\nPaperMod 主题 PaperMod 是一个简洁、响应式的 Hugo 主题，具有以下特点：\n简洁的界面设计 暗色/亮色模式自动切换 优秀的阅读体验 快速加载 感谢所有为开源项目做出贡献的人们！\n","tags":["hugo","blog"],"title":"Hello World - 我的第一篇博客"}]