ProConOS eCLR 二次开发中文手册
版本:
日期:
作者:
0.3
15/08/03
ProConOS eCLR 二次开发中文手册
发布列表:
名称 / 组织
上海代表处
公司
Phoenix Contact Software
菲尼克斯电气软件
Phoenix Contact Software GmbH
3.2
3.3
3.5
1.2.1
1.2.2
1.3
3.4.1
3.4.2
3.5.1
3.5.2
3.6.1
3.6.2
3.1.1
3.1.2
3.1.3
3.3.1
3.3.2
3.3.3
目录内容:
1 概述 ................................................................................................................................................... 3
1.1 定义 ............................................................................................................................................ 3
1.2 MULTIPROG 简介 ...................................................................................................................... 3
什么是 MULTIPROG ........................................................................................................... 3
MULTIPROG 特性介绍 ....................................................................................................... 3
ProConOS eCLR 介绍................................................................................................................ 4
2 ProConOS eCLR 内核启动流程介绍 ................................................................................................. 6
3 ProConOS eCLR 内核二次开发 ........................................................................................................ 9
3.1 相关概念介绍 .............................................................................................................................. 9
固件库 ................................................................................................................................. 9
IEC61131 数据类型与 C#数据类型的对应 .......................................................................... 9
Managed 与 Native 概念 ...................................................................................................10
ProConOS eCLR 内核二次开发内容 ........................................................................................10
ProConOS eCLR 固件库开发 ...................................................................................................13
固件库开发资源准备 .........................................................................................................13
固件库工程创建步骤 .........................................................................................................14
功能/功能块开发方法及示例 ..............................................................................................18
3.4 共享缓存区开发方法及示例 ......................................................................................................41
共享内存的原理 .................................................................................................................41
共享缓存的创建示例 .........................................................................................................42
IO 驱动开发方法及示例 ............................................................................................................44
IO 驱动开发的原理介绍 .....................................................................................................44
IO 接口开发示例程序 ........................................................................................................50
3.6 错误管理 ...................................................................................................................................57
错误管理 API 介绍 .............................................................................................................58
触发错误信息示例 .............................................................................................................60
3.7 回调函数介绍 ............................................................................................................................65
回调函数的原理 .................................................................................................................65
注册回调函数示例 .............................................................................................................67
3.8 异常处理 ...................................................................................................................................72
异常处理 API 介绍 .............................................................................................................72
示例代码 ............................................................................................................................72
3.9 事件驱动的任务 ........................................................................................................................73
原理介绍 ............................................................................................................................73
在 Multiprog 中添加自定义事件 .........................................................................................75
在控制器中触发事件任务 ..................................................................................................77
在 Multiprog 中添加自定义系统异常事件 ..........................................................................79
在控制器中触发系统异常任务 ...........................................................................................81
3.10 文件管理 ...............................................................................................................................83
文件管理原理 .................................................................................................................83
文件打包方法 .................................................................................................................83
3.11 掉电保持数据的注册方法 ......................................................................................................86
掉电保持数据区注册 API 介绍 .......................................................................................86
掉电保持数据区应用示例 ...............................................................................................86
3.12 在线不停机程序下载 .............................................................................................................87
不停机下载原理 .............................................................................................................87
支持不停机下载固件功能块示例 ....................................................................................87
3.13 过程数据目录(PDD)操作相关函数说明及其示例 ..............................................................88
PDD 函数介绍 ...................................................................................................................88
固件功能块示例 .............................................................................................................88
3.9.1
3.9.2
3.9.3
3.9.4
3.9.5
3.7.1
3.7.2
3.8.1
3.8.2
3.13.1
3.13.2
3.10.1
3.10.2
3.11.1
3.11.2
3.12.1
3.12.2
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
1 / 115
菲尼克斯电气软件
Phoenix Contact Software GmbH
3.14.1
3.14.2
3.15.1
3.15.2
3.15.3
3.14 强制变量操作相关函数说明及示例工程 ................................................................................90
强制变量操作 API 说明 ..................................................................................................90
示例工程 ........................................................................................................................92
3.15 添加功能/功能块帮助文档及描述信息 ...................................................................................96
在编辑向导中添加固件功能块描述信息 .........................................................................96
固件库添加帮助文档 ......................................................................................................97
用户库添加帮助文档 ......................................................................................................97
4 Multiprog 客户端定制化 ...................................................................................................................98
4.1 安装目录介绍 ............................................................................................................................98
4.2 裁剪配置项 ...............................................................................................................................99
4.3 配置设备描述相关文件 ...........................................................................................................100
4.4 添加 IO 驱动到 IO 配置列表中 ................................................................................................103
4.5 MULTIPROG 添加固件库 .......................................................................................................104
ProConOS eCLR 其他开发内容 ........................................................................................................106
5.1 在 x86+INtime 平台实现微秒级任务 .......................................................................................106
eCLR 内核中任务调度时间关系 ......................................................................................106
微秒级周期任务的设置方法 .............................................................................................107
6 FAQ ...............................................................................................................................................108
6.1 修改 eCLRDeviceProfiles.xml 后出现的问题 ..........................................................................108
IO 的周期和任务的周期不一样 ...............................................................................................109
6.2
6.3 C#固件库中定义的数据类型如何提供给终端客户使用? .......................................................110
6.4 Multiprog5.35 build 519 中如何在监视时使用正常的小数显示,而不是显示为科学计数法形式?
6.5 如何在 MultiProg 中查看任务执行的相关信息? ....................................................................111
6.6 如何让 PLC 启动时自动加载 PLC 应用程序并运行 ................................................................112
6.7 MultiProg Express5.35 如何支持事件任务 .............................................................................113
7 修订历史 ........................................................................................................................................115
5
5.1.1
5.1.2
110
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
2 / 115
菲尼克斯电气软件
Phoenix Contact Software GmbH
1 概述
本文档主要讲解 ProConOS eCLR 的二次开发相关内容。本文档不涉及如何使用 Multiprog 进行
PLC 应用编程等相关内容。拥有该文档者为负责 ProConOS eCLR 二次开发相关人员。
1.1 定义
配置(CONFIGURATION):对应于一个 PLC 系统工程;
资源(RESOURCE):对应于一个 CPU 处理器。
POU(Program Organization Units):程序组织单元,是 PLC 程序的基本单位;
1.2 MULTIPROG 简介
1.2.1
什么是 MULTIPROG
MULTIPROG 编程系统是专门用于设计以及管理 IEC61131 应用程序,其支持 eCLR 运行系统,并
且提供了功能块图(FBD), 梯形图(LD), 结构化文本(ST), 指令表(IL), 顺序流程图(SFC),并且带有在线监
控,强制/覆盖,逻辑分析器等强大功能。
图 1-1 Multiprog 界面介绍
1.2.2
MULTIPROG 特性介绍
目前 MULTIPROG 版本分为 Pro 版本与 Express 版本,目前这两种版本基本编程功能上是相同的,
都支持 5 种 IEC61131 编程语言,多任务的架构。当然在功能上有一些区别,例如在 Pro 版本下支持 16
个任务,同时能管理现场 100 个控制器,而在 Express 版本下只能支持 5 个任务,同时能管理现场的 1
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
3 / 115
菲尼克斯电气软件
Phoenix Contact Software GmbH
个控制器。关于 Multiprog 的应用开发及使用方法,请参考 Multiprog 自带的帮助文档或者 Phoenix
Contact Software 所提供的文档。
1.3 ProConOS eCLR 介绍
ProConOS eCLR (Programmable Controller Operating System embedded Common Language R
untime)是 Phoenix Contact Software 开发最新一代的 PLC 运行系统,符合 IEC61131 标准,可以满足
不同的自动化应用(PLC, PAC, 运动控制, CNC, 机器人等)由于采用机器码执行的方式,因此执行 IEC
61131 代码的效率十分高。
ProConOS eCLR 是基于.NET CLR 技术并且完全为工业控制应用而设计的。因此 eCLR 运行在嵌
入式平台上并且支持不同的 CPU。eCLR 提供了一个功能强大,开放,标准以及平台无关的编程接口,
并且是一个为自动化设备设计的通用的运行系统,这就意味着,在 eCLR 中能够执行不同语言(一般为
C#编程语言)的代码,而并不是单独的 IEC61131 代码。同时 ProConOS eCLR 提供了开放式的二次开
发接口,便于扩展客户自定义算法模块,共享缓存,各种类型 IO 接口等。
图 1-2 ProConOS eCLR 软件架构
图 1-3 ProConOS eCLR 开放的接口
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
4 / 115
菲尼克斯电气软件
Phoenix Contact Software GmbH
图 1-4 ProConOS eCLR 在多种平台上的支持
图 1-5 系统结构
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
5 / 115
菲尼克斯电气软件
Phoenix Contact Software GmbH
2 ProConOS eCLR 内核启动流程介绍
本章节结合 Windows 平台内核 eCLRSample 从以下 8 个步骤来介绍 eCLR 内核的启动流程。
1) 创建控制器实例
if (ClrController::Create("Default", new char[CONTROLLER_DATA_SIZE], CONTROLLER_DATA_SIZE) == NULL)
{
printf("Setup controller failed!\n");
return 0;
}
该函数主要用于对 eCLR 运行环境以及资源的检查和测试,并对 Controller 实例进行初始化。如果
失败则会返回 NULL。以下情况有可能导致创建失败:
当前工程中 C++构造函数不支持(No support of C++ constructor methods);
注册的 Heap 资源不够,最好在 16kBytes 以上;
Core-Libraries 注册安装失败;
为了避免以上情况的发生,请在移植之前使用 Phoenix Contact Software 所提供的环境测试程序进
行测试。
2) 设置 PLC 任务的优先级范围
每个 PLC 任务都对应于操作系统上的一个任务,所以在创建一个 PLC 任务时,在控制器中要给其
设定一个合理的系统优先级,所以在此要给 eCLR 内核注册创建的 PLC 任务的优先级范围。
一般把优先级分为三个优先级范围等级:
Low-Priority: 最低优先级等级,一般用来设置优先级比较低的任务,例如通讯任务
Remoting-Daemon 运行在该优先级;
Normal-Priority: 用户创建的 PLC 任务运行在该优先级范围;在 Multiprog 中任务设置的逻辑
优先级会映射到该范围中;
Highest-Priority: 最高优先级,一般情况下,PLC 任务的调度任务运行在该优先级;.
对于每个优先级等级,ProConOS eCLR 内核中都有相应的函数用来注册该优先级范围,如下为运
行在 Windows 平台的示例:
// only one prio level available
mscorlib::PriorityClass::SetLowest(-7, -7);
// 12 level avalable
mscorlib::PriorityClass::SetNormal(-6, 5);
// only one prio level available
mscorlib::PriorityClass::SetHighest(6, 6);
3) 注册设备参数
为了区分不同的控制器设备,可以在此注册相应的设备描述信息,部分信息可以在 Multiprog 的
“工程控制对话框”中的“信息”窗口查看到,关于参数的说明请参考如下参数表。
CDeviceInfo* pDeviceInfo = ClrController::getDeviceInfo();
pDeviceInfo->setAttribute(CDeviceInfo::Manufacturer, "Phoenix Contact");
pDeviceInfo->setAttribute(CDeviceInfo::ProductName, "eCLR");
pDeviceInfo->setAttribute(CDeviceInfo::HardwareVersion, "1.0");
pDeviceInfo->setAttribute(CDeviceInfo::FirmwareVersion, "1.0");
pDeviceInfo->setAttribute(CDeviceInfo::TimerResolution, 1000);
pDeviceInfo->setAttribute(CDeviceInfo::ScheduleInterval, 1000);
pDeviceInfo->setAttribute(CDeviceInfo::MaxApplImageFilesSize, MAXIMAGESIZE);
pDeviceInfo->setAttribute(CDeviceInfo::MaxApplImageSize, MAXIMAGESIZE);
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
6 / 115
菲尼克斯电气软件
Phoenix Contact Software GmbH
表格 1 设备描述参数表
参数
Manufacturer
ProductName
HardwareVersion
FirmwareVersion
TimerResolution
ScheduleInterval
描述
设置设备厂商名称信息
设置设备名称,显示在 Multiprog 的资源信息窗口中;
硬件版本信息
固件库版本信息,显示在 Multiprog 的资源信息窗口中;
时钟周期,显示在 Multiprog 的资源信息窗口中;
调度周期;
MaxApplImageFilesSize 设定最大的 PLC 应用程序镜像文件大小,包含打包进来的文件;
MaxApplImageSize
设定最大的 PLC 应用程序镜像文件大小,不包含打包进来的文件;
设定 PLC 应用程序数据空间大小;
DataHeap
4) 创建应用程序运行域
应用程序域是 CLI(Common Language Infrastructure)中的概念,在此要注册 PLC 应用程序所需要
的额外的资源。每个资源的应用程序都在一个单独的应用程序域中运行。
获取应用程序域,创建成功后,则返回应用程序域的指针。
ClrAppDomain* pAppDomain = ClrController::CreateDomain("Default");
if (pAppDomain == NULL)
{
printf("Setup default domain failed!\n");
return 0;
}
注册其他资源
在下载 PLC 程序之前,必须要注册 PLC 应用程序数据区域以及预设值的 PLC 应用程序代码执行区
域等资源,如下所示。
pAppDomain->SetDataMemory(new char[APPLICATION_DATA_SIZE], APPLICATION_DATA_SIZE);
pAppDomain->SetCodeMemory(new char[APPLICATION_CODE_SIZE], APPLICATION_CODE_SIZE);
注册 PLC 应用程序本地写入接口
一般 PLC 应用程序文件需要下载到本地,以便于在下次掉电重启时能自动从本地加载到内存中来
运行。通过如下代码注册本地写入接口。
pAppDomain->SetImageStream(&pcosImageFile);
5) 注册固件库
// Announcing native libraries modules to eCLR kernel.
if (demoio::init() == true)
{
if (demoio::loadLibrary() == false)
{
printf("Could not load demo io library!");
}
}
else
{
printf("Could not initialize demo io library!");
}
6) 创建 PLC 状态机接口,启动 PLC
尽管应用程序域管理着 PLC 的所有资源,但在具体的实现过程中,PLC 的状态机是在类
CPcosDomain 中来实现的,通过如下代码来获取并且启动 PLC 状态机的实例。
上海市徐汇区宜山路 889 号 齐来大厦 1902 室 邮编 200233 Tel: 021 5228 9958/5228 9957 Fax: 5228 9956
Room 1902, Qilai Bldg, 889 Yishan Road West, Shanghai, 200233, PR China
7 / 115