先前提到的基于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等等。用户可以根据自己的功能去整合成功能块或者函数或者实例程序,灵活度非常高。
当然还有很多好玩的功能,后面我会慢慢讲(不定期更新))