ST语言入门(维修电工Demo)
电机模型:
reference to Axis_ref_sm3电机位置:axis.fsetPosition
伺服位置:axis.diSetPosition
1 该语言不区分大小写:
shift + F2 //调出输入助手
光标在主程序内, 按F2 调出可用变量
2 私有软元件区:硬件本体寄存器区
%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 是布尔类型,默认值是0wo的进制: BYTE := 255; // byte类型 默认值255a:=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 // byteuint 16bit 0~65535
udint 32bit 0~4294967295
ulint 64bit 0~2e64-1word 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.401e45 ~ 3.403e38
lreal -64bit时间
time 32bit 毫秒 T#12345MS; // t#12h34m15s;
ltime 64bit 纳秒 LTIME#12.789D; // D天 H时 M分 S秒 ms毫秒 us微秒
date 32bit 年-月-日 D#2022-10-24;
time_of_day 32bit 时-分-秒 TOD#15:36:30.123;// TOD#
date_and_time 64bit 年-秒L DT#1970-1-1-0:0:0其他
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 [
变量名 : ARRAY[0..N,0..M] OF 变量类型; // 二维数组
VARaiCounter : 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_TYPEarr1: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_TYPEidentifier:自定义的枚举类型;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赋值*)
初始值 := 默认值
VARvar1: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_keyvariable1;variable2;...
END_VARtype_key:类型关键字,包括VAR(本地变量),VAR_INPUT(输入变量),VAR_OUTPUT(输出变量)
atribute_key:属性关键字,包括RETAIN,PERSISTENT,CONSTANT,用于明确变量的范围。示例
VARiLoc1:INT; (* 本地变量*)
END_VAR

函数调用:
CMD_TMR :TON(CMD_TMR.Q为定时器输出状态)
CMD_TMR(IN := %IX5, PT := 300); A:=CMD_TMR.Q
if
IF value < 7 THENWHILE 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_FORPROGRAM CNCManageRef
VARpCNC_Ref: POINTER TO SMC_CNC_REF;n: INT;
END_VARn := g_CNCProgManager.Count;
FOR i:= 0 to n-1 DOpCNC_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
CASE zhuanpan转盘值 OF0..4: //0到4的情况%QX0.2 := 0;5,7,9: // 5,7,9的情况%QX0.2 := 0;8: // 等于8的时候%QX0.2 := 0;
//
// label1 :;
ELSECASE zisuoyin子索引 OF0..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);// 8u8 := -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);// 8sint2 := -128;
int2 := -12345;
dint2 := -1234567;
lint2 := -9999999;

下面验证 小数
// 小数_浮点数
lookreal := SIZEOF(REAL);// 4
looklreal:= SIZEOF(LREAL);// 8real2 := -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 truelookword := SIZEOF(WORD); // 2
lookdword := SIZEOF(DWORD); // 4
looklword := SIZEOF(LWORD); // 8
lookstring := SIZEOF(STRING); // 81
lookwstring := SIZEOF(WSTRING);//162word2 := WORD#1234;//2
dword2 :=DWORD#12345;//4
lword2 :=LWORD#123456789;//8
string2 := INT_TO_STRING(23);//
wstring2 := "汇川PLC";//
string3 := WSTRING_TO_STRING( wstring2);//

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

