CoDeSys



       CoDeSys是全球最著名的PLC内核软件研发厂家德国的3S(SMART,SOFTWARE,SOLUTIONS)公司出的一款与制造商无关的IEC 61131-1编程软件。CoDeSys 支持完整版本的IEC61131标准的编程环境,支持标准的六种编程语言。是一个标准的软件平台,被很多硬件厂家支持,可编程超过150家OEM生产的自动装置。CoDeSys提供了许多组合产品的扩充,诸如各种不同领域的总线配置程序、完全的目测化和运动控制系统。

       CoDeSys是一种功能强大的PLC软件编程工具,它支持IEC61131-3标准IL 、ST、 FBD 、LD、 CFC、 SFC六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等。


       CoDeSys是可编程逻辑控制PLC的完整开发环境(Controlled Developement System的缩写),在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,系统的编辑器和调试器的功能是建立在高级编程语言的基础上(如Visual C )。


       现在国内PLC用户使用的版本多为CoDeSys V2.3,最新的版本是CoDeSys V3(目前最新版本为V3.5)。V3 在软件架构上有了很大的改善,朝安全软件的方向发展,目前正在申请TUV关于EN 61508的SIL认证。


       HOLLSYS(和利时G3 PLC),Kinco(深圳步科F1 PLC),ABB AC500系列,IFM,EPEC,Rexroth,Wago,Parker,Beckhoff,Festo,施耐德等PLC厂家都是使用CoDeSys平台开发自己的编程软件的。当然了,还有很多其他公司。


       另外,CoDeSys也提供触摸屏功能(Visualization),但这不是他的强项,基本都是采用OPC 工控机的方案,ABB,倍福都有很好的方案,都是面向不差钱的客户。


3S竞争者

       CoDeSys的其他竞争对手还有KW、infoteam、ISAGRAF。听说infoteam(国内称一方梯队)也挺牛的,不太了解,想说说KW,同属于德国企业,主要是产品为multiprog。

KW的主要客户有菲尼克斯的AutomationWorx、富士电机的D300Win、研华的Multiprog,苞米勒的PLC和伺服系列,三菱应该也是它的大客户,但是编程方式却是按照日本人的习惯来的。


CoDeSys框架组成

两部分:

1、CoDeSys IDE。

   即CoDeSys集成开发环境,符合IEC61131编程规范,安装于PC机上,运行于Windows或者Linux下。由最终应用用户所使用的开发工具。

2、CoDeSys Runtime。

   即硬件平台系统。需要设备制造商与3S公司共同完成,3S公司需要评估硬件开发商所设计的硬件系统,并为其定制CoDeSys Runtime框架,客户需要为此向3S付费。然后硬件及系统开发商需要根据本系统的外围输入输入等配置,编写相应的驱动,并以库或者PLC Configure接口的形式提供给CoDeSys ID开发环境调用。实际上就是形成一套Target安装包。此外,CodeSys还会对每个使用其CoDeSys Runtime的设备贴标,设备供应商需要为每个3S标牌付费,作为其知识产权的一部分。

3、最终用户(应用开发商)可以下载通用的CoDeSys IDE。

   里面提供基本的IEC61131编程环境,但是对于一个具体的硬件PLC或者HMI,需要安装与该硬件相对应的Targets包。这个 Targets包的入口文件是*.tnf文件,有其来指定:

1、targets(*.tar)文件,对应 CoDeSys IDE的Target Setting项.

2、PlcConf文件夹下的*.cfg文件,对应CoDeSys IDE的PLC Configuration项。其安装路径由InstallTarget组件程序的Installation选项指定。反映在CoDeSys IDE上就是:Project\Options\Directories\Target\Configuration files: "**\*\PlcConf\"。

3、Lib文件夹下的诸*.lib文件,提供底层的CoDeSys Runtime的驱动接口。对应CoDeSys IDE的Library Manager。其安装路径由InstallTarget组件程序的Installation选项指定。反映在CoDeSys IDE上就是:Project\Options\Directories\Target\Libraries: "**\*\Libs\"。

Codesys的今生,未来?

Codesys的今生,未来?


上图,就是安装target的过程,也就是每个OEM厂家安装自己硬件的过程。


CoDeSys底层运行原理

Codesys的今生,未来?


   Codesys runtime是建立在OS上的,常见的OS有wince,windows,linux,vxworks。构建在OS的优势就在于系统的扩展性更强,PC的更多功能都可以在PLC上实现。

control task被操作系统每隔一段时间(典型是1ms)调用一次。

IEC task被内建的看门狗监控,监视PLC的实际工作周期是否超出预定时间,如果超出则IEC task任务停止,向系统报告错误。


   说到这里讲讲PLCOPEN的IEC 61131-3标准(这个IEC具体名字,网上现查的,方博士掌握的很好)。IEC 61131-3多任务操作系统,也没查到具体如何实现,自己之前做过嵌入式开发,了解OS以及RTOS,自认为和RTOS类似,热情高的朋友可以网上看看RTOS,重点是RTOS的优点是什么?欧洲的产品都很注重概念,概念理解了,就可以让你自由发挥。这里就多插一句,日系PLC在做大型项目时,还是和低端PLC一样,编程习惯类似汇编,编程上想要实现框架的概念非常难,因此在欧洲比较难推广。现在日系也在改进,加入了ST编程,使用了功能块,也算是日本人的妥协吧。

Codesys的今生,未来?


这里有几个概念:

优先级,数值越小优先级越高,根据任务的实时性,设定优先级

任务类型

循环:周期性执行任务

自由运行:只要启动程序就处理任务,CPU空闲就运行该task。

Event触发型:触发位的上升沿调用程序。外部事件触发功能,未定制的厂家此选项不能使用

看门狗(早期单片机上的一个概念,纺织程序进入死循环,提出了定时喂狗的概念,其本质就是一个减法定时器)

说说MCU如何使用watchdog吧。


while(1)

{

//用户自己写的程序

Watchdog = 10ms; //watchdog timer后台按照tick做减法,如果timer为0,就触发一个硬件中断,告诉用户程序在单位时间内没执行完,检查错误。正常则每次喂狗,设置timer为10ms

}



CoDeSys的watchdog定时监视PLC的实际工作周期是否超出预定时间,避免PLC在执行程序的过程中进入死循环,或者PLC执行非预定程序造成系统瘫痪。当任务超时,任务复位,进入初始状态,继续执行。


对比一下AB control logix的任务实现

control logix项目分为任务(task),程序(program)和例程(routine)。

任务(task):每个control logix控制器最多32个任务,仅有一个continuous任务,其余为Periodic或者event任务。

任务命名包括任务功能,优先级和执行周期

任务的三种类型:


1. 连续型任务,指的是周而复始连续执行的任务,一个项目只允许定义1个,亦可以不定义,等同于codesys中的PLC_PRG(POU)。

2. 周期型任务,定时中断执行的逻辑程序,需定义周期时间,设定优先级别,最多可以定义31个

3. 事件触发型任务,事件触发引起的任务调度,事件触发可以是外部输入点引起(如同PLC5/SLC),也可以由consumed tag引起或者直接指令调用引起,还可以由运动控制状态引起,需要设定优先级别,最多定义31个。

Control logix中的producer/consumer的概念非常好,体现在其组网能力上。比如某一个模块是消息的生产者,产生消息存放在消息块中,其他需要此变量的功能块,定义一个消息consumer即可。有兴趣的朋友可以自己看看相关资料。


CoDeSys的编程工具

IL 、ST、 FBD 、LD、 CFC、 SFC六种语言,我个人比较钟爱ST,CFC。

CodesysV2.3还是强调过程编程,到了V3.5则强调面向对象,C 的影子更多了。

言归正传,应用者也不需要关心那么多技巧,能实现功能,并且代码具有可维护性就是一个合格的工程师。


1.高级语言中的struct,union。

Stuct在西门子SCL语言中被称为UDT(user defined type),AB RSLogix 5000中也被称为UDT

TYPE TRAFFIC :

(RED, YELLOW:=1, GREEN:=10);

END_TYPE


TYPE STRUCT1 :

STRUCT

P1:INT;

P2:INT;

P3:INT;

END_STRUCT

END_TYPE


2.指针,c,c 中的顶级利器,在codesys中也可以使用

Example in ST:

pt:POINTER TO INT;

var_int1:INT;

var_int2:INT;

pt := ADR(var_int1);

var_int2:=pt^;


3.FC,FB的概念

Codesys的今生,未来?

Codesys的今生,未来?

Codesys的今生,未来?

Codesys的今生,未来?

Codesys的今生,未来?


上述是CoDeSys说明书的例程,不知道看出有什么不同?

FC在程序中直接调用即可,FB则需要先定义实例(instance),Instance: FUB。这里的Instance就是C 中的对象实例。怎么理解这个实例呢?上个最傻的高级语言的例子吧。


class Student

{

int age;

int sex;

int grade;


void DoWork(void);

};


Student tony, jany;


tony.age = 10;

tony.sex = male;

tony.grade = 3;

tony.DoWork();


jany.age = 9;

jany.sex = female;

jany.grade = 3;

jany.DoWork();


这里的DoWork就类似FB,可以看到FB带有自己独立的数据块,比如例中的age,sex,grade。


对比西门子S300/S400的FC、FB

1.FC不具备自己的存储区,FB有自己的存储区-背景DB。

2.FC和FB都有自己的TEMP变量,存储在系统的本地stack上。当FC和FB调用完毕,TEMP变量会释放。

3.FB有静态变量,FC没有。静态变量在背景DB中,FB调用完毕,静态变量仍然有效。

西门子300中,DB分为背景DB和共享DB,背景DB和FB相关联。

景DB和共享DB没有本质区别,它们的数据都可以被任何一个DB,FC或者FB读写。它们的区别在于使用目的:背景DB为FB提供数据,其数据格式和FB变量声明一致;共享DB目的为用户程序提供一个可保存的数据区。

Codesys的今生,未来?


如果对C比较熟悉,可以这样理解:FC和FB像C中的函数,只不过FB可以生成静态变量,在下次函数调用时数据可以保留,而FC的变量只在调用期内有效,下次调用又重新更换。每次调用FC的I/O区域必须要自己每次手动输入,而FB就不要,省去不少麻烦,如果在上位机控制直接输入DB控制地址就可!


看到这里,大家再思索一下,德系PLC的编程思想虽然实现形式不同,但强调的概念都一样,一定要理解这些概念,才能熟练应用。


4.PLC_PRG

PLC_PRG是一个预定义的POU(program of unit),每个工程必须包含这个特定的程序,这个POU在每个cycle中调用一次。其本质就是一个freewheeling程序。

如果使用了多任务,可以不包含PLC_PRG,按照任务配置表执行特定程序。


5.lib库的使用

Lib的使用体现了codesys高级语言的特性,支持math.lib,string.lib,canopen.lib,可以使用自定义的lib

Codesys的今生,未来?


用户自己实现的lib库,包含两种:Internal lib,External lib,有什么区别呢?

内部是完全利用CoDeSys实现的自定义lib库。外部库则需要利用相关的编译链去编译,更多被底层开发者所采用,可以直接利用OS底层的API进行编程,性能效率更高。


Codesys的今生,未来?

6.好用的case语句


CASE INT1 OF

1, 5:

BOOL1 := TRUE;

BOOL3 := FALSE;

2:

BOOL2 := FALSE;

BOOL3 := TRUE;

10..20:

BOOL1 := TRUE;

BOOL3:= TRUE;

ELSE

BOOL1 := NOT BOOL1;

BOOL2 := BOOL1 OR BOOL2;

END_CASE;


case语句是我比较喜欢的功能,可以实现手动自动,可以实现多工位。

K5 PLC没有日系的STL,也没有西门子的SCR指令,可以通过其他方式实现类case方法,大家也可以思考下。


更多CoDeSys的使用细节可参考CoDeSys说明书“CoDeSys_V23_E.pdf”

能想到的也就这些,暂时写到这里吧,文中更多强调的是概念,具体编程实现和技巧涉及很少,个人实战也不是很多,认识也有肤浅,大家看后有什么好的想法,也请告知,谢谢!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用halcon结合机械XY轴对相机进行9点标定

小哥哥小姐姐觉得有用点个赞呗! 先在halcon中计算仿射变换矩阵并验证 //在图像中找到的模板中心位置 PicX:[1680.721,2065.147,911.499,526.798,1290.920,1285.731,1300.953] PicY:[968.321,964.366,976.283,980.035, 587.055,394.727,1355.487] //与图像中查找…

Ubuntu Linux 提出新的发布模式——测试周

2019独角兽企业重金招聘Python工程师标准>>> 导读开源技术项目最大的优势之一就是社区的每个人都可以自由地提出想法,如果获得社区支持,它可以变成现实。著名的 Ubuntu 开发人员 Simon Quigley 就提出了一个可能改变 Ubuntu Linux 开发过程的…

【转】小白级的CocoaPods安装和使用教程

原文网址:http://www.jianshu.com/p/e2f65848dddc 百度有很多CocoaPods的安装教程.第一次看的时候,确实有点摸不透的感觉.经过思考,一步一步来实践,前后花了三十几分钟,才顺利使用..所以想了想,我还是写一个小白级的教程吧.细到每一个细节都说明. 让你不用10分钟解决…

常见错误总结

少打头文件 少打using namespace std; 命名冲突&#xff0c;全局变量与局部变量命名一致&#xff0c;导致使用的值不是期望值 边读边写&#xff0c;导致改后读&#xff0c;覆盖写入的值 长整数移位溢出&#xff0c;1<<63是错误的&#xff0c;应该写成1ll<<63 循环变…

HALCON相机标定相机内参相机外参

目录相机标定1.相机标定是什么2.怎么使用halcon进行相机内外参标定&#xff1f;&#xff08;1&#xff09;搭建硬件1.**相机连好电脑&#xff0c;用相机厂家软件打开相机&#xff0c;检查一下相机是否正常。**2.**接下来使用halcon连接相机**&#xff08;2&#xff09;开始标定…

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);会改变url中 &#xff1f; 后面的 搜索参数&#xff0c;但是controller不会重新实例化。angular 官方文档…

C#圆形卡尺测量程序基于halcon

废话不多说上源码 觉得帖子有用给点个赞哈 先来个效果图 下边的是源码&#xff0c;自己新建一个文件粘贴进去&#xff0c;包含到您现在的项目 中。这串源码后边是使用方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

科维PLC运行时系统ProConOS embedded CLR 2.2 特定应用

ProConOS embedded CLR是新型的开放式标准化PLC运行时系统&#xff0c;符合IEC 61131标准&#xff0c;可执行不同的自动化任务&#xff08;PLC、PAC、运动控制、CNC、机器人和传感器&#xff09;。   通过采用国际标准的微软中间语言&#xff08;依据IEC/ISO 23271标准为MSIL…

set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get()&#xff0c;同事问了我一些问题&#xff0c;我打算在博客中总结一下。 觉得帮助到了您&#xff0c;帮我点个赞哦。 属性访问器 其实说白了就是操作一个属性&#xff0c;更通俗一点说就是对一个变量的取值与赋值。 先来看get() get 访问…

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题&#xff0c;想了一个解决办法。 我们首先作假设&#xff0c;如果一条曲线有交点&#xff0c;那么它就是相交的对吧。可能大家想的都是这样&#xff0c;就开始找各种方法去识别交点。 我们换个角度想一下&#xff1a;是不是我们判断这条曲线是否带…

hdu 5813 Elegant Construction

水题 题意&#xff1a;有n个城市&#xff0c;给你每个城市能到达城市的数量&#xff0c;要你构图&#xff0c;输出有向边&#xff0c;要求无环&#xff0c;输出任意的解 例&#xff1a; Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

halcon相机标定及图像矫正(代码)

侵删 1 halcon相机标定和图像矫正 对于相机采集的图片&#xff0c;会由于相机本身和透镜的影响产生形变&#xff0c;通常需要对相机进行标定&#xff0c;获取相机的内参或内外参&#xff0c;然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变&#xff0c;其中径向畸变是由透…

函数参数的传递问题(一级指针和二级指针)

函数参数的传递问题&#xff08;一级指针和二级指针&#xff09; [转]原以为自己对指针掌握了&#xff0c;却还是对这个问题不太明白。请教&#xff01; 程序1&#xff1a; void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程 Ubuntu&#xff08;友帮拓、优般图、乌班图&#xff09;是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;Ubuntu 是基于DebianGNU/Linux&#xff0c;支持x86、amd64&#xff08;即x64&#xff09;和ppc架构&#xf…

CoDeSys的前世今生

&#xfeff;&#xfeff;工作以及网上看到不少人说&#xff0c;CoDeSys和西门子step7&#xff0c;在德国都属于标准过程&#xff0c;牛逼的小朋友都可以用其编程&#xff0c;不知真假&#xff0c;相信无风不起浪&#xff0c;多少有些依据&#xff0c;看看国內清一色的日系编程…

Eclipse中执行Ant脚本出现Could not find the main class的问题及解

试过了&#xff1a;https://blog.csdn.net/bookroader/article/details/2300337 但是不管用&#xff0c;偶然看到这篇没有直接关系的 https://blog.csdn.net/jiuyueguang/article/details/9350753 联想了一下。项目是JDK1.5&#xff0c;Eclipse是JDK1.8启动&#xff0c;所以在R…

视频通话研究002

还是关于视频质量。经測试&#xff0c;在公网server使用SQCIF(128x98)进行视频通话。2个client都是这个设置&#xff0c;感觉不出马赛克&#xff0c;模糊严重&#xff0c;在一个手机client抓包&#xff0c;例如以下&#xff1a; 第1,2行是client发到server的数据&#xff1b;第…

实力打脸: 量子隐形传输与 “瞬间移动” 毫无关系

有两个团队已经在量子隐形传输研究领域创造了新的传输记录&#xff1a;利用深不可测的量子力学知识将一个粒子的量子态迅速从一个位置迁移到另一个位置的粒子上。其中一个团队采用这种方法&#xff0c;运用一种光学纤维将一个光子的量子态穿越加拿大西南部的一个城市&#xff0…

Android初级教程:使用xml序列器

之前备份短信的时候生成xml都是手动拼写的&#xff0c;有一个问题&#xff1a;当短信里面存在</body>这样的标签的时候&#xff0c;最后结果就不是完整的xml文件&#xff0c;显然出错。但是&#xff0c;今天使用序列化器的方式&#xff0c;就能有效的解决上边遇到的问题。…

KUKA 声明变量时的几点注意

临时变量&#xff1a; 1、src文件中定义的局部变量&#xff0c;该种变量存在于内存中的栈上。子程序调用时&#xff0c;变量在栈上动态生成。调用结束后从栈中自动销毁。 因为存在于栈上的原因&#xff0c;访问该变量需要栈指针&#xff0c;所以该种变量无法在机器人程序运行时…