[关闭]
@cyysu 2018-04-21T05:23:44.000000Z 字数 2815 阅读 1223

Managed模式下开发一个功能块/功能

  • 时间:2018年4月21日08:47:34
  • 作者:Kali
  • 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
  • 版本:6.0
  • 描述:从初识到开发。

ECLR+Multiprog开发


eCLR二次开发内容


从上面可以看到我们对eCLR可以二次开发的内容还是很多的,包括固件功能和功能块,以及共享缓存接口,除此之外我们可以进行文件管理,可以将配置文件打包到eCLR镜像中,以及进行IO驱动开发,这些内容我们都会用一个Demo例子进行演示,先让我们开发一个简单的功能/功能块,开发这个有分成了两个模式,分别为Managed和Native模式

那么这两个模式有什么区别呢?Managed模式主要是进行一些简单的逻辑开发,与硬件无关的代码,用到的开发语言是C#,而Native开发模式就是用来开发一些驱动或者一些算法,用到的开发语言是C#、C++,其中C#用来开发应用程序对应的框架,声明接口,C++用来实现具体的细节。这其中就涉及到下面两个工具,一个是制作库的,一个是生成C++文件的工具,不管是Native模式还是Managed模式如果想要生成固件库都需要调用CSharpFwLibIBuilder.exe生成一个后缀名为.fwl文件,我们在将其导入到Multiprog即可以使用用户自定义的库。具体方式见下图

上面两种工具对应的生成后事件命令行的脚本如下:

  1. # CSharpFwLibIBuilder.exe
  2. ===============请复制下面内容=========================
  3. echo #### execute the MULTIPROG firmware library builder###
  4. echo #copy CSharpFwLibIBuilder.exe to the dll directory
  5. copy "$(SolutionDir)\tools\CSharpFwLibIBuilder.exe" "$(TargetDir)"
  6. echo #generate *.FWL
  7. "$(TargetDir)\CSharpFwLibIBuilder" "$(TargetDir)\$(TargetFileName)"
  1. #LibBuilder.exe
  2. ===============请复制下面内容=========================
  3. echo #### execute the native library builder
  4. copy "$(SolutionDir)\lib\mscorlib.dll" "$(TargetDir)"
  5. echo #generate .cpp cli.cpp and .h
  6. "$(SolutionDir)\tools\LibBuilder" "$(TargetDir)\$(TargetFileName)"
  7. echo copy and rename .cpp
  8. copy "$(TargetDir)\$(TargetName)-template.cpp" "$(TargetDir)\$(TargetName).cpp" /Y
  9. echo copy and rename .h
  10. copy "$(TargetDir)\$(TargetName)-template.h" "$(TargetDir)\$(TargetName).h" /Y

创建步骤

新建立项目

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

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

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

下面我们就可以编写代码了,如下程序

  1. using System;
  2. using Eclr;
  3. using System.Iec61131Lib;
  4. using System.Runtime.InteropServices;
  5. namespace FB_FU_Managed
  6. {
  7. // 在Managed模式是创建一个功能模块,这里面的function里的INT表示这个返回值是INT类型
  8. // 这里的类型要和IEC中的类型对应
  9. // DINT -> int
  10. // INT -> short
  11. [FUNCTION ("INT")]
  12. [Managed]
  13. public class myAdd
  14. {
  15. public static System.Int16 __Process(
  16. [VAR_INPUT("INT")] System.Int16 IN_1,
  17. [VAR_INPUT("INT")] System.Int16 IN_2)
  18. {
  19. return (System.Int16)(IN_1 + IN_2);
  20. }
  21. }
  22. }

编译输出的结果如下

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

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

复制到之后的目录如下

下面我们继续在编译一次我们的工程,看一下生成的文件,输出结果如下

切换到输出目录可以发现生成了FWL文件,如下

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

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

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

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

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

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

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

编译成功输出的标志如下

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

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

到此我们在Managed模式下创建功能就完成了。下来我们在同一个工程下创建一个功能块
代码如下:

  1. // 添加一个功能块
  2. [FUNCTION_BLOCK]
  3. [Managed]
  4. public class myTriggerCount
  5. {
  6. [VAR_INPUT("BOOL")]
  7. public System.Boolean TRIG;
  8. [VAR_OUTPUT("UINT")]
  9. public System.UInt16 COUNT;
  10. private System.Boolean trigger_last;
  11. public myTriggerCount() { }
  12. public void __Init()
  13. {
  14. trigger_last = false; COUNT = 0;
  15. }
  16. public void __Process()
  17. {
  18. if (trigger_last != TRIG & TRIG == true)
  19. {
  20. COUNT++;
  21. }
  22. trigger_last = TRIG;
  23. }
  24. }

重现编译,删除库,重新添加库,如下

运行的结果如下

结束语

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

打赏

                    支付宝                                                         微信

微信与支付宝支付

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注