[西门子] 西门子S7-1200PLC Modbus通信控制变频器之二(SCL语言)

[复制链接]
查看272 | 回复0 | 2024-6-15 08:30:07 | 显示全部楼层 |阅读模式
>







往期精彩文章:
电气工程师项目设计流程:一个项目中,电气工程师要做的设计思路
西门子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通信控制施耐德变频器运行》

感谢阅读指正,关注了解更多!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则