ST语言入门【维修电工Demo】

ST关键字

:=    赋值            ANY_TO_<任意数据类型>
                    i : INT := ANY_TO_INT(3.1415926); 
S=    置位
R=    复位
return    返回POU
if    判断bool
case    转盘分支
for    循环
while    循环
repeat    循环
exit    结束循环
continue    放弃本次循环,直接下次循环
jmp    跳至标记处运行
;        空步

//数组
	R_TRIGs: ARRAY[0..200] OF R_TRIG;	//【手动】上升沿
	F_TRIGs: ARRAY[0..200] OF F_TRIG;	//【手动】下降沿

FOR 循环变量 := 初值 TO 终值 BY 步长 DO
//=============================
CASE INT1 OF 
 1, 5: BOOL1 := TRUE; // 如果 INT1 = 1 或 5,BOOL1 = TRUE,BOOL3 = FALSE 
 BOOL3 := FALSE; 
 2: BOOL2 := FALSE; // 如果 INT1 = 2,BOOL2 = FALSE,BOOL3 = TRUE 
 BOOL3 := TRUE; 
 10..20: BOOL1 := TRUE; // 如果 INT1 在 10~20 内,BOOL1 = TRUE,BOOL3 = TRUE 
 BOOL3:= TRUE; 
 ELSE 
 BOOL1 := NOT BOOL1; // 否则,BOOL1 取反,BOOL2 = BOOL1 OR BOOL2 
 BOOL2 := BOOL1 OR BOOL2; 
 END_CASE; 
//============================

IF %IX0.0     THEN
    %QX0.0:=TRUE;    //输出
    ELSE
    %QX0.0:=FALSE;    //复位
END_IF

梯形图转ST,用 if  和 and        //add是加法,别搞混了

 IF x启动 AND ( NOT x过载  ) AND x急停 THEN
        x油泵 := True;


   END_IF

fbManuFall  :  F_TRIG;  //   下升沿                R_TRIG;  上升沿

//获取手动控制、自动控制的边沿信号
   fbManuFall(CLK:=xManuCmd , Q=> );

IF xReady AND (NOT xManuAlmDisable) AND fbManuFall.Q THEN

上升沿只输出1个周期。

ST语句输出后,会一直保持输出。需要用else复位输出。

IO功能

PLC  只有 I Q M   3个区

运行灯黄色        AT        %QX0.0        :        bool        :=        TRUE        ;    

运行灯黄色                                          :        bool                                     ;    

X        1bit

B        8bit

W        16bit

D        32bit

L        64bit

程序最终目的是{读取输入,控制输出}。梯形图转ST语言,串联逻辑用【AND  与

%I       输入区    %id0  //32bit长度,从地址【0字节】开始截取32bit
%Q        输出区        %qd250  //32bit长度,从地址【250当量】开始截取32bit
%M        存储区

SM        特殊标志
SD        特殊寄存器

%ix0.0    // %    指针
          // i    输入区        --》 i输入区  q输出区  m存储区
          // x    步长单位      --》 X(1bit)bool  B(8bit)byte  W(16bit)word  D(32bit)
                                              L(64bit)
          // 7.5  步长偏移量第7字节5bit
          // 123.7  步长偏移量123字节第7bit

【数据】元素类型

赋值                // 方向,从右到左                ANY_TO_<任意数据类型>

二进制            2#00001111                2#0010_0010(34)     下划线,编译器是忽略的

八进制            8#77(63)

十进制            3.1415926

十六进制        16#ff0f

时间                t#12h34m15s 

布尔                BOOL#1

小数                REAL#3.14159

    最小类型
【u8】    bool    '布尔'数据只能是TRUE或FALSE,0,1
【u1】     bit     只能在模块中

 正负整数

int是cpu的【bit】数。 

【i8】    sint        -128~127                'short'
【i16】    int       -32768~32768
【i32】   dint       -2147483648~2147483647   'double'
【i64】   lint       -2e63~2e63-1             'long'

    负整数
sint    -8bit         -128~127(存:-1元手续费,去高位,按位取反)
int     -16bit        -32768~32767(取:+1元利息,去高位,按位取反)
dint    -32bit        -2147483648~2147483647
lint    -64bit        -2e63  ~  2e63-1

 正整数

【u8】    usint       0~255         // 
【u16】    uint       0~65535
【u32】   udint       0~4294967295
【u64】   ulint       0~2e64-1

__UXINT | __XINT | __XWORD |
 BYTE | DATE | DATE_AND_TIME |
 DINT | DT | DWORD | INT | LDATE | LDATE_AND_TIME | LDT |
 LINT | LREAL | LTIME | LTOD | LWORD | REAL | SINT | TIME |
 TIME_OF_DAY | TOD | UDINT | UINT | ULINT | USINT | WORD

 小数

【f32】     real      1.0E-44   ~   3.4E38    'float'
【f64】    lreal                              'double'

字符类型: 

图片符号的索引:
'可以理解为,照相馆的照片编号'

【u8】     byte       0~255         '字节'  BYTE#39    '只能存储256张照片'
【u16】    word       0~65535       //  字  WORD#1234;
【u32】   dword       0~4294967295   // 双字 DWORD#1234;
【u64】   lword       0~2e64-1        //LWORD#1234;
【8 *N】     string      '字符'
【16*N】    wstring    '字符串'

byte      8bit       0~255          '字节'byte#39
word     16bit       0~65535          字  WORD#1234;
dword    32bit       0~4294967295   双字 DWORD#1234;
lword    64bit       0~2e64-1       长字LWORD#1234;
string              81字节    'ABCDEF'            //字符 ASCii        1字节  $转义  $30
wstring            162字节    "汇川PLC-AM600"     //字符串unicode      2字节

 时间类型:

【u32】            time【ms】          T#0d0h0m0s0ms
【u32】     time_of_day【ms】        TOD#23:59:59.999
【u32】            data【d】          D#2106-2-7
【u32】   date_and_time【s】         DT#2107-2-7-6:28:15
【u64】           ltime【ns】        213503d 23h34m33s709ms551us615ns

    时间
time     32bit      单位毫秒      T#49d17h2m47s295ms;      //  t#12h34m15s;
ltime    64bit      单位纳秒  LTIME#213503D23H34M33S709MS551US615NS;  
    日期                            //  D天 H时  M分  S秒  ms毫秒 us微秒  ns纳秒
date                32bit     日          D#2106-02-07;    D#1970-01-01
date_and_time       32bit     秒   DT#2106-02-07-06:28:15  DT#1970-1-1-0:0:0
time_of_day         32bit     毫秒          TOD#23:59:59.999;// TOD#
LDATE               64bit     日    LD#2554-7-21
LDT                LDT#2554-7-21-23:34:33.709551615
LTOD               LTOD#23:59:59.999999999

PLC修饰

        shift + F2

constant    只读【常量】
retain        保持【持久】
persistent  永久保持【掉电保持】

群公告
CODESYS 标准库高效应用实战训练营链接:https://pan.baidu.com/s/1OSMwwgOFPwGs0htOdHVo_w?pwd=c51v 
提取码:c51v 
…………………………………………
CODESYS 高阶自动化应用实战训练营(禁止商用)
https://pan.baidu.com/s/1RCTN5TPy8Bn5Figa5EENXw?pwd=7ki9 
提取码:7ki9 
…………………………………………
复杂运动控制训练营——机器人控制编程实战链接:https://pan.baidu.com/s/1TWImxeL5ZTrSFFmSmeBZhA?pwd=pbjx 
提取码:pbjx 
…………………………………………
CODESYS 复杂运动控制应用编程训练营链接:https://pan.baidu.com/s/1WaFlVNlz8fCpNgEVczhBag 
提取码:7o86 
…………………………………………
实战训练营汇总 链接:https://pan.baidu.com/s/171NZn5_0GWeYG-QD6sW7Ow 
提取码:am4h 
…………………………………………
进阶训练营 课程资料:链接:https://pan.baidu.com/s/1FCvpNsczxBfHs3i2Y8E7uQ 
提取码:k7ok 
…………………………………………
CODESYS V3.5 SP18 重磅发布 PPT讲解:
链接:https://pan.baidu.com/s/1LlvXzl49o9MU1mASIUzoNw 
提取码:nwzx 
…………………………………………
《CODESYS 极坐标电子凸轮的设计》Josh He的课程资料 链接:https://pan.baidu.com/s/1KWbSb3afmBxkbq_R5jqV5w?pwd=78fv 
提取码:78fv 
…………………………………………
《基于X86 CPU 开发板的CODESYS 基础应用编程》的课程资料​链接:https://pan.baidu.com/s/1pUccF7hXJMENnhVkVHSVOQ?pwd=v459 
提取码:v459 
…………………………………………
​《基于 Intel 开发板的 CODESYS 运动控制编程技术》的课程资料链接:
https://pan.baidu.com/s/15ZG6OVertqdcgzyJK5L3aA?pwd=qr4m 
提取码:qr4m

编译器

 需要用大括号修饰        {         }

 折叠代码: 

shift + F2    //调出输入助手
光标在主程序内, 按F2  调出可用变量

//折叠代码

{region "指示灯"}
//指示灯代码

{endregion}

PROGRAM POU
VAR
    电工: INT;
    hugo: INT;
    hugo1:int;
END_VAR
 

{define 电工}   //预编译 【电工】这个变量
{IF defined (电工)}
    电工:= 1;//如果定义了【电工】变量,则执行该语句
{END_IF}


{IF defined (IsSimulationMode)}
    hugo:=1;//如果在仿真模块下 则执行该语句
{END_IF}


{define pdef1}        //pdef1没有定义也可以
{undefine pdef1}//undefine可以取消预编译,即不执行下面指令
{IF defined (pdef1)}
    {info ‘pdef1 defined’}//消息视图显示pdef1 defined
    
        hugo1 := 1;
{END_IF}
 

别名

Type  新名  :  旧名

Type   u8  :   usint;       0~255         // 
Type   u16 :    uint;       0~65535
Type   u32 :   udint;       0~4294967295
Type   u64 :   ulint;       0~2e64-1

oop结构类型:【DUT】

          别名
struct    结构体    结构体通常用来表示类型不同但是又相关的若干数据。
enum      枚举
union     联合      可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,
                    允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,
                    以达到节省空间的目的。

PERSISTENT RETAIN    持久保留 变量

array     数组    CAN轴组 :array[0..9]of  _3SCOS.CANRemoteDevice;
泛型              CAN轴组 :array[*]   of  _3SCOS.CANRemoteDevice;
POINTER   指针    P_CAN从站首地址 :POINTER TO _3SCOS.CANRemoteDevice;// 偏移量0x164

轴对象: 【oop】

设备实例对象:  VAR_GLOBAL IoConfig_Globals
电机类型:     AXIS_REF_SM3
reference to  Axis_ref_sm3

电机位置:axis.fsetPosition        .fLastActPosition
伺服位置:axis.diSetPosition

1  该语言不区分大小写

    

【算术】运算符:

赋值    【MOVE】
赋值    【:=】
输出    【=>】

加    【add】    【+】
减    【sub】    【-】
乘    【MUL】    【*】
除    【DIV】    【/】
余    【MOD】    【mod】
取整  【TRUNC】  【结果 := trunc(-12.34);】
自增   【CTU】   
自减   【CTD】    
增减器 【CTUD】

判断相等       【EQ】    【=】
不等于        【NE】    【<>】
大于          【GT】    【>】
大于等于        【GE】    【>=】
小于            【LT】    【<】
小于等于        【LE】    【<=】

左移        【SHL】    【shl】
右移        【SHR】    【shr】
循环左移    【ROL】    【rol】
循环右移    【ROR】    【ror】

二选一        【SEL】
最大值        【MAX】
最小值        【MIN】
限制范围值        【LIMIT】
多选一        【MUX】

绝对值      【ABS】    【abs】
平方根     【SQRT】    【sqr】
指数        【EXP】    【exp】
自然对数     【LN】     【ln】
常用对数    【LOG】    【log】
正弦        【SIN】    【sin】
余弦        【COS】    【cos】
反余弦     【ACOS】    【acos】
反正弦     【ASIN】    【asin】
正切        【TAN】     【tan】
反正切     【ATAN】    【atan】

BOOL_TO_<TYPE>
BYTE_TO_<TYPE>
<实数型数据>_TO_<TYPE>

 【逻辑】运算符:

与    【AND】   '全1出1'            等效梯形图串联
或    【OR】    '有1出1'
非    【NOT】   '逻辑反'
同或            '异或非'
异或    【XOR】元素不同出true

置位        【s=】
复位        【r=】
置位优先    【SR】
复位优先    【RS】
上升沿    【R_TRIG】
下降沿    【F_TRIG】

 【地址】运算符:

数据大小    【SIZEOF】    【sizeof】
取地址         【ADR】       【adr】
位地址      【BITADR】    【bitadr】

Memory     16x40000000 %M     内存
Input      16x80000000 %I     输入
Output     16xC0000000 %Q     输出

【定时器】

脉冲        【TP】    'in上升沿触发启动,pt是定时'
延时通电    【TON】
延时断电    【TOF】
时钟       【RTC】

增计数        【CTU】
减计数        【CTD】
增/减        【CTUD】

【程序】

CODESYS软件集团

 

【动作】:子程序                        ACT_2();

【方法】:函数方法                    METH_2();

【属性】:C#属性,等效

【转换】:

私有软元件区:

硬件本体寄存器区

%I        输入区    %id0  //32bit长度,从0bit开始截取
%Q        输出区
%M        存储区

SM        特殊标志
SD        特殊寄存器

%ix0.0    // %    指针
          // i    数据区        --》 i输入区  q输出区  m存储区
          // x    步长单位      --》 X(1bit)bool  B(8bit)byte  W(16bit)word  D(32bit)
                                    L(64bit)
          // 0.0  步长偏移量
          

 3数据类型修饰

左值bit长度

X:    1位   (bit)//  bool
B:    8位   (byte) //  8bit
W:   16位   (word) // 16bit
D:   32位 (double) // 32bit
L:   64位   (long) // 64bit

                    区域 + 类型修饰  +  步长偏移量

 语法:%< 存储区iqm>< 类型修饰xbwdl>< 类型切块数量>|.< 子索引>

%QX0.3:=16#0F; // Q区(输出区),左值bool,0字节位置右移3bit 

变量名1  at绑定地址   %mw10    : word数据类型    :=赋值       1234;

LED灯泡  AT  %mw10  : word  := 1234; // M区,w取16bit乘以10的位置赋值:1234

变量名2  at    %qd0 :  dint :=  16#0f;    //Q区,d数据类型32bit第0个,赋值:2#00001111

4硬件寄存器地址:%软元件存储区  + 数据类型 + 类型偏移量

%ix0.0  // 输入区 内存切块bool   位置8*0+右移0  bit位置
%qx0.7  // 输出区 内存切块bool   位置8*0+右移7  bit位置

%qb0 := 16#0f  // 输出区   内存切块byte    位置8*0 bit    赋值00001111指示灯
%qw0 := 16#0f  // 输出区   内存切块word    位置16*0 bit   赋值00001111指示灯
区别在于内存切块的bit长度不一样。(步长类型)

5右值类型输入:  选中变量  shift + F2

a: BOOL := FALSE;   // 变量a 数据类型布尔,默认值0

wo的进制: BYTE := 255; //  byte类型 默认值255

a:=TRUE;            //  a赋值1
wo的进制 := 123;     // 十进制表示
wo的进制 := 16#0F;   // 十六进制表示
wo的进制 := 10#255;  // 十进制表示
wo的进制 := 8#255;  //  八进制表示
wo的进制 := 2#00001111;   // 二进制表示

    时间
time时间,单位毫秒   t1 : TIME  :=  T#12345MS;    //  12345毫秒。   t#12h34m15s;
长时间 : LTIME :=  LTIME#12345D12H55M59S123ms123us123ns;    //  天,时,分,秒,毫秒
长日期 : DATE_AND_TIME  :=  DT#2023-6-1-10:28:54;

    字符串:字符+8bit截断    字符串+16bit截断
str字符 : STRING  := 'D:\test.txt'; // ASCii编码  8bit
wstr字符串 : WSTRING  := "大家好,我是维修电工。";   //Unicode编码  16bit
字符串库  string Functions   可以用  sizeof(wstr字符串); 获取字节长度

//获取对象字节
looklen := SIZEOF(对象); //返回int类型

           := 是赋值的意思 ,    16# 是十六进制

6左值数据类型总表:

    负整数
sint    -8bit         -128~127(存:1元手续费,去高位,按位取反)
int     -16bit        -32768~32767(取:1元利息,去高位,按位取反)
dint    -32bit        -2147483648~2147483647
lint    -64bit        -2e63  ~  2e63-1

    正整数
byte     8bit        0~255         // BYTE#204
usint    8bit        0~255         // byte

uint     16bit       0~65535
udint    32bit       0~4294967295
ulint    64bit       0~2e64-1

word     16bit       0~65535       //  字  WORD#1234;
dword    32bit       0~4294967295  // 双字 DWORD#1234;
lword    64bit       0~2e64-1      //LWORD#1234;

    小数
real     -32bit        1.0E-44   ~   3.4E38
lreal    -64bit

    时间
time     32bit      单位毫秒      T#49d17h2m47s295ms;      //  t#12h34m15s;
ltime    64bit      单位纳秒  LTIME#213503D23H34M33S709MS551US615NS;  
    日期                            //  D天 H时  M分  S秒  ms毫秒 us微秒  ns纳秒
date                32bit     日          D#2106-02-07;    D#1970-01-01
date_and_time       32bit     秒   DT#2106-02-07-06:28:15  DT#1970-1-1-0:0:0
time_of_day         32bit     毫秒          TOD#23:59:59.999;// TOD#
LDATE               64bit     日    LD#2554-7-21
LDT                LDT#2554-7-21-23:34:33.709551615
LTOD               LTOD#23:59:59.999999999

    其他
bool                 8bit        数据只能是TRUE或FALSE,0,1
bit                  1bit        只能在模块中

    文字图片
string              81字节    'ABCDEF'            //字符 ASCii        1字节  $转义  $30
wstring            162字节    "汇川PLC-AM600"     //字符串unicode      2字节

 7符号

+    加 ADD    ADC
-    减 SUB    SBB
*    乘 MUL    IMUL
/    除 DIV    IDIV
MOD     取余

AND     逻辑 与(全1出1)
OR      逻辑 或(有1出1)
XOR     逻辑 异或(全相同出0)
NOT          取反
TEST    测试

:    类型指定
:=    赋值
<>    不等于
=      逻辑等于
EXPT     求幂

s=        置位
r=        复位

8指针:        地址bit等于cpu bit

pointer 指针
ADR 取地址
^   取地址上的对象【解地址】

iVar1 : int; //变量1
iVar2 : int; //变量2
piVar : pointer to int; //指针(int为   对象左值类型)元素种子类型

piVar := ADR(iVar1);    //取地址(取对象的地址)
iVar2 := piVar^;        //取对象值(解地址得到对象)

如果对象是FB功能块
pSlave^();    //运行FB功能块或函数
if(pSlave^.wState)  //判断对象的成员变量

pFBfaun^();  //运行绑定的方法
Reference to
//========================
A :int;
B :int;
C :Reference to int ; // 实例类型指针  (int是对象的 数据类型)【解地址后,得到该类型的对象】

c REF= a;    //  c := ADR(a);  //跟C#的参数ref一样
c := B;    //    c^ := B;
二级指针  pointer to  pointer to

9字符串: string(81)     wstring(162)

字符串有2种编码:  ASCii 和 Unicode
前者元素1字节,后者元素2字节,后者可以显示汉字。

concat   拼接字符串
delete    删
find    找
insert    插入
left    左移
len    字节长度
mid    中间截取
replace    替换
right    右移

10 oop对象:共用体

面向对象思想:
操作对象时,又想硬件跟随变化时,就需要将对象映射到地址上。

1定义对象类型 oop
2  章同学 AT QB123 : oop := oop{ ivar1 := 12;ivar2 := 234;};

猪拉进机器,出来火腿肠。
火腿肠送进机器,出来猪。

共用体,相当于快递的货柜(按包裹最大的类型占用内存)。
共用体:用于int转byte截断高位,或者类型A转成类型B,占用的头对齐。

 传对象【C语言】-CSDN博客

11数组: 

  变量名称 :ARRAY[ dimension ]OF 数据类型 :=  [ 初始化 ];

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

数组变量名 : ARRAY[0..N,0..M矩阵范围] OF 变量类型;   // 二维数组

VAR
    aiCounter : ARRAY[0..9] OF INT; //索引下限:0,索引上限:9
END_VAR
//=====================================
aiCounter : ARRAY[0..9] OF INT := [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];

aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)];
                                      // Short notation for [10, 10, 20, 20]

数组2号  :ARRAY [1..3,5..7,8..9] OF byte := [10, 20, 30, 40, 50, 60, 70, 80];
数组3号  : ARRAY[0..2048] OF INT;

 12结构体:

TYPE    学生 :    //  | EXTENDS DUTTYPE:   继承访问
STRUCT
        学号:int;
        班级:int;
        名称:dword;
END_STRUCT
END_TYPE


arr1:ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723)
                                ,(p1:=2,p2:=0,p3:=299)
                                ,(p1:=14,p2:=5,p3:=112)];


章同学 : 学生 := ( Start:=[3,3], Point1:=[5,2], Point2:=[7,3], Point3:=[8,5], Point4:=                                
                          [5,7], End:= [3,5]);

结构体是值类型传递。
用   AT %QD12 :  元素类型 ;  //在指定硬件位置,开辟类型的实例对象,
                              这样操作对象,硬件对应位置的值改变。

枚举:

用于限制变量的范围,只能有以下情况之一。

如:一个星期只有7天【1,2,3,4,5,6,7】 

可以参考C语言

TYPE    星期安排:
(
    Mon :=2, //默认从0开始,这里强制从2开始 自增1
    Tues,
    Wen,
    Thur,
    fri,
    Sat,
    Sun
)  BYTE; //默认元素类型

    //     <枚举名称>:(<enum_0> ,<enum_1>, ...,<enum_n>) |<元素类型>;
END_TYPE

identifier:自定义的枚举类型;enum_n:枚举类型对应的常量值,每个常量可以声明其对应值,如果不声明
使用默认值;base data type枚举常量对应数据类型,可以不用声明,默认为整数。

联合【共用体】:

TYPE   联合车库  :
UNION
        两厢car:byte;
        三厢车:int;
        半挂车:array[ 0..9]of dword;
    
END_UNION
END_TYPE

对 三厢车修改,两厢也会同步更改
数据的头bit对齐
用于对象导出到另一种类型

别名:  类似 #define 新  旧

参考C语言

TYPE
      学生:wstring(75);
END_TYPE
//==============================

姬从良同学 : 学生 := "姬从良,年龄18岁,职业。。。";

示例
TYPE 
           alias1 : ARRAY[0..200] of byte; 
END_TYPE

姬从良同学 : alias1;

变量实例查找:

交叉变量引用:

*变量名?   //查找声明处,调用处。

子集:

DUT对象语法:

TYPE    <name> : <Inttype> (<ug>..<og>) 
END_TYPE;


name:有效的IEC标示符
Inttype:是数据类型SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD)
中的一种。
ug:是一个常数,必须符合基本类型对应的下边界范围。下边界本身包含在此范围内。
og:是一个常数,必须符合基本类型对应的上边界范围。上边界本身包含在此范围内。

DUT对象声明示例
TYPE
SubInt : INT (-4095..4095);
END_TYPE
变量直接声明示例
VAR
i : INT (-4095..4095);
ui : UINT (0..10000);
END_VAR

引用:

引用是一个对象的别名,操作引用就如同操作对象。
语法:

<identifier> : REFERENCE TO <data type>


identifier:引用标示符。data type:引用对象的数据类型。
示例及初始化

ref_int : REFERENCE TO INT;
a : INT;
b : INT;
ref_int REF= a; (* ref_int引用a *)
ref_int := 12; (* a值为12 *)
b := ref_int * 2; (* b值为24 *)
ref_int REF= b; (* ref_int引用b *)
ref_int := a / 2; (* b值为6 *)

指针: ADR取地址

指针保存的是一个对象的地址,指针可以指向任何数据类型(BIT类型除外)
语法:

<identifier>: POINTER TO <data type>;


identifier:指针标示符。data type:指针指向的数据类型。
通过地址操作符对指针进行操作。地址操作符包括ADR(获取变量地址)和^(变量地址对应的值)
示例及初始化
VAR
pt:POINTER TO INT; (* 声明指向INT类型的指针pt*)
var_int1:INT := 5;
var_int2:INT;
END_VAR
pt := ADR(var_int1); (* 变量varint1的地址分配给指针pt *)
var_int2:= pt^; (* 通过^地址操作符获取指针对应的值*)
pt^:=33; (*给指针对应的变量var_int1赋值*)

初始值 :=  默认值

VAR

    var1:INT := 12; (* 整形变量初始值12*)
    x : INT := 13 + 8; (*常量表达式定义初始值*)
    y : INT := x + fun(4); (*初始值包含函数调用*)
    z : POINTER TO INT := ADR(y); (*指针通过地址函数ADR来初始化*)

END_VAR

 6变量修饰:

本地变量     VAR            // 局部变量
输入         var_input
输出         var_output
输入输出     var_in_out
全局变量     VAR_GLOBAL
临时变量(VAR_TEMP)
静态变量(VAR_STAT)
配置变量(VAR_CONFIG)
常量         var_constant
全局变量 :  Application-右键添加GVL
掉电保持     PERSISTENT RETAIN


<type_key> |atribute_key
            variable1;
            variable2;
        ...
END_VAR

type_key:类型关键字,包括VAR(本地变量),VAR_INPUT(输入变量),VAR_OUTPUT(输出变量)
atribute_key:属性关键字,包括RETAIN,PERSISTENT,CONSTANT,用于明确变量的范围。

示例
VAR
    iLoc1:INT; (* 本地变量*)
END_VAR

 函数调用:

CMD_TMR :TON(CMD_TMR.Q为定时器输出状态)
CMD_TMR(IN := %IX5, PT := 300); A:=CMD_TMR.Q

if

IF   value < 7 
                 THEN
                      WHILE    value < 8 DO         // 假
                               value := value +1;   // 假,继续
                      END_WHILE;
END_IF;
IF guzhang故障 THEN
	%QX0.0 :=1; // Q0.0=1;  黄色灯
	;
ELSE
	%Qx0.0 :=0; // Q0.0=1;  黄色灯
	;
END_IF

 

for循环

FOR  首行句  TO   逻辑句   DO   循环句

FOR dangqianzhi当前值:=0 TO zuigaozhi最高值 BY 3 DO  //每次加3到最高值
	%QX0.2 := 0;
	;
END_FOR


PROGRAM CNCManageRef
VAR
    pCNC_Ref: POINTER TO SMC_CNC_REF;
    n: INT;
END_VAR

n := g_CNCProgManager.Count;
FOR i:= 0 to n-1 DO
    pCNC_Ref := g_CNCProgManager.GetProgram(I);
    (* calculate pCNC_Ref *)
END_FOR

 while

WHILE  bool运行  DO
	                 %QX0.2 := 1; // 运行灯
	                 %QX0.2 := 1; // 运行灯
                     %QX0.2 := 1; // 运行灯
	;
END_WHILE

 

 case:分支

比如抽奖转盘,只能转到对应的奖位。

C语言做了补充,加了都不对应奖位的情况。【比如2个奖位之间】

CASE zhuanpan转盘值 OF
	0..4:			//0到4的情况
			%QX0.2 := 0;
	5,7,9:			// 5,7,9的情况
			%QX0.2 := 0;
	8:				// 等于8的时候
			%QX0.2 := 0;
// 	
// 	label1 :;
ELSE
	CASE zisuoyin子索引 OF
		0..300:		// 0到300
				%QX0.2 := 0;
// 		label1 :;
	ELSE
		%QX0.2 := 1;
		;
	END_CASE
	
	
	;
END_CASE

 

 repeat 循环

//  REPEAT循环

J:=-1;
REPEAT
J:=J+2;
UNTIL J= 101 OR ARR[J] = 70
END_REPEAT;

continue 下一轮

jmp

label:      i:=i+1;
            JMP label;

exit

return

8编程:

 直接拖入左侧

 其它功能块也是如此。

//=======================================================

下面来验证一下数据长度:

//  正整数_类型
lookbyte  := SIZEOF(BYTE);//  1 (0~255)
lookusint := SIZEOF(USINT);// 1
lookuint  := SIZEOF(UINT);//  2
lookudint := SIZEOF(UDINT);//  4
lookulint := SIZEOF(ULINT);//  8

u8 := -127;// 129
byte2 := -99999;
usint2 := -99999999;
uint2  := -99999999;
udint2 := -99999999;
ulint2 := -99999999;

它只能表示正数,且bit长度不能超出

   下面验证 负整数

//  负整数
looksint := SIZEOF(SINT);// 1
lookint  := SIZEOF(INT);//  2
lookdint := SIZEOF(DINT);//  4
looklint := SIZEOF(LINT);//  8

sint2 := -128;
int2 := -12345;
dint2 := -1234567;
lint2 := -9999999;

 

 下面验证  小数

//  小数_浮点数
lookreal := SIZEOF(REAL);// 4
looklreal:= SIZEOF(LREAL);//  8

real2 := -65535.1234567;
lreal2 := -2147483647.1234567;

 验证一下时间

//	时间_类型
looktime  := SIZEOF(TIME);//  4			T#			毫秒
lookltime := SIZEOF(LTIME);// 8		LTIME#		    L毫秒
lookdate := SIZEOF(DATE); //  4			D#		    年-月-日        D#2022-10-24;
// dateandtime   //4				   DT#			年-月-日L       DT#1970-1-1-0:0:0
// timeofday	 //4				  TOD#		    时-分-秒        TOD#14:57:39;//   4    TOD#
time2 :=  T#12345.6789S;  //4    T#12345ms;
ltime2 := LTIME#12.789D;  //8    D天 H时  M分  S秒  MS毫秒

date2 :=  D#2022-10-24;//4                        年-月-日
lookdateandtime := SIZEOF(dateandtime);//4
dateandtime2 :=DT#2022-1-1-0:0:0; //     4        年-月-日L          DT#   
looktimeofday :=SIZEOF(timeofday);//     4
timeofday2   := TOD#14:57:39;//          4        时-分-秒           TOD#

其它类型:

//	其它
lookbool := SIZEOF(BOOL);// 1   false   true
bool2 :=  TRUE;  //  false  true

lookword  := SIZEOF(WORD);     //  2
lookdword := SIZEOF(DWORD);    //  4
looklword := SIZEOF(LWORD);    //  8
lookstring := SIZEOF(STRING);  // 81
lookwstring := SIZEOF(WSTRING);//162

word2 := WORD#1234;//2
dword2 :=DWORD#12345;//4
lword2 :=LWORD#123456789;//8
string2 := INT_TO_STRING(23);//
wstring2 := "汇川PLC";//
string3 := WSTRING_TO_STRING( wstring2);//

 

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值