首页 > 编程语言 >CodeSys PLC编程指南(ST语言)@Like

CodeSys PLC编程指南(ST语言)@Like

时间:2023-08-08 18:14:49浏览次数:38  
标签:END 变量 1.3 ST PLC CodeSys VAR 功能块

CodeSys PLC编程指南(ST语言)@Like

 

目录

1. 软件编程

1.1. PLC编程基本概念

1.1.1. 字符集

1.1.2. 分界符

1.1.3. 关键字

1.1.4. 常数

1.1.5. 操作数

1.1.6. 变量

1.1.7. 数据类型

1.1.8. 匈牙利命名法

1.1.9. 变量的类型

1.2. ST语言简介

1.2.1. 执行顺序

1.2.2. 语句

1.3. CODESYS

1.3.1. 软件模型

1.3.2. 程序组织单元

1.3.3. 指令

1.3.4. 程序结构

1.3.5. 基础编程

1.3.6. CODESYS可视化

1.3.7. 调试仿真

1.4. INOPROSHOP

1.4.1. 软件使用

1.4.2. 运动控制编程

 

  1. 软件编程

1.1. PLC编程基本概念

1.1.1. 字符集

根据国标GB/T15969.3-2005,GB1988表示基本字符 GB2312-1980表示汉字。

英文字母不区分大小写

1.1.2. 分界符

空格、TAB :分隔符仅不允许在关键字、文字、标识符和枚举值中直接插入。

// (*  *) :注释,// (* 注释 *)。

‘’ :字符串,‘Hello!$L’。

“” :UNICODE字符串,“中文”。

:= :赋值,a:=b。

; :语句分隔符,QU:=5*(A+B);QD:=4*(A-B);

.. :范围分隔符,ARRAY(1..2,1..3);

=> :输出连接符,

% :直接变量前缀,%QX1.1。

其他符号 :+-#e.,[]()。

时间符号 :T#、TOD#。

运算符号 :NOT、MOD、+、-、*、/、<、>、&、AND、OR、XOR。

1.1.3. 关键字

PROGRAM END_PROGRAM 程序段

FUNCTION END_FUNCTION 函数段

FUNCTION_BLOCK END_FUNCTION_BLOCK 功能块段

VAR END_VAR 变量段

VAR_INPUT END_VAR 输入变量段

VAR_OUTPUT END_VAR 输出变量段

VAR_IN_OUT END_VAR 输入输出变量段

VAR_GLOBAL END_VAR 全局变量段

TYPE END_TYPE 数据类型段

STRUCT END_STRUCT 结构体段

CONSTANT 常数变量

ARRAY OF 数组

AT 直接地址

EN ,ENO 使能输入,使能输出

TRUE ,FALSE 逻辑真,逻辑假

IF THEN EISIF ELSE END_IF IF 语句

CASE OF ELSE END_CASE CASE 语句

FOR TO BY DO END_FOR FOR 循环语句

REPEAT UNTIL END_REPEAT REPEAT 循环语句

WHILE DO END_WHILE WHILE 循环语句

RETURN 跳转返回符

NOT,AND,OR,XOR 逻辑操作符

BOOL,REAL,INT

SIN,COS,RS,TON

LD,ST,ADD,GT

NOT,MOD,AND

1.1.4. 常数

常数语法:<类型># <数值>

<类型>指定所需的数据类型;可能 BOOL, SINT, USINT, BYTE, INT, UINT, WORD, DINT,

UDINT, DWORD, REAL, LREAL 该类型必须是书面的大写字母。

2#0101,10#123,16#FF,BOOL#TURE,BYTE#12,INT#255,T#12h23m30s90ms,D#2023-06-16

1.1.5. 操作数

操作数语法: %<存储器区前缀><长度前缀><数字1>.<数字2>

例如:%IX0.0表示输入存储区域的二进制数第0个字节第0个bit位。

%:表示操作数

存储器区前缀: 表示该操作数的存储位置区域,有IQM类型

I:输入区域,物理输入;Q:输出区域,物理输出;M:内存区域

长度前缀: 表示操作数的长度,有X、B、W、D

X: Bit,一位,X类型变量类型:BOOL

B: Byte,一个字节,B类型变量类型:BYTE,SINT,USINT,BOOL

W: Word,一个字,W类型变量类型:WORD,INT,UINT

D: Double Word,两个字,D类型变量类型:DWORD,DINT,UDINT、REAL

数字1:变量对应内存的偏移地址

数字2:作为BOOL或者word等类型时,偏移地址后的第几位

1.1.6. 变量

变量常数语法:<标识符>:<数据类型> {:=<初值>};

直接地址变量:< 标识符> AT <地址>:<数据类型> {:=<初始化值>};

VAR

Var1 AT%ID4:DWORD = 1000;

END_VAR

1.1.7. 数据类型

标准数据类型布尔、整型、实数、字符串、时间数据。

标准数据类型表:

 

 

字符串指令表:

 

 

标准扩展数据类型:

联合体 UNION

TYPE UNAME :

UNION

var1:STRING(20);

var2:STRING(20);

var3:STRING(20);

END_UNION

END_TYPE

长时间 LTIME tLT := LTIME#1000d15h23m12s34ms2us44ns;

双字节字符 WSTRING wstr:WSTRING:='This is a WString';

引用 REFERENCE TO <标识符> : REFERENCE TO <数据类型>

指针 POINTER TO <标识符>: POINTER TO <数据类型|功能块|程序|方法|函数>;

自定义数据类型:

数组:<数组名>:ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,<ll3>..<ul3>] OF <基本数据类型>

arr3 : ARRAY [1..2,2..3,3..4] OF INT ;

结构(DUT):

TYPE <结构名>:

STRUCT

<变量的声明 1>

<变量声明 n>

END_STRUCT

END_TYPE

枚举:

TYPE <标识符>:

(<Enum_0> ,

<Enum_n>) |<基本数据类型>;

END_TYPE

子范围:<标识符> : <数据类型> (<下限>..<上限>);nPosition:INT(0..90);

1.1.8. 匈牙利命名法

BOOL b ULINT uli BYTE by REAL r WORD w LREAL lr DWORD dw STRING s LWORD lw TIME tim SINT si TIME_OF_DAY tod USINT usi DATE_AND_TIME dt INT i DATE date UINT ui ENUM e DINT di POINTER p UDINT udi ARRAY a LINT li STRUCT stru

Program PRG_ , Function Block FB_ Function FUN_ , List of Global Variables GlobVar_

1.1.9. 变量的类型

变量类型:

VAR 局部变量 --- R/W

VAR_INPUT 输入变量,由外部提供。 R/W R

VAR_OUTPUT 输出变量,有内部变量提供给外部。 W R/W

VAR_IN_OUT 输入-输出变量。 R/W R/W

VAR_GLOBAL 全局变量,能在所有配置、资源内使用。 R/W R/W

VAR_TEMP 临时变量,程序和功能块内部存储使用的变量。 --- R

VAR_STAT 静态变量。

VAR_EXTERNAL 外部变量

变量属性:

RETAIN 保持型变量,用于掉电保持。

PERSISTENT 保持型变量

VAR RETAIN PERSISTENT

VAR PERSISTENT RETAIN两者功能一样,皆为保持性变量,用于掉电保持

CONSTANT 常量

1.2. ST语言简介

结构化文本(ST)是一种高级的文本语言

1.2.1. 执行顺序

ST程序执行顺序根据“行号”依次从上至下开始顺序执行。

ST表达式中包括操作符和操作数,操作符会按照约定的优先级顺序执行,优先级相同的操作符,按照书写顺序从左至右执行。

1.2.2. 语句

ST语句有赋值语句、调用语句、选择语句、迭代语句、跳转语句、返回语句、NULL 语句。

1. 赋值语句 <变量>:=<表达式>;

2. 函数及功能块调用 功能块实例名:(功能块参数);

3. 选择语句

IF <布尔表达式> THEN <语句内容 1>; ELSE <语句内容 2>; END_IF

CASE <条件变量> OF

<数值 1>: <语句内容 1>;

<数值 2>: <语句内容 2>;

<数值 3, 数值 4, 数值 5>: <语句内容 3>;

<数值 6 .. 数值 10>: <语句内容 4>;

...

<数值 n>: <语句内容 n>;

ELSE

<ELSE 语句内容>;

END_CASE;

4.迭代语句

FOR <变量> := <初始值> TO <目标值> {BY <步长>} DO<语句内容> END_FOR;

WHILE <布尔表达式><语句内容> ;END_WHILE;

REPEAT <语句内容> UNTIL <布尔表达式> END_REPEAT;

5. 跳转语句

EXIT; 用于迭代语句退出循环

CONTINUE; 用于迭代语句结束本次循环

<标识符>: JMP <标识符>; 任意跳转到标识符位置执行

RETURN; 退出POU。

  1. 空语句 ;
  2. 注释 多行注释(* *) 单行注释//

 

1.3. CODESYS

1.3.1. 软件模型

CoDeSys软件是基于PLCopen组织的IEC 61131-3标准进行开发的。

CoDeSys 的软件模型用分层结构表示,软件元素包含:设备、应用、任务、全局变量、访问路径和应用对象。

 

 

设备等同于一个PLC,应用可以看作CPU上运行的一个进程,任务可以看作为一个线程,访问路径等同于共享内存,通讯是PLC与其它设备的链路。

一个设备内可以存在多个应用,一个应用内可行执行多个任务,每个任务可指定对应的程序PLC_PRG(程序入口类似main),程序内包含程序块和函数。

PLC程序执行过程:

 

 

任务的执行类型:固定周期循环,自由运行,事件触发,状态触发。

任务优先级:优先级高的任务优先于优先级任务低执行的任务。

实际工程中的程序一般有多个子程序的运行,可以用主程序PLC_PRG分别调用各个了程序,或者子程序通过任务实现调度。

1.3.2. 程序组织单元

程序组织单元即POU是用户程序的最小软件单元,它由声明区和代码区两部分组成,POU分为函数(FUN)、功能块(FB)和程序(PRG)。

完整的POU由命名、变量、指令三部分组成。

 

 

POU类型命名: PROGRAM PROG_name

接口变量: VAR_INPUT VarIn :BOOL; END_VAR (*输入接口变量*)

VAR_OUTPUT VarOut1 :BYTE;

本地变量: VarOut2 :BOOL; END_VAR (*输出接口变量*)

指令代码: VAR VarLocal:BYTE; END_VAR (*本地变量*)

VarOUT1:= VarLocal-100;

VarLocal.0:=NOT VarIn;VarOUT2:= VarLocal.0

变量声明区 指定变量的名称、类型和赋初始值

<标识符>{AT<Address>}:<数据类型>{:=<初始化>}:

指令代码区 编程

CoDeSys支持两种文本语言:指令表语言(IL)和结构化文本(ST)。

四种图形化语言:功能块图(FBD)、梯形图(LD)、顺序功能图(SFC)以及连续功能图(CFC)。

程序调用关系:

 

 

1.3.2.1. 函数FUN POU

函数是一种可以赋予参数但没有静态变量的POU,可以被函数、功能块、程序所使用。

函数仅能调用函数型POU,函数必须有输入变量,且仅有一个输出变量。函数内部是一个算法的运算逻辑,相同输入每次调用输出结果完全相同。

FUNCTION <函数名/返回值>: <返回值数据类型>

VAR_INPUT

… (*函数的输入接口变量声明*)

END_VAR

VAR

… (*函数的本地变量声明*)

END_VAR

…; (*函数内部逻辑*)

<函数名> := <返回值数据类型>的变量 (*函数返回值*)

标准函数:ANDN、ORN、XORN、INDEXOF 和 SIZEOF、ADR、BITADR。

函数的特性:重载性、可扩展性、EN和ENO(仅FBD和LD有效)。

1.3.2.2. 功能块 FB POU

功能块保留有自己特殊的内部变量,控制器必须给功能块的内部变量分配内存。下次调用运行时保留的变更会参与运算,相同输入每次调用输出结果会变化。功能块FB可调用功能块FB或函数FUN,可以被程序PRO和功能块FB调用,功能块还可被用作变量使用。

FUNCTION_BLOCK <功能块名>

VAR_INPUT

… (*功能块的输入接口变量声明*)

END_VAR

VAR_OUTPUT

… (*功能块的输出接口变量声明*)

END_VAR

VAR

… (*功能块的本地变量声明*)

END_VAR

…; (*功能块内部逻辑*)

功能块特性:

实例化:功能块是抽象的结构类型的定义,不是现实的数据实体,在使用前必须实例化。

fbFBvariable :FB_Name; 功能块声明方法与变量声明类似。

扩展性:功能块也可以派生出“子”功能块,子”功能块包含“父”功能块的全部属性。

FUNCTION_BLOCK <功能块名称> EXTENDS <功能块名称>

1.3.2.3. 程序PRO POU

程序是规划一个任务的主核心,可以调用程序、功能块及函数。广义上讲程序也包含硬件配置等信息,通过程序间调用实现应用逻辑。程序组织单元不能直接或间接调用其本身。程序仅在资源中实例化,即将程序与一个任务结合。

PROGRAM <程序名>

VAR_INPUT

… (*程序的输入接口变量声明*)

END_VAR

VAR_OUTPUT

… (*程序的输出接口变量声明*)

END_VAR

VAR

… (*程序的本地变量声明*)

END_VAR

…; (*程序逻辑*)

程序调用示例:PRG_example(in_var:=33, out_var=>erg );

1.3.3. 指令

1.3.3.1. 数据处理指令

选择操作指令SEL,MAX,MIN,LIMIT,MUX

比较指令=,<>,>,>=,<,<=

移位指令SHL,SHR,ROL,ROR,

1.3.3.2. 数学运算指令

赋值指令 :=

算数运算指令 +,-,*,/,MOD

数学运算指令 ABS,SQR,EXP,LN,LOG,SIN,COS,ACOS,ASIN,TAN,ATAN

1.3.3.3. 地址运算指令

地址运算指令 SIZEOF,ADD,BITADD

1.3.3.4. 数据转换指令

语法:<TYPE1>_TO_<TYPE2>

1.3.4. 程序结构

程序结构常用的编程方法主要有流程化编程、模块化编程和结构化编程。

1.3.5. 基础编程

CODESYS Engineering是一套完整的集成软件工具环境,可以完成软PLC的编程、调试、仿真、诊断等。

1.3.5.1. 新建工程

使用模板新建,选择设备、语言,自动生成设备、应用、程序PLC_PRG、任务MainTask。

1.3.5.2. 新建程序单元POU

在应用Application右击添加对象POU,选择类型和语言后添加。

1.3.5.3. 新建任务Task

在任务配置右击添加对象任务,新建任务,配置优先级、类型、周期和调用POU。

1.3.5.4. 新建全局变量GVL

在应用Application右击添加对象GVL,全局变量只有变量声明区,没有代码区。

1.3.5.5. 定义资源对象

启动Gateway Server和PLC,CODESYS与PLC的连接通过Gateway Server,网关有远程网关和本地网关两种,本地网关有5种通信方式COM、CAN、USB、UDP、TCP。

双击设备或者右击设备点击编辑对象,弹出资源对象管理界面,选择网关和调试设备。

PLC是开发用的设备,CODESYS本机集成了一个可用于仿真的WINDOWS 软件PLC CODESYS Control Win V3 - x64 SysTray,这个目标设备名称就是本计算机的名称,首次连接需要设置用户名密码,例如SoftPLC,123456。

资源配置好后就可以在通讯配置界面敲回车键,连接设备。设备连接成功后就可以进行下载调试。

1.3.5.6. 下载程序

编辑好的程序需要编译生成代码成功后登录设备下载。下载程序仅在设备RAM区运行。

创建启动应用命令是在在线或者离线状态下创建启动工程,创建启动应用才会下载到设备ROM区保存,下次上电后自动启动该应用。

1.3.5.7. 调试程序

登录下载程序后,可以进行调试启动,然后在线监视应用中的变量,并可通过写和强制修改变量,写入值是在下一个周期把准备值赋值给变量,强制值是在以后所有周期都赋这个值给变量。

登录设备可以进行热复位(保留PERSISTENT 和 RETAIN其他复初始值)、冷复位(所有变量复初始值)、复位原点(删除所有应用)。没有初值的变量默认为0。

程序调试过程可以设置断点,可以选择跳过、跳入、跳出、跳到光标等方式执行。

1.3.5.8. 仿真

CoDeSys 编程软件集成了PLC的仿真功能,可以实现脱离实际PLC设备,使用PC仿真PLC程序运行调试。

1.3.6. CODESYS可视化

 

1.3.7. 调试仿真

运行CODESYS Gateway V3,

运行CODESYS Control Win V3 - x64 用户:ControlWin 密码:cw123456

运行CODESYS SoftMotion Win 64 用户:SoftMotion 密码:sm123456。

 

1.4. INOPROSHOP

1.4.1. 软件使用

 

1.4.2. 运动控制编程

1.4.2.1. 需求分析

要求编写一个简单的程序,让PLC控制器实现如下功能:

让伺服马达 1 能够点动运行;

每触发一次命令标志,伺服马达 2 运转 2 圈后停止,用于测试系统是否运行正常;

让扩展机架上的 IO 输出端口,进行跑马灯输出,每 0.5 秒由低向高移动 1 位,在 16bit 范围内循环移动。

1.4.2.2. 系统设计

1.4.2.2.1. 硬件组态

根据需求控制器选用AM600实现运动控制和逻辑控制,选择EtherCAT网络,选用2个IS620N伺服驱动、2台伺服电机、1个RTU耦合单元、2个IO模块、其他零件如开关、电灯等。绘制电气原理图。

1.4.2.2.2. 软件架构

根据功能需求,设计软件架构。如例程编写两个POU,POU1用于运动控制,POU2用于逻辑控制。绘制软件流程图。

编程方法与步骤如下:伺服的运动控制,需要放在高实时 EtherCAT 任务周期中处理;跑马灯的控制实时性要求不高,放在 20ms的任务循环中处理;

1.4.2.3. 创建工程

新建标准工程,选择目标控制器,如AM600,选择语言,如ST,输入工程名称确认创建。

1.4.2.4. 硬件网络配置

网络组态,选择网络类型,增加网络节点硬件设备,增加节点模块硬件设备,完成硬件和网络配置。如在网络组态中AM600 PLC运动控制器选择EtherCAT网络,再增加EtherCAT节点设备,两个伺服驱动器IS620N,一个RTU耦合器AM600RTU,然后在EtherCAT机架中RTU耦合器后增加IO模块0016ER和1600END。

1.4.2.5. 用户程序编写

根据功能需求,编写用户程序。如例程编写两个POU,POU1用于运动控制,POU2用于逻辑控制。默认的PLC_PRG为POU1内部编写运动控制程序,使用功能块MC_Power、MC_Jog、MC_MoveRelative实现需要的运动功能。另新建POU2内部编写跑马灯逻辑控制程序,使用计数和位移的方法实现逻辑功能。

程序编写完成后,进行程序变量与硬件端口映射,使软件与硬件关联,实现最终功能。

 

1.4.2.6. 伺服驱动配置

配置伺服驱动器IS620N的参数,PDO、SDO等,注意SDO中16#6060:16#00默认必须配置为周期同步位置模式。

1.4.2.7. 伺服电机配置

配置Axis轴即伺服电机的参数,先根据系统运行特性选择轴类型和限制,丝杆往复机构选用线性模块,单向旋转机构选用周期模式,虚轴用于没有接入实际电机的场合,根据情况设置软件限位和超限响应,负向限制最小为0,正向限制最大为机构最大长度,实际需要考虑安全余量,。

再根据电机编码器参数和减速比设置实际单位和距离的换算,IS620N伺服配套的电机有两种典型分辨率,普通增量式编码器为 20bit 分辨率,即每圈有 1048576 个脉冲数;而绝对编码器为 23bit 分辨率,每圈 8388608 个脉冲数。减速机比例设置电机齿数/工作台机构齿数40/10。设置工作台一圈位移距离5.6mm。

伺服驱动和伺服电机按实际参数配置好后,系统便会按实际的运转特性正确响应,这样轴功能块中的位移参数即是实际物理位移量。

 

1.4.2.8. 任务配置

本应用例程中有三个任务:EtherCAT内POU是网络任务EtherCat.Task,优先级0最高,周期4000us;MainTask内POU是运动程序PLC_PRG,优先级1,周期4ms;RaceTask内POU是逻辑程序P_Race,优先级2最高,周期20ms。

任务执行类型有5种,周期循环、端口变化外部中断、变量上升沿事件、连续惯性、变量为真状态。

 

1.4.2.9. 在线调试

 

标签:END,变量,1.3,ST,PLC,CodeSys,VAR,功能块
From: https://www.cnblogs.com/slike/p/17615052.html

相关文章

  • 工业4.0 RAMI体系之运动控制规范(PLCopen SoftMotion) @Like
    工业4.0 RAMI体系之运动控制规范(PLCopenSoftMotion)@Like 目录1.运动控制1.1.自动化控制1.2.PLCopen运动控制规范1.3.PLC功能块1.3.1.功能块特性1.3.2.单轴功能块Single-Axis1.3.3.多轴功能块Multi-Axis 运动控制1.1. 自动化控制PLC、Robot、CNC机械电......
  • 【BZOJ 3364】Distance Queries 距离咨询 题解
    原题简化题意:有一棵\(n\)个点的树,\(q\)组询问,每次询问回答两点间的距离。令\(dis[i][j]\)表示\(i\)到\(j\)的距离,根节点为\(rt\),则有\(dis[i][j]=dis[rt][i]+dis[rt][j]-2×dis[rt][lca(i,j)]\),按照题意打即可。#include<bits/stdc++.h>usingnamespacestd;#d......
  • 论文解读(LightGCL)《LightGCL: Simple Yet Effective Graph Contrastive Learning for
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:LightGCL:SimpleYetEffectiveGraphContrastiveLearningforRecommendation论文作者:Cai,XuhengandHuang,ChaoandXia,LianghaoandRen,Xubin论文来源:2023ICLR论文地址:download 论文代码:download视......
  • c++ std::hash<std::string> 字符串哈希函数
    msvc采用了FNV-1a的哈希算法//众所周知std::string就是一个basic_string<char>template<class_Elem,class_Traits,class_Alloc>structhash<basic_string<_Elem,_Traits,_Alloc>>{_CXX17_DEPRECATE_ADAPTOR_TYPEDEFStypedefbasic_string<_......
  • 在使用异步请求后把值存入localstore并且在其他变量中首次通过localstore获取不到值
    问题写了一个方法A,里面有使用AXIOS进行请求(异步),并且把请求后的数据存入localstore,此方法在onMounted中进行调用,之后在其他地方使用时(通过读取localstore来获取值并给变量赋值),发现首次调用是获取不了值进行展示的,刷新后或者切换页面回来后就是按预期展示了。推断方法A是异步执行......
  • Python | isinstance函数
    isinstance函数isinstance的意思是“判断类型”;isinstance()是一个内置函数,用于判断一个对象是否是一个已知的类型,类似type()。isinstance()与type()区别type()不会认为子类是一种父类类型,不考虑继承关系。isinstance()会认为子类是一种父类类型,考虑继承关系。如果要判......
  • C++STL 学习笔记
    C++STL学习笔记STL补充List链表list<int>mylist={}链表定义和初始化voidpush_front(constT& val)将val插入链表最前面voidpop_front()删除链表最前面的元素list.push_back() 增加一个新的元素在list的尾端list.pop_back() 删除list的......
  • B. Longest Divisors Interval
    link需要思考一下如果这个题能做,那么肯定有一种比较可行的做法。如果\([l,r]\)是可行的,那么就意味着\([1,r-l+1]\)是可行的这是显然的,显然后者的每一个数在前者中必然有对应的倍数,所以等效。这样从1开始找就行了。#include<cstdio>#include<iostream>#include<cstring>#i......
  • LeetCode 16. 3Sum Closest 双指针+排序
    Givenanintegerarraynumsoflengthnandanintegertarget,findthreeintegersinnumssuchthatthesumisclosesttotarget.Returnthesumofthethreeintegers.Youmayassumethateachinputwouldhaveexactlyonesolution.Solution先将原数组排序,然......
  • Modbus TCP转Profibus DP网关modbusTCP就是以太网吗
    捷米JM-DPM-TCP网关。在Profibus总线侧作为主站,在以太网侧作为ModbusTcp服务器功能,下面是介绍捷米JM-DPM-TCP主站网关组态工具的配置方法2,Profibus主站组态工具安装执行资料光盘中的安装文件setup64.exe或setup.exe安装组态工具。安装过程中一直选择Next即可,安装完成后程序......