@cyysu
2018-04-21T05:23:44.000000Z
字数 2815
阅读 1343
- 时间:2018年4月21日08:47:34
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
- 版本:6.0
- 描述:从初识到开发。
ECLR+Multiprog开发
从上面可以看到我们对eCLR可以二次开发的内容还是很多的,包括固件功能和功能块,以及共享缓存接口,除此之外我们可以进行文件管理,可以将配置文件打包到eCLR镜像中,以及进行IO驱动开发,这些内容我们都会用一个Demo例子进行演示,先让我们开发一个简单的功能/功能块,开发这个有分成了两个模式,分别为Managed和Native模式
那么这两个模式有什么区别呢?Managed模式主要是进行一些简单的逻辑开发,与硬件无关的代码,用到的开发语言是C#,而Native开发模式就是用来开发一些驱动或者一些算法,用到的开发语言是C#、C++,其中C#用来开发应用程序对应的框架,声明接口,C++用来实现具体的细节。这其中就涉及到下面两个工具,一个是制作库的,一个是生成C++文件的工具,不管是Native模式还是Managed模式如果想要生成固件库都需要调用CSharpFwLibIBuilder.exe生成一个后缀名为.fwl文件,我们在将其导入到Multiprog即可以使用用户自定义的库。具体方式见下图
上面两种工具对应的生成后事件命令行的脚本如下:
# CSharpFwLibIBuilder.exe===============请复制下面内容=========================echo #### execute the MULTIPROG firmware library builder###echo #copy CSharpFwLibIBuilder.exe to the dll directorycopy "$(SolutionDir)\tools\CSharpFwLibIBuilder.exe" "$(TargetDir)"echo #generate *.FWL"$(TargetDir)\CSharpFwLibIBuilder" "$(TargetDir)\$(TargetFileName)"
#LibBuilder.exe===============请复制下面内容=========================echo #### execute the native library buildercopy "$(SolutionDir)\lib\mscorlib.dll" "$(TargetDir)"echo #generate .cpp cli.cpp and .h"$(SolutionDir)\tools\LibBuilder" "$(TargetDir)\$(TargetFileName)"echo copy and rename .cppcopy "$(TargetDir)\$(TargetName)-template.cpp" "$(TargetDir)\$(TargetName).cpp" /Yecho copy and rename .hcopy "$(TargetDir)\$(TargetName)-template.h" "$(TargetDir)\$(TargetName).h" /Y
新建立项目

设置Net Framework2.0,eCLR最大支持到2.0

勾选上允许不安全代码,这里表示允许指针的使用

添加我们eCLR开发所需要的库

下面我们就可以编写代码了,如下程序
using System;using Eclr;using System.Iec61131Lib;using System.Runtime.InteropServices;namespace FB_FU_Managed{// 在Managed模式是创建一个功能模块,这里面的function里的INT表示这个返回值是INT类型// 这里的类型要和IEC中的类型对应// DINT -> int// INT -> short[FUNCTION ("INT")][Managed]public class myAdd{public static System.Int16 __Process([VAR_INPUT("INT")] System.Int16 IN_1,[VAR_INPUT("INT")] System.Int16 IN_2){return (System.Int16)(IN_1 + IN_2);}}}
编译输出的结果如下

切换到输出目录下,可以发现并没有生成对应的库文件,原因就在于我们没有执行编译完之后应该执行的那段脚本,那好我们填写一下,如下

将这两个目录复制到项目的根目录下,后面需要用到工具去生成FWL文件
复制到之后的目录如下

下面我们继续在编译一次我们的工程,看一下生成的文件,输出结果如下
切换到输出目录可以发现生成了FWL文件,如下

下面我们就开始建立一个Multiprog的程序,来测试一下我们这个功能。这里我们用模板建立一个工程,如下

点击属性,查看PLC/处理器的类型是否正确,同时这里可以对程序进行权限保护


然后就是查看链接方式与版本

这里我们先用Multiprog自带的仿真器进行试验

建立好工程之后就是插入我们的用户库,如下

可以看到右侧出现了我们这个工程的名字以及其里面的功能,如下

加入我们自己的功能,然后建立三个变量V000、V001、V002

编译成功输出的标志如下

打开调试,进行测试我们的模块

我们更改一个数值进行试验一下,如下


到此我们在Managed模式下创建功能就完成了。下来我们在同一个工程下创建一个功能块
代码如下:
// 添加一个功能块[FUNCTION_BLOCK][Managed]public class myTriggerCount{[VAR_INPUT("BOOL")]public System.Boolean TRIG;[VAR_OUTPUT("UINT")]public System.UInt16 COUNT;private System.Boolean trigger_last;public myTriggerCount() { }public void __Init(){trigger_last = false; COUNT = 0;}public void __Process(){if (trigger_last != TRIG & TRIG == true){COUNT++;}trigger_last = TRIG;}}
重现编译,删除库,重新添加库,如下

运行的结果如下

以上内容有笔者自己编写,也有摘自互联网。摘自互联网部分笔者都会仔细阅读,确保符合笔者当时测试情况进行编写,当然在学习的过程中不可避免的有理解不到位的地方,还请读友批评指正。
支付宝 微信