西蒙学习笔记(1):CODESYS软件架构介绍
不知不觉学习CODESYS已经八个月了,既然做这个东西,就写些codesys相关的东西吧。后续也许会不定时更新。
CODESYS是一家总部位于德国的PLC软件提供商。具体来说,codesys自己不生产PLC,而是提供PLC的一整套软件解决方案。生产PLC的公司(OEM)可以直接使用CODESYS的软件(当然需要交钱),用于PLC编程软件的开发和PLC的固件开发。
首先来聊聊CODESYS软件的几个主要组成部分,包括上位机编程软件,软PLC,和PLC运行时。
CODESYS提供的PLC编程软件是一个符合IEC61131-3标准的上位机程序,预编译好的软件名叫CODESYS development system,可以在官网免费下载。同时给OEM公司提供的是一个叫CODESYS application platform的东西,是一套可以做二次开发的CODESYS development system,如果只做最基本的商标与产品名定制,则二者功能基本一致。
软PLC是收费的软件,分不同平台(Windows,Linux),是否支持运动控制,是否支持实时系统,可以支持多少个核,等等,有多套不同的授权。其中Windows 系统上的实时性由CODESYS自行开发的Windows内核补丁保证(好像是),Linux则依赖于著名的Linux实时补丁(所以好像Linux实时软PLC不单独收费)。软PLC由于没有专门的built-in IO支持,实际使用场景受限。但是可以考虑在云上使用,也有一定的部署便利性。注意一般软PLC的授权由最终用户直接向CODESYS购买,OEM代销则有其他规则。
PLC运行时则完全是一套开发工具,OEM企业需要根据自身实际的硬件设计来定制一套PLC固件。注意上边所有的软件都不提供源代码,CODESYS application platform本身是基于dotnet framework 4.8开发的,由于二次开发需要,会提供一些dotnet的接口文件。同时提供运行所需要的库文件。而PLC 运行时是C语言开发的,由于用户的硬件设计不同,PLC运行时的定制需要由OEM用户向CODESYS提交定制需求,并提供firmware platform SDK,由CODESYS用OEM提供的SDK重新编译PLC运行时的源代码,并向用户提供编译后的头文件以及二进制库文件用于二次开发出最终PLC的固件。s内核补丁保证(好像是),Linux则依赖于著名的Linux实时补丁(所以好像Linux实时软PLC不单独收费)。软PLC由于没有专门的built-in IO支持,实际使用场景受限。但是可以考虑在云上使用,也有一定的部署便利性。注意一般软PLC的授权由最终用户直接向CODESYS购买,OEM代销则有其他规则。
除了以上主要软件包之外,CODESYS的很多功能是通过独立的软件包方式提供的,作为plugin安装到编程环境中。CODESYS的编程环境与CODESYS运行时通信使用CODESYS开发的私有协议,支持设备扫描,下载程序,变量监视与调试等功能。
注意OEM并不一定需要同时定制编程环境和运行时的二次开发,一家PLC生产商完全可以只定制一套PLC运行时并生产,编程环境可以使用CODESYS提供的预编译环境CODESYS development system。对于PLC的定制参数可以通过DDF(设备描述文件,格式为CODESYS自定义)导入CODESYS development system。这样标准的CODESYS编程环境也可以为定制的PLC编程和调试。当然,只定制一个design time也是可以的,只是商业价值比较小。
下面我们分别聊聊CODESYS几个主要组成部分的大概架构。
CODESYS编程环境包含一下几个层级:
面对用户的部分
1. 面对用户的部分包括各种编程语言的编辑器(CODESYS支持多种61131-3标准定义的编程语言),各种输入输出,伺服和驱动的设置页面,网络通信设置页面等等。原生的用户界面基本都是使用Winform开发,复杂度高的编辑器使用GDI+做canvas开发。这一层级不同的语言或者设置都有自己的数据模型,在保存/打开工程时会自行处理保存/加载操作。开始放假,至元宵节后寒假结束。
第二个层级
2. 第二个层级是CODESYS language model。CODESYS language model是一套支持所有IEC61131-3标准的语言的language model集合,以ST为主要表现形式。这个层级可以说是CODESYS design time的核心。第一个层级中的各种编辑器与编程语言都需要提供生成对应的CODESYS language model的方法,比如LD语言是一个图形转ST的过程,而ST基本不需要转换,其他语言也都是一个转义的过程。各种参数设置在生成CODESYS language model时,会生成一些对应的全局变量类型(DUT)和全局变量(GVL)并生成初始化代码。这样就把一个PLC程序运行时所需要的信息全部集成到CODESYS language model中。
第三个层级
3. 第三个层级是CODESYS编译器,CODESYS编译器会扫描整个CODESYS language model,查找错误并汇报给客户。如果客户程序没有错误,编译器则会编译包括当前工程所安装的库在内的所有程序代码,并生成运行所需要的辅助代码,比如类型转换,task相关辅助函数,IO变量同步,下载与初始化代码等等等等(很多)。注意CODESYS编译器的输入是CODESYS language model,输出还是CODESYS language model,只是加了很多东西。
第四个层级
4. 第四个层级是代码生成器,CODESYS自行实现了一套自CODESYS language model生成目标运行环境本地代码的代码生成器,会输出机器码。CODESYS运行时可以在加载后直接跳转并运行,相对于解释执行可以提高速度。
除了这几个主要层级之外,还有很多辅助功能模块,比如上传下载,调式模块,比如库的管理模块,比如plugin的安装辅助程序,比如重构功能模块,比如脚本引擎等等等等。当然还包括自行开发的一套完整的软件架构支持模块,包括工程结构管理(project tree explorer),最重要的dependency injection等等。对于CODESYS编程环境的二次开发主要通过DI系统加载CODESYS的服务interface来与CODESYS进行交互。并通过plugin注入到CODESYS中为PLC开发人员提供服务。Plugin开发也不是完全免费的,需要向CODESYS咨询Plugin开发的收费许可。当然CODESYS还提供一个在线的plugin商店,开发者可以把plugin上传该商店并销售,与CODESYS共享收益。
CODESYS提供的独立软件包也比较有意思,稍微拆解一下可以更进一步了解codesys的架构。以CODESYS提供的EtherCAT包为例,一个EtherCAT包包括一下几部分内容:
一套用户界面,可以用来设置EtherCAT master/slave设备的各种参数
一个用来把EtherCAT master/slave设备参数参数转换成CODESYS language model的模块。
一系列ST语言实现的library interface,给用户用来在代码中引用,控制或者监控EtherCAT 的行为,或者调用与EtherCAT 设备通信的API。
一套完整的ST语言实现的EtherCAT 协议栈,用来在运行时中实际与EtherCAT 设备通信。由于CODESYS编程环境会把程序编译到不同平台,所以EtherCAT 的ST语言协议栈无法用预编译的方式提供,这里是提供源代码的,只是CODESYS 对这部分源代码做了保护,用户无法查看。(CODESYS 也提供用户使用C语言实现runtime library,用户需要自行编译library的本地代码,并提供一个ST实现的interface,用来集成到程序中。这种本地library由于无法跨平台,CODESYS 本身很少使用。)
软PLC可以视为一个为Windows或Linux的桌面版预编译的CODESYS 运行时,所以我们来聊聊CODESYS 运行时。不同于编程环境基于dotnet,CODESYS 运行时是C语言实现的,由于没有源代码,全面了解比较困难,我目前知道的主要功能包括,CODESYS 私有协议与上位机通信模块,程序管理模块(CODESYS 运行时支持多个程序存储在一台PLC上,我还不知道是否支持同时运行),客户程序运行模块,一个OPCUA的协议栈,有一个完整的SQLite(还不知道干什么用的),当然,运行时的基础框架也是CODESYS自行开发的,为了支持用户程序运行,CODESYS 运行时开发了自己的event system,memory management system,exception system,task schedule等等,像是一个小的操作系统一样。CODESYS 运行时的二次开发主要基于一套叫做PLC handler的开发接口实现,等学习了更新。
CODESYS 很大,东西很多,我也不知道怎么做全面介绍比较好,这里做一个类比。codesys可以类比dotnet,实现了一套完整的语言开发以及运行时。
-
1. C#/VB/managed C++/F#对应ST LD FBD CFC IL等等。
-
2.Visual Studio对应CODESYS development system。
-
3. dotnet IL 对应 CODESYS language model。
-
4. Roslyn 对应CODESYS compiler。
-
5. dotnet AOT 对应 CODESYS code generator (codesys不支持JIT)。
-
6. dotnet system libraries 对应 CODESYS libraries。
-
7. dotnet runtime 对应 codesys PLC runtime。
以上类比,应该可以比我解释的更直观一些。
这些就是CODESYS软件的架构介绍了,
更多细节或者来龙去脉,请耐心等待。
未完待续
2025年05月