ST语言入门(维修电工Demo)

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

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

1  该语言不区分大小写: 

    ST语言入门(维修电工Demo)_第1张图片

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

//折叠代码

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

{endregion}

私有软元件区:硬件本体寄存器区

%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,赋值: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标记时间 : 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左值类型总表:

    正整数
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;

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

    小数
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^;        //取对象值(取地址的对象)
Reference to
//========================
A :int;
B :int;
C :Reference to int ; // 实例类型指针   (int是对象左值类型)

c REF= a;    //  c := ADR(a);
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;};

猪拉进机器,出来火腿肠。
火腿肠送进机器,出来猪。
共用体,相当于国际货币。

11数组: 

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

语法:<数组名>:ARRAY [..,..,..] 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 :  元素类型 ;  //在指定硬件位置,开辟类型的实例对象,
                              这样操作对象,硬件对应位置的值改变。

枚举:

TYPE    星期安排:
(
    Mon :=2,
    Tues,
    Wen,
    Thur,
    fri,
    Sat,
    Sun
)  BYTE;

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

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

联合:公共车库

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

对 三厢车修改,两厢也会同步更改

别名:  类似 #define 新  旧

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

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

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

姬从良同学 : alias1;

变量实例查找:

交叉变量引用:

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

子集:

DUT对象语法:

TYPE     :  (..) 
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

引用:

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

 : REFERENCE TO 


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类型除外)
语法:

: POINTER TO ;


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


 |atribute_key
            variable1;
            variable2;
        ...
END_VAR

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

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

ST语言入门(维修电工Demo)_第2张图片

 函数调用:

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

 ST语言入门(维修电工Demo)_第3张图片

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

 ST语言入门(维修电工Demo)_第4张图片

 case

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

 ST语言入门(维修电工Demo)_第5张图片

 repeat 循环

//  REPEAT循环

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

ST语言入门(维修电工Demo)_第6张图片

continue 下一轮

jmp

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

exit

return

8编程:

ST语言入门(维修电工Demo)_第7张图片

 直接拖入左侧

ST语言入门(维修电工Demo)_第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;

ST语言入门(维修电工Demo)_第9张图片

它只能表示正数,且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;

 ST语言入门(维修电工Demo)_第10张图片

 下面验证  小数

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

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

ST语言入门(维修电工Demo)_第11张图片

 验证一下时间

//	时间_类型
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#

ST语言入门(维修电工Demo)_第12张图片

其它类型:

//	其它
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);//

 ST语言入门(维修电工Demo)_第13张图片

你可能感兴趣的:(PLC编程(汇川,禾川),plc,1024程序员节)