>
往期精彩文章:
电气工程师项目设计流程:一个项目中,电气工程师要做的设计思路
西门子S7-1200/1500PLC的结构化程序编程模式/套路
PLC定位控制基础:电子齿轮比对脉冲当量和电机转速的调整作用
伺服、步进电机定位控制十条基础知识
步进电动机与交流伺服电动机的性能比较,来看看跟你知道的一样吗?
怎样用软件进行交流伺服驱动器的增益自动调整?
变频器的常见故障诊断与处理,码了五千字,一篇文章搞定
变频器的种类多种多样,根据负载特性怎么选择变频器呢?
模拟量标定与标定变换是什么意思?你可能不知道,掌握一个公式,确实很简单
电工最基础、最核心的知识是掌握电的回路(九):二次控制回路
怎么让两台伺服电机比例同步运行?伺服驱动器要做哪些设置?
福利:告诉你一个工控人收入翻倍的秘密!
福利:这家维修电工兼职赚钱平台, 喊您来领红包!
|
西门子S7-1200PLC Modbus通信控制变频器之二
上篇文章《西门子S7-1200PLC Modbus通信控制变频器》是LAD语言写的程序,计算转换比较复杂,含有较多中间变量。接下来,来看看用SCL语言编写的程序吧!
开头来复习一下上篇文章的内容:
通信协议是设备与设备之间进行数据交换的一种机器格式语言,参考:
《PLC通信基础知识》。
Modbus通信协议是Modicon公司(现被施耐德电气公司收购)提出的一种报文(通信)传输协议,由于它的开放性且无版权要求(免费使用),发展迅速,已经成为一种通用的工业标准,现在较多的工控产品支持它。
▼ 通信协议格式
期待更多的设备使用中国的EPA实时以太网通信。
由于大多数Modbus设备通信通过串口RS-485物理层进行,即Modbus RTU(紧凑)和Modbus ASCII(冗长),这两种通信不是实时通信,通信数据存在时间的快速响应问题,不适合要求快速响应的场合,如伺服电机的精确控制。但是,它应用在变频器的控制场合、模拟量的控制场合,还是比较经济的。
要控制变频器的运行,变频器的说明书少不了,不同的变频器通信协议的参数地址表示方法不一样。如台达变频器VFD-M的MODBUS通信协议参数地址定义:
▼ 通信协议参数地址定义
因一个4位的16进制数,可以表示16个bit位,每4个位组成一位16进制数。
上图可以看出,所有命令只用到了16进制数的低8位,其余高位用0补齐。
则,0012H表示正转启动;0022H表示反转启动;0001H表示停机等。
变频器与PLC地址对应表
| 参数地址#16
| MODBUS地址#10
+40001
| 运行命令
| 2000H
| 48193
| 频率命令 | 2001H
| 48194
| 变频器状态
| 2100H
| 48449
| 输出频率
| 2103H
| 48452
| 输出电流
| 2104H
| 48453
| 输出电压
| 2105H
| 48455
| 以上16进制的2000,就是10进制的8192,加上40001就是48193,后面类推。
关于进制转换,可以用电脑系统自带的计算器:点击“开始”菜单→计算器→点击左上角的“三”→选择“程序员”→选择被转换的进制→输入数字,即可显示转换后的数字。
变频器参数设置
参数码
| 参数功能
| 设定值
| P00
| 主频率输入来源
| 03:RS485
| P01
| 运转信号来源
| 03或04
| P88
| RS485通讯地址
| 01~254
| P89 | 数据传输速度
| 00/01/02/03
| P92 | 通讯数据格式
| 与PLC一致
| P157 | 通信模式选择
| 01:Modbus
|
除了以上通信参数,变频器还应设定基本的加减速度参数等。
编写程序:
1、新建一个项目,组态好设备。
▼ 组态RS485通信模块或通信板
2、建立一个PLC数据类型(UDT),来表示变频器的各个变量。这些变量是INOUT类的形式,在程序调用时只需要一个引脚就包含了所有的输入输出变量,如下图:
▼ 自定义变量
3、建立传输数据存储数据块(DB),用于通信读写的数据存放。注意要取消“优化的块访问”,才能看到偏移量数据。
▼ 数据存储数据块
4、新建一个全局背景数据块,有多台变频器,可用数组表示台数。背景数据块用于联系外部实际地址:
▼ 全局背景数据块
5、建立一个FB,设置块接口参数:IN -复位按钮;IN-从站号;INOUT(输入输出)-变频参数,为UDT数据类型,调用外部实际参数:
▼ FB的接口参数
6、编写程序,以下为SCL语言编写的块程序 :
▼ FB块程序
IF "全局数据块".正转按钮 AND NOT "全局数据块".反转按钮 THEN
"全局数据块".变频器[0].控制设定.正转 := 1;
"全局数据块".变频器[0].控制设定.反转 := 0;
"全局数据块".变频器[0].控制设定.停止 := 0;
"全局数据块".变频器[0].控制设定.频率 := 50;
END_IF;
IF "全局数据块".反转按钮 AND NOT "全局数据块".正转按钮 THEN
"全局数据块".变频器[0].控制设定.正转 := 0;
"全局数据块".变频器[0].控制设定.反转 := 1;
"全局数据块".变频器[0].控制设定.停止 := 0;
"全局数据块".变频器[0].控制设定.频率 := 30;
END_IF;
IF "全局数据块".停止按钮 THEN
"全局数据块".变频器[0].控制设定.正转 := 0;
"全局数据块".变频器[0].控制设定.反转 := 0;
"全局数据块".变频器[0].控制设定.停止 := 1;
"全局数据块".变频器[0].控制设定.频率 := 0;
END_IF;
//以上为外部按钮、设定关联DB块
IF #变频参数.状态显示.报警代码<>0 THEN
#变频参数.报警.报警1 := 1;
END_IF;
IF #复位按钮 THEN
#变频参数.报警.报警1 := 0;
"数据存储".设置数据[2] := 16#0002;
ELSE
"数据存储".设置数据[2] := 16#0000;
END_IF;
"数据存储".设置数据[1] := INT_TO_WORD(REAL_TO_INT(#变频参数.控制设定.频率 * 100));
IF #变频参数.控制设定.正转 AND NOT #变频参数.控制设定.反转
AND NOT #变频参数.控制设定.停止 THEN
"数据存储".设置数据[0] := 16#0012;
END_IF;
IF #变频参数.控制设定.反转 AND NOT #变频参数.控制设定.正转
AND NOT #变频参数.控制设定.停止 THEN
"数据存储".设置数据[0] := 16#0022;
END_IF;
IF #变频参数.控制设定.停止 OR #变频参数.报警.报警1
AND NOT #变频参数.控制设定.正转 AND NOT #变频参数.控制设定.反转 THEN
"数据存储".设置数据[0] := 16#0001;
END_IF;
//以上把参数写入到DB块
#MB_COMM_LOAD(REQ:="FirstScan",//初始脉冲
"PORT":=270,//通信模块的系统常量,在PLC变量里
BAUD:=9600,//波特率,与变频器一致
PARITY:=2,//偶校验
MB_DB:=#MB_MASTER);
//以上组态通信端口
#MB_MASTER(REQ:=#写入请求,
MB_ADDR:=#从站号,
MODE:=1,//写数据
DATA_ADDR:=48193,//写入初始地址
DATA_LEN:=3,//字个数
DONE=>#写入完成,//标志位
DATA_PTR:=P#DB1.DBX0.0 WORD 3);//指针,起始位+长度
#MB_MASTER(REQ := #读取请求,
MB_ADDR := #从站号,
MODE := 0,//读数据
DATA_ADDR := 48449,//读取初始地址
DATA_LEN := 7,//字个数
DONE=>#读取完成,//标志位
DATA_PTR := P#DB1.DBX6.0 WORD 7);//指针,起始位+长度
//以上为主站通信指令,两个指令要一样,用复制粘贴后,再改参数。
IF #MB_COMM_LOAD.DONE OR #读取完成 THEN
#写入请求 := 1;
END_IF;
IF #写入完成 OR #变频参数.报警.报警1 THEN
#写入请求 := 0;
END_IF;
IF #写入完成 THEN
#读取请求 := 1;
END_IF;
IF #读取完成 OR #变频参数.报警.报警1 THEN
#读取请求 := 0;
END_IF;
//以上为轮询读写通信
#变频参数.状态显示.报警代码 := WORD_TO_INT("数据存储".读取数据[0]);
#变频参数.状态显示.当前频率 := INT_TO_REAL(WORD_TO_INT("数据存储".读取数据[3]))/100.0;
#变频参数.状态显示.当前电流 := INT_TO_REAL(WORD_TO_INT("数据存储".读取数据[4])) / 10.0;
#变频参数.状态显示.当前电压 := INT_TO_REAL(WORD_TO_INT("数据存储".读取数据[6])) / 10.0;
//以上为输出状态转换
7、主程序调用块2效果如下:
▼ OB1程序调用FB块2
参阅:《三菱Q系列PLC,用Modbus RTU通信控制施耐德变频器运行》
感谢阅读指正,关注了解更多!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |