欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

程序员文章站 2022-06-09 15:22:59
...

本例程使用的是倍福嵌入式控制器CX5120-0125。

变频器使用博能传动A1系列驱动器,支持EtherCAT通信。

案例目标

  通过倍福嵌入式控制器控制2台A1系列驱动器,实现启停控制,写目标频率,故障复位以及控制DO(驱动器本身的数字量输出);读取驱动器输出电流,输出电压,当前故障以及DI值(驱动器本身的数字量输入)。

<1>创建PLC程序。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<2>选择 Standard PLC Project,并把名称改成英文,例如下图中的“Test”。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<3>双击 POUs 文件下的 MAIN 开始编程编辑一段简单的程序,程序可以在示例工程中找到。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

PROGRAM MAIN
VAR
	Slave1_Controlword AT %QW100 :UINT :=0;          //驱动器1的 R-PZD1  bit0:启停,bit1:故障复位,bit2:DO0
	Slave1_TargetFrequency AT %QW102 :UINT :=0;      //驱动器1的 R-PZD2
	Slave1_ActualCurrent AT %IW100:UINT;            //驱动器1的T-PZD1
	Slave1_ActualVoltage AT %IW102:UINT;            //驱动器1的T-PZD2
	Slave1_ActualFrequency AT %IW104 :UINT;         //驱动器1的T-PZD3
	Slave1_EorrorCode AT %IW106 :UINT;              //驱动器1的T-PZD4   
	Slave1_DIstatus AT %IW108 :UINT;                //驱动器1的T-PZD5
	Slave1_EcatState AT %IW110 :UINT;               //驱动器1的EtherCAT通信状态
	
	Slave2_Controlword AT %QW104 :UINT :=0;        //驱动器2的 R-PZD1
	Slave2_TargetFrequency AT %QW106 :UINT :=0;    //驱动器2的 R-PZD2
	Slave2_ActualCurrent AT %IW112:UINT;           //驱动器2的T-PZD1
	Slave2_ActualVoltage AT %IW114:UINT;           //驱动器2的T-PZD2
	Slave2_ActualFrequency AT %IW116 :UINT;        //驱动器2的T-PZD3
	Slave2_EorrorCode AT %IW118 :UINT;            //驱动器2的T-PZD4   
	Slave2_DIstatus AT %IW120 :UINT;              //驱动器2的T-PZD5
	Slave2_EcatState AT %IW122 :UINT;             //驱动器2的EtherCAT通信状态
	Init :BOOL:=FALSE;
	//fbSdoRead  : FB_EcCoESdoRead;
	fbsdoWrite :FB_EcCoESdoWrite;
	SDO_Execute: BOOL:=FALSE;
	SDO_Done: BOOL:=TRUE;
	SDO_Value: UINT;
	SDO_Index: WORD;
	SDO_SubIndex: BYTE;
END_VAR




IF (Slave1_EcatState = 16#08)AND(Slave2_EcatState = 16#08) THEN  //判断驱动器是否都进入OP状态
	
    //初始化使用SDO配置驱动器加减速时间及停机方式。
	IF NOT Init THEN
	    //驱动器的加速时间改为50s
		SDO_Index:=16#2034;  //B04.02 斜坡1加速时间
		SDO_SubIndex:=3;
		SDO_Value:=500;     //50.0s
		fbsdoWrite(sNetId:='5.63.20.224.4.1',nSlaveAddr :=1001, nIndex:=SDO_Index, nSubIndex :=SDO_SubIndex, pSrcBuf:= ADR(SDO_Value), cbBufLen:=2,bExecute:=TRUE);
		IF NOT fbsdoWrite.bBusy THEN
			fbsdoWrite(bExecute:=FALSE);
		END_IF
		fbsdoWrite(sNetId:='5.63.20.224.4.1',nSlaveAddr :=1002, nIndex:=SDO_Index, nSubIndex :=SDO_SubIndex, pSrcBuf:= ADR(SDO_Value), cbBufLen:=2,bExecute:=TRUE);
		IF NOT fbsdoWrite.bBusy THEN
			fbsdoWrite(bExecute:=FALSE);
		END_IF
		
		//驱动器的减速时间改为10s
		SDO_Index:=16#2034;  //B04.03 斜坡1减速时间
		SDO_SubIndex:=4;
		SDO_Value:=100;     //10.0s
		fbsdoWrite(sNetId:='5.63.20.224.4.1',nSlaveAddr :=1001, nIndex:=SDO_Index, nSubIndex :=SDO_SubIndex, pSrcBuf:= ADR(SDO_Value), cbBufLen:=2,bExecute:=TRUE);
		IF NOT fbsdoWrite.bBusy THEN
			fbsdoWrite(bExecute:=FALSE);
		END_IF
		fbsdoWrite(sNetId:='5.63.20.224.4.1',nSlaveAddr :=1002, nIndex:=SDO_Index, nSubIndex :=SDO_SubIndex, pSrcBuf:= ADR(SDO_Value), cbBufLen:=2,bExecute:=TRUE);
		IF NOT fbsdoWrite.bBusy THEN
			fbsdoWrite(bExecute:=FALSE);
		END_IF
		
		//驱动器的停机方式改为减速停机
		SDO_Index:=16#2035;  //B05.32 OFF1停机方式
		SDO_SubIndex:=33;
		SDO_Value:=1;     //0:*停机  1:减速停机
		fbsdoWrite(sNetId:='5.63.20.224.4.1',nSlaveAddr :=1001, nIndex:=SDO_Index, nSubIndex :=SDO_SubIndex, pSrcBuf:= ADR(SDO_Value), cbBufLen:=2,bExecute:=TRUE);
		IF NOT fbsdoWrite.bBusy THEN
			fbsdoWrite(bExecute:=FALSE);
		END_IF
		fbsdoWrite(sNetId:='5.63.20.224.4.1',nSlaveAddr :=1002, nIndex:=SDO_Index, nSubIndex :=SDO_SubIndex, pSrcBuf:= ADR(SDO_Value), cbBufLen:=2,bExecute:=TRUE);
		IF NOT fbsdoWrite.bBusy THEN
			fbsdoWrite(bExecute:=FALSE);
		END_IF
		Init:=TRUE;
	END_IF// end of init
	
	
	Slave1_TargetFrequency:=4096;  //频率写50Hz
	Slave2_TargetFrequency:=4096;
	IF(Slave1_EorrorCode<>0)OR(Slave2_EorrorCode<>0) THEN//有故障
	   Slave1_Controlword.0:=FALSE;     //停机
	   Slave2_Controlword.0:=FALSE;
	   Slave1_Controlword.2:=FALSE;    //DO0断开
	   Slave2_Controlword.2:=FALSE;
    ELSE                               //正常
	   Slave1_Controlword.0:=TRUE;     //运行
	   Slave2_Controlword.0:=TRUE;
	   Slave1_Controlword.2:=TRUE;    //DO0闭合
	   Slave2_Controlword.2:=TRUE;
    END_IF
	
ELSE  //不再OP状态
	Slave1_Controlword.0:=FALSE;     //停机
	Slave2_Controlword.0:=FALSE;
	Slave1_Controlword.2:=FALSE;    //DO0断开
	Slave2_Controlword.2:=FALSE;
END_IF

<4>编译程序,选择Test Project 右键选择Build。(注意本程序中因为涉及SDO的读写,所以添加了EtherCAT库,不添加会报错,文末有添加步骤)

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<5>系统会自动编译这段代码,如果没有错误就会在消息栏中提示成功生成,并且在 Test Instance 中生成输入输出变量可供连接。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<6>分别点击 Test Instance 中的变量开始进行变量连接,例子中将程序中的输入变量Slave1_ActualCurrent关联至从站1的T-PZD1。请将PLC中用到的输入输出变量依次关联至从站的PZD。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<7>变量连接做好后选择 TwinCAT,点击 Activate Configuration。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<8>弹出对话框点击确定。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<9>如果弹出以下窗口说明你的项目中有一些 license 没有**或者漏**了,不过没有关系,点击是可以重新**缺少的 license。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<10>输入5位验证码后点OK。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<11>点击确定切换到 RUN 模式。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<12>点击工具栏的绿色箭头 Login。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<13>程序正常运行,可以看到实时监控的数据值。红框中标出的按键从左至右依次是登录,运行,停止,退出登录。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

添加EtherCAT库实现SDO读写

<1>在左侧PLC->Test->Test Project->References目录树下,右击选择Add library。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<2>在弹出的对话框内,选择Tc2_EtherCAT。选择OK。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<3>添加成功后,可以在目录树中看到已经添加的EtherCAT库。

TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器

<4>然后可以使用功能块FB_EcCoESdoRead进行SDO的读操作,使用FB_EcCoESdoWrite进行SDO的写操作,使用这两个功能块对驱动器参数进行修改,在示例程序中有体现。