S7-1500 讀取V90/S120的常用驅動參數
此程序已更新,可以下載例子程序
https://files.cnblogs.com/files/lion-zheng/PLC_async_drive.zip
1
不需要理解非周期通訊,調用這個FB就可以讀取常用的驅動狀態,程序塊已經封裝了非周期通訊功能。
故障代碼、報警代碼、扭矩、電流、直流母線電壓、電機溫度、驅動器溫度
功率、轉速
本文地址
http://www.cnblogs.com/lion-zheng/p/7853852.html
非周期通訊參考資料可在在西門子中文下載中心 搜索 非周期
http://www.ad.siemens.com.cn/download/
2
此功能塊的輸入管腳
name | type | datatype | description |
---|---|---|---|
Hardware_ID | in | HW_IO | Profinet/Profibus網絡標識ID * |
Drive_Number | in | int | V90/CU310 = 1, G120 = 2 |
Pulse | in | bool | 連接5HZ或2.5HZ的脈沖信號 |
V90 | in | bool | 區分驅動類型,V90 = 1, cu310 = 0 |
*HardwareID是以上參數中比較特別的一個,可以在TIA portal的Device configuration
中找到。
如果一個設備有兩個HardwareID,那么很可能,兩個都可以用。

HardwareID也可以在TIA portal的Tags -> Default tag table -> System constants
中找到。
功能塊的輸出管腳
name | type | datatype | description |
---|---|---|---|
FaultNumber | out | DINT | 故障代碼 |
AlarmNumber | out | DINT | 報警代碼 |
ActualTorque | out | real | 扭矩 |
ActualCurrent | out | real | 電流 |
DCvoltage | out | real | 直流母線電壓 |
MotorTemp | out | real | 電機溫度 |
DriveTemp | out | real | 驅動器溫度 |
ActualPower | out | real | 電機實際功率 |
ActualRPM | out | real | 電機實際轉速 |
功能塊的調用效果,2個V90,1個CU310,可見只有HardwareID管腳略有不同

至此為止,你應該已經知道了此FB的功能和使用方法。下文是一些程序內部實現的細節。
3
在編寫此程序塊時,發現一個 WRREC 和 RDREC 程序塊的特點。
當我們讀取參數時,需要先調用WRREC來發送命令給驅動器,WRREC會返回Done信號。然而這個Done信號只保證了發送完成,並無法確認驅動已經准備好。因此我們需要延時一段時間,等待驅動准備好數據。V90需要大約50ms,S120需要30ms。延時后,再調用RDREC。發現此問題感謝我們的朋友 @內存1KB
的提醒。
1)正確的狀態,WRREC之后,立即發送RDREC,出現故障
- 正確的時序,WRREC之后,延時50ms,再發送RDREC,沒有故障
4
程序的細節
- 定義報文頭
- 定義每一個需要讀取的參數
- 調用WRREC
- 延時,並調用RDREC
- 輸出變量到FB接口
//Telegram head
#write_record[0] := #task;
#write_record[1] := 01;//01 read-task, 02 write-task
#write_record[2] := INT_TO_BYTE(#Drive_Number);
#write_record[3] := 16#9;//number of parameter
//Parameter1 r2131 (16#853) fault number
#write_record[4] := 16#10;
#write_record[5] := 16#01;//number of index
#write_record[6] := 16#8;//parameter number
#write_record[7] := 16#53;//parameter number
#write_record[8] := 16#0;//first index number = 0
#write_record[9] := 16#0;//first index number = 0
//Parameter2 r2132 (16#854) alarm number
#write_record[10] := 16#10;
#write_record[11] := 16#01;//number of index
#write_record[12] := 16#8;//parameter number
#write_record[13] := 16#54;//parameter number
#write_record[14] := 16#0;//first index number = 0
#write_record[15] := 16#0;//first index number = 0
//Parameter3 r31 (16#1F) actual torque smoothed
#write_record[16] := 16#10;
#write_record[17] := 16#01;//number of index
#write_record[18] := 16#0;//parameter number
#write_record[19] := 16#1F;//parameter number
#write_record[20] := 16#0;//first index number = 0
#write_record[21] := 16#0;//first index number = 0
//Parameter4 r26 (16#1A) DC voltage smoothed
#write_record[22] := 16#10;
#write_record[23] := 16#01;//number of index
#write_record[24] := 16#0;//parameter number
#write_record[25] := 16#1A;//parameter number
#write_record[26] := 16#0;//first index number = 0
#write_record[27] := 16#0;//first index number = 0
//Parameter5 r27 (16#1B) ActualCurrent
#write_record[28] := 16#10;
#write_record[29] := 16#01;//number of index
#write_record[30] := 16#0;//parameter number
#write_record[31] := 16#1B;//parameter number
#write_record[32] := 16#0;//first index number = 0
#write_record[33] := 16#0;//first index number = 0
//Parameter6 r21 (16#15) ActualRpm
#write_record[34] := 16#10;
#write_record[35] := 16#01;//number of index
#write_record[36] := 16#0;//parameter number
#write_record[37] := 16#15;//parameter number
#write_record[38] := 16#0;//first index number = 0
#write_record[39] := 16#0;//first index number = 0
//Parameter7 r32 (16#20) ActualPower
#write_record[40] := 16#10;
#write_record[41] := 16#01;//number of index
#write_record[42] := 16#0;//parameter number
#write_record[43] := 16#20;//parameter number
#write_record[44] := 16#0;//first index number = 0
#write_record[45] := 16#0;//first index number = 0
//Parameter8 r35 (16#23) MotorTemp
//Parameter8 r632 (16#278)
#write_record[46] := 16#10;
#write_record[47] := 16#01;//number of index
IF #v90 THEN
#write_record[48] := 16#2;//parameter number
#write_record[49] := 16#78;//parameter number
ELSE
#write_record[48] := 16#0;//parameter number
#write_record[49] := 16#23;//parameter number
END_IF;
#write_record[50] := 16#0;//first index number = 0
#write_record[51] := 16#0;//first index number = 0
//Parameter9 r37 (16#25) DriveTemp
#write_record[52] := 16#10;
#write_record[53] := 16#01;//number of index
#write_record[54] := 16#0;//parameter number
#write_record[55] := 16#25;//parameter number
#write_record[56] := 16#0;//first index number = 0
#write_record[57] := 16#0;//first index number = 0
#R_TRIG_Instance(CLK:=#Pulse);
#WRREC_REQ := #R_TRIG_Instance.Q AND NOT #WRREC_BUSY AND NOT #REREC_BUSY;
#WRREC_Instance(REQ:=#WRREC_REQ,
ID:=#Hardware_ID,
INDEX:=47,
DONE=>#WRREC_DONE,
BUSY=>#WRREC_BUSY,
ERROR=>#WRREC_ERROR,
STATUS=>#WRREC_STATUS,
RECORD:= #write_record);
#IEC_Timer_0_Instance(IN := #Pulse,
PT := T#100MS);
//#R_TRIG_Instance_1(CLK := #IEC_Timer_0_Instance.Q,
// Q => #REREC_REQ);
#REREC_REQ := #WRREC_DONE;
#RDREC_Instance(REQ:= #REREC_REQ,
ID:= #Hardware_ID,
INDEX:= 47,
VALID=> #REREC_VALID,
BUSY=> #REREC_BUSY,
ERROR=> #REREC_ERROR,
STATUS=> #REREC_STATUS,
RECORD:= #read_record);
//byte 0,1,2,3 telegram head
//byte 4,5,6,7 ,parameter 1 ,r2131,fault code
"Tag_23" := #read_record[6];
"Tag_24" := #read_record[7];
#FaultNumber := WORD_TO_DINT("Tag_25");
//byte 8,9,10,11 ,parameter 2,r2132,alarm code
"Tag_23" := #read_record[10];
"Tag_24" := #read_record[11];
#AlarmNumber := WORD_TO_DINT("Tag_25");
//byte 12,13,14,15,16,17 ,parameter 3, r31 actual torque
"Tag_23" := #read_record[14];
"Tag_24" := #read_record[15];
"Tag_26" := #read_record[16];
"Tag_27" := #read_record[17];
#ActualTorque := "Tag_28";
//byte 18,19,20,21,22,23 ,parameter 4, r26 DC voltage
"Tag_23" := #read_record[20];
"Tag_24" := #read_record[21];
"Tag_26" := #read_record[22];
"Tag_27" := #read_record[23];
#DCvoltage := "Tag_28";
//byte 24,25,26,27,28,29 ,parameter 5, r27 actual current
"Tag_23" := #read_record[26];
"Tag_24" := #read_record[27];
"Tag_26" := #read_record[28];
"Tag_27" := #read_record[29];
#ActualCurrent := "Tag_28";
//byte 30,31,32,33,34,35 ,parameter 6, r21 actual RPM
"Tag_23" := #read_record[32];
"Tag_24" := #read_record[33];
"Tag_26" := #read_record[34];
"Tag_27" := #read_record[35];
#ActualRPM := "Tag_28";
//byte 36,37,38,39,40,41 ,parameter 7, r32 actual POWER
"Tag_23" := #read_record[38];
"Tag_24" := #read_record[39];
"Tag_26" := #read_record[40];
"Tag_27" := #read_record[41];
#ActualPower := "Tag_28";
//byte 42,43,44,45,46,47 ,parameter 8, r35 MOTOR TEMP
"Tag_23" := #read_record[44];
"Tag_24" := #read_record[45];
"Tag_26" := #read_record[46];
"Tag_27" := #read_record[47];
#MotorTemp := "Tag_28";
//byte 48,49,50,51,52,53 ,parameter 9, r35 MOTOR TEMP
"Tag_23" := #read_record[50];
"Tag_24" := #read_record[51];
"Tag_26" := #read_record[52];
"Tag_27" := #read_record[53];
#DriveTemp := "Tag_28";