使用ST语言作为PLC控制程序编写的通信方面的资料比较少,网络上找不到相应的资料,实际测试一段时间后编写成功,所以有意将方法和程序分享出来。
因本人学习PLC只有2个多月,在程序,指令,硬件等使用方面难免出现不够严谨的方法,因此本文只给有需要了解这些内容的人或需要熟悉这类程序的人做通信参考。
本文程序均经过测试,在硬件环境相同的情况下可顺利执行相应动作。
主要硬件设备:FX3u-32MT,FX3u-485-BD,FX3u-485-ADP-MB,台达变频器VFD-M
通信格式:MODBUS ASCII,9600,7,E,1,停止位2,变频器地址01。
变频器参数地址,功能码使用以及参数内容设置,请参考变频器手册上的通信篇设置。
adprw指令的参数和功能码等内容请参考FX3U通信篇手册。
IF( M0 )THEN (*M0为触摸屏上的变频器开关按钮*)
Y11:=1;(*Y11变频器电源接通*)
Y5:=1;(*Y5为运行指示灯,可接可不接*)
ELSE
Y11:=0;
Y5:=0;
M2:=0;
M3:=0;
M4:=0;
M5:=0;
M7:=0;(*修改频率的数据发送状态位,与M5作用一样起到同时只能发送一次数据*)
(*变频器关闭的话,将各参数按钮复位*)
END_IF;
IF( M8002 )THEN(*初始化通道2,写入通信格式D8420,通信协议D8421,设置超时,重试等数据*)
MOV( MOV( MOV( MOV( MOV( MOV( MOV( MOV( M8411, H1088, D8420 ), H101, D8421 ), K2000, D8429 ), K400, D8430 ), K10,D8431 ), K3, D8432 ), H1, D8435 ), K100, D8436 );
(*经过测试,在ST语言内必须使用这个MOV嵌套方法设置通信参数,不能使用“=”直接赋值,否则无效无法通信,原因不明,如果你知道的话请告诉我,因为这违背ST语言的编程方式。*)
END_IF;
IF( M6 AND M7 )THEN(*M6为修改变频器频率按钮*)
adprw( 1,H1,H6,H2001,k1,D115 );(*发送数据,往变频器的H2001地址写一个频率数据内容D115,D115通过触摸屏输入元件传入,因此在触摸屏上写入频率内容输入即可更改变频器运行频率*)
IF( M8029 )THEN(*发送完成的话复位通信状态标志*)
M7:=0;
END_IF;
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;
END_IF;
IF( ldp( 1,M6 ) ) THEN
M7:=1;
(*当触摸屏上的停止按钮按下时,设置M5发送数据标志,并切换触摸屏上的按钮状态,其他按钮置0*)
END_IF;
IF( M2 AND M5 ) THEN(*M2为变频器正转按钮*)
adprw( 1,H1,H6,H2000,k1,H12);(*发送数据,往变频器的H2000地址写一个正转数据内容H12*)
IF( M8029 )THEN(*发送完成的话复位通信状态标志*)
M5:=0;
END_IF;
END_IF;
IF( M3 AND M5 ) THEN(*M3为变频器反转按钮*)
adprw( 1,H1,H6,H2000,k1,H22);(*发送数据,往变频器的H2000地址写一个反转数据内容H22*)
IF( M8029 )THEN(*发送完成的话复位通信状态标志*)
M5:=0;
END_IF;
END_IF;
IF( M4 AND M5 ) THEN(*M4为变频器停止按钮*)
adprw( 1,H1,H6,H2000,k1,H1);(*发送数据,往变频器的H2000地址写一个停止数据内容H1*)
IF( M8029 )THEN(*发送完成的话复位通信状态标志*)
M5:=0;
END_IF;
END_IF;
|