PLCnext用三种方式去编写一个功能块

先前提到的基于eCLR,PLCnext可以通过几种高级语言编写功能块、函数、等等,今天我们来试一下利用IEC61131、C++、C#去制作加法功能块。


1.准备工具

PLCnext Engineer & 1152 Simulator

PLCnext Engineer是上位编程软件,免费,1152模拟器是用来模拟PLC的,免费。


 toolChain

ToolChain是用来进行C#和C++的编译的,免费 


Visual Studio 2019

社区版免费(不能商用),ToolChain需要Visual Studio才能运行


SDK

找到2023的版本


2.安装

PLCnext Engineer & 1152仿真

直接一路默认即可


Visual Studio 2019

按这个最小配置即可


PLCnext ToolChain 

勾选下面的配置(没安装2022应该是灰色,确保2019的所有选项都勾上了)

设置MSBuild路径 

打开Terminal或者cmd

$ plcncli set setting MSBuildPath "${VS2019安装目录}\MSBuild\Current\Bin\MSBuild.exe"

 如果VS2019默认安装路径,则如下:

$ plcncli set setting MSBuildPath "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"

SDK设置

打开Terminal或者cmd 设置安装的路径和sdk压缩包的位置

$ plcncli install sdk -d Path(希望sdk被安装的路径) -p path(axcf 1152.tar.xz,即sdk安装包中压缩文件的路径)
PS D:\SDK> plcncli install sdk -d .\1152\2023\ -p .\pxc-glibc-x86_64-mingw32-axcf1152-image-mingw-cortexa9t2hf-neon-axcf2152-toolchain-2023.0.tar.xz

[0%] Install SDK.
   -> [0%] Extracting tar.xz file
      -> [Infinite] Extracting .xz file pxc-glibc-x86_64-mingw32-axcf1152-image-mingw-cortexa9t2hf-neon-axcf2152-toolchain-2023.0.tar.xz...
         -> ..................................
      -> [Infinite] Extracting .xz file pxc-glibc-x86_64-mingw32-axcf1152-image-mingw-cortexa9t2hf-neon-axcf2152-toolchain-2023.0.tar.xz...: Done
   -> [50%] Extracting tar.xz file
      -> [0%] Extracting .tar archive
      -> [10%] Extracting .tar archive
      -> [20%] Extracting .tar archive
      -> [30%] Extracting .tar archive
      -> [40%] Extracting .tar archive
      -> [50%] Extracting .tar archive
      -> [60%] Extracting .tar archive
      -> [70%] Extracting .tar archive
      -> [80%] Extracting .tar archive
      -> [90%] Extracting .tar archive
      -> [100%] Extracting .tar archive
   -> [100%] Extracting tar.xz file
[100%] Install SDK.
Exploring the SDK D:\SDK\1152\2023\.
Successfully installed sdk .\pxc-glibc-x86_64-mingw32-axcf1152-image-mingw-cortexa9t2hf-neon-axcf2152-toolchain-2023.0.tar.xz in .\1152\2023\.

我们可以用命令行检查一下

PS D:\SDK> plcncli get sdks

{
  "sdks": [
    {
      "targets": [
        {
          "name": "AXCF1152",
          "version": "23.0.7.109",
          "longVersion": "2023.0.7 LTS (23.0.7.109)",
          "shortVersion": "23.0.7",
          "available": null
        }
      ],
      "path": "D:\\SDK\\1152\\2023\\"
    }
  ]
}

3. PLCnext创建工程

打开PLCnext Engineer(可能会有点久),选择1152 2023,双击首个项目,在Cockpit里选择仿真程序

设置好后,在项目上右键选择连接。第一次会比较久,账户名是admin,密码是plcnext,当然bilibili上也有更详细更丰富的教程,大家可以移步去看

PLCnext Simulator

b站 PLCnext教程

当然我们要编写程序的话,还是要断开连接 


4. IEC61131

展开工程,双击PLCnext,可以看到已经有一个示例程序叫做Main,我们在右侧组件栏双击,打开程序,选择FBD

在界面输入add

在引脚处分别输入var1 var2  输出设置为var1

 

鼠标框选后,上面会出现VAR  VARe字样,我们创建局部变量,点击VAR

在工程项目上右键,选择写入并启动项目

给var2一个值 2  开始运行


5. C#

打开Visual Studio,选择PLCnext C# Firmware Library

命名为CsharpAdd,选择放在同一目录 

在工程树目录右键添加新建项,选择PLCnext Function Block  名字叫做AddCs

using Iec61131.Engineering.Prototypes.Common;
using Iec61131.Engineering.Prototypes.Methods;
using Iec61131.Engineering.Prototypes.Pragmas;
using Iec61131.Engineering.Prototypes.Types;
using Iec61131.Engineering.Prototypes.Variables;
using System;
using System.Iec61131Lib;
using System.Runtime.InteropServices;

namespace CsharpAdd
{
    [FunctionBlock]
    public class AddCs
    {
        [Input]
        public short IN1;
        [Input]
        public short IN2;
        [Output]
        public short OUT;

        [Initialization]
        public void __Init()
        {
            // TODO: Initialize the variables of the function block here
        }

        [Execution]
        public void __Process()
        {
            OUT = (short)(IN1 + IN2);
        }
    }
}

 点击重新生成项目后,在资源目录的bin下面会出现文件

回到PLCnext Engineer中,我们把该库加载 

组件栏的编程下会出现CsharpAdd文件夹,里面有我们编译好的功能块,直接拖拽到之前IEC61131的程序中 

按照之前的方式,我们新建var3和var4,将var3作为输出 

右键项目进行写入和下装,给var4一个值,可以看到正常运行起来了

 6. C++

用C++需要用到C#去定义功能块的输入输出接口,由C++去实现功能

我们打开Visual Studio新建一个工程,叫做NativeAdd,SDK选择1152 2023

 

在工程树右键,添加新建项,选择PLCnext Native Function Block,名称叫做Addnativecpp.cs 

using System;
using System.Iec61131Lib;
using System.Runtime.InteropServices;
using Eclr;
using Iec61131.Engineering.Prototypes.Types;
using Iec61131.Engineering.Prototypes.Variables;
using Iec61131.Engineering.Prototypes.Methods;
using Iec61131.Engineering.Prototypes.Common;
using Iec61131.Engineering.Prototypes.Pragmas;

namespace NativeAdd
{
    [Native]
    [FunctionBlock]
    public class Addnativecpp
    {
        [Input]
        public short IN1;
        [Input]
        public short IN2;
        [Output]
        public short OUT;

        [Initialization]
        public void __Init()
        {
            //  No implementation in C# part; implement in native method
        }

        [Execution]
        public void __Process()
        {
            // No implementation in C# part; implement in native method
        }
    }
}

可以看到,接口定义和纯C#是类似的,但是Process里面是空的了,因为我们要用C++去编写逻辑。右键重新生成,然后打开资源目录

 进入Cpp文件夹,找到Addnativecpp-cli.cpp

// Addnativecpp native assembly code template.
// PHOENIX CONTACT Software embedded CLR native assembly builder tool generated source file.
// use this file to implement your own native code

#include "eclr.h"
#include "NativeAdd.h"

// class NativeAdd.Addnativecpp implementation
void __PInvoke__ NativeAdd::Addnativecpp::__Init()
{
    // implement your code here !
}

void __PInvoke__ NativeAdd::Addnativecpp::__Process()
{
    // implement your code here !
    OUT=IN1+IN2;
}

NativeAdd::Addnativecpp::Addnativecpp()
{
    // implement your constructor code here !
}

void __PInvoke__ NativeAdd::Addnativecpp::ctor()
{
    // automatically generated auxiliary constructor : calls the constructor by displacement new operator !
    // @Begin automatically generated code, do not modify !
    new (this) NativeAdd::Addnativecpp();
    // @End automatically generated code
}

 在终端输入 plcncli generate code

然后输入plcncli build all 

最后输入plcncli deploy 就可以得到我们的库了

同样添加用户库,添加var5 var6 ,输出为var5

 


总结

我们用简单的三种方式去进行建立功能块,当然C#和C++同时都可建立函数、实例程序

这里需要注意几点:

1. 纯C#的平台是全系通用,开发出一个功能块可以适用于所有PLCnext设备

2.C++的不是全系通用,需要根据不同的设备使用不同的SDK,不过好在在开发的时候可以选择多个SDK,一次性就能把所有的SDK都选上,功能块会自动匹配对应的设备类型。

3.C++可以结合第三方的代码,例如sqlite3、inflexdb、socket、mqtt等等。用户可以根据自己的功能去整合成功能块或者函数或者实例程序,灵活度非常高。

当然还有很多好玩的功能,后面我会慢慢讲(不定期更新))

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LZZ and MYY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值