TwinCAT学习笔记3--创建PLC程序控制2台EtherCAT变频器
本例程使用的是倍福嵌入式控制器CX5120-0125。
变频器使用博能传动A1系列驱动器,支持EtherCAT通信。
案例目标
通过倍福嵌入式控制器控制2台A1系列驱动器,实现启停控制,写目标频率,故障复位以及控制DO(驱动器本身的数字量输出);读取驱动器输出电流,输出电压,当前故障以及DI值(驱动器本身的数字量输入)。
<1>创建PLC程序。
<2>选择 Standard PLC Project,并把名称改成英文,例如下图中的“Test”。
<3>双击 POUs 文件下的 MAIN 开始编程编辑一段简单的程序,程序可以在示例工程中找到。
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库,不添加会报错,文末有添加步骤)
<5>系统会自动编译这段代码,如果没有错误就会在消息栏中提示成功生成,并且在 Test Instance 中生成输入输出变量可供连接。
<6>分别点击 Test Instance 中的变量开始进行变量连接,例子中将程序中的输入变量Slave1_ActualCurrent关联至从站1的T-PZD1。请将PLC中用到的输入输出变量依次关联至从站的PZD。
<7>变量连接做好后选择 TwinCAT,点击 Activate Configuration。
<8>弹出对话框点击确定。
<9>如果弹出以下窗口说明你的项目中有一些 license 没有**或者漏**了,不过没有关系,点击是可以重新**缺少的 license。
<10>输入5位验证码后点OK。
<11>点击确定切换到 RUN 模式。
<12>点击工具栏的绿色箭头 Login。
<13>程序正常运行,可以看到实时监控的数据值。红框中标出的按键从左至右依次是登录,运行,停止,退出登录。
添加EtherCAT库实现SDO读写
<1>在左侧PLC->Test->Test Project->References目录树下,右击选择Add library。
<2>在弹出的对话框内,选择Tc2_EtherCAT。选择OK。
<3>添加成功后,可以在目录树中看到已经添加的EtherCAT库。
<4>然后可以使用功能块FB_EcCoESdoRead进行SDO的读操作,使用FB_EcCoESdoWrite进行SDO的写操作,使用这两个功能块对驱动器参数进行修改,在示例程序中有体现。