三菱fx1n使用st語言rs指令通過485-bd模塊與臺達變頻器進行通信
作者:東莞市天翔環境工程有限公司,廣東東極環保科技有限公司
使用ST語言作爲PLC控制程序編寫的通信方面的資料比較少,網絡上找不到相應的資料,實際測試一段時間後編寫成功,所以有意將方法和程序分享出來。
因本人學習PLC只有2個多月,在程序,指令,硬件等使用方面難免出現不夠嚴謹的方法,因此本文只給有需要了解這些內容的人或需要熟悉這類程序的人做通信參考。
本文程序均經過測試,在硬件環境相同的情況下可順利執行相應動作。
主要硬件設備:FX1N-24MT,FX1N-485-BD,臺達變頻器VFD-M。
通信格式:MODBUS ASCII,9600,7,E,1,停止位2,變頻器地址01。
變頻器參數地址,功能碼使用以及參數內容設置,請參考變頻器手冊上的通信篇設置。
rs指令的參數和功能等內容請參考FX編程器的通信篇手冊。
IF( M0 )THEN (*M0爲觸摸屏上的變頻器開關按鈕*)
Y11:=1;(*Y11變頻器電源接通*)
Y5:=1;(*Y5爲運行指示燈,可接可不接*)
ELSE
Y11:=0;
Y5:=0;
M2:=0;
M3:=0;
M4:=0;
M5:=0;(*修改頻率的數據發送狀態位,起到同時只能發送一次數據的作用*)
(*變頻器關閉的話,將各參數按鈕復位*)
END_IF;
IF( ldp( 1,M8123 ) )THEN(*數據接收完畢的話,復位m8123數據接收完畢標誌*)
rst(1,M8123);
END_IF;
IF ( M8002 ) THEN
M8161:=1;(*8位數據處理模式*)
D8120:=H0C88;(*設置通信格式*)
END_IF;
IF( M8000 AND ldp( 1,M6 ) )THEN(*M6爲修改變頻器頻率按鈕*)
D10:=H003A;
D25:=H000D;
D26:=H000A;
D101:=H0001;
D102:=H0003;
D103:=H0020;
D104:=H0001;
D105:=D115;
D106:=H0000;
(*設置傳送的內容,根據變頻器功能碼和變頻器寄存器地址設置*)
(*往變頻器的H2001地址寫一個頻率數據內容D115,D115通過觸摸屏輸入元件傳入,因此在觸摸屏上寫入頻率內容輸入即可更改變頻器運行頻率*)
ASCI( TRUE ,D101, 2,D11);
ASCI( TRUE ,D102, 2,D13);
ASCI( TRUE ,D103, 2,D15);
ASCI( TRUE ,D104, 2,D17);
ASCI( TRUE ,D105, 2,D19);
ASCI( TRUE ,D106, 2,D21);
(*將傳送內容轉換成ASCII碼*)
ADD_E( TRUE , D101,D102,D103,D104,D105,D106 , D110);
SUB_E( TRUE , 256 , D110, D28);
(*計算數據內容的LRC碼*)
ASCI( TRUE ,D28, 2,D23);
(*將LRC碼寫入d23,d24*)
RS( TRUE, D10 , 17 , 17, D50 );
(*設置傳送數據內容爲D10開始的17個D寄存器裏的內容*)
M8122:=1;
(*傳送開始*)
END_IF;
IF( ldp( 1,M2 ) ) THEN
M5:=1;
M3:=0;
M4:=0;
(*當觸摸屏正轉按鈕按下時,設置M5發送數據標誌,並切換觸摸屏上的按鈕狀態,其他按鈕置0*)
END_IF;
IF( ldp( 1,M3 ) ) THEN
M5:=1;
M2:=0;
M4:=0;
(*當觸摸屏反轉按鈕按下時,設置M5發送數據標誌,並切換觸摸屏上的按鈕狀態,其他按鈕置0*)
END_IF;
IF( ldp( 1,M4 ) ) THEN
M5:=1;
M3:=0;
M2:=0;
(*當觸摸屏停止按鈕按下時,設置M5發送數據標誌,並切換觸摸屏上的按鈕狀態,其他按鈕置0*)
END_IF;
IF( ldf( 1,M8122 ) ) THEN
M5:=0;
(*數據發送成功以後,將M5置0,不再繼續發送*)
END_IF;
IF( ldp( 1,M2 ) AND M5 ) THEN(*M2爲變頻器正轉按鈕*)
D10:=H003A;
D25:=H000D;
D26:=H000A;
D101:=H0001;
D102:=H0006;
D103:=H0020;
D104:=H0000;
D105:=H0000;
D106:=H0012;
(*設置傳送的內容,根據變頻器功能碼和變頻器寄存器地址設置*)
ASCI( TRUE ,D101, 2,D11);
ASCI( TRUE ,D102, 2,D13);
ASCI( TRUE ,D103, 2,D15);
ASCI( TRUE ,D104, 2,D17);
ASCI( TRUE ,D105, 2,D19);
ASCI( TRUE ,D106, 2,D21);
(*將傳送內容轉換成ASCII碼*)
ADD_E( TRUE , D101,D102,D103,D104,D105,D106 , D110);
SUB_E( TRUE , 256 , D110, D28);
(*計算數據內容的LRC碼*)
ASCI( TRUE ,D28, 2,D23);
(*將LRC碼寫入d23,d24*)
RS( TRUE, D10 , 17 , 0, D50 );
(*設置傳送數據內容爲D10開始的17個D寄存器裏的內容*)
M8122:=1;
(*傳送開始*)
END_IF;
IF( ldp( 1,M3 ) AND M5 ) THEN(*M3爲變頻器反轉按鈕*)
D10:=H003A;
D25:=H000D;
D26:=H000A;
D101:=H0001;
D102:=H0006;
D103:=H0020;
D104:=H0000;
D105:=H0000;
D106:=H0022;
(*設置傳送的內容,根據變頻器功能碼和變頻器寄存器地址設置*)
ASCI( TRUE ,D101, 2,D11);
ASCI( TRUE ,D102, 2,D13);
ASCI( TRUE ,D103, 2,D15);
ASCI( TRUE ,D104, 2,D17);
ASCI( TRUE ,D105, 2,D19);
ASCI( TRUE ,D106, 2,D21);
(*將傳送內容轉換成ASCII碼*)
ADD_E( TRUE , D101,D102,D103,D104,D105,D106 , D110);
SUB_E( TRUE , 256 , D110, D28);
(*計算數據內容的LRC碼*)
ASCI( TRUE ,D28, 2,D23);
(*將LRC碼寫入d23,d24*)
RS( TRUE, D10 , 17 , 0, D50 );
(*設置傳送數據內容爲D10開始的17個D寄存器裏的內容*)
M8122:=1;
(*傳送開始*)
END_IF;
IF( ldp( 1,M4 ) AND M5 ) THEN(*M4爲變頻器停止按鈕*)
D10:=H003A;
D25:=H000D;
D26:=H000A;
D101:=H0001;
D102:=H0006;
D103:=H0020;
D104:=H0000;
D105:=H0000;
D106:=H0001;
(*設置傳送的內容,根據變頻器功能碼和變頻器寄存器地址設置*)
ASCI( TRUE ,D101, 2,D11);
ASCI( TRUE ,D102, 2,D13);
ASCI( TRUE ,D103, 2,D15);
ASCI( TRUE ,D104, 2,D17);
ASCI( TRUE ,D105, 2,D19);
ASCI( TRUE ,D106, 2,D21);
(*將傳送內容轉換成ASCII碼*)
ADD_E( TRUE , D101,D102,D103,D104,D105,D106 , D110);
SUB_E( TRUE , 256 , D110, D28);
(*計算數據內容的LRC碼*)
ASCI( TRUE ,D28, 2,D23);
(*將LRC碼寫入d23,d24*)
RS( TRUE, D10 , 17 , 0, D50 );
(*設置傳送數據內容爲D10開始的17個D寄存器裏的內容*)
M8122:=1;
(*傳送開始*)
END_IF;