ST语言入门(维修电工Demo)
生活随笔
收集整理的這篇文章主要介紹了
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 to9字符串: 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 [<ll1>..<ul1>,<ll2>..<ul2>,<ll3>..<ul3>] OF <類型>
變量名 : 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;// <枚舉名稱>:(<enum_0> ,<enum_1>, ...,<enum_n>) |<元素類型>; 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 <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賦值*)初始值 :=? 默認值
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<type_key> |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.Qif
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);//?
總結
以上是生活随笔為你收集整理的ST语言入门(维修电工Demo)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【为谁痴来为谁狂?为谁两眼泪汪汪?】
- 下一篇: 说说苹果 App Store 将下架长期