三菱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;