
1.2 CoDeSys功能⼀览 (4)
2. CoDeSys组成 (7)
2.1 ⼯程组件 (7)
程序 (11)
2.2 语⾔ (14)
2.2.1 指令表 (14)
2.2.2 结构化⽂本 (16)
2.2.3 顺序功能图(SFC) (21)
2.2.4 功能模块图 (25)
2.2.5 连续功能图表编辑器 (25)
2.2.6 梯形图 (25)
2.3 调试、联机功能 (27)
2.4 标准化 (28)
3. 我们来编写⼀个⼩程序 (29)
3.1 控制⼀个交通灯信号单元 (29)
3.2 可视化交通信号单元 (38)
4. 各个单独的组件 (43)
4.1 主窗⼝ (43)
4.2 ⼯程选项 (45)
4.3 管理⼯程 (62)
4.3.1 '⼯程' '数据库连接' (85)
4.4 管理⼯程中的对象 (91)
4.5 编辑功能 (98)
4.6 联机功能 (104)
4.7 设置窗⼝ (117)
4.8 帮助 (118)
5. CoDeSys中的编辑器 (119)
5.1关于所有的编辑器 (119)
5.2 声明编辑器 (120)
5.3 声明编辑器中的预处理pragma指令 (128)
5.4 ⽂本编辑器 (135)
5.4.1 指令表编辑器 (138)
5.4.2 结构化⽂本编辑器 (139)5.5 图形化编辑器 (140)
5.5.1 功能模块图编辑器 (143)
5.5.2 梯形图 (147)
5.5.3 顺序功能图表编辑器 (153)
5.5.4 连续功能图表编辑器 (161)
6. 资源 (172)
6.1 全局变量、变量配置、⽂件框架 (172)
6.1.1 全局变量 (172)
6.1.2 变量配置 (176)
6.1.3 ⽂档框架 (177)
6.2 报警配置 (178)
6.3 库管理器 (186)
6.4 ⽇志记录 (187)
6.5 任务配置 (1)
6.6 监控和配⽅管理器 (195)
6.7 ⼯作空间 (197)
6.8 对象系统设置 (197)
6.9 PLC 配置 (198)
6.9.1 综述 (198)
1
CoDeSys V2.3 - -
- CoDeSys V2.3 2
6.9.2 PLC配置中的⼯作 (199)
6.9.3 PLC配置中的⼀般设置 (199)
6.9.4 定制特定的参数的对话框 (200)
6.9.5 I/O模块配置 (201)
6.9.6 通道配置 (203)
6.9.7 Profibus模块的配置 (204)
6.9.8 CAN 模块的配置 (211)
6.9.9 Can驱动器的配置 (215)
6.9.10 在线模式中的PLC配置 (218)
6.9.11 来⾃PLC的硬件扫描/状态/诊断信息 (219) 6.10 采样追踪 (219)
6.10.1 综述和配置 (219)
6.10.2 采样追踪的显⽰ (220)6.10.3 保存采样追踪 (222)
6.10.4 外部采样追踪配置 (222)
6.11 参数管理器 (223)
6.11.1 参数管理器的编辑 (224)
6.11.2 参数列表的导出、导⼊ (228)
6.11.3 在线模式下的参数管理 (228)
6.12 PLC浏览器 (229)
6.13 ⼯具 (232)
7. ENI (237)
8. DDE接⼝ (239)
8.1 CoDeSys程序设计系统的DDE接⼝ (240)
8.2 DDE⽹关服务器的DDE信息 (240)
9. CoDeSys的许可证管理器 (243)
10. 附录 (244)
附录A:IEC操作符和额外的标准扩展功能块 (244)
10.1 算术操作符 (244)
10.2 位串操作符 (247)
10.3 移位操作符 (249)
10.4 选择操作符 (251)
10.5 ⽐较操作符 (253)
10.6 地址操作符 (255)
10.7 调⽤操作符 (256)
10.8 类型变化 (257)
10.9 数字操作符 (262)
10.10 初始化操作符 (265)
附录B:CoDeSys中的操作数 (266)
10.11 常量 (266)
10.12 变量 (268)
10.13 地址 (270)
10.14 功能 (271)
附录C:CoDeSys中的数据类型 (272)
10.15 标准数据类型 (272)
10.16 已定义的数据类型 (273)
附录D:CoDeSys程序库 (279)
10.17 http://www.doczj.com/doc/b4dd20593086bceb19e8b8f67c1cfad6195fe9f9.html b标准库 (279)10.17.1 字符串功能 (279)
10.17.2 双稳功能程序 (283)
10.17.3 触发器 (284)
10.17.4 计数器 (285)
10.17.5 定时器 (287)
10.18 Util.lib库 (290)
10.18.1 BCD 转换 (290)
10.18.2 位/字节功能 (290)
10.18.3 数学辅助功能 (291)
10.18.4 控制器 (293)
10.18.5 信号⽣成 (294)
10.18.6 功能操作器 (296)
10.18.7 模拟值的处理 (297)
10.19 AnalyzationNew.lib库 (298) 10.20 CoDeSys系统程序库 (299)
附录E:操作符及程序库模块总结 (299) 10.21 CoDeSys中的操作符: (299) 10.22 Standard.lib库的元素: (302) 10.23 Util.lib库的元素: (303)
附录F:命令⾏/命令⽂件 (303)
10.24 命令⾏相关命令 (303)
10.25 命令⽂件(cmdfile)命令 (304)附录G:导⼊Siemens产品数据 (310) 10.26 导⼊⼀个SEQ符号⽂件 (311) 10.27 将S5转换成IEC 61131-3 (311) 10.28 导⼊⼀个S5⼯程⽂件 (314)
1. 附录I 应⽤键盘 (315)
10.34 应⽤键盘 (315)
10.35 组合键 (315)
CoDeSys中的关键字 (318) CoDeSys ⽂件 (321)
附录K 关于编译错误和警告 (323) 10.41 警告 (323)
10.42 错误 (327)
3CoDeSys V2.3 - -
- CoDeSys V2.3 4
1. CoDeSys简要介绍
1.1 CoDeSys是什么
CoDeSys是可编程逻辑控制PLC的完整开发环境(CoDeSys是Controlled Developement System 的缩写),在PLC程序员编程时,CoDeSys为强⼤的IEC语⾔提供了⼀个简单的⽅法,系统的编辑器和调试器的功能是建⽴在⾼级编程语⾔的基础上(如Visual C++)。
1.2 CoDeSys功能⼀览
如何构建⼀个⼯程?
⼀个⼯程放在以⼯程命名的⽂件中,新⼯程中创建的第⼀个程序组织单元POU⾃动命名为PLC_PRG,程序从这⾥开始执⾏(相当于C程序中的主函数),从这⼀点能够访问其它的POUs(程序, 功能块和功能)。
⼀旦定义了⼀个任务配置,就不必创建程序PLC_PRG 了。在任务配置章节将讲到更多的内容。
在⼯程中有不同的对象:POUs、数据类型、可视化和资源。
对象管理器中包含了⼯程中的所有对象。
如何建⽴⼀个⼯程?
⾸先,为了保证在⼯程⽂件中使⽤的地址的正确性,应该配置PLC。
然后创建解决问题所需要的POUs。
当程序编写完成时,可以编译这个⼯程并去除所有的错误。此刻可以⽤你所喜欢的编程语⾔来编写这些POUs。
如何测试⾃⼰的⼯程?
⼀旦排除了所有的错误,激活仿真模式,登录⼊仿真的PLC并在PLC中“加载”⼯程⽂件,此时处于联机模式。
现在打开⼀个PLC配置的窗⼝测试⼯程的时序正确性,⼿动为此输⼊输⼊变量,观察输出变量是不是所期望的。你也可以观察POU中的局部变量的序列值,在监视和接收管理器中可以配置你希望检查的值的数据记录。
调试
你可以在程序出错的地⽅设置断点。当程序运⾏后停在断点处时,你可以及时检查在这个点处所有变量的值,通过⼀步⼀步(单步) 执⾏,你可以检查程序的逻辑正确性。
附加的联机功能
更多的调试功能:
你可以设置程序变量并输⼊输出某些值。
你可以通过流程控制来检查那些程序⾏已完成运⾏。
⽇志⽂件按照时间的顺序记录了联机模式下的操作以及⽤户⾏为和内部进程的情况。
如果在⽬标设置中激发了采样追踪,那么它允许你在⼀个较长的过程中来追踪和显⽰变量值的真实变化过程。
PLC浏览器是⽬标系统的⼀个特殊功能,它能够⽤来向PLC请求某些信息。
当⼯程完成了建⽴和测试后,它也能够装载到硬件中并进⾏测试。和仿真模式式下有相同的联机功能。
附加的CoDeSys功能
整个⼯程可以在任何时候⽂档化或导出到⼀个⽂本⽂件中。
为了通讯的⽬的,CoDeSys有⼀个符号接⼝和⼀个动态数据交换(DDE)接⼝。⽹关服务器和OPC 服务器和动态数据交换服务器是CoDeSys的标准安装软件包的组件。
使⽤恰当的⽬标设置能够把相同的CoDeSys⼯程加载到不同的⽬标系统中,可以通过⽬标⽂件来加载这些⽬标设置。
通过当前的⽬标设置来激活⽹络全局变量和参数管理器。可以在控制器⽹络中交换数据。
通过ENI服务器,⽤⼯程接⼝能够访问任何我们所期望的源代码管理程序。ENI服务器是个独⽴运⾏的程序,CoDeSys的程序组织单元和编译⽂件可以以⽂档⽅式存于数据库中,它们能够被ENI服务器的客户端访问到。这允许在⼀个⼯程⽂件的⼯作过程中进⾏多⽤户操作,它为CoDeSys和其它⼯具提供了⼀个公⽤数据缓冲池⽽且它使版本管理成为可能。
⼯具:这个功能性也是与⽬标有关的,它允许启动CoDeSys⼯程中的特殊⽬标执⾏⽂件,除此之外还可以定义要被装载到控制器中的这些⽂件,它与外部⼯具的联系可以在⽬标⽂件中预定义或者插⼊到⼯程资源树中。
CoDeSys的可视化可以处理象⽹页可视化或⽬标可视化,这样可以通过因特⽹或者PLC监视器的运⾏来展⽰可视化。
5
CoDeSys V2.3 - -
2. CoDeSys组成
2.1 ⼯程组件
⼯程
⼀个⼯程包含了PLC程序中的所有对象,⼯程存储在以⼯程命名的⽂件中,⼯程中包含下列对象:POU,数据类型,可视化,资源和库
POU(程序组织单元)
功能、功能块、程序是程序组织单元,它们能够通过动作来增补,每⼀个程序组织单元都包含⼀个定义部分和主体部分,主体部分可以⽤IEC的语⾔来编写,这些语⾔包括指令列表,结构化⽂本,顺序功能图,功能模块图,梯形图或连续功能图表。
CoDeSys⽀持所有IEC标准的POU,如果你想在你的⼯程⽂件中使⽤这些POU,必须在你的⼯程⽂件中包含标准库⽂件standard.lib。
POU可以调⽤其它的POU,但递归调⽤是不允许的。
功能
⼀个功能是⼀个POU,它正确地产⽣⼀个数据元素(可以包含若⼲元素,⽐如,字段或者结构体)在处理过程中,可以⽤⽂本化语⾔中的表达式中的⼀个操作数来调⽤它。
在声明⼀个功能的时候,⼀定要给它⼀个类型,这就是说,在功能名后⾯加上⼀个冒号然后跟⼀个数据类型。
⼀个正确的功能声明可以参考下⾯的例⼦:
FUNCTION Fct: INT
另外,必须分配给功能⼀个结果,即把功能名作为⼀个输出变量
功能的声明从关键字FUNCTION开始。推荐的声明⽅式。
下例是在指令列表(IL)中的⼀个功能,它声明了三个输⼊变量:
前两个变量的相乘然后除以第三个变量。功能返回此操作的结果。
声明部分:
FUNCTION Fct: INT
VAR_INPUT
PAR1:INT;
PAR2:INT;
PAR3:INT;
END_VAR
程序部分:
LD PAR1
MUL PAR2
DIV PAR3
ST Fct
在结构⽂本中功能的调⽤可以作为表达式中的⼀个操作数。
功能不会有任何内部条件,这就是说,调⽤带有相同的输⼊变量功能将会返回相同的输出结果。
下⾯是调⽤功能的例⼦:
in IL:
LD 7
Fct 2,4
ST Ergebnis
in ST:
Ergebnis := Fct(7, 2, 4);
in FUP:
7
CoDeSys V2.3 - -
-
CoDeSys V2.3
8
功能不会保持内部状态,对于不包含全局变量和地址的功能,每次在它被调⽤的过程中,给它传递相同的输⼊变量,它将返回相同的值。
注意:如果⼀个局部变量在⼀个功能中被声明为RETAIN ,这也没有任何影响,为此变量将不会写到保留区。
如果你定义了⼀个功能名为CheckBounds ,你可以⽤它来检验⼯程中的溢出的范围,定义地功能名是它的仅有的标识符,更详细的内容请参考10.1章节中关于数算符中的DIV 。
如果在⼯程中你定义了CheckDivByte, CheckDivWord, CheckDivDWord 和CheckDivReal 功能, 如果你⽤了除法算式,你可以⽤它们来检查除数的值,可以避免分母为零。
如果你定义了功能名CheckRangeSigned 和 CheckRangeUnsigned ,超出变量定义范围的数据类型被截取。
所有这些检验功能名作为特定的⽤途保留下来。更多的知识请参考Defined Datatype ,Array 。在SFC 中,⼀个功能的调⽤只能发⽣在⼀个单步操作或变换之内。
功能块
⼀个功能块是⼀个程序组织单元,在程序中提供⼀个或多个值,与功能相反,⼀个功能块没有返回值。
功能块的声明⽤关键字FUNCTION_BLOCK 开始.推荐的声明⽅式。
可以创建功能块的复制或实例。
调⽤功能块是通过功能块实例实现的。
下⾯是⼀个在指令列表中功能块的例⼦,在指令列表中功能块中包含两个输⼊变量和两个输出变量,⼀个输出的是两个输⼊变量的乘积,另⼀个是两个输⼊变量的是否相等的⽐较。
声明部分:
FUNCTION_BLOCK FUB
VAR_INPUT
PAR1:INT;
PAR2:INT;
END_VAR
VAR_OUTPUT
MELERG:INT;
VERGL:BOOL;
END_VAR
在IL 的执⾏部分:
LD PAR1
MUL PAR2
ST MULERG
LD PAR1
EQ PAR2
ST VERGL
功能块实例
可以创建功能块的复制或实例。
每⼀个实例都有它⾃⼰的标识符,并且⼀个数据结构体中包含它的输⼊输出和内部变量,实例可以象变量⼀样被声明为局部变量或全局变量,然⽽功能块的名称表⽰标识符的类型。
推荐的声明⽅式。
例如名为INSTANCE 功能块PUB 实例:
fubInstance :FUB ;
功能块通常是通过上述的实例来调⽤的。
从此功能块实例的外部只能访问它的输⼊输出变量,不能访问它的内部变量调⽤。
下⾯是⼀个访问输⼊变量的例⼦
The function block FB has an input variable in1 of the type INT.
PROGRAM prog
VAR
END_VAR
LD 17
ST inst1.in1
CAL inst1
END_PROGRAM功能块FB有⼀个整型的输⼊变量in1
功能块和程序的声明部分能够包含实例的声明,实例的声明不能包含在功能之中。
访问功能块实例仅限于它被声明的POU中,除⾮它被声明为全局变量。
注意:在⼀个功能块处理完后的所有值将保存下来,直到下⼀个功能模块调⽤。所以,功能块调⽤相同的输⼊值往往不返回相同的输出值。
注意: 如果存在⾄少⼀个功能块变量是保留变量,整个实例将被存储在保留区。
调⽤⼀个功能块
通过建⽴⼀个功能块的实例并且⽤下⾯的语法来规定要求的变量,可以从其它的POU访问这个功能块的输⼊和输出变量。
<实例名>.<变量名>
在调⽤时为变量赋值:
如果你喜欢在调⽤功能块的时候再设置输⼊或输出变量,你可以⽤指令列表和结构化⽂本语⾔。通过在功能块实例名后⾯的括号中为变量赋值来进⾏(对输⼊变量的赋值就象在声明位置的变量初始化⼀样,使⽤“:=”来分配变量的值。)
如果在ST或IL POU的执⾏窗⼝中使⽤选项With arguments,并通过输⼊帮助(〈F2〉)来插⼊实例,它将根据这个句式显⽰所有的变量,但不必为这些变量赋值。
例如:
FBINST是⼀个功能块类型的局部变量,它包含了输⼊变量xx和输出变量yy。当FBINST是通过输⼊帮助插⼊到了ST程序中,将显⽰如下的调⽤:FBINST1(xx:= , yy=> )。
在调⽤输⼊输出变量时:
请注意:功能块的输⼊输出变量作为指针来处理。因此在调⽤⼀个功能块时,常量是不能赋予VAR_IN_OUT并且从外部没有读和写的权限。
例如:
在ST模式下调⽤fubo功能块的⼀个VAR_IN_OUT变量inout1:
VAR
fuboinst:fubo;
iVar1:int;
END_VAR
iVar1:=2;
fuboinst(iInout1:=var1);
下列在这种情况下下列语句⽰不允许的
fuboinst(iInout1:=2);或 fuboinst.iInout1:=2;
下⾯举例说明调⽤功能块FUB:
关于功能块FUB,参照上述‘功能块’部分
Deklarationsteil:
FUNCTION_BLOCK FUB
VAR_INPUT
PAR1:INT;
PAR2:INT;END_VAR
VAR_OUTPUT
MELERG:INT;
VERGL:BOOL;
END_VAR
Implementationsteil in AWL:
LD PAR1
MUL PAR2
9
CoDeSys V2.3 - -
- CoDeSys V2.3 10
LD PAR1
EQ PAR2
ST VERGL
乘法运算的结果被存储在变量ERG中,⽐较的结果存储在QUAD中,FUB的实例被声明为INSTANCE 下⾯是功能块的实例在指令列表中调⽤的例⼦
IL中调⽤FUB:
声明部分:
PROGRAM AWLaufruf
VAR
QUAD : BOOL;
INSTANZ : FUB;
ERG: INT:=0;
END_VAR
执⾏部分:
CAL INSTANZ(PAR1:=5;PAR2:=5);
LD INSTANZ.VERGL
ST QUAD
LD INSTANZ.MULERG
ST ERG
下⾯是功能块的实例在结构化⽂本中调⽤的例⼦(声明部分与指令列表部分相同)
PROGRAM STaufruf
INSTANZ(PAR1:=5;PAR2:=5); bzw. INSTANZ;
QUAD:=INSTANZ.VERGL;
ERG:=INSTANZ.MULERG;
下⾯是功能块的实例在功能块图中调⽤的例⼦(声明部分与指令列表部分相同)在顺序功能图中功能块的调⽤只能⼀步⼀步进⾏。
程序
⼀个程序是⼀个POU,它在操作过程中返回⼏个值,程序在⼯程⽂件中是全局的。程序的所有值将保留到下⼀个程序开始运⾏。
下⾯是程序的⼀个例⼦:
