@cyysu
2018-04-21T05:23:44.000000Z
字数 2815
阅读 1223
- 时间: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 directory
copy "$(SolutionDir)\tools\CSharpFwLibIBuilder.exe" "$(TargetDir)"
echo #generate *.FWL
"$(TargetDir)\CSharpFwLibIBuilder" "$(TargetDir)\$(TargetFileName)"
#LibBuilder.exe
===============请复制下面内容=========================
echo #### execute the native library builder
copy "$(SolutionDir)\lib\mscorlib.dll" "$(TargetDir)"
echo #generate .cpp cli.cpp and .h
"$(SolutionDir)\tools\LibBuilder" "$(TargetDir)\$(TargetFileName)"
echo copy and rename .cpp
copy "$(TargetDir)\$(TargetName)-template.cpp" "$(TargetDir)\$(TargetName).cpp" /Y
echo copy and rename .h
copy "$(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;
}
}
重现编译,删除库,重新添加库,如下
运行的结果如下
以上内容有笔者自己编写,也有摘自互联网。摘自互联网部分笔者都会仔细阅读,确保符合笔者当时测试情况进行编写,当然在学习的过程中不可避免的有理解不到位的地方,还请读友批评指正。
支付宝 微信