-
1 # 工業智慧智造
-
2 # 笑生看世界
高階語言,個人認為這個說法並不完全正確,有電路設計方面的知識,運用常用的語言工具實現這種需求而已。
電氣這方面,從程式語言來看,FBD程式設計可以學一波,要對數位電子技術理論基礎及實操掌握紮實,LAD程式設計,STL語言都可以掌握,微機原理與組合語言這門課一定要學好,這樣方能熟練操作STL裡面的累加器,暫存器等。
祝好(✪▽✪)•笑生
-
3 # 儒拉小鎮
你這裡問的高階語言,不知道你說的是哪一些?C#,Java或者其他的?VB又算是什麼?
既然你的範疇在電氣自動化領域,又問這樣的問題,姑且當提問的是一個大學生,剛接觸到這一方面而又對未來不是很明確吧。
正常工控領域使用最多的就是LAD,也就是梯形圖。但是除了LAD之外,好多老外喜歡用FBD(功能塊圖),以前SIEMENS處理多個數據的時候有的時候使用STL(語句表),但是自從博圖平臺後,SCL(結構化文字語言)使用的比較多。當然有的順序結構使用Graph(順序功能圖)。
1,SIEMENS 博圖平臺SCL範例。
下面的語句,輸入一個字串,在這個字串裡面尋找測量的數值。是為Ateq洩露測試儀用的。測試一個,會輸出一個字串,這個字串裡面有一個或者兩個real,採集裡面的數值。
注意這個數值有可能是負數。
IF #iEnable THEN
IF #ioClear THEN
#tString := "";
FOR #Index := 0 TO 255 BY 1 DO
#oBool[#Index] := 0;
#oReal[#Index] := 0;
#IndexReal[#Index] := 0;
END_FOR;
#ioStart := 0;
#ioClear := 0;
ELSE
IF #ioStart THEN
FOR #Index := 0 TO 255 BY 1 DO
#IndexReal[#Index] := DINT_TO_REAL(IN := BYTE_TO_DINT(IN := #tAtString[#Index] - 16#30));
#oBool[#Index] := 0;
#oReal[#Index] := 0;
END_FOR;
#IndexPointPosition := 0;
FOR #Index := 0 TO 255 BY 1 DO
IF #tAtString[#Index] = "." THEN
//尋找所有有"."號的位置
FOR #i := -3 TO 3 BY 1 DO
IF #IndexReal[#Index + #i] >= 0.0 AND #IndexReal[#Index + #i] <= 9.0 THEN
CASE #i OF
-3:
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] + #IndexReal[#Index + #i] * 100.0;
-2:
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] + #IndexReal[#Index + #i] * 10.0;
-1:
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] + #IndexReal[#Index + #i] * 1.0;
1:
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] + #IndexReal[#Index + #i] / 10.0;
2:
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] + #IndexReal[#Index + #i] / 100.0;
3:
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] + #IndexReal[#Index + #i] / 1000.0;
END_CASE;
END_IF;
END_FOR;
//尋找所有有"-"號的位置
FOR #i := -3 TO 3 BY 1 DO
IF #tAtString[#Index + #i] = "-" THEN
#oReal[#IndexPointPosition] := #oReal[#IndexPointPosition] * -1;
END_IF;
END_FOR;
#oBool[#IndexPointPosition] := 1;
#IndexPointPosition := #IndexPointPosition + 1;
END_IF;
END_FOR;
#ioStart := 0;
END_IF;
END_IF;
ELSE
#ioStart := 0;
END_IF;
這個小程式是一個FB塊,非最佳化。使用AT指令。
原理就是先在字串裡面尋找‘.’號,然後再在該點號左側和右側尋找數字,然後在在這裡面尋找‘-’負號。
2,EPSON四軸機械手
EPSON四軸機械手,用到的是從托盤裡面取產品,這裡只貼上了一部分程式。
Function pick
Pallet 1, P10, P11, P12, P13, 3, 4 "定義托盤1(取料盤)
"Out oPositionID, 0 "Wait
BB: If i = 13 Then
Print "請確認料盒已經清零"
GoTo BB
Else
Print i
GoTo CC
EndIf
CC: Jump Pallet(1, i) +X(x1) +Y(y1) +U(u1) :Z(0)
"到達掃碼位置訊號
Out oPositionID, 2 "oScanPos
"等待夾爪開啟
Wait Sw(561) = On "iClampOff
DD: Print "請給去取料或者下一個掃碼位置訊號"
"等待去取料訊號
If Sw(546) = On Then "iGoPickPos
GoTo FF
ElseIf Sw(550) = On Then "iGoNextScanPos
GoTo EE
Else
GoTo DD
EndIf
EE: i = i + 1 "料盤計數 +1
"Out oPositionID, 0 "Wait
Wait Sw(550) = Off
GoTo BB
"Wait Sw(546) = On "iGoPickPos
"Call NUM;
FF: If i = 10 Or i = 11 Or i = 12 Then
bRotateU = True
bRotateU2 = False
Jump Pallet(1, i) +U(intRotateU)
ElseIf i = 2 Then
bRotateU = False
bRotateU2 = True
Jump Pallet(1, i) +U(intRotateU2)
Else
bRotateU = False
bRotateU2 = False
Jump Pallet(1, i)
EndIf
"到達取料點訊號
Out oPositionID, 3 "oPickPos
"夾緊產品
Wait Sw(560) = On "iClampOn
i = i + 1 "料盤計數 +1
Go Here :Z(0) "Z-Axis back Zero
Jump hompos
Out oPositionID, 1 "oHomePos
" "等待放料訊號
"BB: If Sw(547) = On Then "iGoPutPos_Nissan
" Call put_VW
" ElseIf Sw(548) = On Then "iGoPutPos_VW
" Call put_Nissan
" ElseIf Sw(549) = On Then "iGoNGPos
" Call NGput
" Else
" Print "取料後放料點選擇(放料1、2和NG放料)"
" GoTo BB
" EndIf
"If i = 12 Then i = 1
Fend
取料的托盤是3x4結構。由於取料的產品比較深,夾爪是3個腿。第1行2列位置要旋轉35°。最後1列要旋轉120°,避免夾爪碰到托盤外邊。
3,SIEMENS SIMOTION D410 跟PC TCP/IP訊號互動
D410開啟TCP/IP埠,並且等待PC段建立連線。如果連線了,傳送資料
傳送和接收的快取取都是1024個Byte
PROGRAM PB_Communication
//Program Variables
VAR
i : DINT;
intReveiveTimes : INT;
bytesReceiveFromIPC : ARRAY[0..1023] OF BYTE;
dintNext : DINT;
TOF_Send : TOF;
myRetCloseConnection : DINT;
myRetCloseServer : DINT;
myRetTCPSend : DINT;
FT_Connected : F_TRIG;
END_VAR
FT_Connected(g_Connected);
IF FT_Connected.q THEN
myRetCloseConnection :=_tcpCloseConnection(connectionId :=OpenSvr.connectionId );
myRetCloseServer :=_tcpCloseServer(port :=2001 );
OpenSvr.functionResult:=16#EEEEEEEE;
END_IF;
// Try and Check IPC Connection
IF NOT g_Connected THEN
OpenSvr :=
_tcpOpenServer(
port := 2001
,backlog := 2
,nextCommand := IMMEDIATELY
);
IF OpenSvr.functionResult=0 THEN
g_Connected:=TRUE;
g_SendData:=TRUE;
END_IF;
ELSE
TcpRCV :=
_tcpReceive(
connectionId := OpenSvr.connectionId
,nextCommand := IMMEDIATELY
,receiveVariable := bytesReceiveFromIPC
);
//END_IF;
IF TcpRCV.functionResult = 16#0000 THEN
intReveiveTimes := intReveiveTimes + 1;
IF intReveiveTimes = 1 THEN
dintNext := 0;
END_IF;
FOR i := 0 TO 1023 DO
g_ReceiveBytes[ i] := bytesReceiveFromIPC[i];
END_FOR;
dintNext := dintNext + UDINT_TO_DINT(TcpRCV.dataLength);
IF g_Connected THEN
//Deal with the ByteBit From IPC
IPC_Get_Trig :=_getbit(g_ReceiveBytes[0],0);
IPC_Get_LScan_Deg := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,8));
IPC_Get_LScan_Vel := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,12));
IPC_Get_LScan_Acc := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,16));
IPC_Get_LScan_Dec := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,20));
IPC_Get_SScan_Deg := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,24));
IPC_Get_SScan_Vel := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,28));
IPC_Get_SScan_Acc := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,32));
IPC_Get_SScan_Dec := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,36));
IPC_Get_Shift_Deg := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,40));
IPC_Get_Shift_Vel := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,44));
IPC_Get_Shift_Acc := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,48));
IPC_Get_Shift_Dec := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,52));
IPC_Get_Engage_TorqueLim := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,56));
IPC_Get_Engage_Vel := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,60));
//IPC_Get_LScan_Time := REAL_TO_LREAL(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,64));
IPC_Get_SScan_Time := REAL_TO_DINT(LITTLEBYTEARRAY_TO_ANYTYPE(g_ReceiveBytes,64));
END_IF;
ELSIF TcpRCV.functionResult = 16#7002 THEN
intReveiveTimes := 0;
dintNext := 0;
ELSIF TcpRCV.functionResult < 0 THEN
g_Connected := FALSE;
END_IF;
IF NOT TOF_Send.Q THEN
g_SendData := TRUE;
END_IF;
TOF_Send(g_SendData,t#100ms);
IF g_Connected THEN
//Get data From Axis
IPC_Display_acturalspeed:=LREAL_TO_REAL(_to.Axis_1.servodata.pValue);//_to.Axis_1.actorData.actualSpeed
IPC_Display_acturalposition:=LREAL_TO_REAL(_to.Axis_1.servodata.actualPosition);
IPC_Display_acturaltorque:=LREAL_TO_REAL(_to.Axis_1.actualTorque.value);
IPC_Display_alarmNO:=TSI#AlarmNumber;
//Send data to IPC
g_SendBytes := ANYTYPE_TO_LITTLEBYTEARRAY(IPC_Display_acturalspeed ,8);
g_SendBytes := ANYTYPE_TO_LITTLEBYTEARRAY(IPC_Display_acturalposition ,12);
g_SendBytes := ANYTYPE_TO_LITTLEBYTEARRAY(IPC_Display_acturaltorque ,16);
g_SendBytes := ANYTYPE_TO_LITTLEBYTEARRAY(IPC_Display_alarmNO ,20);
myRetTCPSend :=
_tcpSend(
connectionId := OpenSvr.connectionId
,nextCommand := IMMEDIATELY
,dataLength := 1024
,data := g_SendBytes
);
;
IF myRetTCPSend=0 THEN
g_SendData := FALSE;
END_IF;
END_IF;
END_IF;
END_PROGRAM
從上面3個例子可以看出,電氣自動化,將來的方向使用的好多都是一些基礎的語句。主要的方面在程式設計的思想。而不是工具。
-
4 # Debugging
C#,在工控上位機領域也算是全能型的比較簡單的高階語言,Labview侷限於測量裝置,C++太難,JAVA不太適合建桌面應用程式,C#正好
-
5 # 控制研究控
說一點我個人在電氣自動化行業中對於程式語言的一些認識吧!
個人的工作經驗中需要用到程式語言的就是PLC程式的程式設計和上位機軟體的程式設計,因此就說一下關於這2方面程式設計過程中需要哪些高階語言!
1,做PLC程式的話,在使用結構化文字(ST或者SCL)程式設計時候需要用到一些C語言的知識!最常用的就是IF THEN , IF ELSE這種!在西門子的程式設計軟體中就叫做SCL程式設計,如下圖就是在博圖軟體中建立一個塊的時候,就可以選擇對這個塊的程式語言是什麼!
還需要說一點的是西門子PLC中還有一種STL(語句表)的程式語言,它比梯形圖語言要難理解一點,但是又沒有C語言的指令語法,是一種特殊的程式語言,但是應用也是很廣泛的,看一下其程式的語句如下:
STL語句表程式語言,算不上高階語言,但也是比較特殊的語言,依然是有必要學習的!
2,做上位機監控軟體的組態程式設計的時候,通常要用到一些VB或者C語言的知識!下圖就是西門子Wincc上位機軟體中支援的2種指令碼,一種是C指令碼,一種是VBS指令碼!
其實,不單單是在上位機軟體中,在一些觸控式螢幕的組態軟體中也同樣存在類似於C或者VB的宏指令。
因此C語言和VB語言,可以說是應用最多的兩種程式語言了,不管是PLC程式設計能用到,還是組態軟體中也可以用到。甚至,這些年比較流行的labview軟體,它裡邊的一些指令依然和C語言這些有理解上的相似性!--也就是說C和VB,應該說還是計算機應用中最重要且應用廣泛的兩種語言,我們做電氣自動化,其實也是在計算機平臺上,因此還是很有必要學一學這兩門語言!
-
6 # 自動化工控小劉
基礎的,你得會梯形圖語言,然後是語句表,有些上位機組態是用的VB,機械手有些用的python,C語言也是要的。
-
7 # 工控程式設計
電氣自動化需要哪些高階語言?
市面上高階語言挺多,好用的也挺多。
工業自動化裡常見到的有VB,C++,C#等等。
需要哪些?一般一個公司要求並不多,熟悉一種就好。
具體可以根據自己身情況選擇。
為什麼需要學習高階語言?我也是從事工業自動化.
自動化控制更多的是編寫PLC程式,觸控式螢幕程式。
但隨著工業4.0,智慧化的需求,
會一門電腦高階語言程式設計,真的是太迫切。
比如,你只會PLC程式設計。
那麼你學習西門子產品時,一些指令碼程式你就不會編寫。
那麼硬體通訊程式也會編寫不順,
那麼觸控式螢幕裡類似C語言的宏指令也用不好。
如我剛完結的威綸觸控式螢幕宏指令教程,你看教程都覺得吃力。
這些都是跟PLC關係比較密切的。
還有其他的就更不用說了。
比如執行卡,影象採集卡,資料採集卡等等這些應用於工控機上的工業產品。
視覺開發,深度學習這些更多深層次的應用也只有觀看的份了。
所以真的需要學習一門高階語言。
這也是也什麼平臺相似的問題非常多。
因為廣大一線的自動化同行,都已經意識到了或是有了迫切的需求。
更何況現在AI,大資料這麼流行。
緊跟潮流,玩玩開源庫也是很享受的一件事。
選擇哪種語言學習?這個應該是剛接觸想學習高階語言程式設計的朋友最為棘手的問題了。
平臺一提問,答案也是五花八門。
網友的回答也是對自己經歷的總結。
熟悉哪門語言,常用哪門語言,就建議學哪門語言。
我也是眾多網友中的一個,也來談談選哪種語言好。
答案是:
選C++語言,框架選擇MFC。
回答過相似問題好多,原因也總結了很多,
總的原因是自動化行業追求程式執行效率,各廠家硬體相容性。
不追求介面,不追求跨平臺。生產效率高就好。
另外MFC學習相對還是挺煩人的,
C#也是非常好的選擇,更簡單,更好學。
唯一麻煩的是要顧忌工業上眾多MFC程式。
回覆列表
電氣自動化專業是電氣資訊領域的一門新興學科,但由於和人們的日常生活以及工業生產密切相關,發展非常迅速,現在也相對比較成熟。已經成為高新技術產業的重要組成部分,廣泛應用於工業、農業、國防等領域,在國民經濟中發揮著越來越重要的作用。
電氣自動化專業一般包含的學科:
電路原理、PLC、微控制器、電工電子技術基礎、計算機原理及應用、電機與電力拖動基礎、電力電子技術、自動控制理論、過程檢測及儀表、計算機模擬、過程控制、運動控制、系統辨識基礎、計算機控制系統、自動化概論、嵌入式系統原理與設計等。
在工作中,電氣工程師一般能用到的程式設計軟體:如PLC(PLC專用語言)、微控制器(C語言)等。