string(2) "33" Marco Nie - Development 2025-04-24T09:04:00+08:00 Typecho https://blog.niekun.net/feed/atom/category/dev/ <![CDATA[建立本地 Web 服务器]]> https://blog.niekun.net/archives/3024.html 2025-04-24T09:04:00+08:00 2025-04-24T09:04:00+08:00 admin https://niekun.net 建立一个本地 Web 服务器来快速查看本地网站(HTML, CSS, JavaScript 文件)有几种非常快速的方法,通常只需要一行命令。这里介绍几种最常用的:

1. 使用 Python 内置的 HTTP 服务器 (通常最快,无需额外安装)

如果你的电脑上安装了 Python 3 (现在大多数操作系统都自带或容易安装),这是最快的方法之一,因为它不需要安装任何额外的库。

  • 步骤:

    1. 打开你的终端或命令提示符 (Terminal / Command Prompt / PowerShell)。
    2. 使用 cd 命令导航到你的网站文件所在的根目录(也就是包含 index.html 文件的那个文件夹)。
    3. 运行以下命令:

      python -m http.server
      • 如果你使用的是较旧的 Python 2 版本 (尽量避免使用),命令是:

        python -m SimpleHTTPServer
    4. 终端会显示类似 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 的信息。
    5. 打开你的网页浏览器,访问 http://localhost:8000 或者 http://127.0.0.1:8000
    6. 如果你的根目录下没有 index.html,它会列出目录中的文件。
    7. 要停止服务器,回到终端按 Ctrl + C
  • 优点: 极快启动,通常无需安装额外软件。
  • 指定端口: 如果 8000 端口被占用,你可以指定其他端口:

    python -m http.server 8080

2. 使用 Node.js 的 http-serverlive-server (功能更强,需要 Node.js)

如果你安装了 Node.js 和 npm (Node Package Manager),可以使用一些非常方便的包。

  • a) http-server (基础服务器)

    1. 首次安装 (全局安装,只需一次):

      npm install -g http-server
    2. 启动服务器:

      • 在终端中,cd 到你的网站根目录。
      • 运行:

        http-server
    3. 终端会显示可用的访问地址,通常是 http://127.0.0.1:8080
    4. 在浏览器中打开该地址。
    5. Ctrl + C 停止。
  • b) live-server (带自动刷新功能)
    live-server 会在你修改并保存文件后自动刷新浏览器,非常适合开发调试。

    1. 首次安装 (全局安装,只需一次):

      npm install -g live-server
    2. 启动服务器:

      • 在终端中,cd 到你的网站根目录。
      • 运行:

        live-server
    3. 它通常会自动在你的默认浏览器中打开网站 (http://127.0.0.1:8080 或类似地址)。当你修改并保存 HTML/CSS/JS 文件时,浏览器会自动刷新。
    4. Ctrl + C 停止。
  • 优点: 功能更强(特别是 live-server 的自动刷新),Node.js 在 Web 开发中很常用。
  • 缺点: 需要先安装 Node.js 和对应的 npm 包。

3. 使用 VS Code 扩展 "Live Server" (集成在编辑器中,非常方便)

如果你使用 Visual Studio Code 编辑器,这是最方便的方法之一。

  • 步骤:

    1. 打开 VS Code。
    2. 转到扩展视图 (Extensions view, 图标通常在左侧边栏)。
    3. 搜索 "Live Server" (作者通常是 Ritwick Dey)。
    4. 点击 "Install" 安装。
    5. 安装完成后,打开你的网站项目文件夹。
    6. 在你的 index.html 文件上右键单击,选择 "Open with Live Server"。
    7. 或者,点击 VS Code 底部状态栏右下角的 "Go Live" 按钮。
    8. 服务器会启动,并在浏览器中自动打开页面,同样支持自动刷新。
    9. 要停止,可以再次点击状态栏的端口号按钮 (显示为 "Port: 5500" 或类似)。
  • 优点: 无需命令行操作,与编辑器紧密集成,带自动刷新。
  • 缺点: 需要使用 VS Code 编辑器。

4. 使用 PHP 内置服务器 (如果已安装 PHP)

如果你的系统碰巧安装了 PHP (通常用于后端开发,但也可用于快速启动静态服务器)。

  • 步骤:

    1. 打开终端或命令提示符。
    2. cd 到你的网站根目录。
    3. 运行:

      php -S localhost:8000
      • 你可以将 8000 替换为其他端口号。
    4. 在浏览器中访问 http://localhost:8000
    5. Ctrl + C 停止。
  • 优点: 如果已安装 PHP,则命令简单。
  • 缺点: 不如 Python 那么普遍预装,也不如 Node.js 工具或 VS Code 扩展功能丰富(如自动刷新)。

哪个最快?

  • 如果你有 Python: python -m http.server 通常是最快的,因为它很可能已经安装好了。
  • 如果你用 VS Code: 安装并使用 "Live Server" 扩展几乎是最方便、启动最快的方式(点击按钮即可)。
  • 如果你常用 Node.js: live-serverhttp-server 也非常快,并且 live-server 提供了非常有用的自动刷新功能。

选择哪种取决于你电脑上已有的环境和你个人的偏好。对于纯粹的“快速启动一个能看本地网页的服务器”,Python 的内置服务器通常拔得头筹。

]]>
<![CDATA[honkit 使用教程及部署github page]]> https://blog.niekun.net/archives/3021.html 2025-01-17T17:14:00+08:00 2025-01-17T17:14:00+08:00 admin https://niekun.net 1. 什么是 Honkit?

Honkit 是一个现代化的静态书籍生成工具,它是基于旧版 GitBook 开发的,支持 Markdown 文件的编写和多种输出格式,如 HTML 和 PDF。

2. 初始化 Honkit 项目

2.1 创建 Honkit 项目

  1. 创建项目目录

    mkdir my-honkit-project
    cd my-honkit-project
  2. 初始化 Honkit 项目

    npx honkit init

    这会生成以下两个文件:

    • README.md:书籍的主页面。
    • SUMMARY.md:目录结构的定义。
  3. 安装 Honkit

    npm install honkit --save-dev

3. 本地构建书籍

3.1 运行开发服务器

在项目目录中运行以下命令启动本地预览:

npx honkit serve

默认情况下,书籍会在 http://localhost:4000 上运行。

3.2 生成静态文件

当书籍准备好后,运行以下命令生成静态 HTML 文件:

npx honkit build

生成的文件会存储在 _book 目录中。


4. 生成 PDF 文件

Honkit 支持将书籍生成 PDF 文件,但需要预先安装 Calibre 电子书管理软件。

4.1 安装 Calibre

  1. 下载 Calibre

  2. 确保 Calibre 路径正确

    • 检查环境变量

      • 通常,Calibre 安装会自动将路径添加到系统的环境变量 PATH 中。
      • 如果未自动添加,手动将 Calibre 的安装目录路径添加到 PATH 环境变量中。
    • 例如,Windows 系统下,路径可能为:

      C:\Program Files\Calibre2
    • Linux 和 macOS 用户可通过以下命令验证:

      which ebook-convert

      如果返回路径为空,说明需要手动添加。

  3. 重新打开终端
    添加路径后,确保关闭并重新打开终端。

4.2 生成 PDF

运行以下命令生成 PDF 文件:

npx honkit pdf . output.pdf
  • . 表示当前目录。
  • output.pdf 是生成的 PDF 文件名。

5. 部署到 GitHub Pages

5.1 创建 GitHub 仓库

  1. 前往 GitHub 创建一个新仓库(例如 my-honkit-book)。
  2. 将本地项目与远程仓库关联:

    git init
    git remote add origin https://github.com/<username>/my-honkit-book.git
    git add .
    git commit -m "Initial commit"
    git branch -M main
    git push -u origin main

5.2 配置 GitHub Actions 自动部署

  1. 创建 GitHub Actions 配置文件
    在项目的根目录下创建 .github/workflows/deploy.yml 文件,内容如下:

    name: Deploy Honkit to GitHub Pages
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
        - name: Checkout Code
          uses: actions/checkout@v3
    
        - name: Setup Node.js
          uses: actions/setup-node@v3
          with:
            node-version: '18'
    
        - name: Install Dependencies
          run: npm install
    
        - name: Build Honkit
          run: npx honkit build
    
        - name: Deploy to GitHub Pages
          uses: peaceiris/actions-gh-pages@v3
          with:
            github_token: ${{ secrets.GITHUB_TOKEN }}
            publish_dir: ./_book
  2. 提交配置文件
    提交并推送配置文件到 GitHub:

    git add .github/workflows/deploy.yml
    git commit -m "Add GitHub Actions for deployment"
    git push origin main
  3. 启用 GitHub Pages

    • 进入仓库的 Settings > Pages
    • Source 下选择 gh-pages 分支,点击保存。

6. 绑定自定义域名

6.1 配置 GitHub Pages

  1. 进入仓库的 Settings > Pages
  2. Custom domain 中输入您的自定义域名(例如 www.example.com)。
  3. 点击 Save。GitHub 会自动生成一个 CNAME 文件。

6.2 配置 DNS 记录

登录您的域名注册商控制台,添加以下 DNS 记录:

  • 绑定子域名(例如 www.example.com):
    添加 CNAME 记录

    www  CNAME  <username>.github.io
注意:将 <username> 替换为您的 GitHub 用户名。

6.3 启用 HTTPS

  1. 返回 GitHub 仓库的 Settings > Pages
  2. 勾选 Enforce HTTPS,以启用 HTTPS 访问。

自定义域名每次推送后消失的解决方法

当每次推送代码后,自定义域名设置消失,通常是由于 CNAME 文件被覆盖或删除。GitHub Pages 需要根目录的 CNAME 文件来保存自定义域名信息。如果该文件丢失或被覆盖,GitHub 就无法识别您的自定义域名。


解决方法

手动将 CNAME 文件添加到源码目录

  1. 创建 CNAME 文件
    在项目根目录(如 main 分支)下创建一个 CNAME 文件,并在文件中输入您的自定义域名,例如:

    www.example.com
  2. 提交更改
    提交并推送 CNAME 文件到远程仓库:

    git add CNAME
    git commit -m "Add CNAME file"
    git push origin main
  3. 验证
    每次部署后,CNAME 文件会自动被包含在 gh-pages 分支中,不会被覆盖。

验证步骤

  1. 检查 CNAME 文件

    • 进入 GitHub 仓库的 gh-pages 分支,确认根目录下有 CNAME 文件。
    • 文件内容应为您的自定义域名,例如:

      www.example.com
  2. 检查 GitHub Pages 设置

    • 转到 Settings > Pages
    • 确认自定义域名已正确显示,并启用 HTTPS
  3. 测试访问
    使用您的自定义域名访问页面,确认是否能够正确加载。

7. 常见问题及解决方法

问题 1:npx honkit pdf 报错 Command failed: ebook-convert not found

原因
Calibre 未正确安装,或 ebook-convert 工具未添加到系统的 PATH 环境变量中。

解决方法

  1. 确保 Calibre 已安装,并重新确认安装路径:

    • Windows 默认路径:C:\Program Files\Calibre2
    • macOS/Linux 使用 which ebook-convert 检查路径。
  2. 手动将 Calibre 的安装路径添加到系统环境变量中:

    • Windows

      • 打开“环境变量”设置,找到 PATH
      • 添加 C:\Program Files\Calibre2
    • Linux/macOS

      • 编辑 ~/.bashrc~/.zshrc 文件,添加以下内容:

        export PATH="/path/to/calibre:$PATH"

        替换 /path/to/calibre 为 Calibre 的实际路径。

      • 保存后运行 source ~/.bashrcsource ~/.zshrc 使更改生效。
  3. 重新运行 npx honkit pdf

问题 2:GitHub Actions 部署失败,提示 Permission denied

原因
GitHub Actions 无法向 gh-pages 分支推送更改,通常是因为缺少权限。

解决方法

  1. 确保 GitHub 仓库的 Settings > Actions > General 中已启用 Read and write permissions

    • 打开 Workflow permissions,选择 Read and write permissions
    • 勾选 Allow GitHub Actions to create and approve pull requests
  2. 确认 GitHub Actions 配置文件中使用的是 github_token

    with:
      github_token: ${{ secrets.GITHUB_TOKEN }}

问题 3:GitHub Pages 部署成功,但自定义域名未生效

原因
DNS 记录配置错误或未生效。

解决方法

  1. 登录域名管理平台,检查 DNS 配置:

    • 确认 A 记录或 CNAME 记录配置正确。
    • 等待 DNS 记录生效(可能需要 5-48 小时)。
  2. 检查仓库根目录下是否有 CNAME 文件,内容是否正确(应与自定义域名一致)。
  3. 验证 DNS 配置是否正确:

  4. 启用 HTTPS:

    • 进入 Settings > Pages,勾选 Enforce HTTPS

问题 4:生成的书籍内容显示错乱或样式缺失

原因

  • Markdown 文件中格式不正确。
  • SUMMARY.md 的目录结构未正确链接。

解决方法

  1. 确认 Markdown 文件的格式是否符合规范。
  2. 检查 SUMMARY.md 中的链接是否与文件路径一致:

    * [章节标题](path/to/file.md)
  3. 清理并重新构建书籍:

    npx honkit build

问题 5:自定义 PDF 样式未生效

原因
未指定自定义样式文件或样式文件路径错误。

解决方法

  1. 创建一个 CSS 样式文件(如 custom.css),自定义 PDF 的排版样式。
  2. 使用以下命令生成 PDF 并指定样式文件:

    npx honkit pdf --css custom.css . output.pdf

    8. 支持与反馈

如果您遇到未列出的问题或有其他疑问,请参考以下支持途径:

完成这些步骤后,您可以成功使用 Honkit 创建、部署和管理文档,解决常见问题,并生成符合您需求的 HTML 和 PDF 文档!

]]>
<![CDATA[使用虚拟环境 env 开发 python]]> https://blog.niekun.net/archives/env-python.html 2024-07-01T10:17:13+08:00 2024-07-01T10:17:13+08:00 admin https://niekun.net 使用虚拟环境进行Python开发有助于隔离项目的依赖,避免不同项目之间的库版本冲突。以下是如何创建和使用虚拟环境的详细步骤。

Python 3.3 及以上版本自带 venv 模块,可以直接使用。

使用 venv 创建虚拟环境

创建虚拟环境

在你的项目目录下,运行以下命令来创建一个虚拟环境,这将在项目目录下创建一个名为 myenv 的文件夹,其中包含虚拟环境的所有文件:

python -m venv myenv

激活虚拟环境

Windows:

myenv\Scripts\activate

macOS 和 Linux:

source myenv/bin/activate

安装依赖

在虚拟环境中,你可以使用 pip 来安装项目所需的库:

pip install requests

安装的库将只会影响当前虚拟环境,而不会影响系统的 Python 环境或其他项目。

冻结依赖

为了确保你的项目依赖可以在其他环境中重现,你可以使用以下命令将当前环境的依赖写入 requirements.txt 文件:

pip freeze > requirements.txt

requirements.txt 文件将包含所有当前环境中的安装包及其版本信息。

使用 requirements.txt 安装依赖

在新的环境中,你可以使用 requirements.txt 文件来安装所需的所有依赖:

pip install -r requirements.txt

退出虚拟环境

当你完成工作时,可以通过以下命令退出虚拟环境:

deactivate

使用虚拟环境进行Python开发可以有效地隔离项目依赖,避免版本冲突。通过创建和激活虚拟环境、安装依赖、冻结依赖并在新环境中重新安装依赖,可以确保你的项目在不同环境中具有一致的运行表现。

]]>
<![CDATA[codesys enum 枚举数据类型单元的使用]]> https://blog.niekun.net/archives/codesys-enum.html 2024-03-07T08:21:07+08:00 2024-03-07T08:21:07+08:00 admin https://niekun.net enum 类型的 dut 可以定义一组属性及其值,调用的时候可以方便的通过写其属性名称得到属性的值,也可以获取到属性本身的名称。

下面举一个例子说明:

{attribute 'qualified_only'}            // 必须先写类型名称再写属性名称 (例如 eColor.Red)
// {attribute 'strict'}                 //取消 'strict' 以允许转换 UDINT 数据类型
{attribute 'to_string'}                 // 运行字符串转换 (例如 TO_STRING(eColor.Red) = 'Red')
TYPE eColor :
(
    Red         := 16#FFFF0000,
    Green       := 16#FF00FF00,
    Blue        := 16#FF0000FF
    Yellow      := 16#FFFFFF00,
) UDINT;                                // 声明 UDINT 作为 int 整形类型
END_TYPE

// 定义一些变量
    ColorVar1   : eColor;
    ColorVar2   : eColor;
    ColorName   : STRING;
    ColorValue  : UDINT;

    ColorVar1 := eColor.Green;            // ColorVar1 = 16#FF00FF00
    ColorName := TO_STRING(ColorVar1);    // ColorName = 'Green';
    ColorValue := TO_UDINT(ColorVar1);    // ColorValue = 16#FF00FF00

    ColorVar2 := 16#FF00FF00;             // ColorVar2.Green
    ColorName := TO_STRING(ColorVar2);    // ColorName = 'Green';
    ColorValue := TO_UDINT(ColorVar2);    // ColorValue = 16#FF00FF00

    ColorVar1 := ColorVar2 OR eColor.Red; // 按位相与得到 Yellow=16#FFFFFF00
    ColorName := TO_STRING(ColorVar1);    // ColorName = 'Yellow';
    ColorValue := TO_UDINT(ColorVar1);    // ColorValue = 16#FFFFFF00

以上示例列举了常用的 enum 类型可进行的数据交互方式。

eColor.Green 可以获取enum类型属性的值,并可以赋值给其他对应 enum 实例
TO_STRING(ColorVar1) 可以转换获取 enum 实例当前值对应属性名称字符串

]]>
<![CDATA[codesys 常见编译及下载时报错解决方法]]> https://blog.niekun.net/archives/codesys.html 2024-03-06T16:35:00+08:00 2024-03-06T16:35:00+08:00 admin https://niekun.net No source code available for this object

下载时出现此报警,原因是 task 任务中对 gou 的排序有问题,放在前面的 pou 中使用了后面 pou 才设定好的数据,需要重新排列 task 任务序列:
image.png

SMC_FB_CALLED_FROM_WRONG_TASK

mc_power mc_jog 等控制轴的功能块,一运行就报错 SMC_FB_CALLED_FROM_WRONG_TASK,可能是不同的 pou 放在了多个 task 任务中,循环中内部有了冲突,将所有的 pou 放在同一个 task 中就可以解决问题。

]]>
<![CDATA[RTE runtime添加 ethercat master 的步骤]]> https://blog.niekun.net/archives/ethercat.html 2024-02-23T15:41:00+08:00 2024-02-23T15:41:00+08:00 admin https://niekun.net codesys 配置 rte runtime 添加 ethercat 组件的方法。

主要步骤为:

  • 安装 RTE runtime
  • 安装适配网卡驱动
  • 添加 ethercat master 设备

安装 RTE runtime

首先需要配置工控机啊 BIOS 设置,将一些超线程,电源管理等选项关掉:

  • 关闭超线程:
    image.png
  • 关闭BIOS 中激活的所有节能选项

    • Intel Speed Step动态节能技术
    • EIST智能降频
    • C-States省电模式
    • PowerNow动态调整CPU的工作频率和电压
    • Hibernation休眠
    • MWAIT
  • 停用可能导致系统管理中断的所有内容

    • BIOS self tests BIOS自检
    • USB Legacy Device Support 传统USB设备支持

    image.png

然后就可以安装 RTE,官网下载需要的 runtime 安装包,注意区分 x86 还是 x64 设备。我下载的是 **CODESYS Control RTE SL (×86Windows 实时)。

官网下载地址:http://store.codesys.cn/codesys/store/index.html

在工控机上解压并安装需要的 RTE runtime,基本都是直接下一步即可,期间注意选择带不带 softmotion:
image.png

Control RTE 文件路径:C:\Program Files\CODESYS\CODESYS Control RTE3
Control RTE 安装路径:C:\ProgramData\CODESYS\CODESYSControlRTEV3

网卡驱动

支持的网卡:
Systems with Windows and CODESYS Control RTE (Real-time SoftPLC):

  • Realtek® 8139 (CmpRTL81x9Mpd)
  • Realtek RTL8139 and compatible Ethernet-Controller, as well 8100/8110
  • Realtek 8169 (CmpRTL8169Mpd)
  • Realtek 8169/810, RTL8111B / RTL8111D
  • Intel® EtherExpressPro1000 (CmpEt1000Drv) --- All gigabit adapters from Intel
  • Intel EtherExpress PRO/100 (CmpEt100Drv) --- All 100 Mbit adapters from Intel

一般情况下 intel 的千兆网卡都可以安装 CmpEt1000Drv 驱动。

首先进入设备管理器,选择需要更新 codesys 驱动的网卡,右键选择更新驱动:
image.png

选择从本地查找驱动程序:
image.png

选择从磁盘安装,从 RTE 文件路径找到对应的驱动目录并安装:
image.png
image.png

右键选择 plc configuration:
image.png

在 components manager 中在最后一个空行中填入安装的驱动名称,这里我填的是 CmpEt1000Drv:
image.png

确定并重启 plc 即可完成网卡驱动的安装及配置。

添加 ethercat master

在codesys 开发项目中进行以下操作。

  • 建立一个支持 softmotion 的设备
  • 添加 ethercat master softmotion 主站 (会自动添加 ethercat_task 任务 不可删除)
  • 扫描并连接到控制器
  • 配置 ethercat master 网卡,RTE 版 runtime 需要选择适配 codesys 的网卡
    image.png
    image.png
  • 下载程序到控制器,如果上面没有在 components manager 中添加网卡组件的话,这里下载会报错
  • 退出登录 扫描从站并添加
    image.png
    image.png
  • 如果设备描述文件没有在系统内置库中 需要手动导入描述文件然后才能扫描识别
    image.png
    image.png
    image.png
  • 给扫描到的从站添加 cia402 轴
    image.png
  • 配置电子齿轮比
    image.png

以上就是 RTE runtime 版添加 ethercat master 主站的简单方法。

参考链接:

Control RTE SL and profinet connections

]]>
<![CDATA[Siemens 系统计算精度设置影响程序运行问题]]> https://blog.niekun.net/archives/2858.html 2023-10-18T17:13:10+08:00 2023-10-18T17:13:10+08:00 admin https://niekun.net 最近的工作中遇到使用带刀具的轨迹运动中,由于轨迹是通过1000多个离散点构成的,每个点之间距离很短,由于 sinumerik one 系统默认的线性计算精度是每毫米 1000 各单位,导致刀具轨迹报错提示可能有碰撞危险。通过提高系统计算精度可以解决此问题。

相关系统变量:

  • 通用机床数据 10200 线性位置的计算精度
  • 通用机床数据 10210 角位置的计算精度

sinumerik one 及 840D sl 系统以上参数默认值为 1000,828D 系统默认值为 1000000。

]]>
<![CDATA[codesys 使用占位符定义界面变量显示格式]]> https://blog.niekun.net/archives/2857.html 2023-09-22T10:33:00+08:00 2023-09-22T10:33:00+08:00 admin https://niekun.net 在编程中我们会使用各种类型的变量进行逻辑运算,不同类型其默认数据精度取值不一样,比如浮点型变量文本占位符为 %f 默认小数位数 6 位,但实际只想显示 3 位小数,此时就需要将界面变量的占位符进行设置以满足需求。

int 整型

语法:

% <标记> <最小显示数字个数> <类型>
  • 标记:定义数据显示模式,可选项:- 当定义最小显示数字个数时 居左显示,+ 显示数据正负号,0 当定义最小显示数字个数时空缺位显示 0
  • 最小显示数字个数:定义最少占据几个数字空间,默认数据位数不够时留空
  • 类型:显示数据类型,如:d十进制, b二进制, o八进制, x十六进制

示例:

%-5d:最小显示位数5位,且居左对齐显示,例如数据值为123时:`123  `
%+d:显示数据正负号,例如数据值为123时:`+123`
%05d:最小显示位数5位,且空缺位显示0,例如数据值为234时:`00234`

%08b:显示8位数的二进制模式,例如数据值为255时:`11111111`
%04x:显示4位数的十六进制模式,例如数据值为15时:`000f`

float 浮点型

语法:

% <标记> <最小显示数字个数> . <精度> f
  • 标记:定义数据显示模式,可选项:- 当定义最小显示数字个数时 居左显示,+ 显示数据正负号,0 当定义最小显示数字个数时空缺位显示 0
  • 最小显示数字个数:定义最少占据几个数字空间,包括小数位,默认数据位数不够时留空,不定义时默认为 %1.6f
  • 精度:小数位的显示精度

示例:

%-12.9f:显示12位数字 9位小数,且居左显示
%+6.3f:显示6位数字3位小数,且显示正负号标记
%06.3f:显示6位数字3位小数,且空缺位补0显示

时间类型

语法:

%t[ <text> <time in unit> <text> ]

示例:

// 定义一个时间变量并给其赋值
ltTimeSpan : LTIME := LTIME#1D2H3M4S5MS6US7NS;

在一个 label 中定义:
text variable 设置:PLC_PRG.ltTimeSpan
text 占位符设置:Time span: %t[d] d
输出结果:Time span: 1 d

可用的占位符:%t[d] 天,%t[dd] 两位数字的天,%t[H] 小时,%t[HH] 两位数字小时,%t[m]分钟,%t[mm] 两位数分钟,%t[s] 秒,%t[ss] 两位数秒。

也可以组合起来使用:

TEXT 占位符设置:%t[Value: dd-HH:mm:ss:ms:us:ns]
输出结果:Value: 01-02:03:04:005:006:007

如果不定义 label 的 text variable 属性,则会输出系统当前时间。

日期类型

语法:

%t[ <date and time unit> ]

和时间类型类似的用法,下面举例说明:

//定义一个 date 类型变量
dateBy : DATE := DATE#2021-02-12;

在一个 label 中定义:
text variable 设置:PLC_PRG.dateBy
text 占位符设置:Date: %t[yyyy-MM-dd dddd]
输出结果:Date: 2/12/2021 Friday

可用占位符:%t[yyyy] 年,%t[yy] 两位数年,%t[y]一位数年,%t[MMMM] 英文月份,%t[MMM]英文简写月份,%t[MM]月份,%t[ddddd] 一周的第几天,%t[dddd]英文周几,%t[dd]一个月的第几天,%t[jjj]一年中的第几天,

如果不定义 label 的 text variable 属性,则会输出系统当前日期。

字符

语法:

%s

参考链接

Placeholders with Format Definition

]]>
<![CDATA[codesys 定义重启可保持型变量]]> https://blog.niekun.net/archives/2840.html 2023-08-18T14:09:00+08:00 2023-08-18T14:09:00+08:00 admin https://niekun.net 无论是在 gvl 或者 pou 中都可以定义变量,默认情况下这些变量在系统重启后数据都会丢失。某些情况下我们希望变量值可以保持,系统重启后原数据也不丢失。可以在变量定义块中通过关键词 RETAINPERSISTENT 来实现。

注意 PERSISTENT 类型变量必须定义在单独的 Persistent Variables 类型 object 才能生效。而不是通常的 GVL object。

RETAIN

RETAIN 可以在热重启后保持数据:

In a POU:

VAR RETAIN
 iRem1 : INT;
END_VAR

*******************

In a GVL:

VAR_GLOBAL RETAIN
 gvarRem1 : INT;
END_VAR

以下情况下 RETAIN 数据会被重置:

  • the command Reset origin
  • the command Reset cold (as opposed to persistent variables)
  • a repeated program download

PERSISTENT

首先需要新建 Persistent Variables 类型 object 会放在 task 子目录下:
2023-08-24T00:59:33.png

然后会自动创建 VAR_GLOBAL PERSISTENT RETAIN 类型全局变量文件。

PERSISTENT 可以在热重启和冷重启后保持数据:

VAR_GLOBAL PERSISTENT
 iVarPers1 : DINT;
 bVarPers : BOOL;
 PLC_PRG.PERS: INT;
END_VAR

以下情况下 PERSISTENT 数据会被重置:

  • the command Reset origin

从 CODESYS V3.3.0.1 开始声明一个 VAR_GLOBAL PERSISTENT 等效于 VAR_GLOBAL PERSISTENT RETAIN or VAR_GLOBAL RETAIN PERSISTENT

以下是各种变量定义模式下数据保持情况:

after online commandVARVAR RETAINVAR PERSISTENT
Reset warm xx
Cold reset x
Reset origin
Download x
Online Changexxx

参考链接

Remanent Variables - RETAIN, PERSISTENT
REMANENT VARIABLES: RETAIN VS PERSISTENT RETAIN

]]>
<![CDATA[codesys 中使用 DIN 66025 标准编写 CNC 程序]]> https://blog.niekun.net/archives/2835.html 2023-08-16T15:33:00+08:00 2023-08-16T15:33:00+08:00 admin https://niekun.net 下面介绍 DIN 66025 标准下编写 codesys CNC 程序的一些基本规则。

结构

基本格式如下:

% MyProgram
N10 G01 X100 Y100 F100  (comment)
N20 M8 G01 Z40 F20
N30 G03 X-100 R200 F100
N40 SubPrg{5}

规则:

  • 以 % 标记程序头名称,也可以不写
  • 每行代码都是一个 block,每个 block 都需要以 block number 开头,如:N10
  • 一行只能定义一个 G 代码,G90 G01 需要单独两行写
  • M 代码可以和 G 代码一行
  • 小括号 () 中可以定义注释
  • 子程序传递参数用大括号 {} 定义

可用 G代码可以查询:DIN 66025 Fundamentals

暂停

语法:

N10 G4 T5  (停留5秒)

M 功能

当 cnc 程序中编写一个 M 功能时,如 M8,在 SMC_Interpolator 功能块中的 wM 会输出调用的 M 功能编号 8,同时会在此功能块等待输入确认信号 bAcknMtrue 并且清空 wM 信号,在此期间插补器会停留在原地等待。

如果需要在执行 M 功能的时候不中断当前正在进行的插补器动作,需要设置并执行 SMC_PreAcknowledgeM 功能块。但是如果M功能有传递参数 K L 等则不可激活此预完成功能,否则传递参数POU接收不到。

注意 M 功能编号中 65533–65535 是内部保留的,其他都是可以自定义的,包括 M30

如要执行下面 cnc 程序:

N15 G1 X10 F100
N20 M8
N21 G1 X50 F100
N30 M30

POU 代码加入如下:

VAR
    fbIpo       : SMC_Interpolator;   //插补器功能块
    fbPreAckM     : SM3_CNC.SMC_PreAcknowledgeMFunction;  //M 功能预完成功能  可不中断插补器动作  如果M功能有传递参数 则不可激活此功能
END_VAR

***************************************

IF fbIpo.wM = 30 THEN
    fbIpo(bAcknM:=TRUE);   //执行玩动作后触发完成信号
END_IF

fbPreAckM(bEnable:=TRUE,iM:=8,poqDataIn:=fbCheckVel.poqDataOut);  //激活指定M功能预完成  如果M功能有传递参数 则不可激活此功能
IF fbIpo.wM = 8 THEN
    gVars.lrR3 := 5;       //M功能需要执行的动作
    fbIpo(bAcknM:=TRUE);   //执行玩动作后触发完成信号
END_IF

可以在 CNC 程序调用 M 功能时定义传递参数,供POU使用,使用关键词 K L 即可。同时需要定义 SMC_GetMParameters 功能块获取到参数值,这里需要注意此功能块必须和 SMC_Interpolator 处于同一周期中,否则可能读取失败,建议同 SMC_Interpolator 定义在一个 POU 中。

带传递参数的 M 功能 CNC 程序示例如下:

N20 M8 K7

以上示例 POU 修改如下:

VAR
    fbIpo          : SMC_Interpolator;   //插补器功能块
    //fbPreAckM    : SMC_PreAcknowledgeMFunction; //屏蔽

    fbGetMPara    : SMC_GetMParameters;
END_VAR

***************************************

//fbPreAckM(bEnable:=TRUE,iM:=8,poqDataIn:=fbCheckVel.poqDataOut);  //屏蔽
IF fbIpo.wM = 8 THEN
    gVars.lrR3 := fbGetMPara.dK;;    //读取到 K 传递参数的数据
    fbIpo(bAcknM:=TRUE);             //执行玩动作后触发完成信号
END_IF

fbGetMPara(Interpolator:=fbIpo,bEnable:=TRUE);

跳转

有两种跳转方法,第一种是引用行号来跳转,可以定义从某一个程序段跳转到另一个程序段以及跳转的循环次数。第二种是通过自定义标记位来跳转,可以不用管行号,缺点是只能向后跳转以及不可循环跳转。

行号跳转语法:

G20 L K

L 定义需要跳转到的指定行号,K 定义跳转循环次数,当为 0 时停止跳转。当不写 K 时系统会模式使用内部变量计数。此功能需要配合赋值命令 G36 G37 使用。

使用内部变量计数示例:

N00 G36 D5              (设置内部变量初始为5 变量值为0时跳转关闭)
N10 G91                 (增量模式)
N20 G01 X10 Y10 F100    (每个循环移动的距离)
N30 G37 D-1             (给内部变量值减1)
N40 G20 L20             (内部变量值没到0时返回继续循环 N20)

使用自定义变量计数的示例:

N00 G36 O$R1$ D5        (设置变量R1初始为5 变量值为0时跳转关闭)
N10 G91                 (增量模式)
N20 G01 X10 Y10 F100    (每个循环移动的距离)
N30 G37 O$R1$ D-1       (给变量R1值减1)
N40 G20 L20 K$R1$       (变量R1值没到0时返回继续循环 N20)

G36 命令给变量赋值,G37 命令修改变量值。

此跳转命令有局限性,不可嵌套跳转,不可设置 K 值为常数,如:K2 写法是错误的。

自定义标记跳转:

N00 G20 L?4              (定义需要跳转到标记 4 只能索引到此程序后的标记  如果没有找到标记则程序停在此处)
N05 L!5                  (定义标记位置5)
N10 G1 X100 F100
N20 G1 Y100 L!4 F100     (定义标记位置4)

L? 定义需要跳转到的目标标记,L! 定义目标标记位。索引数字可以是任意整数,目标标记 L! 可以和 G 代码一行也可以单独一行定义。

使用自定义标记跳转时需要注意只能跳转到后面的程序行。

移动速度

可以通过 F 控制轴移动速度,E 控制加速度及减速度。

示例:

N10 G01 X100 Y50 F100 E10 E-20

注意 E 后面设置负数就是设置减速度。

全局自定义变量

支持定义自定义全局变量并在 cnc 程序中使用,通过 G36 G37 给变量赋值。

首先需要在 GVL 中对变量进行定义:

{attribute 'qualified_only'}
VAR_GLOBAL CONSTANT
    wVarsCount            : WORD:= 5;
END_VAR

VAR_GLOBAL
    lrR1                            : LREAL := 0;
    lrR2                            : LREAL := 0;
    lrR3                            : LREAL := 0;
    
    strVar1                         : STRING;
    
    lrSpeed                         : SM3_CNC.SMC_M_PARAMETERS; // M functions custom transfer parameter
    
    astVar                : ARRAY[0..wVarsCount-1] OF SMC_SingleVar := [
                                                    (strVarName := 'R1', pAdr := ADR(lrR1), eVarType := SMC_VARTYPE.SMC_TYPE_LREAL),
                                                    (strVarName := 'R2', pAdr := ADR(lrR2), eVarType := SMC_VARTYPE.SMC_TYPE_LREAL),
                                                    (strVarName := 'R3', pAdr := ADR(lrR3), eVarType := SMC_VARTYPE.SMC_TYPE_LREAL),
                                                    (strVarName := 'STR1', pAdr := ADR(strVar1), eVarType := SMC_VARTYPE.SMC_TYPE_STRING),
                                                    (strVarName := 'SPeed', pAdr := ADR(lrSpeed), eVarType := SMC_VARTYPE.SMC_TYPE_USERDEF)
                                                    ];
    
    stVarList            : SMC_VARLIST := (wNumberVars := wVarsCount, psvVarList := ADR(astVar));
END_VAR

然后再 POU 中的 SMC_ReadNCFile2 功能块指定 SMC_VARLIST 地址:

VAR
    fbReadFile    : SMC_ReadNCFile2;
END_VAR

************************************

fbReadFile(pvl := ADR(gVars.stVarList));

变量类型支持 int lreal string 等各种类型,cnc 程序中使用 GVL 里 strVarName 定义的名称。不支持定义 array 数组类型变量

cnc 程序调用语法:

$<Variablenname>$

通过 $ 包围变量名称即可,示例如下:

N50 G01 Y50 + $R2$ F300

G36 可以给变量赋值,G37 可以修改变量值:

N00 G36 O$R1$ D5        (设置变量R1初始为5)
N10 G37 O$R1$ D-1       (给变量R1值减1)

N20 G36 O$STR1$ D'NAME'              (设置字符串变量初始)
N30 G37 O$STR1$ D'=MARCO'            (给字符串变量值添加字符)

如果需要重启可保持型变量,需要将变量单独定义在 Persistent Variables 类型 object 中,具体参考:codesys 定义重启可保持型变量

子程序

子程序调用支持无参数和带参数传递的模式,传递参数类型支持:BOOL, LREAL, 和 STRING,且必须使用 SMC_ReadNCFile2SMC_NCInterpreter 来解码程序。子程序文件扩展名必须是 .cnc

子程序存储路径需要在 SMC_ReadNCFile2 中指定,支持定义4个目录作为子程序索引:

VAR
    aSubProgramDirs    : ARRAY[0..4] OF STRING[174]  := ['_cnc', ''];
    fbReadFile         : SMC_ReadNCFile2;
END_VAR

****************************

fbReadFile(aSubProgramDirs := aSubProgramDirs);

子程序框架语法如下:

SUBPROGRAM SUB_PROG_1{#VAR1:LREAL,#VAR2:STRING}
N20 G01 X#VAR1 Y#VAR1 F100
END_SUBPROGRAM

如果有传递参数则需要写在大括号 {} 中定义。井号 # 表示定义的局部变量名称,可在子程序中使用。

子程序调用方式如下:

SUB_PROG_1{}                    (无传递参数的子程序调用)
N55 SUB_PROG_1{$R3$,'ABC'}      (有传递参数的子程序调用)

SMC_NCInterpreter 功能块中的 aActivePrograms : ARRAY[0..9] OF STRING 存储程序级嵌套,aActivePrograms[0] 存储当前运行程序名称,aActivePrograms[1] 存储即将调用的子程序名称。

数学表达式

想要支持更多的计数表达式,必须使用 SMC_ReadNCFile2SMC_NCInterpreter 来解码程序。

常用的加减乘除三角函数都是支持的,注意需要使用大括号 {} 来控制计算层级。给变量赋值还是需要使用 G36 G37 实现。

示例如下:

N00 G36 O$STR1$ D CONCAT{'NAME','=MARCO'}           (链接两个字符串)
N35 G36 O$R1$ D SIN{30/180*PI}                      (三角函数单位为弧度, PI 表示 3.1415926)
N36 G36 O$R2$ D SQRT{$R1$} * 3
N40 G01 X 100 / 3 * 2

支持的运算符号如下:
2023-08-17T03:09:32.png

支持的运算功能如下:
2023-08-17T03:10:20.png

本地局部变量

上面介绍了如何定义全局变量,需要在 POU 中定义然后才能在 cnc 程序中使用。也可以定义在程序内部使用的局部变量,每个子程序内最多可以定义 21 个局部变量。

使用关键词 LET 定义变量,主程序中必须定义在程序最开头,子程序中必须定义在子程序名称下一行,不需要写 N 行号。

定义语法如下:

LET <FormalParam> [:= <InitialValue>]

<FormalParam> ::= <ParamName> : <ParamType>
<ParamName>   ::= #[a-zA-Z0-9_]+

<ParamType> ::= LREAL | BOOL | STRING ; 字符串最大255字节

示例如下:

%VAR_TEST
LET #VAR1 : LREAL
LET #VAR2 : LREAL := 3
LET #VAR3 : LREAL := #VAR2 - 1
LET #VAR4 : BOOL := #VAR1 > #VAR2
LET #VAR5 : STRING

N00 G36 O#VAR5 D'TEST'
N05 G36 O$STR1$ D#VAR5
N10 X#VAR2 +100 Y#VAR3 +50 F100

N55 SUB_PROG_1{$R3$,'ABC'}
SUBPROGRAM SUB_PROG_1{#VAR1:LREAL,#VAR2:STRING}
LET #AAA : LREAL := 10
N10 G91
N20 G01 X#VAR1 + #AAA Y#VAR1 F100
END_SUBPROGRAM

以上就是 codesys 中使用 DIN 66025 标准编写 CNC 程序的基本语法及功能讲解,更多功能参考:CNC Language in DIN 66025

]]>