数据安全: 为了尽量减少数据安全漏洞的风险,我们建议采取以下组织和技术措施:
* 避免从开放网络和互联网访问PLC和控制网络。
* 使用VPN进行远程访问。
* 安装防火墙。
* 如果要在网络上发布可视化文件,请设置密码以防止未经授权的访问。
* 使用最新版本的网关服务器和Web服务器。
安装CODESYS:
注意
安装包括开发系统,CODESYS网关和CODESYS Control Win V3,其服务可通过Windows任务栏访问。 这三个程序是模拟计算机上的控制器所必需的。
在本教程中,您将编写一个简单的冰箱控制器。
已完成的项目RefrigeratorControl.project_archive
可以在“Projects
”目录下的CODESYS安装目录中找到。
除了您将逐步创建的示例项目之外,已完成的项目还包含完整的可视化操作和诊断。
项目计划:
冷却活动在应用程序的主程序中进行控制,信号管理在另一个程序块中进行。 Standard
库中提供了所需的标准功能块。
由于在此示例项目中没有连接真正的温度传感器和实际的执行器,您还需要编写一个程序来模拟温度的上升和下降。
这将允许您在在线模式下监控冰箱控制器的操作。
必须在全局变量列表中定义要由所有功能块使用的变量。
您已经安装了CODESYS开发系统并使用默认配置文件“CODESYS V<当前版本>”启动它。
开发系统的框架窗口用标准菜单栏打开; 目前还没有打开的项目。
选择命令File ‣ New Project。
在Templates窗口中,选择Standard Project模板。
输入项目的名称和存储位置,然后单击OK按钮。
⇒打开Standard Project对话框,输入设备类型和主程序的实现语言。
在Device列表中,选择条目CODESYS Control Win V3。
在PLC_PRG列表中选择条目Continuous Function Chart (CFC)
,然后单击OK按钮。
⇒项目在CODESYS框架窗口中打开。
在框架窗口的左侧的Devices视图中,您将看到“设备树”。之前选择的PLC设备以默认名称Device显示。
由您来编程的PLC应用程序的Application对象已经挂载在PLC Logic对象下。
Application已经包含PLC_PRG主程序和Library manager对象。
Library manager已经包含了IoStandard和Standard库。 IoStandard是I/O配置所必需的。 Standard库包含IEC 61131-3标准描述的所有功能和功能块。
Task Configuration对象挂载在设备数底部,包含Main task,Main task控制PLC_PRG的处理。 例如,用于可视化的对象可以稍后插入到Task Configuration下方。
除了IoStandard和Standard库之外,此示例项目还需要Util库:
双击设备树中的Library manager对象。
⇒打开Library manager编辑器。
在编辑器的标题栏中,单击Add library,然后在Add library对话框中选择Util库。
单击OK按钮确认选择
⇒Util库被添加到Library manager中,库中的功能块可供您在项目中使用。
首先,声明你希望在整个应用程序中使用的变量。 为此,请在Application下创建一个全局变量列表:
1. 选定Application并在上下文菜单中选择命令Add Object ‣ Global Variables List。将自动输入的名称GVL更改为Glob_Var并单击Add确认。
⇒对象Glob_Var出现在Application下。 GVL编辑器在设备树的右侧打开。
出现文本视图时,它已经包含关键字VAR_GLOBAL
和END_VAR
。在我们的例子中,通过点击编辑器右侧边的按钮激活表格视图。
⇒出现一个空行。光标在Name列中。
在上下文菜单中选择命令Insert。
⇒打开输入栏。同时Scope VAR_GLOBAL
和Data type BOOL
自动填入该行。
在字段Name中键入rTempActual
。
双击Data type列中的字段。
⇒该字段现在是可编辑的,并出现按钮。
单击按钮,然后选择Input assistant。
⇒打开Input assistant对话框。
选择数据类型REAL,然后单击OK按钮。
在Initialization列中输入一个数值,例如8.0。
以相同的方式声明以下变量。
名称 | 数据类型 | 初始值 |
---|---|---|
rTempActual |
REAL |
数字,例如8.0 |
rTempSet |
REAL |
数字,例如8.0 |
rDoorOpen |
BOOL |
FALSE |
timAlarmThreshold |
TIME |
T#30S 压缩机运行该时间后,信号响起 |
rDoorOpenThreshold |
TIME |
T#10S 开门后的时间,然后发出一个信号 |
bCompressor |
BOOL |
FALSE |
bSignal |
BOOL |
FALSE |
bLamp |
BOOL |
FALSE |
您现在将在默认创建的主程序块PLC_PRG中描述应用程序的主要功能:如果实际温度高于温度设定值加上滞后,压缩机将被激活并开始冷却。 如果实际温度低于设定值减去滞后,则关闭压缩机。
为了在实现语言CFC中描述此功能,请执行以下步骤:
1. 在设备树中双击PLC_PRG。
⇒CFC编辑器将打开PLC_PRG选项卡。声明编辑器以文本或表格形式出现在图形编辑器的上方。右边是Tools窗口。
在Tools窗口中单击Input,然后用鼠标将其拖动到CFC编辑器中插入它。
单击CFC编辑器中的元素,然后单击打开输入助手。从Variables类别中,选择Application ‣ Glob_Var下的变量rTempActual
。用这种方法你可以在这里引用全局变量rTempActual
。
与3.一样,使用全局变量rTempSet
创建另一个输入。
再创建一个输入,然后点击三个问号???并将其替换为名称rHysteresis。
⇒因为这不是已知变量的名称,所以出现Auto Declare对话框。该名称已被填入到对话框中。
使用Data typeREAL
和Initialization值1
填充Declare变量对话框中的字段。单击OK按钮。
⇒变量rHysteresis
出现在声明编辑器中。
现在再插入一个功能块:单击工具窗口中的Box元素,并用鼠标将其拖动到CFC编辑器中。
⇒功能块出现在CFC编辑器中。
使用ADD
替换???。
⇒( )ADD功能块由标准库提供。它将连接到它的所有输入进行相加。
将Glob_Var.rTempSet
输入连接到ADD功能块。为此,请单击输入的输出连接器,并将其拖动到ADD功能块的上部输入。
同样,将输入rHysteresis
连接到ADD功能块的下部输入。
⇒两个输入rHysteresis和rTempSet现在由ADD添加。
如果您希望在编辑器中移动元素,请单击元素中或框架上的空白区域,以便选择该元素(红色边框,红色阴影)。按住鼠标并将元素拖动到所需的位置。
在ADD功能块的右侧创建另一个功能块。它的功能是比较Glob_Var.rTempActual和Glob_Var.rTempSet + rHysteresis之和。赋予功能块GT
(大于)的功能。
⇒GT
功能块也来自Standard
库,工作原理如下:IF (upper input > lower input) THEN output
将输入Glob_Var_rTempActual连接到GT功能块的上部输入端。
将ADD功能块的输出连接到GT功能块的下部输入。
现在根据输入条件(Set - Reset)在GT功能块的右侧创建一个功能块,以启动或停止冷却压缩机。在字段???中输入名称SR
。使用Enter键关闭功能块(SR_0
)上方打开的输入字段。
⇒打开Declare variables对话框。
声明名称为SR_0
和数据类型为SR
的变量。单击OK按钮。
⇒Standard
库中定义的SR功能块用于在GT功能块的输出端定义THEN
。出现输入SET1
和RESET
。
将GT功能块右侧的输出连接器连接到SR_0功能块的SET1输入。
⇒SR
可以将一个布尔变量从FALSE
设置为TRUE
,然后再返回。如果输入SET1的条件满足,则布尔变量设置为TRUE
。如果满足RESET
条件,变量将重新复位。我们例子中的布尔(全局)变量是bCompressor
。
创建一个元素Output并将其分配给全局变量Glob_Var.Compressor
。在Glob_Var.Compressor和SR的输出连接器Q1
之间画一条连线。
现在指定压缩机应该再次关闭的状态,即SR功能块的RESET输入接收到一个TRUE信号。 要做到这一点,你要制定与上述相反的条件。 使用功能块SUB(减)和LT(小于)来做到这一点。
在另一个程序块中,您现在将执行警报蜂鸣器的信号管理与打开和关闭灯泡。适合用梯形图(LD)语言实现。
在单独网络中处理以下信号:
* 如果压缩机由于温度过高而运行时间过长,则通过连续的声音信号引起注意。
* 如果门打开时间过长,则通过间歇信号引起注意。
* 只要门打开,灯就亮。
在设备树的Application下方,使用Ladder Diagram (LD)实现语言创建一个类型为Program的POU对象。名称为Signals。
⇒Signals对象出现在PLC_PRG下面的设备树中。在梯形图编辑器打开Signals选项卡。声明编辑器出现在上部,Tools窗口出现在右侧。LD包含一个空网络。
在网络中创建一个程序,当压缩机运行时间过长而没有达到温度设定值时,会发出声音信号。为此,插入一个定时器功能块TON。它在指定的时间之后才将布尔TRUE信号切换为TRUE
:在Tools窗口中的Function blocks下选择一个TON,并用鼠标将其拖入空网络,然后拖到出现的矩形Start here处。当字段变为绿色时释放鼠标按钮。
⇒功能块显示为带有输入和输出的矩形,并自动给出实例名称TON_0
。上面的输入默认已经显示为功能块上游的触点。
注意
如果要阅读功能块的在线帮助,请将光标放在功能块的“TON”字符串中,然后按F1
键。
编程时,只要冷却压缩机开始运行,功能块就会被激活:为此,请在功能块Glob_Var.Compressor
的上部输入处命名触点。您已经在GVL Glob_Var中定义了这个布尔变量。
注意
当您开始在输入位置输入一个变量名时,您将自动获得名称以输入字符开头的所有变量的列表,并且可以在此处使用。这种帮助是CODESYS选项中用于智能编程的标准设置。
插入要激活的信号。为此,从工具类别Ladder elements拖动一个Coil到TON
功能块的输出端Q
. 将线圈命名为Glob_Var.bSignal
。
定义从TON
功能块激活直到信号发出的时间段:该定义通过变量Glob_Var.timAlarmThreshold
进行,该变量为TON_0
的输入PT
。为此,请单击输入连接右侧的细边矩形,然后输入变量名称。
点击TON功能块并在上下文菜单中选择Remove unused FB call parameters命令。
⇒未使用的输出ET被删除。
在LD的第二个网络中,编程使得如果门打开时间过长,会间歇发出信号。
在“编辑器”窗口中单击第一个网络下面的地方,然后在上下文菜单中选择Insert network命令。
⇒显示编号为2的空白网络。
与在第一个网络中一样,实现一个TON功能块,用于时间控制激活信号,这次由输入IN的全局变量Glob_Var.rDoorOpen
触发。在输入PT
,添加全局变量GlobVar.timDoorOpenThreshold
。
另外,在该网络的TON功能块的输出端Q
上,从Util库中添加一个BLINK功能块,并命名为Blink_0
。
BLINK对转发Q
的信号进行计时,并因此对GlobVar.bSignal进行计时。
在两个触点后面插入一个coil元素,并为其分配全局变量lob_Var.bSignal
。
为此,声明局部变量timSignalTime:TIME:= T#1S;
,并在输入TIMELOW
和TIMEHIGH
处插入此变量;因此循环时间对于TRUE
为1秒,对于FALSE
为1秒。
单击TON功能块并在上下文菜单中选择Remove unused FB call parameters命令。
⇒未使用的输出ET
被删除。
在LD的第三个网络中,只要门打开,灯就会亮起来。 要做到这一点,插入另一个网络,在它的左边,GlobVar.rDoorOpen
,直接连接到线圈Glob_Var.bLamp
。
CODESYS连续处理LD的网络。现在,在网络1的末端插入跳转到网络3,以确保只执行网络1或只执行网络2:
通过鼠标在网络中单击或通过网络号码字段选择网络3。在上下文菜单中选择命令Insert label。用DoorIsOpen
替换网络左上角标签的文字Label
:
选择网络1。Jump元素从Tools窗口的General类别拖到网络中。 把它放在出现的矩形Add output or jump here这里。
⇒出现跳转元素。 跳转目标仍然被指定为???
。
选择???
并点击按钮。 从可能的标签标识中选择DoorIsOpen
,然后单击OK确认。
⇒网络3的标签被执行。
在我们的程序示例中,主程序PLC_PRG应该调用Signals程序进行信号处理。
在设备树中双击PLC_PRG。
⇒在编辑器中打开PLC_PRG程序。
将一个function block元素从Tools视图拖到PLC_PRG的编辑器中。
使用输入助手,从Function block calls类别中添加功能块调用Signals程序。
由于本示例项目中的应用程序与实际的传感器和执行器没有关联,现在您还必须编写一个用于模拟温度上升和下降的程序。这将允许您在线模式下监控冰箱控制器的操作。
您可以使用结构化文本创建模拟程序。
程序升高温度,直到主程序PLC_PRG确定已经超过温度设定值并激活冷却压缩机。 然后模拟程序再次降低温度,直到主程序再次停用压缩机。
在Application下,插入一个Program类型和实现语言ST的POU,并命名为Simulation。
在ST编辑器中实现以下代码:
PROGRAM Simulation
VAR
T1: TON; //The temperature is decreased on a time delay, when the comepressor has been activated
P_Cooling: TIME:=T#500MS;
xReduceTemp: BOOL; //Signal for dereasing the temperature
T2: TON; //The temperature is increased on a time delay, when the compressor has been activated
P_Environment: TIME:=T#2S; //Delay time when the door is closed
P_EnvironmentDoorOpen: TIME:=T#1S; //Delay time when the door is open
xRaiseTemp: BOOL; //Signal for increasing the temperature
timTemp: TIME; //Delay time
iCounter: INT;
END_VAR
iCounter := iCounter+1; // No function, just for demonstration purposes.
// After the compressor has been activated due to TempActual being too high, the temperature decreases.
// The temperature is decremented by 0.1°C per cycle after a delay of P_Cooling
IF Glob_VAR.bCompressor THEN
T1(IN:= Glob_Var.bCompressor, PT:= P_Cooling, Q=>xReduceTemp);
IF xReduceTemp THEN
Glob_Var.rTempActual := Glob_Var.rTempActual-0.1;
T1(IN:=FALSE);
END_IF
END_IF
//If the door is open, the warming occurs faster; SEL selects P_EnvironmentDoorOpen
timTemp:=SEL(Glob_Var.rDoorOpen, P_Environment, P_EnvironmentDoorOpen);
//If the compressor is not in operation, then the cooling chamber becomes warmer.
//The temperature is incremented by 0.1°C per cycle after a delay of tTemp
T2(IN:= TRUE, PT:= timTemp, Q=>xRaiseTemp);
IF xRaiseTemp THEN
Glob_Var.rTempActual := Glob_Var.rTempActual + 0.1;
T2(IN:=FALSE);
END_IF
注意
为了方便操作和监控整个控制程序,推荐使用可视化。使用CODESYS Visualization创建的可视化文件安装在本教程的已完成示例项目中,该示例项目随标准CODESYS安装(Projects目录)一起提供。您可以将此项目加载到控制器,并启动它以查看它与可视化一起工作。在启动时,Live_Visu启动会显示冰箱的图示,该冰箱可以在不需要进行任何输入的情况下再现模拟程序的操作。但是,只要用鼠标点击on/off开关,就可以实现门的打开和关闭,并且可以调节旋转控制器针上预设的温度。我们不会在本教程中实现可视化的创建。计划在CODESYS Visualization联机帮助的上下文中提供一个合适的教程。
预设的任务配置包含主程序PLC_PRG的调用。对于我们的示例项目,您还必须添加对Simulation程序的调用。
在设备树中,使用鼠标将Simulation条目拖到Task Configuration下的MainTask上。
⇒仿真功能块插入到任务配置中。
如果您希望查看任务配置,请双击MainTask条目打开编辑器。
⇒在编辑器的下半部分的表格中,您将看到由任务调用的POU:PLC_PRG(默认插入)和Simulation。任务的调用类型是以20毫秒为间隔的Cyclic。在在线模式下,任务每个周期执行一次这两个功能块。
应用程序Application的名称在Devices窗口中以粗体显示。这意味着这个应用程序被设置为“活动应用程序”。与控制器的通信指向这个应用程序。
在输入代码的过程中,CODESYS会立即通过相关文本下方的红色波浪线警告您有语法错误。按F11
检查整个应用程序的语法,检查结果显示在消息窗口中。如有必要,使用View ‣ Messages命令打开消息窗口。然后,您可以选择一条消息并使用F4
键跳转到代码中的相应位置。
之后您只能将一个无错的应用程序加载到控制器。
启动网关服务器:
程序GatewaySysTray
与CODESYS一起标准安装。您可以通过此程序与网关服务器进行通信。 网关服务器在系统启动时作为服务自动启动。检查Windows任务栏是否包含程序图标。如果网关服务器没有运行,图标如下所示:。在这种情况下,您可以通过单击图标打开“网关”菜单,然后选择Start Gateway命令。
启动PLC:
程序CODESYSControlSysTray
也作为CODESYS标准安装的一部分。您可以通过此程序与CODESYS控制服务进行通信。从CODESYS V3.5 SP2开始,控制服务不再自动启动。这是为了防止未经授权的访问。按如下方式启动PLC:在Windows任务栏中单击,打开PLC菜单,然后选择命令Start PLC。 如果PLC正在运行,图标变为。启动时出现的对话框表示已启动的PLC允许编程访问。请务必遵守上述安全说明!
注意
如果这是您首次使用CODESYSV3进行的通信配置,则现在必须定义本地网关服务器。如果您已经定义了网关服务器,它将显示在Communication选项卡上。在这种情况下,您现在可以继续设置通信通道的步骤。
网关服务器随CODESYS安装提供。
在输入字段Name中输入网关的symbolic name。
在Drivers列表中选择TCP/IP条目。
双击IP-Address行的右列并在输入字段中输入localhost
。
单击OK按钮。
⇒设备编辑器的Communication Settings选项卡(1)将填入网关。如果网关运行正常,则网关图形上会出现一个绿色圆圈:
现在定义设备的通信通道,然后通过您设置的网关使用该通道。为此,双击设备树中的Device条目,打开设备编辑器的Communication Settings选项卡。
单击Scan network按钮,在本地网络中搜索所有可用的设备。
⇒出现Select device对话框(1),并列出可以与之建立连接的所有设备。
选择您的计算机名称的树条目。
注意
现在所有的通信行为都与这个通道完全相关。如果您在项目中有多个通信通道,请记住这一点。
要求:应用程序已经编译没有错误。请参阅调试应用程序。
1. 选择Online ‣ Login命令。
⇒出现一个对话框,询问应用程序是否应该加载到控制器。
2. 单击Yes按钮。
⇒应用程序被加载到控制器。Devices窗口中控制器和应用程序的条目具有绿色背景。Stop
出现在应用程序对象后面。控制器的当前状态出现在任务栏中:。
如果您已经按照本教程的要求操作,现在可以使用PLC Device(CODESYS Control Win V3)上的Application。
Devices
出现在Application对象的后面。控制器的当前状态出现在任务栏中:。接下来,您可以看到各种程序功能块中变量值的“监视”,您可以在CODESYS上设置一个特定的变量值。
您可以在功能块编辑器的在线视图或监控列表中查看应用程序变量的实际值。在这个例子中,我们将局限在功能块编辑器中进行监控。
要求:应用程序正在控制器上运行。
双击设备树中的PLC_PRG,Signals,Simulation和Glob_Var对象,打开编辑器的在线视图。
⇒在每个视图的声明部分,控制器上变量(1)的实际值出现在Value列(3)的表达式表格中(参见图示)。
实现部分中的监视取决于实现语言:对于非布尔变量,值始终位于标识符右侧的矩形字段中。在ST编辑器中,这也适用于布尔变量。我们称之为“内联监视”。在图形编辑器中,布尔变量的值由输出连接线的颜色显示:黑色表示FALSE
,蓝色表示TRUE
:
观察各个功能块中变量值的变化。例如,您可以在GVL Glob_Var中看到rTempActual
和Compressor
的值是如何由于模拟程序的处理而改变的。
控制器上一次性设置变量值:
光标放在在GVL Glob_Var的在线视图中。
要设置新的设定值,请双击表达式rTempSet
旁边的Prepared value(2)列。
⇒输入栏打开。
输入值9并离开输入栏。
要选定打开的门,请在表达式rDoorOpen
旁边的Prepared value字段中单击一次。将输入值TRUE
。再次单击3次将再次看到准备好的值切换到FALSE
,然后返回到空,然后返回TRUE
。
要将准备好的值TRUE只写入一次,请按Ctrl + F7。
⇒这两个值分别被传送到Value栏(3)。变量rDoorOpen
现在不再改变它的值,温度设定值现在是9度。变量timTemp
变为1s
,因为冰箱门现在处于“打开”状态,Simulation加热应该比之前(2s
)快。
“调试”:出于故障排除的目的,您希望检查代码中某些点的变量值。您可以为执行定义断点并单步执行指令。
要求:应用程序已经加载到控制器并正在运行。
双击Simulation打开编辑器中的程序。
将光标置于代码行iCounter:= iCounter + 1;
并按F9
⇒图标出现在代码行的前面。它表示在这一行上设置了一个断点。图标立即变为。黄色箭头总是指向下一条要处理的指令。替换出现在任务栏。
观察在线监测或simulation程序的声明部分中变量iCounter
的值。
⇒变量的值不再改变。处理在断点处停止。
按F5
重新开始处理。
⇒一个循环后程序再次停在断点处。iCounter
增加了1。
按F8
执行下一个处理步骤。
⇒RETURN在iCounter:= iCounter + 1;
指令行的最后以黄色突出显示。
再次按F8
执行下一个处理步骤。
⇒处理跳转到PLC_PRG的编辑器。反复按F8
显示程序是如何单步执行的。 每次用黄色箭头标记要执行的指令。
为了停用断点并返回到正常的处理,再次在代码行中设置光标并按下F9
。然后按F5
再次将该应用程序置于模式下。
要求:应用程序已经加载到控制器并正在运行。
如上所述,单步执行仿真程序中的iCounter:= iCounter + 1
行。
按Ctrl
+ F5
或选择Debug ‣ Single Cycle以执行单个循环。
⇒处理运行一个循环,然后再次停在断点处。 iCounter增加了1。
再按几次Ctrl
+ F5
可查看单个周期。然后按F5
⇒程序再次运行,没有停止,没有强制值。变量temp
再次具有值1s
。再次出现在状态栏中。